This commit is contained in:
18631081161 2026-01-01 21:02:08 +08:00
commit 027b32efe2
5 changed files with 2767 additions and 0 deletions

920
docs/API接口文档.md Normal file
View File

@ -0,0 +1,920 @@
# 抽奖盲盒系统API接口文档
## 1. 接口概览
### 基础信息
- **基础URL**: `https://api.example.com`
- **API版本**: `v1`
- **数据格式**: `JSON`
- **字符编码**: `UTF-8`
- **认证方式**: `JWT Token`
### 通用响应格式
```json
{
"code": 200,
"msg": "success",
"data": {},
"timestamp": 1640995200
}
```
### 状态码说明
| 状态码 | 说明 |
|--------|------|
| 200 | 请求成功 |
| 400 | 请求参数错误 |
| 401 | 未授权访问 |
| 403 | 权限不足 |
| 404 | 资源不存在 |
| 500 | 服务器内部错误 |
## 2. 用户认证接口
### 2.1 发送验证码
```http
POST /api/user/sendCode
```
**请求参数:**
```json
{
"phone": "13800138000",
"type": 1
}
```
**参数说明:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| phone | string | 是 | 手机号 |
| type | int | 是 | 类型1-登录注册 |
**响应示例:**
```json
{
"code": 200,
"msg": "验证码发送成功",
"data": {
"expire_time": 300
}
}
```
### 2.2 用户登录/注册
```http
POST /api/user/login
```
**请求参数:**
```json
{
"phone": "13800138000",
"code": "123456",
"openid": "wx_openid_123"
}
```
**响应示例:**
```json
{
"code": 200,
"msg": "登录成功",
"data": {
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"user_info": {
"id": 1001,
"phone": "13800138000",
"nickname": "用户昵称",
"avatar": "头像URL",
"money": "100.00",
"integral": "50.00",
"level": 1
}
}
}
```
### 2.3 获取用户信息
```http
GET /api/user/info
```
**请求头:**
```
Authorization: Bearer {token}
```
**响应示例:**
```json
{
"code": 200,
"msg": "success",
"data": {
"id": 1001,
"phone": "138****8000",
"nickname": "用户昵称",
"avatar": "头像URL",
"money": "100.00",
"integral": "50.00",
"money2": "20.00",
"level": 1,
"draw_num": 5
}
}
```
## 3. 商品相关接口
### 3.1 获取商品分类
```http
GET /api/goods/category
```
**响应示例:**
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": 1,
"title": "手办模型",
"sort": 1
},
{
"id": 2,
"title": "数码产品",
"sort": 2
}
]
}
```
### 3.2 获取商品列表
```http
GET /api/goods/list
```
**请求参数:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| category_id | int | 否 | 分类ID |
| type | int | 否 | 商品类型 |
| page | int | 否 | 页码默认1 |
| limit | int | 否 | 每页数量默认20 |
| keyword | string | 否 | 搜索关键词 |
**响应示例:**
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"id": 1001,
"title": "精美手办盲盒",
"imgurl": "商品图片URL",
"price": "29.90",
"type": 1,
"type_name": "一番赏",
"stock": 100,
"sale_stock": 50,
"status": 1,
"prize_num": 1,
"show_price": "29.9元/抽"
}
],
"total": 100,
"page": 1,
"limit": 20
}
}
```
### 3.3 获取商品详情
```http
GET /api/goods/detail/{id}
```
**响应示例:**
```json
{
"code": 200,
"msg": "success",
"data": {
"id": 1001,
"title": "精美手办盲盒",
"imgurl": "商品封面图",
"imgurl_detail": "商品详情图",
"price": "29.90",
"type": 1,
"type_name": "一番赏",
"stock": 100,
"sale_stock": 50,
"prize_num": 1,
"goods_describe": "商品描述",
"prize_list": [
{
"id": 2001,
"title": "限定手办A",
"imgurl": "奖品图片",
"price": "299.00",
"money": "150.00",
"real_pro": "0.05000",
"goods_type": 1,
"prize_code": "A001"
}
]
}
}
```
### 3.4 获取商品奖品列表
```http
GET /api/goods/prizeList/{goods_id}
```
**请求参数:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| num | int | 否 | 第几套默认0 |
**响应示例:**
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": 2001,
"title": "限定手办A",
"imgurl": "奖品图片",
"price": "299.00",
"money": "150.00",
"real_pro": "0.05000",
"goods_type": 1,
"stock": 10,
"surplus_stock": 8,
"prize_code": "A001",
"rank": 1
}
]
}
```
## 4. 订单相关接口
### 4.1 创建订单
```http
POST /api/order/create
```
**请求参数:**
```json
{
"goods_id": 1001,
"num": 0,
"prize_num": 1,
"coupon_id": 0,
"use_money": "0.00",
"use_integral": "0.00",
"use_draw": 0
}
```
**参数说明:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| goods_id | int | 是 | 商品ID |
| num | int | 是 | 第几套 |
| prize_num | int | 是 | 抽奖数量 |
| coupon_id | int | 否 | 优惠券ID |
| use_money | decimal | 否 | 使用余额 |
| use_integral | decimal | 否 | 使用积分 |
| use_draw | int | 否 | 使用抽奖券 |
**响应示例:**
```json
{
"code": 200,
"msg": "订单创建成功",
"data": {
"order_id": 10001,
"order_num": "202401010001",
"order_total": "29.90",
"price": "29.90",
"goods_info": {
"id": 1001,
"title": "精美手办盲盒",
"imgurl": "商品图片"
}
}
}
```
### 4.2 获取支付参数
```http
POST /api/order/pay
```
**请求参数:**
```json
{
"order_id": 10001,
"pay_type": 1
}
```
**参数说明:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| order_id | int | 是 | 订单ID |
| pay_type | int | 是 | 支付方式1-微信2-支付宝 |
**响应示例:**
```json
{
"code": 200,
"msg": "success",
"data": {
"pay_params": {
"appId": "wx123456789",
"timeStamp": "1640995200",
"nonceStr": "abc123",
"package": "prepay_id=wx123456789",
"signType": "RSA",
"paySign": "signature"
}
}
}
```
### 4.3 获取订单列表
```http
GET /api/order/list
```
**请求参数:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| status | int | 否 | 订单状态0-未支付1-已支付 |
| page | int | 否 | 页码 |
| limit | int | 否 | 每页数量 |
**响应示例:**
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"id": 10001,
"order_num": "202401010001",
"goods_title": "精美手办盲盒",
"goods_imgurl": "商品图片",
"order_total": "29.90",
"price": "29.90",
"prize_num": 1,
"status": 1,
"addtime": 1640995200,
"pay_time": 1640995300
}
],
"total": 50,
"page": 1,
"limit": 20
}
}
```
## 5. 抽奖相关接口
### 5.1 获取中奖记录
```http
GET /api/prize/list
```
**请求参数:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| status | int | 否 | 状态0-待选择1-回收2-发货3-集市 |
| page | int | 否 | 页码 |
| limit | int | 否 | 每页数量 |
**响应示例:**
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"id": 20001,
"order_id": 10001,
"goodslist_title": "限定手办A",
"goodslist_imgurl": "奖品图片",
"goodslist_price": "299.00",
"goodslist_money": "150.00",
"goodslist_type": 1,
"status": 0,
"addtime": 1640995300,
"prize_code": "A001",
"luck_no": 1
}
],
"total": 20,
"page": 1,
"limit": 20
}
}
```
### 5.2 选择奖品处理方式
```http
POST /api/prize/choose
```
**请求参数:**
```json
{
"order_list_ids": [20001, 20002],
"type": 1
}
```
**参数说明:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| order_list_ids | array | 是 | 中奖记录ID数组 |
| type | int | 是 | 处理方式1-回收2-发货3-集市 |
**响应示例:**
```json
{
"code": 200,
"msg": "操作成功",
"data": {
"recovery_num": "R202401010001",
"total_money": "300.00"
}
}
```
## 6. 集市相关接口
### 6.1 获取集市商品列表
```http
GET /api/market/list
```
**请求参数:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| keyword | string | 否 | 搜索关键词 |
| min_price | decimal | 否 | 最低价格 |
| max_price | decimal | 否 | 最高价格 |
| page | int | 否 | 页码 |
| limit | int | 否 | 每页数量 |
**响应示例:**
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"id": 30001,
"order_num": "M202401010001",
"price": "280.00",
"stock": 1,
"status": 0,
"addtime": 1640995400,
"goods_info": [
{
"title": "限定手办A",
"imgurl": "奖品图片",
"price": "299.00"
}
]
}
],
"total": 100,
"page": 1,
"limit": 20
}
}
```
### 6.2 发布集市商品
```http
POST /api/market/publish
```
**请求参数:**
```json
{
"order_list_ids": [20001],
"price": "280.00"
}
```
**响应示例:**
```json
{
"code": 200,
"msg": "发布成功",
"data": {
"market_id": 30001,
"order_num": "M202401010001"
}
}
```
### 6.3 购买集市商品
```http
POST /api/market/buy
```
**请求参数:**
```json
{
"market_id": 30001,
"pay_type": 1
}
```
**响应示例:**
```json
{
"code": 200,
"msg": "购买成功",
"data": {
"order_id": 40001,
"pay_params": {
"appId": "wx123456789",
"timeStamp": "1640995200",
"nonceStr": "abc123",
"package": "prepay_id=wx123456789",
"signType": "RSA",
"paySign": "signature"
}
}
}
```
## 7. 财务相关接口
### 7.1 获取资金明细
```http
GET /api/finance/moneyLog
```
**请求参数:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| type | int | 否 | 类型1-充值2-消费3-回收等 |
| page | int | 否 | 页码 |
| limit | int | 否 | 每页数量 |
**响应示例:**
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"id": 50001,
"change_money": "+150.00",
"money": "250.00",
"type": 4,
"type_name": "背包回收",
"content": "回收奖品获得",
"addtime": 1640995500
}
],
"total": 50,
"page": 1,
"limit": 20
}
}
```
### 7.2 获取积分明细
```http
GET /api/finance/integralLog
```
**响应格式同资金明细**
### 7.3 获取优惠券列表
```http
GET /api/finance/couponList
```
**请求参数:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| status | int | 否 | 状态0-未使用1-已使用2-已过期 |
**响应示例:**
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": 60001,
"title": "新人专享券",
"price": "5.00",
"man_price": "30.00",
"end_time": 1641081600,
"status": 0,
"state": 0
}
]
}
```
## 8. 发货相关接口
### 8.1 创建发货订单
```http
POST /api/delivery/create
```
**请求参数:**
```json
{
"order_list_ids": [20001, 20002],
"name": "张三",
"mobile": "13800138000",
"address": "北京市朝阳区xxx街道xxx号",
"message": "请小心轻放"
}
```
**响应示例:**
```json
{
"code": 200,
"msg": "发货订单创建成功",
"data": {
"send_id": 70001,
"send_num": "S202401010001",
"freight": "10.00",
"total_price": "10.00"
}
}
```
### 8.2 获取发货订单列表
```http
GET /api/delivery/list
```
**响应示例:**
```json
{
"code": 200,
"msg": "success",
"data": {
"list": [
{
"id": 70001,
"send_num": "S202401010001",
"freight": "10.00",
"status": 1,
"count": 2,
"name": "张三",
"mobile": "138****8000",
"address": "北京市朝阳区xxx街道xxx号",
"courier_number": "SF1234567890",
"courier_name": "顺丰速运",
"addtime": 1640995600,
"send_time": 1640995700
}
]
}
}
```
### 8.3 获取物流信息
```http
GET /api/delivery/track/{send_id}
```
**响应示例:**
```json
{
"code": 200,
"msg": "success",
"data": {
"courier_number": "SF1234567890",
"courier_name": "顺丰速运",
"delivery_status": 3,
"delivery_list": [
{
"time": "2024-01-01 10:00:00",
"context": "快件已发出"
},
{
"time": "2024-01-01 15:30:00",
"context": "快件已到达中转站"
}
]
}
}
```
## 9. 系统配置接口
### 9.1 获取系统配置
```http
GET /api/system/config
```
**响应示例:**
```json
{
"code": 200,
"msg": "success",
"data": {
"app_name": "抽奖盲盒",
"app_version": "1.0.0",
"customer_service": "400-123-4567",
"agreement_url": "https://example.com/agreement",
"privacy_url": "https://example.com/privacy"
}
}
```
### 9.2 获取轮播图
```http
GET /api/system/banner
```
**请求参数:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| type | int | 否 | 类型1-首页轮播2-抽卡机轮播 |
**响应示例:**
```json
{
"code": 200,
"msg": "success",
"data": [
{
"id": 1,
"imgurl": "轮播图URL",
"url": "跳转链接",
"ttype": 2,
"goods_id": 1001
}
]
}
```
## 10. 错误码说明
| 错误码 | 说明 |
|--------|------|
| 10001 | 参数错误 |
| 10002 | 用户不存在 |
| 10003 | 验证码错误 |
| 10004 | 验证码已过期 |
| 20001 | 商品不存在 |
| 20002 | 商品已下架 |
| 20003 | 商品库存不足 |
| 30001 | 订单不存在 |
| 30002 | 订单状态错误 |
| 30003 | 余额不足 |
| 40001 | 支付失败 |
| 40002 | 支付超时 |
| 50001 | 抽奖失败 |
| 50002 | 奖品库存不足 |
## 11. 接口调用示例
### JavaScript示例
```javascript
// 用户登录
const login = async (phone, code) => {
const response = await fetch('/api/user/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
phone: phone,
code: code
})
});
const result = await response.json();
if (result.code === 200) {
localStorage.setItem('token', result.data.token);
return result.data;
} else {
throw new Error(result.msg);
}
};
// 获取商品列表
const getGoodsList = async (params = {}) => {
const query = new URLSearchParams(params).toString();
const response = await fetch(`/api/goods/list?${query}`, {
headers: {
'Authorization': `Bearer ${localStorage.getItem('token')}`
}
});
return await response.json();
};
// 创建订单
const createOrder = async (orderData) => {
const response = await fetch('/api/order/create', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${localStorage.getItem('token')}`
},
body: JSON.stringify(orderData)
});
return await response.json();
};
```
### PHP示例
```php
<?php
class ApiClient {
private $baseUrl;
private $token;
public function __construct($baseUrl) {
$this->baseUrl = $baseUrl;
}
public function setToken($token) {
$this->token = $token;
}
public function request($method, $endpoint, $data = null) {
$url = $this->baseUrl . $endpoint;
$headers = ['Content-Type: application/json'];
if ($this->token) {
$headers[] = 'Authorization: Bearer ' . $this->token;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
if ($method === 'POST') {
curl_setopt($ch, CURLOPT_POST, true);
if ($data) {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
}
}
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
public function login($phone, $code) {
return $this->request('POST', '/api/user/login', [
'phone' => $phone,
'code' => $code
]);
}
public function getGoodsList($params = []) {
$query = http_build_query($params);
return $this->request('GET', '/api/goods/list?' . $query);
}
}
// 使用示例
$client = new ApiClient('https://api.example.com');
$result = $client->login('13800138000', '123456');
if ($result['code'] === 200) {
$client->setToken($result['data']['token']);
$goodsList = $client->getGoodsList(['type' => 1, 'page' => 1]);
}
?>
```
这份API文档涵盖了抽奖盲盒系统的主要功能接口包括用户认证、商品管理、订单处理、抽奖机制、集市交易、财务管理等核心业务模块。每个接口都提供了详细的参数说明和响应示例便于前端开发和第三方集成。

284
docs/README.md Normal file
View File

@ -0,0 +1,284 @@
# 抽奖盲盒系统文档
欢迎来到抽奖盲盒系统的技术文档中心!本文档集合包含了系统的完整技术资料,帮助开发者、运维人员和产品经理全面了解系统架构和业务流程。
## 📚 文档目录
### 🎯 [业务流程图](./业务流程图.md)
详细展示了系统的核心业务流程,包括:
- 系统整体业务流程
- 用户注册登录流程
- 抽奖核心流程
- 支付流程
- 商品管理流程
- 订单处理流程
- 集市交易流程
- 数据统计分析流程
### 🏗️ [系统架构图](./系统架构图.md)
全面介绍了系统的技术架构设计,包括:
- 系统整体架构
- 应用模块架构
- 抽奖算法架构
- 支付系统架构
- 缓存架构设计
- 消息队列架构
- 安全架构设计
- 监控运维架构
### 🗄️ [数据库设计图](./数据库设计图.md)
完整的数据库设计文档,包含:
- 数据库整体ER图
- 核心业务表关系图
- 用户财务系统表关系图
- 商品管理系统表关系图
- 管理后台系统表关系图
- 数据表索引设计
- 数据库分表策略
- 数据备份与恢复策略
### 🔌 [API接口文档](./API接口文档.md)
详细的API接口说明文档包括
- 用户认证接口
- 商品相关接口
- 订单相关接口
- 抽奖相关接口
- 集市相关接口
- 财务相关接口
- 发货相关接口
- 系统配置接口
- 错误码说明
- 接口调用示例
## 🎮 系统概述
### 项目简介
这是一个基于 **ThinkPHP 6.0** 框架开发的**抽奖盲盒系统**,主要面向娱乐抽奖和商品销售场景。系统采用前后端分离架构,支持多种抽奖模式和支付方式。
### 核心特性
- 🎲 **多样化抽奖模式**支持一番赏、无限赏、擂台赏、抽卡机等9种抽奖类型
- 💰 **灵活支付系统**:支持微信支付、支付宝、余额、虚拟货币等多种支付方式
- 🎁 **智能奖品管理**:支持普通奖品、宝箱奖品、特殊奖品等多种类型
- 🛒 **完整交易流程**:从下单到收货的完整闭环,支持发货、回收、集市交易
- 📊 **数据分析系统**:全方位的用户行为分析和销售数据统计
- 🔒 **安全防护机制**:多层安全防护,完善的权限控制体系
### 技术栈
- **后端框架**ThinkPHP 6.0
- **数据库**MySQL 5.7+
- **缓存**Redis
- **PHP版本**7.1+ (兼容 PHP 8.0)
- **依赖管理**Composer
## 🚀 快速开始
### 环境要求
- PHP 7.1+
- MySQL 5.7+
- Redis 3.0+
- Composer
### 安装步骤
1. **克隆项目**
```bash
git clone [项目地址]
cd lottery-system
```
2. **安装依赖**
```bash
composer install
```
3. **配置环境**
```bash
cp .env.example .env
# 编辑 .env 文件,配置数据库和其他服务
```
4. **导入数据库**
```bash
mysql -u root -p < table.sql
```
5. **启动服务**
```bash
php think run
```
### 配置说明
主要配置文件位于 `config/` 目录下:
- `database.php` - 数据库配置
- `app.php` - 应用配置
- `cache.php` - 缓存配置
- `route.php` - 路由配置
## 📋 业务模块
### 用户系统
- 手机号注册登录
- 用户信息管理
- 等级体系
- 推荐机制
### 商品系统
- 商品分类管理
- 多种抽奖类型
- 奖品配置
- 库存管理
- 概率控制
### 订单系统
- 订单创建
- 支付处理
- 抽奖执行
- 中奖记录
### 财务系统
- 多币种支持
- 资金流水
- 优惠券系统
- 回收机制
### 物流系统
- 发货管理
- 物流跟踪
- 收货确认
### 集市系统
- 商品发布
- 交易撮合
- 安全保障
## 🔧 开发指南
### 代码结构
```
server/php/
├── app/ # 应用目录
│ ├── admin/ # 管理后台
│ ├── api/ # API接口
│ ├── index/ # 前台页面
│ ├── command/ # 命令行任务
│ └── common/ # 公共模块
├── config/ # 配置文件
├── public/ # 入口文件
├── route/ # 路由定义
├── view/ # 视图模板
└── vendor/ # 第三方依赖
```
### 开发规范
- 遵循 PSR-4 自动加载规范
- 使用 ThinkPHP 6.0 开发规范
- 数据库操作使用 ORM
- 接口返回统一 JSON 格式
- 完善的异常处理机制
### 扩展开发
系统采用模块化设计,支持功能扩展:
- 新增抽奖类型
- 自定义支付方式
- 扩展奖品类型
- 增加数据分析维度
## 🛡️ 安全特性
### 数据安全
- 敏感信息加密存储
- SQL注入防护
- XSS攻击防护
- CSRF防护
### 业务安全
- 防刷机制
- 风控系统
- 异常监控
- 操作审计
### 系统安全
- JWT认证
- 权限控制
- 访问日志
- 安全配置
## 📈 性能优化
### 数据库优化
- 合理的索引设计
- 读写分离
- 分表策略
- 查询优化
### 缓存策略
- Redis缓存
- 数据缓存
- 页面缓存
- 对象缓存
### 系统优化
- 异步处理
- 队列机制
- 负载均衡
- CDN加速
## 🔍 监控运维
### 日志管理
- 应用日志
- 错误日志
- 访问日志
- 业务日志
### 性能监控
- 系统性能
- 数据库性能
- 接口性能
- 用户体验
### 告警机制
- 实时告警
- 邮件通知
- 短信通知
- 钉钉通知
## 🤝 贡献指南
### 开发流程
1. Fork 项目
2. 创建功能分支
3. 提交代码
4. 创建 Pull Request
### 代码规范
- 遵循 PSR 标准
- 添加必要注释
- 编写单元测试
- 更新文档
### 问题反馈
- 通过 Issue 反馈问题
- 提供详细的问题描述
- 包含复现步骤
- 提供环境信息
## 📞 技术支持
### 联系方式
- 技术交流群:[群号]
- 邮箱:[邮箱地址]
- 官网:[官网地址]
### 常见问题
- 查看 FAQ 文档
- 搜索历史 Issue
- 参考技术文档
- 联系技术支持
## 📄 许可证
本项目采用 [Apache 2.0](../LICENSE) 许可证。
---
**注意**:本文档会持续更新,请关注最新版本。如有疑问或建议,欢迎提交 Issue 或 Pull Request。

375
docs/业务流程图.md Normal file
View File

@ -0,0 +1,375 @@
# 抽奖盲盒系统业务流程图
## 1. 系统整体业务流程
```mermaid
graph TD
A[用户注册/登录] --> B[浏览商品]
B --> C{选择抽奖类型}
C --> D1[一番赏]
C --> D2[无限赏]
C --> D3[擂台赏]
C --> D4[抽卡机]
C --> D5[积分赏]
C --> D6[全局赏]
C --> D7[福利盲盒]
C --> D8[领主赏]
C --> D9[连击赏]
D1 --> E[创建订单]
D2 --> E
D3 --> E
D4 --> E
D5 --> E
D6 --> E
D7 --> E
D8 --> E
D9 --> E
E --> F{选择支付方式}
F --> G1[微信支付]
F --> G2[支付宝支付]
F --> G3[余额支付]
F --> G4[虚拟货币支付]
F --> G5[优惠券抵扣]
G1 --> H[支付成功]
G2 --> H
G3 --> H
G4 --> H
G5 --> H
H --> I[执行抽奖算法]
I --> J[生成中奖结果]
J --> K{奖品类型判断}
K --> L1[普通奖品]
K --> L2[宝箱奖品]
K --> L3[特殊奖品]
K --> L4[虚拟货币]
L1 --> M[用户选择处理方式]
L2 --> N[开启宝箱]
L3 --> M
L4 --> O[自动到账]
N --> M
M --> P{处理方式}
P --> Q1[选择发货]
P --> Q2[回收换钱]
P --> Q3[发布集市]
Q1 --> R1[填写收货地址]
Q2 --> R2[获得回收金额]
Q3 --> R3[集市交易]
R1 --> S1[商家发货]
R2 --> T[完成]
R3 --> U[等待买家]
S1 --> V[用户确认收货]
U --> W[买家购买]
V --> T
W --> T
```
## 2. 用户注册登录流程
```mermaid
sequenceDiagram
participant U as 用户
participant F as 前端
participant A as API服务
participant D as 数据库
participant S as 短信服务
U->>F: 输入手机号
F->>A: 发送验证码请求
A->>S: 调用短信接口
S-->>A: 发送成功
A->>D: 保存验证码记录
A-->>F: 返回发送结果
U->>F: 输入验证码
F->>A: 提交登录/注册
A->>D: 验证验证码
D-->>A: 验证结果
alt 验证成功
A->>D: 创建/更新用户信息
A->>A: 生成JWT Token
A-->>F: 返回用户信息和Token
F-->>U: 登录成功
else 验证失败
A-->>F: 返回错误信息
F-->>U: 显示错误
end
```
## 3. 抽奖核心流程
```mermaid
graph TD
A[用户发起抽奖] --> B[验证用户权限]
B --> C{权限检查}
C -->|失败| D[返回错误信息]
C -->|成功| E[验证商品状态]
E --> F{商品检查}
F -->|下架/售罄| G[返回商品不可用]
F -->|正常| H[创建订单]
H --> I[计算订单金额]
I --> J[应用优惠券/折扣]
J --> K[用户确认支付]
K --> L{支付处理}
L -->|失败| M[订单取消]
L -->|成功| N[开始抽奖流程]
N --> O[获取奖品池]
O --> P[执行抽奖算法]
P --> Q{抽奖算法类型}
Q --> R1[加权随机算法]
Q --> R2[概率区间算法]
Q --> R3[库存消耗算法]
R1 --> S[计算中奖结果]
R2 --> S
R3 --> S
S --> T[更新库存]
T --> U[创建中奖记录]
U --> V{奖品类型}
V --> W1[普通奖品]
V --> W2[宝箱奖品]
V --> W3[虚拟货币]
V --> W4[特殊奖品]
W1 --> X[等待用户选择]
W2 --> Y[触发宝箱开启]
W3 --> Z[自动发放到账]
W4 --> AA[特殊处理逻辑]
Y --> BB[递归抽奖流程]
BB --> X
AA --> X
X --> CC[用户做出选择]
CC --> DD{选择类型}
DD --> EE[发货流程]
DD --> FF[回收流程]
DD --> GG[集市流程]
```
## 4. 支付流程
```mermaid
sequenceDiagram
participant U as 用户
participant F as 前端
participant A as API服务
participant P as 支付服务
participant D as 数据库
U->>F: 选择支付方式
F->>A: 创建支付订单
A->>D: 保存订单信息
A->>P: 调用支付接口
P-->>A: 返回支付参数
A-->>F: 返回支付信息
F->>U: 显示支付界面
U->>P: 完成支付
P->>A: 支付回调通知
A->>D: 验证订单状态
A->>D: 更新支付状态
A->>A: 触发抽奖流程
A-->>P: 确认回调处理
A->>F: 推送抽奖结果
F-->>U: 显示中奖信息
```
## 5. 商品管理流程
```mermaid
graph TD
A[管理员登录] --> B[商品管理后台]
B --> C{操作类型}
C --> D1[创建商品]
C --> D2[编辑商品]
C --> D3[管理库存]
C --> D4[设置奖品]
D1 --> E1[填写基本信息]
E1 --> E2[上传商品图片]
E2 --> E3[设置价格和库存]
E3 --> E4[配置抽奖参数]
E4 --> E5[保存商品]
D4 --> F1[添加奖品]
F1 --> F2[设置奖品概率]
F2 --> F3[配置奖品库存]
F3 --> F4[设置奖品价值]
F4 --> F5[保存奖品配置]
D3 --> G1[查看库存状态]
G1 --> G2[调整库存数量]
G2 --> G3[设置预警阈值]
G3 --> G4[配置自动下架]
E5 --> H[商品审核]
F5 --> H
G4 --> H
H --> I{审核结果}
I -->|通过| J[商品上架]
I -->|拒绝| K[返回修改]
J --> L[用户可见]
K --> C
```
## 6. 订单处理流程
```mermaid
graph TD
A[订单创建] --> B[订单支付]
B --> C[抽奖执行]
C --> D[生成中奖记录]
D --> E{用户选择}
E --> F1[选择发货]
E --> F2[选择回收]
E --> F3[发布集市]
F1 --> G1[用户填写地址]
G1 --> G2[生成发货订单]
G2 --> G3[商家打包发货]
G3 --> G4[物流配送]
G4 --> G5[用户确认收货]
G5 --> G6[订单完成]
F2 --> H1[计算回收价格]
H1 --> H2[确认回收]
H2 --> H3[资金到账]
H3 --> H4[回收完成]
F3 --> I1[设置售价]
I1 --> I2[发布到集市]
I2 --> I3[等待买家]
I3 --> I4{是否有买家}
I4 -->|是| I5[买家支付]
I4 -->|否| I6[撤回商品]
I5 --> I7[交易完成]
I6 --> E
```
## 7. 集市交易流程
```mermaid
sequenceDiagram
participant S as 卖家
participant M as 集市系统
participant B as 买家
participant P as 支付系统
participant D as 数据库
S->>M: 发布商品到集市
M->>D: 保存商品信息
M-->>S: 发布成功
B->>M: 浏览集市商品
M->>D: 查询商品列表
D-->>M: 返回商品数据
M-->>B: 显示商品列表
B->>M: 选择购买商品
M->>D: 检查商品状态
D-->>M: 商品可购买
M->>P: 创建支付订单
P-->>M: 返回支付信息
M-->>B: 显示支付界面
B->>P: 完成支付
P->>M: 支付成功回调
M->>D: 更新交易状态
M->>D: 转移商品所有权
M->>S: 通知交易成功
M-->>B: 交易完成
```
## 8. 数据统计分析流程
```mermaid
graph TD
A[数据收集] --> B[实时数据处理]
B --> C[数据存储]
C --> D[定时任务分析]
D --> E{分析类型}
E --> F1[用户行为分析]
E --> F2[销售数据分析]
E --> F3[财务数据分析]
E --> F4[商品热度分析]
F1 --> G1[用户活跃度]
F1 --> G2[用户消费习惯]
F1 --> G3[用户留存率]
F2 --> H1[销售额统计]
F2 --> H2[商品销量排行]
F2 --> H3[地区销售分布]
F3 --> I1[收入支出统计]
F3 --> I2[利润率分析]
F3 --> I3[成本控制]
F4 --> J1[商品点击率]
F4 --> J2[转化率分析]
F4 --> J3[库存周转率]
G1 --> K[生成报表]
G2 --> K
G3 --> K
H1 --> K
H2 --> K
H3 --> K
I1 --> K
I2 --> K
I3 --> K
J1 --> K
J2 --> K
J3 --> K
K --> L[管理员查看]
K --> M[自动预警]
K --> N[决策支持]
```
## 流程图说明
### 主要业务流程特点:
1. **多样化抽奖模式**支持9种不同的抽奖类型满足不同用户需求
2. **灵活支付方式**:支持多种支付方式和虚拟货币组合支付
3. **智能抽奖算法**:采用优化后的加权随机算法,确保公平性和性能
4. **完整订单流程**:从下单到收货的完整闭环
5. **用户自主选择**:中奖后可选择发货、回收或集市交易
6. **实时数据分析**:全方位的数据统计和分析支持
### 技术实现要点:
- 使用事务确保数据一致性
- 异步处理提高系统性能
- 缓存机制减少数据库压力
- 完善的日志记录便于问题排查
- 模块化设计便于功能扩展
这些流程图展示了系统的核心业务逻辑和技术架构,为开发和运维提供了清晰的指导。

629
docs/数据库设计图.md Normal file
View File

@ -0,0 +1,629 @@
# 抽奖盲盒系统数据库设计图
## 1. 数据库整体ER图
```mermaid
erDiagram
%% 用户相关表
USER ||--o{ ORDER : "下单"
USER ||--o{ ORDER_LIST : "中奖记录"
USER ||--o{ COUPON_RECEIVE : "领取优惠券"
USER ||--o{ PROFIT_MONEY : "资金变动"
USER ||--o{ PROFIT_INTEGRAL : "积分变动"
USER ||--o{ COLLECT : "收藏"
USER ||--o{ MARKET : "集市发布"
USER ||--o{ MARKET_ORDER : "集市购买"
%% 商品相关表
CATEGORY ||--o{ GOODS : "商品分类"
GOODS ||--o{ GOODS_LIST : "奖品列表"
GOODS ||--o{ ORDER : "被购买"
GOODS ||--o{ GOODS_LOCK : "锁箱记录"
GOODS_LIST ||--o{ ORDER_LIST : "中奖奖品"
%% 订单相关表
ORDER ||--o{ ORDER_LIST : "订单明细"
ORDER_LIST ||--o{ ORDER_LIST_SEND : "发货记录"
ORDER_LIST ||--o{ ORDER_LIST_RECOVERY : "回收记录"
ORDER_LIST ||--o{ MARKET : "集市商品"
%% 优惠券相关表
COUPON ||--o{ COUPON_RECEIVE : "用户优惠券"
%% 集市相关表
MARKET ||--o{ MARKET_ORDER : "集市订单"
%% 管理员相关表
ADMIN ||--o{ ADMIN_LOGIN_LOG : "登录日志"
ADMIN ||--o{ ADMIN_OPERATION_LOG : "操作日志"
ADMIN_QUANXIAN ||--o{ ADMIN : "权限分配"
USER {
int id PK "用户ID"
string phone "手机号"
string nickname "昵称"
string avatar "头像"
decimal money "余额"
decimal integral "积分"
decimal money2 "达达卷"
int level "等级"
int status "状态"
int addtime "注册时间"
int login_time "最后登录"
string openid "微信openid"
int share_uid "推荐人ID"
}
GOODS {
int id PK "商品ID"
int category_id FK "分类ID"
string title "商品名称"
string imgurl "封面图"
string imgurl_detail "详情图"
decimal price "价格"
int stock "库存"
int sale_stock "销量"
int type "类型1一番赏2无限赏3擂台赏4抽卡机5积分赏6全局赏7福利盲盒8领主赏9连击赏"
int status "状态1上架2下架3售罄"
int sort "排序"
int lock_is "锁箱开关"
int lock_time "锁箱时间"
int coupon_is "发券开关"
int coupon_pro "发券概率"
int integral_is "发积分开关"
int prize_num "抽奖数量"
int sale_time "预售时间"
int addtime "添加时间"
int update_time "更新时间"
}
GOODS_LIST {
int id PK "奖品ID"
int goods_id FK "商品ID"
int num "第几套"
string title "奖品名称"
string imgurl "奖品图片"
int stock "库存"
int surplus_stock "剩余库存"
decimal price "奖品价值"
decimal money "回收价"
decimal sc_money "市场参考价"
decimal real_pro "真实概率"
int goods_type "奖品类型1现货2预售3货币4宝箱"
int sale_time "预售时间"
int sort "排序"
string shang_id "赏ID"
int reward_num "奖励数量"
int rank "榜单排名"
string prize_code "奖品编号"
int addtime "添加时间"
}
ORDER {
int id PK "订单ID"
int user_id FK "用户ID"
string order_num "订单号"
decimal order_total "订单总金额"
decimal order_zhe_total "折扣金额"
decimal price "微信支付金额"
decimal use_money "余额支付"
decimal use_integral "积分支付"
decimal use_money2 "达达卷支付"
decimal use_coupon "优惠券抵扣"
int use_draw "抽奖券抵扣"
int use_item_card "道具卡抵扣"
int goods_id FK "商品ID"
int num "第几套"
decimal goods_price "商品单价"
string goods_title "商品标题"
string goods_imgurl "商品图片"
int prize_num "抽奖数量"
int status "状态0未支付1已支付"
int addtime "下单时间"
int pay_time "支付时间"
int pay_type "支付方式1微信2支付宝"
int order_type "订单类型"
int coupon_id "优惠券ID"
}
ORDER_LIST {
int id PK "中奖记录ID"
int order_id FK "订单ID"
int user_id FK "用户ID"
string recovery_num "回收订单号"
string send_num "发货订单号"
int status "状态0待选择1回收2发货3集市"
int goods_id FK "商品ID"
int num "第几箱"
int shang_id "赏ID"
int goodslist_id FK "奖品ID"
string goodslist_title "奖品名称"
string goodslist_imgurl "奖品图片"
decimal goodslist_price "奖品价值"
decimal goodslist_money "回收价"
int goodslist_type "奖品类型"
int goodslist_sale_time "预售时间"
int addtime "中奖时间"
int choice_time "选择时间"
int insurance_is "保险柜0否1是"
int order_type "订单类型"
int luck_no "抽奖序号"
string prize_code "奖品编号"
int source "来源1抽奖2集市购买"
}
CATEGORY {
int id PK "分类ID"
string title "分类名称"
int sort "排序"
int addtime "添加时间"
int update_time "更新时间"
}
COUPON {
int id PK "优惠券ID"
int type "类型1新人券2权益券"
string title "优惠券名称"
int sort "排序"
decimal price "减免金额"
decimal man_price "满减条件"
int effective_day "有效天数"
int addtime "添加时间"
int status "状态0上架2下架4删除"
int ttype "使用限制0不限制1一番赏2无限赏"
}
COUPON_RECEIVE {
int id PK "用户优惠券ID"
string title "优惠券名称"
decimal price "减免金额"
decimal man_price "满减条件"
int end_time "过期时间"
int addtime "领取时间"
int status "状态0未使用1已使用2已过期"
int user_id FK "用户ID"
int coupon_id FK "优惠券ID"
int state "使用限制"
}
PROFIT_MONEY {
int id PK "资金记录ID"
int user_id FK "用户ID"
decimal change_money "变化金额"
decimal money "变化后金额"
int type "类型1后台充值2在线充值3消费4回收5推荐奖励"
string content "描述"
int addtime "添加时间"
int share_uid "来源用户ID"
string other "其他信息"
}
PROFIT_INTEGRAL {
int id PK "积分记录ID"
int user_id FK "用户ID"
decimal change_money "变化积分"
decimal money "变化后积分"
int type "类型1后台充值2消费3开券获得4领主返币5分享欧气券"
string content "描述"
int addtime "添加时间"
int share_uid "来源用户ID"
string other "其他信息"
}
MARKET {
int id PK "集市商品ID"
int user_id FK "卖家ID"
string order_num "挂售单号"
decimal price "售价"
text order_list_ids "奖品ID列表"
int status "状态0在售1已售2已撤回"
int stock "库存"
int addtime "发布时间"
int update_time "更新时间"
}
MARKET_ORDER {
int id PK "集市订单ID"
int market_id FK "集市商品ID"
int user_id FK "买家ID"
string order_num "订单号"
decimal price "单价"
text order_list_ids "奖品ID列表"
int status "状态1未支付2已支付3卡单"
int pay_time "支付时间"
decimal total "总价"
decimal total_price "实际支付"
decimal money "余额支付"
int addtime "下单时间"
int update_time "更新时间"
}
ADMIN {
int id PK "管理员ID"
string username "账号"
string nickname "姓名"
string password "密码"
int qid "权限ID"
int status "状态0正常1禁用"
int get_time "登录刷新时间"
string random "token随机数"
string token "token"
int admin_id "操作人"
int addtime "添加时间"
int update_time "修改时间"
}
ADMIN_QUANXIAN {
int id PK "权限ID"
string title "权限名称"
text describe "描述"
text quanxian "权限内容"
int addtime "添加时间"
int update_time "修改时间"
int admin_id "操作人"
}
```
## 2. 核心业务表关系图
```mermaid
erDiagram
%% 抽奖核心流程
USER ||--o{ ORDER : "用户下单"
ORDER ||--|| GOODS : "购买商品"
ORDER ||--o{ ORDER_LIST : "生成中奖记录"
GOODS ||--o{ GOODS_LIST : "包含奖品"
GOODS_LIST ||--|| ORDER_LIST : "中奖奖品"
%% 用户选择处理
ORDER_LIST ||--o| ORDER_LIST_SEND : "选择发货"
ORDER_LIST ||--o| ORDER_LIST_RECOVERY : "选择回收"
ORDER_LIST ||--o| MARKET : "发布集市"
%% 集市交易
MARKET ||--o{ MARKET_ORDER : "集市购买"
USER ||--o{ MARKET_ORDER : "买家下单"
ORDER_LIST {
int id PK
int order_id FK
int user_id FK
int goodslist_id FK
int status "0待选择1回收2发货3集市"
string goodslist_title
decimal goodslist_price
decimal goodslist_money
int addtime
}
ORDER_LIST_SEND {
int id PK
int user_id FK
string send_num "发货订单号"
decimal freight "运费"
int status "0待支付1待发货2待收货3已完成"
int count "发货数量"
string name "收货人"
string mobile "电话"
string address "地址"
string courier_number "快递单号"
int addtime
}
ORDER_LIST_RECOVERY {
int id PK
int user_id FK
string recovery_num "回收订单号"
decimal money "回收金额"
int count "回收数量"
int addtime
}
```
## 3. 用户财务系统表关系图
```mermaid
erDiagram
USER ||--o{ PROFIT_MONEY : "余额变动"
USER ||--o{ PROFIT_INTEGRAL : "积分变动"
USER ||--o{ PROFIT_DRAW : "抽奖券变动"
USER ||--o{ COUPON_RECEIVE : "优惠券"
COUPON ||--o{ COUPON_RECEIVE : "发放"
ORDER ||--|| PROFIT_MONEY : "支付扣款"
ORDER_LIST_RECOVERY ||--|| PROFIT_MONEY : "回收入账"
USER {
int id PK
decimal money "余额"
decimal integral "积分"
decimal money2 "达达卷"
int draw_num "抽奖券"
}
PROFIT_MONEY {
int id PK
int user_id FK
decimal change_money "变化金额"
decimal money "变化后余额"
int type "1后台充值2在线充值3消费4回收5推荐奖励"
string content "描述"
int addtime
}
PROFIT_INTEGRAL {
int id PK
int user_id FK
decimal change_money "变化积分"
decimal money "变化后积分"
int type "1后台充值2消费3开券获得4领主返币"
string content "描述"
int addtime
}
PROFIT_DRAW {
int id PK
int user_id FK
decimal change_money "变化抽奖券"
decimal money "变化后抽奖券"
int type "变动类型"
string content "描述"
int addtime
}
```
## 4. 商品管理系统表关系图
```mermaid
erDiagram
CATEGORY ||--o{ GOODS : "商品分类"
GOODS ||--o{ GOODS_LIST : "奖品配置"
GOODS ||--o{ GOODS_LOCK : "锁箱记录"
GOODS ||--o{ GOODS_EXTEND : "扩展配置"
GOODS_TYPE ||--|| GOODS : "商品类型"
GOODS {
int id PK
int category_id FK
string title "商品名称"
string imgurl "封面图"
decimal price "价格"
int stock "库存套数"
int type "1一番赏2无限赏3擂台赏等"
int status "1上架2下架3售罄"
int lock_is "锁箱开关"
int coupon_is "发券开关"
int integral_is "发积分开关"
int prize_num "抽奖数量"
int addtime
}
GOODS_LIST {
int id PK
int goods_id FK
int num "第几套"
string title "奖品名称"
int stock "奖品库存"
int surplus_stock "剩余库存"
decimal price "奖品价值"
decimal money "回收价"
decimal real_pro "中奖概率"
int goods_type "1现货2预售3货币4宝箱"
string prize_code "奖品编号"
int addtime
}
GOODS_LOCK {
int id PK
int user_id FK
string goods_id_num "商品ID_套数"
int endtime "锁箱过期时间"
int update_time
}
GOODS_EXTEND {
int id PK
int goods_id FK
int pay_wechat "微信支付开关"
int pay_balance "余额支付开关"
int pay_currency "货币支付开关"
int pay_coupon "优惠券支付开关"
int is_deduction "是否抵扣"
}
```
## 5. 管理后台系统表关系图
```mermaid
erDiagram
ADMIN_QUANXIAN ||--o{ ADMIN : "权限分配"
ADMIN ||--o{ ADMIN_LOGIN_LOG : "登录日志"
ADMIN ||--o{ ADMIN_OPERATION_LOG : "操作日志"
ADMIN ||--o{ ADMIN_GOODS_LOG : "商品操作日志"
ADMIN {
int id PK
string username "账号"
string nickname "姓名"
string password "密码"
int qid FK "权限ID"
int status "0正常1禁用"
string token "登录token"
int addtime
}
ADMIN_QUANXIAN {
int id PK
string title "权限名称"
text describe "权限描述"
text quanxian "权限配置JSON"
int addtime
}
ADMIN_LOGIN_LOG {
int id PK
int a_id FK "管理员ID"
string ip "登录IP"
int addtime "登录时间"
}
ADMIN_OPERATION_LOG {
int id PK
int a_id FK "管理员ID"
string ip "操作IP"
string operation "操作控制器"
text content "操作内容"
int addtime "操作时间"
}
ADMIN_GOODS_LOG {
int id PK
int a_id FK "管理员ID"
int goods_id "商品ID"
int goods_list_id "奖品ID"
text original_data "原始数据"
text new_data "修改后数据"
string ip "操作IP"
int addtime "操作时间"
}
```
## 6. 数据表索引设计
```sql
-- 用户表索引
CREATE INDEX idx_user_phone ON user(phone);
CREATE INDEX idx_user_openid ON user(openid);
CREATE INDEX idx_user_share_uid ON user(share_uid);
-- 商品表索引
CREATE INDEX idx_goods_category_id ON goods(category_id);
CREATE INDEX idx_goods_type ON goods(type);
CREATE INDEX idx_goods_status ON goods(status);
CREATE INDEX idx_goods_addtime ON goods(addtime);
-- 奖品表索引
CREATE INDEX idx_goods_list_goods_id ON goods_list(goods_id);
CREATE INDEX idx_goods_list_num ON goods_list(num);
CREATE INDEX idx_goods_list_shang_id ON goods_list(shang_id);
CREATE INDEX idx_goods_list_real_pro ON goods_list(real_pro);
CREATE INDEX idx_goods_list_surplus_stock ON goods_list(surplus_stock);
CREATE INDEX idx_goods_list_prize_code ON goods_list(prize_code);
-- 订单表索引
CREATE UNIQUE INDEX idx_order_order_num ON `order`(order_num);
CREATE INDEX idx_order_user_id ON `order`(user_id);
CREATE INDEX idx_order_goods_id ON `order`(goods_id);
CREATE INDEX idx_order_status ON `order`(status);
CREATE INDEX idx_order_addtime ON `order`(addtime);
CREATE INDEX idx_order_pay_time ON `order`(pay_time);
-- 中奖记录表索引
CREATE INDEX idx_order_list_user_id ON order_list(user_id);
CREATE INDEX idx_order_list_order_id ON order_list(order_id);
CREATE INDEX idx_order_list_goods_id ON order_list(goods_id);
CREATE INDEX idx_order_list_goodslist_id ON order_list(goodslist_id);
CREATE INDEX idx_order_list_status ON order_list(status);
CREATE INDEX idx_order_list_prize_code ON order_list(prize_code);
CREATE INDEX idx_order_list_addtime ON order_list(addtime);
-- 财务记录表索引
CREATE INDEX idx_profit_money_user_id ON profit_money(user_id);
CREATE INDEX idx_profit_money_type ON profit_money(type);
CREATE INDEX idx_profit_money_addtime ON profit_money(addtime);
-- 集市表索引
CREATE INDEX idx_market_user_id ON market(user_id);
CREATE INDEX idx_market_status ON market(status);
CREATE INDEX idx_market_addtime ON market(addtime);
```
## 7. 数据库分表策略
```mermaid
graph TD
subgraph "订单相关表分表策略"
A1[order表] --> B1[按月分表order_202401]
A1 --> B2[按月分表order_202402]
A1 --> B3[按月分表order_202403]
A2[order_list表] --> C1[按月分表order_list_202401]
A2 --> C2[按月分表order_list_202402]
A2 --> C3[按月分表order_list_202403]
end
subgraph "日志表分表策略"
D1[admin_operation_log] --> E1[按月分表admin_operation_log_202401]
D1 --> E2[按月分表admin_operation_log_202402]
D2[admin_login_log] --> F1[按月分表admin_login_log_202401]
D2 --> F2[按月分表admin_login_log_202402]
end
subgraph "财务表分表策略"
G1[profit_money] --> H1[按月分表profit_money_202401]
G1 --> H2[按月分表profit_money_202402]
G2[profit_integral] --> I1[按月分表profit_integral_202401]
G2 --> I2[按月分表profit_integral_202402]
end
```
## 8. 数据备份与恢复策略
```mermaid
graph TD
subgraph "备份策略"
A1[全量备份] --> B1[每日凌晨2点]
A2[增量备份] --> B2[每4小时一次]
A3[日志备份] --> B3[实时备份]
end
subgraph "存储策略"
C1[本地存储] --> D1[保留7天]
C2[远程存储] --> D2[保留30天]
C3[归档存储] --> D3[保留1年]
end
subgraph "恢复策略"
E1[热备恢复] --> F1[5分钟内]
E2[温备恢复] --> F2[30分钟内]
E3[冷备恢复] --> F3[2小时内]
end
B1 --> C1
B1 --> C2
B2 --> C1
B3 --> C1
C1 --> C2
C2 --> C3
D1 --> E1
D2 --> E2
D3 --> E3
```
## 数据库设计特点
### 1. 业务特点适配
- 支持多种抽奖类型的数据结构
- 灵活的奖品配置和概率控制
- 完整的用户财务流水记录
### 2. 性能优化
- 合理的索引设计提升查询效率
- 分表策略应对大数据量
- 读写分离支持高并发
### 3. 数据完整性
- 外键约束保证数据一致性
- 事务支持确保操作原子性
- 完善的日志记录便于审计
### 4. 扩展性设计
- 预留扩展字段支持功能升级
- 模块化表结构便于维护
- 标准化命名规范提升可读性
这个数据库设计充分考虑了抽奖盲盒系统的业务复杂性,在保证数据完整性的同时,也为系统的高性能和可扩展性提供了良好的基础。

559
docs/系统架构图.md Normal file
View File

@ -0,0 +1,559 @@
# 抽奖盲盒系统架构图
## 1. 系统整体架构
```mermaid
graph TB
subgraph "客户端层"
A1[微信小程序]
A2[H5页面]
A3[管理后台]
end
subgraph "网关层"
B1[Nginx反向代理]
B2[负载均衡]
end
subgraph "应用层"
C1[API接口模块]
C2[管理后台模块]
C3[定时任务模块]
end
subgraph "业务服务层"
D1[用户服务]
D2[商品服务]
D3[订单服务]
D4[支付服务]
D5[抽奖服务]
D6[物流服务]
D7[集市服务]
end
subgraph "数据层"
E1[MySQL主库]
E2[MySQL从库]
E3[Redis缓存]
E4[文件存储]
end
subgraph "外部服务"
F1[微信支付]
F2[支付宝]
F3[短信服务]
F4[物流接口]
F5[腾讯云COS]
end
A1 --> B1
A2 --> B1
A3 --> B1
B1 --> B2
B2 --> C1
B2 --> C2
C1 --> D1
C1 --> D2
C1 --> D3
C1 --> D4
C1 --> D5
C1 --> D6
C1 --> D7
C2 --> D1
C2 --> D2
C2 --> D3
C3 --> D1
C3 --> D2
C3 --> D3
D1 --> E1
D2 --> E1
D3 --> E1
D4 --> E1
D5 --> E1
D6 --> E1
D7 --> E1
D1 --> E2
D2 --> E2
D3 --> E2
D1 --> E3
D2 --> E3
D3 --> E3
D4 --> E3
D5 --> E3
D2 --> E4
D6 --> E4
D4 --> F1
D4 --> F2
D1 --> F3
D6 --> F4
D2 --> F5
```
## 2. 应用模块架构
```mermaid
graph TD
subgraph "ThinkPHP 6.0 框架"
A[应用入口 public/index.php]
subgraph "多应用模式"
B1[admin - 管理后台]
B2[api - 接口服务]
B3[index - 前台页面]
end
subgraph "公共模块"
C1[common/model - 数据模型]
C2[common/service - 业务服务]
C3[common/helper - 工具类]
C4[common/server - 服务类]
end
subgraph "中间件层"
D1[认证中间件]
D2[权限中间件]
D3[日志中间件]
D4[跨域中间件]
end
subgraph "配置管理"
E1[数据库配置]
E2[缓存配置]
E3[路由配置]
E4[应用配置]
end
end
A --> B1
A --> B2
A --> B3
B1 --> C1
B1 --> C2
B2 --> C1
B2 --> C2
B3 --> C1
B3 --> C2
B1 --> D1
B1 --> D2
B2 --> D1
B2 --> D3
C1 --> E1
C2 --> E2
B1 --> E3
B2 --> E3
```
## 3. 数据库架构设计
```mermaid
erDiagram
USER ||--o{ ORDER : "下单"
USER ||--o{ ORDER_LIST : "中奖"
USER ||--o{ COUPON_RECEIVE : "领取"
USER ||--o{ PROFIT_MONEY : "资金变动"
GOODS ||--o{ GOODS_LIST : "包含"
GOODS ||--o{ ORDER : "被购买"
GOODS_LIST ||--o{ ORDER_LIST : "中奖奖品"
ORDER ||--o{ ORDER_LIST : "包含"
ORDER_LIST ||--o{ ORDER_LIST_SEND : "发货"
ORDER_LIST ||--o{ MARKET : "集市"
CATEGORY ||--o{ GOODS : "分类"
COUPON ||--o{ COUPON_RECEIVE : "优惠券"
USER {
int id PK
string phone
string nickname
decimal money
decimal integral
int level
datetime addtime
}
GOODS {
int id PK
int category_id FK
string title
string imgurl
decimal price
int stock
int type
int status
datetime addtime
}
GOODS_LIST {
int id PK
int goods_id FK
string title
string imgurl
int stock
decimal price
decimal real_pro
int goods_type
}
ORDER {
int id PK
int user_id FK
string order_num
decimal order_total
decimal price
int goods_id FK
int prize_num
int status
datetime addtime
}
ORDER_LIST {
int id PK
int order_id FK
int user_id FK
int goods_id FK
int goodslist_id FK
string goodslist_title
decimal goodslist_price
int status
datetime addtime
}
```
## 4. 抽奖算法架构
```mermaid
graph TD
A[抽奖请求] --> B{抽奖类型判断}
B --> C1[一番赏算法]
B --> C2[无限赏算法]
B --> C3[抽卡机算法]
B --> C4[其他类型算法]
subgraph "抽奖算法核心"
D1[加权随机算法]
D2[概率区间算法]
D3[库存消耗算法]
E1[奖品池构建]
E2[权重计算]
E3[随机数生成]
E4[结果匹配]
end
C1 --> D1
C2 --> D2
C3 --> D3
C4 --> D1
D1 --> E1
D2 --> E1
D3 --> E1
E1 --> E2
E2 --> E3
E3 --> E4
E4 --> F{奖品类型}
F --> G1[普通奖品]
F --> G2[宝箱奖品]
F --> G3[特殊奖品]
G2 --> H[递归抽奖]
H --> E1
G1 --> I[更新库存]
G3 --> I
I --> J[生成中奖记录]
J --> K[返回结果]
```
## 5. 支付系统架构
```mermaid
graph TD
A[支付请求] --> B[支付路由]
B --> C{支付方式}
C --> D1[微信支付]
C --> D2[支付宝支付]
C --> D3[余额支付]
C --> D4[虚拟货币支付]
subgraph "支付处理"
E1[订单验证]
E2[金额计算]
E3[优惠券处理]
E4[支付执行]
E5[回调处理]
end
D1 --> E1
D2 --> E1
D3 --> E1
D4 --> E1
E1 --> E2
E2 --> E3
E3 --> E4
E4 --> F{支付结果}
F -->|成功| G[触发抽奖]
F -->|失败| H[订单取消]
subgraph "外部支付"
I1[微信支付API]
I2[支付宝API]
end
D1 --> I1
D2 --> I2
I1 --> E5
I2 --> E5
E5 --> J[更新订单状态]
J --> G
```
## 6. 缓存架构设计
```mermaid
graph TD
subgraph "应用层缓存"
A1[用户信息缓存]
A2[商品信息缓存]
A3[配置信息缓存]
A4[热点数据缓存]
end
subgraph "Redis集群"
B1[Redis Master]
B2[Redis Slave 1]
B3[Redis Slave 2]
end
subgraph "缓存策略"
C1[读写分离]
C2[主从同步]
C3[故障转移]
C4[数据持久化]
end
A1 --> B1
A2 --> B1
A3 --> B1
A4 --> B1
B1 --> B2
B1 --> B3
B1 --> C1
B2 --> C1
B3 --> C1
C1 --> C2
C2 --> C3
C3 --> C4
subgraph "缓存更新策略"
D1[定时更新]
D2[事件触发更新]
D3[LRU淘汰]
D4[TTL过期]
end
C4 --> D1
C4 --> D2
C4 --> D3
C4 --> D4
```
## 7. 消息队列架构
```mermaid
graph TD
subgraph "消息生产者"
A1[订单服务]
A2[支付服务]
A3[抽奖服务]
A4[物流服务]
end
subgraph "消息队列"
B1[支付成功队列]
B2[抽奖结果队列]
B3[发货通知队列]
B4[数据统计队列]
end
subgraph "消息消费者"
C1[抽奖处理器]
C2[通知处理器]
C3[统计处理器]
C4[日志处理器]
end
A1 --> B1
A2 --> B1
A2 --> B4
A3 --> B2
A3 --> B4
A4 --> B3
B1 --> C1
B2 --> C2
B3 --> C2
B4 --> C3
C1 --> D1[执行抽奖]
C2 --> D2[发送通知]
C3 --> D3[更新统计]
C4 --> D4[记录日志]
```
## 8. 安全架构设计
```mermaid
graph TD
subgraph "网络安全"
A1[HTTPS加密]
A2[防火墙]
A3[DDoS防护]
A4[IP白名单]
end
subgraph "应用安全"
B1[JWT认证]
B2[权限控制]
B3[参数验证]
B4[SQL注入防护]
B5[XSS防护]
end
subgraph "数据安全"
C1[数据加密]
C2[敏感信息脱敏]
C3[数据备份]
C4[访问日志]
end
subgraph "业务安全"
D1[防刷机制]
D2[风控系统]
D3[异常监控]
D4[操作审计]
end
A1 --> B1
A2 --> B2
A3 --> B3
A4 --> B4
B1 --> C1
B2 --> C2
B3 --> C3
B4 --> C4
B5 --> C4
C1 --> D1
C2 --> D2
C3 --> D3
C4 --> D4
```
## 9. 监控运维架构
```mermaid
graph TD
subgraph "应用监控"
A1[性能监控]
A2[错误监控]
A3[业务监控]
A4[用户行为监控]
end
subgraph "系统监控"
B1[服务器监控]
B2[数据库监控]
B3[缓存监控]
B4[网络监控]
end
subgraph "日志管理"
C1[应用日志]
C2[访问日志]
C3[错误日志]
C4[审计日志]
end
subgraph "告警系统"
D1[实时告警]
D2[邮件通知]
D3[短信通知]
D4[钉钉通知]
end
A1 --> D1
A2 --> D1
A3 --> D1
A4 --> D1
B1 --> D1
B2 --> D1
B3 --> D1
B4 --> D1
C1 --> D2
C2 --> D2
C3 --> D2
C4 --> D2
D1 --> D3
D2 --> D3
D3 --> D4
```
## 架构特点说明
### 1. 高可用性
- 采用主从数据库架构,支持读写分离
- Redis集群提供缓存高可用
- 负载均衡确保服务高可用
### 2. 高性能
- 多层缓存策略减少数据库压力
- 异步消息队列处理耗时操作
- 优化的抽奖算法提升处理效率
### 3. 可扩展性
- 微服务化的业务模块设计
- 水平扩展支持
- 插件化的支付和物流接口
### 4. 安全性
- 多层安全防护机制
- 完善的权限控制体系
- 全面的审计和监控
### 5. 可维护性
- 清晰的分层架构
- 标准化的开发规范
- 完善的日志和监控体系
这个架构设计充分考虑了抽奖盲盒系统的业务特点,在保证系统稳定性和性能的同时,也为未来的功能扩展预留了空间。