后端 FastAPI 六层结构(api/services/repositories/models/schemas/core), 统一响应信封、全局异常、日志脱敏;6 张表经 Alembic 迁移建库,SQL 留存 db/migration;登录鉴权含图形验证码(Redis GETDEL 防重放)、JWT、登录限流、 登出黑名单(TTL=令牌剩余有效期)、登录日志。 前端 Vue3 + TS + Element Plus 骨架,含登录页、路由守卫、请求封装与 Vite 代理。 工程配置:uv 锁定 Python 3.12、ruff 检查与格式化、editorconfig、gitattributes。 测试 184 项(单元 155 / 集成 29)全绿,浏览器端到端 8 项通过。 Co-Authored-By: Claude Code <noreply@anthropic.com>
104 lines
6.1 KiB
SQL
104 lines
6.1 KiB
SQL
CREATE TABLE alembic_version (
|
||
version_num VARCHAR(32) NOT NULL,
|
||
CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num)
|
||
);
|
||
|
||
-- Running upgrade -> 6165691326d4
|
||
|
||
CREATE TABLE permissions (
|
||
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
|
||
perm_code VARCHAR(128) NOT NULL COMMENT '权限编码,如 system:user:create',
|
||
perm_name VARCHAR(64) NOT NULL COMMENT '权限名称',
|
||
perm_type TINYINT NOT NULL COMMENT '类型:1菜单 2按钮 3接口' DEFAULT '1',
|
||
parent_id BIGINT UNSIGNED COMMENT '父权限ID(permissions.id),顶级为空',
|
||
sort_order INTEGER NOT NULL COMMENT '显示排序' DEFAULT '0',
|
||
status TINYINT NOT NULL COMMENT '状态:1启用 0禁用' DEFAULT '1',
|
||
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
|
||
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||
CONSTRAINT pk_permissions PRIMARY KEY (id),
|
||
CONSTRAINT fk_permissions_parent_id FOREIGN KEY(parent_id) REFERENCES permissions (id) ON DELETE CASCADE,
|
||
CONSTRAINT uk_permissions_perm_code UNIQUE (perm_code)
|
||
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='权限表' COLLATE utf8mb4_general_ci;
|
||
|
||
CREATE TABLE roles (
|
||
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
|
||
role_code VARCHAR(32) NOT NULL COMMENT '角色编码:admin系统管理员 user普通用户',
|
||
role_name VARCHAR(64) NOT NULL COMMENT '角色名称',
|
||
description VARCHAR(255) COMMENT '角色说明',
|
||
sort_order INTEGER NOT NULL COMMENT '显示排序' DEFAULT '0',
|
||
status TINYINT NOT NULL COMMENT '状态:1启用 0禁用' DEFAULT '1',
|
||
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
|
||
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||
CONSTRAINT pk_roles PRIMARY KEY (id),
|
||
CONSTRAINT uk_roles_role_code UNIQUE (role_code)
|
||
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='角色表' COLLATE utf8mb4_general_ci;
|
||
|
||
CREATE TABLE users (
|
||
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
|
||
username VARCHAR(64) NOT NULL COMMENT '登录用户名',
|
||
password VARCHAR(100) NOT NULL COMMENT '密码哈希(BCrypt,固定60字符)',
|
||
real_name VARCHAR(64) COMMENT '真实姓名',
|
||
phone VARCHAR(20) COMMENT '手机号',
|
||
email VARCHAR(128) COMMENT '邮箱',
|
||
status TINYINT NOT NULL COMMENT '状态:1启用 0禁用' DEFAULT '1',
|
||
token_version INTEGER NOT NULL COMMENT '令牌版本号:改密/禁用/强制下线时+1,使已签发Token立即失效' DEFAULT '1',
|
||
last_login_time DATETIME COMMENT '最后登录时间',
|
||
remark VARCHAR(255) COMMENT '备注',
|
||
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
|
||
update_time DATETIME NOT NULL COMMENT '更新时间' DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||
CONSTRAINT pk_users PRIMARY KEY (id),
|
||
CONSTRAINT uk_users_username UNIQUE (username)
|
||
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='系统用户表' COLLATE utf8mb4_general_ci;
|
||
|
||
CREATE INDEX idx_users_phone ON users (phone);
|
||
|
||
CREATE TABLE login_logs (
|
||
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
|
||
user_id BIGINT UNSIGNED COMMENT '用户ID(账号不存在时为空)',
|
||
username VARCHAR(64) NOT NULL COMMENT '登录用户名(原样记录)',
|
||
ip VARCHAR(45) COMMENT '客户端IP(45位兼容IPv6)',
|
||
user_agent VARCHAR(255) COMMENT '客户端User-Agent(截断存储)',
|
||
success TINYINT NOT NULL COMMENT '是否成功:1成功 0失败' DEFAULT '0',
|
||
fail_reason VARCHAR(64) COMMENT '失败原因:验证码错误/用户名或密码错误/账号锁定/账号禁用',
|
||
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
|
||
CONSTRAINT pk_login_logs PRIMARY KEY (id),
|
||
CONSTRAINT fk_login_logs_user_id FOREIGN KEY(user_id) REFERENCES users (id) ON DELETE SET NULL
|
||
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='登录日志表' COLLATE utf8mb4_general_ci;
|
||
|
||
CREATE INDEX idx_login_logs_create_time ON login_logs (create_time);
|
||
|
||
CREATE INDEX idx_login_logs_username ON login_logs (username);
|
||
|
||
CREATE TABLE role_permissions (
|
||
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
|
||
role_id BIGINT UNSIGNED NOT NULL COMMENT '角色ID(roles.id)',
|
||
permission_id BIGINT UNSIGNED NOT NULL COMMENT '权限ID(permissions.id)',
|
||
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
|
||
CONSTRAINT pk_role_permissions PRIMARY KEY (id),
|
||
CONSTRAINT fk_role_permissions_permission_id FOREIGN KEY(permission_id) REFERENCES permissions (id) ON DELETE CASCADE,
|
||
CONSTRAINT fk_role_permissions_role_id FOREIGN KEY(role_id) REFERENCES roles (id) ON DELETE CASCADE,
|
||
CONSTRAINT uk_role_permissions_role_id_permission_id UNIQUE (role_id, permission_id)
|
||
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='角色权限关联表' COLLATE utf8mb4_general_ci;
|
||
|
||
CREATE INDEX idx_role_permissions_permission_id ON role_permissions (permission_id);
|
||
|
||
CREATE TABLE user_roles (
|
||
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
|
||
user_id BIGINT UNSIGNED NOT NULL COMMENT '用户ID(users.id)',
|
||
role_id BIGINT UNSIGNED NOT NULL COMMENT '角色ID(roles.id)',
|
||
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
|
||
CONSTRAINT pk_user_roles PRIMARY KEY (id),
|
||
CONSTRAINT fk_user_roles_role_id FOREIGN KEY(role_id) REFERENCES roles (id) ON DELETE CASCADE,
|
||
CONSTRAINT fk_user_roles_user_id FOREIGN KEY(user_id) REFERENCES users (id) ON DELETE CASCADE,
|
||
CONSTRAINT uk_user_roles_user_id_role_id UNIQUE (user_id, role_id)
|
||
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='用户角色关联表' COLLATE utf8mb4_general_ci;
|
||
|
||
CREATE INDEX idx_user_roles_role_id ON user_roles (role_id);
|
||
|
||
INSERT INTO roles (role_code, role_name, description, sort_order) VALUES ('admin', '系统管理员', '全部权限,含计提参数与系数表配置', 1);
|
||
|
||
INSERT INTO roles (role_code, role_name, description, sort_order) VALUES ('user', '普通用户', '业务操作', 2);
|
||
|
||
INSERT INTO alembic_version (version_num) VALUES ('6165691326d4');
|
||
|