更新
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user