Kaynağa Gözat

考生端的登录校验

yangfeng 1 yıl önce
ebeveyn
işleme
009812c37b

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

@@ -48,706 +48,724 @@ import java.util.*;
  */
 @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
-	private ISysTenantService sysTenantService;
-	@Autowired
+    @Autowired
+    private ISysTenantService sysTenantService;
+    @Autowired
     private ISysDictService sysDictService;
-	@Resource
-	private BaseCommonService baseCommonService;
-
-	@Autowired
-	private JeecgBaseConfig jeecgBaseConfig;
-
-	@Lazy
-	@Resource
-	private CommonAPI commonApi;
-
-	private final String BASE_CHECK_CODES = "qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890";
-
-	@ApiOperation("登录接口")
-	@RequestMapping(value = "/login", method = RequestMethod.POST)
-	public Result<JSONObject> login(@RequestBody SysLoginModel sysLoginModel){
-		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:校验验证码
+    @Resource
+    private BaseCommonService baseCommonService;
+
+    @Autowired
+    private JeecgBaseConfig jeecgBaseConfig;
+
+    @Lazy
+    @Resource
+    private CommonAPI commonApi;
+
+    private final String BASE_CHECK_CODES = "qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890";
+
+    @ApiOperation("登录接口")
+    @RequestMapping(value = "/login", method = RequestMethod.POST)
+    public Result<JSONObject> login(@RequestBody SysLoginModel sysLoginModel) {
+        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;
-		}
-		//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);
-
-		//管理端登录需要校验
-		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("考生不允许登录管理系统");
-			}
-		}
-
-		//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);
-		//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);
+        //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 version = request.getHeader(CommonConstant.VERSION);
-			//update-begin---author:liusq ---date:2022-06-29  for:接口返回值修改,同步修改这里的判断逻辑-----------
-			SysRoleIndex roleIndex = sysUserService.getDynamicIndexByUserRole(username, version);
-			if (oConvertUtils.isNotEmpty(version) && 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 version = request.getHeader(CommonConstant.VERSION);
+            //update-begin---author:liusq ---date:2022-06-29  for:接口返回值修改,同步修改这里的判断逻辑-----------
+            SysRoleIndex roleIndex = sysUserService.getDynamicIndexByUserRole(username, version);
+            if (oConvertUtils.isNotEmpty(version) && 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) {
-		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);
-		//添加日志
-		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) {
-		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);
-		}
-		obj.put("sysAllDictItems", sysDictService.queryAllDictItems());
-		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;
-	}
-	
-	/**
-	 * app登录
-	 * @param sysLoginModel
-	 * @return
-	 * @throws Exception
-	 */
-	@RequestMapping(value = "/mLogin", method = RequestMethod.POST)
-	public Result<JSONObject> mLogin(@RequestBody SysLoginModel sysLoginModel) throws Exception {
-		Result<JSONObject> result = new Result<JSONObject>();
-		String username = sysLoginModel.getUsername();
-		String password = sysLoginModel.getPassword();
-		JSONObject obj = new JSONObject();
-		
-		//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 平台用户登录失败锁定用户
-		//1. 校验用户是否有效
-		SysUser sysUser = sysUserService.getUserByName(username);
-		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;
-		}
-		
-		//3.设置登录部门
-		String orgCode = sysUser.getOrgCode();
-		if(oConvertUtils.isEmpty(orgCode)) {
-			//如果当前用户无选择部门 查看部门关联信息
-			List<SysDepart> departs = sysDepartService.queryUserDeparts(sysUser.getId());
-			//update-begin-author:taoyan date:20220117 for: JTC-1068【app】新建用户,没有设置部门及角色,点击登录提示暂未归属部,一直在登录页面 使用手机号登录 可正常
-			if (departs == null || departs.size() == 0) {
+        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) {
+        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);
+        //添加日志
+        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) {
+        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);
+        }
+        obj.put("sysAllDictItems", sysDictService.queryAllDictItems());
+        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;
+    }
+
+    /**
+     * app登录
+     *
+     * @param sysLoginModel
+     * @return
+     * @throws Exception
+     */
+    @RequestMapping(value = "/mLogin", method = RequestMethod.POST)
+    public Result<JSONObject> mLogin(@RequestBody SysLoginModel sysLoginModel) throws Exception {
+        Result<JSONObject> result = new Result<JSONObject>();
+        String username = sysLoginModel.getUsername();
+        String password = sysLoginModel.getPassword();
+        JSONObject obj = new JSONObject();
+
+        //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 平台用户登录失败锁定用户
+        //1. 校验用户是否有效
+        SysUser sysUser = sysUserService.getUserByName(username);
+        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;
+        }
+
+        //3.设置登录部门
+        String orgCode = sysUser.getOrgCode();
+        if (oConvertUtils.isEmpty(orgCode)) {
+            //如果当前用户无选择部门 查看部门关联信息
+            List<SysDepart> departs = sysDepartService.queryUserDeparts(sysUser.getId());
+            //update-begin-author:taoyan date:20220117 for: JTC-1068【app】新建用户,没有设置部门及角色,点击登录提示暂未归属部,一直在登录页面 使用手机号登录 可正常
+            if (departs == null || departs.size() == 0) {
 				/*result.error500("用户暂未归属部门,不可登录!");
 				return result;*/
-			}else{
-				orgCode = departs.get(0).getOrgCode();
-				sysUser.setOrgCode(orgCode);
-				this.sysUserService.updateUserDepart(username, orgCode,null);
-			}
-			//update-end-author:taoyan date:20220117 for: JTC-1068【app】新建用户,没有设置部门及角色,点击登录提示暂未归属部,一直在登录页面 使用手机号登录 可正常
-		}
-
-		//4. 设置登录租户
-		Result<JSONObject> loginTenantError = sysUserService.setLoginTenant(sysUser, obj, username, result);
-		if (loginTenantError != null) {
-			return loginTenantError;
-		}
-
-		//5. 设置登录用户信息
-		obj.put("userInfo", sysUser);
-		
-		//6. 生成token
-		String token = JwtUtil.sign(username, syspassword);
-		// 设置超时时间
-		redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
-		redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME*2 / 1000);
-
-		//token 信息
-		obj.put("token", token);
-		result.setResult(obj);
-		result.setSuccess(true);
-		result.setCode(200);
-		baseCommonService.addLog("用户名: " + username + ",登录成功[移动端]!", CommonConstant.LOG_TYPE_1, null);
-		return result;
-	}
-
-	/**
-	 * 图形验证码
-	 * @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);
-	}
+            } else {
+                orgCode = departs.get(0).getOrgCode();
+                sysUser.setOrgCode(orgCode);
+                this.sysUserService.updateUserDepart(username, orgCode, null);
+            }
+            //update-end-author:taoyan date:20220117 for: JTC-1068【app】新建用户,没有设置部门及角色,点击登录提示暂未归属部,一直在登录页面 使用手机号登录 可正常
+        }
+
+        //4. 设置登录租户
+        Result<JSONObject> loginTenantError = sysUserService.setLoginTenant(sysUser, obj, username, result);
+        if (loginTenantError != null) {
+            return loginTenantError;
+        }
+
+        //5. 设置登录用户信息
+        obj.put("userInfo", sysUser);
+
+        //6. 生成token
+        String token = JwtUtil.sign(username, syspassword);
+        // 设置超时时间
+        redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
+        redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000);
+
+        //token 信息
+        obj.put("token", token);
+        result.setResult(obj);
+        result.setSuccess(true);
+        result.setCode(200);
+        baseCommonService.addLog("用户名: " + username + ",登录成功[移动端]!", CommonConstant.LOG_TYPE_1, null);
+        return result;
+    }
+
+    /**
+     * 图形验证码
+     *
+     * @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);
+    }
 
 }