48 lines
2.1 KiB
SQL
48 lines
2.1 KiB
SQL
-- 用户表结构
|
|
-- 基于用户管理模块设计创建
|
|
-- MySQL版本
|
|
|
|
-- 创建用户表
|
|
CREATE TABLE users (
|
|
-- 基础信息属性
|
|
id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
|
|
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名,唯一',
|
|
email VARCHAR(255) NOT NULL UNIQUE COMMENT '邮箱地址,唯一',
|
|
password_hash VARCHAR(255) NOT NULL COMMENT '密码哈希值',
|
|
full_name VARCHAR(100) NOT NULL COMMENT '真实姓名',
|
|
phone VARCHAR(20) COMMENT '手机号码',
|
|
|
|
-- 角色权限属性
|
|
role VARCHAR(20) NOT NULL DEFAULT 'viewer' COMMENT '用户角色: admin管理员/operator操作员/viewer查看者',
|
|
status VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '账号状态: active活跃/disabled禁用/locked锁定',
|
|
|
|
-- 登录相关属性
|
|
last_login_at DATETIME(3) NULL COMMENT '最后登录时间',
|
|
last_login_ip VARCHAR(45) COMMENT '最后登录IP',
|
|
login_attempts INT NOT NULL DEFAULT 0 COMMENT '登录失败次数',
|
|
locked_until DATETIME(3) NULL COMMENT '账号锁定到期时间',
|
|
|
|
-- 时间字段 (使用DATETIME(3)匹配Go的time.Time和GORM的精度要求)
|
|
created_at DATETIME(3) NOT NULL,
|
|
updated_at DATETIME(3) NOT NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表 - 系统用户管理';
|
|
|
|
-- 创建索引
|
|
CREATE INDEX idx_users_username ON users(username);
|
|
CREATE INDEX idx_users_email ON users(email);
|
|
CREATE INDEX idx_users_role ON users(role);
|
|
CREATE INDEX idx_users_status ON users(status);
|
|
CREATE INDEX idx_users_last_login_at ON users(last_login_at);
|
|
CREATE INDEX idx_users_created_at ON users(created_at);
|
|
CREATE INDEX idx_users_locked_until ON users(locked_until);
|
|
|
|
-- 复合索引用于常见查询
|
|
CREATE INDEX idx_users_role_status ON users(role, status);
|
|
CREATE INDEX idx_users_status_locked ON users(status, locked_until);
|
|
|
|
-- 注意:
|
|
-- 1. 时间戳由Go应用程序管理,不依赖数据库默认值
|
|
-- 2. password_hash使用bcrypt算法,成本因子建议设置为12
|
|
-- 3. 账号锁定机制:连续5次登录失败锁定30分钟
|
|
-- 4. 角色权限通过中间件在应用层控制
|
|
-- 5. 默认管理员账号需要在应用初始化时创建 |