开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情
用户管理(一):业务澄清,数据库设计
以前写过一次用户管理的项目,但那次时间催的紧又是第一次写用户权限管理,很多东西都没设计好。自我感觉一塌糊涂,所以想重新写一下,顺便记录一下。
业务澄清
- 登录:创建token,生成会话并返回。
- 登出:注销会话。
- 用户管理:用户的增删改查,锁定解锁,批量导入导出,分配角色。
- 角色管理:角色的增删改查以及给角色分配权限。
- 菜单权限管理:菜单的增删改查,导入。
一个比较简单的用户管理,不加入部门之类的考虑,就大概是这些需求了。
数据库设计
根据上面的业务需求来看,我们需要的表已经很清晰了。
用户表,角色表,菜单权限表。主要是这三个表,但有一点需要注意的是,这三张表之间的关系都是多对多。所以我们还需要两张中间表:用户-角色关系表,角色-菜单关系表。
表结构设计如下:
- 用户表
| 字段名 | 字段类型 | 约束 | 备注 |
|---|
| user_id | bigint(20) | not null, auto_increment | 用户ID |
| user_name | varchar(30) | not nul | 用户账号 |
| nick_name | varchar(30) | not null | 用户昵称 |
| email | varchar(50) | default '' | 用户邮箱 |
| phone_number | varchar(11) | default '' | 手机号码 |
| sex | char(1) | default '0' | 用户性别(0男 1女 2未知) |
| avatar | longblob | null | 头像 |
| password | varchar(100) | default '' | 密码 |
| salt | varchar(256) | default '' | 盐值 |
| status | char(1) | default '0' | 帐号状态(0正常 1停用) |
| del_flag | char(1) | default '0' | 删除标志(0代表存在 1代表删除) |
| login_ip | varchar(128) | default '' | 最后登录IP |
| login_date | datetime | null | 最后登录时间 |
| create_by | varchar(64) | default '' | 创建者 |
| create_time | datetime | | 创建时间 |
| update_by | varchar(64) | default '' | 更新者 |
| update_time | datetime | | 更新时间 |
| remark | varchar(500) | default '' | 备注 |
- 角色表
| 字段名 | 字段类型 | 约束 | 备注 |
|---|
| role_id | bigint(20) | not null, auto_increment | 角色ID |
| role_name | varchar(30) | not null | 角色名称 |
| role_key | varchar(100) | not null | 角色权限字符串 |
| role_sort | int(4) | not null | 显示顺序 |
| menu_check_strictly | tinyint(1) | default 1 | 菜单树选择项是否关联显示(0是1否) |
| del_flag | char(1) | default '0' | 删除标志(0代表存在 1代表删除) |
| create_by | varchar(64) | default '' | 创建者 |
| create_time | datetime | | 创建时间 |
| update_by | varchar(64) | default '' | 更新者 |
| update_time | datetime | | 更新时间 |
| remark | varchar(500) | default '' | 备注 |
- 菜单权限表
| 字段名 | 字段类型 | 约束 | 备注 |
|---|
| menu_id | bigint(20) | not null, auto_increment | 菜单ID |
| menu_name | varchar(50) | not null | 菜单名称 |
| parent_id | bigint(20) | default 0 | 父菜单ID |
| order_num | int(4) | default 0 | 显示顺序 |
| path | varchar(200) | default '' | 路由地址 |
| component | varchar(256) | null | 组件路径 |
| query | varchar(256) | null | 路由参数 |
| menu_type | char(1) | default '' | 菜单类型(M目录 C菜单 F按钮) |
| visible | char(1) | default '0' | 菜单状态(0显示 1隐藏) |
| status | char(1) | default '0' | 菜单状态(0正常 1停用) |
| perms | varchar(100) | null | 权限标识 |
| icon | varchar(100) | default '#' | 菜单图标 |
| create_by | varchar(64) | default '' | 创建者 |
| create_time | datetime | | 创建时间 |
| update_by | varchar(64) | default '' | 更新者 |
| update_time | datetime | | 更新时间 |
| remark | varchar(500) | default '' | 备注 |
- 用户角色关联表
| 字段名 | 字段类型 | 约束 | 备注 |
|---|
| user_id | bigint(20) | not null | 用户ID |
| role_id | bigint(20) | not null | 角色ID |
- 角色菜单关联表
| 字段名 | 字段类型 | 约束 | 备注 |
|---|
| role_id | bigint(20) | not null | 角色ID |
| menu_id | bigint(20) | not null | 菜单ID |
ps:数据库设计参考了若依