|
|
@@ -5,34 +5,57 @@
|
|
|
CREATE SCHEMA IF NOT EXISTS dev;
|
|
|
|
|
|
|
|
|
--- 删除序列(如果存在)
|
|
|
--- DROP SEQUENCE IF EXISTS dev.user_id_seq;
|
|
|
-
|
|
|
--- 创建新序列
|
|
|
--- CREATE SEQUENCE dev.user_id_seq
|
|
|
--- START WITH 1
|
|
|
--- INCREMENT BY 1
|
|
|
--- NO MINVALUE
|
|
|
--- NO MAXVALUE
|
|
|
--- CACHE 1;
|
|
|
-
|
|
|
--- 添加注释
|
|
|
--- COMMENT ON SEQUENCE dev.user_seq IS '用户表ID序列';
|
|
|
-
|
|
|
DROP TABLE IF EXISTS dev.user;
|
|
|
-- 在 dev schema 下创建用户表
|
|
|
CREATE TABLE dev.user (
|
|
|
- id SERIAL PRIMARY KEY,
|
|
|
- account VARCHAR(50) NOT NULL UNIQUE,
|
|
|
- password VARCHAR(255) NOT NULL,
|
|
|
- username VARCHAR(100) NOT NULL,
|
|
|
- role VARCHAR(20) NOT NULL DEFAULT 'user' CHECK ( role IN ('user','expert','admin') ),
|
|
|
- avatar TEXT,
|
|
|
- phone_number char(11),
|
|
|
- enable INT NOT NULL DEFAULT 1,
|
|
|
- delete_flag INT NOT NULL DEFAULT 0
|
|
|
+ id SERIAL PRIMARY KEY,
|
|
|
+ account VARCHAR(50) NOT NULL UNIQUE,
|
|
|
+ password VARCHAR(255) NOT NULL,
|
|
|
+ username VARCHAR(100) NOT NULL,
|
|
|
+ role VARCHAR(20) NOT NULL DEFAULT 'user' CHECK ( role IN ('user','expert','admin') ),
|
|
|
+ avatar TEXT,
|
|
|
+ phone_number char(11),
|
|
|
+ enable INT NOT NULL DEFAULT 1,
|
|
|
+ delete_flag INT NOT NULL DEFAULT 0
|
|
|
+);
|
|
|
+
|
|
|
+-- =============================================
|
|
|
+-- 钱包表
|
|
|
+-- =============================================
|
|
|
+DROP TABLE IF EXISTS dev.wallet;
|
|
|
+CREATE TABLE dev.wallet (
|
|
|
+ id BIGSERIAL PRIMARY KEY,
|
|
|
+ user_id BIGINT NOT NULL UNIQUE,
|
|
|
+ balance DECIMAL(10,2) NOT NULL DEFAULT 0,
|
|
|
+ created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
+ updated_at TIMESTAMP NOT NULL DEFAULT now()
|
|
|
+);
|
|
|
+
|
|
|
+COMMENT ON TABLE dev.wallet IS '钱包表';
|
|
|
+COMMENT ON COLUMN dev.wallet.user_id IS '用户ID';
|
|
|
+COMMENT ON COLUMN dev.wallet.balance IS '钱包余额';
|
|
|
+
|
|
|
+CREATE UNIQUE INDEX idx_wallet_user_id ON dev.wallet(user_id);
|
|
|
+
|
|
|
+-- =============================================
|
|
|
+-- 用户扩展信息表
|
|
|
+-- =============================================
|
|
|
+DROP TABLE IF EXISTS dev.user_profile;
|
|
|
+CREATE TABLE dev.user_profile (
|
|
|
+ id BIGSERIAL PRIMARY KEY,
|
|
|
+ user_id BIGINT NOT NULL UNIQUE,
|
|
|
+ level VARCHAR(20) NOT NULL DEFAULT 'gold' CHECK ( level IN ('gold','diamond','master') ),
|
|
|
+ is_realname BOOLEAN DEFAULT FALSE,
|
|
|
+ created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
+ updated_at TIMESTAMP NOT NULL DEFAULT now()
|
|
|
);
|
|
|
|
|
|
+COMMENT ON TABLE dev.user_profile IS '用户扩展信息表';
|
|
|
+COMMENT ON COLUMN dev.user_profile.level IS '等级:gold黄金 diamond钻石 master大师';
|
|
|
+COMMENT ON COLUMN dev.user_profile.is_realname IS '是否已实名认证';
|
|
|
+
|
|
|
+CREATE UNIQUE INDEX idx_up_user_id ON dev.user_profile(user_id);
|
|
|
+
|
|
|
-- 添加注释
|
|
|
COMMENT ON TABLE dev.user IS '用户表';
|
|
|
COMMENT ON COLUMN dev.user.id IS '用户ID,自增主键';
|
|
|
@@ -72,9 +95,185 @@ CREATE UNIQUE INDEX idx_meta_key ON dev.meta (key);
|
|
|
CREATE INDEX idx_meta_value_gin ON dev.meta USING GIN (value);
|
|
|
|
|
|
INSERT INTO dev.meta(key, value) VALUES
|
|
|
- ('website_config','{
|
|
|
- "title": "示例网站",
|
|
|
+ ('site','{
|
|
|
+ "title": "咕咕嘎嘎论坛",
|
|
|
"logo": "",
|
|
|
- "announcement": "欢迎访问我们的网站!",
|
|
|
- "statement": "版权所有 © 2025 示例网站"
|
|
|
- }');
|
|
|
+ "announcement": "欢迎访问咕咕嘎嘎论坛!",
|
|
|
+ "statement": "本站所有内容仅代表发布者个人观点,平台对内容的真实性、完整性、及时性不做任何保证,请用户理性参考,谨慎打赏。"
|
|
|
+ }');
|
|
|
+
|
|
|
+-- =============================================
|
|
|
+-- 帖子表
|
|
|
+-- =============================================
|
|
|
+DROP TABLE IF EXISTS dev.post;
|
|
|
+CREATE TABLE dev.post (
|
|
|
+ id BIGSERIAL PRIMARY KEY,
|
|
|
+ expert_id BIGINT NOT NULL,
|
|
|
+ title VARCHAR(200) NOT NULL,
|
|
|
+ content_intro TEXT,
|
|
|
+ content_paid TEXT,
|
|
|
+ price DECIMAL(10,2) NOT NULL,
|
|
|
+ hit_status VARCHAR(20) NOT NULL DEFAULT 'pending' CHECK ( hit_status IN ('pending','hit','miss') ),
|
|
|
+ view_count INT NOT NULL DEFAULT 0,
|
|
|
+ publish_time TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
+ expire_time TIMESTAMP NOT NULL,
|
|
|
+ delete_flag INT DEFAULT 0,
|
|
|
+ created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
+ updated_at TIMESTAMP NOT NULL DEFAULT now()
|
|
|
+);
|
|
|
+
|
|
|
+COMMENT ON TABLE dev.post IS '帖子表';
|
|
|
+COMMENT ON COLUMN dev.post.id IS '帖子ID';
|
|
|
+COMMENT ON COLUMN dev.post.expert_id IS '发布专家ID';
|
|
|
+COMMENT ON COLUMN dev.post.title IS '帖子标题(含期号)';
|
|
|
+COMMENT ON COLUMN dev.post.content_intro IS '内容简介(公开)';
|
|
|
+COMMENT ON COLUMN dev.post.content_paid IS '付费内容';
|
|
|
+COMMENT ON COLUMN dev.post.price IS '打赏金额';
|
|
|
+COMMENT ON COLUMN dev.post.hit_status IS '命中状态:pending待确认 hit命中 miss未命中';
|
|
|
+COMMENT ON COLUMN dev.post.view_count IS '查看人数(管理员可修改)';
|
|
|
+COMMENT ON COLUMN dev.post.publish_time IS '发布时间';
|
|
|
+COMMENT ON COLUMN dev.post.expire_time IS '过期时间,超出此时间自动转为公开';
|
|
|
+
|
|
|
+CREATE INDEX idx_post_expert_id ON dev.post(expert_id);
|
|
|
+CREATE INDEX idx_post_hit_status ON dev.post(hit_status);
|
|
|
+CREATE INDEX idx_post_expire_time ON dev.post(expire_time);
|
|
|
+CREATE INDEX idx_post_delete_flag ON dev.post(delete_flag);
|
|
|
+
|
|
|
+-- =============================================
|
|
|
+-- 帖子访问记录表
|
|
|
+-- =============================================
|
|
|
+DROP TABLE IF EXISTS dev.post_view_record;
|
|
|
+CREATE TABLE dev.post_view_record (
|
|
|
+ id BIGSERIAL PRIMARY KEY,
|
|
|
+ post_id BIGINT NOT NULL,
|
|
|
+ user_id BIGINT NOT NULL,
|
|
|
+ view_time TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
+ created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
+ updated_at TIMESTAMP NOT NULL DEFAULT now()
|
|
|
+);
|
|
|
+
|
|
|
+COMMENT ON TABLE dev.post_view_record IS '帖子访问记录表';
|
|
|
+COMMENT ON COLUMN dev.post_view_record.post_id IS '帖子ID';
|
|
|
+COMMENT ON COLUMN dev.post_view_record.user_id IS '访问用户ID';
|
|
|
+
|
|
|
+CREATE UNIQUE INDEX idx_pvr_post_user ON dev.post_view_record(post_id, user_id);
|
|
|
+
|
|
|
+-- =============================================
|
|
|
+-- 打赏订单表
|
|
|
+-- =============================================
|
|
|
+DROP TABLE IF EXISTS dev.order_tip;
|
|
|
+CREATE TABLE dev.order_tip (
|
|
|
+ id BIGSERIAL PRIMARY KEY,
|
|
|
+ user_id BIGINT NOT NULL,
|
|
|
+ post_id BIGINT NOT NULL,
|
|
|
+ expert_id BIGINT NOT NULL,
|
|
|
+ amount DECIMAL(10,2) NOT NULL,
|
|
|
+ status VARCHAR(20) NOT NULL DEFAULT 'completed',
|
|
|
+ create_time TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
+ created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
+ updated_at TIMESTAMP NOT NULL DEFAULT now()
|
|
|
+);
|
|
|
+
|
|
|
+COMMENT ON TABLE dev.order_tip IS '打赏订单表';
|
|
|
+COMMENT ON COLUMN dev.order_tip.user_id IS '打赏人ID';
|
|
|
+COMMENT ON COLUMN dev.order_tip.post_id IS '帖子ID';
|
|
|
+COMMENT ON COLUMN dev.order_tip.expert_id IS '被打赏专家ID';
|
|
|
+COMMENT ON COLUMN dev.order_tip.amount IS '打赏金额';
|
|
|
+
|
|
|
+CREATE INDEX idx_ot_user_id ON dev.order_tip(user_id);
|
|
|
+CREATE INDEX idx_ot_post_id ON dev.order_tip(post_id);
|
|
|
+CREATE INDEX idx_ot_expert_id ON dev.order_tip(expert_id);
|
|
|
+
|
|
|
+-- =============================================
|
|
|
+-- 钱包流水表
|
|
|
+-- =============================================
|
|
|
+DROP TABLE IF EXISTS dev.wallet_transaction;
|
|
|
+CREATE TABLE dev.wallet_transaction (
|
|
|
+ id BIGSERIAL PRIMARY KEY,
|
|
|
+ user_id BIGINT NOT NULL,
|
|
|
+ type VARCHAR(20) NOT NULL,
|
|
|
+ amount DECIMAL(10,2) NOT NULL,
|
|
|
+ balance_before DECIMAL(10,2),
|
|
|
+ balance_after DECIMAL(10,2),
|
|
|
+ status VARCHAR(20) NOT NULL DEFAULT 'success',
|
|
|
+ remark VARCHAR(255),
|
|
|
+ review_time TIMESTAMP,
|
|
|
+ created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
+ updated_at TIMESTAMP NOT NULL DEFAULT now()
|
|
|
+);
|
|
|
+
|
|
|
+COMMENT ON TABLE dev.wallet_transaction IS '钱包流水表';
|
|
|
+COMMENT ON COLUMN dev.wallet_transaction.user_id IS '用户ID';
|
|
|
+COMMENT ON COLUMN dev.wallet_transaction.type IS '流水类型:recharge充值 withdraw提现 tip_out打赏支出 admin_adjust管理员调整';
|
|
|
+COMMENT ON COLUMN dev.wallet_transaction.amount IS '金额,正数为收入,负数为支出';
|
|
|
+
|
|
|
+CREATE INDEX idx_wt_user_id ON dev.wallet_transaction(user_id);
|
|
|
+CREATE INDEX idx_wt_type ON dev.wallet_transaction(type);
|
|
|
+
|
|
|
+-- =============================================
|
|
|
+-- 实名认证表
|
|
|
+-- =============================================
|
|
|
+DROP TABLE IF EXISTS dev.realname_auth;
|
|
|
+CREATE TABLE dev.realname_auth (
|
|
|
+ id BIGSERIAL PRIMARY KEY,
|
|
|
+ user_id BIGINT NOT NULL UNIQUE,
|
|
|
+ real_name VARCHAR(50) NOT NULL,
|
|
|
+ id_card VARCHAR(18) NOT NULL,
|
|
|
+ id_card_front TEXT,
|
|
|
+ id_card_back TEXT,
|
|
|
+ status VARCHAR(20) NOT NULL DEFAULT 'pending' CHECK ( status IN ('pending','approved','rejected') ),
|
|
|
+ reject_reason VARCHAR(255),
|
|
|
+ review_time TIMESTAMP,
|
|
|
+ created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
+ updated_at TIMESTAMP NOT NULL DEFAULT now()
|
|
|
+);
|
|
|
+
|
|
|
+COMMENT ON TABLE dev.realname_auth IS '实名认证表';
|
|
|
+COMMENT ON COLUMN dev.realname_auth.user_id IS '用户ID';
|
|
|
+COMMENT ON COLUMN dev.realname_auth.real_name IS '真实姓名';
|
|
|
+COMMENT ON COLUMN dev.realname_auth.id_card IS '身份证号';
|
|
|
+COMMENT ON COLUMN dev.realname_auth.status IS '认证状态:pending待审核 approved通过 rejected驳回';
|
|
|
+
|
|
|
+CREATE UNIQUE INDEX idx_ra_user_id ON dev.realname_auth(user_id);
|
|
|
+
|
|
|
+-- =============================================
|
|
|
+-- 系统通知表
|
|
|
+-- =============================================
|
|
|
+DROP TABLE IF EXISTS dev.notification;
|
|
|
+CREATE TABLE dev.notification (
|
|
|
+ id BIGSERIAL PRIMARY KEY,
|
|
|
+ user_id BIGINT NOT NULL,
|
|
|
+ type VARCHAR(30) NOT NULL,
|
|
|
+ title VARCHAR(100),
|
|
|
+ content TEXT,
|
|
|
+ is_read BOOLEAN DEFAULT FALSE,
|
|
|
+ created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
+ updated_at TIMESTAMP NOT NULL DEFAULT now()
|
|
|
+);
|
|
|
+
|
|
|
+COMMENT ON TABLE dev.notification IS '系统通知表';
|
|
|
+COMMENT ON COLUMN dev.notification.user_id IS '接收人ID';
|
|
|
+COMMENT ON COLUMN dev.notification.type IS '通知类型:tip_success recharge_success withdraw_request withdraw_success withdraw_failed system';
|
|
|
+
|
|
|
+CREATE INDEX idx_notif_user_id ON dev.notification(user_id);
|
|
|
+CREATE INDEX idx_notif_is_read ON dev.notification(is_read);
|
|
|
+
|
|
|
+-- =============================================
|
|
|
+-- OSS附件表
|
|
|
+-- =============================================
|
|
|
+DROP TABLE IF EXISTS dev.attachment;
|
|
|
+CREATE TABLE dev.attachment (
|
|
|
+ id BIGSERIAL PRIMARY KEY,
|
|
|
+ user_id BIGINT NOT NULL,
|
|
|
+ url TEXT NOT NULL,
|
|
|
+ type VARCHAR(20),
|
|
|
+ created_at TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
+ updated_at TIMESTAMP NOT NULL DEFAULT now()
|
|
|
+);
|
|
|
+
|
|
|
+COMMENT ON TABLE dev.attachment IS 'OSS附件表';
|
|
|
+COMMENT ON COLUMN dev.attachment.user_id IS '上传人ID';
|
|
|
+COMMENT ON COLUMN dev.attachment.url IS 'OSS文件URL';
|
|
|
+COMMENT ON COLUMN dev.attachment.type IS '附件类型:avatar头像 id_card身份证 post_image帖子图片';
|
|
|
+
|
|
|
+CREATE INDEX idx_attachment_user_id ON dev.attachment(user_id);
|