注册功能方案
大约 5 分钟
注册功能方案
我来帮你设计注册功能的数据库方案。先让我查看一下现有的 sys_user 表结构:
完美!现在我已经了解了现有的 sys_user 表结构。让我为你设计一个完整的注册功能方案:
注册功能数据库设计方案
方案概述
基于你的需求,我建议采用扩展现有 sys_user 表 + 新增审核表的方式,具体如下:
1️⃣ 修改 sys_user 表
在现有表基础上添加以下字段:
-- 用户注册相关字段扩展
ALTER TABLE `sys_user`
ADD COLUMN `account_type` char(1) DEFAULT '0' COMMENT '账号类型(0=系统账号 1=正式账号 2=临时账号)' AFTER `user_type`,
ADD COLUMN `real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名(实名认证用)' AFTER `user_name`,
ADD COLUMN `id_card` varchar(18) DEFAULT NULL COMMENT '身份证号(实名认证用)' AFTER `real_name`,
ADD COLUMN `id_card_front` varchar(255) DEFAULT NULL COMMENT '身份证正面照片' AFTER `id_card`,
ADD COLUMN `id_card_back` varchar(255) DEFAULT NULL COMMENT '身份证反面照片' AFTER `id_card_front`,
ADD COLUMN `audit_status` char(1) DEFAULT '0' COMMENT '审核状态(0=待审核 1=审核通过 2=审核拒绝)' AFTER `status`,
ADD COLUMN `audit_time` datetime DEFAULT NULL COMMENT '审核时间' AFTER `audit_status`,
ADD COLUMN `audit_by` varchar(64) DEFAULT NULL COMMENT '审核人' AFTER `audit_time`,
ADD COLUMN `audit_remark` varchar(500) DEFAULT NULL COMMENT '审核备注' AFTER `audit_by`,
ADD COLUMN `register_source` varchar(20) DEFAULT 'web' COMMENT '注册来源(web/app/wechat等)' AFTER `audit_remark`,
ADD COLUMN `temp_expire_time` datetime DEFAULT NULL COMMENT '临时账号过期时间' AFTER `register_source`,
ADD INDEX `idx_account_type` (`account_type`),
ADD INDEX `idx_audit_status` (`audit_status`),
ADD INDEX `idx_id_card` (`id_card`);
2️⃣ 新增字典配置
在 sys_dict_data 表中添加相关字典:
-- 账号类型字典
INSERT INTO `sys_dict_data` VALUES (NULL, 1, '系统账号', '0', 'sys_account_type', '', '', 'Y', '0', 'admin', NOW(), '', NULL, '系统内部创建的账号');
INSERT INTO `sys_dict_data` VALUES (NULL, 2, '正式账号', '1', 'sys_account_type', '', '', 'N', '0', 'admin', NOW(), '', NULL, '实名认证注册的正式账号');
INSERT INTO `sys_dict_data` VALUES (NULL, 3, '临时账号', '2', 'sys_account_type', '', '', 'N', '0', 'admin', NOW(), '', NULL, '临时注册账号,仅可写信');
-- 审核状态字典
INSERT INTO `sys_dict_data` VALUES (NULL, 1, '待审核', '0', 'sys_audit_status', '', 'info', 'Y', '0', 'admin', NOW(), '', NULL, '等待审核');
INSERT INTO `sys_dict_data` VALUES (NULL, 2, '审核通过', '1', 'sys_audit_status', '', 'success', 'N', '0', 'admin', NOW(), '', NULL, '审核通过');
INSERT INTO `sys_dict_data` VALUES (NULL, 3, '审核拒绝', '2', 'sys_audit_status', '', 'danger', 'N', '0', 'admin', NOW(), '', NULL, '审核拒绝');
-- 字典类型
INSERT INTO `sys_dict_type` VALUES (NULL, '账号类型', 'sys_account_type', '0', 'admin', NOW(), '', NULL, '用户账号类型列表');
INSERT INTO `sys_dict_type` VALUES (NULL, '审核状态', 'sys_audit_status', '0', 'admin', NOW(), '', NULL, '用户审核状态列表');
3️⃣ 新增审核记录表(可选,用于审核历史追溯)
-- 用户审核记录表
DROP TABLE IF EXISTS `sys_user_audit`;
CREATE TABLE `sys_user_audit` (
`audit_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '审核ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`audit_type` char(1) DEFAULT '1' COMMENT '审核类型(1=注册审核 2=信息变更审核)',
`audit_status` char(1) DEFAULT '0' COMMENT '审核状态(0=待审核 1=通过 2=拒绝)',
`audit_content` text COMMENT '审核内容(JSON格式存储提交的认证信息)',
`audit_remark` varchar(500) DEFAULT NULL COMMENT '审核备注',
`audit_by` varchar(64) DEFAULT NULL COMMENT '审核人',
`audit_time` datetime DEFAULT NULL COMMENT '审核时间',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`audit_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_audit_status` (`audit_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户审核记录表';
4️⃣ 权限控制设计
临时账号权限配置
创建一个专门的"临时用户"角色,只有写信权限:
-- 临时用户角色
INSERT INTO `sys_role` VALUES (NULL, '临时用户', 'temp_user', 3, '1', '1', '0', '0', 'admin', NOW(), '', NULL, '临时注册用户,仅可写信');
-- 临时用户菜单权限(仅首长信箱写信功能)
-- 需要根据你的菜单ID配置,示例:
INSERT INTO `sys_role_menu` VALUES (角色ID, 信箱菜单ID);
正式账号权限配置
正式账号审核通过后,可以分配更多权限,根据业务需求配置。
5️⃣ 业务逻辑设计
注册流程
┌─────────────────┐
│ 用户选择注册类型 │
└────────┬────────┘
│
┌────┴────┐
│ │
┌───▼──┐ ┌──▼────┐
│临时注册│ │实名注册│
└───┬──┘ └──┬────┘
│ │
│ ┌────▼─────────────┐
│ │填写真实姓名+身份证 │
│ │上传身份证照片 │
│ └────┬─────────────┘
│ │
│ ┌────▼─────────────┐
│ │account_type = 1 │
│ │audit_status = 0 │
│ │等待管理员审核 │
│ └────┬─────────────┘
│ │
│ ┌────▼─────────────┐
│ │审核通过后 │
│ │audit_status = 1 │
│ │分配正式角色权限 │
│ └──────────────────┘
│
┌───▼──────────────┐
│account_type = 2 │
│直接注册成功 │
│分配临时角色权限 │
│设置过期时间(可选) │
└──────────────────┘
6️⃣ 核心代码示例
User 实体类扩展
/** 账号类型(0=系统账号 1=正式账号 2=临时账号) */
@Excel(name = "账号类型", readConverterExp = "0=系统账号,1=正式账号,2=临时账号")
private String accountType;
/** 真实姓名 */
private String realName;
/** 身份证号 */
private String idCard;
/** 身份证正面照片 */
private String idCardFront;
/** 身份证反面照片 */
private String idCardBack;
/** 审核状态(0=待审核 1=审核通过 2=审核拒绝) */
@Excel(name = "审核状态", readConverterExp = "0=待审核,1=审核通过,2=审核拒绝")
private String auditStatus;
/** 审核时间 */
private Date auditTime;
/** 审核人 */
private String auditBy;
/** 审核备注 */
private String auditRemark;
/** 注册来源 */
private String registerSource;
/** 临时账号过期时间 */
private Date tempExpireTime;
注册接口示例
/**
* 用户注册
*/
@PostMapping("/register")
public AjaxResult register(@RequestBody User user) {
// 1. 校验用户名是否存在
if (userService.checkLoginNameUnique(user.getLoginName())) {
return error("注册失败,登录账号已存在");
}
// 2. 根据注册类型处理
if ("2".equals(user.getAccountType())) {
// 临时账号注册
user.setAuditStatus("1"); // 无需审核,直接通过
user.setStatus("0"); // 正常状态
// 设置过期时间(例如30天后)
user.setTempExpireTime(DateUtils.addDays(new Date(), 30));
// 分配临时用户角色
user.setRoleIds(new Long[]{临时角色ID});
} else if ("1".equals(user.getAccountType())) {
// 正式账号注册(实名认证)
// 校验身份证信息
if (StringUtils.isEmpty(user.getRealName()) ||
StringUtils.isEmpty(user.getIdCard())) {
return error("实名认证信息不完整");
}
user.setAuditStatus("0"); // 待审核
user.setStatus("1"); // 停用状态,审核通过后启用
}
// 3. 保存用户
user.setRegisterSource("web");
return toAjax(userService.insertUser(user));
}
7️⃣ 优势总结
| 特性 | 说明 |
|---|---|
| 扩展性强 | 基于现有表扩展,不破坏原有系统 |
| 权限隔离 | 临时账号和正式账号权限完全分离 |
| 审核流程 | 实名认证需要审核,临时账号直接通过 |
| 数据完整 | 保留审核历史,便于追溯 |
| 安全可控 | 临时账号可设置过期时间,定期清理 |
8️⃣ 后续建议
- 定时任务:清理过期的临时账号
- 短信验证:注册时增加手机号验证
- 实名认证:对接第三方身份证验证接口(如阿里云、腾讯云)
- 审核工作台:为管理员提供专门的审核界面
- 权限细化:根据业务需求进一步细化临时账号和正式账号的权限
需要我帮你生成完整的 SQL 脚本或者实现具体的代码吗?