This commit is contained in:
2026-04-17 16:31:32 +08:00
parent adadb3bf1d
commit 2476655b28
116 changed files with 3875 additions and 583 deletions

View File

@@ -4,6 +4,8 @@ CREATE SCHEMA IF NOT EXISTS auth;
DROP TABLE IF EXISTS auth.tb_auth_refresh_token CASCADE;
CREATE TABLE IF NOT EXISTS auth.tb_auth_refresh_token (
token_id VARCHAR(64) PRIMARY KEY,
session_id VARCHAR(64) NOT NULL,
client_type VARCHAR(32) NOT NULL DEFAULT 'WEB',
user_id VARCHAR(64) NOT NULL,
username VARCHAR(64) NOT NULL,
adcode VARCHAR(12),
@@ -14,10 +16,14 @@ CREATE TABLE IF NOT EXISTS auth.tb_auth_refresh_token (
refresh_token TEXT NOT NULL,
expire_at TIMESTAMP NOT NULL,
revoked BOOLEAN NOT NULL DEFAULT FALSE,
revoked_at TIMESTAMP,
last_active_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
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.session_id IS '会话ID';
COMMENT ON COLUMN auth.tb_auth_refresh_token.client_type IS '客户端类型WEB/MINI';
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 '行政区划编码';
@@ -28,6 +34,8 @@ 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.revoked_at IS '撤销时间';
COMMENT ON COLUMN auth.tb_auth_refresh_token.last_active_at IS '最后活跃时间';
COMMENT ON COLUMN auth.tb_auth_refresh_token.created_at IS '创建时间';
DROP TABLE IF EXISTS auth.tb_auth_login_audit CASCADE;
@@ -35,6 +43,7 @@ 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,
client_type VARCHAR(32) NOT NULL DEFAULT 'WEB',
adcode VARCHAR(12),
tenant_id VARCHAR(64),
tenant_path VARCHAR(255),
@@ -42,12 +51,14 @@ CREATE TABLE IF NOT EXISTS auth.tb_auth_login_audit (
dept_path VARCHAR(255),
login_ip VARCHAR(64),
login_status VARCHAR(32) NOT NULL,
failure_reason VARCHAR(255),
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.client_type 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 '租户路径';
@@ -55,7 +66,10 @@ 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.failure_reason 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_refresh_token_user_client ON auth.tb_auth_refresh_token(user_id, client_type, session_id);
CREATE UNIQUE INDEX IF NOT EXISTS idx_auth_refresh_token_value ON auth.tb_auth_refresh_token(refresh_token);
CREATE INDEX IF NOT EXISTS idx_auth_login_audit_tenant ON auth.tb_auth_login_audit(tenant_id, created_at DESC);

View File

@@ -46,12 +46,16 @@ COMMENT ON COLUMN upms.tb_sys_dept.created_at IS '创建时间';
DROP TABLE IF EXISTS upms.tb_school_class_course_rel CASCADE;
DROP TABLE IF EXISTS upms.tb_school_class_member CASCADE;
DROP TABLE IF EXISTS upms.tb_school_class CASCADE;
DROP TABLE IF EXISTS upms.tb_sys_user_role CASCADE;
DROP TABLE IF EXISTS upms.tb_sys_user CASCADE;
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,
mobile_phone VARCHAR(20),
mobile_bind_status VARCHAR(16) NOT NULL DEFAULT 'UNBOUND',
mobile_verified_at TIMESTAMP,
adcode VARCHAR(12) NOT NULL,
tenant_id VARCHAR(64) NOT NULL,
tenant_path VARCHAR(255) NOT NULL,
@@ -65,6 +69,9 @@ 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.mobile_phone IS '手机号';
COMMENT ON COLUMN upms.tb_sys_user.mobile_bind_status IS '手机号绑定状态';
COMMENT ON COLUMN upms.tb_sys_user.mobile_verified_at 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 '租户路径';
@@ -219,6 +226,23 @@ 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 '创建时间';
DROP TABLE IF EXISTS upms.tb_sys_user_role CASCADE;
CREATE TABLE IF NOT EXISTS upms.tb_sys_user_role (
user_id VARCHAR(64) NOT NULL,
role_id VARCHAR(64) NOT NULL,
tenant_id VARCHAR(64) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (user_id, role_id),
CONSTRAINT fk_sys_user_role_user
FOREIGN KEY (user_id) REFERENCES upms.tb_sys_user(user_id) ON DELETE CASCADE,
CONSTRAINT fk_sys_user_role_role
FOREIGN KEY (role_id) REFERENCES upms.tb_sys_role(role_id) ON DELETE CASCADE
);
COMMENT ON TABLE upms.tb_sys_user_role IS '用户角色关系表';
COMMENT ON COLUMN upms.tb_sys_user_role.user_id IS '用户ID';
COMMENT ON COLUMN upms.tb_sys_user_role.role_id IS '角色ID';
COMMENT ON COLUMN upms.tb_sys_user_role.tenant_id IS '租户ID';
COMMENT ON COLUMN upms.tb_sys_user_role.created_at IS '创建时间';
DROP TABLE IF EXISTS upms.tb_sys_menu CASCADE;
@@ -420,6 +444,9 @@ COMMENT ON COLUMN upms.tb_sys_message_recipient.updated_at IS '更新时间';
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 UNIQUE INDEX IF NOT EXISTS uk_sys_user_tenant_mobile ON upms.tb_sys_user(tenant_id, mobile_phone) WHERE mobile_phone IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_sys_user_role_user ON upms.tb_sys_user_role(user_id, tenant_id);
CREATE INDEX IF NOT EXISTS idx_sys_user_role_role ON upms.tb_sys_user_role(role_id, tenant_id);
CREATE INDEX IF NOT EXISTS idx_school_class_tenant_dept ON upms.tb_school_class(tenant_id, dept_id, grade_code);
CREATE INDEX IF NOT EXISTS idx_school_class_member_tenant_user ON upms.tb_school_class_member(tenant_id, user_id, member_status);
CREATE INDEX IF NOT EXISTS idx_school_class_course_rel_tenant_course ON upms.tb_school_class_course_rel(tenant_id, course_id, relation_status);

View File

@@ -14,17 +14,27 @@ INSERT INTO upms.tb_sys_dept (
ON CONFLICT (dept_id) DO NOTHING;
INSERT INTO upms.tb_sys_user (
user_id, username, display_name, password_hash, adcode, tenant_id, tenant_path, dept_id, dept_path
user_id, username, display_name, password_hash, mobile_phone, mobile_bind_status, mobile_verified_at,
adcode, tenant_id, tenant_path, dept_id, dept_path
) VALUES
('U10001', 'admin', 'K12Study 管理员', '$2a$10$bootstrap', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/')
('U10001', 'admin', 'K12Study 管理员', 'admin123', NULL, 'UNBOUND', NULL, '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/'),
('U20001', 'student01', '张同学', 'stud123', '13800000001', 'BOUND', CURRENT_TIMESTAMP, '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ', '/DEPT-HQ/')
ON CONFLICT (user_id) DO NOTHING;
INSERT INTO upms.tb_sys_role (
role_id, role_code, role_name, adcode, tenant_id, tenant_path, dept_id, dept_path
) VALUES
('ROLE-ORG-ADMIN', 'ORG_ADMIN', '机构管理员', '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/'),
('ROLE-STUDENT', 'STUDENT', '学生', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ', '/DEPT-HQ/')
ON CONFLICT (role_id) DO NOTHING;
INSERT INTO upms.tb_sys_user_role (
user_id, role_id, tenant_id
) VALUES
('U10001', 'ROLE-ORG-ADMIN', 'SCH-HQ'),
('U20001', 'ROLE-STUDENT', 'SCH-HQ')
ON CONFLICT (user_id, role_id) DO NOTHING;
INSERT INTO upms.tb_sys_menu (
route_id, parent_route_id, route_path, route_name, component_key, layout_type, title, icon, permission_code,
@@ -43,6 +53,25 @@ INSERT INTO upms.tb_sys_role_menu (
('ROLE-ORG-ADMIN', 'ROUTE-TENANT', '330100', 'SCH-HQ', '/SCH-HQ/', 'DEPT-HQ-ADMIN', '/DEPT-HQ/DEPT-HQ-ADMIN/')
ON CONFLICT (role_id, route_id) DO NOTHING;
INSERT INTO upms.tb_school_class (
class_id, tenant_id, dept_id, class_code, class_name, grade_code, status, adcode, tenant_path, dept_path, created_by
) VALUES
('CLS-2026-01', 'SCH-HQ', 'DEPT-HQ', 'G1-CLASS-1', '高一1', 'G1', 'ACTIVE', '330100', '/SCH-HQ/', '/DEPT-HQ/', 'U10001')
ON CONFLICT (class_id) DO NOTHING;
INSERT INTO upms.tb_school_class_member (
class_id, user_id, member_role, member_status, tenant_id
) VALUES
('CLS-2026-01', 'U20001', 'STUDENT', 'ACTIVE', 'SCH-HQ'),
('CLS-2026-01', 'U10001', 'HEAD_TEACHER', 'ACTIVE', 'SCH-HQ')
ON CONFLICT (class_id, user_id) DO NOTHING;
INSERT INTO upms.tb_school_class_course_rel (
class_id, course_id, relation_status, tenant_id
) VALUES
('CLS-2026-01', 'COURSE-MATH-G1', 'ACTIVE', 'SCH-HQ')
ON CONFLICT (class_id, course_id) DO NOTHING;
INSERT INTO upms.tb_sys_message (
message_id, message_type, biz_type, title, content, content_object_type, content_object_id, web_jump_url,
send_channel, sender_user_id, adcode, tenant_id, tenant_path, message_status, send_at, ext_json
@@ -114,5 +143,18 @@ INSERT INTO upms.tb_sys_message_recipient (
'/SCH-HQ/',
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP
),
(
'MSG-20260415001',
'U20001',
'DELIVERED',
'UNREAD',
NULL,
NULL,
NULL,
'SCH-HQ',
'/SCH-HQ/',
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP
)
ON CONFLICT (message_id, recipient_user_id) DO NOTHING;