浏览代码

移动端部门选择

yangfeng 1 年之前
父节点
当前提交
3d43c23eb1

+ 613 - 613
system/system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java

@@ -25,7 +25,6 @@ import org.jeecg.config.JeecgBaseConfig;
 import org.jeecg.modules.base.service.BaseCommonService;
 import org.jeecg.modules.system.entity.SysDepart;
 import org.jeecg.modules.system.entity.SysRoleIndex;
-import org.jeecg.modules.system.entity.SysTenant;
 import org.jeecg.modules.system.entity.SysUser;
 import org.jeecg.modules.system.enums.UserType;
 import org.jeecg.modules.system.model.SysLoginModel;
@@ -42,7 +41,6 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * @Author scott
@@ -50,27 +48,27 @@ import java.util.stream.Collectors;
  */
 @RestController
 @RequestMapping("/sys")
-@Api(tags="用户登录")
+@Api(tags = "用户登录")
 @Slf4j
 public class LoginController {
-	@Autowired
-	private ISysUserService sysUserService;
-	@Autowired
-	private ISysPermissionService sysPermissionService;
-	@Autowired
-	private SysBaseApiImpl sysBaseApi;
-	@Autowired
-	private ISysLogService logService;
-	@Autowired
+    @Autowired
+    private ISysUserService sysUserService;
+    @Autowired
+    private ISysPermissionService sysPermissionService;
+    @Autowired
+    private SysBaseApiImpl sysBaseApi;
+    @Autowired
+    private ISysLogService logService;
+    @Autowired
     private RedisUtil redisUtil;
-	@Autowired
+    @Autowired
     private ISysDepartService sysDepartService;
-	@Autowired
+    @Autowired
     private ISysDictService sysDictService;
-	@Resource
-	private BaseCommonService baseCommonService;
-	@Autowired
-	private JeecgBaseConfig jeecgBaseConfig;
+    @Resource
+    private BaseCommonService baseCommonService;
+    @Autowired
+    private JeecgBaseConfig jeecgBaseConfig;
 
     @Lazy
     @Resource
@@ -78,612 +76,614 @@ public class LoginController {
 
     private final String BASE_CHECK_CODES = "qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890";
 
-	@ApiOperation("登录接口")
-	@RequestMapping(value = "/login", method = RequestMethod.POST)
-	public Result<JSONObject> login(@RequestBody SysLoginModel sysLoginModel, HttpServletRequest request){
-		Result<JSONObject> result = new Result<JSONObject>();
-		String username = sysLoginModel.getUsername();
-		String password = sysLoginModel.getPassword();
-		//update-begin-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
-		if(isLoginFailOvertimes(username)){
-			return result.error500("该用户登录失败次数过多,请于10分钟后再次登录!");
-		}
-		//update-end-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
-		//update-begin--Author:scott  Date:20190805 for:暂时注释掉密码加密逻辑,有点问题
-		//前端密码加密,后端进行密码解密
-		//password = AesEncryptUtil.desEncrypt(sysLoginModel.getPassword().replaceAll("%2B", "\\+")).trim();//密码解密
-		//update-begin--Author:scott  Date:20190805 for:暂时注释掉密码加密逻辑,有点问题
-
-		//update-begin-author:taoyan date:20190828 for:校验验证码
+    @ApiOperation("登录接口")
+    @RequestMapping(value = "/login", method = RequestMethod.POST)
+    public Result<JSONObject> login(@RequestBody SysLoginModel sysLoginModel, HttpServletRequest request) {
+        Result<JSONObject> result = new Result<JSONObject>();
+        String username = sysLoginModel.getUsername();
+        String password = sysLoginModel.getPassword();
+        //update-begin-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
+        if (isLoginFailOvertimes(username)) {
+            return result.error500("该用户登录失败次数过多,请于10分钟后再次登录!");
+        }
+        //update-end-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
+        //update-begin--Author:scott  Date:20190805 for:暂时注释掉密码加密逻辑,有点问题
+        //前端密码加密,后端进行密码解密
+        //password = AesEncryptUtil.desEncrypt(sysLoginModel.getPassword().replaceAll("%2B", "\\+")).trim();//密码解密
+        //update-begin--Author:scott  Date:20190805 for:暂时注释掉密码加密逻辑,有点问题
+
+        //update-begin-author:taoyan date:20190828 for:校验验证码
         String captcha = sysLoginModel.getCaptcha();
-        if(captcha==null){
+        if (captcha == null) {
             result.error500("验证码无效");
             return result;
         }
         String lowerCaseCaptcha = captcha.toLowerCase();
         //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
-		// 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可
-        String origin = lowerCaseCaptcha+sysLoginModel.getCheckKey()+jeecgBaseConfig.getSignatureSecret();
-		String realKey = Md5Util.md5Encode(origin, "utf-8");
-		//update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
-		Object checkCode = redisUtil.get(realKey);
-		//当进入登录页时,有一定几率出现验证码错误 #1714
-		if(checkCode==null || !checkCode.toString().equals(lowerCaseCaptcha)) {
+        // 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可
+        String origin = lowerCaseCaptcha + sysLoginModel.getCheckKey() + jeecgBaseConfig.getSignatureSecret();
+        String realKey = Md5Util.md5Encode(origin, "utf-8");
+        //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
+        Object checkCode = redisUtil.get(realKey);
+        //当进入登录页时,有一定几率出现验证码错误 #1714
+        if (checkCode == null || !checkCode.toString().equals(lowerCaseCaptcha)) {
             log.warn("验证码错误,key= {} , Ui checkCode= {}, Redis checkCode = {}", sysLoginModel.getCheckKey(), lowerCaseCaptcha, checkCode);
-			result.error500("验证码错误");
-			// 改成特殊的code 便于前端判断
-			result.setCode(HttpStatus.PRECONDITION_FAILED.value());
-			return result;
-		}
-		//管理端的登录校验
-		if (UserType.ADMIN.getCode().equals(sysLoginModel.getLoginType())) {
-			//查询用户拥有的角色
-			Set<String> roleSet = commonApi.queryUserRoles(username);
-			if (!CollectionUtils.isEmpty(roleSet) && roleSet.contains(UserType.STUDENT.getValue())) {
-				return Result.error("考生不允许登录管理系统");
-			}
-		} else if (UserType.STUDENT.getCode().equals(sysLoginModel.getLoginType())) { //考生端的登录校验
-			//查询用户拥有的角色
-			Set<String> roleSet = commonApi.queryUserRoles(username);
-			if (!CollectionUtils.isEmpty(roleSet) && !roleSet.contains(UserType.STUDENT.getValue())) {
-				return Result.error("非考生不允许登录考生系统");
-			}
-		}
-
-		//update-end-author:taoyan date:20190828 for:校验验证码
-		
-		//1. 校验用户是否有效
-		//update-begin-author:wangshuai date:20200601 for: 登录代码验证用户是否注销bug,if条件永远为false
-		LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
-		queryWrapper.eq(SysUser::getUsername,username);
-		SysUser sysUser = sysUserService.getOne(queryWrapper);
-		//update-end-author:wangshuai date:20200601 for: 登录代码验证用户是否注销bug,if条件永远为false
-		result = sysUserService.checkUserIsEffective(sysUser);
-		if(!result.isSuccess()) {
-			return result;
-		}
-
-		//2. 校验用户名或密码是否正确
-		String userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt());
-		String syspassword = sysUser.getPassword();
-		if (!syspassword.equals(userpassword)) {
-			//update-begin-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
-			addLoginFailOvertimes(username);
-			//update-end-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
-			result.error500("用户名或密码错误");
-			return result;
-		}
-				
-		//用户登录信息
-		userInfo(sysUser, result, request);
-		//update-begin--Author:liusq  Date:20210126  for:登录成功,删除redis中的验证码
-		redisUtil.del(realKey);
-		//update-begin--Author:liusq  Date:20210126  for:登录成功,删除redis中的验证码
-		redisUtil.del(CommonConstant.LOGIN_FAIL + username);
-		LoginUser loginUser = new LoginUser();
-		BeanUtils.copyProperties(sysUser, loginUser);
-		baseCommonService.addLog("用户名: " + username + ",登录成功!", CommonConstant.LOG_TYPE_1, null,loginUser);
+            result.error500("验证码错误");
+            // 改成特殊的code 便于前端判断
+            result.setCode(HttpStatus.PRECONDITION_FAILED.value());
+            return result;
+        }
+        //管理端的登录校验
+        if (UserType.ADMIN.getCode().equals(sysLoginModel.getLoginType())) {
+            //查询用户拥有的角色
+            Set<String> roleSet = commonApi.queryUserRoles(username);
+            if (!CollectionUtils.isEmpty(roleSet) && roleSet.contains(UserType.STUDENT.getValue())) {
+                return Result.error("考生不允许登录管理系统");
+            }
+        } else if (UserType.STUDENT.getCode().equals(sysLoginModel.getLoginType())) { //考生端的登录校验
+            //查询用户拥有的角色
+            Set<String> roleSet = commonApi.queryUserRoles(username);
+            if (!CollectionUtils.isEmpty(roleSet) && !roleSet.contains(UserType.STUDENT.getValue())) {
+                return Result.error("非考生不允许登录考生系统");
+            }
+        }
+
+        //update-end-author:taoyan date:20190828 for:校验验证码
+
+        //1. 校验用户是否有效
+        //update-begin-author:wangshuai date:20200601 for: 登录代码验证用户是否注销bug,if条件永远为false
+        LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SysUser::getUsername, username);
+        SysUser sysUser = sysUserService.getOne(queryWrapper);
+        //update-end-author:wangshuai date:20200601 for: 登录代码验证用户是否注销bug,if条件永远为false
+        result = sysUserService.checkUserIsEffective(sysUser);
+        if (!result.isSuccess()) {
+            return result;
+        }
+
+        //2. 校验用户名或密码是否正确
+        String userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt());
+        String syspassword = sysUser.getPassword();
+        if (!syspassword.equals(userpassword)) {
+            //update-begin-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
+            addLoginFailOvertimes(username);
+            //update-end-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
+            result.error500("用户名或密码错误");
+            return result;
+        }
+
+        //用户登录信息
+        userInfo(sysUser, result, request);
+        //update-begin--Author:liusq  Date:20210126  for:登录成功,删除redis中的验证码
+        redisUtil.del(realKey);
+        //update-begin--Author:liusq  Date:20210126  for:登录成功,删除redis中的验证码
+        redisUtil.del(CommonConstant.LOGIN_FAIL + username);
+        LoginUser loginUser = new LoginUser();
+        BeanUtils.copyProperties(sysUser, loginUser);
+        baseCommonService.addLog("用户名: " + username + ",登录成功!", CommonConstant.LOG_TYPE_1, null, loginUser);
         //update-end--Author:wangshuai  Date:20200714  for:登录日志没有记录人员
-		return result;
-	}
-
-
-	/**
-	 * 【vue3专用】获取用户信息
-	 */
-	@GetMapping("/user/getUserInfo")
-	public Result<JSONObject> getUserInfo(HttpServletRequest request){
-		Result<JSONObject> result = new Result<JSONObject>();
-		String  username = JwtUtil.getUserNameByToken(request);
-		if(oConvertUtils.isNotEmpty(username)) {
-			// 根据用户名查询用户信息
-			SysUser sysUser = sysUserService.getUserByName(username);
-			JSONObject obj=new JSONObject();
-
-			//update-begin---author:scott ---date:2022-06-20  for:vue3前端,支持自定义首页-----------
-			String vue3Version = request.getHeader(CommonConstant.VERSION);
-			//update-begin---author:liusq ---date:2022-06-29  for:接口返回值修改,同步修改这里的判断逻辑-----------
-			SysRoleIndex roleIndex = sysUserService.getDynamicIndexByUserRole(username, vue3Version);
-			if (oConvertUtils.isNotEmpty(vue3Version) && roleIndex != null && oConvertUtils.isNotEmpty(roleIndex.getUrl())) {
-				String homePath = roleIndex.getUrl();
-				if (!homePath.startsWith(SymbolConstant.SINGLE_SLASH)) {
-					homePath = SymbolConstant.SINGLE_SLASH + homePath;
-				}
-				sysUser.setHomePath(homePath);
-			}
-			//update-begin---author:liusq ---date:2022-06-29  for:接口返回值修改,同步修改这里的判断逻辑-----------
-			//update-end---author:scott ---date::2022-06-20  for:vue3前端,支持自定义首页--------------
-			
-			obj.put("userInfo",sysUser);
-			obj.put("sysAllDictItems", sysDictService.queryAllDictItems());
-			
-			result.setResult(obj);
-			result.success("");
-		}
-		return result;
-
-	}
-	
-	/**
-	 * 退出登录
-	 * @param request
-	 * @param response
-	 * @return
-	 */
-	@RequestMapping(value = "/logout")
-	public Result<Object> logout(HttpServletRequest request,HttpServletResponse response) {
-		//用户退出逻辑
-	    String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN);
-	    if(oConvertUtils.isEmpty(token)) {
-	    	return Result.error("退出登录失败!");
-	    }
-	    String username = JwtUtil.getUsername(token);
-		LoginUser sysUser = sysBaseApi.getUserByName(username);
-	    if(sysUser!=null) {
-			//update-begin--Author:wangshuai  Date:20200714  for:登出日志没有记录人员
-			baseCommonService.addLog("用户名: "+sysUser.getRealname()+",退出成功!", CommonConstant.LOG_TYPE_1, null,sysUser);
-			//update-end--Author:wangshuai  Date:20200714  for:登出日志没有记录人员
-	    	log.info(" 用户名:  "+sysUser.getRealname()+",退出成功! ");
-	    	//清空用户登录Token缓存
-	    	redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token);
-	    	//清空用户登录Shiro权限缓存
-			redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId());
-			//清空用户的缓存信息(包括部门信息),例如sys:cache:user::<username>
-			redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername()));
-			//调用shiro的logout
-			SecurityUtils.getSubject().logout();
-	    	return Result.ok("退出登录成功!");
-	    }else {
-	    	return Result.error("Token无效!");
-	    }
-	}
-	
-	/**
-	 * 获取访问量
-	 * @return
-	 */
-	@GetMapping("loginfo")
-	public Result<JSONObject> loginfo() {
-		Result<JSONObject> result = new Result<JSONObject>();
-		JSONObject obj = new JSONObject();
-		//update-begin--Author:zhangweijian  Date:20190428 for:传入开始时间,结束时间参数
-		// 获取一天的开始和结束时间
-		Calendar calendar = new GregorianCalendar();
-		calendar.set(Calendar.HOUR_OF_DAY, 0);
-		calendar.set(Calendar.MINUTE, 0);
-		calendar.set(Calendar.SECOND, 0);
-		calendar.set(Calendar.MILLISECOND, 0);
-		Date dayStart = calendar.getTime();
-		calendar.add(Calendar.DATE, 1);
-		Date dayEnd = calendar.getTime();
-		// 获取系统访问记录
-		Long totalVisitCount = logService.findTotalVisitCount();
-		obj.put("totalVisitCount", totalVisitCount);
-		Long todayVisitCount = logService.findTodayVisitCount(dayStart,dayEnd);
-		obj.put("todayVisitCount", todayVisitCount);
-		Long todayIp = logService.findTodayIp(dayStart,dayEnd);
-		//update-end--Author:zhangweijian  Date:20190428 for:传入开始时间,结束时间参数
-		obj.put("todayIp", todayIp);
-		result.setResult(obj);
-		result.success("登录成功");
-		return result;
-	}
-	
-	/**
-	 * 获取访问量
-	 * @return
-	 */
-	@GetMapping("visitInfo")
-	public Result<List<Map<String,Object>>> visitInfo() {
-		Result<List<Map<String,Object>>> result = new Result<List<Map<String,Object>>>();
-		Calendar calendar = new GregorianCalendar();
-		calendar.set(Calendar.HOUR_OF_DAY,0);
-        calendar.set(Calendar.MINUTE,0);
-        calendar.set(Calendar.SECOND,0);
-        calendar.set(Calendar.MILLISECOND,0);
+        return result;
+    }
+
+
+    /**
+     * 【vue3专用】获取用户信息
+     */
+    @GetMapping("/user/getUserInfo")
+    public Result<JSONObject> getUserInfo(HttpServletRequest request) {
+        Result<JSONObject> result = new Result<JSONObject>();
+        String username = JwtUtil.getUserNameByToken(request);
+        if (oConvertUtils.isNotEmpty(username)) {
+            // 根据用户名查询用户信息
+            SysUser sysUser = sysUserService.getUserByName(username);
+            JSONObject obj = new JSONObject();
+
+            //update-begin---author:scott ---date:2022-06-20  for:vue3前端,支持自定义首页-----------
+            String vue3Version = request.getHeader(CommonConstant.VERSION);
+            //update-begin---author:liusq ---date:2022-06-29  for:接口返回值修改,同步修改这里的判断逻辑-----------
+            SysRoleIndex roleIndex = sysUserService.getDynamicIndexByUserRole(username, vue3Version);
+            if (oConvertUtils.isNotEmpty(vue3Version) && roleIndex != null && oConvertUtils.isNotEmpty(roleIndex.getUrl())) {
+                String homePath = roleIndex.getUrl();
+                if (!homePath.startsWith(SymbolConstant.SINGLE_SLASH)) {
+                    homePath = SymbolConstant.SINGLE_SLASH + homePath;
+                }
+                sysUser.setHomePath(homePath);
+            }
+            //update-begin---author:liusq ---date:2022-06-29  for:接口返回值修改,同步修改这里的判断逻辑-----------
+            //update-end---author:scott ---date::2022-06-20  for:vue3前端,支持自定义首页--------------
+
+            obj.put("userInfo", sysUser);
+            obj.put("sysAllDictItems", sysDictService.queryAllDictItems());
+
+            result.setResult(obj);
+            result.success("");
+        }
+        return result;
+
+    }
+
+    /**
+     * 退出登录
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/logout")
+    public Result<Object> logout(HttpServletRequest request, HttpServletResponse response) {
+        //用户退出逻辑
+        String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN);
+        if (oConvertUtils.isEmpty(token)) {
+            return Result.error("退出登录失败!");
+        }
+        String username = JwtUtil.getUsername(token);
+        LoginUser sysUser = sysBaseApi.getUserByName(username);
+        if (sysUser != null) {
+            //update-begin--Author:wangshuai  Date:20200714  for:登出日志没有记录人员
+            baseCommonService.addLog("用户名: " + sysUser.getRealname() + ",退出成功!", CommonConstant.LOG_TYPE_1, null, sysUser);
+            //update-end--Author:wangshuai  Date:20200714  for:登出日志没有记录人员
+            log.info(" 用户名:  " + sysUser.getRealname() + ",退出成功! ");
+            //清空用户登录Token缓存
+            redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token);
+            //清空用户登录Shiro权限缓存
+            redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId());
+            //清空用户的缓存信息(包括部门信息),例如sys:cache:user::<username>
+            redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername()));
+            //调用shiro的logout
+            SecurityUtils.getSubject().logout();
+            return Result.ok("退出登录成功!");
+        } else {
+            return Result.error("Token无效!");
+        }
+    }
+
+    /**
+     * 获取访问量
+     *
+     * @return
+     */
+    @GetMapping("loginfo")
+    public Result<JSONObject> loginfo() {
+        Result<JSONObject> result = new Result<JSONObject>();
+        JSONObject obj = new JSONObject();
+        //update-begin--Author:zhangweijian  Date:20190428 for:传入开始时间,结束时间参数
+        // 获取一天的开始和结束时间
+        Calendar calendar = new GregorianCalendar();
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        Date dayStart = calendar.getTime();
+        calendar.add(Calendar.DATE, 1);
+        Date dayEnd = calendar.getTime();
+        // 获取系统访问记录
+        Long totalVisitCount = logService.findTotalVisitCount();
+        obj.put("totalVisitCount", totalVisitCount);
+        Long todayVisitCount = logService.findTodayVisitCount(dayStart, dayEnd);
+        obj.put("todayVisitCount", todayVisitCount);
+        Long todayIp = logService.findTodayIp(dayStart, dayEnd);
+        //update-end--Author:zhangweijian  Date:20190428 for:传入开始时间,结束时间参数
+        obj.put("todayIp", todayIp);
+        result.setResult(obj);
+        result.success("登录成功");
+        return result;
+    }
+
+    /**
+     * 获取访问量
+     *
+     * @return
+     */
+    @GetMapping("visitInfo")
+    public Result<List<Map<String, Object>>> visitInfo() {
+        Result<List<Map<String, Object>>> result = new Result<List<Map<String, Object>>>();
+        Calendar calendar = new GregorianCalendar();
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
         calendar.add(Calendar.DAY_OF_MONTH, 1);
         Date dayEnd = calendar.getTime();
         calendar.add(Calendar.DAY_OF_MONTH, -7);
         Date dayStart = calendar.getTime();
-        List<Map<String,Object>> list = logService.findVisitCount(dayStart, dayEnd);
-		result.setResult(oConvertUtils.toLowerCasePageList(list));
-		return result;
-	}
-	
-	
-	/**
-	 * 登陆成功选择用户当前部门
-	 * @param user
-	 * @return
-	 */
-	@RequestMapping(value = "/selectDepart", method = RequestMethod.PUT)
-	public Result<JSONObject> selectDepart(@RequestBody SysUser user) {
-		Result<JSONObject> result = new Result<JSONObject>();
-		String username = user.getUsername();
-		if(oConvertUtils.isEmpty(username)) {
-			LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();
-			username = sysUser.getUsername();
-		}
-		
-		//获取登录部门
-		String orgCode= user.getOrgCode();
-		//获取登录租户
-		Integer tenantId = user.getLoginTenantId();
-		//设置用户登录部门和登录租户
-		this.sysUserService.updateUserDepart(username, orgCode,tenantId);
-		SysUser sysUser = sysUserService.getUserByName(username);
-		JSONObject obj = new JSONObject();
-		obj.put("userInfo", sysUser);
-		result.setResult(obj);
-		return result;
-	}
-
-	/**
-	 * 短信登录接口
-	 * 
-	 * @param jsonObject
-	 * @return
-	 */
-	@PostMapping(value = "/sms")
-	public Result<String> sms(@RequestBody JSONObject jsonObject) {
-		Result<String> result = new Result<String>();
-		String mobile = jsonObject.get("mobile").toString();
-		//手机号模式 登录模式: "2"  注册模式: "1"
-		String smsmode=jsonObject.get("smsmode").toString();
-		log.info(mobile);
-		if(oConvertUtils.isEmpty(mobile)){
-			result.setMessage("手机号不允许为空!");
-			result.setSuccess(false);
-			return result;
-		}
-		
-		//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
-		String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+mobile;
-		Object object = redisUtil.get(redisKey);
-		//update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
-		
-		if (object != null) {
-			result.setMessage("验证码10分钟内,仍然有效!");
-			result.setSuccess(false);
-			return result;
-		}
-
-		//随机数
-		String captcha = RandomUtil.randomNumbers(6);
-		JSONObject obj = new JSONObject();
-    	obj.put("code", captcha);
-		try {
-			boolean b = false;
-			//注册模板
-			if (CommonConstant.SMS_TPL_TYPE_1.equals(smsmode)) {
-				SysUser sysUser = sysUserService.getUserByPhone(mobile);
-				if(sysUser!=null) {
-					result.error500(" 手机号已经注册,请直接登录!");
-					baseCommonService.addLog("手机号已经注册,请直接登录!", CommonConstant.LOG_TYPE_1, null);
-					return result;
-				}
-				b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.REGISTER_TEMPLATE_CODE);
-			}else {
-				//登录模式,校验用户有效性
-				SysUser sysUser = sysUserService.getUserByPhone(mobile);
-				result = sysUserService.checkUserIsEffective(sysUser);
-				if(!result.isSuccess()) {
-					String message = result.getMessage();
-					String userNotExist="该用户不存在,请注册";
-					if(userNotExist.equals(message)){
-						result.error500("该用户不存在或未绑定手机号");
-					}
-					return result;
-				}
-				
-				/**
-				 * smsmode 短信模板方式  0 .登录模板、1.注册模板、2.忘记密码模板
-				 */
-				if (CommonConstant.SMS_TPL_TYPE_0.equals(smsmode)) {
-					//登录模板
-					b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.LOGIN_TEMPLATE_CODE);
-				} else if(CommonConstant.SMS_TPL_TYPE_2.equals(smsmode)) {
-					//忘记密码模板
-					b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.FORGET_PASSWORD_TEMPLATE_CODE);
-				}
-			}
-
-			if (b == false) {
-				result.setMessage("短信验证码发送失败,请稍后重试");
-				result.setSuccess(false);
-				return result;
-			}
-			
-			//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
-			//验证码10分钟内有效
-			redisUtil.set(redisKey, captcha, 600);
-			//update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
-			
-			//update-begin--Author:scott  Date:20190812 for:issues#391
-			//result.setResult(captcha);
-			//update-end--Author:scott  Date:20190812 for:issues#391
-			result.setSuccess(true);
-
-		} catch (ClientException e) {
-			e.printStackTrace();
-			result.error500(" 短信接口未配置,请联系管理员!");
-			return result;
-		}
-		return result;
-	}
-	
-
-	/**
-	 * 手机号登录接口
-	 * 
-	 * @param jsonObject
-	 * @return
-	 */
-	@ApiOperation("手机号登录接口")
-	@PostMapping("/phoneLogin")
-	public Result<JSONObject> phoneLogin(@RequestBody JSONObject jsonObject, HttpServletRequest request) {
-		Result<JSONObject> result = new Result<JSONObject>();
-		String phone = jsonObject.getString("mobile");
-		//update-begin-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
-		if(isLoginFailOvertimes(phone)){
-			return result.error500("该用户登录失败次数过多,请于10分钟后再次登录!");
-		}
-		//update-end-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
-		//校验用户有效性
-		SysUser sysUser = sysUserService.getUserByPhone(phone);
-		result = sysUserService.checkUserIsEffective(sysUser);
-		if(!result.isSuccess()) {
-			return result;
-		}
-		
-		String smscode = jsonObject.getString("captcha");
-
-		//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
-		String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+phone;
-		Object code = redisUtil.get(redisKey);
-		//update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
-
-		if (!smscode.equals(code)) {
-			//update-begin-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
-			addLoginFailOvertimes(phone);
-			//update-end-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
-			result.setMessage("手机验证码错误");
-			return result;
-		}
-		//用户信息
-		userInfo(sysUser, result, request);
-		//添加日志
-		baseCommonService.addLog("用户名: " + sysUser.getUsername() + ",登录成功!", CommonConstant.LOG_TYPE_1, null);
-
-		return result;
-	}
-
-
-	/**
-	 * 用户信息
-	 *
-	 * @param sysUser
-	 * @param result
-	 * @return
-	 */
-	private Result<JSONObject> userInfo(SysUser sysUser, Result<JSONObject> result, HttpServletRequest request) {
-		String username = sysUser.getUsername();
-		String syspassword = sysUser.getPassword();
-		// 获取用户部门信息
-		JSONObject obj = new JSONObject(new LinkedHashMap<>());
-
-		//1.生成token
-		String token = JwtUtil.sign(username, syspassword);
-		// 设置token缓存有效时间
-		redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
-		redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000);
-		obj.put("token", token);
-
-		//2.设置登录租户
-		Result<JSONObject> loginTenantError = sysUserService.setLoginTenant(sysUser, obj, username,result);
-		if (loginTenantError != null) {
-			return loginTenantError;
-		}
-
-		//3.设置登录用户信息
-		obj.put("userInfo", sysUser);
-		
-		//4.设置登录部门
-		List<SysDepart> departs = sysDepartService.queryUserDeparts(sysUser.getId());
-		obj.put("departs", departs);
-		if (departs == null || departs.size() == 0) {
-			obj.put("multi_depart", 0);
-		} else if (departs.size() == 1) {
-			sysUserService.updateUserDepart(username, departs.get(0).getOrgCode(),null);
-			obj.put("multi_depart", 1);
-		} else {
-			//查询当前是否有登录部门
-			// update-begin--Author:wangshuai Date:20200805 for:如果用戶为选择部门,数据库为存在上一次登录部门,则取一条存进去
-			SysUser sysUserById = sysUserService.getById(sysUser.getId());
-			if(oConvertUtils.isEmpty(sysUserById.getOrgCode())){
-				sysUserService.updateUserDepart(username, departs.get(0).getOrgCode(),null);
-			}
-			// update-end--Author:wangshuai Date:20200805 for:如果用戶为选择部门,数据库为存在上一次登录部门,则取一条存进去
-			obj.put("multi_depart", 2);
-		}
-
-		//update-begin---author:scott ---date:2024-01-05  for:【QQYUN-7802】前端在登录时加载了两次数据字典,建议优化下,避免数据字典太多时可能产生的性能问题 #956---
-		// login接口,在vue3前端下不加载字典数据,vue2下加载字典
-		String vue3Version = request.getHeader(CommonConstant.VERSION);
-		if(oConvertUtils.isEmpty(vue3Version)){
-			obj.put("sysAllDictItems", sysDictService.queryAllDictItems());
-		}
-		//end-begin---author:scott ---date:2024-01-05  for:【QQYUN-7802】前端在登录时加载了两次数据字典,建议优化下,避免数据字典太多时可能产生的性能问题 #956---
-		
-		result.setResult(obj);
-		result.success("登录成功");
-		return result;
-	}
-
-	/**
-	 * 获取加密字符串
-	 * @return
-	 */
-	@GetMapping(value = "/getEncryptedString")
-	public Result<Map<String,String>> getEncryptedString(){
-		Result<Map<String,String>> result = new Result<Map<String,String>>();
-		Map<String,String> map = new HashMap(5);
-		map.put("key", EncryptedString.key);
-		map.put("iv",EncryptedString.iv);
-		result.setResult(map);
-		return result;
-	}
-
-	/**
-	 * 后台生成图形验证码 :有效
-	 * @param response
-	 * @param key
-	 */
-	@ApiOperation("获取验证码")
-	@GetMapping(value = "/randomImage/{key}")
-	public Result<String> randomImage(HttpServletResponse response,@PathVariable("key") String key){
-		Result<String> res = new Result<String>();
-		try {
-			//生成验证码
-			String code = RandomUtil.randomString(BASE_CHECK_CODES,4);
-			//存到redis中
-			String lowerCaseCode = code.toLowerCase();
-			
-			//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
-			// 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可
-			String origin = lowerCaseCode+key+jeecgBaseConfig.getSignatureSecret();
-			String realKey = Md5Util.md5Encode(origin, "utf-8");
-			//update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
-            
-			redisUtil.set(realKey, lowerCaseCode, 60);
-			log.info("获取验证码,Redis key = {},checkCode = {}", realKey, code);
-			//返回前端
-			String base64 = RandImageUtil.generate(code);
-			res.setSuccess(true);
-			res.setResult(base64);
-		} catch (Exception e) {
-			log.error(e.getMessage(), e);
-			res.error500("获取验证码失败,请检查redis配置!");
-			return res;
-		}
-		return res;
-	}
-
-	/**
-	 * 切换菜单表为vue3的表
-	 */
-	@RequiresRoles({"admin"})
-	@GetMapping(value = "/switchVue3Menu")
-	public Result<String> switchVue3Menu(HttpServletResponse response) {
-		Result<String> res = new Result<String>();
-		sysPermissionService.switchVue3Menu();
-		return res;
-	}
-
-	/**
-	 * 图形验证码
-	 * @param sysLoginModel
-	 * @return
-	 */
-	@RequestMapping(value = "/checkCaptcha", method = RequestMethod.POST)
-	public Result<?> checkCaptcha(@RequestBody SysLoginModel sysLoginModel){
-		String captcha = sysLoginModel.getCaptcha();
-		String checkKey = sysLoginModel.getCheckKey();
-		if(captcha==null){
-			return Result.error("验证码无效");
-		}
-		String lowerCaseCaptcha = captcha.toLowerCase();
-		String realKey = Md5Util.md5Encode(lowerCaseCaptcha+checkKey, "utf-8");
-		Object checkCode = redisUtil.get(realKey);
-		if(checkCode==null || !checkCode.equals(lowerCaseCaptcha)) {
-			return Result.error("验证码错误");
-		}
-		return Result.ok();
-	}
-	/**
-	 * 登录二维码
-	 */
-	@ApiOperation(value = "登录二维码", notes = "登录二维码")
-	@GetMapping("/getLoginQrcode")
-	public Result<?>  getLoginQrcode() {
-		String qrcodeId = CommonConstant.LOGIN_QRCODE_PRE+IdWorker.getIdStr();
-		//定义二维码参数
-		Map params = new HashMap(5);
-		params.put("qrcodeId", qrcodeId);
-		//存放二维码唯一标识30秒有效
-		redisUtil.set(CommonConstant.LOGIN_QRCODE + qrcodeId, qrcodeId, 30);
-		return Result.OK(params);
-	}
-	/**
-	 * 扫码二维码
-	 */
-	@ApiOperation(value = "扫码登录二维码", notes = "扫码登录二维码")
-	@PostMapping("/scanLoginQrcode")
-	public Result<?> scanLoginQrcode(@RequestParam String qrcodeId, @RequestParam String token) {
-		Object check = redisUtil.get(CommonConstant.LOGIN_QRCODE + qrcodeId);
-		if (oConvertUtils.isNotEmpty(check)) {
-			//存放token给前台读取
-			redisUtil.set(CommonConstant.LOGIN_QRCODE_TOKEN+qrcodeId, token, 60);
-		} else {
-			return Result.error("二维码已过期,请刷新后重试");
-		}
-		return Result.OK("扫码成功");
-	}
-
-
-	/**
-	 * 获取用户扫码后保存的token
-	 */
-	@ApiOperation(value = "获取用户扫码后保存的token", notes = "获取用户扫码后保存的token")
-	@GetMapping("/getQrcodeToken")
-	public Result getQrcodeToken(@RequestParam String qrcodeId) {
-		Object token = redisUtil.get(CommonConstant.LOGIN_QRCODE_TOKEN + qrcodeId);
-		Map result = new HashMap(5);
-		Object qrcodeIdExpire = redisUtil.get(CommonConstant.LOGIN_QRCODE + qrcodeId);
-		if (oConvertUtils.isEmpty(qrcodeIdExpire)) {
-			//二维码过期通知前台刷新
-			result.put("token", "-2");
-			return Result.OK(result);
-		}
-		if (oConvertUtils.isNotEmpty(token)) {
-			result.put("success", true);
-			result.put("token", token);
-		} else {
-			result.put("token", "-1");
-		}
-		return Result.OK(result);
-	}
-
-	/**
-	 * 登录失败超出次数5 返回true
-	 * @param username
-	 * @return
-	 */
-	private boolean isLoginFailOvertimes(String username){
-		String key = CommonConstant.LOGIN_FAIL + username;
-		Object failTime = redisUtil.get(key);
-		if(failTime!=null){
-			Integer val = Integer.parseInt(failTime.toString());
-			if(val>5){
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * 记录登录失败次数
-	 * @param username
-	 */
-	private void addLoginFailOvertimes(String username){
-		String key = CommonConstant.LOGIN_FAIL + username;
-		Object failTime = redisUtil.get(key);
-		Integer val = 0;
-		if(failTime!=null){
-			val = Integer.parseInt(failTime.toString());
-		}
-		// 10分钟
-		redisUtil.set(key, ++val, 10);
-	}
+        List<Map<String, Object>> list = logService.findVisitCount(dayStart, dayEnd);
+        result.setResult(oConvertUtils.toLowerCasePageList(list));
+        return result;
+    }
+
+
+    /**
+     * 登陆成功选择用户当前部门
+     *
+     * @param user
+     * @return
+     */
+    @RequestMapping(value = "/selectDepart", method = RequestMethod.PUT)
+    public Result<JSONObject> selectDepart(@RequestBody SysUser user) {
+        Result<JSONObject> result = new Result<>();
+        String username = user.getUsername();
+        if (oConvertUtils.isEmpty(username)) {
+            LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+            username = sysUser.getUsername();
+        }
+        JSONObject obj = sysUserService.updateSelectDept(user, username);
+        result.setResult(obj);
+        return result;
+    }
+
+    /**
+     * 短信登录接口
+     *
+     * @param jsonObject
+     * @return
+     */
+    @PostMapping(value = "/sms")
+    public Result<String> sms(@RequestBody JSONObject jsonObject) {
+        Result<String> result = new Result<String>();
+        String mobile = jsonObject.get("mobile").toString();
+        //手机号模式 登录模式: "2"  注册模式: "1"
+        String smsmode = jsonObject.get("smsmode").toString();
+        log.info(mobile);
+        if (oConvertUtils.isEmpty(mobile)) {
+            result.setMessage("手机号不允许为空!");
+            result.setSuccess(false);
+            return result;
+        }
+
+        //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
+        String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE + mobile;
+        Object object = redisUtil.get(redisKey);
+        //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
+
+        if (object != null) {
+            result.setMessage("验证码10分钟内,仍然有效!");
+            result.setSuccess(false);
+            return result;
+        }
+
+        //随机数
+        String captcha = RandomUtil.randomNumbers(6);
+        JSONObject obj = new JSONObject();
+        obj.put("code", captcha);
+        try {
+            boolean b = false;
+            //注册模板
+            if (CommonConstant.SMS_TPL_TYPE_1.equals(smsmode)) {
+                SysUser sysUser = sysUserService.getUserByPhone(mobile);
+                if (sysUser != null) {
+                    result.error500(" 手机号已经注册,请直接登录!");
+                    baseCommonService.addLog("手机号已经注册,请直接登录!", CommonConstant.LOG_TYPE_1, null);
+                    return result;
+                }
+                b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.REGISTER_TEMPLATE_CODE);
+            } else {
+                //登录模式,校验用户有效性
+                SysUser sysUser = sysUserService.getUserByPhone(mobile);
+                result = sysUserService.checkUserIsEffective(sysUser);
+                if (!result.isSuccess()) {
+                    String message = result.getMessage();
+                    String userNotExist = "该用户不存在,请注册";
+                    if (userNotExist.equals(message)) {
+                        result.error500("该用户不存在或未绑定手机号");
+                    }
+                    return result;
+                }
+
+                /**
+                 * smsmode 短信模板方式  0 .登录模板、1.注册模板、2.忘记密码模板
+                 */
+                if (CommonConstant.SMS_TPL_TYPE_0.equals(smsmode)) {
+                    //登录模板
+                    b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.LOGIN_TEMPLATE_CODE);
+                } else if (CommonConstant.SMS_TPL_TYPE_2.equals(smsmode)) {
+                    //忘记密码模板
+                    b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.FORGET_PASSWORD_TEMPLATE_CODE);
+                }
+            }
+
+            if (b == false) {
+                result.setMessage("短信验证码发送失败,请稍后重试");
+                result.setSuccess(false);
+                return result;
+            }
+
+            //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
+            //验证码10分钟内有效
+            redisUtil.set(redisKey, captcha, 600);
+            //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
+
+            //update-begin--Author:scott  Date:20190812 for:issues#391
+            //result.setResult(captcha);
+            //update-end--Author:scott  Date:20190812 for:issues#391
+            result.setSuccess(true);
+
+        } catch (ClientException e) {
+            e.printStackTrace();
+            result.error500(" 短信接口未配置,请联系管理员!");
+            return result;
+        }
+        return result;
+    }
+
+
+    /**
+     * 手机号登录接口
+     *
+     * @param jsonObject
+     * @return
+     */
+    @ApiOperation("手机号登录接口")
+    @PostMapping("/phoneLogin")
+    public Result<JSONObject> phoneLogin(@RequestBody JSONObject jsonObject, HttpServletRequest request) {
+        Result<JSONObject> result = new Result<JSONObject>();
+        String phone = jsonObject.getString("mobile");
+        //update-begin-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
+        if (isLoginFailOvertimes(phone)) {
+            return result.error500("该用户登录失败次数过多,请于10分钟后再次登录!");
+        }
+        //update-end-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
+        //校验用户有效性
+        SysUser sysUser = sysUserService.getUserByPhone(phone);
+        result = sysUserService.checkUserIsEffective(sysUser);
+        if (!result.isSuccess()) {
+            return result;
+        }
+
+        String smscode = jsonObject.getString("captcha");
+
+        //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
+        String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE + phone;
+        Object code = redisUtil.get(redisKey);
+        //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
+
+        if (!smscode.equals(code)) {
+            //update-begin-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
+            addLoginFailOvertimes(phone);
+            //update-end-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
+            result.setMessage("手机验证码错误");
+            return result;
+        }
+        //用户信息
+        userInfo(sysUser, result, request);
+        //添加日志
+        baseCommonService.addLog("用户名: " + sysUser.getUsername() + ",登录成功!", CommonConstant.LOG_TYPE_1, null);
+
+        return result;
+    }
+
+
+    /**
+     * 用户信息
+     *
+     * @param sysUser
+     * @param result
+     * @return
+     */
+    private Result<JSONObject> userInfo(SysUser sysUser, Result<JSONObject> result, HttpServletRequest request) {
+        String username = sysUser.getUsername();
+        String syspassword = sysUser.getPassword();
+        // 获取用户部门信息
+        JSONObject obj = new JSONObject(new LinkedHashMap<>());
+
+        //1.生成token
+        String token = JwtUtil.sign(username, syspassword);
+        // 设置token缓存有效时间
+        redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
+        redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000);
+        obj.put("token", token);
+
+        //2.设置登录租户
+        Result<JSONObject> loginTenantError = sysUserService.setLoginTenant(sysUser, obj, username, result);
+        if (loginTenantError != null) {
+            return loginTenantError;
+        }
+
+        //3.设置登录用户信息
+        obj.put("userInfo", sysUser);
+
+        //4.设置登录部门
+        List<SysDepart> departs = sysDepartService.queryUserDeparts(sysUser.getId());
+        obj.put("departs", departs);
+        if (departs == null || departs.size() == 0) {
+            obj.put("multi_depart", 0);
+        } else if (departs.size() == 1) {
+            sysUserService.updateUserDepart(username, departs.get(0).getOrgCode(), null);
+            obj.put("multi_depart", 1);
+        } else {
+            //查询当前是否有登录部门
+            // update-begin--Author:wangshuai Date:20200805 for:如果用戶为选择部门,数据库为存在上一次登录部门,则取一条存进去
+            SysUser sysUserById = sysUserService.getById(sysUser.getId());
+            if (oConvertUtils.isEmpty(sysUserById.getOrgCode())) {
+                sysUserService.updateUserDepart(username, departs.get(0).getOrgCode(), null);
+            }
+            // update-end--Author:wangshuai Date:20200805 for:如果用戶为选择部门,数据库为存在上一次登录部门,则取一条存进去
+            obj.put("multi_depart", 2);
+        }
+
+        //update-begin---author:scott ---date:2024-01-05  for:【QQYUN-7802】前端在登录时加载了两次数据字典,建议优化下,避免数据字典太多时可能产生的性能问题 #956---
+        // login接口,在vue3前端下不加载字典数据,vue2下加载字典
+        String vue3Version = request.getHeader(CommonConstant.VERSION);
+        if (oConvertUtils.isEmpty(vue3Version)) {
+            obj.put("sysAllDictItems", sysDictService.queryAllDictItems());
+        }
+        //end-begin---author:scott ---date:2024-01-05  for:【QQYUN-7802】前端在登录时加载了两次数据字典,建议优化下,避免数据字典太多时可能产生的性能问题 #956---
+
+        result.setResult(obj);
+        result.success("登录成功");
+        return result;
+    }
+
+    /**
+     * 获取加密字符串
+     *
+     * @return
+     */
+    @GetMapping(value = "/getEncryptedString")
+    public Result<Map<String, String>> getEncryptedString() {
+        Result<Map<String, String>> result = new Result<Map<String, String>>();
+        Map<String, String> map = new HashMap(5);
+        map.put("key", EncryptedString.key);
+        map.put("iv", EncryptedString.iv);
+        result.setResult(map);
+        return result;
+    }
+
+    /**
+     * 后台生成图形验证码 :有效
+     *
+     * @param response
+     * @param key
+     */
+    @ApiOperation("获取验证码")
+    @GetMapping(value = "/randomImage/{key}")
+    public Result<String> randomImage(HttpServletResponse response, @PathVariable("key") String key) {
+        Result<String> res = new Result<String>();
+        try {
+            //生成验证码
+            String code = RandomUtil.randomString(BASE_CHECK_CODES, 4);
+            //存到redis中
+            String lowerCaseCode = code.toLowerCase();
+
+            //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
+            // 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可
+            String origin = lowerCaseCode + key + jeecgBaseConfig.getSignatureSecret();
+            String realKey = Md5Util.md5Encode(origin, "utf-8");
+            //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
+
+            redisUtil.set(realKey, lowerCaseCode, 60);
+            log.info("获取验证码,Redis key = {},checkCode = {}", realKey, code);
+            //返回前端
+            String base64 = RandImageUtil.generate(code);
+            res.setSuccess(true);
+            res.setResult(base64);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            res.error500("获取验证码失败,请检查redis配置!");
+            return res;
+        }
+        return res;
+    }
+
+    /**
+     * 切换菜单表为vue3的表
+     */
+    @RequiresRoles({"admin"})
+    @GetMapping(value = "/switchVue3Menu")
+    public Result<String> switchVue3Menu(HttpServletResponse response) {
+        Result<String> res = new Result<String>();
+        sysPermissionService.switchVue3Menu();
+        return res;
+    }
+
+    /**
+     * 图形验证码
+     *
+     * @param sysLoginModel
+     * @return
+     */
+    @RequestMapping(value = "/checkCaptcha", method = RequestMethod.POST)
+    public Result<?> checkCaptcha(@RequestBody SysLoginModel sysLoginModel) {
+        String captcha = sysLoginModel.getCaptcha();
+        String checkKey = sysLoginModel.getCheckKey();
+        if (captcha == null) {
+            return Result.error("验证码无效");
+        }
+        String lowerCaseCaptcha = captcha.toLowerCase();
+        String realKey = Md5Util.md5Encode(lowerCaseCaptcha + checkKey, "utf-8");
+        Object checkCode = redisUtil.get(realKey);
+        if (checkCode == null || !checkCode.equals(lowerCaseCaptcha)) {
+            return Result.error("验证码错误");
+        }
+        return Result.ok();
+    }
+
+    /**
+     * 登录二维码
+     */
+    @ApiOperation(value = "登录二维码", notes = "登录二维码")
+    @GetMapping("/getLoginQrcode")
+    public Result<?> getLoginQrcode() {
+        String qrcodeId = CommonConstant.LOGIN_QRCODE_PRE + IdWorker.getIdStr();
+        //定义二维码参数
+        Map params = new HashMap(5);
+        params.put("qrcodeId", qrcodeId);
+        //存放二维码唯一标识30秒有效
+        redisUtil.set(CommonConstant.LOGIN_QRCODE + qrcodeId, qrcodeId, 30);
+        return Result.OK(params);
+    }
+
+    /**
+     * 扫码二维码
+     */
+    @ApiOperation(value = "扫码登录二维码", notes = "扫码登录二维码")
+    @PostMapping("/scanLoginQrcode")
+    public Result<?> scanLoginQrcode(@RequestParam String qrcodeId, @RequestParam String token) {
+        Object check = redisUtil.get(CommonConstant.LOGIN_QRCODE + qrcodeId);
+        if (oConvertUtils.isNotEmpty(check)) {
+            //存放token给前台读取
+            redisUtil.set(CommonConstant.LOGIN_QRCODE_TOKEN + qrcodeId, token, 60);
+        } else {
+            return Result.error("二维码已过期,请刷新后重试");
+        }
+        return Result.OK("扫码成功");
+    }
+
+
+    /**
+     * 获取用户扫码后保存的token
+     */
+    @ApiOperation(value = "获取用户扫码后保存的token", notes = "获取用户扫码后保存的token")
+    @GetMapping("/getQrcodeToken")
+    public Result getQrcodeToken(@RequestParam String qrcodeId) {
+        Object token = redisUtil.get(CommonConstant.LOGIN_QRCODE_TOKEN + qrcodeId);
+        Map result = new HashMap(5);
+        Object qrcodeIdExpire = redisUtil.get(CommonConstant.LOGIN_QRCODE + qrcodeId);
+        if (oConvertUtils.isEmpty(qrcodeIdExpire)) {
+            //二维码过期通知前台刷新
+            result.put("token", "-2");
+            return Result.OK(result);
+        }
+        if (oConvertUtils.isNotEmpty(token)) {
+            result.put("success", true);
+            result.put("token", token);
+        } else {
+            result.put("token", "-1");
+        }
+        return Result.OK(result);
+    }
+
+    /**
+     * 登录失败超出次数5 返回true
+     *
+     * @param username
+     * @return
+     */
+    private boolean isLoginFailOvertimes(String username) {
+        String key = CommonConstant.LOGIN_FAIL + username;
+        Object failTime = redisUtil.get(key);
+        if (failTime != null) {
+            Integer val = Integer.parseInt(failTime.toString());
+            if (val > 5) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 记录登录失败次数
+     *
+     * @param username
+     */
+    private void addLoginFailOvertimes(String username) {
+        String key = CommonConstant.LOGIN_FAIL + username;
+        Object failTime = redisUtil.get(key);
+        Integer val = 0;
+        if (failTime != null) {
+            val = Integer.parseInt(failTime.toString());
+        }
+        // 10分钟
+        redisUtil.set(key, ++val, 10);
+    }
 
 }

文件差异内容过多而无法显示
+ 338 - 343
system/system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java


+ 384 - 326
system/system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java

@@ -33,120 +33,130 @@ import java.util.Set;
  */
 public interface ISysUserService extends IService<SysUser> {
 
-	/**
-	 * 查询用户数据列表
-	 * 
-	 * @param req
-	 * @param queryWrapper
-	 * @param pageSize
-	 * @param pageNo
-	 * @return
-	 */
-	Result<IPage<SysUser>> queryPageList(HttpServletRequest req, QueryWrapper<SysUser> queryWrapper, Integer pageSize, Integer pageNo);
-	
-	/**
-	 * 重置密码
-	 *
-	 * @param username
-	 * @param oldpassword
-	 * @param newpassword
-	 * @param confirmpassword
-	 * @return
-	 */
-	public Result<?> resetPassword(String username, String oldpassword, String newpassword, String confirmpassword);
-
-	/**
-	 * 修改密码
-	 *
-	 * @param sysUser
-	 * @return
-	 */
-	public Result<?> changePassword(SysUser sysUser);
-
-	/**
-	 * 删除用户
-	 * @param userId
-	 * @return
-	 */
-	public boolean deleteUser(String userId);
-
-	/**
-	 * 批量删除用户
-	 * @param userIds
-	 * @return
-	 */
-	public boolean deleteBatchUsers(String userIds);
+    /**
+     * 查询用户数据列表
+     *
+     * @param req
+     * @param queryWrapper
+     * @param pageSize
+     * @param pageNo
+     * @return
+     */
+    Result<IPage<SysUser>> queryPageList(HttpServletRequest req, QueryWrapper<SysUser> queryWrapper, Integer pageSize, Integer pageNo);
+
+    /**
+     * 重置密码
+     *
+     * @param username
+     * @param oldpassword
+     * @param newpassword
+     * @param confirmpassword
+     * @return
+     */
+    public Result<?> resetPassword(String username, String oldpassword, String newpassword, String confirmpassword);
+
+    /**
+     * 修改密码
+     *
+     * @param sysUser
+     * @return
+     */
+    public Result<?> changePassword(SysUser sysUser);
+
+    /**
+     * 删除用户
+     *
+     * @param userId
+     * @return
+     */
+    public boolean deleteUser(String userId);
+
+    /**
+     * 批量删除用户
+     *
+     * @param userIds
+     * @return
+     */
+    public boolean deleteBatchUsers(String userIds);
 
     /**
      * 根据用户名查询
+     *
      * @param username 用户名
      * @return SysUser
      */
-	public SysUser getUserByName(String username);
-	
-	/**
-	 * 添加用户和用户角色关系
-	 * @param user
-	 * @param roles
-	 */
-	public void addUserWithRole(SysUser user,String roles);
-	
-	
-	/**
-	 * 修改用户和用户角色关系
-	 * @param user
-	 * @param roles
-	 */
-	public void editUserWithRole(SysUser user,String roles);
-
-	/**
-	 * 获取用户的授权角色
-	 * @param username
-	 * @return
-	 */
-	public List<String> getRole(String username);
-
-	/**
-	 * 获取根据登录用户的角色获取动态首页
-	 *
-	 * @param username
-	 * @param version 前端UI版本
-	 * @return
-	 */
-	public SysRoleIndex getDynamicIndexByUserRole(String username,String version);
-	
-	/**
-	  * 查询用户信息包括 部门信息
-	 * @param username
-	 * @return
-	 */
-	@Deprecated
-	public SysUserCacheInfo getCacheUser(String username);
-
-	/**
-	 * 根据部门Id查询
-	 * @param page
+    public SysUser getUserByName(String username);
+
+    /**
+     * 添加用户和用户角色关系
+     *
+     * @param user
+     * @param roles
+     */
+    public void addUserWithRole(SysUser user, String roles);
+
+
+    /**
+     * 修改用户和用户角色关系
+     *
+     * @param user
+     * @param roles
+     */
+    public void editUserWithRole(SysUser user, String roles);
+
+    /**
+     * 获取用户的授权角色
+     *
+     * @param username
+     * @return
+     */
+    public List<String> getRole(String username);
+
+    /**
+     * 获取根据登录用户的角色获取动态首页
+     *
+     * @param username
+     * @param version  前端UI版本
+     * @return
+     */
+    public SysRoleIndex getDynamicIndexByUserRole(String username, String version);
+
+    /**
+     * 查询用户信息包括 部门信息
+     *
+     * @param username
+     * @return
+     */
+    @Deprecated
+    public SysUserCacheInfo getCacheUser(String username);
+
+    /**
+     * 根据部门Id查询
+     *
+     * @param page
      * @param departId 部门id
      * @param username 用户账户名称
-	 * @return
-	 */
-	public IPage<SysUser> getUserByDepId(Page<SysUser> page, String departId, String username);
-
-	/**
-	 * 根据部门Ids查询
-	 * @param page
-     * @param departIds  部门id集合
-     * @param username 用户账户名称
-	 * @return
-	 */
-	public IPage<SysUser> getUserByDepIds(Page<SysUser> page, List<String> departIds, String username);
+     * @return
+     */
+    public IPage<SysUser> getUserByDepId(Page<SysUser> page, String departId, String username);
 
-	/**
-	 * 根据 userIds查询,查询用户所属部门的名称(多个部门名逗号隔开)
-	 * @param userIds
-	 * @return
-	 */
-	public Map<String,String> getDepNamesByUserIds(List<String> userIds);
+    /**
+     * 根据部门Ids查询
+     *
+     * @param page
+     * @param departIds 部门id集合
+     * @param username  用户账户名称
+     * @return
+     */
+    public IPage<SysUser> getUserByDepIds(Page<SysUser> page, List<String> departIds, String username);
+
+    /**
+     * 根据 userIds查询,查询用户所属部门的名称(多个部门名逗号隔开)
+     *
+     * @param userIds
+     * @return
+     */
+    public Map<String, String> getDepNamesByUserIds(List<String> userIds);
 
     /**
      * 根据部门 Id 和 QueryWrapper 查询
@@ -158,278 +168,326 @@ public interface ISysUserService extends IService<SysUser> {
      */
     //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245【漏洞】发现新漏洞待处理20220906 ----sql注入 方法没有使用,注掉
     // public IPage<SysUser> getUserByDepartIdAndQueryWrapper(Page<SysUser> page, String departId, QueryWrapper<SysUser> queryWrapper);
-	//update-end-author:taoyan date:2022-9-13 for: VUEN-2245【漏洞】发现新漏洞待处理20220906 ----sql注入 方法没有使用,注掉
-
-	/**
-	 * 根据 orgCode 查询用户,包括子部门下的用户
-	 *
-	 * @param orgCode
-	 * @param userParams 用户查询条件,可为空
-	 * @param page 分页参数
-	 * @return
-	 */
-	IPage<SysUserSysDepartModel> queryUserByOrgCode(String orgCode, SysUser userParams, IPage page);
-
-	/**
-	 * 根据角色Id查询
-	 * @param page
-     * @param roleId 角色id
+    //update-end-author:taoyan date:2022-9-13 for: VUEN-2245【漏洞】发现新漏洞待处理20220906 ----sql注入 方法没有使用,注掉
+
+    /**
+     * 根据 orgCode 查询用户,包括子部门下的用户
+     *
+     * @param orgCode
+     * @param userParams 用户查询条件,可为空
+     * @param page       分页参数
+     * @return
+     */
+    IPage<SysUserSysDepartModel> queryUserByOrgCode(String orgCode, SysUser userParams, IPage page);
+
+    /**
+     * 根据角色Id查询
+     *
+     * @param page
+     * @param roleId   角色id
      * @param username 用户账户名称
-	 * @return
-	 */
-	public IPage<SysUser> getUserByRoleId(Page<SysUser> page,String roleId, String username);
-
-	/**
-	 * 通过用户名获取用户角色集合
-	 *
-	 * @param username 用户名
-	 * @return 角色集合
-	 */
-	Set<String> getUserRolesSet(String username);
-
-	/**
-	 * 通过用户名获取用户权限集合
-	 *
-	 * @param username 用户名
-	 * @return 权限集合
-	 */
-	Set<String> getUserPermissionsSet(String username);
-	
-	/**
-	 * 根据用户名设置部门ID
-	 * @param username
-	 * @param orgCode
-	 */
-	void updateUserDepart(String username,String orgCode,Integer loginTenantId);
-	
-	/**
-	 * 根据手机号获取用户名和密码
+     * @return
+     */
+    public IPage<SysUser> getUserByRoleId(Page<SysUser> page, String roleId, String username);
+
+    /**
+     * 通过用户名获取用户角色集合
+     *
+     * @param username 用户名
+     * @return 角色集合
+     */
+    Set<String> getUserRolesSet(String username);
+
+    /**
+     * 通过用户名获取用户权限集合
+     *
+     * @param username 用户名
+     * @return 权限集合
+     */
+    Set<String> getUserPermissionsSet(String username);
+
+    /**
+     * 根据用户名设置部门ID
+     *
+     * @param username
+     * @param orgCode
+     */
+    void updateUserDepart(String username, String orgCode, Integer loginTenantId);
+
+    /**
+     * 根据手机号获取用户名和密码
+     *
      * @param phone 手机号
      * @return SysUser
-	 */
-	public SysUser getUserByPhone(String phone);
+     */
+    public SysUser getUserByPhone(String phone);
 
 
-	/**
-	 * 根据邮箱获取用户
+    /**
+     * 根据邮箱获取用户
+     *
      * @param email 邮箱
      * @return SysUser
      */
-	public SysUser getUserByEmail(String email);
-
-
-	/**
-	 * 添加用户和用户部门关系
-	 * @param user
-	 * @param selectedParts
-	 */
-	void addUserWithDepart(SysUser user, String selectedParts);
-
-	/**
-	 * 编辑用户和用户部门关系
-	 * @param user
-	 * @param departs
-	 */
-	void editUserWithDepart(SysUser user, String departs);
-	
-	/**
-	   * 校验用户是否有效
-	 * @param sysUser
-	 * @return
-	 */
-	Result checkUserIsEffective(SysUser sysUser);
-
-	/**
-	 * 查询被逻辑删除的用户
+    public SysUser getUserByEmail(String email);
+
+
+    /**
+     * 添加用户和用户部门关系
+     *
+     * @param user
+     * @param selectedParts
+     */
+    void addUserWithDepart(SysUser user, String selectedParts);
+
+    /**
+     * 编辑用户和用户部门关系
+     *
+     * @param user
+     * @param departs
+     */
+    void editUserWithDepart(SysUser user, String departs);
+
+    /**
+     * 校验用户是否有效
+     *
+     * @param sysUser
+     * @return
+     */
+    Result checkUserIsEffective(SysUser sysUser);
+
+    /**
+     * 查询被逻辑删除的用户
+     *
      * @return List<SysUser>
-	 */
-	List<SysUser> queryLogicDeleted();
+     */
+    List<SysUser> queryLogicDeleted();
 
-	/**
-	 * 查询被逻辑删除的用户(可拼装查询条件)
+    /**
+     * 查询被逻辑删除的用户(可拼装查询条件)
+     *
      * @param wrapper
      * @return List<SysUser>
-	 */
-	List<SysUser> queryLogicDeleted(LambdaQueryWrapper<SysUser> wrapper);
+     */
+    List<SysUser> queryLogicDeleted(LambdaQueryWrapper<SysUser> wrapper);
 
-	/**
-	 * 还原被逻辑删除的用户
-     * @param userIds  存放用户id集合
+    /**
+     * 还原被逻辑删除的用户
+     *
+     * @param userIds      存放用户id集合
      * @param updateEntity
      * @return boolean
-	 */
-	boolean revertLogicDeleted(List<String> userIds, SysUser updateEntity);
+     */
+    boolean revertLogicDeleted(List<String> userIds, SysUser updateEntity);
 
-	/**
-	 * 彻底删除被逻辑删除的用户
+    /**
+     * 彻底删除被逻辑删除的用户
+     *
      * @param userIds 存放用户id集合
      * @return boolean
-	 */
-	boolean removeLogicDeleted(List<String> userIds);
+     */
+    boolean removeLogicDeleted(List<String> userIds);
 
     /**
      * 更新手机号、邮箱空字符串为 null
+     *
      * @return boolean
      */
     @Transactional(rollbackFor = Exception.class)
     boolean updateNullPhoneEmail();
 
-	/**
-	 * 保存第三方用户信息
-	 * @param sysUser
-	 */
-	void saveThirdUser(SysUser sysUser);
+    /**
+     * 保存第三方用户信息
+     *
+     * @param sysUser
+     */
+    void saveThirdUser(SysUser sysUser);
 
-	/**
-	 * 根据部门Ids查询
-	 * @param departIds 部门id集合
-     * @param username 用户账户名称
-	 * @return
-	 */
-	List<SysUser> queryByDepIds(List<String> departIds, String username);
-
-	/**
-	 * 保存用户
-	 * @param user 用户
-	 * @param selectedRoles 选择的角色id,多个以逗号隔开
-	 * @param selectedDeparts 选择的部门id,多个以逗号隔开
-	 * @param relTenantIds 多个租户id
-	 */
-	void saveUser(SysUser user, String selectedRoles, String selectedDeparts, String relTenantIds);
-
-	/**
-	 * 编辑用户
-	 * @param user 用户
-	 * @param roles 选择的角色id,多个以逗号隔开
-	 * @param departs 选择的部门id,多个以逗号隔开
-	 * @param relTenantIds 多个租户id
-	 */
-	void editUser(SysUser user, String roles, String departs, String relTenantIds);
-
-	/**
+    /**
+     * 根据部门Ids查询
+     *
+     * @param departIds 部门id集合
+     * @param username  用户账户名称
+     * @return
+     */
+    List<SysUser> queryByDepIds(List<String> departIds, String username);
+
+    /**
+     * 保存用户
+     *
+     * @param user            用户
+     * @param selectedRoles   选择的角色id,多个以逗号隔开
+     * @param selectedDeparts 选择的部门id,多个以逗号隔开
+     * @param relTenantIds    多个租户id
+     */
+    void saveUser(SysUser user, String selectedRoles, String selectedDeparts, String relTenantIds);
+
+    /**
+     * 编辑用户
+     *
+     * @param user         用户
+     * @param roles        选择的角色id,多个以逗号隔开
+     * @param departs      选择的部门id,多个以逗号隔开
+     * @param relTenantIds 多个租户id
+     */
+    void editUser(SysUser user, String roles, String departs, String relTenantIds);
+
+    /**
      * userId转为username
+     *
      * @param userIdList
      * @return List<String>
      */
-	List<String> userIdToUsername(Collection<String> userIdList);
+    List<String> userIdToUsername(Collection<String> userIdList);
 
 
-	/**
-	 * 获取用户信息 字段信息是加密后的 【加密用户信息】
-	 * @param username
-	 * @return
-	 */
-	LoginUser getEncodeUserInfo(String username);
+    /**
+     * 获取用户信息 字段信息是加密后的 【加密用户信息】
+     *
+     * @param username
+     * @return
+     */
+    LoginUser getEncodeUserInfo(String username);
 
     /**
      * 用户离职
+     *
      * @param username
      */
     void userQuit(String username);
 
     /**
      * 获取离职人员列表
-	 * @param tenantId 租户id
+     *
+     * @param tenantId 租户id
      * @return
      */
     List<SysUser> getQuitList(Integer tenantId);
 
     /**
      * 更新刪除状态和离职状态
-     * @param userIds  存放用户id集合
+     *
+     * @param userIds 存放用户id集合
      * @param sysUser
      * @return boolean
      */
     void updateStatusAndFlag(List<String> userIds, SysUser sysUser);
 
-	/**
-	 * 设置登录租户
-	 * @param sysUser
-	 * @return
-	 */
-	Result<JSONObject>  setLoginTenant(SysUser sysUser, JSONObject obj, String username, Result<JSONObject> result);
-
-	//--- author:taoyan date:20221231 for: QQYUN-3515【应用】应用下的组织机构管理功能,细节实现 ---
-	/**
-	 * 批量编辑用户信息
-	 * @param json
-	 */
-	void batchEditUsers(JSONObject json);
-
-	/**
-	 * 根据关键词查询用户和部门
-	 * @param keyword
-	 * @return
-	 */
-	DepartAndUserInfo searchByKeyword(String keyword);
-
-	/**
-	 * 查询 部门修改的信息
-	 * @param departId
-	 * @return
-	 */
-	UpdateDepartInfo getUpdateDepartInfo(String departId);
-
-	/**
-	 * 修改部门相关信息
-	 * @param updateDepartInfo
-	 */
-	void doUpdateDepartInfo(UpdateDepartInfo updateDepartInfo);
-
-	/**
-	 * 设置负责人 取消负责人
-	 * @param json
-	 */
-	void changeDepartChargePerson(JSONObject json);
-	//--- author:taoyan date:20221231 for: QQYUN-3515【应用】应用下的组织机构管理功能,细节实现 ---
-	
-	/**
-	 * 编辑租户用户
-	 * @param sysUser
-	 * @param tenantId
-	 * @param departs
-	 */
-	void editTenantUser(SysUser sysUser, String tenantId, String departs, String roles);
-
-	/**
-	 * 修改用户账号状态
-	 * @param id 账号id
-	 * @param status 账号状态
-	 */
-	void updateStatus(String id, String status);
-
-	/**
-	 * 导出应用下的用户Excel
-	 * @param request
-	 * @return
-	 */
-	ModelAndView exportAppUser(HttpServletRequest request);
-
-	/**
-	 * 导入应用下的用户
-	 * @param request
-	 * @return
-	 */
-	Result<?> importAppUser(HttpServletRequest request);
-
-
-	/**
-	 * 根据部门ID获取用户
-	 *
-	 * @param departIds
-	 * @param username
-	 * @return
-	 */
-	List<SysUser> getUserByDepIds(List<String> departIds, String username);
-
-
-	/**
-	 * 获取登录用户信息
-	 *
-	 * @param token
-	 * @return
-	 */
-	LoginUser getLoginUser(String token);
-
-	SysUser queryByOpenId(String openid);
+    /**
+     * 设置登录租户
+     *
+     * @param sysUser
+     * @return
+     */
+    Result<JSONObject> setLoginTenant(SysUser sysUser, JSONObject obj, String username, Result<JSONObject> result);
+
+    //--- author:taoyan date:20221231 for: QQYUN-3515【应用】应用下的组织机构管理功能,细节实现 ---
+
+    /**
+     * 批量编辑用户信息
+     *
+     * @param json
+     */
+    void batchEditUsers(JSONObject json);
+
+    /**
+     * 根据关键词查询用户和部门
+     *
+     * @param keyword
+     * @return
+     */
+    DepartAndUserInfo searchByKeyword(String keyword);
+
+    /**
+     * 查询 部门修改的信息
+     *
+     * @param departId
+     * @return
+     */
+    UpdateDepartInfo getUpdateDepartInfo(String departId);
+
+    /**
+     * 修改部门相关信息
+     *
+     * @param updateDepartInfo
+     */
+    void doUpdateDepartInfo(UpdateDepartInfo updateDepartInfo);
+
+    /**
+     * 设置负责人 取消负责人
+     *
+     * @param json
+     */
+    void changeDepartChargePerson(JSONObject json);
+    //--- author:taoyan date:20221231 for: QQYUN-3515【应用】应用下的组织机构管理功能,细节实现 ---
+
+    /**
+     * 编辑租户用户
+     *
+     * @param sysUser
+     * @param tenantId
+     * @param departs
+     */
+    void editTenantUser(SysUser sysUser, String tenantId, String departs, String roles);
+
+    /**
+     * 修改用户账号状态
+     *
+     * @param id     账号id
+     * @param status 账号状态
+     */
+    void updateStatus(String id, String status);
+
+    /**
+     * 导出应用下的用户Excel
+     *
+     * @param request
+     * @return
+     */
+    ModelAndView exportAppUser(HttpServletRequest request);
+
+    /**
+     * 导入应用下的用户
+     *
+     * @param request
+     * @return
+     */
+    Result<?> importAppUser(HttpServletRequest request);
+
+
+    /**
+     * 根据部门ID获取用户
+     *
+     * @param departIds
+     * @param username
+     * @return
+     */
+    List<SysUser> getUserByDepIds(List<String> departIds, String username);
+
+
+    /**
+     * 获取登录用户信息
+     *
+     * @param token
+     * @return
+     */
+    LoginUser getLoginUser(String token);
+
+    SysUser queryByOpenId(String openid);
+
+    /**
+     * 查询当前用户的所有部门/当前部门编码
+     *
+     * @return
+     */
+    Map<String, Object> getCurrentUserDeparts(LoginUser sysUser);
+
+    /**
+     * 切换部门
+     *
+     * @param user
+     * @param username
+     * @return
+     */
+    JSONObject updateSelectDept(SysUser user, String username);
 }

文件差异内容过多而无法显示
+ 496 - 487
system/system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java


+ 39 - 4
web/src/main/java/com/ynfy/app/api/v1/controller/ApiUserController.java

@@ -1,22 +1,23 @@
 package com.ynfy.app.api.v1.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.ynfy.app.api.v1.annoation.IgnoreAuth;
 import com.ynfy.app.api.v1.entity.dto.UserDTO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.PasswordUtil;
+import org.jeecg.common.util.TokenUtil;
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.system.entity.SysUser;
 import org.jeecg.modules.system.service.ISysUserService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.Date;
+import java.util.Map;
 import java.util.Objects;
 
 @RestController
@@ -71,4 +72,38 @@ public class ApiUserController extends ApiBaseController {
         sysUserService.save(user);
         return Result.ok("注册成功");
     }
+
+    /**
+     * 查询当前用户的所有部门/当前部门编码
+     *
+     * @return
+     */
+    @RequestMapping(value = "/getCurrentUserDeparts", method = RequestMethod.GET)
+    public Result<Map<String, Object>> getCurrentUserDeparts() {
+        LoginUser sysUser = sysUserService.getLoginUser(TokenUtil.getToken(request));
+        Result<Map<String, Object>> result = new Result<>();
+        Map<String, Object> map = sysUserService.getCurrentUserDeparts(sysUser);
+        result.setResult(map);
+        result.setSuccess(true);
+        return result;
+    }
+
+    /**
+     * 切换部门
+     *
+     * @param user
+     * @return
+     */
+    @RequestMapping(value = "/selectDepart", method = RequestMethod.PUT)
+    public Result<JSONObject> selectDepart(@RequestBody SysUser user) {
+        Result<JSONObject> result = new Result<>();
+        String username = user.getUsername();
+        if (oConvertUtils.isEmpty(username)) {
+            LoginUser sysUser = sysUserService.getLoginUser(TokenUtil.getToken(request));
+            username = sysUser.getUsername();
+        }
+        JSONObject obj = sysUserService.updateSelectDept(user, username);
+        result.setResult(obj);
+        return result;
+    }
 }

部分文件因为文件数量过多而无法显示