From c2fccb01b972176dc3da5a497b5e904025e9e98d Mon Sep 17 00:00:00 2001
From: bsw215583320 <baoshiwei121@163.com>
Date: 星期二, 16 四月 2024 15:06:51 +0800
Subject: [PATCH] Merge branch 'master' of http://210.22.126.130:1111/r/dry/herb

---
 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java |  734 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 734 insertions(+), 0 deletions(-)

diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java
new file mode 100644
index 0000000..80fbe0e
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java
@@ -0,0 +1,734 @@
+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();//瀵嗙爜瑙e瘑
+		//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("楠岃瘉鐮侀敊璇�");
+//			// 鏀规垚鐗规畩鐨刢ode 渚夸簬鍓嶇鍒ゆ柇
+//			result.setCode(HttpStatus.PRECONDITION_FAILED.value());
+//			return result;
+//		}
+		//update-end-author:taoyan date:20190828 for:鏍¢獙楠岃瘉鐮�
+		
+		//1. 鏍¢獙鐢ㄦ埛鏄惁鏈夋晥
+		//update-begin-author:wangshuai date:20200601 for: 鐧诲綍浠g爜楠岃瘉鐢ㄦ埛鏄惁娉ㄩ攢bug锛宨f鏉′欢姘歌繙涓篺alse
+		LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(SysUser::getUsername,username);
+		SysUser sysUser = sysUserService.getOne(queryWrapper);
+		//update-end-author:wangshuai date:20200601 for: 鐧诲綍浠g爜楠岃瘉鐢ㄦ埛鏄惁娉ㄩ攢bug锛宨f鏉′欢姘歌繙涓篺alse
+		result = sysUserService.checkUserIsEffective(sysUser);
+		if(!result.isSuccess()) {
+			return result;
+		}
+
+		//2. 鏍¢獙鐢ㄦ埛鍚嶆垨瀵嗙爜鏄惁姝g‘
+		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;
+	}
+
+
+	/**
+	 * 銆恦ue3涓撶敤銆戣幏鍙栫敤鎴蜂俊鎭�
+	 */
+	@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锛歷ue3鍓嶇锛屾敮鎸佽嚜瀹氫箟棣栭〉-----------
+			String version = request.getHeader(CommonConstant.VERSION);
+			//update-begin---author:liusq ---date:2022-06-29  for锛氭帴鍙h繑鍥炲�间慨鏀癸紝鍚屾淇敼杩欓噷鐨勫垽鏂�昏緫-----------
+			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锛氭帴鍙h繑鍥炲�间慨鏀癸紝鍚屾淇敼杩欓噷鐨勫垽鏂�昏緫-----------
+			//update-end---author:scott ---date::2022-06-20  for锛歷ue3鍓嶇锛屾敮鎸佽嚜瀹氫箟棣栭〉--------------
+			
+			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鐨刲ogout
+			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锛歩ssues#391
+			//result.setResult(captcha);
+			//update-end--Author:scott  Date:20190812 for锛歩ssues#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 = {}锛宑heckCode = {}", realKey, code);
+			//杩斿洖鍓嶇
+			String base64 = RandImageUtil.generate(code);
+			res.setSuccess(true);
+			res.setResult(base64);
+		} catch (Exception e) {
+			log.error(e.getMessage(), e);
+			res.error500("鑾峰彇楠岃瘉鐮佸け璐�,璇锋鏌edis閰嶇疆!");
+			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. 鏍¢獙鐢ㄦ埛鍚嶆垨瀵嗙爜鏄惁姝g‘
+		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銆恆pp銆戞柊寤虹敤鎴凤紝娌℃湁璁剧疆閮ㄩ棬鍙婅鑹诧紝鐐瑰嚮鐧诲綍鎻愮ず鏆傛湭褰掑睘閮紝涓�鐩村湪鐧诲綍椤甸潰 浣跨敤鎵嬫満鍙风櫥褰� 鍙甯�
+			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銆恆pp銆戞柊寤虹敤鎴凤紝娌℃湁璁剧疆閮ㄩ棬鍙婅鑹诧紝鐐瑰嚮鐧诲綍鎻愮ず鏆傛湭褰掑睘閮紝涓�鐩村湪鐧诲綍椤甸潰 浣跨敤鎵嬫満鍙风櫥褰� 鍙甯�
+		}
+
+		//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);
+	}
+
+}
\ No newline at end of file

--
Gitblit v1.9.3