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

9.6 KiB
Raw Blame History

数据库设计文档(用户 / Skill / 积分模块)

一、用户模块

1.1 users 表

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 表

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 表

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 表

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 表

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_idaudited_at 字段,用于管理后台记录审核操作人和审核时间。

2.3 skill_reviews 表

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 表

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 表

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 表

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_correctsource 新增 invited(被邀请奖励)、admin_addadmin_deductadmin_correctrefund,与代码中的实际使用对齐。

3.3 points_rules 表

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');