Files
number/后端架构设计/02-数据库设计-用户Skill积分.md
2026-03-17 12:09:43 +08:00

235 lines
9.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 数据库设计文档(用户 / Skill / 积分模块)
## 一、用户模块
### 1.1 users 表
```sql
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
phone VARCHAR(20) UNIQUE NOT NULL COMMENT '手机号',
password_hash VARCHAR(255) NOT NULL COMMENT '密码哈希(BCrypt)',
nickname VARCHAR(100) COMMENT '昵称',
avatar_url VARCHAR(500) COMMENT '头像URL(腾讯云COS)',
status ENUM('active', 'inactive', 'banned') DEFAULT 'active' COMMENT '状态',
member_level ENUM('normal', 'silver', 'gold', 'diamond') DEFAULT 'normal' COMMENT '会员等级',
growth_value INT DEFAULT 0 COMMENT '成长值',
ban_reason VARCHAR(255) COMMENT '封禁原因',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP NULL COMMENT '软删除时间',
INDEX idx_phone (phone),
INDEX idx_status (status),
INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
```
> **变更说明**:新增 `ban_reason` 字段,用于管理员封禁用户时记录原因。
### 1.2 user_profiles 表
```sql
CREATE TABLE user_profiles (
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '资料ID',
user_id BIGINT NOT NULL UNIQUE COMMENT '用户ID',
real_name VARCHAR(100) COMMENT '真实姓名',
id_card VARCHAR(50) COMMENT '身份证号(加密)',
gender ENUM('male', 'female', 'unknown') DEFAULT 'unknown',
birthday DATE,
city VARCHAR(100),
bio TEXT COMMENT '个人简介',
auth_status ENUM('none', 'pending', 'approved', 'rejected') DEFAULT 'none' COMMENT '实名认证',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
INDEX idx_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户详细资料表';
```
### 1.3 user_auth 表
```sql
CREATE TABLE user_auth (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL COMMENT '用户ID',
auth_type ENUM('wechat', 'alipay', 'email') NOT NULL COMMENT '授权类型',
auth_id VARCHAR(255) NOT NULL COMMENT '第三方唯一ID',
auth_name VARCHAR(100) COMMENT '第三方昵称',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY unique_auth (auth_type, auth_id),
FOREIGN KEY (user_id) REFERENCES users(id),
INDEX idx_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='第三方授权表';
```
## 二、Skill模块
### 2.1 skill_categories 表
```sql
CREATE TABLE skill_categories (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL UNIQUE COMMENT '分类名称',
parent_id INT DEFAULT NULL COMMENT '父分类ID(NULL=一级)',
icon_url VARCHAR(500) COMMENT '图标(腾讯云COS)',
sort_order INT DEFAULT 0 COMMENT '排序',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_parent_id (parent_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Skill分类表';
INSERT INTO skill_categories (name, parent_id, sort_order) VALUES
('办公自动化', NULL, 1), ('数据处理', NULL, 2),
('客服助手', NULL, 3), ('内容创作', NULL, 4),
('营销推广', NULL, 5), ('其他', NULL, 99);
```
### 2.2 skills 表
```sql
CREATE TABLE skills (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
creator_id BIGINT NOT NULL COMMENT '创建者ID',
name VARCHAR(200) NOT NULL COMMENT 'Skill名称',
description TEXT COMMENT '详细描述',
cover_image_url VARCHAR(500) COMMENT '封面图(腾讯云COS)',
category_id INT NOT NULL COMMENT '分类ID',
price DECIMAL(10, 2) DEFAULT 0.00 COMMENT '价格(元)',
is_free BOOLEAN DEFAULT FALSE COMMENT '是否免费',
status ENUM('draft','pending','approved','rejected','offline') DEFAULT 'draft' COMMENT '状态',
reject_reason VARCHAR(500) COMMENT '审核拒绝原因',
auditor_id BIGINT COMMENT '审核人ID',
audited_at TIMESTAMP NULL COMMENT '审核时间',
download_count INT DEFAULT 0 COMMENT '下载次数',
rating DECIMAL(3, 2) DEFAULT 0.00 COMMENT '平均评分',
rating_count INT DEFAULT 0 COMMENT '评分人数',
version VARCHAR(50) COMMENT '版本号',
file_size BIGINT COMMENT '文件大小(字节)',
file_url VARCHAR(500) COMMENT '文件(腾讯云COS)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP NULL COMMENT '软删除',
FOREIGN KEY (creator_id) REFERENCES users(id),
FOREIGN KEY (category_id) REFERENCES skill_categories(id),
INDEX idx_creator_id (creator_id),
INDEX idx_category_id (category_id),
INDEX idx_status (status),
INDEX idx_is_free (is_free),
INDEX idx_created_at (created_at),
INDEX idx_download_count (download_count),
FULLTEXT INDEX ft_search (name, description)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Skill表';
```
> **变更说明**:新增 `auditor_id`、`audited_at` 字段,用于管理后台记录审核操作人和审核时间。
### 2.3 skill_reviews 表
```sql
CREATE TABLE skill_reviews (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
skill_id BIGINT NOT NULL,
user_id BIGINT NOT NULL,
order_id BIGINT COMMENT '关联订单ID',
rating INT NOT NULL COMMENT '评分(1-5)',
content TEXT COMMENT '评价内容',
images JSON COMMENT '图片URL数组(腾讯云COS)',
helpful_count INT DEFAULT 0 COMMENT '有帮助人数',
status ENUM('pending','approved','rejected') DEFAULT 'approved',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (skill_id) REFERENCES skills(id),
FOREIGN KEY (user_id) REFERENCES users(id),
INDEX idx_skill_id (skill_id),
INDEX idx_user_id (user_id),
CONSTRAINT chk_rating CHECK (rating >= 1 AND rating <= 5)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Skill评价表';
```
### 2.4 skill_downloads 表
```sql
CREATE TABLE skill_downloads (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
skill_id BIGINT NOT NULL,
user_id BIGINT NOT NULL,
order_id BIGINT COMMENT '关联订单(免费为NULL)',
download_type ENUM('free','paid','points') NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (skill_id) REFERENCES skills(id),
FOREIGN KEY (user_id) REFERENCES users(id),
UNIQUE KEY uk_user_skill (user_id, skill_id),
INDEX idx_skill_id (skill_id),
INDEX idx_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Skill获取记录表';
```
## 三、积分模块
### 3.1 user_points 表
```sql
CREATE TABLE user_points (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL UNIQUE,
available_points INT DEFAULT 0 COMMENT '可用积分',
frozen_points INT DEFAULT 0 COMMENT '冻结积分',
total_earned INT DEFAULT 0 COMMENT '累计获取',
total_consumed INT DEFAULT 0 COMMENT '累计消耗',
last_sign_in_date DATE COMMENT '最后签到日期',
sign_in_streak INT DEFAULT 0 COMMENT '连续签到天数',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
INDEX idx_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户积分账户表';
```
### 3.2 points_records 表
```sql
CREATE TABLE points_records (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
points_type ENUM('earn','consume','freeze','unfreeze','admin_correct') NOT NULL COMMENT '变动类型',
source ENUM(
'register','sign_in','invite','invited','join_community',
'recharge','skill_purchase','review','activity',
'admin_add','admin_deduct','admin_correct','refund'
) NOT NULL COMMENT '来源',
amount INT NOT NULL COMMENT '变动量(正:获得 负:消耗)',
balance INT NOT NULL COMMENT '变动后余额',
description VARCHAR(255) COMMENT '描述',
related_id BIGINT COMMENT '关联业务ID',
related_type VARCHAR(50) COMMENT '关联业务类型',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
INDEX idx_user_id (user_id),
INDEX idx_source (source),
INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='积分流水表';
```
> **变更说明**`points_type` 新增 `admin_correct``source` 新增 `invited`(被邀请奖励)、`admin_add`、`admin_deduct`、`admin_correct`、`refund`,与代码中的实际使用对齐。
### 3.3 points_rules 表
```sql
CREATE TABLE points_rules (
id INT PRIMARY KEY AUTO_INCREMENT,
rule_name VARCHAR(100) NOT NULL COMMENT '规则名称',
source ENUM('register','sign_in','invite','join_community','recharge','review','activity') NOT NULL UNIQUE,
points_amount INT NOT NULL COMMENT '积分数量',
frequency_limit INT COMMENT '周期内上限(NULL不限)',
frequency_period ENUM('daily','weekly','monthly','unlimited') DEFAULT 'unlimited',
enabled BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='积分规则表';
INSERT INTO points_rules (rule_name, source, points_amount, frequency_limit, frequency_period) VALUES
('新用户注册', 'register', 300, 1, 'unlimited'),
('每日签到', 'sign_in', 10, 1, 'daily'),
('邀请好友', 'invite', 100, NULL, 'unlimited'),
('加入社群', 'join_community', 50, 1, 'unlimited'),
('发表评价', 'review', 5, 3, 'daily');
```