From ca5445257b1fdeceddf3fcc2dea18c442023aeb7 Mon Sep 17 00:00:00 2001
From: kongzy <kongzy>
Date: 星期五, 08 十二月 2023 09:30:36 +0800
Subject: [PATCH] 新街口

---
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java |  188 +++++++++++++++++++++++++++++++++++++---------
 1 files changed, 150 insertions(+), 38 deletions(-)

diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java
index a1ca5d8..a552f44 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java
@@ -1,7 +1,7 @@
 package com.gkhy.assess.system.service.impl;
 
+import cn.hutool.core.codec.Base64;
 import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.gkhy.assess.common.api.CommonPage;
 import com.gkhy.assess.common.constant.CacheConstant;
@@ -9,19 +9,18 @@
 import com.gkhy.assess.common.domain.vo.LoginBody;
 import com.gkhy.assess.common.enums.AttachTypeEnum;
 import com.gkhy.assess.common.enums.UserIdentityEnum;
-import com.gkhy.assess.common.enums.UserTypeEnum;
 import com.gkhy.assess.common.exception.ApiException;
-import com.gkhy.assess.common.utils.BeanValidators;
-import com.gkhy.assess.common.utils.JwtTokenUtil;
-import com.gkhy.assess.common.utils.PageUtil;
-import com.gkhy.assess.common.utils.RedisUtils;
-import com.gkhy.assess.system.domain.*;
+import com.gkhy.assess.common.utils.*;
+import com.gkhy.assess.system.domain.SysAgency;
+import com.gkhy.assess.system.domain.SysAttach;
+import com.gkhy.assess.system.domain.SysUser;
 import com.gkhy.assess.system.mapper.SysAgencyMapper;
 import com.gkhy.assess.system.mapper.SysUserMapper;
+import com.gkhy.assess.system.service.SysAgencyService;
 import com.gkhy.assess.system.service.SysAttachService;
 import com.gkhy.assess.system.service.SysConfigService;
-import com.gkhy.assess.system.utils.ShiroUtils;
 import com.gkhy.assess.system.service.SysUserService;
+import com.gkhy.assess.system.utils.ShiroUtils;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authc.*;
 import org.apache.shiro.subject.Subject;
@@ -34,6 +33,7 @@
 import javax.validation.Validator;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 
 /**
@@ -57,7 +57,8 @@
     private HttpServletRequest request;
     @Autowired
     private SysAgencyMapper agencyMapper;
-
+    @Autowired
+    private SysAgencyService agencyService;
     @Autowired
     private SysAttachService attachService;
 
@@ -65,8 +66,8 @@
     @Override
     public AccountVO login(LoginBody loginBody) {
         // 验证码校验
-       // validateCaptcha(loginBody.getUsername(), loginBody.getCode(), loginBody.getUuid());
-        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginBody.getUsername(), loginBody.getPassword(), false);
+      //  validateCaptcha(loginBody.getUsername(), loginBody.getCode(), loginBody.getUuid());
+        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginBody.getUsername(), Base64.decodeStr(loginBody.getPassword()), false);
         Subject subject= SecurityUtils.getSubject();
         String msg ;
         try {
@@ -77,20 +78,39 @@
 
             String token = JwtTokenUtil.sign(sysUser.getUsername(),sysUser.getPassword());
             accountVO.setToken(token);
-            String key= redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(token));
-            // 设置超时时间
-            redisUtils.set(key,token);
-            redisUtils.expire(key,JwtTokenUtil.EXPIRATION*2/1000);
+            cacheUserToken(sysUser.getUsername(),token);
             return accountVO;
         }catch (UnknownAccountException | IncorrectCredentialsException uae){
             throw new ApiException("用户名/密码错误,请重新输入");
         } catch (LockedAccountException lae) { // 账号已被锁定
             msg = "账号已被锁定";
             throw new ApiException(msg);
-        } catch (AuthenticationException ae) { // 其他身份验证异常
-            msg = "用户认证失败";
+        }catch (AuthenticationException ae) { // 其他身份验证异常
+            msg = "用户认证失败:"+ae.getMessage();
             throw new ApiException(msg);
         }
+    }
+
+    /**
+     * 清空旧的登录信息,保证同时只有一个用户再登录,后登录用户会挤掉前一个用户
+     * @param username
+     */
+    public void cacheUserToken(String username,String newToken){
+
+//        String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username);
+//        String oldToken = (String) redisUtils.get(userKey);
+//        if (StrUtil.isNotBlank(oldToken)) {
+//            String oldTokenkey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + JwtTokenUtil.md5Encode(oldToken));
+//            redisUtils.del(oldTokenkey);
+//            redisUtils.del(userKey);
+//        }
+//        redisUtils.set(userKey, newToken,(JwtTokenUtil.EXPIRATION*2/1000)+2);
+
+
+        String tokenKey= redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(newToken));
+        // 设置超时时间
+        redisUtils.set(tokenKey,newToken);
+        redisUtils.expire(tokenKey,JwtTokenUtil.EXPIRATION*2/1000);
     }
 
     /**
@@ -103,13 +123,13 @@
      */
     public void validateCaptcha(String username, String code, String uuid)
     {
-            if(StrUtil.isBlank(code)||StrUtil.isBlank(uuid)){
+            if(StringUtils.isBlank(code)||StringUtils.isBlank(uuid)){
                 throw new ApiException("验证码或验证码标识为空");
             }
             String verifyKey = CacheConstant.CAPTCHA_CODE_KEY +uuid;
             String captcha = (String) redisUtils.get(verifyKey);
             redisUtils.del(verifyKey);
-            if (StrUtil.isBlank(captcha))
+            if (StringUtils.isBlank(captcha))
             {
                 throw new ApiException("验证码已失效");
             }
@@ -161,6 +181,11 @@
         return sysUser;
     }
 
+    public void delCacheByUsername(String username){
+        String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME+":"+username);
+        redisUtils.del(key);
+    }
+
     @Override
     public SysUser getUserByUsernamePhone(String username) {
         String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME+":"+username);
@@ -174,9 +199,14 @@
         return sysUser;
     }
 
+    public void validatorPassword(String password){
+        if(password.length()<5||password.length()>30){
+            throw new ApiException("密码长度须在5-30之间");
+        }
+    }
+
     @Override
-    @Transactional(rollbackFor = RuntimeException.class)
-    public int agencyRegister(SysUser user) {
+    public int addMonitor(SysUser user) {
         //校验用户信息
         if(!checkUsernameUnique(new SysUser().setUsername(user.getUsername()))){
             throw new ApiException("用户名已存在");
@@ -184,22 +214,46 @@
         if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()))){
             throw new ApiException("手机号已存在");
         }
+        String originPsword=Base64.decodeStr(user.getPassword());
+        validatorPassword(originPsword);
+        user.setPassword(JwtTokenUtil.encryptPassword(user.getUsername(),originPsword,user.getSalt()));
+        user.setIdentity(UserIdentityEnum.MONITOR.getCode());
+        boolean b=save(user);
+        if(!b){
+            throw new ApiException("创建监管用户信息失败");
+        }
+        return 1;
+    }
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int addAgency(SysUser user) {
+        //校验用户信息
+        if(!checkUsernameUnique(new SysUser().setUsername(user.getUsername()))){
+            throw new ApiException("用户名已存在");
+        }
+        if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()))){
+            throw new ApiException("手机号已存在");
+        }
+        String originPsword=Base64.decodeStr(user.getPassword());
+        validatorPassword(originPsword);
         SysAgency agency=user.getAgency();
         if(ObjectUtil.isNull(agency)){
             throw new ApiException("机构信息不能为空");
         }
+
         //查询机构信息是否存在
-        if(ObjectUtil.isNotNull(agencyMapper.checkAgencyNameUnique(agency.getName()))){
+        if(!agencyService.checkAgencyNameUnique(new SysAgency().setName(agency.getName()))){
             throw new ApiException("机构名称已存在");
         }
-
         int i=agencyMapper.insert(agency);
         if(i<1){
             throw new ApiException("保存机构信息失败");
         }
-
+        user.setIdentity(UserIdentityEnum.AGENCY.getCode());
         user.setAgencyId(agency.getId());
-        user.setUserType(UserIdentityEnum.AGENCY.getCode());
+        user.setPassword(JwtTokenUtil.encryptPassword(user.getUsername(),originPsword,user.getSalt()));
+
         boolean b=save(user);
         if(!b){
             throw new ApiException("创建机构用户信息失败");
@@ -217,8 +271,11 @@
         if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()))){
             throw new ApiException("手机号已存在");
         }
-        user.setUserType(UserIdentityEnum.EXPERT.getCode());
+        String originPsword=Base64.decodeStr(user.getPassword());
+        validatorPassword(originPsword);
+        user.setIdentity(UserIdentityEnum.EXPERT.getCode());
         user.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        user.setPassword(JwtTokenUtil.encryptPassword(user.getUsername(),originPsword,user.getSalt()));
         boolean b=save(user);
         if(!b){
             throw new ApiException("创建专家信息失败");
@@ -258,14 +315,47 @@
     }
 
     @Override
+    public SysUser getUserInfoById(Long userId) {
+        return baseMapper.getUserInfoById(userId);
+    }
+
+    @Override
     @Transactional(rollbackFor = RuntimeException.class)
     public int deleteUserById(Long userId) {
         SysUser user=getUserById(userId);
+        if(user==null){
+            throw new ApiException("用户不存在");
+        }
+        if(Objects.equals(ShiroUtils.getUserId(), userId)){
+            throw new ApiException("不能删除自己账号");
+        }
         //机构用户,将机构信息设置成删除状态
-        if(user.getUserType().equals(UserIdentityEnum.AGENCY.getCode())){
+        if(user.getIdentity().equals(UserIdentityEnum.AGENCY.getCode())){
+            if(user.getAgencyId()==null){
+                throw new ApiException("获取机构id为空");
+            }
             agencyMapper.deleteAgencyById(user.getAgencyId());
         }
+        delCacheByUsername(user.getUsername());
         return baseMapper.deleteUserById(userId);
+    }
+
+    @Override
+    public int editMonitor(SysUser user) {
+        //校验用户信息
+        if(!checkUsernameUnique(user)){
+            throw new ApiException("用户名已存在");
+        }
+        if(!checkPhoneUnique(user)){
+            throw new ApiException("手机号已存在");
+        }
+        delCacheByUsername(user.getUsername());
+        user.setPassword(null);
+        boolean b=updateById(user);
+        if(!b){
+            throw new ApiException("更新监管用户信息失败");
+        }
+        return 1;
     }
 
 
@@ -280,14 +370,18 @@
             throw new ApiException("手机号已存在");
         }
         SysAgency agency=user.getAgency();
-        if(ObjectUtil.isNull(agency)){
-            throw new ApiException("机构信息不能为空");
+        if(ObjectUtil.isNull(agency)||agency.getId()==null){
+            throw new ApiException("机构信息或者id不能为空");
         }
+
         //查询机构信息是否存在
-        if(ObjectUtil.isNotNull(agency)){
+        if(!agencyService.checkAgencyNameUnique(agency)){
             throw new ApiException("机构名称已存在");
         }
-        agencyMapper.updateById(agency);
+
+        delCacheByUsername(user.getUsername());
+        agencyService.updateById(agency);
+        user.setPassword(null);
         boolean b=updateById(user);
         if(!b){
             throw new ApiException("更新用户失败");
@@ -304,6 +398,7 @@
         if(!checkPhoneUnique(user)){
             throw new ApiException("手机号已存在");
         }
+        user.setPassword(null);
         boolean b=updateById(user);
         if(!b){
             throw new ApiException("更新专家信息失败");
@@ -331,14 +426,21 @@
             attaches.add(attach);
         }
         attachService.saveBatch(attaches);
-
+        delCacheByUsername(user.getUsername());
         return 1;
     }
 
 
     @Override
     public boolean resetUserPwd(SysUser user) {
-        return updateById(user);
+        String originPsword=Base64.decodeStr(user.getPassword());
+        validatorPassword(originPsword);
+        checkUserAllowed(user);
+        SysUser oldUser=checkUserDataScope(user.getId());
+        SysUser newUser=new SysUser().setId(user.getId()).setPassword(JwtTokenUtil.encryptPassword(oldUser.getUsername(),originPsword,oldUser.getSalt()));
+        newUser.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        delCacheByUsername(oldUser.getUsername());
+        return updateById(newUser);
     }
 
     @Override
@@ -380,12 +482,16 @@
     }
 
     @Override
-    public void checkUserDataScope(Long userId) {
+    public SysUser checkUserDataScope(Long userId) {
+        if(userId==null){
+            throw new ApiException("用户id为空!");
+        }
         SysUser user = baseMapper.getUserById(userId);
         if (ObjectUtil.isNull(user))
         {
             throw new ApiException("用户数据不存在!");
         }
+        return user;
     }
 
     @Override
@@ -441,14 +547,20 @@
     @Override
     public boolean changeUserStatus(SysUser user) {
         checkUserAllowed(user);
-        checkUserDataScope(user.getId());
-        return updateById(user);
+        SysUser existUser=checkUserDataScope(user.getId());
+        SysUser su=new SysUser().setId(user.getId()).setStatus(user.getStatus());
+        su.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        delCacheByUsername(existUser.getUsername());
+        return updateById(su);
     }
 
     @Override
     public boolean changeApprove(SysUser user) {
         checkUserAllowed(user);
-        checkUserDataScope(user.getId());
-        return updateById(user);
+        SysUser existUser=checkUserDataScope(user.getId());
+        SysUser su=new SysUser().setId(user.getId()).setState(user.getState());
+        su.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        delCacheByUsername(existUser.getUsername());
+        return updateById(su);
     }
 }

--
Gitblit v1.9.2