Files

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. 默认管理员账号需要在应用初始化时创建