Ver código fonte

修改用户缓存

wangliang 4 anos atrás
pai
commit
132f85f645

+ 22 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/UserSaveParams.java

@@ -0,0 +1,22 @@
+package com.qmth.distributed.print.business.bean.params;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.entity.SysUser;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @Description: 用户保存/编辑params
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2021/3/24
+ */
+public class UserSaveParams extends SysUser implements Serializable {
+
+}

+ 25 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/SysUser.java

@@ -5,8 +5,16 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.distributed.print.business.base.BaseEntity;
+import com.qmth.distributed.print.business.service.SysConfigService;
+import com.qmth.distributed.print.common.contant.SpringContextHolder;
 import com.qmth.distributed.print.common.contant.SystemConstant;
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.validator.constraints.Length;
+import org.springframework.boot.SpringApplication;
+import sun.misc.BASE64Encoder;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 
 /**
@@ -32,11 +40,15 @@ public class SysUser extends BaseEntity implements Serializable {
      * 用户名
      */
     @TableField("login_name")
+    @NotBlank(message = "请输入登录名")
+    @Length(message = "登录名不能超过{max}个字符", max = 25)
     private String loginName;
     /**
      * 姓名
      */
     @TableField("real_name")
+    @NotBlank(message = "请输入姓名")
+    @Length(message = "姓名不能超过{max}个字符", max = 25)
     private String realName;
     /**
      * 密码
@@ -46,10 +58,13 @@ public class SysUser extends BaseEntity implements Serializable {
      * 手机号
      */
     @TableField("mobile_number")
+    @NotBlank(message = "请输入手机号码")
+    @Length(message = "手机号码不能超过{max}个字符", max = 25)
     private String mobileNumber;
 
     @JsonSerialize(using = ToStringSerializer.class)
     @TableField("org_id")
+    @NotNull(message = "请选择机构")
     private Long orgId;
     /**
      * 0-禁用,1-启用
@@ -70,6 +85,7 @@ public class SysUser extends BaseEntity implements Serializable {
 
     @JsonSerialize(using = ToStringSerializer.class)
     @TableField(exist = false)
+    @NotNull(message = "请选择角色")
     private Long[] roleIds;
 
     @JsonSerialize(using = ToStringSerializer.class)
@@ -82,6 +98,15 @@ public class SysUser extends BaseEntity implements Serializable {
         setUpdateId(userId);
         setCreateTime(System.currentTimeMillis());
         setUpdateTime(System.currentTimeMillis());
+        SysConfigService sysConfigService = SpringContextHolder.getBean(SysConfigService.class);
+        SysConfig sysConfig = sysConfigService.getByKey("sys.user.initPassword");
+        BASE64Encoder encoder = new BASE64Encoder();
+        setPassword(encoder.encode(StringUtils.isNoneBlank(sysConfig.getConfigValue()) ? sysConfig.getConfigValue().getBytes() : "123456".getBytes()));
+    }
+
+    public void setUpdateInfo(Long userId) {
+        setUpdateId(userId);
+        setUpdateTime(System.currentTimeMillis());
     }
 
     public Long getSchoolId() {

+ 55 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/FieldUniqueEnum.java

@@ -0,0 +1,55 @@
+package com.qmth.distributed.print.business.enums;
+
+import java.util.Objects;
+
+/**
+ * @Description: 唯一约束字段转换
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/7/13
+ */
+public enum FieldUniqueEnum {
+
+    user_schoolId_orgId_loginName_idx("登录名");
+
+    private String title;
+
+    private FieldUniqueEnum(String title) {
+        this.title = title;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param value
+     * @return
+     */
+    public static String convertToName(String value) {
+        for (FieldUniqueEnum e : FieldUniqueEnum.values()) {
+            if (Objects.equals(value.trim(), e.getTitle())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 状态转换 toTitle
+     *
+     * @param value
+     * @return
+     */
+    public static String convertToTitle(String value) {
+        for (FieldUniqueEnum e : FieldUniqueEnum.values()) {
+            if (value.trim().contains(e.name())) {
+                return e.getTitle();
+            }
+        }
+        return null;
+    }
+}

+ 2 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/SysUserService.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.distributed.print.business.bean.dto.BlurryUserDto;
 import com.qmth.distributed.print.business.bean.dto.LoginDto;
 import com.qmth.distributed.print.business.bean.dto.UserDto;
+import com.qmth.distributed.print.business.bean.params.UserSaveParams;
 import com.qmth.distributed.print.business.entity.SysUser;
 
 import java.util.List;
@@ -21,7 +22,7 @@ public interface SysUserService extends IService<SysUser> {
 
     IPage<UserDto> list(String realName, String roleId, Boolean enable, Integer pageNumber, Integer pageSize);
 
-    boolean saveUser(SysUser user);
+    boolean saveUser(UserSaveParams userSaveParams);
 
     boolean enable(SysUser user);
 

+ 157 - 73
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/SysUserServiceImpl.java

@@ -5,19 +5,24 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.gson.Gson;
+import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.bean.dto.BlurryUserDto;
 import com.qmth.distributed.print.business.bean.dto.LoginDto;
 import com.qmth.distributed.print.business.bean.dto.UserDto;
+import com.qmth.distributed.print.business.bean.params.UserSaveParams;
 import com.qmth.distributed.print.business.entity.*;
+import com.qmth.distributed.print.business.enums.FieldUniqueEnum;
 import com.qmth.distributed.print.business.enums.RoleTypeEnum;
 import com.qmth.distributed.print.business.mapper.SysUserMapper;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.util.ServletUtil;
-import com.qmth.distributed.print.business.util.security.Md5Utils;
 import com.qmth.distributed.print.common.contant.SystemConstant;
 import com.qmth.distributed.print.common.enums.ExceptionResultEnum;
+import com.qmth.distributed.print.common.util.ResultUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import sun.misc.BASE64Encoder;
@@ -55,15 +60,15 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Autowired
     private SysRolePrivilegeService sysRolePrivilegeService;
 
-    @Resource
-    SysUserMapper sysUserMapper;
-
     @Autowired
     CacheService cacheService;
 
     @Autowired
     private CommonService commonService;
 
+    @Resource
+    SysUserService sysUserService;
+
     @Override
     public IPage<UserDto> list(String realName, String roleId, Boolean enable, Integer pageNumber, Integer pageSize) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
@@ -87,78 +92,144 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
     @Transactional
     @Override
-    public boolean saveUser(SysUser user) {
-        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
-        user.setSchoolId(schoolId);
-        SysUser sysUser1 = (SysUser) ServletUtil.getRequestUser();
-
-        QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(SysUser::getLoginName, user.getLoginName());
-        SysUser sysUser = this.getOne(queryWrapper);
-        boolean isSuccess;
-        // 新增
-        if (Objects.isNull(user.getId())) {
-            if (sysUser != null) {
-                throw ExceptionResultEnum.ERROR.exception("用户名已存在");
+    public boolean saveUser(UserSaveParams userSaveParams) {
+//        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+//        user.setSchoolId(schoolId);
+//        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+//
+//        QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
+//        queryWrapper.lambda().eq(SysUser::getLoginName, user.getLoginName());
+//        SysUser sysUser = this.getOne(queryWrapper);
+//        boolean isSuccess;
+//        // 新增
+//        if (Objects.isNull(user.getId())) {
+//            if (sysUser != null) {
+//                throw ExceptionResultEnum.ERROR.exception("用户名已存在");
+//            }
+//            SysConfig sysConfig = sysConfigService.getByKey("sys.user.initPassword");
+//            BASE64Encoder encoder = new BASE64Encoder();
+//            user.setPassword(encoder.encode(StringUtils.isNoneBlank(sysConfig.getConfigValue()) ? sysConfig.getConfigValue().getBytes() : "123456".getBytes()));
+//            user.setId(SystemConstant.getDbUuid());
+//            user.setCreateId(sysUser1.getId());
+//            user.setCreateTime(System.currentTimeMillis());
+//            isSuccess = this.save(user);
+//        }
+//        // 修改
+//        else {
+//            if (sysUser != null && user.getId().longValue() != sysUser.getId().longValue()) {
+//                throw ExceptionResultEnum.ERROR.exception("用户名已存在");
+//            }
+//            sysUser.setRealName(user.getRealName());
+//            sysUser.setMobileNumber(user.getMobileNumber());
+//            sysUser.setOrgId(user.getOrgId());
+//            sysUser.setUpdateId(sysUser1.getId());
+//            sysUser.setUpdateTime(System.currentTimeMillis());
+//            isSuccess = this.updateById(sysUser);
+//
+//            //删除角色
+//            UpdateWrapper<SysUserRole> updateWrapper = new UpdateWrapper<>();
+//            updateWrapper.lambda().eq(SysUserRole::getUserId, sysUser.getId());
+//
+//            //删除课程
+//            basicUserCourseService.removeByUserId(sysUser.getId());
+//
+//            sysUserRoleService.remove(updateWrapper);
+//        }
+//
+//        //新增用户-角色
+//        for (Long roleId : user.getRoleIds()) {
+//            List<SysRolePrivilege> rolePrivileges = sysRolePrivilegeService.listByRoleId(roleId);
+//            for (SysRolePrivilege rolePrivilege : rolePrivileges) {
+//                SysUserRole userRole = new SysUserRole();
+//                userRole.setUserId(user.getId());
+//                userRole.setRoleId(roleId);
+//                userRole.setPrivilegeId(rolePrivilege.getPrivilegeId());
+//                sysUserRoleService.save(userRole);
+//            }
+////            cacheService.removeRolePrivilegeCache(roleId);
+//        }
+//
+//        // 角色里是否有考务老师角色
+//        List<SysRole> sysRoles = sysRoleService.list(user.getRoleIds(), RoleTypeEnum.QUESTION_TEACHER.name());
+//        if (sysRoles != null && sysRoles.size() > 0) {
+//            Long[] courseIds = user.getCourseIds();
+//            if (courseIds.length == 0) {
+//                throw ExceptionResultEnum.ERROR.exception("请选择课程");
+//            }
+//
+//            basicUserCourseService.saveBatch(user);
+//
+//        }
+//
+//        // 清除缓存
+////        cacheService.removeUserAuthCache(user.getId());
+        boolean isSuccess = true;
+        try {
+            Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+            SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
+            Gson gson = new Gson();
+            userSaveParams.setSchoolId(schoolId);
+            SysUser sysUser = gson.fromJson(gson.toJson(userSaveParams), SysUser.class);
+            if (Objects.isNull(sysUser.getId())) {//新增用户
+                sysUser.setInsertInfo(requestUser.getId());
+                sysUserService.save(sysUser);
+                for (Long roleId : userSaveParams.getRoleIds()) {
+                    commonService.addUserRolePrivilege(sysUser, roleId);
+                }
+            } else {//修改用户
+                List<SysUserRole> sysUserRoleList = cacheService.userRolePrivilegeCache(sysUser.getId());
+                List<Long> userRolesList = Arrays.asList(userSaveParams.getRoleIds());
+                List<Long> dbUserRolesList = sysUserRoleList.stream().map(SysUserRole::getRoleId).distinct().collect(Collectors.toList());
+                int count = (int) dbUserRolesList.stream().filter(s -> userRolesList.contains(s)).count();
+                SysUser dbUser = sysUserService.getById(sysUser.getId());
+                sysUser.setUpdateInfo(requestUser.getId());
+                sysUserService.updateById(sysUser);
+                if (count == 0 || dbUserRolesList.size() != userRolesList.size()) {
+                    QueryWrapper<SysUserRole> sysUserRoleQueryWrapper = new QueryWrapper<>();
+                    sysUserRoleQueryWrapper.lambda().eq(SysUserRole::getUserId, sysUser.getId());
+                    sysUserRoleService.remove(sysUserRoleQueryWrapper);
+
+                    cacheService.removeUserRolePrivilegeCache(sysUser.getId());
+                    for (Long roleId : userSaveParams.getRoleIds()) {
+                        commonService.addUserRolePrivilege(sysUser, roleId);
+                    }
+                }
+                //如果修改了角色,需要重新登录
+                if (count == 0 || dbUserRolesList.size() != userRolesList.size()) {
+                    commonService.removeUserInfo(sysUser.getId());
+                }
+                //如果修改了机构,需更新用户缓存
+                if (dbUser.getOrgId().longValue() != sysUser.getOrgId().longValue()) {
+                    cacheService.updateUserCache(sysUser.getId());
+                    cacheService.updateUserAuthCache(sysUser.getId());
+                }
             }
-            SysConfig sysConfig = sysConfigService.getByKey("sys.user.initPassword");
-            BASE64Encoder encoder = new BASE64Encoder();
-            user.setPassword(encoder.encode(StringUtils.isNoneBlank(sysConfig.getConfigValue()) ? sysConfig.getConfigValue().getBytes() : "123456".getBytes()));
-            user.setId(SystemConstant.getDbUuid());
-            user.setCreateId(sysUser1.getId());
-            user.setCreateTime(System.currentTimeMillis());
-            isSuccess = this.save(user);
-        }
-        // 修改
-        else {
-            if (sysUser != null && user.getId().longValue() != sysUser.getId().longValue()) {
-                throw ExceptionResultEnum.ERROR.exception("用户名已存在");
+            //用户科目全量删除全量增加
+            QueryWrapper<BasicUserCourse> basicUserCourseQueryWrapper = new QueryWrapper<>();
+            basicUserCourseQueryWrapper.lambda().eq(BasicUserCourse::getUserId, sysUser.getId());
+            basicUserCourseService.remove(basicUserCourseQueryWrapper);
+
+            List<SysRole> sysRoles = sysRoleService.list(sysUser.getRoleIds(), RoleTypeEnum.QUESTION_TEACHER.name());
+            if (sysRoles != null && sysRoles.size() > 0) {
+                Long[] courseIds = sysUser.getCourseIds();
+                if (courseIds.length == 0) {
+                    throw ExceptionResultEnum.ERROR.exception("请选择课程");
+                }
+                basicUserCourseService.saveBatch(sysUser);
             }
-            sysUser.setRealName(user.getRealName());
-            sysUser.setMobileNumber(user.getMobileNumber());
-            sysUser.setOrgId(user.getOrgId());
-            sysUser.setUpdateId(sysUser1.getId());
-            sysUser.setUpdateTime(System.currentTimeMillis());
-            isSuccess = this.updateById(sysUser);
-
-            //删除角色
-            UpdateWrapper<SysUserRole> updateWrapper = new UpdateWrapper<>();
-            updateWrapper.lambda().eq(SysUserRole::getUserId, sysUser.getId());
-
-            //删除课程
-            basicUserCourseService.removeByUserId(sysUser.getId());
-
-            sysUserRoleService.remove(updateWrapper);
-        }
-
-        //新增用户-角色
-        for (Long roleId : user.getRoleIds()) {
-            List<SysRolePrivilege> rolePrivileges = sysRolePrivilegeService.listByRoleId(roleId);
-            for (SysRolePrivilege rolePrivilege : rolePrivileges) {
-                SysUserRole userRole = new SysUserRole();
-                userRole.setUserId(user.getId());
-                userRole.setRoleId(roleId);
-                userRole.setPrivilegeId(rolePrivilege.getPrivilegeId());
-                sysUserRoleService.save(userRole);
+        } catch (Exception e) {
+            log.error("请求出错", e);
+            isSuccess = false;
+            if (e instanceof DuplicateKeyException) {
+                String errorColumn = e.getCause().toString();
+                String columnStr = errorColumn.substring(errorColumn.lastIndexOf("key") + 3, errorColumn.length()).replaceAll("'", "");
+                throw ExceptionResultEnum.SQL_ERROR.exception("[" + FieldUniqueEnum.convertToTitle(columnStr) + "]数据不允许重复插入");
+            } else if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
             }
-            cacheService.removeRolePrivilegeCache(roleId);
-        }
-
-        // 角色里是否有考务老师角色
-        List<SysRole> sysRoles = sysRoleService.list(user.getRoleIds(), RoleTypeEnum.QUESTION_TEACHER.name());
-        if (sysRoles != null && sysRoles.size() > 0) {
-            Long[] courseIds = user.getCourseIds();
-            if (courseIds.length == 0) {
-                throw ExceptionResultEnum.ERROR.exception("请选择课程");
-            }
-
-            basicUserCourseService.saveBatch(user);
-
         }
-
-        // 清除缓存
-        cacheService.removeUserAuthCache(user.getId());
-
         return isSuccess;
     }
 
@@ -309,7 +380,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         //新增用户-角色
         for (Long roleId : user.getRoleIds()) {
             SysRole sysRole = sysRoleService.getById(roleId);
-            if(!RoleTypeEnum.CUSTOMER.name().equals(sysRole.getType().name())){
+            if (!RoleTypeEnum.CUSTOMER.name().equals(sysRole.getType().name())) {
                 throw ExceptionResultEnum.ERROR.exception("只能添加客服角色的用户");
             }
             List<SysRolePrivilege> rolePrivileges = sysRolePrivilegeService.listByRoleId(roleId);
@@ -346,4 +417,17 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         }
         return userDtoIPage;
     }
+
+    public static void main(String[] args) {
+        Long[] longs = new Long[]{1L, 2L};
+        List<Long> longList = new ArrayList<>();
+        longList.add(4L);
+        longList.add(3L);
+        longList.add(5L);
+        longList.add(1L);
+        List<Long> longList1 = Arrays.asList(longs);
+        int count = (int) longList.stream().filter(s -> longList1.contains(s)).count();
+        System.out.println(count);
+//        Arrays.asList(longs);
+    }
 }

+ 10 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/SysUserController.java

@@ -6,17 +6,21 @@ import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.bean.dto.BlurryUserDto;
 import com.qmth.distributed.print.business.bean.dto.UserDto;
+import com.qmth.distributed.print.business.bean.params.UserSaveParams;
 import com.qmth.distributed.print.business.entity.SysUser;
 import com.qmth.distributed.print.business.service.SysUserService;
 import com.qmth.distributed.print.common.util.Result;
 import com.qmth.distributed.print.common.util.ResultUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
 import java.util.List;
 
 /**
@@ -97,13 +101,16 @@ public class SysUserController {
     /**
      * 新增/修改
      *
-     * @param user
+     * @param userSaveParams
      * @return
      */
     @ApiOperation(value = "新增/修改")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
-    public Result save(@RequestBody SysUser user) {
-        boolean isSuccess = sysUserService.saveUser(user);
+    public Result save(@ApiParam(value = "用户信息", required = true) @Valid @RequestBody UserSaveParams userSaveParams, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        boolean isSuccess = sysUserService.saveUser(userSaveParams);
         return ResultUtil.ok(isSuccess);
     }