增加项目的各个功能

This commit is contained in:
qiaoxinjiu
2026-05-07 19:21:19 +08:00
parent aba1618f89
commit ee6cd4ae66
121 changed files with 9346 additions and 43 deletions

807
.agents/RBAC_API.md Normal file
View File

@@ -0,0 +1,807 @@
# RBAC / 用户 / 菜单管理接口文档
本文档基于当前已落地代码整理,适合直接给前端联调使用。
## 1. 通用说明
### 1.1 响应结构
成功:
```json
{
"success": true,
"code": 20000,
"message": "",
"data": {}
}
```
失败:
```json
{
"success": false,
"code": 40009,
"message": "具体错误信息",
"data": null
}
```
### 1.2 错误码使用习惯
| code | 说明 |
|---|---|
| 20000 | 成功 |
| 40009 | 创建类失败 / 参数校验失败 |
| 40011 | 详情查询失败 |
| 40012 | 更新 / 删除 / 分配失败 |
### 1.3 当前实现注意事项
- 用户密码字段当前直接写入 `password_hash`,还未做真正加密
- 分配类接口均为覆盖式保存
- 当前密码字段是占位实现,后续建议替换为真实 hash
---
## 2. 角色管理
### 2.1 角色列表
- 方法:`GET`
- 路径:`/role/list`
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| keyword | string | 否 | 角色名称模糊搜索 |
| status | int | 否 | 1启用 0禁用 |
| pageNo | int | 否 | 页码默认1 |
| pageSize | int | 否 | 每页条数默认20 |
返回 `data`
```json
{
"list": [
{
"id": 1,
"code": "admin",
"name": "超级管理员",
"description": "系统内置超级管理员",
"status": 1,
"is_system": 1,
"created_by": 1,
"created_time": "2025-01-01 10:00:00",
"updated_time": "2025-01-01 10:00:00"
}
],
"total": 1
}
```
### 2.2 角色详情
- 方法:`GET`
- 路径:`/role/detail`
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| roleId | int | 是 | 角色ID |
返回:单个角色对象。
### 2.3 创建角色
- 方法:`POST`
- 路径:`/role/create`
请求体:
```json
{
"code": "test_manager",
"name": "测试经理",
"description": "测试经理角色",
"status": 1,
"isSystem": 0,
"createdBy": 1
}
```
返回:
```json
{
"id": 2
}
```
### 2.4 更新角色
- 方法:`POST`
- 路径:`/role/update`
请求体:
```json
{
"roleId": 2,
"name": "高级测试经理",
"description": "升级后的测试经理角色"
}
```
返回:
```json
{
"id": 2
}
```
### 2.5 删除角色
- 方法:`POST`
- 路径:`/role/delete`
请求体:
```json
{
"roleId": 2
}
```
返回:
```json
{
"id": 2
}
```
---
## 3. 权限管理
### 3.1 权限列表
- 方法:`GET`
- 路径:`/permission/list`
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| keyword | string | 否 | 权限名称模糊搜索 |
| module | string | 否 | 模块名 |
| status | int | 否 | 状态 |
| pageNo | int | 否 | 页码 |
| pageSize | int | 否 | 每页条数 |
返回 `data`
```json
{
"list": [
{
"id": 1,
"code": "user:create",
"name": "创建用户",
"module": "user",
"action": "create",
"description": "创建用户权限",
"status": 1,
"created_time": "2025-01-01 10:00:00",
"updated_time": "2025-01-01 10:00:00"
}
],
"total": 1
}
```
### 3.2 权限详情
- 方法:`GET`
- 路径:`/permission/detail`
- 参数:`permissionId`
### 3.3 创建权限
- 方法:`POST`
- 路径:`/permission/create`
请求体:
```json
{
"code": "user:create",
"name": "创建用户",
"module": "user",
"action": "create",
"description": "创建用户权限",
"status": 1
}
```
### 3.4 更新权限
- 方法:`POST`
- 路径:`/permission/update`
### 3.5 删除权限
- 方法:`POST`
- 路径:`/permission/delete`
---
## 4. 菜单管理
### 4.1 菜单树
- 方法:`GET`
- 路径:`/menu/tree`
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| status | int | 否 | 状态过滤 |
返回 `data`
```json
[
{
"id": 1,
"parent_id": 0,
"name": "系统管理",
"code": "system",
"type": 1,
"path": "/system",
"component": "Layout",
"icon": "setting",
"permission_code": null,
"sort": 1,
"visible": 1,
"status": 1,
"created_time": "2025-01-01 10:00:00",
"updated_time": "2025-01-01 10:00:00",
"children": [
{
"id": 2,
"parent_id": 1,
"name": "用户管理",
"code": "user_manage",
"type": 2,
"path": "/system/user",
"component": "system/user/index",
"icon": "user",
"permission_code": "user:list",
"sort": 1,
"visible": 1,
"status": 1,
"children": []
}
]
}
]
```
### 4.2 菜单详情
- 方法:`GET`
- 路径:`/menu/detail`
- 参数:`menuId`
### 4.3 创建菜单
- 方法:`POST`
- 路径:`/menu/create`
请求体:
```json
{
"parentId": 1,
"name": "角色管理",
"code": "role_manage",
"type": 2,
"path": "/system/role",
"component": "system/role/index",
"icon": "peoples",
"permissionCode": "role:list",
"sort": 2,
"visible": 1,
"status": 1
}
```
### 4.4 更新菜单
- 方法:`POST`
- 路径:`/menu/update`
### 4.5 删除菜单
- 方法:`POST`
- 路径:`/menu/delete`
---
## 5. 角色权限分配
### 5.1 查询角色权限
- 方法:`GET`
- 路径:`/role/permission/list`
- 参数:`roleId`
返回:
```json
{
"permissionIds": [1, 2, 3]
}
```
### 5.2 分配角色权限
- 方法:`POST`
- 路径:`/role/permission/assign`
请求体:
```json
{
"roleId": 2,
"permissionIds": [1, 2, 3, 4]
}
```
返回:
```json
{
"id": 2
}
```
---
## 6. 角色菜单分配
### 6.1 查询角色菜单
- 方法:`GET`
- 路径:`/role/menu/list`
- 参数:`roleId`
返回:
```json
{
"menuIds": [1, 2, 3, 4]
}
```
### 6.2 分配角色菜单
- 方法:`POST`
- 路径:`/role/menu/assign`
请求体:
```json
{
"roleId": 2,
"menuIds": [1, 2, 10, 11]
}
```
返回:
```json
{
"id": 2
}
```
---
## 7. 用户管理
### 7.1 用户列表
- 方法:`GET`
- 路径:`/user/list`
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| keyword | string | 否 | 用户名模糊搜索 |
| status | int | 否 | 状态 |
| pageNo | int | 否 | 页码 |
| pageSize | int | 否 | 每页条数 |
返回 `data`
```json
{
"list": [
{
"id": 1,
"username": "admin",
"real_name": "管理员",
"mobile": "13800000000",
"email": "admin@test.com",
"avatar": "",
"status": 1,
"last_login_time": "2025-01-01 10:00:00",
"created_by": 1,
"created_time": "2025-01-01 10:00:00",
"updated_time": "2025-01-01 10:00:00",
"role_ids": [1, 2],
"role_names": ["管理员", "测试经理"]
}
],
"total": 1
}
```
### 7.2 用户详情
- 方法:`GET`
- 路径:`/user/detail`
- 参数:`userId`
返回会额外包含:
```json
{
"role_ids": [1, 2]
}
```
### 7.3 创建用户
- 方法:`POST`
- 路径:`/user/create`
请求体:
```json
{
"username": "zhangsan",
"password": "123456",
"realName": "张三",
"mobile": "13800001111",
"email": "zhangsan@test.com",
"avatar": "",
"status": 1,
"createdBy": 1
}
```
返回:
```json
{
"id": 3
}
```
### 7.4 更新用户
- 方法:`POST`
- 路径:`/user/update`
### 7.5 删除用户
- 方法:`POST`
- 路径:`/user/delete`
---
## 8. 用户角色分配
### 8.1 查询用户角色
- 方法:`GET`
- 路径:`/user/role/list`
- 参数:`userId`
返回:
```json
{
"roleIds": [1, 2]
}
```
### 8.2 分配用户角色
- 方法:`POST`
- 路径:`/user/role/assign`
请求体:
```json
{
"userId": 10,
"roleIds": [2, 3]
}
```
响应:
```json
{
"id": 10
}
```
---
## 9. 认证接口
### 9.1 注册
- 方法:`POST`
- 路径:`/auth/register`
请求体:
```json
{
"username": "zhangsan",
"password": "123456",
"realName": "张三",
"mobile": "13800001111",
"email": "zhangsan@test.com",
"avatar": "",
"createdBy": 1
}
```
请求参数说明:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| username | string | 是 | 登录用户名 |
| password | string | 是 | 登录密码,当前直接写入 `password_hash` |
| realName | string | 否 | 真实姓名 |
| mobile | string | 否 | 手机号 |
| email | string | 否 | 邮箱 |
| avatar | string | 否 | 头像 |
| createdBy | int | 否 | 创建人 |
成功返回:
```json
{
"id": 11
}
```
失败场景:
- `username、password 为必传参数`
- `用户名已存在!`
### 9.2 登录
- 方法:`POST`
- 路径:`/auth/login`
请求体:
```json
{
"username": "zhangsan",
"password": "123456"
}
```
请求参数说明:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| username | string | 是 | 登录用户名 |
| password | string | 是 | 登录密码 |
成功返回 `data`
```json
{
"id": 11,
"username": "zhangsan",
"real_name": "张三",
"mobile": "13800001111",
"email": "zhangsan@test.com",
"avatar": "",
"status": 1,
"last_login_time": null,
"created_by": 1,
"created_time": "2025-01-01 10:00:00",
"updated_time": "2025-01-01 10:00:00",
"role_ids": [2, 3]
}
```
失败场景:
- `username、password 为必传参数`
- `用户名或密码错误!`
- `用户已禁用!`
登录成功额外返回:
| 字段 | 类型 | 说明 |
|---|---|---|
| token | string | 登录令牌,存入 Redis |
| token_type | string | 固定为 `Bearer` |
| expires_in | int | token 过期时间,单位秒,当前为 7200 |
| refresh_threshold_seconds | int | 自动续期阈值,单位秒,当前为 1800 |
| refresh_mechanism | string | 刷新机制说明 |
当前 token 机制:
- token 存储位置Redis
- Redis key 前缀:`effekt:token:`
- token 过期时间:`7200`2小时
- 刷新机制:访问任意需要登录的接口时,如果 token 剩余有效期小于 `1800` 秒,则自动续期到完整 2 小时
- 请求头支持:
- `accessToken`
- `accesstoken`
- `Authorization: Bearer <token>`
> 当前登录接口已返回 token、过期时间和刷新机制说明。
---
## 10. 一组联调示例
### 9.1 创建角色
```http
POST /role/create
Content-Type: application/json
```
```json
{
"code": "tester",
"name": "测试人员",
"description": "普通测试角色",
"status": 1,
"isSystem": 0
}
```
### 9.2 创建权限
```json
{
"code": "case:list",
"name": "查看用例列表",
"module": "case",
"action": "list",
"description": "查看测试用例列表",
"status": 1
}
```
### 9.3 创建菜单
```json
{
"parentId": 1,
"name": "权限管理",
"code": "permission_manage",
"type": 2,
"path": "/system/permission",
"component": "system/permission/index",
"icon": "lock",
"permissionCode": "permission:list",
"sort": 3,
"visible": 1,
"status": 1
}
```
### 9.4 给角色分配权限
```json
{
"roleId": 5,
"permissionIds": [1, 2, 3, 4]
}
```
### 9.5 给角色分配菜单
```json
{
"roleId": 5,
"menuIds": [1, 2, 8, 9]
}
```
### 9.6 创建用户
```json
{
"username": "lisi",
"password": "123456",
"realName": "李四",
"mobile": "13800002222",
"email": "lisi@test.com",
"status": 1
}
```
### 10.7 给用户分配角色
```json
{
"userId": 10,
"roleIds": [5]
}
```
### 10.8 注册
```json
{
"username": "new_user",
"password": "123456",
"realName": "新用户",
"mobile": "13800009999",
"email": "new_user@test.com"
}
```
### 10.9 登录
```json
{
"username": "new_user",
"password": "123456"
}
```
### 10.10 鉴权说明
请求受保护接口时,请在请求头中携带以下任意一种:
```text
accessToken: <token>
```
```text
accesstoken: <token>
```
```text
Authorization: Bearer <token>
```
当前机制:
- token 存 Redis
- 默认有效期2 小时
- 剩余有效期小于 30 分钟时,访问受保护接口会自动续期
- 注册、登录接口不需要 token
- 其他接口已逐步接入登录鉴权与权限限制
---
## 11. 当前初始化 SQL 已包含的业务菜单
已补入以下可直接录入的菜单数据:
### 系统管理
- `system` 系统管理
- `role_manage` 角色管理
- `user_manage` 用户管理
- `permission_manage` 权限管理
- `menu_manage` 菜单管理
### 测试平台
- `test_platform` 测试平台
- `product_manage` 产品管理
- `project_manage` 项目管理
- `case_manage` 用例管理
- `plan_manage` 测试计划
- `report_manage` 测试报告
### 造数工具
- `data_tools` 造数工具
- `data_builder_manage` 数据库造数
- `data_factory_manage` 造数工厂
如果后续你要,我可以继续补:
1. Swagger/OpenAPI 版本
2. Apifox / Postman 导入版
3. 初始化权限菜单角色的更完整种子数据

503
.agents/rbac_init.sql Normal file
View File

@@ -0,0 +1,503 @@
-- RBAC / 用户 / 菜单 管理建表与初始化 SQL
-- PostgreSQL
BEGIN;
CREATE TABLE IF NOT EXISTS "user" (
id BIGSERIAL PRIMARY KEY,
username VARCHAR(64) NOT NULL UNIQUE,
real_name VARCHAR(64),
password_hash VARCHAR(255) NOT NULL,
mobile VARCHAR(32),
email VARCHAR(128),
avatar VARCHAR(255),
status SMALLINT DEFAULT 1,
last_login_time TIMESTAMP NULL,
created_by BIGINT,
is_delete INTEGER DEFAULT 0,
created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_user_status ON "user" (status);
CREATE INDEX IF NOT EXISTS idx_user_is_delete ON "user" (is_delete);
CREATE TABLE IF NOT EXISTS role (
id BIGSERIAL PRIMARY KEY,
code VARCHAR(64) NOT NULL UNIQUE,
name VARCHAR(64) NOT NULL,
description TEXT,
status SMALLINT DEFAULT 1,
is_system SMALLINT DEFAULT 0,
created_by BIGINT,
is_delete INTEGER DEFAULT 0,
created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_role_status ON role (status);
CREATE INDEX IF NOT EXISTS idx_role_is_delete ON role (is_delete);
CREATE TABLE IF NOT EXISTS permission (
id BIGSERIAL PRIMARY KEY,
code VARCHAR(128) NOT NULL UNIQUE,
name VARCHAR(128) NOT NULL,
module VARCHAR(64),
action VARCHAR(64),
description TEXT,
status SMALLINT DEFAULT 1,
is_delete INTEGER DEFAULT 0,
created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_permission_module ON permission (module);
CREATE INDEX IF NOT EXISTS idx_permission_status ON permission (status);
CREATE TABLE IF NOT EXISTS menu (
id BIGSERIAL PRIMARY KEY,
parent_id BIGINT DEFAULT 0,
name VARCHAR(64) NOT NULL,
code VARCHAR(64) UNIQUE,
type SMALLINT DEFAULT 1,
path VARCHAR(255),
component VARCHAR(255),
icon VARCHAR(64),
permission_code VARCHAR(128),
sort INTEGER DEFAULT 0,
visible SMALLINT DEFAULT 1,
status SMALLINT DEFAULT 1,
is_delete INTEGER DEFAULT 0,
created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_menu_parent_id ON menu (parent_id);
CREATE INDEX IF NOT EXISTS idx_menu_sort ON menu (sort);
CREATE TABLE IF NOT EXISTS user_role (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL,
role_id BIGINT NOT NULL,
is_delete INTEGER DEFAULT 0,
created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT uk_user_role UNIQUE (user_id, role_id)
);
CREATE INDEX IF NOT EXISTS idx_user_role_user_id ON user_role (user_id);
CREATE INDEX IF NOT EXISTS idx_user_role_role_id ON user_role (role_id);
CREATE TABLE IF NOT EXISTS role_permission (
id BIGSERIAL PRIMARY KEY,
role_id BIGINT NOT NULL,
permission_id BIGINT NOT NULL,
is_delete INTEGER DEFAULT 0,
created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT uk_role_permission UNIQUE (role_id, permission_id)
);
CREATE INDEX IF NOT EXISTS idx_role_permission_role_id ON role_permission (role_id);
CREATE INDEX IF NOT EXISTS idx_role_permission_permission_id ON role_permission (permission_id);
CREATE TABLE IF NOT EXISTS role_menu (
id BIGSERIAL PRIMARY KEY,
role_id BIGINT NOT NULL,
menu_id BIGINT NOT NULL,
is_delete INTEGER DEFAULT 0,
created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT uk_role_menu UNIQUE (role_id, menu_id)
);
CREATE INDEX IF NOT EXISTS idx_role_menu_role_id ON role_menu (role_id);
CREATE INDEX IF NOT EXISTS idx_role_menu_menu_id ON role_menu (menu_id);
INSERT INTO role (code, name, description, status, is_system, created_by, is_delete)
SELECT 'admin', '超级管理员', '系统内置超级管理员', 1, 1, 1, 0
WHERE NOT EXISTS (SELECT 1 FROM role WHERE code = 'admin');
INSERT INTO role (code, name, description, status, is_system, created_by, is_delete)
SELECT 'test_manager', '测试经理', '系统内置测试经理角色', 1, 1, 1, 0
WHERE NOT EXISTS (SELECT 1 FROM role WHERE code = 'test_manager');
INSERT INTO role (code, name, description, status, is_system, created_by, is_delete)
SELECT 'test_engineer', '测试工程师', '系统内置测试工程师角色', 1, 1, 1, 0
WHERE NOT EXISTS (SELECT 1 FROM role WHERE code = 'test_engineer');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'role:list', '角色列表', 'role', 'list', '查看角色列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'role:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'role:create', '创建角色', 'role', 'create', '创建角色', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'role:create');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'role:update', '更新角色', 'role', 'update', '更新角色', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'role:update');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'role:delete', '删除角色', 'role', 'delete', '删除角色', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'role:delete');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'user:list', '用户列表', 'user', 'list', '查看用户列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'user:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'user:create', '创建用户', 'user', 'create', '创建用户', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'user:create');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'user:update', '更新用户', 'user', 'update', '更新用户', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'user:update');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'user:delete', '删除用户', 'user', 'delete', '删除用户', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'user:delete');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'permission:list', '权限列表', 'permission', 'list', '查看权限列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'permission:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'menu:list', '菜单列表', 'menu', 'list', '查看菜单树', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'menu:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'role:detail', '角色详情', 'role', 'detail', '查看角色详情', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'role:detail');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'permission:detail', '权限详情', 'permission', 'detail', '查看权限详情', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'permission:detail');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'permission:create', '创建权限', 'permission', 'create', '创建权限', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'permission:create');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'permission:update', '更新权限', 'permission', 'update', '更新权限', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'permission:update');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'permission:delete', '删除权限', 'permission', 'delete', '删除权限', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'permission:delete');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'menu:detail', '菜单详情', 'menu', 'detail', '查看菜单详情', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'menu:detail');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'menu:create', '创建菜单', 'menu', 'create', '创建菜单', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'menu:create');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'menu:update', '更新菜单', 'menu', 'update', '更新菜单', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'menu:update');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'menu:delete', '删除菜单', 'menu', 'delete', '删除菜单', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'menu:delete');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'user:detail', '用户详情', 'user', 'detail', '查看用户详情', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'user:detail');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'project:list', '项目列表', 'project', 'list', '查看项目列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'project:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'project:detail', '项目详情', 'project', 'detail', '查看项目详情', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'project:detail');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'project:create', '创建项目', 'project', 'create', '创建项目', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'project:create');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'project:update', '更新项目', 'project', 'update', '更新项目', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'project:update');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'project:delete', '删除项目', 'project', 'delete', '删除项目', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'project:delete');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'project_member:list', '项目成员列表', 'project_member', 'list', '查看项目成员列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'project_member:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'project_member:create', '创建项目成员', 'project_member', 'create', '创建项目成员', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'project_member:create');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'product:list', '产品列表', 'product', 'list', '查看产品列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'product:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'product:detail', '产品详情', 'product', 'detail', '查看产品详情', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'product:detail');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'product:create', '创建产品', 'product', 'create', '创建产品', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'product:create');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'product:update', '更新产品', 'product', 'update', '更新产品', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'product:update');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'product:delete', '删除产品', 'product', 'delete', '删除产品', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'product:delete');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'module:list', '模块列表', 'module', 'list', '查看模块列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'module:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'module:create', '创建模块', 'module', 'create', '创建模块', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'module:create');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'module:update', '更新模块', 'module', 'update', '更新模块', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'module:update');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'module:delete', '删除模块', 'module', 'delete', '删除模块', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'module:delete');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'case:list', '用例列表', 'case', 'list', '查看用例列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'case:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'case:detail', '用例详情', 'case', 'detail', '查看用例详情', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'case:detail');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'case:create', '创建用例', 'case', 'create', '创建用例', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'case:create');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'case:update', '更新用例', 'case', 'update', '更新用例', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'case:update');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'case:delete', '删除用例', 'case', 'delete', '删除用例', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'case:delete');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'case_snapshot:create', '创建用例快照', 'case_snapshot', 'create', '创建用例快照', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'case_snapshot:create');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'case_snapshot:list', '用例快照列表', 'case_snapshot', 'list', '查看用例快照列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'case_snapshot:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'case_review:create', '创建用例评审', 'case_review', 'create', '创建用例评审', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'case_review:create');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'case_review:update', '更新用例评审', 'case_review', 'update', '更新用例评审', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'case_review:update');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'case_review:list', '用例评审列表', 'case_review', 'list', '查看用例评审列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'case_review:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'plan:list', '计划列表', 'plan', 'list', '查看计划列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'plan:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'plan:detail', '计划详情', 'plan', 'detail', '查看计划详情', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'plan:detail');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'plan:create', '创建计划', 'plan', 'create', '创建计划', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'plan:create');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'plan:update', '更新计划', 'plan', 'update', '更新计划', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'plan:update');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'plan:delete', '删除计划', 'plan', 'delete', '删除计划', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'plan:delete');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'plan:progress', '计划进度', 'plan', 'progress', '查看计划进度', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'plan:progress');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'plan_round:create', '创建计划轮次', 'plan_round', 'create', '创建计划轮次', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'plan_round:create');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'plan_round:list', '计划轮次列表', 'plan_round', 'list', '查看计划轮次列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'plan_round:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'plan_case:add', '添加计划用例', 'plan_case', 'add', '添加计划用例', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'plan_case:add');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'plan_case:list', '计划用例列表', 'plan_case', 'list', '查看计划用例列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'plan_case:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'plan_case:execute', '执行计划用例', 'plan_case', 'execute', '执行计划用例', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'plan_case:execute');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'report:list', '报告列表', 'report', 'list', '查看报告列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'report:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'report:detail', '报告详情', 'report', 'detail', '查看报告详情', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'report:detail');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'report:generate', '生成报告', 'report', 'generate', '生成报告', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'report:generate');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'data_builder:list', '造数器列表', 'data_builder', 'list', '查看造数器列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'data_builder:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'sql_project:list', 'SQL项目列表', 'sql_project', 'list', '查看SQL项目列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'sql_project:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'sql_project:create', '创建SQL项目', 'sql_project', 'create', '创建SQL项目', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'sql_project:create');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'sql_project:detail', 'SQL项目详情', 'sql_project', 'detail', '查看SQL项目详情', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'sql_project:detail');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'sql_project:delete', '删除SQL项目', 'sql_project', 'delete', '删除SQL项目', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'sql_project:delete');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'sql_project:execute', '执行SQL项目', 'sql_project', 'execute', '执行SQL项目', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'sql_project:execute');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'role_permission:list', '角色权限列表', 'role_permission', 'list', '查看角色权限列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'role_permission:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'role_permission:assign', '分配角色权限', 'role_permission', 'assign', '分配角色权限', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'role_permission:assign');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'role_menu:list', '角色菜单列表', 'role_menu', 'list', '查看角色菜单列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'role_menu:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'role_menu:assign', '分配角色菜单', 'role_menu', 'assign', '分配角色菜单', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'role_menu:assign');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'user_role:list', '用户角色列表', 'user_role', 'list', '查看用户角色列表', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'user_role:list');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'user_role:assign', '分配用户角色', 'user_role', 'assign', '分配用户角色', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'user_role:assign');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'role:*', '角色全部权限', 'role', '*', '角色模块全部权限', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'role:*');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'user:*', '用户全部权限', 'user', '*', '用户模块全部权限', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'user:*');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'menu:*', '菜单全部权限', 'menu', '*', '菜单模块全部权限', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'menu:*');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'permission:*', '权限全部权限', 'permission', '*', '权限模块全部权限', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'permission:*');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'project:*', '项目全部权限', 'project', '*', '项目模块全部权限', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'project:*');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'environment:*', '环境全部权限', 'environment', '*', '环境模块全部权限', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'environment:*');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'case:*', '用例全部权限', 'case', '*', '用例模块全部权限', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'case:*');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'plan:*', '计划全部权限', 'plan', '*', '计划模块全部权限', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'plan:*');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'report:*', '报告全部权限', 'report', '*', '报告模块全部权限', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'report:*');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT 'data_builder:*', '造数器全部权限', 'data_builder', '*', '造数器模块全部权限', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = 'data_builder:*');
INSERT INTO permission (code, name, module, action, description, status, is_delete)
SELECT '*:*', '全部权限', '*', '*', '所有模块全部权限', 1, 0
WHERE NOT EXISTS (SELECT 1 FROM permission WHERE code = '*:*');
INSERT INTO menu (parent_id, name, code, type, path, component, icon, permission_code, sort, visible, status, is_delete)
SELECT 0, '系统管理', 'system', 1, '/system', 'Layout', 'setting', NULL, 1, 1, 1, 0
WHERE NOT EXISTS (SELECT 1 FROM menu WHERE code = 'system');
INSERT INTO menu (parent_id, name, code, type, path, component, icon, permission_code, sort, visible, status, is_delete)
SELECT m.id, '角色管理', 'role_manage', 2, '/system/role', 'system/role/index', 'peoples', 'role:list', 1, 1, 1, 0
FROM menu m
WHERE m.code = 'system'
AND NOT EXISTS (SELECT 1 FROM menu WHERE code = 'role_manage');
INSERT INTO menu (parent_id, name, code, type, path, component, icon, permission_code, sort, visible, status, is_delete)
SELECT m.id, '用户管理', 'user_manage', 2, '/system/user', 'system/user/index', 'user', 'user:list', 2, 1, 1, 0
FROM menu m
WHERE m.code = 'system'
AND NOT EXISTS (SELECT 1 FROM menu WHERE code = 'user_manage');
INSERT INTO menu (parent_id, name, code, type, path, component, icon, permission_code, sort, visible, status, is_delete)
SELECT m.id, '权限管理', 'permission_manage', 2, '/system/permission', 'system/permission/index', 'lock', 'permission:list', 3, 1, 1, 0
FROM menu m
WHERE m.code = 'system'
AND NOT EXISTS (SELECT 1 FROM menu WHERE code = 'permission_manage');
INSERT INTO menu (parent_id, name, code, type, path, component, icon, permission_code, sort, visible, status, is_delete)
SELECT m.id, '菜单管理', 'menu_manage', 2, '/system/menu', 'system/menu/index', 'menu', 'menu:list', 4, 1, 1, 0
FROM menu m
WHERE m.code = 'system'
AND NOT EXISTS (SELECT 1 FROM menu WHERE code = 'menu_manage');
INSERT INTO menu (parent_id, name, code, type, path, component, icon, permission_code, sort, visible, status, is_delete)
SELECT 0, '测试平台', 'test_platform', 1, '/test-platform', 'Layout', 'platform', NULL, 2, 1, 1, 0
WHERE NOT EXISTS (SELECT 1 FROM menu WHERE code = 'test_platform');
INSERT INTO menu (parent_id, name, code, type, path, component, icon, permission_code, sort, visible, status, is_delete)
SELECT m.id, '产品管理', 'product_manage', 2, '/test-platform/product', 'test-platform/product/index', 'product', 'product:list', 1, 1, 1, 0
FROM menu m
WHERE m.code = 'test_platform'
AND NOT EXISTS (SELECT 1 FROM menu WHERE code = 'product_manage');
INSERT INTO menu (parent_id, name, code, type, path, component, icon, permission_code, sort, visible, status, is_delete)
SELECT m.id, '项目管理', 'project_manage', 2, '/test-platform/project', 'test-platform/project/index', 'project', 'project:list', 2, 1, 1, 0
FROM menu m
WHERE m.code = 'test_platform'
AND NOT EXISTS (SELECT 1 FROM menu WHERE code = 'project_manage');
INSERT INTO menu (parent_id, name, code, type, path, component, icon, permission_code, sort, visible, status, is_delete)
SELECT m.id, '用例管理', 'case_manage', 2, '/test-platform/case', 'test-platform/case/index', 'case', 'case:list', 3, 1, 1, 0
FROM menu m
WHERE m.code = 'test_platform'
AND NOT EXISTS (SELECT 1 FROM menu WHERE code = 'case_manage');
INSERT INTO menu (parent_id, name, code, type, path, component, icon, permission_code, sort, visible, status, is_delete)
SELECT m.id, '测试计划', 'plan_manage', 2, '/test-platform/plan', 'test-platform/plan/index', 'plan', 'plan:list', 4, 1, 1, 0
FROM menu m
WHERE m.code = 'test_platform'
AND NOT EXISTS (SELECT 1 FROM menu WHERE code = 'plan_manage');
INSERT INTO menu (parent_id, name, code, type, path, component, icon, permission_code, sort, visible, status, is_delete)
SELECT m.id, '测试报告', 'report_manage', 2, '/test-platform/report', 'test-platform/report/index', 'report', 'report:list', 5, 1, 1, 0
FROM menu m
WHERE m.code = 'test_platform'
AND NOT EXISTS (SELECT 1 FROM menu WHERE code = 'report_manage');
INSERT INTO menu (parent_id, name, code, type, path, component, icon, permission_code, sort, visible, status, is_delete)
SELECT 0, '造数工具', 'data_tools', 1, '/data-tools', 'Layout', 'data', NULL, 3, 1, 1, 0
WHERE NOT EXISTS (SELECT 1 FROM menu WHERE code = 'data_tools');
INSERT INTO menu (parent_id, name, code, type, path, component, icon, permission_code, sort, visible, status, is_delete)
SELECT m.id, '数据库造数', 'data_builder_manage', 2, '/data-tools/db-builder', 'data-tools/db-builder/index', 'database', 'data_builder:list', 1, 1, 1, 0
FROM menu m
WHERE m.code = 'data_tools'
AND NOT EXISTS (SELECT 1 FROM menu WHERE code = 'data_builder_manage');
INSERT INTO menu (parent_id, name, code, type, path, component, icon, permission_code, sort, visible, status, is_delete)
SELECT m.id, '造数工厂', 'data_factory_manage', 2, '/data-tools/factory', 'data-tools/factory/index', 'factory', NULL, 2, 1, 1, 0
FROM menu m
WHERE m.code = 'data_tools'
AND NOT EXISTS (SELECT 1 FROM menu WHERE code = 'data_factory_manage');
INSERT INTO "user" (username, real_name, password_hash, mobile, email, avatar, status, created_by, is_delete)
SELECT 'admin', '系统管理员', 'admin123', '13800000000', 'admin@example.com', '', 1, 1, 0
WHERE NOT EXISTS (SELECT 1 FROM "user" WHERE username = 'admin');
INSERT INTO user_role (user_id, role_id, is_delete)
SELECT u.id, r.id, 0
FROM "user" u, role r
WHERE u.username = 'admin' AND r.code = 'admin'
AND NOT EXISTS (
SELECT 1 FROM user_role ur WHERE ur.user_id = u.id AND ur.role_id = r.id
);
INSERT INTO role_permission (role_id, permission_id, is_delete)
SELECT r.id, p.id, 0
FROM role r, permission p
WHERE r.code = 'admin'
AND NOT EXISTS (
SELECT 1 FROM role_permission rp WHERE rp.role_id = r.id AND rp.permission_id = p.id
);
INSERT INTO role_permission (role_id, permission_id, is_delete)
SELECT r.id, p.id, 0
FROM role r, permission p
WHERE r.code = 'admin'
AND p.code IN ('user_role:list', 'user_role:assign', 'role_permission:list', 'role_permission:assign', 'role_menu:list', 'role_menu:assign')
AND NOT EXISTS (
SELECT 1 FROM role_permission rp WHERE rp.role_id = r.id AND rp.permission_id = p.id
);
UPDATE menu SET permission_code = 'role:list' WHERE code = 'role_manage' AND (permission_code IS NULL OR permission_code = '');
UPDATE menu SET permission_code = 'user:list' WHERE code = 'user_manage' AND (permission_code IS NULL OR permission_code = '');
UPDATE menu SET permission_code = 'permission:list' WHERE code = 'permission_manage' AND (permission_code IS NULL OR permission_code = '');
UPDATE menu SET permission_code = 'menu:list' WHERE code = 'menu_manage' AND (permission_code IS NULL OR permission_code = '');
UPDATE menu SET permission_code = 'product:list' WHERE code = 'product_manage' AND (permission_code IS NULL OR permission_code = '');
UPDATE menu SET permission_code = 'project:list' WHERE code = 'project_manage' AND (permission_code IS NULL OR permission_code = '');
UPDATE menu SET permission_code = 'case:list' WHERE code = 'case_manage' AND (permission_code IS NULL OR permission_code = '');
UPDATE menu SET permission_code = 'plan:list' WHERE code = 'plan_manage' AND (permission_code IS NULL OR permission_code = '');
UPDATE menu SET permission_code = 'report:list' WHERE code = 'report_manage' AND (permission_code IS NULL OR permission_code = '');
UPDATE menu SET permission_code = 'data_builder:list' WHERE code = 'data_builder_manage' AND (permission_code IS NULL OR permission_code = '');
INSERT INTO role_menu (role_id, menu_id, is_delete)
SELECT r.id, m.id, 0
FROM role r, menu m
WHERE r.code = 'admin'
AND NOT EXISTS (
SELECT 1 FROM role_menu rm WHERE rm.role_id = r.id AND rm.menu_id = m.id
);
COMMIT;