实习周记(八):权限管理接口开发
简述
相较于其他复杂的业务,权限管理较为简单,多为单表的crud,适合新人开发,此处使用一个相近的demo进行展示
开发
-
明确开发需求
- 职场生活中,每位员工都有自己相应的文档权限,一级仅能查看,二级可以查看编辑,三级可以创建编辑文档,
- 每位员工还有自己的职场状态,是本地办公或者外出出差
- 高权限的员工可以赋予其他人低于自身的权限
-
创建数据库表
- 员工个人信息通过员工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='员工权限表';
-
开发
项目开发采用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; }
总结
这一周的工作内容仅仅只是完成接口的初步开发,能实现权限的修改,但并没有完善缓存日志校验