Files
integral-shop/backend/docs/数据库设计说明.md

1296 lines
37 KiB
Markdown
Raw Normal View History

# 商品寄卖服务模块 - 数据库设计说明(表名"wa_"开头)
> **项目名称**: 商品寄卖服务模块
> **数据库类型**: 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月