¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.jeecg.modules.system.controller; |
| | | |
| | | import cn.hutool.core.util.RandomUtil; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.aliyuncs.exceptions.ClientException; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.IdWorker; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.shiro.SecurityUtils; |
| | | import org.apache.shiro.authz.annotation.RequiresRoles; |
| | | import org.jeecg.common.api.vo.Result; |
| | | import org.jeecg.common.constant.CacheConstant; |
| | | import org.jeecg.common.constant.CommonConstant; |
| | | import org.jeecg.common.constant.SymbolConstant; |
| | | import org.jeecg.common.system.util.JwtUtil; |
| | | import org.jeecg.common.system.vo.LoginUser; |
| | | import org.jeecg.common.util.*; |
| | | import org.jeecg.common.util.encryption.EncryptedString; |
| | | 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.model.SysLoginModel; |
| | | import org.jeecg.modules.system.service.*; |
| | | import org.jeecg.modules.system.service.impl.SysBaseApiImpl; |
| | | import org.jeecg.modules.system.util.RandImageUtil; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.http.HttpStatus; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * @Author scott |
| | | * @since 2018-12-17 |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/sys") |
| | | @Api(tags="ç¨æ·ç»å½") |
| | | @Slf4j |
| | | public class LoginController { |
| | | @Autowired |
| | | private ISysUserService sysUserService; |
| | | @Autowired |
| | | private ISysPermissionService sysPermissionService; |
| | | @Autowired |
| | | private SysBaseApiImpl sysBaseApi; |
| | | @Autowired |
| | | private ISysLogService logService; |
| | | @Autowired |
| | | private RedisUtil redisUtil; |
| | | @Autowired |
| | | private ISysDepartService sysDepartService; |
| | | @Autowired |
| | | private ISysTenantService sysTenantService; |
| | | @Autowired |
| | | private ISysDictService sysDictService; |
| | | @Resource |
| | | private BaseCommonService baseCommonService; |
| | | |
| | | @Autowired |
| | | private JeecgBaseConfig jeecgBaseConfig; |
| | | |
| | | 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){ |
| | | // result.error500("éªè¯ç æ æ"); |
| | | // return result; |
| | | // } |
| | | // String lowerCaseCaptcha = captcha.toLowerCase(); |
| | | //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 ãæ¼æ´ãåç°æ°æ¼æ´å¾
å¤ç20220906 |
| | | // å å
¥å¯é¥ä½ä¸ºæ··æ·ï¼é¿å
ç®åçæ¼æ¥ï¼è¢«å¤é¨å©ç¨ï¼ç¨æ·èªå®ä¹è¯¥å¯é¥å³å¯ |
| | | String origin = 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); |
| | | //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); |
| | | 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) { |
| | | /*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()); |
| | | } |
| | | // 1å°æ¶ |
| | | redisUtil.set(key, ++val, 3600); |
| | | } |
| | | |
| | | } |