- 从 main 获取 single_uniapp22miao 子项目 - dart-sass: /deep/ -> ::v-deep,calc 运算符加空格 - DEPLOY.md 采用 shccd159 版本(4 子项目架构说明) Made-with: Cursor
37 KiB
商品寄卖服务模块 - 数据库设计说明
项目名称: 商品寄卖服务模块
数据库类型: MySQL 5.7
字符集: utf8mb4
存储引擎: InnoDB
文档版本: V1.0
创建日期: 2024年12月
目录
一、数据库概述
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: 控制用户是否可以进行商品转拍
索引建议:
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格式
索引建议:
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
索引建议:
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: 如果采用线下支付,上传支付凭证- 收货地址字段冗余存储,防止用户修改地址后历史订单地址变更
索引建议:
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
索引建议:
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: 可选,用户上传收款二维码
索引建议:
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: 银行卡号需要加密存储,保护用户隐私
索引建议:
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字段
索引建议:
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: 控制轮播图显示顺序
索引建议:
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记录变动原因,如:"购买商品"、"充值"、"退款"等
收入场景:
- 充值
- 退款
- 活动奖励
支出场景:
- 购买商品
- 提现
索引建议:
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提现驳回,将扣除的金额返还
索引建议:
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 | - | 否 | - | 更新时间 |
业务逻辑:
- 个人奖金来源于用户自己的交易奖励
- 可以提现或转入余额
索引建议:
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 | - | 否 | - | 更新时间 |
业务逻辑:
- 推广奖金来源于邀请用户的消费返佣
- 支持提现功能
索引建议:
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)
索引建议:
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 | 头像 |
| varchar | 100 | 是 | - | 邮箱 | |
| mobile | varchar | 16 | 是 | - | 手机号 |
| qrcode | varchar | 255 | 是 | '' | 二维码 |
| login_at | datetime | - | 是 | - | 最后登录时间 |
| status | tinyint | 4 | 是 | - | 状态: 0=禁用, 1=启用 |
| created_at | datetime | - | 是 | - | 创建时间 |
| updated_at | datetime | - | 是 | - | 更新时间 |
索引建议:
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 | - | 否 | - | 更新时间 |
索引建议:
PRIMARY KEY (`id`)
8.3 管理员角色关联表 (wa_admin_roles)
表说明: 管理员与角色的多对多关系
表结构:
| 字段名 | 类型 | 长度 | 允许NULL | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | int | 11 | 否 | - | 主键ID |
| role_id | int | 11 | 否 | - | 角色ID |
| admin_id | int | 11 | 否 | - | 管理员ID |
索引建议:
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 | - | 否 | - | 更新时间 |
索引建议:
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分钟内只能发送一次
索引建议:
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 | - | 是 | - | 更新时间 |
索引建议:
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 | 更新时间 |
使用示例:
{
"name": "site_name",
"value": "寄卖商城"
}
索引建议:
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 | - | 是 | - | 变量值 |
索引建议:
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 主键索引
所有表都应该有主键索引:
PRIMARY KEY (`id`)
10.2 唯一索引
对于需要保证唯一性的字段:
-- 用户表
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 普通索引
常用查询字段添加索引:
用户相关:
-- 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`)
商品相关:
-- 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`)
订单相关:
-- 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`)
财务相关:
-- 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 性能优化
- 合理使用索引: 为常用查询字段添加索引,但避免过多索引影响写入性能
- 分表策略:
- 日志类表(money_log等)按月分表
- 订单表按年分表
- 读写分离: 主库负责写入,从库负责查询
- 缓存策略:
- 热点数据缓存到Redis
- 商品列表、分类等查询缓存
12.2 安全建议
- 敏感信息加密:
- 密码使用bcrypt加密
- 银行卡号使用AES加密
- SQL注入防护: 使用参数化查询
- 数据备份:
- 每天全量备份
- 每小时增量备份
12.3 扩展性建议
- 预留字段: 每个表预留1-2个扩展字段
- 软删除: 重要数据不要物理删除,使用软删除(添加deleted_at字段)
- 版本控制: 数据库表结构变更使用migration工具管理
十三、数据初始化脚本
13.1 创建数据库
CREATE DATABASE IF NOT EXISTS `uniapp_mall`
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
USE `uniapp_mall`;
13.2 添加主键和索引
-- 用户表
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设置
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 用户相关查询
查询用户及其推荐人信息:
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;
查询用户的所有财务账户余额:
SELECT
id, nickname,
money AS 余额,
coupon AS 优惠券,
self_bonus AS 个人奖金,
share_bonus AS 推广奖金
FROM wa_users
WHERE id = 123;
查询用户的推广下线列表:
SELECT id, nickname, mobile, join_time
FROM wa_users
WHERE pid = 123
ORDER BY join_time DESC;
14.2 订单相关查询
查询用户的买家订单:
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;
查询用户的卖家订单:
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;
统计订单金额:
SELECT
COUNT(*) AS order_count,
SUM(total_money) AS total_amount,
status
FROM wa_order
WHERE buyer_id = 123
GROUP BY status;
14.3 财务相关查询
查询余额变动明细:
SELECT *
FROM wa_money_log
WHERE user_id = 123
ORDER BY created_at DESC
LIMIT 20;
统计用户收支情况:
SELECT
type,
SUM(money) AS total_money,
COUNT(*) AS count
FROM wa_money_log
WHERE user_id = 123
GROUP BY type;
查询待审核的提现申请:
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 商品相关查询
查询寄售商品列表(含卖家信息):
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;
查询用户的寄售商品:
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月