CREATE DATABASE IF NOT EXISTS kbase DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE kbase;


-- 1. 用户基础表
CREATE TABLE IF NOT EXISTS user (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID，主键',
    username VARCHAR(64) NOT NULL UNIQUE COMMENT '登录用户名，唯一',
    password VARCHAR(128) NOT NULL COMMENT '用户密码（建议加密存储）',
    add_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT='用户基础表';


-- 2. 角色表
CREATE TABLE IF NOT EXISTS role (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '角色ID',
    role_code VARCHAR(64) NOT NULL UNIQUE COMMENT '角色编码（如 admin/user/guest）',
    role_name VARCHAR(64) NOT NULL COMMENT '角色名称',
    add_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT='系统角色表';


-- 3. 用户-角色关联表
CREATE TABLE IF NOT EXISTS user_role (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
    user_id BIGINT NOT NULL COMMENT '用户ID',
    role_id BIGINT NOT NULL COMMENT '角色ID',
    add_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_user_id(user_id),
    INDEX idx_role_id(role_id),
    UNIQUE KEY uk_user_role (user_id, role_id)
) COMMENT='用户与角色关联表';


-- 4. 文件表
CREATE TABLE IF NOT EXISTS file (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '文件ID',
    file_name VARCHAR(255) NOT NULL COMMENT '文件名或路径',
    file_path VARCHAR(512) NOT NULL COMMENT '存储路径',
    add_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) COMMENT='知识库文件表';


-- 5. 角色-文件可见规则表（适合批量规则分配权限）
CREATE TABLE IF NOT EXISTS role_file_rule (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
    role_id BIGINT NOT NULL COMMENT '角色ID',
    file_pattern VARCHAR(255) NOT NULL COMMENT '可访问文件名/路径模式（如前缀、正则）',
    remark VARCHAR(255) COMMENT '规则说明',
    add_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_role_id(role_id),
    UNIQUE KEY uk_role_pattern (role_id, file_pattern)
) COMMENT='角色-文件可访问规则表';

-- 6. 用户token表
CREATE TABLE IF NOT EXISTS user_token (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键，自增',
    user_id BIGINT NOT NULL COMMENT '用户ID，业务逻辑关联user表',
    token VARCHAR(128) NOT NULL UNIQUE COMMENT '用户登录token',
    login_at DATETIME NOT NULL COMMENT '登录时间',
    expired_at DATETIME NOT NULL COMMENT '过期时间',
    add_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_user_id(user_id),
    INDEX idx_token(token)
) COMMENT='用户登录Token表';


-- 7. 用户-文件直接授权关联表
CREATE TABLE IF NOT EXISTS user_file (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
    user_id BIGINT NOT NULL COMMENT '用户ID',
    file_id BIGINT NOT NULL COMMENT '文件ID',
    add_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_user_id(user_id),
    INDEX idx_file_id(file_id),
    UNIQUE INDEX uniq_user_file(user_id, file_id)
) COMMENT='用户-文件直接授权关联表（用于特殊文件个别授权）';

-- 8. 对象存储上传记录表
CREATE TABLE IF NOT EXISTS oss_upload_record (
    id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
    file_name VARCHAR(255) NOT NULL COMMENT '文件名',
    bucket_name VARCHAR(128) NOT NULL COMMENT '目标 bucket 名',
    uploader VARCHAR(128) NOT NULL COMMENT '上传人用户名',
    upload_time DATETIME NOT NULL COMMENT '上传时间',
    object_path VARCHAR(512) NOT NULL COMMENT 'MinIO 存储路径',
    url VARCHAR(1024) COMMENT '访问链接（如CDN代理后的地址）',
    expire_time DATETIME NOT NULL DEFAULT '9999-12-31 23:59:59' COMMENT '链接过期时间（默认永久）',
    add_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    INDEX idx_uploader(uploader),
    INDEX idx_file_name(file_name),
    INDEX idx_bucket(bucket_name)
) COMMENT='对象存储上传记录表';



