实习周记(八):权限管理接口开发

简述

相较于其他复杂的业务,权限管理较为简单,多为单表的crud,适合新人开发,此处使用一个相近的demo进行展示

开发

  1. 明确开发需求

    • 职场生活中,每位员工都有自己相应的文档权限,一级仅能查看,二级可以查看编辑,三级可以创建编辑文档,
    • 每位员工还有自己的职场状态,是本地办公或者外出出差
    • 高权限的员工可以赋予其他人低于自身的权限
  2. 创建数据库表

    • 员工个人信息通过员工id进行关联
    • 每个员工的权限应该有修改创建人信息
    • 实际开发中大多采用软删除,即通过delete_flag字段判断该数据是否展示
    • 版本号一般用于留存数据和避免并发操作(工作项目中存在并发问题)
CREATE TABLE `staff` (
  `id` bigint unsigned NOT NULL DEFAULT '0' COMMENT 'ID',
  `staff_id` bigint unsigned NOT NULL COMMENT '员工ID',
  `permission` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '权限(1-一级权限,2-二级权限,3-三级权限)',
  `status` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '员工状态(1-本地办公,2-外地出差)',
  `create_by` bigint NOT NULL COMMENT '创建者ID',
  `create_by_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建者的用户姓名',
  `create_time` bigint NOT NULL DEFAULT '0' COMMENT '创建时间',
  `update_by` bigint DEFAULT NULL COMMENT '最后修改者ID',
  `update_by_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改者的用户姓名',
  `update_time` bigint unsigned DEFAULT NULL COMMENT '最后修改时间',
  `remark` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
  `delete_flag` tinyint NOT NULL DEFAULT '0' COMMENT '删除标识(0-正常,1-删除)',
  `version` int NOT NULL DEFAULT '0' COMMENT '版本号',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='员工权限表';
  1. 开发

    项目开发采用ddd的架构,具体可看上一篇周记,此处仅以笔者本身写的其中一个接口代码为参考,其他大佬搭的项目相关基础忽略,注释忽略,其他相关接口会根据对应的工作问题给出(相对于我而言的问题)

    • web层
    @RestController
    @RequestMapping("/workMember")
    public class WorkMemberController extends BaseWorkController {
        @Resource
        private IWorkMemberService workMemberService;
         /**
         * 文档权限管理
         */
        @PostMapping("/changePermission")
        public Result<Boolean> changePermission(@RequestBody ClientCommonParam<WorkMemberManageDTO> param) {
            return Result.success(workMemberService.changePermission(param.getData()));
    }		
    
    • 业务层
    public interface IWorkMemberService {
         /**
         * 文档权限管理
         */
        Boolean changePermission(WorkMemberManageDTO dto);
    }
    
    @Service
    public class WorkMemberServiceImpl implements IWorkMemberService {
        @Resource
        private IWorkMemberRepository workMemberRepository;
        
            @Override
        public Boolean changePermission(WorkMemberManageDTO dto) {
            List<Integer> actionList = Arrays.asList(PermissionEnum.MEMBER.getCode(), PermissionEnum.MANAGER.getCode());
            if (!actionList.contains(dto.getAction())) {
                throw new WorkRuntimeException(WorkExceptionEnum.Work_MEMBER_PERMISSION_ILLEGAL);
            }
            WorkMember workMember = new WorkMember();
            WorkMember.setId(dto.getId())
                    .setPermission(dto.getAction())
                    .setUpdateBy(dto.getUin())
                    .setUpdateByName(dto.getNickname())
                    .setUpdateTime(DateUtil.currentTimeSeconds());
            Boolean result = WorkMemberRepository.changeManager(WorkMember);
            return result;
        }
    }
    
    • 服务类
    public interface IWorkMemberRepository {
         /**
         * 文档权限管理
         */
        Boolean changePermission(CircleMember circleMember);
    }
    
    @Service
    public class WorkMemberRepositoryImpl extends ServiceImpl<WorkMemberMapper, WorkMemberDO> implements IWorkMemberRepository {
        @Resource
        private WorkMemberPerConvert memberPerConvert;
        
        @Override
        public Boolean changePermission(WorkMember workMember) {
            WorkMemberDO workMemberDO = new WorkMemberDO();
            workMemberDO.setId(workMember.getId())
                    .setCircleId(workMember.getStaffId())
                    .setPermission(workMember.getPermission())
                    .setUpdateBy(workMember.getUin())
                    .setUpdateByName(workMember.getNickname())
                    .setUpdateTime(workMember.getUpdateTime());
            return baseMapper.changePermission(workMemberDO) > 0;
        }
    }
    
    • 持久化
    public interface WorkMemberMapper extends BaseMapper<WorkMemberDO> {
        Integer changePermission(@Param("workMemberDO") WorkMemberDO circleMemberDO);
    }
    
        <update id="changePermission">
            UPDATE
            staff s,
            SET
            s.permission = #{workMemberDO.permission},
            s.update_by=#{workMemberDO.updateBy},
            s.update_by_name=#{workMemberDO.updateByName},
            s.update_time=#{workMemberDO.updateTime}
            WHERE s.id = #{workMemberDO.id} 
        </update>
    
    • 涉及的实体类
    @Data
    public class CircleMemberManageDTO {
    
        /**
         * id
         */
        private Long id;
    
        /**
         * 员工
         */
        private Long staffId;
    
        /**
         * 1-1级  2-2级  3-3级
         */
        private Integer action;
    
        /**
         * 用户ID
         */
        private Long uin;
    
        /**
         * 当前用户的权限
         */
        private Integer permission;
    
        /**
         * 用户昵称
         */
        private String nickname;
    }
    
    
    @Data
    @Accessors(chain = true)
    @EqualsAndHashCode(callSuper = false)
    public class WorkMember implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        /**
         * ID
         */
        private Long id;
    
        /**
         * 员工ID
         */
        private Long staffId;
    
    
        /**
         * 用户ID
         */
        private Long uin;
    
        /**
         * 用户昵称
         */
        private String nickname;
    
        /**
         * 权限(1-1级,2-2级,3-3级)
         */
        private Integer permission;
    
       
        /**
         * 员工状态(1-本地办公, 2-外地出差)
         */
        private Integer status;
    
        /**
         * 创建者ID
         */
        private Long createBy;
    
        /**
         * 创建者的用户姓名
         */
        private String createByName;
    
        /**
         * 创建时间
         */
        private Long createTime;
    
        /**
         * 最后修改者ID
         */
        private Long updateBy;
    
        /**
         * 修改者的用户姓名
         */
        private String updateByName;
    
        /**
         * 最后修改时间
         */
        private Long updateTime;
    
        /**
         * 删除标识(0-正常,1-删除)
         */
        private Integer deleteFlag;
    
        /**
         * 版本号
         */
        private Integer version;
    
    
    }
    
    
    @Data
    @Accessors(chain = true)
    @EqualsAndHashCode(callSuper = false)
    @TableName("staff")
    public class WorkMemberDO implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        /**
         * ID
         */
        private Long id;
    
        /**
         * 员工ID
         */
        private Long staffId;
    
    
        /**
         * 用户ID
         */
        private Long uin;
    
        /**
         * 用户昵称
         */
        private String nickname;
    
        /**
         * 权限(1-1级,2-2级,3-3级)
         */
        private Integer permission;
    
       
        /**
         * 员工状态(1-本地办公, 2-外地出差)
         */
        private Integer status;
    
        /**
         * 创建者ID
         */
        private Long createBy;
    
        /**
         * 创建者的用户姓名
         */
        private String createByName;
    
        /**
         * 创建时间
         */
        private Long createTime;
    
        /**
         * 最后修改者ID
         */
        private Long updateBy;
    
        /**
         * 修改者的用户姓名
         */
        private String updateByName;
    
        /**
         * 最后修改时间
         */
        private Long updateTime;
    
        /**
         * 删除标识(0-正常,1-删除)
         */
        private Integer deleteFlag;
    
        /**
         * 版本号
         */
        private Integer version;
    }
    

总结

这一周的工作内容仅仅只是完成接口的初步开发,能实现权限的修改,但并没有完善缓存日志校验

posted @ 2021-11-16 11:39  2月2日  阅读(83)  评论(0)    收藏  举报