From 7018c61a00547a3e15fb08f285580f8452b5dd48 Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Tue, 14 Apr 2026 18:14:41 +0800 Subject: [PATCH] =?UTF-8?q?sql=E6=9B=B4=E6=96=B0+dev=E9=80=9A=E7=94=A8?= =?UTF-8?q?=E5=AE=B9=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .devcontainer/external/.env.example | 9 +- .devcontainer/external/docker-compose.yml | 4 + .../docker-compose.public-services.yml | 68 ++++++++++++++ .../dev-common/docker-compose.yml | 7 +- docs/plan/architecture.md | 5 +- init/pg/ai/10_create_ai_tables.sql | 28 +++++- init/pg/ai/20_init_ai_seed.sql | 4 +- init/pg/auth/10_create_auth_tables.sql | 31 ++++++- init/pg/auth/20_init_auth_seed.sql | 4 +- init/pg/upms/10_create_upms_tables.sql | 92 ++++++++++++++++--- init/pg/upms/20_init_upms_seed.sql | 36 ++++---- 11 files changed, 235 insertions(+), 53 deletions(-) create mode 100644 docker/dev-common/docker-compose.public-services.yml rename docker-compose.yml => docker/dev-common/docker-compose.yml (75%) diff --git a/.devcontainer/external/.env.example b/.devcontainer/external/.env.example index 5355bf3..aad0550 100644 --- a/.devcontainer/external/.env.example +++ b/.devcontainer/external/.env.example @@ -1,8 +1,13 @@ -K12STUDY_DB_HOST=host.docker.internal +# 另一台主机(公共服务机)地址 +K12STUDY_DB_HOST=192.168.0.23 K12STUDY_DB_PORT=5432 K12STUDY_DB_NAME=k12study K12STUDY_DB_USER=k12study K12STUDY_DB_PASSWORD=k12study -K12STUDY_REDIS_HOST=host.docker.internal +K12STUDY_REDIS_HOST=192.168.0.23 K12STUDY_REDIS_PORT=6379 K12STUDY_REDIS_PASSWORD= +K12STUDY_REGISTRY_HOST=192.168.0.23 +K12STUDY_REGISTRY_PORT=8848 +K12STUDY_REGISTRY_GRPC_PORT=9848 +K12STUDY_REGISTRY_RAFT_PORT=9849 diff --git a/.devcontainer/external/docker-compose.yml b/.devcontainer/external/docker-compose.yml index eb4aa9a..5dfd407 100644 --- a/.devcontainer/external/docker-compose.yml +++ b/.devcontainer/external/docker-compose.yml @@ -14,6 +14,10 @@ services: K12STUDY_REDIS_HOST: ${K12STUDY_REDIS_HOST:-host.docker.internal} K12STUDY_REDIS_PORT: ${K12STUDY_REDIS_PORT:-6379} K12STUDY_REDIS_PASSWORD: ${K12STUDY_REDIS_PASSWORD:-} + K12STUDY_REGISTRY_HOST: ${K12STUDY_REGISTRY_HOST:-host.docker.internal} + K12STUDY_REGISTRY_PORT: ${K12STUDY_REGISTRY_PORT:-8848} + K12STUDY_REGISTRY_GRPC_PORT: ${K12STUDY_REGISTRY_GRPC_PORT:-9848} + K12STUDY_REGISTRY_RAFT_PORT: ${K12STUDY_REGISTRY_RAFT_PORT:-9849} PYTHONUNBUFFERED: "1" extra_hosts: - "host.docker.internal:host-gateway" diff --git a/docker/dev-common/docker-compose.public-services.yml b/docker/dev-common/docker-compose.public-services.yml new file mode 100644 index 0000000..b096290 --- /dev/null +++ b/docker/dev-common/docker-compose.public-services.yml @@ -0,0 +1,68 @@ +services: + postgres: + image: postgres:18.3 + container_name: k12study-dev-postgres + restart: unless-stopped + environment: + POSTGRES_DB: ${K12STUDY_DB_NAME:-k12study} + POSTGRES_USER: ${K12STUDY_DB_USER:-k12study} + POSTGRES_PASSWORD: ${K12STUDY_DB_PASSWORD:-k12study} + PGDATA: /var/lib/postgresql/18/docker + TZ: ${TZ:-Asia/Shanghai} + ports: + - "${K12STUDY_DB_PORT:-5432}:5432" + volumes: + - ${K12STUDY_RUN_DIR:-./runtime}/postgres/pg18:/var/lib/postgresql + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${K12STUDY_DB_USER:-k12study} -d ${K12STUDY_DB_NAME:-k12study}"] + interval: 10s + timeout: 5s + retries: 10 + networks: + - k12study-dev-net + + redis: + image: redis:7 + container_name: k12study-dev-redis + restart: unless-stopped + command: redis-server --appendonly yes + ports: + - "${K12STUDY_REDIS_PORT:-6379}:6379" + volumes: + - ${K12STUDY_RUN_DIR:-./runtime}/redis/data:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 5s + retries: 10 + networks: + - k12study-dev-net + + nacos: + image: nacos/nacos-server:v3.2.1-2026.04.03 + container_name: k12study-dev-nacos + restart: unless-stopped + environment: + MODE: standalone + NACOS_AUTH_ENABLE: "false" + NACOS_AUTH_TOKEN: ${NACOS_AUTH_TOKEN:-azEyc3R1ZHktbmFjb3MtZGV2LXRva2VuLTIwMjY=} + NACOS_AUTH_IDENTITY_KEY: ${NACOS_AUTH_IDENTITY_KEY:-serverIdentity} + NACOS_AUTH_IDENTITY_VALUE: ${NACOS_AUTH_IDENTITY_VALUE:-security} + TZ: ${TZ:-Asia/Shanghai} + JVM_XMS: 256m + JVM_XMX: 512m + JVM_XMN: 128m + ports: + - "${K12STUDY_REGISTRY_PORT:-8848}:8848" + - "${K12STUDY_REGISTRY_GRPC_PORT:-9848}:9848" + - "${K12STUDY_REGISTRY_RAFT_PORT:-9849}:9849" + volumes: + - ${K12STUDY_RUN_DIR:-./runtime}/nacos/logs:/home/nacos/logs + - ${K12STUDY_RUN_DIR:-./runtime}/nacos/data:/home/nacos/data + networks: + - k12study-dev-net + +networks: + k12study-dev-net: + name: ${K12STUDY_DOCKER_NET:-k12study-dev-net} + driver: bridge diff --git a/docker-compose.yml b/docker/dev-common/docker-compose.yml similarity index 75% rename from docker-compose.yml rename to docker/dev-common/docker-compose.yml index 9394454..ba83eb2 100644 --- a/docker-compose.yml +++ b/docker/dev-common/docker-compose.yml @@ -1,17 +1,18 @@ services: postgres: - image: postgres:16 + image: postgres:18.3 container_name: k12study-postgres restart: unless-stopped environment: POSTGRES_DB: k12study POSTGRES_USER: k12study POSTGRES_PASSWORD: k12study + PGDATA: /var/lib/postgresql/18/docker ports: - "5432:5432" volumes: - - postgres-data:/var/lib/postgresql/data - - ./init/pg:/docker-entrypoint-initdb.d + - postgres-data:/var/lib/postgresql + - ../../init/pg:/docker-entrypoint-initdb.d redis: image: redis:7 diff --git a/docs/plan/architecture.md b/docs/plan/architecture.md index 7ddb319..6627c70 100644 --- a/docs/plan/architecture.md +++ b/docs/plan/architecture.md @@ -90,8 +90,7 @@ - `SysRole` - `SysPermission` - 所有租户级业务主表统一预留字段: - - `province_code` - - `area_code` + - `adcode` - `tenant_id` 或 `school_id` - `tenant_path` - `dept_id` @@ -196,7 +195,7 @@ - 区域树可查询 - 学校租户树可查询 - 部门树可挂接到学校租户下 - - 带不同 `province_code / area_code` 的数据写入与查询能走统一路由键封装 +- 带不同 `adcode` 的数据写入与查询能走统一路由键封装 ## Assumptions diff --git a/init/pg/ai/10_create_ai_tables.sql b/init/pg/ai/10_create_ai_tables.sql index c1b10fd..f6d56cb 100644 --- a/init/pg/ai/10_create_ai_tables.sql +++ b/init/pg/ai/10_create_ai_tables.sql @@ -3,21 +3,30 @@ CREATE TABLE IF NOT EXISTS ai.tb_ai_model_config ( model_name VARCHAR(128) NOT NULL, provider VARCHAR(64) NOT NULL, endpoint VARCHAR(255), - province_code VARCHAR(12), - area_code VARCHAR(12), + adcode VARCHAR(12), tenant_id VARCHAR(64), tenant_path VARCHAR(255), dept_id VARCHAR(64), dept_path VARCHAR(255), created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); +COMMENT ON TABLE ai.tb_ai_model_config IS 'AI模型配置表'; +COMMENT ON COLUMN ai.tb_ai_model_config.model_id IS '模型ID'; +COMMENT ON COLUMN ai.tb_ai_model_config.model_name IS '模型名称'; +COMMENT ON COLUMN ai.tb_ai_model_config.provider IS '模型提供商'; +COMMENT ON COLUMN ai.tb_ai_model_config.endpoint IS '模型服务地址'; +COMMENT ON COLUMN ai.tb_ai_model_config.adcode IS '行政区划编码'; +COMMENT ON COLUMN ai.tb_ai_model_config.tenant_id IS '租户ID'; +COMMENT ON COLUMN ai.tb_ai_model_config.tenant_path IS '租户路径'; +COMMENT ON COLUMN ai.tb_ai_model_config.dept_id IS '部门ID'; +COMMENT ON COLUMN ai.tb_ai_model_config.dept_path IS '部门路径'; +COMMENT ON COLUMN ai.tb_ai_model_config.created_at IS '创建时间'; CREATE TABLE IF NOT EXISTS ai.tb_ai_task_log ( task_id VARCHAR(64) PRIMARY KEY, task_type VARCHAR(64) NOT NULL, task_status VARCHAR(32) NOT NULL, - province_code VARCHAR(12), - area_code VARCHAR(12), + adcode VARCHAR(12), tenant_id VARCHAR(64), tenant_path VARCHAR(255), dept_id VARCHAR(64), @@ -25,3 +34,14 @@ CREATE TABLE IF NOT EXISTS ai.tb_ai_task_log ( payload_json TEXT, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); +COMMENT ON TABLE ai.tb_ai_task_log IS 'AI任务日志表'; +COMMENT ON COLUMN ai.tb_ai_task_log.task_id IS '任务ID'; +COMMENT ON COLUMN ai.tb_ai_task_log.task_type IS '任务类型'; +COMMENT ON COLUMN ai.tb_ai_task_log.task_status IS '任务状态'; +COMMENT ON COLUMN ai.tb_ai_task_log.adcode IS '行政区划编码'; +COMMENT ON COLUMN ai.tb_ai_task_log.tenant_id IS '租户ID'; +COMMENT ON COLUMN ai.tb_ai_task_log.tenant_path IS '租户路径'; +COMMENT ON COLUMN ai.tb_ai_task_log.dept_id IS '部门ID'; +COMMENT ON COLUMN ai.tb_ai_task_log.dept_path IS '部门路径'; +COMMENT ON COLUMN ai.tb_ai_task_log.payload_json IS '任务载荷JSON'; +COMMENT ON COLUMN ai.tb_ai_task_log.created_at IS '创建时间'; diff --git a/init/pg/ai/20_init_ai_seed.sql b/init/pg/ai/20_init_ai_seed.sql index ced1b6e..b7d9110 100644 --- a/init/pg/ai/20_init_ai_seed.sql +++ b/init/pg/ai/20_init_ai_seed.sql @@ -1,6 +1,6 @@ INSERT INTO ai.tb_ai_model_config ( - model_id, model_name, provider, endpoint, province_code, area_code, tenant_id, tenant_path, dept_id, dept_path + model_id, model_name, provider, endpoint, adcode, tenant_id, tenant_path, dept_id, dept_path ) VALUES ( - 'MODEL-MOCK-001', 'mock-python-ai', 'local', 'http://localhost:9000', '330000', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/' + 'MODEL-MOCK-001', 'mock-python-ai', 'local', 'http://localhost:9000', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/' ) ON CONFLICT (model_id) DO NOTHING; diff --git a/init/pg/auth/10_create_auth_tables.sql b/init/pg/auth/10_create_auth_tables.sql index 8bd218b..1206ab5 100644 --- a/init/pg/auth/10_create_auth_tables.sql +++ b/init/pg/auth/10_create_auth_tables.sql @@ -2,8 +2,7 @@ CREATE TABLE IF NOT EXISTS auth.tb_auth_refresh_token ( token_id VARCHAR(64) PRIMARY KEY, user_id VARCHAR(64) NOT NULL, username VARCHAR(64) NOT NULL, - province_code VARCHAR(12), - area_code VARCHAR(12), + adcode VARCHAR(12), tenant_id VARCHAR(64), tenant_path VARCHAR(255), dept_id VARCHAR(64), @@ -13,13 +12,25 @@ CREATE TABLE IF NOT EXISTS auth.tb_auth_refresh_token ( revoked BOOLEAN NOT NULL DEFAULT FALSE, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); +COMMENT ON TABLE auth.tb_auth_refresh_token IS '认证刷新令牌表'; +COMMENT ON COLUMN auth.tb_auth_refresh_token.token_id IS '令牌ID'; +COMMENT ON COLUMN auth.tb_auth_refresh_token.user_id IS '用户ID'; +COMMENT ON COLUMN auth.tb_auth_refresh_token.username IS '用户名'; +COMMENT ON COLUMN auth.tb_auth_refresh_token.adcode IS '行政区划编码'; +COMMENT ON COLUMN auth.tb_auth_refresh_token.tenant_id IS '租户ID'; +COMMENT ON COLUMN auth.tb_auth_refresh_token.tenant_path IS '租户路径'; +COMMENT ON COLUMN auth.tb_auth_refresh_token.dept_id IS '部门ID'; +COMMENT ON COLUMN auth.tb_auth_refresh_token.dept_path IS '部门路径'; +COMMENT ON COLUMN auth.tb_auth_refresh_token.refresh_token IS '刷新令牌'; +COMMENT ON COLUMN auth.tb_auth_refresh_token.expire_at IS '过期时间'; +COMMENT ON COLUMN auth.tb_auth_refresh_token.revoked IS '是否撤销'; +COMMENT ON COLUMN auth.tb_auth_refresh_token.created_at IS '创建时间'; CREATE TABLE IF NOT EXISTS auth.tb_auth_login_audit ( audit_id VARCHAR(64) PRIMARY KEY, user_id VARCHAR(64), username VARCHAR(64) NOT NULL, - province_code VARCHAR(12), - area_code VARCHAR(12), + adcode VARCHAR(12), tenant_id VARCHAR(64), tenant_path VARCHAR(255), dept_id VARCHAR(64), @@ -28,6 +39,18 @@ CREATE TABLE IF NOT EXISTS auth.tb_auth_login_audit ( login_status VARCHAR(32) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); +COMMENT ON TABLE auth.tb_auth_login_audit IS '登录审计日志表'; +COMMENT ON COLUMN auth.tb_auth_login_audit.audit_id IS '审计ID'; +COMMENT ON COLUMN auth.tb_auth_login_audit.user_id IS '用户ID'; +COMMENT ON COLUMN auth.tb_auth_login_audit.username IS '用户名'; +COMMENT ON COLUMN auth.tb_auth_login_audit.adcode IS '行政区划编码'; +COMMENT ON COLUMN auth.tb_auth_login_audit.tenant_id IS '租户ID'; +COMMENT ON COLUMN auth.tb_auth_login_audit.tenant_path IS '租户路径'; +COMMENT ON COLUMN auth.tb_auth_login_audit.dept_id IS '部门ID'; +COMMENT ON COLUMN auth.tb_auth_login_audit.dept_path IS '部门路径'; +COMMENT ON COLUMN auth.tb_auth_login_audit.login_ip IS '登录IP'; +COMMENT ON COLUMN auth.tb_auth_login_audit.login_status IS '登录状态'; +COMMENT ON COLUMN auth.tb_auth_login_audit.created_at IS '创建时间'; CREATE INDEX IF NOT EXISTS idx_auth_refresh_token_user ON auth.tb_auth_refresh_token(user_id); CREATE INDEX IF NOT EXISTS idx_auth_login_audit_tenant ON auth.tb_auth_login_audit(tenant_id, created_at DESC); diff --git a/init/pg/auth/20_init_auth_seed.sql b/init/pg/auth/20_init_auth_seed.sql index 8023ccd..a61ce4d 100644 --- a/init/pg/auth/20_init_auth_seed.sql +++ b/init/pg/auth/20_init_auth_seed.sql @@ -1,6 +1,6 @@ INSERT INTO auth.tb_auth_login_audit ( - audit_id, user_id, username, province_code, area_code, tenant_id, tenant_path, dept_id, dept_path, login_ip, login_status + audit_id, user_id, username, adcode, tenant_id, tenant_path, dept_id, dept_path, login_ip, login_status ) VALUES ( - 'audit-bootstrap-001', 'U10001', 'admin', '330000', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/', '127.0.0.1', 'BOOTSTRAP' + 'audit-bootstrap-001', 'U10001', 'admin', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/', '127.0.0.1', 'BOOTSTRAP' ) ON CONFLICT (audit_id) DO NOTHING; diff --git a/init/pg/upms/10_create_upms_tables.sql b/init/pg/upms/10_create_upms_tables.sql index 93a0fb0..1fe8010 100644 --- a/init/pg/upms/10_create_upms_tables.sql +++ b/init/pg/upms/10_create_upms_tables.sql @@ -4,12 +4,20 @@ CREATE TABLE IF NOT EXISTS upms.tb_sys_tenant ( parent_tenant_id VARCHAR(64), tenant_name VARCHAR(128) NOT NULL, tenant_type VARCHAR(32) NOT NULL, - province_code VARCHAR(12) NOT NULL, - area_code VARCHAR(12) NOT NULL, + adcode VARCHAR(12) NOT NULL, tenant_path VARCHAR(255) NOT NULL, status VARCHAR(32) NOT NULL DEFAULT 'ACTIVE', created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); +COMMENT ON TABLE upms.tb_sys_tenant IS '学校租户表'; +COMMENT ON COLUMN upms.tb_sys_tenant.tenant_id IS '租户ID'; +COMMENT ON COLUMN upms.tb_sys_tenant.parent_tenant_id IS '父租户ID'; +COMMENT ON COLUMN upms.tb_sys_tenant.tenant_name IS '租户名称'; +COMMENT ON COLUMN upms.tb_sys_tenant.tenant_type IS '租户类型'; +COMMENT ON COLUMN upms.tb_sys_tenant.adcode IS '行政区划编码'; +COMMENT ON COLUMN upms.tb_sys_tenant.tenant_path IS '租户路径'; +COMMENT ON COLUMN upms.tb_sys_tenant.status IS '租户状态'; +COMMENT ON COLUMN upms.tb_sys_tenant.created_at IS '创建时间'; CREATE TABLE IF NOT EXISTS upms.tb_sys_dept ( dept_id VARCHAR(64) PRIMARY KEY, @@ -17,20 +25,28 @@ CREATE TABLE IF NOT EXISTS upms.tb_sys_dept ( tenant_id VARCHAR(64) NOT NULL, dept_name VARCHAR(128) NOT NULL, dept_type VARCHAR(32) NOT NULL, - province_code VARCHAR(12) NOT NULL, - area_code VARCHAR(12) NOT NULL, + adcode VARCHAR(12) NOT NULL, tenant_path VARCHAR(255) NOT NULL, dept_path VARCHAR(255) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); +COMMENT ON TABLE upms.tb_sys_dept IS '组织部门表'; +COMMENT ON COLUMN upms.tb_sys_dept.dept_id IS '部门ID'; +COMMENT ON COLUMN upms.tb_sys_dept.parent_dept_id IS '父部门ID'; +COMMENT ON COLUMN upms.tb_sys_dept.tenant_id IS '租户ID'; +COMMENT ON COLUMN upms.tb_sys_dept.dept_name IS '部门名称'; +COMMENT ON COLUMN upms.tb_sys_dept.dept_type IS '部门类型'; +COMMENT ON COLUMN upms.tb_sys_dept.adcode IS '行政区划编码'; +COMMENT ON COLUMN upms.tb_sys_dept.tenant_path IS '租户路径'; +COMMENT ON COLUMN upms.tb_sys_dept.dept_path IS '部门路径'; +COMMENT ON COLUMN upms.tb_sys_dept.created_at IS '创建时间'; CREATE TABLE IF NOT EXISTS upms.tb_sys_user ( user_id VARCHAR(64) PRIMARY KEY, username VARCHAR(64) UNIQUE NOT NULL, display_name VARCHAR(128) NOT NULL, password_hash VARCHAR(255) NOT NULL, - province_code VARCHAR(12) NOT NULL, - area_code VARCHAR(12) NOT NULL, + adcode VARCHAR(12) NOT NULL, tenant_id VARCHAR(64) NOT NULL, tenant_path VARCHAR(255) NOT NULL, dept_id VARCHAR(64) NOT NULL, @@ -38,34 +54,64 @@ CREATE TABLE IF NOT EXISTS upms.tb_sys_user ( status VARCHAR(32) NOT NULL DEFAULT 'ACTIVE', created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); +COMMENT ON TABLE upms.tb_sys_user IS '系统用户表'; +COMMENT ON COLUMN upms.tb_sys_user.user_id IS '用户ID'; +COMMENT ON COLUMN upms.tb_sys_user.username IS '用户名'; +COMMENT ON COLUMN upms.tb_sys_user.display_name IS '显示名称'; +COMMENT ON COLUMN upms.tb_sys_user.password_hash IS '密码哈希'; +COMMENT ON COLUMN upms.tb_sys_user.adcode IS '行政区划编码'; +COMMENT ON COLUMN upms.tb_sys_user.tenant_id IS '租户ID'; +COMMENT ON COLUMN upms.tb_sys_user.tenant_path IS '租户路径'; +COMMENT ON COLUMN upms.tb_sys_user.dept_id IS '部门ID'; +COMMENT ON COLUMN upms.tb_sys_user.dept_path IS '部门路径'; +COMMENT ON COLUMN upms.tb_sys_user.status IS '用户状态'; +COMMENT ON COLUMN upms.tb_sys_user.created_at IS '创建时间'; CREATE TABLE IF NOT EXISTS upms.tb_sys_role ( role_id VARCHAR(64) PRIMARY KEY, role_code VARCHAR(64) UNIQUE NOT NULL, role_name VARCHAR(128) NOT NULL, - province_code VARCHAR(12) NOT NULL, - area_code VARCHAR(12) NOT NULL, + adcode VARCHAR(12) NOT NULL, tenant_id VARCHAR(64) NOT NULL, tenant_path VARCHAR(255) NOT NULL, dept_id VARCHAR(64), dept_path VARCHAR(255), created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); +COMMENT ON TABLE upms.tb_sys_role IS '角色表'; +COMMENT ON COLUMN upms.tb_sys_role.role_id IS '角色ID'; +COMMENT ON COLUMN upms.tb_sys_role.role_code IS '角色编码'; +COMMENT ON COLUMN upms.tb_sys_role.role_name IS '角色名称'; +COMMENT ON COLUMN upms.tb_sys_role.adcode IS '行政区划编码'; +COMMENT ON COLUMN upms.tb_sys_role.tenant_id IS '租户ID'; +COMMENT ON COLUMN upms.tb_sys_role.tenant_path IS '租户路径'; +COMMENT ON COLUMN upms.tb_sys_role.dept_id IS '部门ID'; +COMMENT ON COLUMN upms.tb_sys_role.dept_path IS '部门路径'; +COMMENT ON COLUMN upms.tb_sys_role.created_at IS '创建时间'; CREATE TABLE IF NOT EXISTS upms.tb_sys_permission ( permission_id VARCHAR(64) PRIMARY KEY, permission_code VARCHAR(128) UNIQUE NOT NULL, permission_name VARCHAR(128) NOT NULL, - province_code VARCHAR(12) NOT NULL, - area_code VARCHAR(12) NOT NULL, + adcode VARCHAR(12) NOT NULL, tenant_id VARCHAR(64) NOT NULL, tenant_path VARCHAR(255) NOT NULL, dept_id VARCHAR(64), dept_path VARCHAR(255), created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); +COMMENT ON TABLE upms.tb_sys_permission IS '权限表'; +COMMENT ON COLUMN upms.tb_sys_permission.permission_id IS '权限ID'; +COMMENT ON COLUMN upms.tb_sys_permission.permission_code IS '权限编码'; +COMMENT ON COLUMN upms.tb_sys_permission.permission_name IS '权限名称'; +COMMENT ON COLUMN upms.tb_sys_permission.adcode IS '行政区划编码'; +COMMENT ON COLUMN upms.tb_sys_permission.tenant_id IS '租户ID'; +COMMENT ON COLUMN upms.tb_sys_permission.tenant_path IS '租户路径'; +COMMENT ON COLUMN upms.tb_sys_permission.dept_id IS '部门ID'; +COMMENT ON COLUMN upms.tb_sys_permission.dept_path IS '部门路径'; +COMMENT ON COLUMN upms.tb_sys_permission.created_at IS '创建时间'; -CREATE TABLE IF NOT EXISTS upms.tb_sys_menu_route ( +CREATE TABLE IF NOT EXISTS upms.tb_sys_menu ( route_id VARCHAR(64) PRIMARY KEY, parent_route_id VARCHAR(64), route_path VARCHAR(255) NOT NULL, @@ -76,16 +122,32 @@ CREATE TABLE IF NOT EXISTS upms.tb_sys_menu_route ( icon VARCHAR(64), permission_code VARCHAR(128), hidden BOOLEAN NOT NULL DEFAULT FALSE, - province_code VARCHAR(12) NOT NULL, - area_code VARCHAR(12) NOT NULL, + adcode VARCHAR(12) NOT NULL, tenant_id VARCHAR(64) NOT NULL, tenant_path VARCHAR(255) NOT NULL, dept_id VARCHAR(64), dept_path VARCHAR(255), created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); +COMMENT ON TABLE upms.tb_sys_menu IS '菜单表'; +COMMENT ON COLUMN upms.tb_sys_menu.route_id IS '路由ID'; +COMMENT ON COLUMN upms.tb_sys_menu.parent_route_id IS '父路由ID'; +COMMENT ON COLUMN upms.tb_sys_menu.route_path IS '路由路径'; +COMMENT ON COLUMN upms.tb_sys_menu.route_name IS '路由名称'; +COMMENT ON COLUMN upms.tb_sys_menu.component_key IS '组件标识'; +COMMENT ON COLUMN upms.tb_sys_menu.layout_type IS '布局类型'; +COMMENT ON COLUMN upms.tb_sys_menu.title IS '菜单标题'; +COMMENT ON COLUMN upms.tb_sys_menu.icon IS '图标'; +COMMENT ON COLUMN upms.tb_sys_menu.permission_code IS '权限编码'; +COMMENT ON COLUMN upms.tb_sys_menu.hidden IS '是否隐藏'; +COMMENT ON COLUMN upms.tb_sys_menu.adcode IS '行政区划编码'; +COMMENT ON COLUMN upms.tb_sys_menu.tenant_id IS '租户ID'; +COMMENT ON COLUMN upms.tb_sys_menu.tenant_path IS '租户路径'; +COMMENT ON COLUMN upms.tb_sys_menu.dept_id IS '部门ID'; +COMMENT ON COLUMN upms.tb_sys_menu.dept_path IS '部门路径'; +COMMENT ON COLUMN upms.tb_sys_menu.created_at IS '创建时间'; -CREATE INDEX IF NOT EXISTS idx_sys_tenant_area ON upms.tb_sys_tenant(province_code, area_code); +CREATE INDEX IF NOT EXISTS idx_sys_tenant_adcode ON upms.tb_sys_tenant(adcode); CREATE INDEX IF NOT EXISTS idx_dept_tenant ON upms.tb_sys_dept(tenant_id, dept_path); CREATE INDEX IF NOT EXISTS idx_user_tenant ON upms.tb_sys_user(tenant_id, dept_id); -CREATE INDEX IF NOT EXISTS idx_route_tenant ON upms.tb_sys_menu_route(tenant_id, route_path); +CREATE INDEX IF NOT EXISTS idx_route_tenant ON upms.tb_sys_menu(tenant_id, route_path); diff --git a/init/pg/upms/20_init_upms_seed.sql b/init/pg/upms/20_init_upms_seed.sql index 6bd0b0e..d5a0323 100644 --- a/init/pg/upms/20_init_upms_seed.sql +++ b/init/pg/upms/20_init_upms_seed.sql @@ -1,43 +1,43 @@ INSERT INTO upms.tb_sys_tenant ( - tenant_id, parent_tenant_id, tenant_name, tenant_type, province_code, area_code, tenant_path + tenant_id, parent_tenant_id, tenant_name, tenant_type, adcode, tenant_path ) VALUES - ('SCH-HQ', NULL, 'K12Study 总校', 'HEAD_SCHOOL', '330000', '330100', '/SCH-HQ/'), - ('SCH-ZJ-HZ-01', 'SCH-HQ', '杭州分校', 'CITY_SCHOOL', '330000', '330100', '/SCH-HQ/SCH-ZJ-HZ-01/') + ('SCH-HQ', NULL, 'K12Study 总校', 'HEAD_SCHOOL', '330100', '/SCH-HQ/'), + ('SCH-ZJ-HZ-01', 'SCH-HQ', '杭州分校', 'CITY_SCHOOL', '330100', '/SCH-HQ/SCH-ZJ-HZ-01/') ON CONFLICT (tenant_id) DO NOTHING; INSERT INTO upms.tb_sys_dept ( - dept_id, parent_dept_id, tenant_id, dept_name, dept_type, province_code, area_code, tenant_path, dept_path + dept_id, parent_dept_id, tenant_id, dept_name, dept_type, adcode, tenant_path, dept_path ) VALUES - ('DEPT-HQ', NULL, 'SCH-HQ', '总校教学部', 'GRADE', '330000', '330100', '/SCH-HQ/', '/DEPT-HQ/'), - ('DEPT-HQ-MATH', 'DEPT-HQ', 'SCH-HQ', '数学学科组', 'SUBJECT', '330000', '330100', '/SCH-HQ/', '/DEPT-HQ/DEPT-HQ-MATH/'), - ('DEPT-HQ-ADMIN', 'DEPT-HQ', 'SCH-HQ', '总校运营组', 'ADMIN', '330000', '330100', '/SCH-HQ/', '/DEPT-HQ/DEPT-HQ-ADMIN/') + ('DEPT-HQ', NULL, 'SCH-HQ', '总校教学部', 'GRADE', '330100', '/SCH-HQ/', '/DEPT-HQ/'), + ('DEPT-HQ-MATH', 'DEPT-HQ', 'SCH-HQ', '数学学科组', 'SUBJECT', '330100', '/SCH-HQ/', '/DEPT-HQ/DEPT-HQ-MATH/'), + ('DEPT-HQ-ADMIN', 'DEPT-HQ', 'SCH-HQ', '总校运营组', 'ADMIN', '330100', '/SCH-HQ/', '/DEPT-HQ/DEPT-HQ-ADMIN/') ON CONFLICT (dept_id) DO NOTHING; INSERT INTO upms.tb_sys_user ( - user_id, username, display_name, password_hash, province_code, area_code, tenant_id, tenant_path, dept_id, dept_path + user_id, username, display_name, password_hash, adcode, tenant_id, tenant_path, dept_id, dept_path ) VALUES - ('U10001', 'admin', 'K12Study 管理员', '$2a$10$bootstrap', '330000', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/') + ('U10001', 'admin', 'K12Study 管理员', '$2a$10$bootstrap', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/') ON CONFLICT (user_id) DO NOTHING; INSERT INTO upms.tb_sys_role ( - role_id, role_code, role_name, province_code, area_code, tenant_id, tenant_path, dept_id, dept_path + role_id, role_code, role_name, adcode, tenant_id, tenant_path, dept_id, dept_path ) VALUES - ('ROLE-ORG-ADMIN', 'ORG_ADMIN', '机构管理员', '330000', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/') + ('ROLE-ORG-ADMIN', 'ORG_ADMIN', '机构管理员', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/') ON CONFLICT (role_id) DO NOTHING; INSERT INTO upms.tb_sys_permission ( - permission_id, permission_code, permission_name, province_code, area_code, tenant_id, tenant_path, dept_id, dept_path + permission_id, permission_code, permission_name, adcode, tenant_id, tenant_path, dept_id, dept_path ) VALUES - ('PERM-DASHBOARD', 'dashboard:view', '查看控制台', '330000', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/'), - ('PERM-TENANT', 'tenant:view', '查看租户组织', '330000', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/') + ('PERM-DASHBOARD', 'dashboard:view', '查看控制台', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/'), + ('PERM-TENANT', 'tenant:view', '查看租户组织', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/') ON CONFLICT (permission_id) DO NOTHING; -INSERT INTO upms.tb_sys_menu_route ( +INSERT INTO upms.tb_sys_menu ( route_id, parent_route_id, route_path, route_name, component_key, layout_type, title, icon, permission_code, - hidden, province_code, area_code, tenant_id, tenant_path, dept_id, dept_path + hidden, adcode, tenant_id, tenant_path, dept_id, dept_path ) VALUES ('ROUTE-DASHBOARD', NULL, '/', 'dashboard', 'dashboard', 'SIDEBAR', '控制台', 'layout-dashboard', 'dashboard:view', FALSE, - '330000', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/'), + '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/'), ('ROUTE-TENANT', NULL, '/tenant', 'tenant-management', 'tenant', 'SIDEBAR', '租户组织', 'building-2', 'tenant:view', FALSE, - '330000', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/') + '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/') ON CONFLICT (route_id) DO NOTHING;