黄远 5 лет назад
Родитель
Сommit
8513b1e1ea

+ 1 - 0
lift-system-service/src/main/java/cn/com/ty/lift/system/user/dao/entity/model/UserRequest.java

@@ -22,6 +22,7 @@ public class UserRequest {
     private String inputSmsCode;//用户输入的短信验证码
     private String authCode;//微信授权码
     private String weChatOpenId;//用户微信标识码
+    private String mobileType;//端类型
     private Long pageSize;//每页条数
     private Long pageNum;//页数
 }

+ 68 - 26
lift-system-service/src/main/java/cn/com/ty/lift/system/user/service/impl/LoginService.java

@@ -22,7 +22,9 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
-import java.util.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -96,6 +98,11 @@ public class LoginService implements ILoginService {
         if (StringUtils.isBlank(userRequest.getMobile())) {
             return RestResponse.fail(ApiConstants.RESULT_ERROR, "手机号为空无法登录");
         }
+        //校验用户是否已经登录
+        Object userInfo = getLoginUserInfoFromRedis(userRequest);
+        if (userInfo != null) {
+            return RestResponse.fail(ApiConstants.RESULT_ERROR, "账号已经登录无法重复登录");
+        }
         if (StringUtils.isBlank(password)) {
             return RestResponse.fail(ApiConstants.RESULT_ERROR, "用户密码为空无法登录");
         }
@@ -111,12 +118,38 @@ public class LoginService implements ILoginService {
             return RestResponse.fail(ApiConstants.RESULT_ERROR, "密码输入有误");
         }
         //登录成功后初始化登录信息
-        UserResponse userResponse = initLoginInfo(request, userAccount.getUserId());
+        UserResponse userResponse = initLoginInfo(request, userRequest);
         //添加登录记录
         userLoginService.saveLoginInfo(request, userAccount.getUserId());
         return RestResponse.success(userResponse, ApiConstants.RESULT_SUCCESS, "登录成功");
     }
 
+    /**
+     * @param userRequest 用户手机号, 用户端类型
+     * @return redis中用户的信息
+     * @description
+     * @date 2020/4/22 3:35 下午
+     */
+    public Object getLoginUserInfoFromRedis(UserRequest userRequest) {
+        //拼接键
+        String mobileUserInfo = userRequest.getMobile()
+                + ApiConstants.UserConstants.USER_INFO_MOBILE + userRequest.getMobileType();
+        //获取电话是否在redis中存在
+        return redisTemplate.opsForValue().get(mobileUserInfo);
+    }
+
+    /**
+     * @param userRequest 用户手机号, 用户端类型
+     * @description 在redis中置空用户信息
+     * @date 2020/4/22 3:39 下午
+     */
+    public void blankingUserInfoIntoRedis(UserRequest userRequest) {
+        //拼接键
+        String mobileUserInfo = userRequest.getMobile()
+                + ApiConstants.UserConstants.USER_INFO_MOBILE + userRequest.getMobileType();
+        redisTemplate.opsForValue().set(mobileUserInfo, null);
+    }
+
     @Override
     public RestResponse resetPassword(UserRequest userRequest) {
         RestResponse verifyResult = verifySmsCode(userRequest.getMobile(), userRequest.getInputSmsCode());
@@ -137,7 +170,7 @@ public class LoginService implements ILoginService {
         //用户修改密码后,需要重新登录,将redis中的用户信息置空
         String mobileUserInfo = (String) redisTemplate.opsForValue().get(userRequest.getToken());
         redisTemplate.opsForValue().set(userRequest.getToken(), null);
-        redisTemplate.opsForValue().set(mobileUserInfo, null);
+        blankingUserInfoIntoRedis(userRequest);
         return RestResponse.success(null, ApiConstants.RESULT_SUCCESS, "重置密码成功");
     }
 
@@ -171,7 +204,7 @@ public class LoginService implements ILoginService {
         }
         //用户存在,关联登录成功
         //登录成功初始化登录信息
-        UserResponse userResponse = initLoginInfo(request, userAccount.getUserId());
+        UserResponse userResponse = initLoginInfo(request, userRequest);
         //保存登录记录
         userLoginService.saveLoginInfo(request, userAccount.getUserId());
         return RestResponse.success(userResponse, ApiConstants.RESULT_SUCCESS, "用户登录成功");
@@ -196,9 +229,9 @@ public class LoginService implements ILoginService {
      * @description 初始化登录信息
      * @date 2019-12-30 11:22
      */
-    private UserResponse initLoginInfo(HttpServletRequest request, Long userId) {
+    private UserResponse initLoginInfo(HttpServletRequest request, UserRequest userRequest) {
         //获取用户信息
-        UserResponse userResponse = userService.getLoginUserInfo(userId);
+        UserResponse userResponse = userService.getLoginUserInfo(userRequest.getUserId());
         //将当前用户id放入session中
         request.getSession().setAttribute(ApiConstants.CURRENT_USER_ID, userResponse.getUserId());
         //将当前公司id放入session中
@@ -207,8 +240,7 @@ public class LoginService implements ILoginService {
         }
         //封装登录用户信息
         Map<String, Object> currentUserInfoMap = getUserInfoMap(userResponse);
-        String mobileUserInfo = userResponse.getMobile()
-                + ApiConstants.UserConstants.USER_INFO_MOBILE;
+        String mobileUserInfo = getUserInfoKeyInRedis(userRequest);
         //将token对应用户手机号放入redis中,设置过期时间为30分钟
         redisTemplate.opsForValue().set(userResponse.getToken(), mobileUserInfo, 30L, TimeUnit.MINUTES);
         //将用户手机号对应的用户信息放入redis中, 过期时间为30分钟
@@ -271,22 +303,20 @@ public class LoginService implements ILoginService {
                 .eq("company_id", userRequest.getCompanyId())
                 .eq("user_id", userRequest.getUserId())
         );
-        //校验角色信息
-        if (userRole == null) {
-            return RestResponse.success(ApiConstants.RESULT_ERROR, "用户在要切换的团队没有角色,无法切换");
-        }
-        Role role = roleService.getById(userRole.getRoleId());
-        if (role == null) {
-            return RestResponse.success(ApiConstants.RESULT_ERROR, "用户在要切换的团队没有角色,无法切换");
-        }
-        userResponse.setRole(role);
-        //获取角色对应的菜单信息
-        List<Menu> menuTree = roleMenuService.getMenuTree(role.getId());
-        //校验菜单信息
-        if (menuTree == null || menuTree.size() <= 0) {
-            return RestResponse.success(ApiConstants.RESULT_ERROR, "切换团队中用户没有任何菜单,无法切换");
+        //设置角色菜单信息
+        if (userRole != null) {
+            Role role = roleService.getById(userRole.getRoleId());
+            if (role != null) {
+                userResponse.setRole(role);
+                //获取角色对应的菜单信息
+                List<Menu> menuTree = roleMenuService.getMenuTree(role.getId());
+                //校验菜单信息
+                if (menuTree == null || menuTree.size() <= 0) {
+                    return RestResponse.success(ApiConstants.RESULT_ERROR, "切换团队中用户没有任何菜单,无法切换");
+                }
+                userResponse.setMenus(menuTree);
+            }
         }
-        userResponse.setMenus(menuTree);
         return null;
     }
 
@@ -298,15 +328,27 @@ public class LoginService implements ILoginService {
      */
     private void updateUserInfoInRedis(UserResponse userResponse) {
         //从redis中获取用户信息
-        String mobile = (String) redisTemplate.opsForValue().get(userResponse.getToken());
-        Map<String, Object> userInfoMap = JSONUtil.parseObj(redisTemplate.opsForValue().get(mobile));
+        String mobileUserInfo = (String) redisTemplate.opsForValue().get(userResponse.getToken());
+        Map<String, Object> userInfoMap = JSONUtil.parseObj(redisTemplate.opsForValue().get(mobileUserInfo));
         //设置用户角色id
         userInfoMap.put(ApiConstants.CURRENT_ROLE_ID, userResponse.getRole().getId());
         //设置用户公司id
         userInfoMap.put(ApiConstants.CURRENT_COMPANY_ID, userResponse.getMaintenanceCompany().getId());
         //设置用户菜单信息
         userInfoMap.put(ApiConstants.CURRENT_PERMISSION_URL, menuService.menuToUrl(userResponse.getMenus()));
+        //token放入redis中
+        redisTemplate.opsForValue().set(userResponse.getToken(), mobileUserInfo);
         //重新将用户信息放入到redis中
-        redisTemplate.opsForValue().set(mobile, JSONUtil.toJsonPrettyStr(userInfoMap), 30L, TimeUnit.MINUTES);
+        redisTemplate.opsForValue().set(mobileUserInfo, JSONUtil.toJsonPrettyStr(userInfoMap), 30L, TimeUnit.MINUTES);
+    }
+
+    /**
+     * @param userRequest 请求数据
+     * @return redis中对应key
+     * @description
+     * @date 2020/4/22 4:21 下午
+     */
+    private String getUserInfoKeyInRedis(UserRequest userRequest) {
+        return userRequest.getMobile() + ApiConstants.UserConstants.USER_INFO_MOBILE + userRequest.getMobileType();
     }
 }