06488f0237
功能: - Go后端 (Gin + GORM + PostgreSQL) - UniApp用户端 (iOS/Android/小程序) - DaisyUI5后台管理 - JWT认证 + 微信登录 - 盲选加权算法 - 会员系统 + 优惠券 - 打分评价 + 偏好学习
197 lines
5.3 KiB
SQL
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);
|