Explorar el Código

feat:用户角色绑定接口完成

wangzaijun hace 7 meses
padre
commit
760321a974

+ 4 - 0
service-base/pom.xml

@@ -26,6 +26,10 @@
                 </exclusion>
             </exclusions>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>com.dameng</groupId>

+ 2 - 0
service-base/src/main/java/com/simuwang/base/common/support/command/BaseIdStatusCmd.java

@@ -1,5 +1,6 @@
 package com.simuwang.base.common.support.command;
 
+import jakarta.validation.constraints.NotNull;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -14,6 +15,7 @@ public abstract class BaseIdStatusCmd extends BaseCmd {
     /**
      * 状态,0-启用,1-禁用
      */
+    @NotNull(message = "状态不能为空")
     private Integer status;
 
     public abstract Integer getId();

+ 17 - 0
service-base/src/main/java/com/simuwang/base/mapper/SysUserMapper.java

@@ -57,4 +57,21 @@ public interface SysUserMapper extends BaseMapper<SysUserDO> {
      * @return /
      */
     long countRoleUser(RoleUserPageQuery query);
+
+    /**
+     * 删除某个用户的所有角色关系(用物理删)
+     *
+     * @param userId 用户id
+     * @return /
+     */
+    int delUserRoleByUserId(Integer userId);
+
+    /**
+     * 批量新增用户与角色的关系
+     *
+     * @param userId  用户id
+     * @param roleIds 角色id
+     * @return /
+     */
+    int batchUserRoles(Integer userId, List<Integer> roleIds);
 }

+ 2 - 0
service-base/src/main/java/com/simuwang/base/pojo/dto/DeleteByIdCmd.java

@@ -1,6 +1,7 @@
 package com.simuwang.base.pojo.dto;
 
 import com.simuwang.base.common.support.command.BaseIdCmd;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author wangzaijun
@@ -8,6 +9,7 @@ import com.simuwang.base.common.support.command.BaseIdCmd;
  * @description 根据id删除对象的请求参数
  */
 public class DeleteByIdCmd extends BaseIdCmd {
+    @NotNull(message = "id不能为空")
     private Integer id;
 
     @Override

+ 2 - 0
service-base/src/main/java/com/simuwang/base/pojo/dto/UpdateStatusCmd.java

@@ -1,6 +1,7 @@
 package com.simuwang.base.pojo.dto;
 
 import com.simuwang.base.common.support.command.BaseIdStatusCmd;
+import jakarta.validation.constraints.NotNull;
 
 /**
  * @author wangzaijun
@@ -8,6 +9,7 @@ import com.simuwang.base.common.support.command.BaseIdStatusCmd;
  * @description 更新状态的请求参数
  */
 public class UpdateStatusCmd extends BaseIdStatusCmd {
+    @NotNull(message = "id不能为空")
     private Integer id;
 
     @Override

+ 4 - 0
service-base/src/main/java/com/simuwang/base/pojo/dto/sys/UserAddCmd.java

@@ -2,6 +2,8 @@ package com.simuwang.base.pojo.dto.sys;
 
 import com.simuwang.base.common.support.command.BaseAddCmd;
 import com.simuwang.base.pojo.dos.sys.SysUserDO;
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotBlank;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -16,10 +18,12 @@ public class UserAddCmd extends BaseAddCmd<SysUserDO> {
     /**
      * 用户名称
      */
+    @NotBlank(message = "用户名不能为空")
     private String userName;
     /**
      * 用户邮箱
      */
+    @Email
     private String email;
     /**
      * 手机号码

+ 2 - 0
service-base/src/main/java/com/simuwang/base/pojo/dto/sys/UserEditCmd.java

@@ -2,6 +2,7 @@ package com.simuwang.base.pojo.dto.sys;
 
 import com.simuwang.base.common.support.command.BaseEditCmd;
 import com.simuwang.base.pojo.dos.sys.SysUserDO;
+import jakarta.validation.constraints.NotNull;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -13,6 +14,7 @@ import lombok.Setter;
 @Setter
 @Getter
 public class UserEditCmd extends BaseEditCmd<SysUserDO> {
+    @NotNull(message = "用户id不能为空")
     private Integer userId;
     /**
      * 用户名称

+ 30 - 0
service-base/src/main/java/com/simuwang/base/pojo/dto/sys/UserRoleBindCmd.java

@@ -0,0 +1,30 @@
+package com.simuwang.base.pojo.dto.sys;
+
+import com.simuwang.base.common.support.command.BaseCmd;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @author wangzaijun
+ * @date 2024/9/13 19:00
+ * @description 用户角色绑定接口请求参数
+ */
+@Setter
+@Getter
+public class UserRoleBindCmd extends BaseCmd {
+    /**
+     * 用户id
+     */
+    @NotNull(message = "用户id不能为空")
+    private Integer userId;
+    /**
+     * 绑定的角色
+     */
+    @NotNull(message = "绑定的角色不能为空")
+    @Size(message = "绑定的角色不能为空", min = 1)
+    private List<Integer> roleIds;
+}

+ 11 - 0
service-base/src/main/resources/mapper/SysUserMapper.xml

@@ -166,4 +166,15 @@
             and t.createtime between #{beginTime} and #{endTime}
         </if>
     </select>
+
+    <delete id="delUserRoleByUserId" parameterType="int">
+        delete from sys_user_role where user_id =#{userId}
+    </delete>
+
+    <insert id="batchUserRoles">
+        insert into sys_user_role(user_id, role_id) values
+        <foreach collection="roleIds" item="roleId" separator=",">
+            (#{userId}, #{roleId})
+        </foreach>
+    </insert>
 </mapper>

+ 2 - 0
service-deploy/src/main/java/com/simuwang/Application.java

@@ -2,7 +2,9 @@ package com.simuwang;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
 
+@EnableTransactionManagement
 @SpringBootApplication
 public class Application {
 

+ 12 - 1
service-deploy/src/main/java/com/simuwang/deploy/components/ErrorInfoBuilder.java

@@ -8,6 +8,7 @@ import com.smppw.common.pojo.enums.status.ResultCode;
 import jakarta.servlet.ServletException;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.ConstraintViolationException;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.authc.AuthenticationException;
 import org.apache.shiro.authc.IncorrectCredentialsException;
@@ -22,12 +23,15 @@ import org.springframework.http.HttpStatus;
 import org.springframework.http.converter.HttpMessageNotReadableException;
 import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
+import org.springframework.validation.BindException;
+import org.springframework.validation.ObjectError;
 import org.springframework.web.servlet.HandlerExceptionResolver;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.resource.NoResourceFoundException;
 import org.springframework.web.util.WebUtils;
 
 import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * @author wangzaijun
@@ -83,8 +87,15 @@ public class ErrorInfoBuilder implements HandlerExceptionResolver, Ordered {
             msg = e.getMessage();
         } else if (error instanceof HttpMessageNotReadableException || error instanceof BindValidationException) {
             msg = "请求参数错误";
+        } else if (error instanceof BindException e) {
+            // 参数绑定或校验错误
+            List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
+            msg = allErrors.get(0).getDefaultMessage();
+        } else if (error instanceof ConstraintViolationException e) {
+            // 约束验证错误
+            msg = e.getMessage();
         } else {
-            msg = error.getMessage();
+            msg = "未知的错误";
         }
         errorInfo.setError(msg);
         errorInfo.setStatusCode(getHttpStatus(request).value());

+ 17 - 8
service-manage/src/main/java/com/simuwang/manage/api/system/SysUserController.java

@@ -3,13 +3,11 @@ package com.simuwang.manage.api.system;
 import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.pojo.dto.DeleteByIdCmd;
 import com.simuwang.base.pojo.dto.UpdateStatusCmd;
-import com.simuwang.base.pojo.dto.sys.RoleUserPageQuery;
-import com.simuwang.base.pojo.dto.sys.UserAddCmd;
-import com.simuwang.base.pojo.dto.sys.UserEditCmd;
-import com.simuwang.base.pojo.dto.sys.UserPageQuery;
+import com.simuwang.base.pojo.dto.sys.*;
 import com.simuwang.base.pojo.vo.sys.SysRoleUserVO;
 import com.simuwang.base.pojo.vo.sys.SysUserVO;
 import com.simuwang.manage.service.system.SysUserService;
+import jakarta.validation.Valid;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -54,7 +52,7 @@ public class SysUserController {
      * @param command 用户信息
      */
     @PostMapping("save")
-    public boolean save(@RequestBody UserAddCmd command) {
+    public boolean save(@Valid @RequestBody UserAddCmd command) {
         this.service.insert(command);
         return true;
     }
@@ -65,7 +63,7 @@ public class SysUserController {
      * @param command 用户id+用户信息
      */
     @PostMapping("update")
-    public boolean update(@RequestBody UserEditCmd command) {
+    public boolean update(@Valid @RequestBody UserEditCmd command) {
         this.service.update(command);
         return true;
     }
@@ -76,7 +74,7 @@ public class SysUserController {
      * @param command 用户id+状态对象
      */
     @PostMapping("update-status")
-    public boolean updateStatus(@RequestBody UpdateStatusCmd command) {
+    public boolean updateStatus(@Valid @RequestBody UpdateStatusCmd command) {
         this.service.updateStatus(command);
         return true;
     }
@@ -87,8 +85,19 @@ public class SysUserController {
      * @param command 用户id对象
      */
     @PostMapping("del")
-    public boolean deleteById(@RequestBody DeleteByIdCmd command) {
+    public boolean deleteById(@Valid @RequestBody DeleteByIdCmd command) {
         this.service.delete(command);
         return true;
     }
+
+    /**
+     * 用户角色绑定
+     *
+     * @param command 用户绑定的角色对象
+     */
+    @PostMapping("bind-roles")
+    public boolean bindRoles(@Valid @RequestBody UserRoleBindCmd command) {
+        this.service.bindRoles(command);
+        return true;
+    }
 }

+ 17 - 4
service-manage/src/main/java/com/simuwang/manage/service/impl/system/SysUserServiceImpl.java

@@ -17,20 +17,22 @@ import com.simuwang.base.config.DaqProperties;
 import com.simuwang.base.mapper.SysUserMapper;
 import com.simuwang.base.pojo.dos.sys.SysRoleUserDO;
 import com.simuwang.base.pojo.dos.sys.SysUserDO;
-import com.simuwang.base.pojo.dto.sys.RoleUserPageQuery;
-import com.simuwang.base.pojo.dto.sys.UserAddCmd;
-import com.simuwang.base.pojo.dto.sys.UserEditCmd;
-import com.simuwang.base.pojo.dto.sys.UserPageQuery;
+import com.simuwang.base.pojo.dto.sys.*;
 import com.simuwang.base.pojo.vo.sys.SysRoleUserVO;
 import com.simuwang.base.pojo.vo.sys.SysUserVO;
 import com.simuwang.manage.service.system.SysUserService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.stream.Collectors;
 
 @Service
 public class SysUserServiceImpl implements SysUserService {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
     private final SysUserMapper mapper;
     private final DaqProperties properties;
 
@@ -116,4 +118,15 @@ public class SysUserServiceImpl implements SysUserService {
         Integer id = command.getId();
         this.mapper.deleteById(id);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void bindRoles(UserRoleBindCmd command) {
+        Integer userId = command.getUserId();
+        int i = this.mapper.delUserRoleByUserId(userId);
+        int j = this.mapper.batchUserRoles(userId, command.getRoleIds());
+        if (this.logger.isInfoEnabled()) {
+            this.logger.info("绑定用户{} 角色时删除了{}条记录,新增{}条记录", userId, i, j);
+        }
+    }
 }

+ 7 - 1
service-manage/src/main/java/com/simuwang/manage/service/system/SysUserService.java

@@ -3,8 +3,9 @@ package com.simuwang.manage.service.system;
 import com.simuwang.base.common.support.BaseMultiJoinService;
 import com.simuwang.base.common.support.BaseService;
 import com.simuwang.base.pojo.dos.sys.SysUserDO;
-import com.simuwang.base.pojo.vo.sys.SysUserVO;
+import com.simuwang.base.pojo.dto.sys.UserRoleBindCmd;
 import com.simuwang.base.pojo.vo.sys.SysRoleUserVO;
+import com.simuwang.base.pojo.vo.sys.SysUserVO;
 
 /**
  * @author wangzaijun
@@ -12,4 +13,9 @@ import com.simuwang.base.pojo.vo.sys.SysRoleUserVO;
  * @description 用户服务
  */
 public interface SysUserService extends BaseService<SysUserVO, SysUserDO>, BaseMultiJoinService<SysRoleUserVO> {
+    /**
+     * 用户角色绑定接口
+     * @param command 请求参数
+     */
+    void bindRoles(UserRoleBindCmd command);
 }