Files
integral-shop/frontend/docs/数据库设计说明.md
2026-03-08 18:35:11 +08:00

1296 lines
37 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.
# 商品寄卖服务模块 - 数据库设计说明
> **项目名称**: 商品寄卖服务模块
> **数据库类型**: MySQL 5.7
> **字符集**: utf8mb4
> **存储引擎**: InnoDB
> **文档版本**: V1.0
> **创建日期**: 2024年12月
---
## 目录
1. [数据库概述](#一数据库概述)
2. [数据表分类](#二数据表分类)
3. [核心业务表设计](#三核心业务表设计)
4. [用户相关表设计](#四用户相关表设计)
5. [商品相关表设计](#五商品相关表设计)
6. [订单交易表设计](#六订单交易表设计)
7. [财务相关表设计](#七财务相关表设计)
8. [系统配置表设计](#八系统配置表设计)
9. [表关系图](#九表关系图)
10. [索引设计建议](#十索引设计建议)
11. [数据字典](#十一数据字典)
---
## 一、数据库概述
### 1.1 设计原则
- **规范性**: 遵循第三范式,减少数据冗余
- **扩展性**: 预留扩展字段,便于后期功能升级
- **性能**: 合理设计索引,优化查询效率
- **安全性**: 敏感信息加密存储,权限严格控制
- **完整性**: 使用外键约束保证数据一致性
### 1.2 命名规范
- **表名**: 统一前缀 `wa_`,使用小写字母和下划线
- **字段名**: 使用小写字母和下划线,语义清晰
- **主键**: 统一使用 `id` 作为主键名
- **时间字段**: 统一使用 `created_at`(创建时间)和 `updated_at`(更新时间)
### 1.3 数据表统计
| 分类 | 表数量 | 说明 |
|------|--------|------|
| 用户相关 | 3张 | 用户表、地址表、支付账户表 |
| 商品相关 | 3张 | 商品表、寄售商品表、商品分类表 |
| 订单交易 | 1张 | 订单表 |
| 财务相关 | 5张 | 余额、优惠券、奖金、提现记录表 |
| 系统配置 | 5张 | 轮播图、设置、短信、上传、选项表 |
| 权限管理 | 4张 | 管理员、角色、权限规则表 |
| **总计** | **22张** | - |
---
## 二、数据表分类
### 2.1 核心业务表7张
```
wa_users # 用户表
wa_goods # 商品表
wa_merchandise # 寄售商品表
wa_order # 订单表
wa_category # 商品分类表
wa_address # 收货地址表
wa_banner # 轮播图表
```
### 2.2 财务相关表5张
```
wa_money_log # 余额变动表
wa_coupon_log # 优惠券变动表
wa_selfbonus_log # 个人奖金变动表
wa_sharebonus_log # 推广奖金变动表
wa_withdraw # 提现表
```
### 2.3 支付相关表2张
```
wa_alipay # 用户支付宝表
wa_bank # 用户银行卡表
```
### 2.4 系统管理表8张
```
wa_admins # 管理员表
wa_admin_roles # 管理员角色关联表
wa_roles # 角色表
wa_rules # 权限规则表
wa_options # 选项表
wa_setting # 设置配置表
wa_sms # 短信验证码表
wa_uploads # 附件上传表
```
---
## 三、核心业务表设计
### 3.1 用户表 (wa_users)
**表说明**: 存储用户基本信息、财务信息、邀请关系等核心数据
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 10 | 否 | - | 主键ID |
| pid | int | 11 | 是 | 0 | 父级用户ID推荐人 |
| username | varchar | 32 | 否 | - | 用户名 |
| nickname | varchar | 40 | 否 | - | 昵称 |
| mobile | varchar | 16 | 是 | - | 手机号 |
| password | varchar | 255 | 是 | - | 密码(加密) |
| salt | varchar | 128 | 是 | - | 密码盐 |
| sex | enum | - | 否 | 1 | 性别: 0=女, 1=男 |
| avatar | varchar | 255 | 是 | - | 头像URL |
| invite | varchar | 11 | 是 | - | 邀请码 |
| level | tinyint | 4 | 否 | 1 | 用户等级 |
| birthday | date | - | 是 | - | 生日 |
| money | decimal | 13,3 | 否 | 0.000 | 余额(元) |
| coupon | decimal | 13,3 | 否 | 0.000 | 优惠券余额 |
| self_bonus | decimal | 13,3 | 否 | 0.000 | 我的奖金 |
| share_bonus | decimal | 13,3 | 否 | 0.000 | 推广奖金 |
| score | int | 11 | 否 | 0 | 积分 |
| last_time | datetime | - | 是 | - | 最后登录时间 |
| last_ip | varchar | 50 | 是 | - | 最后登录IP |
| join_time | datetime | - | 是 | - | 注册时间 |
| join_ip | varchar | 50 | 是 | - | 注册IP |
| token | varchar | 50 | 是 | - | 登录Token |
| status | tinyint | 4 | 否 | 1 | 状态: 0=禁用, 1=启用 |
| is_vip | tinyint | 1 | 是 | 0 | 是否VIP: 0=否, 1=是 |
| viptime | datetime | - | 是 | - | VIP截止时间 |
| contract | varchar | 255 | 是 | '' | 合同文件 |
| max_order | int | 10 | 否 | 0 | 最高可抢单数 |
| is_resell | tinyint | 1 | 是 | 1 | 是否可转拍: 0=否, 1=是 |
| created_at | datetime | - | 是 | - | 创建时间 |
| updated_at | datetime | - | 是 | - | 更新时间 |
**业务逻辑**:
- `pid`: 记录推荐人关系,用于推广奖励计算
- `invite`: 用户专属邀请码,用于邀请新用户
- `money/coupon/self_bonus/share_bonus`: 四种财务账户,独立管理
- `is_vip`: VIP用户可享受提前抢购等特权
- `max_order`: 限制用户最大可抢购订单数量
- `is_resell`: 控制用户是否可以进行商品转拍
**索引建议**:
```sql
PRIMARY KEY (`id`)
UNIQUE KEY `mobile` (`mobile`)
UNIQUE KEY `invite` (`invite`)
INDEX `idx_pid` (`pid`)
INDEX `idx_status` (`status`)
```
---
### 3.2 商品表 (wa_goods)
**表说明**: 存储平台自营商品信息
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 11 | 否 | - | 主键ID |
| goods_category_id | int | 11 | 是 | - | 商品分类ID |
| images | varchar | 1500 | 否 | - | 商品图片JSON数组 |
| title | varchar | 255 | 否 | - | 商品标题 |
| price | decimal | 10,2 | 否 | 0.00 | 售价 |
| line_price | decimal | 10,2 | 否 | 0.00 | 原价(划线价) |
| stock_num | int | 11 | 否 | 0 | 库存数量 |
| sales_volume | int | 11 | 是 | 0 | 显示销量 |
| content | text | - | 是 | - | 商品详情(富文本) |
| notes | text | - | 是 | - | 购买须知 |
| status | tinyint | 1 | 否 | 1 | 状态: 0=下架, 1=上架 |
| created_at | datetime | - | 否 | - | 创建时间 |
| updated_at | datetime | - | 否 | - | 更新时间 |
**业务逻辑**:
- `images`: 存储JSON格式的图片URL数组如: `["url1","url2"]`
- `line_price`: 原价用于显示折扣,增强营销效果
- `sales_volume`: 虚拟销量,可手动设置
- `content`: 富文本商品详情支持HTML格式
**索引建议**:
```sql
PRIMARY KEY (`id`)
INDEX `idx_category` (`goods_category_id`)
INDEX `idx_status` (`status`)
INDEX `idx_created_at` (`created_at`)
```
---
### 3.3 寄售商品表 (wa_merchandise)
**表说明**: 存储用户寄售的二手商品信息
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 11 | 否 | - | 主键ID |
| old_id | int | 11 | 是 | 0 | 从订单转拍过来的原订单ID |
| user_id | int | 11 | 否 | - | 卖家用户ID |
| title | varchar | 255 | 是 | '' | 商品标题 |
| image | varchar | 1500 | 是 | '' | 商品图片 |
| price | decimal | 10,2 | 否 | 0.00 | 寄售价格 |
| is_show | tinyint | 1 | 是 | 1 | 是否显示: 0=隐藏, 1=显示 |
| status | tinyint | 1 | 否 | 1 | 状态: 0=已售, 1=未售 |
| created_at | datetime | - | 否 | - | 创建时间 |
| updated_at | datetime | - | 否 | - | 更新时间 |
**业务逻辑**:
- `old_id`: 支持从已购订单转拍记录原订单ID实现二次流转
- `user_id`: 卖家ID关联到用户表
- `is_show`: 管理员审核通过后设为1才在前台显示
- `status`: 售出后自动更新为0
**索引建议**:
```sql
PRIMARY KEY (`id`)
INDEX `idx_user_id` (`user_id`)
INDEX `idx_status` (`status`, `is_show`)
INDEX `idx_old_id` (`old_id`)
```
---
### 3.4 订单表 (wa_order)
**表说明**: 存储所有交易订单信息(包括商品订单和寄售商品订单)
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 10 | 否 | - | 主键ID |
| old_id | int | 11 | 是 | - | 从订单转拍过来的原订单ID |
| seller_id | int | 11 | 否 | - | 卖家ID平台或用户 |
| buyer_id | int | 11 | 是 | 0 | 买家ID |
| order_sn | varchar | 255 | 是 | - | 订单编号 |
| total_money | decimal | 10,2 | 是 | 0.00 | 支付金额 |
| pay_time | datetime | - | 是 | - | 支付时间 |
| pay_img | varchar | 255 | 是 | - | 支付凭证图片 |
| status | tinyint | 1 | 否 | 0 | 订单状态: 0=待付款, 1=已支付, 2=已完成 |
| is_resell | tinyint | 1 | 是 | 0 | 是否转拍: 0=否, 1=是 |
| is_show | tinyint | 1 | 是 | 1 | 是否显示: 0=隐藏, 1=显示 |
| is_cancel | tinyint | 1 | 是 | 0 | 是否取消: 0=否, 1=是 |
| consignee | char | 50 | 是 | - | 收货人 |
| phone | char | 50 | 是 | - | 收货电话 |
| province | char | 50 | 是 | - | 省份 |
| city | char | 50 | 是 | - | 城市 |
| area | char | 50 | 是 | - | 区县 |
| address | varchar | 255 | 是 | - | 详细地址 |
| merchandise_id | int | 11 | 是 | 0 | 寄售商品ID如果是寄售商品订单 |
| confirm_time | datetime | - | 是 | - | 确认收货时间 |
| buy_time | datetime | - | 是 | - | 下单抢购时间 |
| buy_ip | varchar | 50 | 是 | - | 下单IP |
| cancel_ip | varchar | 50 | 是 | - | 取消订单IP |
| created_at | datetime | - | 否 | - | 创建时间 |
| updated_at | datetime | - | 否 | - | 更新时间 |
**订单状态说明**:
| 状态值 | 状态名称 | 说明 | 可执行操作 |
|--------|----------|------|-----------|
| 0 | 待付款 | 订单已创建,等待支付 | 支付、取消 |
| 1 | 已支付 | 买家已支付,等待卖家发货 | 申请退款 |
| 2 | 已完成 | 交易完成,确认收货 | 评价、申请售后 |
**业务逻辑**:
- `order_sn`: 唯一订单号,格式建议:年月日+时分秒+随机数
- `seller_id`: 0表示平台自营>0表示用户寄售
- `merchandise_id`: >0表示这是一个寄售商品订单
- `is_resell`: 标记该订单是否已转拍
- `pay_img`: 如果采用线下支付,上传支付凭证
- 收货地址字段冗余存储,防止用户修改地址后历史订单地址变更
**索引建议**:
```sql
PRIMARY KEY (`id`)
UNIQUE KEY `order_sn` (`order_sn`)
INDEX `idx_seller_buyer` (`seller_id`, `buyer_id`)
INDEX `idx_status` (`status`)
INDEX `idx_merchandise` (`merchandise_id`)
INDEX `idx_created_at` (`created_at`)
```
---
## 四、用户相关表设计
### 4.1 收货地址表 (wa_address)
**表说明**: 存储用户收货地址信息
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 11 | 否 | - | 主键ID |
| user_id | int | 11 | 是 | - | 用户ID |
| consignee | varchar | 255 | 是 | '' | 收货人姓名 |
| phone | char | 50 | 是 | - | 手机号 |
| province | varchar | 255 | 是 | '' | 省份 |
| city | varchar | 255 | 是 | '' | 城市 |
| area | varchar | 255 | 是 | '' | 区县 |
| address | varchar | 255 | 是 | '' | 详细地址 |
| is_default | tinyint | 1 | 否 | - | 是否默认地址: 0=否, 1=是 |
| created_at | datetime | - | 是 | - | 创建时间 |
| updated_at | datetime | - | 是 | - | 更新时间 |
**业务逻辑**:
- 每个用户可以有多个收货地址
- `is_default=1` 的地址在下单时自动选中
- 设置新默认地址时,需要将该用户其他地址的`is_default`设为0
**索引建议**:
```sql
PRIMARY KEY (`id`)
INDEX `idx_user_id` (`user_id`)
INDEX `idx_default` (`user_id`, `is_default`)
```
---
### 4.2 用户支付宝表 (wa_alipay)
**表说明**: 存储用户支付宝收款账户信息
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 11 | 否 | - | 主键ID |
| user_id | int | 11 | 是 | - | 用户ID |
| username | varchar | 255 | 是 | '' | 真实姓名 |
| account | varchar | 255 | 是 | '' | 支付宝账号 |
| qrcode | varchar | 255 | 是 | '' | 收款码图片URL |
| phone | char | 50 | 是 | - | 手机号 |
| created_at | datetime | - | 是 | - | 创建时间 |
| updated_at | datetime | - | 是 | - | 更新时间 |
**业务逻辑**:
- 用于提现时选择支付宝收款方式
- `qrcode`: 可选,用户上传收款二维码
**索引建议**:
```sql
PRIMARY KEY (`id`)
INDEX `idx_user_id` (`user_id`)
```
---
### 4.3 用户银行卡表 (wa_bank)
**表说明**: 存储用户银行卡信息
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 11 | 否 | - | 主键ID |
| user_id | int | 11 | 是 | - | 用户ID |
| username | varchar | 255 | 是 | '' | 持卡人姓名 |
| bank | varchar | 255 | 是 | '' | 开户行 |
| account | varchar | 255 | 是 | '' | 银行卡号(加密存储) |
| phone | char | 50 | 是 | - | 预留手机号 |
| created_at | datetime | - | 是 | - | 创建时间 |
| updated_at | datetime | - | 是 | - | 更新时间 |
**业务逻辑**:
- 用于提现时选择银行卡收款方式
- `account`: 银行卡号需要加密存储,保护用户隐私
**索引建议**:
```sql
PRIMARY KEY (`id`)
INDEX `idx_user_id` (`user_id`)
```
---
## 五、商品相关表设计
### 5.1 商品分类表 (wa_category)
**表说明**: 商品分类管理
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 10 | 否 | - | 主键ID |
| name | varchar | 255 | 否 | - | 分类名称 |
| weight | int | 11 | 是 | 0 | 排序权重(数字越大越靠前) |
| status | tinyint | 4 | 否 | 1 | 状态: 0=隐藏, 1=显示 |
| created_at | datetime | - | 否 | - | 创建时间 |
| updated_at | datetime | - | 否 | - | 更新时间 |
**业务逻辑**:
- `weight`: 用于前台分类排序展示
- 当前为一级分类,如需多级分类可增加`pid`字段
**索引建议**:
```sql
PRIMARY KEY (`id`)
INDEX `idx_status_weight` (`status`, `weight`)
```
---
### 5.2 轮播图表 (wa_banner)
**表说明**: 首页轮播图管理
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 10 | 否 | - | 主键ID |
| image | varchar | 255 | 否 | - | 图片URL |
| url | varchar | 255 | 是 | '' | 跳转地址(页面路径或外部链接) |
| weight | int | 11 | 是 | 0 | 排序权重 |
| created_at | datetime | - | 否 | - | 创建时间 |
| updated_at | datetime | - | 否 | - | 更新时间 |
**业务逻辑**:
- `url`: 点击轮播图跳转的目标地址
- `weight`: 控制轮播图显示顺序
**索引建议**:
```sql
PRIMARY KEY (`id`)
INDEX `idx_weight` (`weight`)
```
---
## 六、订单交易表设计
订单表已在核心业务表中详细说明,此处补充订单关联的业务说明。
### 6.1 订单业务流程
```
创建订单 (status=0)
支付订单 (status=1, 记录pay_time)
卖家发货
买家确认收货 (status=2, 记录confirm_time)
交易完成
```
### 6.2 订单取消逻辑
| 场景 | 操作 | 数据变更 |
|------|------|----------|
| 待付款取消 | 买家/系统超时 | is_cancel=1, 记录cancel_ip |
| 已支付取消 | 需要双方协商或平台介入 | is_cancel=1, 退款处理 |
### 6.3 订单转拍逻辑
```
买家购买商品
确认收货 (status=2)
申请转拍 (is_resell=1)
创建寄售商品记录 (wa_merchandise, old_id=订单ID)
其他用户购买
生成新订单
```
---
## 七、财务相关表设计
### 7.1 余额变动表 (wa_money_log)
**表说明**: 记录用户余额的所有变动记录
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 10 | 否 | - | 主键ID |
| user_id | int | 10 | 否 | 0 | 用户ID |
| type | tinyint | 1 | 是 | 1 | 类型: 1=收入, 2=支出 |
| money | decimal | 13,3 | 否 | 0.000 | 变更金额 |
| before | decimal | 13,3 | 否 | 0.000 | 变更前余额 |
| after | decimal | 13,3 | 否 | 0.000 | 变更后余额 |
| memo | varchar | 255 | 是 | '' | 备注说明 |
| created_at | datetime | - | 否 | - | 创建时间 |
| updated_at | datetime | - | 否 | - | 更新时间 |
**业务逻辑**:
- 每次余额变动都需要记录一条日志
- `before``after`字段用于核对余额计算是否正确
- `memo`记录变动原因,如:"购买商品"、"充值"、"退款"等
**收入场景**:
- 充值
- 退款
- 活动奖励
**支出场景**:
- 购买商品
- 提现
**索引建议**:
```sql
PRIMARY KEY (`id`)
INDEX `idx_user_type` (`user_id`, `type`)
INDEX `idx_created_at` (`created_at`)
```
---
### 7.2 优惠券变动表 (wa_coupon_log)
**表说明**: 记录用户优惠券的所有变动记录
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 10 | 否 | - | 主键ID |
| user_id | int | 10 | 否 | 0 | 用户ID |
| type | tinyint | 1 | 是 | 1 | 类型: 1=收入, 2=支出, 3=提现驳回 |
| money | decimal | 13,3 | 否 | 0.000 | 变更金额 |
| before | decimal | 13,3 | 否 | 0.000 | 变更前金额 |
| after | decimal | 13,3 | 否 | 0.000 | 变更后金额 |
| memo | varchar | 255 | 是 | '' | 备注说明 |
| created_at | datetime | - | 否 | - | 创建时间 |
| updated_at | datetime | - | 否 | - | 更新时间 |
**业务逻辑**:
- 优惠券是平台发放的虚拟货币,不可提现(根据业务规则可能可以提现)
- `type=3` 提现驳回,将扣除的金额返还
**索引建议**:
```sql
PRIMARY KEY (`id`)
INDEX `idx_user_type` (`user_id`, `type`)
```
---
### 7.3 个人奖金变动表 (wa_selfbonus_log)
**表说明**: 记录用户个人奖金的所有变动记录
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 10 | 否 | - | 主键ID |
| user_id | int | 10 | 否 | 0 | 用户ID |
| type | tinyint | 1 | 是 | 1 | 类型: 1=收入, 2=支出 |
| money | decimal | 13,3 | 否 | 0.000 | 变更金额 |
| before | decimal | 13,3 | 否 | 0.000 | 变更前金额 |
| after | decimal | 13,3 | 否 | 0.000 | 变更后金额 |
| memo | varchar | 255 | 是 | '' | 备注说明 |
| created_at | datetime | - | 否 | - | 创建时间 |
| updated_at | datetime | - | 否 | - | 更新时间 |
**业务逻辑**:
- 个人奖金来源于用户自己的交易奖励
- 可以提现或转入余额
**索引建议**:
```sql
PRIMARY KEY (`id`)
INDEX `idx_user_id` (`user_id`)
```
---
### 7.4 推广奖金变动表 (wa_sharebonus_log)
**表说明**: 记录用户推广奖金的所有变动记录
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 10 | 否 | - | 主键ID |
| user_id | int | 10 | 否 | 0 | 用户ID |
| type | tinyint | 1 | 是 | 1 | 类型: 1=收入, 2=支出, 3=提现驳回 |
| money | decimal | 13,3 | 否 | 0.000 | 变更金额 |
| before | decimal | 13,3 | 否 | 0.000 | 变更前金额 |
| after | decimal | 13,3 | 否 | 0.000 | 变更后金额 |
| memo | varchar | 255 | 是 | '' | 备注说明 |
| created_at | datetime | - | 否 | - | 创建时间 |
| updated_at | datetime | - | 否 | - | 更新时间 |
**业务逻辑**:
- 推广奖金来源于邀请用户的消费返佣
- 支持提现功能
**索引建议**:
```sql
PRIMARY KEY (`id`)
INDEX `idx_user_type` (`user_id`, `type`)
```
---
### 7.5 提现表 (wa_withdraw)
**表说明**: 记录用户提现申请和处理结果
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 10 | 否 | - | 主键ID |
| transfer_no | varchar | 255 | 否 | '' | 提现编号(唯一) |
| user_id | int | 11 | 否 | 0 | 用户ID |
| cate | tinyint | 1 | 否 | 0 | 提现类型: 2=优惠券, 4=推广奖金 |
| account_type | tinyint | 1 | 是 | 1 | 账号类型: 1=银行卡, 2=支付宝 |
| account_id | int | 11 | 是 | 0 | 收款账号ID关联银行卡或支付宝表 |
| account_info | text | - | 是 | - | 收款账号信息JSON格式 |
| money | decimal | 13,2 | 否 | 0.00 | 提现金额 |
| handling_fee | decimal | 13,2 | 否 | 0.00 | 手续费 |
| actual_amount | decimal | 13,2 | 否 | 0.00 | 实际到账金额 |
| status | tinyint | 3 | 否 | 0 | 状态: 0=待审核, 1=通过, 2=驳回 |
| remark | varchar | 255 | 是 | '' | 备注(驳回原因等) |
| created_at | datetime | - | 否 | - | 申请时间 |
| updated_at | datetime | - | 是 | - | 更新时间 |
**提现类型说明**:
| cate | 名称 | 对应字段 |
|------|------|----------|
| 2 | 优惠券提现 | wa_users.coupon |
| 4 | 推广奖金提现 | wa_users.share_bonus |
**提现状态流转**:
```
用户申请 (status=0)
管理员审核
通过 (status=1, 扣除相应账户余额) / 驳回 (status=2, 返还金额)
```
**业务逻辑**:
- `transfer_no`: 唯一提现流水号
- `account_info`: 冗余存储收款账号信息,防止用户修改账号后历史记录丢失
- `actual_amount = money - handling_fee`
- 驳回时需要返还扣除的金额并记录到对应的变动表type=3
**索引建议**:
```sql
PRIMARY KEY (`id`)
UNIQUE KEY `transfer_no` (`transfer_no`)
INDEX `idx_user_status` (`user_id`, `status`)
INDEX `idx_created_at` (`created_at`)
```
---
## 八、系统配置表设计
### 8.1 管理员表 (wa_admins)
**表说明**: 后台管理员账号信息
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 10 | 否 | - | 主键ID |
| username | varchar | 32 | 否 | - | 登录账号 |
| nickname | varchar | 40 | 否 | - | 昵称 |
| password | varchar | 255 | 否 | - | 密码(加密) |
| avatar | varchar | 255 | 是 | /app/admin/avatar.png | 头像 |
| email | varchar | 100 | 是 | - | 邮箱 |
| mobile | varchar | 16 | 是 | - | 手机号 |
| qrcode | varchar | 255 | 是 | '' | 二维码 |
| login_at | datetime | - | 是 | - | 最后登录时间 |
| status | tinyint | 4 | 是 | - | 状态: 0=禁用, 1=启用 |
| created_at | datetime | - | 是 | - | 创建时间 |
| updated_at | datetime | - | 是 | - | 更新时间 |
**索引建议**:
```sql
PRIMARY KEY (`id`)
UNIQUE KEY `username` (`username`)
INDEX `idx_status` (`status`)
```
---
### 8.2 角色表 (wa_roles)
**表说明**: 管理员角色配置
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 10 | 否 | - | 主键ID |
| name | varchar | 80 | 否 | - | 角色名称 |
| rules | text | - | 是 | - | 权限规则ID集合JSON数组 |
| pid | int | 10 | 是 | - | 父级角色ID |
| created_at | datetime | - | 否 | - | 创建时间 |
| updated_at | datetime | - | 否 | - | 更新时间 |
**索引建议**:
```sql
PRIMARY KEY (`id`)
```
---
### 8.3 管理员角色关联表 (wa_admin_roles)
**表说明**: 管理员与角色的多对多关系
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 11 | 否 | - | 主键ID |
| role_id | int | 11 | 否 | - | 角色ID |
| admin_id | int | 11 | 否 | - | 管理员ID |
**索引建议**:
```sql
PRIMARY KEY (`id`)
INDEX `idx_admin_role` (`admin_id`, `role_id`)
```
---
### 8.4 权限规则表 (wa_rules)
**表说明**: 后台权限菜单和功能规则
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 10 | 否 | - | 主键ID |
| title | varchar | 255 | 否 | - | 菜单标题 |
| icon | varchar | 255 | 是 | - | 图标 |
| key | varchar | 255 | 否 | - | 权限标识(唯一) |
| pid | int | 10 | 是 | 0 | 父级菜单ID |
| href | varchar | 255 | 是 | - | 链接地址 |
| type | int | 11 | 否 | 1 | 类型: 1=菜单, 2=按钮 |
| weight | int | 11 | 是 | 0 | 排序权重 |
| created_at | datetime | - | 否 | - | 创建时间 |
| updated_at | datetime | - | 否 | - | 更新时间 |
**索引建议**:
```sql
PRIMARY KEY (`id`)
UNIQUE KEY `key` (`key`)
INDEX `idx_pid` (`pid`)
```
---
### 8.5 短信验证码表 (wa_sms)
**表说明**: 存储发送的短信验证码记录
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 10 | 否 | - | 主键ID |
| mobile | varchar | 16 | 否 | - | 手机号 |
| event | varchar | 16 | 否 | - | 事件名register/login/forget等 |
| code | varchar | 10 | 否 | - | 验证码 |
| times | int | 11 | 是 | 0 | 已验证次数 |
| ip | varchar | 50 | 否 | - | 发送IP |
| created_at | datetime | - | 是 | - | 创建时间 |
| updated_at | datetime | - | 是 | - | 更新时间 |
**业务逻辑**:
- 验证码有效期通常为5-10分钟通过`created_at`判断
- `times`记录验证失败次数超过限制如3次则失效
- 同一手机号、同一事件类型1分钟内只能发送一次
**索引建议**:
```sql
PRIMARY KEY (`id`)
INDEX `idx_mobile_event` (`mobile`, `event`)
INDEX `idx_created_at` (`created_at`)
```
---
### 8.6 附件上传表 (wa_uploads)
**表说明**: 记录所有上传的文件信息
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 11 | 否 | - | 主键ID |
| name | varchar | 128 | 否 | - | 文件名称 |
| url | varchar | 255 | 否 | - | 文件URL |
| admin_id | int | 11 | 是 | - | 上传管理员ID |
| file_size | int | 11 | 否 | - | 文件大小(字节) |
| mime_type | varchar | 255 | 否 | - | MIME类型 |
| image_width | int | 11 | 是 | - | 图片宽度(如果是图片) |
| image_height | int | 11 | 是 | - | 图片高度(如果是图片) |
| ext | varchar | 128 | 否 | - | 文件扩展名 |
| storage | varchar | 255 | 否 | local | 存储位置: local/oss/qiniu等 |
| category | varchar | 128 | 是 | - | 文件分类 |
| created_at | date | - | 是 | - | 上传时间 |
| updated_at | date | - | 是 | - | 更新时间 |
**索引建议**:
```sql
PRIMARY KEY (`id`)
INDEX `idx_admin_id` (`admin_id`)
INDEX `idx_created_at` (`created_at`)
```
---
### 8.7 选项表 (wa_options)
**表说明**: 存储系统配置的键值对
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 10 | 否 | - | 主键ID |
| name | varchar | 255 | 否 | - | 配置键名 |
| value | longtext | - | 否 | - | 配置值 |
| created_at | datetime | - | 否 | 2022-08-15 00:00:00 | 创建时间 |
| updated_at | datetime | - | 否 | 2022-08-15 00:00:00 | 更新时间 |
**使用示例**:
```json
{
"name": "site_name",
"value": "寄卖商城"
}
```
**索引建议**:
```sql
PRIMARY KEY (`id`)
UNIQUE KEY `name` (`name`)
```
---
### 8.8 设置配置表 (wa_setting)
**表说明**: 系统设置的结构化存储
**表结构**:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|--------|------|------|----------|--------|------|
| id | int | 10 | 否 | - | 主键ID |
| name | varchar | 30 | 是 | '' | 变量名 |
| group | varchar | 30 | 是 | '' | 分组名 |
| title | varchar | 100 | 是 | '' | 变量标题 |
| tip | varchar | 100 | 是 | '' | 变量描述 |
| value | text | - | 是 | - | 变量值 |
**索引建议**:
```sql
PRIMARY KEY (`id`)
INDEX `idx_group` (`group`)
```
---
## 九、表关系图
### 9.1 核心业务表关系
```
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ wa_users │────1:N──│ wa_address │ │ wa_category │
│ (用户表) │ │ (地址表) │ │ (商品分类) │
└─────────────┘ └──────────────┘ └─────────────┘
│ │
│ 1:N 1:N
│ │
↓ ↓
┌─────────────┐ ┌─────────────┐
│wa_merchandise│ │ wa_goods │
│ (寄售商品) │ │ (商品表) │
└─────────────┘ └─────────────┘
│ │
│ 1:N 1:N
│ │
└──────────────┬──────────────────────────────────┘
┌──────────────┐
│ wa_order │
│ (订单表) │
└──────────────┘
```
### 9.2 财务表关系
```
┌─────────────┐
│ wa_users │
│ (用户表) │
│ - money │──────1:N────→ wa_money_log (余额变动)
│ - coupon │──────1:N────→ wa_coupon_log (优惠券变动)
│ - self_bonus│─────1:N────→ wa_selfbonus_log (个人奖金变动)
│ - share_bonus│────1:N────→ wa_sharebonus_log (推广奖金变动)
└─────────────┘
│ 1:N
┌──────────────┐
│ wa_withdraw │
│ (提现表) │
└──────────────┘
├──────→ wa_bank (银行卡)
└──────→ wa_alipay (支付宝)
```
### 9.3 权限管理表关系
```
┌─────────────┐
│ wa_admins │
│ (管理员) │
└─────────────┘
│ N:M (through wa_admin_roles)
┌─────────────┐ ┌──────────────┐
│ wa_roles │────1:N──│ wa_rules │
│ (角色表) │ │ (权限规则) │
└─────────────┘ └──────────────┘
```
---
## 十、索引设计建议
### 10.1 主键索引
所有表都应该有主键索引:
```sql
PRIMARY KEY (`id`)
```
### 10.2 唯一索引
对于需要保证唯一性的字段:
```sql
-- 用户表
UNIQUE KEY `mobile` (`mobile`)
UNIQUE KEY `invite` (`invite`)
-- 订单表
UNIQUE KEY `order_sn` (`order_sn`)
-- 提现表
UNIQUE KEY `transfer_no` (`transfer_no`)
-- 管理员表
UNIQUE KEY `username` (`username`)
```
### 10.3 普通索引
常用查询字段添加索引:
**用户相关**:
```sql
-- wa_users
INDEX `idx_pid` (`pid`)
INDEX `idx_status` (`status`)
INDEX `idx_mobile` (`mobile`)
INDEX `idx_invite` (`invite`)
-- wa_address
INDEX `idx_user_id` (`user_id`)
INDEX `idx_default` (`user_id`, `is_default`)
```
**商品相关**:
```sql
-- wa_goods
INDEX `idx_category` (`goods_category_id`)
INDEX `idx_status` (`status`)
INDEX `idx_created_at` (`created_at`)
-- wa_merchandise
INDEX `idx_user_id` (`user_id`)
INDEX `idx_status` (`status`, `is_show`)
```
**订单相关**:
```sql
-- wa_order
INDEX `idx_seller_buyer` (`seller_id`, `buyer_id`)
INDEX `idx_status` (`status`)
INDEX `idx_merchandise` (`merchandise_id`)
INDEX `idx_created_at` (`created_at`)
```
**财务相关**:
```sql
-- wa_money_log, wa_coupon_log等
INDEX `idx_user_type` (`user_id`, `type`)
INDEX `idx_created_at` (`created_at`)
-- wa_withdraw
INDEX `idx_user_status` (`user_id`, `status`)
```
### 10.4 复合索引说明
- 复合索引遵循最左前缀原则
- 查询频率高的字段放在前面
- 区分度高的字段放在前面
---
## 十一、数据字典
### 11.1 枚举值说明
#### 用户状态 (wa_users.status)
| 值 | 说明 |
|----|------|
| 0 | 禁用 |
| 1 | 启用 |
#### 性别 (wa_users.sex)
| 值 | 说明 |
|----|------|
| 0 | 女 |
| 1 | 男 |
#### 订单状态 (wa_order.status)
| 值 | 说明 |
|----|------|
| 0 | 待付款 |
| 1 | 已支付 |
| 2 | 已完成 |
#### 财务变动类型 (money_log.type等)
| 值 | 说明 |
|----|------|
| 1 | 收入 |
| 2 | 支出 |
| 3 | 提现驳回(部分表) |
#### 提现类型 (wa_withdraw.cate)
| 值 | 说明 |
|----|------|
| 2 | 优惠券提现 |
| 4 | 推广奖金提现 |
#### 提现账号类型 (wa_withdraw.account_type)
| 值 | 说明 |
|----|------|
| 1 | 银行卡 |
| 2 | 支付宝 |
#### 提现状态 (wa_withdraw.status)
| 值 | 说明 |
|----|------|
| 0 | 待审核 |
| 1 | 通过 |
| 2 | 驳回 |
#### 商品状态 (wa_goods.status)
| 值 | 说明 |
|----|------|
| 0 | 下架 |
| 1 | 上架 |
#### 寄售商品状态 (wa_merchandise.status)
| 值 | 说明 |
|----|------|
| 0 | 已售 |
| 1 | 未售 |
---
## 十二、数据库优化建议
### 12.1 性能优化
1. **合理使用索引**: 为常用查询字段添加索引,但避免过多索引影响写入性能
2. **分表策略**:
- 日志类表money_log等按月分表
- 订单表按年分表
3. **读写分离**: 主库负责写入,从库负责查询
4. **缓存策略**:
- 热点数据缓存到Redis
- 商品列表、分类等查询缓存
### 12.2 安全建议
1. **敏感信息加密**:
- 密码使用bcrypt加密
- 银行卡号使用AES加密
2. **SQL注入防护**: 使用参数化查询
3. **数据备份**:
- 每天全量备份
- 每小时增量备份
### 12.3 扩展性建议
1. **预留字段**: 每个表预留1-2个扩展字段
2. **软删除**: 重要数据不要物理删除使用软删除添加deleted_at字段
3. **版本控制**: 数据库表结构变更使用migration工具管理
---
## 十三、数据初始化脚本
### 13.1 创建数据库
```sql
CREATE DATABASE IF NOT EXISTS `uniapp_mall`
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
USE `uniapp_mall`;
```
### 13.2 添加主键和索引
```sql
-- 用户表
ALTER TABLE `wa_users`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `mobile` (`mobile`),
ADD UNIQUE KEY `invite` (`invite`),
ADD KEY `idx_pid` (`pid`),
ADD KEY `idx_status` (`status`);
-- 订单表
ALTER TABLE `wa_order`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `order_sn` (`order_sn`),
ADD KEY `idx_seller_buyer` (`seller_id`, `buyer_id`),
ADD KEY `idx_status` (`status`),
ADD KEY `idx_merchandise` (`merchandise_id`);
-- 其他表类似...
```
### 13.3 自增ID设置
```sql
ALTER TABLE `wa_users`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
ALTER TABLE `wa_order`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
-- 其他表类似...
```
---
## 十四、常见查询SQL示例
### 14.1 用户相关查询
**查询用户及其推荐人信息**:
```sql
SELECT
u.id, u.nickname, u.mobile,
p.nickname AS parent_nickname
FROM wa_users u
LEFT JOIN wa_users p ON u.pid = p.id
WHERE u.id = 123;
```
**查询用户的所有财务账户余额**:
```sql
SELECT
id, nickname,
money AS ,
coupon AS ,
self_bonus AS ,
share_bonus AS 广
FROM wa_users
WHERE id = 123;
```
**查询用户的推广下线列表**:
```sql
SELECT id, nickname, mobile, join_time
FROM wa_users
WHERE pid = 123
ORDER BY join_time DESC;
```
---
### 14.2 订单相关查询
**查询用户的买家订单**:
```sql
SELECT o.*, m.title AS goods_title, m.image
FROM wa_order o
LEFT JOIN wa_merchandise m ON o.merchandise_id = m.id
WHERE o.buyer_id = 123
ORDER BY o.created_at DESC;
```
**查询用户的卖家订单**:
```sql
SELECT o.*, u.nickname AS buyer_nickname
FROM wa_order o
LEFT JOIN wa_users u ON o.buyer_id = u.id
WHERE o.seller_id = 123
ORDER BY o.created_at DESC;
```
**统计订单金额**:
```sql
SELECT
COUNT(*) AS order_count,
SUM(total_money) AS total_amount,
status
FROM wa_order
WHERE buyer_id = 123
GROUP BY status;
```
---
### 14.3 财务相关查询
**查询余额变动明细**:
```sql
SELECT *
FROM wa_money_log
WHERE user_id = 123
ORDER BY created_at DESC
LIMIT 20;
```
**统计用户收支情况**:
```sql
SELECT
type,
SUM(money) AS total_money,
COUNT(*) AS count
FROM wa_money_log
WHERE user_id = 123
GROUP BY type;
```
**查询待审核的提现申请**:
```sql
SELECT w.*, u.nickname, u.mobile
FROM wa_withdraw w
LEFT JOIN wa_users u ON w.user_id = u.id
WHERE w.status = 0
ORDER BY w.created_at ASC;
```
---
### 14.4 商品相关查询
**查询寄售商品列表(含卖家信息)**:
```sql
SELECT m.*, u.nickname AS seller_nickname
FROM wa_merchandise m
LEFT JOIN wa_users u ON m.user_id = u.id
WHERE m.status = 1 AND m.is_show = 1
ORDER BY m.created_at DESC;
```
**查询用户的寄售商品**:
```sql
SELECT *
FROM wa_merchandise
WHERE user_id = 123
ORDER BY created_at DESC;
```
---
## 十五、数据库变更记录
### 15.1 版本历史
| 版本号 | 日期 | 变更内容 | 变更人 |
|--------|------|----------|--------|
| V1.0 | 2024-12-01 | 初始数据库设计 | 产品团队 |
| V1.1 | 待定 | 待添加的扩展功能 | - |
### 15.2 待优化项
- [ ] 添加商品评价表
- [ ] 添加物流信息表
- [ ] 添加消息通知表
- [ ] 添加积分商城相关表
- [ ] 优化财务日志表的分表策略
---
**文档维护**: 产品团队
**最后更新**: 2024年12月
**下次审查**: 2025年1月