add: user accomplished
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
CREATE TABLE user_verifications (
|
||||
id BIGINT PRIMARY KEY,
|
||||
user_id BIGINT NOT NULL REFERENCES users(id),
|
||||
role VARCHAR(20) NOT NULL,
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'pending',
|
||||
materials JSONB NOT NULL,
|
||||
reject_reason TEXT,
|
||||
reviewed_by BIGINT,
|
||||
reviewed_at TIMESTAMPTZ,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
|
||||
CONSTRAINT chk_verification_status CHECK (status IN ('pending', 'approved', 'rejected')),
|
||||
UNIQUE(user_id, role) -- 每个角色只有一条最新的认证记录
|
||||
);
|
||||
|
||||
-- Note:Auto update verification_status of users table
|
||||
CREATE OR REPLACE FUNCTION sync_user_verification_status()
|
||||
RETURNS TRIGGER AS $$
|
||||
DECLARE
|
||||
status_json JSONB;
|
||||
BEGIN
|
||||
SELECT jsonb_object_agg(role, status)
|
||||
INTO status_json
|
||||
FROM user_verifications
|
||||
WHERE user_id = NEW.user_id;
|
||||
|
||||
UPDATE users SET verification_status = status_json WHERE id = NEW.user_id;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE TRIGGER trigger_sync_verifications
|
||||
AFTER INSERT OR UPDATE ON user_verifications
|
||||
FOR EACH ROW EXECUTE FUNCTION sync_user_verification_status();
|
||||
@@ -0,0 +1,29 @@
|
||||
CREATE EXTENSION IF NOT EXISTS pg_trgm; -- 三元组模糊搜索
|
||||
CREATE EXTENSION IF NOT EXISTS btree_gin; -- 复合 GIN 索引
|
||||
CREATE EXTENSION IF NOT EXISTS pgcrypto; -- 加密函数
|
||||
|
||||
CREATE TABLE users
|
||||
(
|
||||
id BIGINT PRIMARY KEY,
|
||||
username VARCHAR(50) UNIQUE NOT NULL,
|
||||
password_hash VARCHAR(255) NOT NULL,
|
||||
phone VARCHAR(20) UNIQUE,
|
||||
email VARCHAR(100) UNIQUE,
|
||||
nickname VARCHAR(100) NOT NULL,
|
||||
avatar TEXT,
|
||||
bio TEXT,
|
||||
"current_role" VARCHAR(20) NOT NULL DEFAULT 'consumer',
|
||||
verified_roles TEXT[] DEFAULT ARRAY ['consumer']::TEXT[],
|
||||
-- 结构: {"player": "pending", "owner": "rejected", "consumer": "approved"}
|
||||
verification_status JSONB DEFAULT '{"consumer": "approved"}'::JSONB,
|
||||
is_admin BOOLEAN DEFAULT FALSE,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
deleted_at TIMESTAMPTZ,
|
||||
|
||||
CONSTRAINT chk_current_role CHECK (current_role IN ('consumer', 'player', 'owner', 'admin'))
|
||||
);
|
||||
|
||||
-- 索引
|
||||
CREATE INDEX idx_users_phone ON users (phone) WHERE deleted_at IS NULL;
|
||||
CREATE INDEX idx_users_username_trgm ON users USING gin (username gin_trgm_ops) WHERE deleted_at IS NULL;
|
||||
Reference in New Issue
Block a user