feat:升级功能、密码卡框架、主密钥接口

This commit is contained in:
waner
2026-03-26 17:30:48 +08:00
parent c1e91e76b0
commit 11ed0b5edf
208 changed files with 16742 additions and 1156 deletions
+292 -48
View File
@@ -1,70 +1,314 @@
-- -----------------------------------------------------------------------------
-- TMS 基础库结构(TiDB/MySQL)
-- 适用范围:当前已实现的初始化任务、步骤、设备节点、用户表
-- TMS 最终库结构初始化脚本
-- 适用范围:新库初始化
-- 数据库:TiDB / MySQL 8+
--
-- 说明:
-- 1. 本文件按当前项目最终表结构整理,适合“空库初始化”。
-- 2. 不再按 V1-V11 逐步执行 ALTER / RENAME,避免初始化时出现兼容性问题。
-- 3. 若用于已有库升级,请继续使用 Flyway migration,而不是本文件。
-- -----------------------------------------------------------------------------
-- 1) 建库(如已存在则跳过)
CREATE DATABASE IF NOT EXISTS tms
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
USE tms;
-- 2) 初始化任务主表
-- -----------------------------------------------------------------------------
-- 初始化任务
-- -----------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS tms_init_task (
id BIGINT PRIMARY KEY COMMENT '主键ID',
task_id VARCHAR(64) NOT NULL COMMENT '任务业务ID',
version VARCHAR(32) NOT NULL COMMENT 'CIPS版本',
status VARCHAR(32) NOT NULL COMMENT '任务状态',
product_type VARCHAR(16) NULL COMMENT '产品版本: enterprise/interbank/lite_direct',
org_code VARCHAR(32) NULL COMMENT '机构号',
mq_type VARCHAR(32) NULL COMMENT '消息队列类型',
deploy_mode VARCHAR(16) NULL COMMENT '部署模式: single/double/four',
init_plan_json LONGTEXT NULL COMMENT '初始化计划快照(JSON)',
create_time DATETIME(3) NOT NULL COMMENT '创建时间',
update_time DATETIME(3) NOT NULL COMMENT '更新时间',
id BIGINT PRIMARY KEY,
task_id VARCHAR(64) NOT NULL,
task_type VARCHAR(32) NOT NULL DEFAULT 'INIT' COMMENT '任务类型:INIT/RESET',
version VARCHAR(32) NOT NULL,
status VARCHAR(32) NOT NULL,
product_type VARCHAR(16) NULL,
org_code VARCHAR(32) NULL,
mq_type VARCHAR(32) NULL,
deploy_mode VARCHAR(16) NULL,
init_plan_json LONGTEXT NULL,
create_time DATETIME(3) NOT NULL,
update_time DATETIME(3) NOT NULL,
UNIQUE KEY uk_tms_init_task_task_id (task_id)
) COMMENT='初始化任务表';
);
-- 3) 初始化任务步骤表
CREATE TABLE IF NOT EXISTS tms_init_task_step (
id BIGINT PRIMARY KEY COMMENT '主键ID',
task_id VARCHAR(64) NOT NULL COMMENT '任务业务ID',
step_no INT NOT NULL COMMENT '步骤序号',
step_code VARCHAR(64) NOT NULL COMMENT '步骤编码',
status VARCHAR(32) NOT NULL COMMENT '步骤状态',
message VARCHAR(512) NULL COMMENT '步骤信息',
command_line VARCHAR(2048) NULL COMMENT '实际执行命令',
log_path VARCHAR(512) NULL COMMENT '日志文件路径',
exit_code INT NULL COMMENT '命令退出码',
create_time DATETIME(3) NOT NULL COMMENT '创建时间',
update_time DATETIME(3) NOT NULL COMMENT '更新时间',
id BIGINT PRIMARY KEY,
task_id VARCHAR(64) NOT NULL,
step_no INT NOT NULL,
step_code VARCHAR(64) NOT NULL,
status VARCHAR(32) NOT NULL,
message VARCHAR(512) NULL,
command_line VARCHAR(2048) NULL,
log_path VARCHAR(512) NULL,
exit_code INT NULL,
create_time DATETIME(3) NOT NULL,
update_time DATETIME(3) NOT NULL,
UNIQUE KEY uk_tms_init_task_step_task_no (task_id, step_no),
KEY idx_tms_init_task_step_task_id (task_id)
) COMMENT='初始化任务步骤表';
);
-- -----------------------------------------------------------------------------
-- 认证与设备基础表
-- -----------------------------------------------------------------------------
-- 4) 系统用户表(简化)
CREATE TABLE IF NOT EXISTS tms_auth_user (
id BIGINT PRIMARY KEY COMMENT '主键ID',
username VARCHAR(64) NOT NULL COMMENT '用户名',
display_name VARCHAR(128) NOT NULL COMMENT '显示名',
role VARCHAR(64) NOT NULL COMMENT '角色',
create_time DATETIME(3) NOT NULL COMMENT '创建时间',
update_time DATETIME(3) NOT NULL COMMENT '更新时间',
id BIGINT PRIMARY KEY,
username VARCHAR(64) NOT NULL,
display_name VARCHAR(128) NOT NULL,
role VARCHAR(64) NOT NULL,
create_time DATETIME(3) NOT NULL,
update_time DATETIME(3) NOT NULL,
UNIQUE KEY uk_tms_auth_user_username (username)
) COMMENT='系统用户表';
);
-- 5) 设备节点表
CREATE TABLE IF NOT EXISTS tms_device_node (
id BIGINT PRIMARY KEY COMMENT '主键ID',
node_id VARCHAR(64) NOT NULL COMMENT '节点业务ID',
host VARCHAR(128) NOT NULL COMMENT '节点主机地址',
status VARCHAR(32) NOT NULL COMMENT '节点状态',
create_time DATETIME(3) NOT NULL COMMENT '创建时间',
update_time DATETIME(3) NOT NULL COMMENT '更新时间',
id BIGINT PRIMARY KEY,
node_id VARCHAR(64) NOT NULL,
host VARCHAR(128) NOT NULL,
status VARCHAR(32) NOT NULL,
create_time DATETIME(3) NOT NULL,
update_time DATETIME(3) NOT NULL,
UNIQUE KEY uk_tms_device_node_node_id (node_id)
) COMMENT='设备节点表';
);
-- 6) 可选初始化数据(按需启用)
-- INSERT INTO tms_auth_user (id, username, display_name, role, create_time, update_time)
-- VALUES (10001, 'admin', '系统管理员', 'ADMIN', NOW(3), NOW(3));
CREATE TABLE IF NOT EXISTS tms_file_record (
id BIGINT PRIMARY KEY,
file_id VARCHAR(64) NOT NULL,
original_filename VARCHAR(255) NOT NULL,
storage_path VARCHAR(1024) NOT NULL,
status VARCHAR(32) NOT NULL,
create_time DATETIME(3) NOT NULL,
update_time DATETIME(3) NOT NULL,
UNIQUE KEY uk_tms_file_record_file_id (file_id)
);
-- -----------------------------------------------------------------------------
-- 设备软件版本
-- -----------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS tms_device_software_version (
id BIGINT PRIMARY KEY,
component_code VARCHAR(64) NOT NULL,
component_name VARCHAR(128) NOT NULL,
current_version VARCHAR(128) NOT NULL,
source_type VARCHAR(32) NOT NULL,
detected_at DATETIME NULL,
remarks VARCHAR(255) NULL,
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_tms_device_software_version_component_code (component_code)
);
INSERT INTO tms_device_software_version
(id, component_code, component_name, current_version, source_type, detected_at, remarks)
VALUES
(1001, 'RABBITMQ', '消息队列', 'RabbitMQ V3.8.21', 'MANUAL', NOW(), '出厂预置'),
(1002, 'TLQ', '消息队列', 'tonglink/Q V8.1.11', 'MANUAL', NOW(), '出厂预置'),
(1003, 'TIDB', '数据库', 'TiDB V8.1.0', 'MANUAL', NOW(), '出厂预置'),
(1004, 'NGINX', 'Nginx', 'Nginx V1.20', 'MANUAL', NOW(), '出厂预置'),
(1005, 'APP', '标准收发器企业版', '标准收发器企业版 V1.3.2', 'MANUAL', NOW(), '出厂预置'),
(1006, 'TMS', 'CISD终端管理服务', 'CISD终端管理服务 V1.0.0', 'MANUAL', NOW(), '出厂预置')
ON DUPLICATE KEY UPDATE
component_name = VALUES(component_name),
current_version = VALUES(current_version),
source_type = VALUES(source_type),
detected_at = VALUES(detected_at),
remarks = VALUES(remarks),
update_time = CURRENT_TIMESTAMP;
-- -----------------------------------------------------------------------------
-- 升级任务
-- -----------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS t_upgrade_task (
id BIGINT PRIMARY KEY,
task_id VARCHAR(64) NOT NULL,
upgrade_mode VARCHAR(16) NOT NULL,
target_component VARCHAR(32) NOT NULL,
package_file_id VARCHAR(64) NOT NULL,
package_name VARCHAR(255) NOT NULL,
package_hash VARCHAR(128) NOT NULL,
current_version VARCHAR(64) NOT NULL,
target_version VARCHAR(64) NOT NULL,
status VARCHAR(32) NOT NULL,
verify_passed TINYINT(1) NOT NULL DEFAULT 0,
verify_message VARCHAR(1024) NULL,
manifest_json TEXT NULL,
detail_log_path VARCHAR(1024) NULL,
error_message VARCHAR(1024) NULL,
operator VARCHAR(64) NULL,
started_at DATETIME(3) NULL,
finished_at DATETIME(3) NULL,
create_time DATETIME(3) NOT NULL,
update_time DATETIME(3) NOT NULL,
UNIQUE KEY uk_t_upgrade_task_task_id (task_id),
KEY idx_t_upgrade_task_status (status),
KEY idx_t_upgrade_task_component (target_component),
KEY idx_t_upgrade_task_create_time (create_time)
);
-- -----------------------------------------------------------------------------
-- 新认证体系
-- -----------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS tms_role_account (
id BIGINT PRIMARY KEY,
role_code VARCHAR(64) NOT NULL,
display_name VARCHAR(128) NOT NULL,
required_ukey_count INT NOT NULL,
password_hash VARCHAR(256) NOT NULL,
password_salt VARCHAR(128) NOT NULL,
status VARCHAR(32) NOT NULL,
need_change_password TINYINT(1) NOT NULL DEFAULT 1,
failed_count INT NOT NULL DEFAULT 0,
locked_until DATETIME(3) NULL,
last_login_at DATETIME(3) NULL,
last_active_at DATETIME(3) NULL,
create_time DATETIME(3) NOT NULL,
update_time DATETIME(3) NOT NULL,
UNIQUE KEY uk_tms_role_account_role_code (role_code)
);
CREATE TABLE IF NOT EXISTS tms_role_ukey_binding (
id BIGINT PRIMARY KEY,
role_code VARCHAR(64) NOT NULL,
slot_no INT NOT NULL,
ukey_serial VARCHAR(128) NOT NULL,
ukey_pubkey TEXT NOT NULL,
issuer_sign TEXT NULL,
status VARCHAR(32) NOT NULL,
bound_at DATETIME(3) NOT NULL,
unbound_at DATETIME(3) NULL,
create_time DATETIME(3) NOT NULL,
update_time DATETIME(3) NOT NULL,
UNIQUE KEY uk_tms_role_ukey_binding_role_slot (role_code, slot_no),
KEY idx_tms_role_ukey_binding_role_status (role_code, status)
);
CREATE TABLE IF NOT EXISTS tms_auth_session (
id BIGINT PRIMARY KEY,
session_token VARCHAR(128) NOT NULL,
role_code VARCHAR(64) NOT NULL,
auth_level VARCHAR(32) NOT NULL,
issued_at DATETIME(3) NOT NULL,
last_active_at DATETIME(3) NOT NULL,
expires_at DATETIME(3) NOT NULL,
logout_at DATETIME(3) NULL,
create_time DATETIME(3) NOT NULL,
update_time DATETIME(3) NOT NULL,
UNIQUE KEY uk_tms_auth_session_token (session_token),
KEY idx_tms_auth_session_role_code (role_code)
);
CREATE TABLE IF NOT EXISTS tms_auth_challenge (
id BIGINT PRIMARY KEY,
challenge_id VARCHAR(128) NOT NULL,
role_code VARCHAR(64) NOT NULL,
purpose VARCHAR(32) NOT NULL,
nonce VARCHAR(256) NOT NULL,
expires_at DATETIME(3) NOT NULL,
used TINYINT(1) NOT NULL DEFAULT 0,
create_time DATETIME(3) NOT NULL,
update_time DATETIME(3) NOT NULL,
UNIQUE KEY uk_tms_auth_challenge_challenge_id (challenge_id)
);
CREATE TABLE IF NOT EXISTS tms_auth_audit_log (
id BIGINT PRIMARY KEY,
event_type VARCHAR(64) NOT NULL,
role_code VARCHAR(64) NULL,
operator_role_code VARCHAR(64) NULL,
result VARCHAR(32) NOT NULL,
detail_json JSON NULL,
remote_ip VARCHAR(64) NULL,
create_time DATETIME(3) NOT NULL,
update_time DATETIME(3) NOT NULL,
KEY idx_tms_auth_audit_log_event_type (event_type),
KEY idx_tms_auth_audit_log_role_code (role_code)
);
INSERT IGNORE INTO tms_role_account (
id,
role_code,
display_name,
required_ukey_count,
password_hash,
password_salt,
status,
need_change_password,
failed_count,
locked_until,
last_login_at,
last_active_at,
create_time,
update_time
)
VALUES
(
11001,
'SUPER_ADMIN',
'超级管理员',
3,
'Viuew8WE+qziUZwGGU0x25cUpzsTF+QvQFU0uhb+yVA=',
'init-super-admin-salt-20260325',
'UNENABLED',
1,
0,
NULL,
NULL,
NULL,
CURRENT_TIMESTAMP(3),
CURRENT_TIMESTAMP(3)
),
(
11002,
'KEY_ADMIN',
'密钥管理员',
2,
'/xqmDy3A/q9X5p7XWznIPSBabQ6bxTLAPgtHQ6Be33c=',
'init-key-admin-salt-20260325',
'ACTIVE',
1,
0,
NULL,
NULL,
NULL,
CURRENT_TIMESTAMP(3),
CURRENT_TIMESTAMP(3)
),
(
11003,
'AUDIT_ADMIN',
'审计管理员',
1,
'j/J1LKyUOzVEJfbbHe2dwKBKNdabRk502olk/LWIwhg=',
'init-audit-admin-salt-20260325',
'UNENABLED',
1,
0,
NULL,
NULL,
NULL,
CURRENT_TIMESTAMP(3),
CURRENT_TIMESTAMP(3)
),
(
11004,
'OPS_ADMIN',
'运维管理员',
1,
'2e9F4aCgsDb+AuD1LrBEqEg8yjy3ODo27UHtx06vj/A=',
'init-ops-admin-salt-20260325',
'UNENABLED',
1,
0,
NULL,
NULL,
NULL,
CURRENT_TIMESTAMP(3),
CURRENT_TIMESTAMP(3)
);
+79
View File
@@ -0,0 +1,79 @@
# TMS 初始化 SQL 执行说明
当前推荐使用 [tms_schema_full.sql](/Users/waner/Work/CISD/文档/tms-framework/docs/sql/tms_schema_full.sql)。
这份脚本已经整理成“最终库结构初始化版”,适合空库直接初始化,不再按 migration 逐步执行 `ALTER / RENAME`。
如果你在 TiDB 客户端里一次性执行整份文件,出现下面这类报错:
```text
SQL Error [8130] [HY000]: client has multi-statement capability disabled
```
这不是 SQL 内容本身错误,而是“客户端把整份脚本作为一次多语句请求发送”,而当前 TiDB 连接未开启 multi-statement。
## 推荐做法
### 方式一:用脚本执行模式运行最终初始化脚本
优先用客户端的 `Run Script` / `Execute Script` 模式执行:
- [tms_schema_full.sql](/Users/waner/Work/CISD/文档/tms-framework/docs/sql/tms_schema_full.sql)
### 方式二:用“脚本执行”而不是“单次执行”
如果你的客户端支持 `Run Script` / `Execute Script`,优先用脚本模式。
脚本模式通常会把每条语句分开发送,而不是整份文件一次发给数据库。
### 方式三:使用命令行客户端导入
例如:
```bash
mysql -h <host> -P <port> -u <user> -p tms < /path/to/tms_schema_full.sql
```
或者先登录后:
```sql
source /path/to/tms_schema_full.sql;
```
### 方式四:实在只能单条执行时
先执行:
```sql
CREATE DATABASE IF NOT EXISTS tms
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
USE tms;
```
然后把 [tms_schema_full.sql](/Users/waner/Work/CISD/文档/tms-framework/docs/sql/tms_schema_full.sql) 中的语句按分号逐条执行。
## 不推荐但可选
你也可以按报错提示开启:
```sql
SET GLOBAL tidb_multi_statement_mode='ON';
```
但这会影响实例级行为,有安全风险,不建议为了初始化脚本临时这么做,除非你明确知道数据库侧的风险边界并且由 DBA 允许。
## 当前默认账号种子
脚本已经包含 4 个固定角色账号:
- `SUPER_ADMIN`
- `KEY_ADMIN`
- `AUDIT_ADMIN`
- `OPS_ADMIN`
默认口令均为 `12345678`,其中:
- `KEY_ADMIN` 默认 `ACTIVE`
- 其他角色默认 `UNENABLED`
- 所有角色 `need_change_password = 1`