Files
blind-select/backend/migrations/001_initial_schema.sql
T
admin 06488f0237 Initial commit: 帮我选盲选应用
功能:
- Go后端 (Gin + GORM + PostgreSQL)
- UniApp用户端 (iOS/Android/小程序)
- DaisyUI5后台管理
- JWT认证 + 微信登录
- 盲选加权算法
- 会员系统 + 优惠券
- 打分评价 + 偏好学习
2026-06-08 20:18:31 +00:00

197 lines
5.3 KiB
SQL

-- Initial schema for blind-select
-- Categories
CREATE TABLE IF NOT EXISTS categories (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
icon VARCHAR(50),
type VARCHAR(50) NOT NULL, -- food/entertainment/shopping/activity
sort INT DEFAULT 0,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
-- Admins
CREATE TABLE IF NOT EXISTS admins (
id SERIAL PRIMARY KEY,
username VARCHAR(100) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
role VARCHAR(50) DEFAULT 'editor', -- admin/editor/viewer
perm_json TEXT,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- Users
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
nickname VARCHAR(100),
avatar VARCHAR(255),
phone VARCHAR(20) UNIQUE,
wechat_openid VARCHAR(100) UNIQUE,
password_hash VARCHAR(255),
pref_score JSONB,
tags TEXT[],
repeat_days INT DEFAULT 7,
blacklist BIGINT[],
member_level INT DEFAULT 0,
member_expires TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
deleted_at TIMESTAMP
);
-- Merchants
CREATE TABLE IF NOT EXISTS merchants (
id SERIAL PRIMARY KEY,
name VARCHAR(200) NOT NULL,
avatar VARCHAR(255),
category_id INT,
category_name VARCHAR(100),
rating FLOAT8 DEFAULT 0,
price_range VARCHAR(50),
location VARCHAR(100),
lat FLOAT8,
lng FLOAT8,
tags TEXT[],
commission FLOAT8 DEFAULT 0.1,
total_reviews INT DEFAULT 0,
total_score FLOAT8 DEFAULT 0,
quality_score FLOAT8 DEFAULT 0.5,
status VARCHAR(20) DEFAULT 'pending',
description TEXT,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
deleted_at TIMESTAMP
);
-- Packages
CREATE TABLE IF NOT EXISTS packages (
id SERIAL PRIMARY KEY,
merchant_id INT NOT NULL,
category_id INT,
name VARCHAR(200) NOT NULL,
description TEXT,
price_min INT,
price_max INT,
actual_price INT,
tags TEXT[],
stock INT DEFAULT 9999,
weight FLOAT8 DEFAULT 1.0,
rating FLOAT8 DEFAULT 0,
review_count INT DEFAULT 0,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
deleted_at TIMESTAMP
);
-- User behaviors (includes review scores)
CREATE TABLE IF NOT EXISTS user_behaviors (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
package_id INT NOT NULL,
behavior_type VARCHAR(50), -- viewed/selected/attended/reviewed/skipped
system_score FLOAT8 DEFAULT 0,
review_rating INT8,
taste_score INT8,
value_score INT8,
distance_score INT8,
match_score INT8,
feedback_tags TEXT[],
text TEXT,
is_repeat BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
-- Blind sessions
CREATE TABLE IF NOT EXISTS blind_sessions (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
category_id INT,
price_range VARCHAR(50),
distance_range VARCHAR(50),
result_package_id INT,
revealed_at TIMESTAMP,
accepted BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
-- Blind results (revealed details)
CREATE TABLE IF NOT EXISTS blind_results (
session_id INT PRIMARY KEY,
user_id INT NOT NULL,
package_name VARCHAR(200),
merchant_name VARCHAR(200),
merchant_rating FLOAT8,
match_score FLOAT8,
description TEXT,
price_range VARCHAR(50),
actual_price INT,
has_coupon BOOLEAN DEFAULT FALSE,
coupon_value VARCHAR(100),
matched_tags TEXT[],
created_at TIMESTAMP DEFAULT NOW()
);
-- Coupons
CREATE TABLE IF NOT EXISTS coupons (
id SERIAL PRIMARY KEY,
merchant_id INT NOT NULL,
package_id INT,
user_id INT,
type VARCHAR(20), -- discount/coupon/free/gift
value FLOAT8,
min_amount INT,
total_count INT DEFAULT 100,
remain_count INT DEFAULT 100,
user_code VARCHAR(50) UNIQUE,
pool_code VARCHAR(50),
status VARCHAR(20) DEFAULT 'available', -- available/claimed/used/expired
used_at TIMESTAMP,
valid_start TIMESTAMP,
valid_end TIMESTAMP,
commission FLOAT8 DEFAULT 0,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
deleted_at TIMESTAMP
);
-- Members
CREATE TABLE IF NOT EXISTS members (
id SERIAL PRIMARY KEY,
user_id INT,
level INT DEFAULT 0,
start_date TIMESTAMP,
end_date TIMESTAMP,
payment_method VARCHAR(50),
amount FLOAT8,
order_no VARCHAR(100) UNIQUE,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
deleted_at TIMESTAMP
);
-- Activities
CREATE TABLE IF NOT EXISTS activities (
id SERIAL PRIMARY KEY,
name VARCHAR(200),
type VARCHAR(50),
start TIMESTAMP,
end TIMESTAMP,
config_json TEXT,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
-- Indexes
CREATE INDEX idx_users_phone ON users(phone);
CREATE INDEX idx_users_wechat ON users(wechat_openid);
CREATE INDEX idx_merchants_status ON merchants(status);
CREATE INDEX idx_packages_merchant ON packages(merchant_id);
CREATE INDEX idx_packages_status ON packages(status);
CREATE INDEX idx_behaviors_user ON user_behaviors(user_id);
CREATE INDEX idx_blind_user ON blind_sessions(user_id);
CREATE INDEX idx_coupons_status ON coupons(status);