|
@@ -1,7 +1,214 @@
|
|
|
package cn.rankin.apiweb.service.user;
|
|
|
|
|
|
+import cn.rankin.apiweb.code.ApiWebCode;
|
|
|
+import cn.rankin.apiweb.utils.SecurityManager;
|
|
|
+import cn.rankin.common.utils.api.model.APIResult;
|
|
|
+import cn.rankin.common.utils.constant.RedisKey;
|
|
|
+import cn.rankin.common.utils.service.RedisService;
|
|
|
+import cn.rankin.data.api.app.dto.LoginInfoDTO;
|
|
|
+import cn.rankin.data.api.app.vo.DeviceUserVo;
|
|
|
+import cn.rankin.data.api.app.vo.UserInfoVo;
|
|
|
+import cn.rankin.data.api.user.dto.TerminalDeviceDTO;
|
|
|
+import cn.rankin.data.api.user.vo.TerminalDeviceVo;
|
|
|
+import cn.rankin.data.api.user.vo.TerminalUserVo;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.time.DateUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.util.Date;
|
|
|
+
|
|
|
+
|
|
|
@Service
|
|
|
+@Slf4j
|
|
|
public class UserService {
|
|
|
+
|
|
|
+ public final static String USER_FORMAT_KEY = RedisKey.USER_FORMAT_KEY;
|
|
|
+
|
|
|
+ @Value(value = "${token.expiration:604800}")
|
|
|
+ private int expiration;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private UserClient userClient;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RedisService redisService;
|
|
|
+
|
|
|
+ public APIResult<UserInfoVo> login(LoginInfoDTO loginInfoDTO) {
|
|
|
+ String deviceCode = loginInfoDTO.getDeviceCode();
|
|
|
+ String eid = loginInfoDTO.getEid();
|
|
|
+ String password = loginInfoDTO.getPassword();
|
|
|
+ log.info("user login start, user={}", JSON.toJSONString(loginInfoDTO));
|
|
|
+
|
|
|
+ APIResult<TerminalUserVo> userVoAPIResult = userClient.loadUserByEid(eid);
|
|
|
+ TerminalUserVo userVo = userVoAPIResult.getData();
|
|
|
+ if (!userVoAPIResult.getSuccess()) {
|
|
|
+ log.error("load user api error");
|
|
|
+ return APIResult.error(ApiWebCode.LOGIN_ERROR);
|
|
|
+ }
|
|
|
+
|
|
|
+ String key = userVo.getPassword();
|
|
|
+ if (!SecurityManager.validate(password, key)) {
|
|
|
+ log.error("密码校验错误, password={}, key={}", password, key);
|
|
|
+ return APIResult.error(ApiWebCode.PASSWORD_ERROR);
|
|
|
+ }
|
|
|
+
|
|
|
+ String userId = userVo.getId();
|
|
|
+ String ip = loginInfoDTO.getIp();
|
|
|
+ TerminalDeviceVo deviceVo = this.bind(userId, deviceCode, ip);
|
|
|
+ if (deviceVo == null) {
|
|
|
+ return APIResult.error(ApiWebCode.DEVICE_BOUND_ERROR);
|
|
|
+ }
|
|
|
+
|
|
|
+ // assembly device and use info
|
|
|
+ DeviceUserVo deviceUserVo = toDeviceUserVo(userVo, deviceVo);
|
|
|
+ // 保存至缓存
|
|
|
+ this.save(deviceUserVo);
|
|
|
+
|
|
|
+ UserInfoVo userInfoVo = toUserInfoVo(deviceUserVo);
|
|
|
+ log.info("user={} login success, userInfo={}", eid, JSON.toJSONString(userInfoVo));
|
|
|
+
|
|
|
+ return APIResult.ok(userInfoVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ public APIResult<Boolean> logout(String userId) {
|
|
|
+ APIResult<Boolean> unbindResult = userClient.deviceUnbind(userId);
|
|
|
+ if (!unbindResult.getSuccess()) {
|
|
|
+ return APIResult.error(ApiWebCode.LOGOUT_ERROR);
|
|
|
+ }
|
|
|
+
|
|
|
+ String key = getUserFormatKey(userId);
|
|
|
+ redisService.delete(key);
|
|
|
+
|
|
|
+ return APIResult.ok();
|
|
|
+ }
|
|
|
+
|
|
|
+ public TerminalDeviceVo bind(String userId, String deviceCode, String ip) {
|
|
|
+ TerminalDeviceDTO deviceDTO = new TerminalDeviceDTO();
|
|
|
+ deviceDTO.setUserId(userId);
|
|
|
+ deviceDTO.setDeviceCode(deviceCode);
|
|
|
+ deviceDTO.setIp(ip);
|
|
|
+ APIResult<TerminalDeviceVo> apiResult = userClient.deviceBind(deviceDTO);
|
|
|
+ if (!apiResult.getSuccess()) {
|
|
|
+ log.error("bind user api error");
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return apiResult.getData();
|
|
|
+ }
|
|
|
+
|
|
|
+ // load user and device info
|
|
|
+ public DeviceUserVo load(String uid) {
|
|
|
+ String key = getUserFormatKey(uid);
|
|
|
+ DeviceUserVo deviceUserVo = (DeviceUserVo) redisService.get(key);
|
|
|
+ if (deviceUserVo == null) {
|
|
|
+ deviceUserVo = getDeviceUserVo(uid);
|
|
|
+ this.save(deviceUserVo);
|
|
|
+ }
|
|
|
+ return deviceUserVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ public DeviceUserVo getDeviceUserVo(String uid) {
|
|
|
+ APIResult<TerminalDeviceVo> deviceAPIResult = userClient.findDeviceByUid(uid);
|
|
|
+ if (!deviceAPIResult.getSuccess()) {
|
|
|
+ log.error("load device api error, {}", deviceAPIResult.getMessage());
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ TerminalDeviceVo deviceVo = deviceAPIResult.getData();
|
|
|
+ // load user info
|
|
|
+ APIResult<TerminalUserVo> userAPIResult = userClient.findUserById(uid);
|
|
|
+ if (!userAPIResult.getSuccess()) {
|
|
|
+ log.error("load user api error, {}", userAPIResult.getMessage());
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ TerminalUserVo userVo = userAPIResult.getData();
|
|
|
+
|
|
|
+ return toDeviceUserVo(userVo, deviceVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ public APIResult<UserInfoVo> refresh(String deviceCode, Boolean force) {
|
|
|
+ APIResult<TerminalDeviceVo> deviceAPIResult = userClient.findByDeviceCode(deviceCode);
|
|
|
+ if (!deviceAPIResult.getSuccess()) {
|
|
|
+ log.error("load device api error, {}", deviceAPIResult.getMessage());
|
|
|
+ return APIResult.error(ApiWebCode.NOT_FOUND);
|
|
|
+ }
|
|
|
+
|
|
|
+ TerminalDeviceVo deviceVo = deviceAPIResult.getData();
|
|
|
+ if (deviceVo == null) {
|
|
|
+ log.error("device code not bind any eid! deviceCode={}", deviceCode);
|
|
|
+ return APIResult.error(ApiWebCode.NOT_EXISTS);
|
|
|
+ }
|
|
|
+
|
|
|
+ String uid = deviceVo.getUserId();
|
|
|
+
|
|
|
+ DeviceUserVo deviceUserVo;
|
|
|
+ if (force) {
|
|
|
+ APIResult<TerminalUserVo> userAPIResult = userClient.findUserById(uid);
|
|
|
+ if (!userAPIResult.getSuccess()) {
|
|
|
+ log.error("load user api error, {}", userAPIResult.getMessage());
|
|
|
+ return APIResult.error(ApiWebCode.NOT_EXISTS);
|
|
|
+ }
|
|
|
+ TerminalUserVo userVo = userAPIResult.getData();
|
|
|
+ deviceUserVo = toDeviceUserVo(userVo, deviceVo);
|
|
|
+ }else {
|
|
|
+ String key = getUserFormatKey(uid);
|
|
|
+ deviceUserVo = (DeviceUserVo) redisService.get(key);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 无论怎样都能成功刷新
|
|
|
+ if (deviceUserVo == null) {
|
|
|
+ deviceUserVo = getDeviceUserVo(uid);
|
|
|
+ }
|
|
|
+
|
|
|
+ refreshToken(deviceUserVo);
|
|
|
+ save(deviceUserVo);
|
|
|
+
|
|
|
+ UserInfoVo userInfoVo = toUserInfoVo(deviceUserVo);
|
|
|
+ return APIResult.ok(userInfoVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ // cache user and device info
|
|
|
+ public void save(DeviceUserVo deviceUserVo) {
|
|
|
+ String key = getUserFormatKey(deviceUserVo.getUid());
|
|
|
+ redisService.set(key, deviceUserVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getUserFormatKey(String uid) {
|
|
|
+ return String.format(USER_FORMAT_KEY, uid);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static UserInfoVo toUserInfoVo(DeviceUserVo deviceUserVo) {
|
|
|
+ UserInfoVo userInfoVo = new UserInfoVo();
|
|
|
+ userInfoVo.setUid(deviceUserVo.getUid());
|
|
|
+ userInfoVo.setEid(deviceUserVo.getEid());
|
|
|
+ userInfoVo.setName(deviceUserVo.getName());
|
|
|
+ userInfoVo.setMerchantName(deviceUserVo.getMerchantName());
|
|
|
+ userInfoVo.setMerchantContactName(deviceUserVo.getMerchantContactName());
|
|
|
+ userInfoVo.setMerchantContactMobile(deviceUserVo.getMerchantContactMobile());
|
|
|
+ userInfoVo.setToken(deviceUserVo.getToken());
|
|
|
+ return userInfoVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ public DeviceUserVo toDeviceUserVo(TerminalUserVo userVo, TerminalDeviceVo deviceVo) {
|
|
|
+ DeviceUserVo deviceUserVo = new DeviceUserVo();
|
|
|
+ deviceUserVo.setUid(userVo.getId());
|
|
|
+ deviceUserVo.setEid(userVo.getCode());
|
|
|
+ deviceUserVo.setPassword(userVo.getPassword());
|
|
|
+ deviceUserVo.setName(userVo.getName());
|
|
|
+ deviceUserVo.setDeviceCode(deviceVo.getCode());
|
|
|
+ deviceUserVo.setMerchantId(userVo.getMerchantId());
|
|
|
+ deviceUserVo.setMerchantName(userVo.getMerchantName());
|
|
|
+ deviceUserVo.setMerchantContactName(userVo.getMerchantContactName());
|
|
|
+ deviceUserVo.setMerchantContactMobile(userVo.getMerchantContactMobile());
|
|
|
+ refreshToken(deviceUserVo);
|
|
|
+ return deviceUserVo;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void refreshToken(DeviceUserVo deviceUserVo) {
|
|
|
+ String token = SecurityManager.generateToken(deviceUserVo.getPassword());
|
|
|
+ Date expireAt = DateUtils.addSeconds(new Date(), this.expiration);
|
|
|
+ deviceUserVo.setToken(token);
|
|
|
+ deviceUserVo.setExpireAt(expireAt);
|
|
|
+ }
|
|
|
}
|