initial commit

This commit is contained in:
2025-05-22 19:39:08 +08:00
commit 531bb42d01
103 changed files with 10291 additions and 0 deletions

58
sql/categories.sql Normal file
View File

@ -0,0 +1,58 @@
-- 分类表 (支持多系统/模块使用,支持多级分类,使用 alias 字段)
CREATE TABLE categories (
-- 分类的唯一标识符,全局唯一
id VARCHAR(36) PRIMARY KEY DEFAULT gen_random_uuid()::varchar,
-- 标识分类所属的系统、模块或服务
system_id TEXT NOT NULL,
-- 分类名称
name TEXT NOT NULL,
-- 用于 URL 或程序内部识别的别名
alias TEXT,
-- 父级分类的 ID
-- 如果是顶级分类,此字段为 NULL
parent_id VARCHAR(36) REFERENCES categories(id) ON DELETE SET NULL,
-- 可选字段:分类的描述
description TEXT,
-- 记录创建时间
created_at TIMESTAMP WITH TIME ZONE DEFAULT now(),
-- 记录最后更新时间(可选)
updated_at TIMESTAMP WITH TIME ZONE,
-- 复合唯一约束:确保在同一个 system_id + parent_id 下,分类名称不重复
-- 这允许不同父级下的同名子分类,也允许不同系统下的同名顶级分类 (parent_id IS NULL)
CONSTRAINT uix_categories_system_parent_name UNIQUE (system_id, parent_id, name),
-- 复合唯一约束:确保在同一个 system_id + parent_id 下,分类 alias 不重复 (如果使用 alias 字段)
CONSTRAINT uix_categories_system_parent_alias UNIQUE (system_id, parent_id, alias),
-- 外键约束parent_id 引用回 categories 表自身的 id
CONSTRAINT fk_categories_parent
FOREIGN KEY (parent_id)
REFERENCES categories (id)
ON DELETE CASCADE -- 或 ON DELETE SET NULL根据业务决定删除父分类时如何处理子分类
-- ON DELETE CASCADE: 删除父分类时,所有子分类也会被删除
-- ON DELETE SET NULL: 删除父分类时,所有子分类的 parent_id 设为 NULL使其成为顶级分类
);
-- 为 system_id, parent_id, name 添加索引,用于按系统、父级和名称快速查找分类
CREATE INDEX idx_categories_system_parent_name ON categories (system_id, parent_id, name);
-- 如果经常按 system_id, parent_id 和 alias 查询分类
CREATE INDEX idx_categories_system_parent_alias ON categories (system_id, parent_id, alias);
-- 为 parent_id 添加索引,用于查找某个父级下的所有子分类
CREATE INDEX idx_categories_parent_id ON categories (parent_id);
-- 如果经常需要查找某个系统下的所有分类 (包括顶级和子级)
CREATE INDEX idx_categories_system_id ON categories (system_id);
-- 原有的 system_id + name/alias 索引已包含在新的复合索引中,通常不需要单独创建
-- CREATE INDEX idx_categories_system_id_name ON categories (system_id, name);
-- CREATE INDEX idx_categories_system_id_alias ON categories (system_id, alias);

40
sql/images.sql Normal file
View File

@ -0,0 +1,40 @@
-- 图片主表基础版
CREATE TABLE images (
-- 核心标识字段
image_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- 存储元数据
storage_key TEXT NOT NULL CHECK (storage_key ~ '^[a-z0-9/-]+$'),
file_name TEXT NOT NULL,
mime_type VARCHAR(32) NOT NULL CHECK (mime_type LIKE 'image/%'),
file_size BIGINT NOT NULL CHECK (file_size > 0),
width INT CHECK (width > 0),
height INT CHECK (height > 0),
-- 业务元数据
category_id UUID, -- 分类服务提供的UUID
tags TEXT[] DEFAULT '{}'::TEXT[],
-- 系统管控字段
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
is_deleted BOOLEAN DEFAULT FALSE NOT NULL
);
-- 索引配置
CREATE INDEX idx_images_category ON images (category_id);
CREATE INDEX idx_images_created ON images (created_at);
CREATE INDEX idx_images_tags ON images USING GIN(tags);
-- 自动更新时间触发器
CREATE OR REPLACE FUNCTION update_image_modified()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_update_image
BEFORE UPDATE ON images
FOR EACH ROW EXECUTE FUNCTION update_image_modified();

13
sql/users.sql Normal file
View File

@ -0,0 +1,13 @@
-- 1. 用户表 DDL
CREATE TABLE users (
user_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), -- 唯一用户 ID
username TEXT NOT NULL UNIQUE, -- 用户名
email TEXT UNIQUE, -- 邮箱
password_hash TEXT NOT NULL, -- 密码哈希
roles TEXT[] NOT NULL DEFAULT ARRAY[]::TEXT[], -- 角色列表
created_at TIMESTAMPTZ NOT NULL DEFAULT now() -- 创建时间
);
-- 为 username、email 建立索引,加速查询
CREATE INDEX idx_users_username ON users(username);
CREATE INDEX idx_users_email ON users(email);