初始化

This commit is contained in:
zg
2026-07-15 16:13:27 +08:00
parent 6d6f559793
commit c4023c1623
276 changed files with 42622 additions and 0 deletions

41
sql/add_file_menu.sql Normal file
View File

@@ -0,0 +1,41 @@
-- 文件对象储存菜单 + 权限 (QA & PROD 通用)
-- 需要先查 gateway 系统ID 和 "系统管理" 目录ID然后执行
-- ====== QA 数据库 ======
USE mokeegatewayqa;
SET @gw_id = (SELECT id FROM sys_system WHERE system_code='gateway');
SET @sys_mgmt_id = (SELECT id FROM sys_menu WHERE system_id=@gw_id AND parent_id='0' AND menu_name='系统管理' AND menu_type=1);
-- 文件对象储存菜单 (type=2 菜单)
INSERT INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, menu_path, component, icon, permission, sort_order, status, created_at)
VALUES (REPLACE(UUID(),'-',''), @gw_id, @sys_mgmt_id, '文件对象储存', 2, '/admin/file', 'admin/file/FileList', 'FolderOpened', 'system:file:list', 4, 1, NOW());
SET @file_menu_id = (SELECT id FROM sys_menu WHERE system_id=@gw_id AND menu_path='/admin/file');
-- 按钮权限
INSERT INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, permission, sort_order, status, created_at)
VALUES (REPLACE(UUID(),'-',''), @gw_id, @file_menu_id, '上传文件', 3, 'system:file:upload', 1, 1, NOW());
INSERT INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, permission, sort_order, status, created_at)
VALUES (REPLACE(UUID(),'-',''), @gw_id, @file_menu_id, '删除文件', 3, 'system:file:delete', 2, 1, NOW());
-- ====== PROD 数据库 ======
USE mokeegateway;
SET @gw_id = (SELECT id FROM sys_system WHERE system_code='gateway');
SET @sys_mgmt_id = (SELECT id FROM sys_menu WHERE system_id=@gw_id AND parent_id='0' AND menu_name='系统管理' AND menu_type=1);
-- 文件对象储存菜单
INSERT INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, menu_path, component, icon, permission, sort_order, status, created_at)
VALUES (REPLACE(UUID(),'-',''), @gw_id, @sys_mgmt_id, '文件对象储存', 2, '/admin/file', 'admin/file/FileList', 'FolderOpened', 'system:file:list', 4, 1, NOW());
SET @file_menu_id = (SELECT id FROM sys_menu WHERE system_id=@gw_id AND menu_path='/admin/file');
INSERT INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, permission, sort_order, status, created_at)
VALUES (REPLACE(UUID(),'-',''), @gw_id, @file_menu_id, '上传文件', 3, 'system:file:upload', 1, 1, NOW());
INSERT INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, permission, sort_order, status, created_at)
VALUES (REPLACE(UUID(),'-',''), @gw_id, @file_menu_id, '删除文件', 3, 'system:file:delete', 2, 1, NOW());
SELECT 'QA:' AS env, id, menu_name, menu_type, permission FROM sys_menu WHERE menu_path='/admin/file' OR permission LIKE 'system:file:%';

36
sql/add_file_storage.sql Normal file
View File

@@ -0,0 +1,36 @@
-- ============================================================================
-- 文件对象存储sys_config 表 + sys_file 字段扩展 + 菜单更新
-- 执行环境QA / PROD 均需执行
-- ============================================================================
-- 1. 系统配置表
CREATE TABLE IF NOT EXISTS sys_config (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
config_key VARCHAR(128) NOT NULL COMMENT '配置键',
config_value TEXT COMMENT '配置值',
description VARCHAR(256) COMMENT '配置说明',
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id),
UNIQUE KEY uk_config_key (config_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统配置表';
-- 2. 种子数据:文件存储磁盘路径
INSERT IGNORE INTO sys_config (id, config_key, config_value, description, updated_at)
VALUES (REPLACE(UUID(),'-',''), 'file.storage.disk.path', '/data/mokee/gw/file', '文件对象存储磁盘根目录', NOW());
-- 3. sys_file 加字段(存储文件名 + 上传者显示名)
ALTER TABLE sys_file ADD COLUMN IF NOT EXISTS storage_file_name VARCHAR(256) DEFAULT NULL COMMENT '磁盘存储的实际文件名';
ALTER TABLE sys_file ADD COLUMN IF NOT EXISTS upload_user_name VARCHAR(64) DEFAULT NULL COMMENT '上传者显示名(用户姓名或系统名)';
-- 4. 菜单改:文件管理 → 文件对象储存
UPDATE sys_menu SET menu_name = '文件对象储存' WHERE menu_path = '/admin/file' AND menu_type = 2;
-- 5. 新增"系统配置"菜单(系统管理 > 系统配置sortOrder=5
INSERT INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, menu_path, component, icon, sort_order, status, created_at)
SELECT REPLACE(UUID(),'-',''), m1.system_id, m1.id, '系统配置', 2, '/admin/config', 'admin/config/SystemConfig', 'Setting', 5, 1, NOW()
FROM sys_menu m1
WHERE m1.menu_name = '系统管理' AND m1.menu_type = 1 AND m1.parent_id = '0'
AND NOT EXISTS (SELECT 1 FROM sys_menu m2 WHERE m2.menu_path = '/admin/config' AND m2.menu_type = 2);
-- 6. 菜单改:旧菜单文件图标改为 FolderOpened (如果之前是默认图标)
-- UPDATE sys_menu SET icon = 'FolderOpened' WHERE menu_path = '/admin/file' AND menu_type = 2 AND icon = 'Folder';

157
sql/fix_all_permissions.sql Normal file
View File

@@ -0,0 +1,157 @@
-- ============================================================
-- 完整按钮权限修复 SQLPROD 执行)
-- 功能:
-- 1. 补充所有按钮权限菜单INSERT IGNORE幂等安全
-- 2. 将所有 gateway 系统菜单(含按钮)绑定到 super_admin
-- 3. 执行后 super_admin 重新登录即可看到所有按钮
--
-- 执行方式mysql -u root -p < sql/fix_all_permissions.sql
-- ============================================================
USE mokeegateway;
-- ========================================
-- 一、补充按钮权限菜单INSERT IGNORE
-- ========================================
-- 1. 系统列表 按钮权限
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增系统', 3, 1, 1, 'system:system:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='系统列表';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑系统', 3, 2, 1, 'system:system:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='系统列表';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除系统', 3, 3, 1, 'system:system:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='系统列表';
-- 2. 用户管理 按钮权限
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增用户', 3, 1, 1, 'system:user:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='用户管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑用户', 3, 2, 1, 'system:user:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='用户管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除用户', 3, 3, 1, 'system:user:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='用户管理';
-- 3. 角色管理 按钮权限
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增角色', 3, 1, 1, 'system:role:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='角色管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑角色', 3, 2, 1, 'system:role:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='角色管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除角色', 3, 3, 1, 'system:role:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='角色管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '分配菜单', 3, 4, 1, 'system:role:assignMenu'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='角色管理';
-- 4. 菜单管理 按钮权限(重点:新增/编辑/删除)
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增菜单', 3, 1, 1, 'system:menu:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='菜单管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑菜单', 3, 2, 1, 'system:menu:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='菜单管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除菜单', 3, 3, 1, 'system:menu:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='菜单管理';
-- 5. 接口管理 按钮权限(重点:新增/编辑/删除)
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增接口', 3, 1, 1, 'system:api:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='接口管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑接口', 3, 2, 1, 'system:api:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='接口管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除接口', 3, 3, 1, 'system:api:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='接口管理';
-- 6. 数据字典 按钮权限
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增字典', 3, 1, 1, 'system:dict:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='数据字典';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑字典', 3, 2, 1, 'system:dict:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='数据字典';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除字典', 3, 3, 1, 'system:dict:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='数据字典';
-- 7. 文件对象储存 按钮权限
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '上传文件', 3, 1, 1, 'system:file:upload'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='文件对象储存';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除文件', 3, 2, 1, 'system:file:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='文件对象储存';
-- 8. 邮件管理 按钮权限
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '发送邮件', 3, 1, 1, 'system:email:send'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='邮件管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除邮件', 3, 2, 1, 'system:email:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='邮件管理';
-- 9. 个人中心 按钮权限parent_id='0',独立权限,不挂在页面菜单下)
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, '0', '保存个人信息', 3, 1, 1, 'system:profile:edit'
FROM sys_system s WHERE s.system_code='gateway';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, '0', '修改密码', 3, 2, 1, 'system:profile:password'
FROM sys_system s WHERE s.system_code='gateway';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, '0', '更换头像', 3, 3, 1, 'system:profile:avatar'
FROM sys_system s WHERE s.system_code='gateway';
-- ========================================
-- 二、绑定所有 gateway 菜单到 super_admin
-- ========================================
INSERT IGNORE INTO sys_role_menu (id, role_id, menu_id)
SELECT REPLACE(UUID(),'-',''), r.id, m.id
FROM sys_role r, sys_menu m, sys_system s
WHERE r.role_code='super_admin' AND r.system_id=s.id AND m.system_id=s.id AND s.system_code='gateway';
-- ========================================
-- 三、验证查询(检查结果)
-- ========================================
SELECT '=== 按钮权限检查 ===' AS info;
SELECT m.menu_name AS '按钮名称', m.permission AS '权限标识',
CASE WHEN rm.id IS NOT NULL THEN '已绑定' ELSE '未绑定' END AS 'super_admin绑定状态'
FROM sys_menu m
LEFT JOIN sys_system s ON m.system_id = s.id AND s.system_code = 'gateway'
LEFT JOIN sys_role r ON r.system_id = s.id AND r.role_code = 'super_admin'
LEFT JOIN sys_role_menu rm ON rm.menu_id = m.id AND rm.role_id = r.id
WHERE m.menu_type = 3 AND s.system_code = 'gateway'
ORDER BY m.permission;
SELECT '=== super_admin 权限总数 ===' AS info;
SELECT COUNT(DISTINCT m.permission) AS '权限数量'
FROM sys_role r, sys_role_menu rm, sys_menu m, sys_system s
WHERE r.role_code = 'super_admin' AND r.system_id = s.id AND s.system_code = 'gateway'
AND r.id = rm.role_id AND rm.menu_id = m.id AND m.permission IS NOT NULL AND m.permission != '';
SELECT '=== 修复完成!请 super_admin 重新登录 ===' AS result;

103
sql/init_prod_migrate.py Normal file
View File

@@ -0,0 +1,103 @@
"""PROD数据库 UUID 迁移 — 保留现有数据"""
import pymysql, uuid
conn = pymysql.connect(host='db1.prod.zgitm.com', port=3306, user='mokeegateway', password='mokee.', database='mokeegateway', charset='utf8mb4')
cur = conn.cursor()
def uid(): return uuid.uuid4().hex
def ex(sql, *args):
cur.execute(sql, args)
conn.commit()
# 1. 为所有表添加 uuid_id 列(每次单独执行,忽略已存在错误)
tables = ['sys_system','sys_user','sys_role','sys_menu','sys_api','sys_dict','sys_file','sys_user_system','sys_user_role','sys_role_menu','sys_login_log','sys_operation_log']
for t in tables:
try: ex(f"ALTER TABLE {t} ADD COLUMN uuid_id VARCHAR(64) NOT NULL DEFAULT ''")
except Exception as e: print(f'{t} add col: {e}')
# 2. 生成UUID
for t in tables:
ex(f"UPDATE {t} SET uuid_id = REPLACE(UUID(),'-','')")
print('UUID generated')
# 3. 收集新旧ID映射(先收集所有,避免 JOIN 更新时列类型冲突)
id_map = {}
for t in tables:
cur.execute(f"SELECT id, uuid_id FROM {t}")
id_map[t] = {str(old): new for old, new in cur.fetchall()}
print('ID maps collected')
# 4. 先将所有FK列扩大为VARCHAR(64) (允许NULL先)
print('Modifying FK columns to VARCHAR...')
for child_tbl, fks in {
'sys_api': ['system_id'],
'sys_role': ['system_id'],
'sys_menu': ['system_id','parent_id'],
'sys_user_system': ['user_id','system_id'],
'sys_user_role': ['user_id','role_id'],
'sys_role_menu': ['role_id','menu_id'],
'sys_login_log': ['user_id','system_id'],
'sys_operation_log': ['user_id','system_id'],
'sys_system': ['created_by','updated_by'],
}.items():
for col in fks:
try: ex(f"ALTER TABLE {child_tbl} MODIFY {col} VARCHAR(64)")
except: pass
try: ex("ALTER TABLE sys_role MODIFY created_by VARCHAR(64)")
except: pass
try: ex("ALTER TABLE sys_role MODIFY updated_by VARCHAR(64)")
except: pass
print('FK columns widened')
# 5. 更新外键引用
fk_updates = {
'sys_api': {'system_id': 'sys_system'},
'sys_role': {'system_id': 'sys_system'},
'sys_menu': {'system_id': 'sys_system'},
'sys_user_system': {'system_id': 'sys_system', 'user_id': 'sys_user'},
'sys_user_role': {'user_id': 'sys_user', 'role_id': 'sys_role'},
'sys_role_menu': {'role_id': 'sys_role', 'menu_id': 'sys_menu'},
'sys_login_log': {'user_id': 'sys_user', 'system_id': 'sys_system'},
'sys_operation_log':{'user_id': 'sys_user', 'system_id': 'sys_system'},
}
for child_tbl, fks in fk_updates.items():
for fk_col, parent_tbl in fks.items():
# 读取当前FK值,通过id_map转换后更新
cur.execute(f"SELECT id, {fk_col} FROM {child_tbl}")
rows = cur.fetchall()
for row_id, old_fk in rows:
if old_fk and str(old_fk) in id_map.get(parent_tbl, {}):
new_fk = id_map[parent_tbl][str(old_fk)]
ex(f"UPDATE {child_tbl} SET {fk_col}=%s WHERE id=%s", new_fk, row_id)
print(f'{child_tbl}.{fk_col} updated')
# 6. menu parent_id 自引用
cur.execute(f"SELECT id, parent_id FROM sys_menu WHERE parent_id != '0'")
for mid, pid in cur.fetchall():
if str(pid) in id_map['sys_menu']:
ex(f"UPDATE sys_menu SET parent_id=%s WHERE id=%s", id_map['sys_menu'][str(pid)], mid)
print('menu parent_id updated')
# 7. 切换主键
for t in tables:
cur.execute(f"ALTER TABLE {t} DROP PRIMARY KEY, DROP COLUMN id, CHANGE uuid_id id VARCHAR(64) NOT NULL, ADD PRIMARY KEY (id)")
print('PK switched')
# 8. 重建索引
try: ex("ALTER TABLE sys_api DROP INDEX uk_system_path_method"); ex("ALTER TABLE sys_api ADD UNIQUE KEY uk_system_path_method (system_id, api_path, api_method)")
except: pass
try: ex("ALTER TABLE sys_role DROP INDEX uk_system_role_code"); ex("ALTER TABLE sys_role ADD UNIQUE KEY uk_system_role_code (system_id, role_code)")
except: pass
# 验证
cur.execute('SELECT id, username FROM sys_user LIMIT 1')
r = cur.fetchone()
print(f'验证: user id len={len(str(r[0]))}, username={r[1]}')
for t in tables:
cur.execute(f"SELECT COUNT(*) FROM {t}")
print(f'{t}: {cur.fetchone()[0]}')
cur.close(); conn.close()
print('PROD MIGRATION DONE')

113
sql/init_qa.py Normal file
View File

@@ -0,0 +1,113 @@
"""QA数据库初始化 (UUID版本) - 直接用Python处理关联"""
import pymysql, uuid
def uid(): return uuid.uuid4().hex
conn = pymysql.connect(host='db1.qa.zgitm.com', port=3306, user='mokeegatewayqa', password='mokee.', database='mokeegatewayqa', charset='utf8mb4')
cur = conn.cursor()
# 重建
cur.execute('DROP DATABASE IF EXISTS mokeegatewayqa')
cur.execute('CREATE DATABASE mokeegatewayqa DEFAULT CHARSET utf8mb4')
cur.execute('USE mokeegatewayqa')
conn.commit()
# 读DDL执行
with open('E:/AI/claude/new/mokeeGateway/sql/qa_ddl.sql', 'r', encoding='utf-8') as f:
for stmt in f.read().split(';'):
stmt = stmt.strip()
if stmt and not stmt.startswith('--') and 'USE ' not in stmt:
try: cur.execute(stmt); conn.commit()
except Exception as e: print(f'DDL WARN: {e}')
print('DDL done')
# === 管理员 ===
admin_id = uid()
cur.execute("INSERT INTO sys_user (id, username, password, real_name, email, phone, post, status) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)",
(admin_id, 'admin', '$2b$10$ffAZHF6lmUuNV6OJITADXeduD5mMTS0.7kElPI7zno2zGn/RF5uC6', '管理员', 'admin@mokee.com', '13800000000', '管理员', 1))
# === 系统 ===
test_sid = uid()
gw_sid = uid()
cur.execute("INSERT INTO sys_system (id,system_code,system_name,front_url,backend_url,gateway_url,status,description) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)",
(test_sid, 'test', '测试系统', 'http://127.0.0.1:5001', 'http://127.0.0.1:9000', 'http://127.0.0.1:9000/test', 1, '测试用业务系统'))
cur.execute("INSERT INTO sys_system (id,system_code,system_name,front_url,backend_url,gateway_url,icon,sort_order,status,description,doc_token) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)",
(gw_sid, 'gateway', '网关管理平台', 'http://127.0.0.1:5001', 'http://127.0.0.1:9000', 'http://127.0.0.1:9000/gateway', '', 0, 1, '统一登录网关管理后台', 'gateway1234567890'))
# === 绑定系统 ===
cur.execute("INSERT INTO sys_user_system (id,user_id,system_id) VALUES (%s,%s,%s)", (uid(), admin_id, test_sid))
cur.execute("INSERT INTO sys_user_system (id,user_id,system_id) VALUES (%s,%s,%s)", (uid(), admin_id, gw_sid))
# === 角色 ===
test_admin_role = uid()
test_user_role = uid()
gw_super_admin = uid()
gw_admin_role = uid()
cur.execute("INSERT INTO sys_role (id,system_id,role_name,role_code,description,status) VALUES (%s,%s,%s,%s,%s,%s)", (test_admin_role, test_sid, '管理员', 'admin', '系统管理员', 1))
cur.execute("INSERT INTO sys_role (id,system_id,role_name,role_code,description,status) VALUES (%s,%s,%s,%s,%s,%s)", (test_user_role, test_sid, '普通用户', 'user', '普通用户', 1))
cur.execute("INSERT INTO sys_role (id,system_id,role_name,role_code,description,status) VALUES (%s,%s,%s,%s,%s,%s)", (gw_super_admin, gw_sid, '超级管理员', 'super_admin', '网关平台超级管理员', 1))
cur.execute("INSERT INTO sys_role (id,system_id,role_name,role_code,description,status) VALUES (%s,%s,%s,%s,%s,%s)", (gw_admin_role, gw_sid, '普通管理员', 'admin', '网关平台普通管理员', 1))
# === 用户角色 ===
cur.execute("INSERT INTO sys_user_role (id,user_id,role_id) VALUES (%s,%s,%s)", (uid(), admin_id, test_admin_role))
cur.execute("INSERT INTO sys_user_role (id,user_id,role_id) VALUES (%s,%s,%s)", (uid(), admin_id, gw_super_admin))
# === 测试系统菜单 ===
m = {}
m['t_sys'] = uid()
m['t_biz'] = uid()
cur.execute("INSERT INTO sys_menu (id,system_id,parent_id,menu_name,menu_path,component,icon,menu_type,sort_order,status) VALUES (%s,%s,'0',%s,%s,%s,%s,1,%s,1)", (m['t_sys'], test_sid, '系统管理', '/system', 'Layout', 'Setting', 1))
cur.execute("INSERT INTO sys_menu (id,system_id,parent_id,menu_name,menu_path,component,icon,menu_type,sort_order,status) VALUES (%s,%s,'0',%s,%s,%s,%s,1,%s,1)", (m['t_biz'], test_sid, '业务管理', '/biz', 'Layout', 'Document', 2))
for nm, path, comp, icon, sort, pid_key in [('用户管理','/system/user','system/user/index','User',1,'t_sys'),('角色管理','/system/role','system/role/index','Avatar',2,'t_sys'),('订单管理','/biz/order','biz/order/index','Tickets',1,'t_biz'),('报表查询','/biz/report','biz/report/index','TrendCharts',2,'t_biz')]:
mid = uid()
m[nm] = mid
cur.execute("INSERT INTO sys_menu (id,system_id,parent_id,menu_name,menu_path,component,icon,menu_type,sort_order,status) VALUES (%s,%s,%s,%s,%s,%s,%s,2,%s,1)", (mid, test_sid, m[pid_key], nm, path, comp, icon, sort))
# 角色绑定菜单
cur.execute(f"INSERT INTO sys_role_menu (id,role_id,menu_id) SELECT REPLACE(UUID(),'-',''), '{test_admin_role}', id FROM sys_menu WHERE system_id='{test_sid}'")
# === Gateway 菜单 ===
gm = {}
for nm, path, comp, icon, sort, mtype in [('首页','/admin/dashboard','','HomeFilled',1,1),('系统管理',None,'','Monitor',2,1),('用户权限',None,'','User',3,1),('日志审计',None,'','Notebook',4,1)]:
mid = uid(); gm[nm] = mid
cur.execute("INSERT INTO sys_menu (id,system_id,parent_id,menu_name,menu_path,component,icon,menu_type,sort_order,status) VALUES (%s,%s,'0',%s,%s,%s,%s,%s,%s,1)", (mid, gw_sid, nm, path, comp, icon, mtype, sort))
for nm, path, comp, icon, sort, pkey, mtype in [
('系统列表','/admin/system','','List',1,'系统管理',2), ('接口管理','/admin/api','','Link',2,'系统管理',2), ('数据字典','/admin/dict','','Collection',3,'系统管理',2),
('用户管理','/admin/user','','UserFilled',1,'用户权限',2), ('角色管理','/admin/role','','Avatar',2,'用户权限',2), ('菜单管理','/admin/menu','','Menu',3,'用户权限',2),
('登录日志','/admin/log/login','','Document',1,'日志审计',2), ('操作日志','/admin/log/operation','','Tickets',2,'日志审计',2), ('Token日志','/admin/log/token','','Key',3,'日志审计',2)]:
mid = uid(); gm[nm] = mid
cur.execute("INSERT INTO sys_menu (id,system_id,parent_id,menu_name,menu_path,component,icon,menu_type,sort_order,status) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,1)", (mid, gw_sid, gm[pkey], nm, path, comp, icon, mtype, sort))
# 按钮权限
for pid_key, label, perm, sort in [
('系统列表','新增系统','system:system:add',1), ('系统列表','编辑系统','system:system:edit',2), ('系统列表','删除系统','system:system:delete',3),
('用户管理','新增用户','system:user:add',1), ('用户管理','编辑用户','system:user:edit',2), ('用户管理','删除用户','system:user:delete',3),
('角色管理','新增角色','system:role:add',1), ('角色管理','编辑角色','system:role:edit',2), ('角色管理','删除角色','system:role:delete',3), ('角色管理','分配菜单','system:role:assignMenu',4),
('菜单管理','新增菜单','system:menu:add',1), ('菜单管理','编辑菜单','system:menu:edit',2), ('菜单管理','删除菜单','system:menu:delete',3),
('接口管理','新增接口','system:api:add',1), ('接口管理','编辑接口','system:api:edit',2), ('接口管理','删除接口','system:api:delete',3),
('数据字典','新增字典','system:dict:add',1), ('数据字典','编辑字典','system:dict:edit',2), ('数据字典','删除字典','system:dict:delete',3)]:
cur.execute("INSERT INTO sys_menu (id,system_id,parent_id,menu_name,menu_path,component,icon,menu_type,sort_order,status,permission) VALUES (%s,%s,%s,%s,NULL,NULL,'',3,%s,1,%s)", (uid(), gw_sid, gm[pid_key], label, sort, perm))
# 角色菜单绑定
cur.execute(f"INSERT INTO sys_role_menu (id,role_id,menu_id) SELECT REPLACE(UUID(),'-',''), '{gw_super_admin}', id FROM sys_menu WHERE system_id='{gw_sid}'")
cur.execute(f"INSERT INTO sys_role_menu (id,role_id,menu_id) SELECT REPLACE(UUID(),'-',''), '{gw_admin_role}', id FROM sys_menu WHERE system_id='{gw_sid}'")
# 放行接口
for sid in [test_sid, gw_sid]:
for method, path in [('GET','/zgapi/v1/admin/**'),('POST','/zgapi/v1/admin/**'),('PUT','/zgapi/v1/admin/**'),('DELETE','/zgapi/v1/admin/**'),('GET','/zgapi/v1/auth/**'),('POST','/zgapi/v1/auth/**'),('PUT','/zgapi/v1/auth/**')]:
cur.execute("INSERT INTO sys_api (id,system_id,api_path,api_method,api_name,status) VALUES (%s,%s,%s,%s,'放行接口',1)", (uid(), sid, path, method))
conn.commit()
# 验证
for tbl in ['sys_system','sys_user','sys_role','sys_menu','sys_api','sys_role_menu','sys_user_system','sys_user_role']:
cur.execute(f'SELECT COUNT(*) FROM {tbl}')
print(f'{tbl}: {cur.fetchone()[0]}')
cur.execute('SELECT id, username FROM sys_user LIMIT 1')
r = cur.fetchone()
print(f'管理员: {r[1]}, ID长度: {len(r[0])}')
cur.close(); conn.close()
print('QA DB INIT DONE')

View File

@@ -0,0 +1,34 @@
-- PROD数据库: 添加邮件发送记录表和Token日志表
-- 与 QA 的 qa_ddl.sql 对齐
USE mokeegateway;
CREATE TABLE IF NOT EXISTS sys_email_log (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
to_address VARCHAR(256) NOT NULL COMMENT '收件人',
subject VARCHAR(512) NOT NULL COMMENT '主题',
content TEXT COMMENT '邮件内容',
content_type VARCHAR(16) NOT NULL DEFAULT 'html' COMMENT '格式 html/text',
status TINYINT NOT NULL DEFAULT 0 COMMENT '0-失败 1-成功',
error_msg VARCHAR(1024) DEFAULT NULL COMMENT '错误信息',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '发送时间',
PRIMARY KEY (id),
KEY idx_created_at (created_at),
KEY idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='邮件发送记录表';
CREATE TABLE IF NOT EXISTS sys_open_token_log (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
system_id VARCHAR(64) DEFAULT NULL COMMENT '系统ID',
system_code VARCHAR(64) NOT NULL COMMENT '系统编码',
token_id VARCHAR(64) NOT NULL COMMENT 'Token唯一ID',
token_preview VARCHAR(64) DEFAULT NULL COMMENT 'Token预览',
acquired_at DATETIME DEFAULT NULL COMMENT '获取时间',
consumed TINYINT NOT NULL DEFAULT 0 COMMENT '0-未消费 1-已消费',
consumed_at DATETIME DEFAULT NULL COMMENT '消费时间',
consume_api VARCHAR(256) DEFAULT NULL COMMENT '消费接口',
consume_ip VARCHAR(64) DEFAULT NULL COMMENT '消费IP',
PRIMARY KEY (id),
KEY idx_token_id (token_id),
KEY idx_system_code (system_code),
KEY idx_acquired_at (acquired_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='开放API Token日志表';

View File

@@ -0,0 +1,4 @@
-- PROD sys_file 兼容列 — 旧jar过渡期需要
-- 新jar部署后可删除此列
ALTER TABLE sys_file ADD COLUMN file_url VARCHAR(512) DEFAULT NULL COMMENT 'file access path (deprecated, new code uses file_data)' AFTER file_name;
SHOW COLUMNS FROM sys_file;

View File

@@ -0,0 +1,65 @@
-- PROD 添加按钮权限菜单
-- 依赖: 网关系统已存在, 子菜单ID通过子查询获取
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增系统', 3, 1, 1, 'system:system:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='系统列表';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑系统', 3, 2, 1, 'system:system:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='系统列表';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除系统', 3, 3, 1, 'system:system:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='系统列表';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增用户', 3, 1, 1, 'system:user:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='用户管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑用户', 3, 2, 1, 'system:user:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='用户管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除用户', 3, 3, 1, 'system:user:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='用户管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增角色', 3, 1, 1, 'system:role:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='角色管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑角色', 3, 2, 1, 'system:role:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='角色管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除角色', 3, 3, 1, 'system:role:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='角色管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '分配菜单', 3, 4, 1, 'system:role:assignMenu'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='角色管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增菜单', 3, 1, 1, 'system:menu:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='菜单管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑菜单', 3, 2, 1, 'system:menu:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='菜单管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除菜单', 3, 3, 1, 'system:menu:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='菜单管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增接口', 3, 1, 1, 'system:api:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='接口管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑接口', 3, 2, 1, 'system:api:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='接口管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除接口', 3, 3, 1, 'system:api:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='接口管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增字典', 3, 1, 1, 'system:dict:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='数据字典';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑字典', 3, 2, 1, 'system:dict:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='数据字典';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除字典', 3, 3, 1, 'system:dict:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='数据字典';
-- 将按钮权限分配给超级管理员
INSERT IGNORE INTO sys_role_menu (id, role_id, menu_id)
SELECT REPLACE(UUID(),'-',''), r.id, m.id
FROM sys_role r, sys_menu m, sys_system s
WHERE r.role_code='super_admin' AND r.system_id=s.id AND m.system_id=s.id AND s.system_code='gateway' AND m.menu_type=3;

33
sql/prod_align_qa.sql Normal file
View File

@@ -0,0 +1,33 @@
-- PROD数据库对齐QA结构
USE mokeegateway;
-- 1. sys_system: 补充 gateway_url 列, 统一 doc_token 长度
ALTER TABLE sys_system ADD COLUMN gateway_url VARCHAR(256) NOT NULL DEFAULT '' AFTER backend_url;
ALTER TABLE sys_system MODIFY doc_token VARCHAR(128) DEFAULT NULL;
-- 去重约束
ALTER TABLE sys_system ADD UNIQUE KEY uk_gateway_url (gateway_url);
-- 更新现有数据: 给每个系统一个不同的 gateway_url
UPDATE sys_system SET gateway_url = CONCAT('http://127.0.0.1:9000/', system_code) WHERE gateway_url = '';
-- 2. sys_file: 重建为新结构(文件二进制存入数据库)
DROP TABLE IF EXISTS sys_file;
CREATE TABLE sys_file (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
system_id VARCHAR(64) DEFAULT NULL COMMENT '所属系统ID',
file_name VARCHAR(256) NOT NULL COMMENT '原始文件名',
file_type VARCHAR(64) DEFAULT 'other' COMMENT '文件类型(icon/avatar/doc/other)',
file_size BIGINT DEFAULT 0 COMMENT '文件大小(字节)',
mime_type VARCHAR(128) DEFAULT NULL COMMENT 'MIME类型',
md5 VARCHAR(64) DEFAULT NULL COMMENT '文件MD5摘要',
upload_user_id VARCHAR(64) DEFAULT NULL COMMENT '上传用户ID',
file_data LONGBLOB COMMENT '文件二进制数据',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
PRIMARY KEY (id),
INDEX idx_system_id (system_id),
INDEX idx_file_type (file_type),
INDEX idx_upload_user_id (upload_user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文件表';
-- 3. sys_login_log: 统一列宽
ALTER TABLE sys_login_log MODIFY browser VARCHAR(64) DEFAULT NULL;
ALTER TABLE sys_login_log MODIFY os VARCHAR(64) DEFAULT NULL;

View File

@@ -0,0 +1,3 @@
-- 生产环境新增列
ALTER TABLE sys_login_log ADD COLUMN real_name VARCHAR(64) DEFAULT NULL COMMENT '用户真实姓名' AFTER username;
ALTER TABLE sys_operation_log ADD COLUMN response_body TEXT DEFAULT NULL COMMENT '接口返回报文截断至2000字符' AFTER error_msg;

88
sql/prod_fix_data.sql Normal file
View File

@@ -0,0 +1,88 @@
-- PROD 数据修复: 清理 UUID 迁移残留 + 同步 QA 结构
USE mokeegateway;
-- 1. 清理孤儿关联记录(user_id 还是旧 BIGINT 值, 已无对应真实用户)
DELETE FROM sys_user_system WHERE user_id NOT IN (SELECT id FROM sys_user);
DELETE FROM sys_user_role WHERE user_id NOT IN (SELECT id FROM sys_user);
DELETE FROM sys_role_menu WHERE role_id NOT IN (SELECT id FROM sys_role);
DELETE FROM sys_role_menu WHERE menu_id NOT IN (SELECT id FROM sys_menu);
-- 2. 清理多余的孤儿角色(不属于任何现有系统)
DELETE FROM sys_role WHERE system_id NOT IN (SELECT id FROM sys_system);
-- 3. 补充 admin → gateway 系统绑定(如果缺失)
INSERT IGNORE INTO sys_user_system (id, user_id, system_id)
SELECT REPLACE(UUID(),'-',''), u.id, s.id
FROM sys_user u, sys_system s
WHERE u.username='admin' AND s.system_code='gateway';
-- 4. 补充 admin → gateway super_admin 角色(如果缺失)
INSERT IGNORE INTO sys_user_role (id, user_id, role_id)
SELECT REPLACE(UUID(),'-',''), u.id, r.id
FROM sys_user u, sys_role r, sys_system s
WHERE u.username='admin' AND r.role_code='super_admin' AND r.system_id=s.id AND s.system_code='gateway';
-- 5. 补充按钮权限(如果缺失)
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增系统', 3, 1, 1, 'system:system:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='系统列表';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑系统', 3, 2, 1, 'system:system:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='系统列表';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除系统', 3, 3, 1, 'system:system:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='系统列表';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增用户', 3, 1, 1, 'system:user:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='用户管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑用户', 3, 2, 1, 'system:user:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='用户管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除用户', 3, 3, 1, 'system:user:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='用户管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增角色', 3, 1, 1, 'system:role:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='角色管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑角色', 3, 2, 1, 'system:role:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='角色管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除角色', 3, 3, 1, 'system:role:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='角色管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '分配菜单', 3, 4, 1, 'system:role:assignMenu'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='角色管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增菜单', 3, 1, 1, 'system:menu:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='菜单管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑菜单', 3, 2, 1, 'system:menu:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='菜单管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除菜单', 3, 3, 1, 'system:menu:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='菜单管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增接口', 3, 1, 1, 'system:api:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='接口管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑接口', 3, 2, 1, 'system:api:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='接口管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除接口', 3, 3, 1, 'system:api:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='接口管理';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '新增字典', 3, 1, 1, 'system:dict:add'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='数据字典';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '编辑字典', 3, 2, 1, 'system:dict:edit'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='数据字典';
INSERT IGNORE INTO sys_menu (id, system_id, parent_id, menu_name, menu_type, sort_order, status, permission)
SELECT REPLACE(UUID(),'-',''), s.id, m.id, '删除字典', 3, 3, 1, 'system:dict:delete'
FROM sys_system s, sys_menu m WHERE s.system_code='gateway' AND m.system_id=s.id AND m.menu_name='数据字典';
-- 6. 给 super_admin 角色补全所有菜单绑定
INSERT IGNORE INTO sys_role_menu (id, role_id, menu_id)
SELECT REPLACE(UUID(),'-',''), r.id, m.id
FROM sys_role r, sys_menu m, sys_system s
WHERE r.role_code='super_admin' AND r.system_id=s.id AND m.system_id=s.id AND s.system_code='gateway';

View File

@@ -0,0 +1,34 @@
-- ============================================
-- PROD sys_file 表结构迁移
-- 旧结构 → 新结构(文件二进制存入数据库)
-- 执行前请确认 sys_file 表数据已备份(如有)
-- ============================================
USE mokeegateway;
-- 1. 检查当前表结构
-- SELECT COUNT(*) FROM sys_file; -- 如有数据请先备份
-- 2. 重建 sys_file 表(数据为空则直接重建)
DROP TABLE IF EXISTS sys_file;
CREATE TABLE sys_file (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
system_id VARCHAR(64) DEFAULT NULL COMMENT '所属系统ID',
file_name VARCHAR(256) NOT NULL COMMENT '原始文件名',
file_type VARCHAR(64) DEFAULT 'other' COMMENT '文件类型(icon/avatar/doc/other)',
file_size BIGINT DEFAULT 0 COMMENT '文件大小(字节)',
mime_type VARCHAR(128) DEFAULT NULL COMMENT 'MIME类型',
md5 VARCHAR(64) DEFAULT NULL COMMENT '文件MD5摘要',
upload_user_id VARCHAR(64) DEFAULT NULL COMMENT '上传用户ID',
file_data LONGBLOB COMMENT '文件二进制数据',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
PRIMARY KEY (id),
INDEX idx_system_id (system_id),
INDEX idx_file_type (file_type),
INDEX idx_upload_user_id (upload_user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文件表';
-- 验证
SHOW CREATE TABLE sys_file;
SELECT COUNT(*) FROM sys_file;

83
sql/prod_migrate_uuid.sql Normal file
View File

@@ -0,0 +1,83 @@
-- ============================================
-- PROD 数据库: BIGINT → UUID 迁移 (保留数据)
-- 数据库: mokeegateway
-- 执行前务必备份!
-- ============================================
-- 步骤1: 所有表添加 UUID 列
ALTER TABLE sys_system ADD COLUMN uuid_id VARCHAR(64) NOT NULL DEFAULT '' AFTER id;
ALTER TABLE sys_user ADD COLUMN uuid_id VARCHAR(64) NOT NULL DEFAULT '' AFTER id;
ALTER TABLE sys_role ADD COLUMN uuid_id VARCHAR(64) NOT NULL DEFAULT '' AFTER id;
ALTER TABLE sys_menu ADD COLUMN uuid_id VARCHAR(64) NOT NULL DEFAULT '' AFTER id;
ALTER TABLE sys_api ADD COLUMN uuid_id VARCHAR(64) NOT NULL DEFAULT '' AFTER id;
ALTER TABLE sys_dict ADD COLUMN uuid_id VARCHAR(64) NOT NULL DEFAULT '' AFTER id;
ALTER TABLE sys_file ADD COLUMN uuid_id VARCHAR(64) NOT NULL DEFAULT '' AFTER id;
ALTER TABLE sys_user_system ADD COLUMN uuid_id VARCHAR(64) NOT NULL DEFAULT '' AFTER id;
ALTER TABLE sys_user_role ADD COLUMN uuid_id VARCHAR(64) NOT NULL DEFAULT '' AFTER id;
ALTER TABLE sys_role_menu ADD COLUMN uuid_id VARCHAR(64) NOT NULL DEFAULT '' AFTER id;
ALTER TABLE sys_login_log ADD COLUMN uuid_id VARCHAR(64) NOT NULL DEFAULT '' AFTER id;
ALTER TABLE sys_operation_log ADD COLUMN uuid_id VARCHAR(64) NOT NULL DEFAULT '' AFTER id;
-- 步骤2: 生成 UUID
UPDATE sys_system SET uuid_id = REPLACE(UUID(),'-','');
UPDATE sys_user SET uuid_id = REPLACE(UUID(),'-','');
UPDATE sys_role SET uuid_id = REPLACE(UUID(),'-','');
UPDATE sys_menu SET uuid_id = REPLACE(UUID(),'-','');
UPDATE sys_api SET uuid_id = REPLACE(UUID(),'-','');
UPDATE sys_dict SET uuid_id = REPLACE(UUID(),'-','');
UPDATE sys_file SET uuid_id = REPLACE(UUID(),'-','');
UPDATE sys_user_system SET uuid_id = REPLACE(UUID(),'-','');
UPDATE sys_user_role SET uuid_id = REPLACE(UUID(),'-','');
UPDATE sys_role_menu SET uuid_id = REPLACE(UUID(),'-','');
UPDATE sys_login_log SET uuid_id = REPLACE(UUID(),'-','');
UPDATE sys_operation_log SET uuid_id = REPLACE(UUID(),'-','');
-- 步骤3: 更新所有外键引用
UPDATE sys_api a JOIN sys_system s ON a.system_id = s.id SET a.system_id = s.uuid_id;
UPDATE sys_role r JOIN sys_system s ON r.system_id = s.id SET r.system_id = s.uuid_id;
UPDATE sys_menu m JOIN sys_system s ON m.system_id = s.id SET m.system_id = s.uuid_id;
UPDATE sys_user_system us JOIN sys_system s ON us.system_id = s.id SET us.system_id = s.uuid_id;
UPDATE sys_user_system us JOIN sys_user u ON us.user_id = u.id SET us.user_id = u.uuid_id;
UPDATE sys_user_role ur JOIN sys_user u ON ur.user_id = u.id SET ur.user_id = u.uuid_id;
UPDATE sys_user_role ur JOIN sys_role r ON ur.role_id = r.id SET ur.role_id = r.uuid_id;
UPDATE sys_role_menu rm JOIN sys_role r ON rm.role_id = r.id SET rm.role_id = r.uuid_id;
UPDATE sys_role_menu rm JOIN sys_menu m ON rm.menu_id = m.id SET rm.menu_id = m.uuid_id;
UPDATE sys_login_log l JOIN sys_user u ON l.user_id = u.id SET l.user_id = u.uuid_id;
UPDATE sys_login_log l JOIN sys_system s ON l.system_id = s.id SET l.system_id = s.uuid_id;
UPDATE sys_operation_log o JOIN sys_user u ON o.user_id = u.id SET o.user_id = u.uuid_id;
UPDATE sys_operation_log o JOIN sys_system s ON o.system_id = s.id SET o.system_id = s.uuid_id;
-- menu parent_id 自引用
UPDATE sys_menu child JOIN sys_menu parent ON child.parent_id = parent.id SET child.parent_id = parent.uuid_id WHERE child.parent_id != '0';
-- 步骤4: 删除旧主键, 切换到 UUID 主键
ALTER TABLE sys_system DROP PRIMARY KEY, DROP COLUMN id, CHANGE uuid_id id VARCHAR(64) NOT NULL, ADD PRIMARY KEY (id);
ALTER TABLE sys_user DROP PRIMARY KEY, DROP COLUMN id, CHANGE uuid_id id VARCHAR(64) NOT NULL, ADD PRIMARY KEY (id);
ALTER TABLE sys_role DROP PRIMARY KEY, DROP COLUMN id, CHANGE uuid_id id VARCHAR(64) NOT NULL, ADD PRIMARY KEY (id);
ALTER TABLE sys_menu DROP PRIMARY KEY, DROP COLUMN id, CHANGE uuid_id id VARCHAR(64) NOT NULL, ADD PRIMARY KEY (id);
ALTER TABLE sys_api DROP PRIMARY KEY, DROP COLUMN id, CHANGE uuid_id id VARCHAR(64) NOT NULL, ADD PRIMARY KEY (id);
ALTER TABLE sys_dict DROP PRIMARY KEY, DROP COLUMN id, CHANGE uuid_id id VARCHAR(64) NOT NULL, ADD PRIMARY KEY (id);
ALTER TABLE sys_file DROP PRIMARY KEY, DROP COLUMN id, CHANGE uuid_id id VARCHAR(64) NOT NULL, ADD PRIMARY KEY (id);
ALTER TABLE sys_user_system DROP PRIMARY KEY, DROP COLUMN id, CHANGE uuid_id id VARCHAR(64) NOT NULL, ADD PRIMARY KEY (id);
ALTER TABLE sys_user_role DROP PRIMARY KEY, DROP COLUMN id, CHANGE uuid_id id VARCHAR(64) NOT NULL, ADD PRIMARY KEY (id);
ALTER TABLE sys_role_menu DROP PRIMARY KEY, DROP COLUMN id, CHANGE uuid_id id VARCHAR(64) NOT NULL, ADD PRIMARY KEY (id);
ALTER TABLE sys_login_log DROP PRIMARY KEY, DROP COLUMN id, CHANGE uuid_id id VARCHAR(64) NOT NULL, ADD PRIMARY KEY (id);
ALTER TABLE sys_operation_log DROP PRIMARY KEY, DROP COLUMN id, CHANGE uuid_id id VARCHAR(64) NOT NULL, ADD PRIMARY KEY (id);
-- 步骤5: 调整外键类型为 VARCHAR(64)
ALTER TABLE sys_api MODIFY system_id VARCHAR(64) NOT NULL;
ALTER TABLE sys_role MODIFY system_id VARCHAR(64) NOT NULL;
ALTER TABLE sys_menu MODIFY system_id VARCHAR(64) NOT NULL, MODIFY parent_id VARCHAR(64) NOT NULL DEFAULT '0';
ALTER TABLE sys_user_system MODIFY user_id VARCHAR(64) NOT NULL, MODIFY system_id VARCHAR(64) NOT NULL;
ALTER TABLE sys_user_role MODIFY user_id VARCHAR(64) NOT NULL, MODIFY role_id VARCHAR(64) NOT NULL;
ALTER TABLE sys_role_menu MODIFY role_id VARCHAR(64) NOT NULL, MODIFY menu_id VARCHAR(64) NOT NULL;
ALTER TABLE sys_login_log MODIFY user_id VARCHAR(64), MODIFY system_id VARCHAR(64);
ALTER TABLE sys_operation_log MODIFY user_id VARCHAR(64), MODIFY system_id VARCHAR(64);
ALTER TABLE sys_file MODIFY upload_by VARCHAR(64);
ALTER TABLE sys_system MODIFY created_by VARCHAR(64), MODIFY updated_by VARCHAR(64);
ALTER TABLE sys_role MODIFY created_by VARCHAR(64), MODIFY updated_by VARCHAR(64);
-- 步骤6: 重建唯一索引 (FK列类型变更后需要重建)
ALTER TABLE sys_api DROP INDEX uk_system_path_method, ADD UNIQUE KEY uk_system_path_method (system_id, api_path, api_method);
ALTER TABLE sys_role DROP INDEX uk_system_role_code, ADD UNIQUE KEY uk_system_role_code (system_id, role_code);
-- 完成

128
sql/qa_data.sql Normal file
View File

@@ -0,0 +1,128 @@
-- QA 初始化数据 (UUID直写, 无变量)
USE mokeegatewayqa;
-- 管理员 (密码: admin123, BCrypt)
INSERT INTO sys_user (id, username, password, real_name, email, phone, post, status)
VALUES (REPLACE(UUID(),'-',''), 'admin', '$2b$10$ffAZHF6lmUuNV6OJITADXeduD5mMTS0.7kElPI7zno2zGn/RF5uC6', '管理员', 'admin@mokee.com', '13800000000', '管理员', 1);
-- 测试系统
INSERT INTO sys_system (id, system_code, system_name, front_url, backend_url, gateway_url, status, description)
VALUES (REPLACE(UUID(),'-',''), 'test', '测试系统', 'http://127.0.0.1:5001', 'http://127.0.0.1:9000', 'http://127.0.0.1:9000/test', 1, '测试用业务系统');
-- Gateway 系统
INSERT INTO sys_system (id, system_code, system_name, front_url, backend_url, gateway_url, icon, sort_order, status, description, doc_token)
VALUES (REPLACE(UUID(),'-',''), 'gateway', '网关管理平台', 'http://127.0.0.1:5001', 'http://127.0.0.1:9000', 'http://127.0.0.1:9000/gateway', '', 0, 1, '统一登录网关管理后台', 'gateway1234567890');
-- 查询已插入的ID
SELECT id INTO @uid FROM sys_user WHERE username='admin';
SELECT id INTO @test_sid FROM sys_system WHERE system_code='test';
SELECT id INTO @gw_sid FROM sys_system WHERE system_code='gateway';
-- 管理员绑定两个系统
INSERT INTO sys_user_system (id, user_id, system_id) VALUES (REPLACE(UUID(),'-',''), @uid, @test_sid);
INSERT INTO sys_user_system (id, user_id, system_id) VALUES (REPLACE(UUID(),'-',''), @uid, @gw_sid);
-- 测试系统角色
INSERT INTO sys_role (id, system_id, role_name, role_code, description, status) VALUES (REPLACE(UUID(),'-',''), @test_sid, '管理员', 'admin', '系统管理员', 1);
INSERT INTO sys_role (id, system_id, role_name, role_code, description, status) VALUES (REPLACE(UUID(),'-',''), @test_sid, '普通用户', 'user', '普通用户', 1);
-- Gateway 系统角色
INSERT INTO sys_role (id, system_id, role_name, role_code, description, status) VALUES (REPLACE(UUID(),'-',''), @gw_sid, '超级管理员', 'super_admin', '网关平台超级管理员', 1);
INSERT INTO sys_role (id, system_id, role_name, role_code, description, status) VALUES (REPLACE(UUID(),'-',''), @gw_sid, '普通管理员', 'admin', '网关平台普通管理员', 1);
-- 查询角色ID
SELECT id INTO @test_admin_role FROM sys_role WHERE system_id=@test_sid AND role_code='admin';
SELECT id INTO @gw_super_admin FROM sys_role WHERE system_id=@gw_sid AND role_code='super_admin';
-- 分配角色给管理员
INSERT INTO sys_user_role (id, user_id, role_id) VALUES (REPLACE(UUID(),'-',''), @uid, @test_admin_role);
INSERT INTO sys_user_role (id, user_id, role_id) VALUES (REPLACE(UUID(),'-',''), @uid, @gw_super_admin);
-- 测试系统菜单 (6个)
INSERT INTO sys_menu (id, system_id, parent_id, menu_name, menu_path, component, icon, menu_type, sort_order, status) VALUES
(REPLACE(UUID(),'-',''), @test_sid, '0', '系统管理', '/system', 'Layout', 'Setting', 1, 1, 1),
(REPLACE(UUID(),'-',''), @test_sid, '0', '业务管理', '/biz', 'Layout', 'Document', 1, 2, 1);
SELECT id INTO @m1 FROM sys_menu WHERE system_id=@test_sid AND menu_name='系统管理' LIMIT 1;
SELECT id INTO @m2 FROM sys_menu WHERE system_id=@test_sid AND menu_name='业务管理' LIMIT 1;
INSERT INTO sys_menu (id, system_id, parent_id, menu_name, menu_path, component, icon, menu_type, sort_order, status) VALUES
(REPLACE(UUID(),'-',''), @test_sid, @m1, '用户管理', '/system/user', 'system/user/index', 'User', 2, 1, 1),
(REPLACE(UUID(),'-',''), @test_sid, @m1, '角色管理', '/system/role', 'system/role/index', 'Avatar', 2, 2, 1),
(REPLACE(UUID(),'-',''), @test_sid, @m2, '订单管理', '/biz/order', 'biz/order/index', 'Tickets', 2, 1, 1),
(REPLACE(UUID(),'-',''), @test_sid, @m2, '报表查询', '/biz/report', 'biz/report/index', 'TrendCharts', 2, 2, 1);
-- 角色绑定菜单
INSERT INTO sys_role_menu (id, role_id, menu_id) SELECT REPLACE(UUID(),'-',''), @test_admin_role, id FROM sys_menu WHERE system_id=@test_sid;
-- Gateway 顶级目录 (4个)
INSERT INTO sys_menu (id, system_id, parent_id, menu_name, menu_path, component, icon, menu_type, sort_order, status) VALUES
(REPLACE(UUID(),'-',''), @gw_sid, '0', '首页', '/admin/dashboard', '', 'HomeFilled', 1, 1, 1),
(REPLACE(UUID(),'-',''), @gw_sid, '0', '系统管理', NULL, '', 'Monitor', 1, 2, 1),
(REPLACE(UUID(),'-',''), @gw_sid, '0', '用户权限', NULL, '', 'User', 1, 3, 1),
(REPLACE(UUID(),'-',''), @gw_sid, '0', '日志审计', NULL, '', 'Notebook', 1, 4, 1);
SELECT id INTO @g_sys FROM sys_menu WHERE system_id=@gw_sid AND menu_name='系统管理' LIMIT 1;
SELECT id INTO @g_usr FROM sys_menu WHERE system_id=@gw_sid AND menu_name='用户权限' LIMIT 1;
SELECT id INTO @g_log FROM sys_menu WHERE system_id=@gw_sid AND menu_name='日志审计' LIMIT 1;
-- 子菜单
INSERT INTO sys_menu (id, system_id, parent_id, menu_name, menu_path, component, icon, menu_type, sort_order, status) VALUES
(REPLACE(UUID(),'-',''), @gw_sid, @g_sys, '系统列表', '/admin/system', '', 'List', 2, 1, 1),
(REPLACE(UUID(),'-',''), @gw_sid, @g_sys, '接口管理', '/admin/api', '', 'Link', 2, 2, 1),
(REPLACE(UUID(),'-',''), @gw_sid, @g_sys, '数据字典', '/admin/dict', '', 'Collection', 2, 3, 1),
(REPLACE(UUID(),'-',''), @gw_sid, @g_usr, '用户管理', '/admin/user', '', 'UserFilled', 2, 1, 1),
(REPLACE(UUID(),'-',''), @gw_sid, @g_usr, '角色管理', '/admin/role', '', 'Avatar', 2, 2, 1),
(REPLACE(UUID(),'-',''), @gw_sid, @g_usr, '菜单管理', '/admin/menu', '', 'Menu', 2, 3, 1),
(REPLACE(UUID(),'-',''), @gw_sid, @g_log, '登录日志', '/admin/log/login', '', 'Document', 2, 1, 1),
(REPLACE(UUID(),'-',''), @gw_sid, @g_log, '操作日志', '/admin/log/operation', '', 'Tickets', 2, 2, 1),
(REPLACE(UUID(),'-',''), @gw_sid, @g_log, 'Token日志', '/admin/log/token', '', 'Key', 2, 3, 1);
-- 查询子菜单ID 准备加按钮权限
SELECT id INTO @sys_list FROM sys_menu WHERE system_id=@gw_sid AND menu_name='系统列表' LIMIT 1;
SELECT id INTO @usr_list FROM sys_menu WHERE system_id=@gw_sid AND menu_name='用户管理' LIMIT 1;
SELECT id INTO @role_list FROM sys_menu WHERE system_id=@gw_sid AND menu_name='角色管理' LIMIT 1;
SELECT id INTO @menu_list FROM sys_menu WHERE system_id=@gw_sid AND menu_name='菜单管理' LIMIT 1;
SELECT id INTO @api_list FROM sys_menu WHERE system_id=@gw_sid AND menu_name='接口管理' LIMIT 1;
SELECT id INTO @dict_list FROM sys_menu WHERE system_id=@gw_sid AND menu_name='数据字典' LIMIT 1;
-- 按钮权限 (menu_type=3)
INSERT INTO sys_menu (id, system_id, parent_id, menu_name, menu_path, component, icon, menu_type, sort_order, status, permission) VALUES
(REPLACE(UUID(),'-',''), @gw_sid, @sys_list, '新增系统', NULL, NULL, '', 3, 1, 1, 'system:system:add'),
(REPLACE(UUID(),'-',''), @gw_sid, @sys_list, '编辑系统', NULL, NULL, '', 3, 2, 1, 'system:system:edit'),
(REPLACE(UUID(),'-',''), @gw_sid, @sys_list, '删除系统', NULL, NULL, '', 3, 3, 1, 'system:system:delete'),
(REPLACE(UUID(),'-',''), @gw_sid, @usr_list, '新增用户', NULL, NULL, '', 3, 1, 1, 'system:user:add'),
(REPLACE(UUID(),'-',''), @gw_sid, @usr_list, '编辑用户', NULL, NULL, '', 3, 2, 1, 'system:user:edit'),
(REPLACE(UUID(),'-',''), @gw_sid, @usr_list, '删除用户', NULL, NULL, '', 3, 3, 1, 'system:user:delete'),
(REPLACE(UUID(),'-',''), @gw_sid, @role_list, '新增角色', NULL, NULL, '', 3, 1, 1, 'system:role:add'),
(REPLACE(UUID(),'-',''), @gw_sid, @role_list, '编辑角色', NULL, NULL, '', 3, 2, 1, 'system:role:edit'),
(REPLACE(UUID(),'-',''), @gw_sid, @role_list, '删除角色', NULL, NULL, '', 3, 3, 1, 'system:role:delete'),
(REPLACE(UUID(),'-',''), @gw_sid, @role_list, '分配菜单', NULL, NULL, '', 3, 4, 1, 'system:role:assignMenu'),
(REPLACE(UUID(),'-',''), @gw_sid, @menu_list, '新增菜单', NULL, NULL, '', 3, 1, 1, 'system:menu:add'),
(REPLACE(UUID(),'-',''), @gw_sid, @menu_list, '编辑菜单', NULL, NULL, '', 3, 2, 1, 'system:menu:edit'),
(REPLACE(UUID(),'-',''), @gw_sid, @menu_list, '删除菜单', NULL, NULL, '', 3, 3, 1, 'system:menu:delete'),
(REPLACE(UUID(),'-',''), @gw_sid, @api_list, '新增接口', NULL, NULL, '', 3, 1, 1, 'system:api:add'),
(REPLACE(UUID(),'-',''), @gw_sid, @api_list, '编辑接口', NULL, NULL, '', 3, 2, 1, 'system:api:edit'),
(REPLACE(UUID(),'-',''), @gw_sid, @api_list, '删除接口', NULL, NULL, '', 3, 3, 1, 'system:api:delete'),
(REPLACE(UUID(),'-',''), @gw_sid, @dict_list, '新增字典', NULL, NULL, '', 3, 1, 1, 'system:dict:add'),
(REPLACE(UUID(),'-',''), @gw_sid, @dict_list, '编辑字典', NULL, NULL, '', 3, 2, 1, 'system:dict:edit'),
(REPLACE(UUID(),'-',''), @gw_sid, @dict_list, '删除字典', NULL, NULL, '', 3, 3, 1, 'system:dict:delete');
-- 角色绑定所有菜单(含按钮)
INSERT INTO sys_role_menu (id, role_id, menu_id) SELECT REPLACE(UUID(),'-',''), @gw_super_admin, id FROM sys_menu WHERE system_id=@gw_sid;
INSERT INTO sys_role_menu (id, role_id, menu_id) SELECT REPLACE(UUID(),'-',''), (SELECT id FROM sys_role WHERE system_id=@gw_sid AND role_code='admin'), id FROM sys_menu WHERE system_id=@gw_sid;
-- 放行接口 (14条)
INSERT INTO sys_api (id, system_id, api_path, api_method, api_name, status) VALUES
(REPLACE(UUID(),'-',''), @test_sid, '/zgapi/v1/admin/**', 'GET', '放行接口', 1),
(REPLACE(UUID(),'-',''), @test_sid, '/zgapi/v1/admin/**', 'POST', '放行接口', 1),
(REPLACE(UUID(),'-',''), @test_sid, '/zgapi/v1/admin/**', 'PUT', '放行接口', 1),
(REPLACE(UUID(),'-',''), @test_sid, '/zgapi/v1/admin/**', 'DELETE', '放行接口', 1),
(REPLACE(UUID(),'-',''), @test_sid, '/zgapi/v1/auth/**', 'GET', '放行接口', 1),
(REPLACE(UUID(),'-',''), @test_sid, '/zgapi/v1/auth/**', 'POST', '放行接口', 1),
(REPLACE(UUID(),'-',''), @test_sid, '/zgapi/v1/auth/**', 'PUT', '放行接口', 1),
(REPLACE(UUID(),'-',''), @gw_sid, '/zgapi/v1/admin/**', 'GET', '放行接口', 1),
(REPLACE(UUID(),'-',''), @gw_sid, '/zgapi/v1/admin/**', 'POST', '放行接口', 1),
(REPLACE(UUID(),'-',''), @gw_sid, '/zgapi/v1/admin/**', 'PUT', '放行接口', 1),
(REPLACE(UUID(),'-',''), @gw_sid, '/zgapi/v1/admin/**', 'DELETE', '放行接口', 1),
(REPLACE(UUID(),'-',''), @gw_sid, '/zgapi/v1/auth/**', 'GET', '放行接口', 1),
(REPLACE(UUID(),'-',''), @gw_sid, '/zgapi/v1/auth/**', 'POST', '放行接口', 1),
(REPLACE(UUID(),'-',''), @gw_sid, '/zgapi/v1/auth/**', 'PUT', '放行接口', 1);

226
sql/qa_ddl.sql Normal file
View File

@@ -0,0 +1,226 @@
-- ============================================
-- QA 数据库 DDL (UUID 版本, 12张表)
-- 所有主键和外键均为 VARCHAR(64)
-- ============================================
USE mokeegatewayqa;
CREATE TABLE IF NOT EXISTS sys_system (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
system_code VARCHAR(64) NOT NULL,
system_name VARCHAR(128) NOT NULL,
front_url VARCHAR(256) NOT NULL,
backend_url VARCHAR(256) NOT NULL,
gateway_url VARCHAR(256) NOT NULL,
icon VARCHAR(512) DEFAULT NULL,
sort_order INT DEFAULT 0,
status TINYINT NOT NULL DEFAULT 1,
description VARCHAR(512) DEFAULT NULL,
doc_token VARCHAR(128) DEFAULT NULL,
created_by VARCHAR(64) DEFAULT NULL,
updated_by VARCHAR(64) DEFAULT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
is_deleted TINYINT NOT NULL DEFAULT 0,
PRIMARY KEY (id),
-- uk_system_code/uk_gateway_url 唯一性由应用层代码校验
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='业务系统表';
CREATE TABLE IF NOT EXISTS sys_api (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
system_id VARCHAR(64) NOT NULL,
api_path VARCHAR(256) NOT NULL,
api_method VARCHAR(10) NOT NULL,
api_name VARCHAR(128) DEFAULT NULL,
api_desc VARCHAR(512) DEFAULT NULL,
status TINYINT NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY idx_system_id (system_id),
UNIQUE KEY uk_system_path_method (system_id, api_path, api_method)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统放行接口表';
CREATE TABLE IF NOT EXISTS sys_user (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
username VARCHAR(64) NOT NULL,
password VARCHAR(256) NOT NULL,
real_name VARCHAR(64) DEFAULT NULL,
email VARCHAR(128) DEFAULT NULL,
phone VARCHAR(32) DEFAULT NULL,
avatar VARCHAR(512) DEFAULT NULL,
post VARCHAR(64) DEFAULT NULL,
status TINYINT NOT NULL DEFAULT 1 COMMENT '0-禁用 1-正常 2-锁定',
lock_until DATETIME DEFAULT NULL,
login_fail_count INT NOT NULL DEFAULT 0,
last_login_ip VARCHAR(64) DEFAULT NULL,
last_login_time DATETIME DEFAULT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
is_deleted TINYINT NOT NULL DEFAULT 0,
PRIMARY KEY (id),
-- 用户名/邮箱唯一性由应用层代码校验MyBatis-Plus @TableLogic 自动过滤已删除记录)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
CREATE TABLE IF NOT EXISTS sys_user_system (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
user_id VARCHAR(64) NOT NULL,
system_id VARCHAR(64) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_user_system (user_id, system_id),
KEY idx_system_id (system_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户系统绑定表';
CREATE TABLE IF NOT EXISTS sys_role (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
system_id VARCHAR(64) NOT NULL,
role_name VARCHAR(64) NOT NULL,
role_code VARCHAR(64) NOT NULL,
description VARCHAR(256) DEFAULT NULL,
status TINYINT NOT NULL DEFAULT 1,
created_by VARCHAR(64) DEFAULT NULL,
updated_by VARCHAR(64) DEFAULT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
is_deleted TINYINT NOT NULL DEFAULT 0,
PRIMARY KEY (id),
-- uk_system_role_code 唯一性由应用层代码校验
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表';
CREATE TABLE IF NOT EXISTS sys_user_role (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
user_id VARCHAR(64) NOT NULL,
role_id VARCHAR(64) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_user_role (user_id, role_id),
KEY idx_role_id (role_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色表';
CREATE TABLE IF NOT EXISTS sys_menu (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
system_id VARCHAR(64) NOT NULL,
parent_id VARCHAR(64) NOT NULL DEFAULT '0',
menu_name VARCHAR(64) NOT NULL,
menu_path VARCHAR(256) DEFAULT NULL,
component VARCHAR(256) DEFAULT NULL,
icon VARCHAR(128) DEFAULT NULL,
menu_type TINYINT NOT NULL COMMENT '1-目录 2-菜单 3-按钮',
permission VARCHAR(128) DEFAULT NULL COMMENT '权限标识',
sort_order INT NOT NULL DEFAULT 0,
status TINYINT NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY idx_system_id (system_id),
KEY idx_parent_id (parent_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='菜单表';
CREATE TABLE IF NOT EXISTS sys_role_menu (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
role_id VARCHAR(64) NOT NULL,
menu_id VARCHAR(64) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_role_menu (role_id, menu_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色菜单表';
CREATE TABLE IF NOT EXISTS sys_login_log (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
user_id VARCHAR(64) DEFAULT NULL,
username VARCHAR(64) NOT NULL,
real_name VARCHAR(64) DEFAULT NULL COMMENT '用户真实姓名',
system_id VARCHAR(64) DEFAULT NULL,
login_ip VARCHAR(64) DEFAULT NULL,
user_agent VARCHAR(512) DEFAULT NULL,
browser VARCHAR(64) DEFAULT NULL,
os VARCHAR(64) DEFAULT NULL,
status TINYINT NOT NULL COMMENT '0-失败 1-成功',
fail_reason VARCHAR(256) DEFAULT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY idx_user_id (user_id),
KEY idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='登录日志表';
CREATE TABLE IF NOT EXISTS sys_operation_log (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
user_id VARCHAR(64) DEFAULT NULL,
username VARCHAR(64) DEFAULT NULL,
system_id VARCHAR(64) DEFAULT NULL,
module VARCHAR(64) DEFAULT NULL,
action VARCHAR(32) DEFAULT NULL,
request_url VARCHAR(256) DEFAULT NULL,
request_method VARCHAR(10) DEFAULT NULL,
request_body TEXT DEFAULT NULL,
response_status INT DEFAULT NULL,
response_body TEXT DEFAULT NULL COMMENT '接口返回报文截断至2000字符',
error_msg TEXT DEFAULT NULL,
cost_time INT DEFAULT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY idx_user_id (user_id),
KEY idx_created_at (created_at),
KEY idx_system_id (system_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作日志表';
CREATE TABLE IF NOT EXISTS sys_dict (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
dict_type VARCHAR(64) NOT NULL,
dict_label VARCHAR(128) NOT NULL,
dict_value VARCHAR(128) NOT NULL,
sort_order INT DEFAULT 0,
status TINYINT NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_type_value (dict_type, dict_value)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='数据字典表';
CREATE TABLE IF NOT EXISTS sys_file (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
system_id VARCHAR(64) DEFAULT NULL COMMENT '所属系统ID',
file_name VARCHAR(256) NOT NULL COMMENT '原始文件名',
file_type VARCHAR(64) DEFAULT 'other' COMMENT '文件类型(icon/avatar/doc/other)',
file_size BIGINT DEFAULT 0 COMMENT '文件大小(字节)',
mime_type VARCHAR(128) DEFAULT NULL COMMENT 'MIME类型',
md5 VARCHAR(64) DEFAULT NULL COMMENT '文件MD5摘要',
upload_user_id VARCHAR(64) DEFAULT NULL COMMENT '上传用户ID',
file_data LONGBLOB COMMENT '文件二进制数据',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
PRIMARY KEY (id),
INDEX idx_system_id (system_id),
INDEX idx_file_type (file_type),
INDEX idx_upload_user_id (upload_user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文件表';
CREATE TABLE IF NOT EXISTS sys_email_log (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
to_address VARCHAR(256) NOT NULL COMMENT '收件人',
subject VARCHAR(512) NOT NULL COMMENT '主题',
content TEXT COMMENT '邮件内容',
content_type VARCHAR(16) NOT NULL DEFAULT 'html' COMMENT '格式 html/text',
status TINYINT NOT NULL DEFAULT 0 COMMENT '0-失败 1-成功',
error_msg VARCHAR(1024) DEFAULT NULL COMMENT '错误信息',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '发送时间',
PRIMARY KEY (id),
KEY idx_created_at (created_at),
KEY idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='邮件发送记录表';
CREATE TABLE IF NOT EXISTS sys_open_token_log (
id VARCHAR(64) NOT NULL COMMENT 'UUID主键',
system_id VARCHAR(64) DEFAULT NULL COMMENT '系统ID',
system_code VARCHAR(64) NOT NULL COMMENT '系统编码',
token_id VARCHAR(64) NOT NULL COMMENT 'Token唯一ID',
token_preview VARCHAR(64) DEFAULT NULL COMMENT 'Token预览',
acquired_at DATETIME DEFAULT NULL COMMENT '获取时间',
consumed TINYINT NOT NULL DEFAULT 0 COMMENT '0-未消费 1-已消费',
consumed_at DATETIME DEFAULT NULL COMMENT '消费时间',
consume_api VARCHAR(256) DEFAULT NULL COMMENT '消费接口',
consume_ip VARCHAR(64) DEFAULT NULL COMMENT '消费IP',
PRIMARY KEY (id),
KEY idx_token_id (token_id),
KEY idx_system_code (system_code),
KEY idx_acquired_at (acquired_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='开放API Token日志表';

6
sql/qa_recreate.sql Normal file
View File

@@ -0,0 +1,6 @@
-- ============================================
-- QA 数据库重建 (UUID 版本)
-- 数据库: mokeegatewayqa
-- ============================================
DROP DATABASE IF EXISTS mokeegatewayqa;
CREATE DATABASE mokeegatewayqa DEFAULT CHARSET utf8mb4;