会员用户体系
会员是 C 端注册用户,独立于管理员的 sys_user 账号体系,存储在 sys_member 表。
表结构
| 字段 | 类型 | 说明 |
|---|---|---|
sn | varchar(32) | 用户编号,全局唯一,pkg/sn 统一生成(cf 前缀 + 8 位小写字母和数字),管理端列表展示 |
nickname / real_name | varchar(32) | 昵称 / 姓名 |
account | varchar(32) | 登录账号,可空唯一索引(未设置为 NULL),密码登录的凭据 |
mobile | varchar(16) | 手机号,全表唯一,注册必填 |
password | varchar(128) | bcrypt 密文,注册后可为空(短信登录不受影响) |
login_id | varchar(64) | 当前登录会话 ID,重新登录后旧会话失效 |
avatar | varchar(512) | 头像相对路径,展示时按当前存储渠道补全 |
gender / age / birthday | - | 性别(1男 2女 3未知)、年龄、出生日期 |
register_ip / login_ip | varchar(64) | 注册 IP / 最近登录 IP |
registered_at / logged_at | datetime(3) | 注册时间 / 最近登录时间 |
balance | decimal(12,2) | 账户余额(Go 侧字符串承载,避免浮点误差) |
register_source | tinyint | 注册来源:1 微信小程序,2 微信公众号,3 iOS,4 Android |
status | tinyint | 账号状态:1 启用,2 禁用 |
注册与登录
- 注册仅支持手机号 + 短信验证码,默认昵称与头像取自平台配置中的「用户端配置」;
- 登录支持账号密码与手机号 + 验证码两种方式;账号不存在时明确提示「账号不存在」;
- 注册成功直接返回令牌;未设置密码的账号使用短信验证码登录,并通过修改密码接口设置初始密码。
验证码安全策略
短信验证码是独立于认证接口的通用能力,路由为 POST /api/sms/code,限流基于 Redis 计数实现。
| 策略 | 值 |
|---|---|
| 有效期 | 5 分钟 |
| 分钟限流 | 同一手机号同一场景每分钟最多 2 条 |
| 窗口限流 | 同一手机号同一场景 5 分钟内累计超过 5 条 |
| 超限禁令 | 触发窗口限流后禁止发送 30 分钟,并提示用户「账号已被限制30分钟」 |
| 错误容忍 | 校验错误超过 5 次验证码立即作废 |
| 使用方式 | 一次性,校验成功即删除 |
| 审计 | 所有发送与拦截行为写入短信发送记录,拦截请求记录具体原因 |
短信通过 pkg/sms 按系统短信配置(渠道、签名、验证码模板)发送,结果写入短信发送记录。
资料与账号安全
- 可修改:昵称、姓名、头像、登录账号(唯一)、登录密码(强度校验)、手机号(新手机号需验证码校验,唯一);
- 修改密码成功后当前会话立即失效,需重新登录;
- 手机号脱敏规则由
pkg/mask统一提供(138****8001),展示型接口统一调用。
管理端能力
- 「用户管理 → 系统用户」页面:编号、用户、姓名、手机号(脱敏)、性别、年龄、出生日期、余额、注册来源、状态、注册时间与 IP、最近登录时间与 IP;
- 一键启用/禁用(
v-perm权限控制),禁用后会员令牌即时失效; - 关键字搜索覆盖编号、昵称、姓名、账号、手机号。