|
@@ -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();
|
|
|
}
|
|
|
}
|