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