From 1dc9a869df2cdab447760655f6d96d03d2fad1ff Mon Sep 17 00:00:00 2001 From: zpc Date: Thu, 1 Jan 2026 21:01:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/API接口文档.md | 920 +++++++++++++++++++++++++++++++++++++ docs/README.md | 284 ++++++++++++ docs/业务流程图.md | 375 +++++++++++++++ docs/数据库设计图.md | 629 +++++++++++++++++++++++++ docs/系统架构图.md | 559 ++++++++++++++++++++++ 5 files changed, 2767 insertions(+) create mode 100644 docs/API接口文档.md create mode 100644 docs/README.md create mode 100644 docs/业务流程图.md create mode 100644 docs/数据库设计图.md create mode 100644 docs/系统架构图.md diff --git a/docs/API接口文档.md b/docs/API接口文档.md new file mode 100644 index 00000000..d911a0d8 --- /dev/null +++ b/docs/API接口文档.md @@ -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 +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文档涵盖了抽奖盲盒系统的主要功能接口,包括用户认证、商品管理、订单处理、抽奖机制、集市交易、财务管理等核心业务模块。每个接口都提供了详细的参数说明和响应示例,便于前端开发和第三方集成。 \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..92966e67 --- /dev/null +++ b/docs/README.md @@ -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。 \ No newline at end of file diff --git a/docs/业务流程图.md b/docs/业务流程图.md new file mode 100644 index 00000000..66fb32c6 --- /dev/null +++ b/docs/业务流程图.md @@ -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. **实时数据分析**:全方位的数据统计和分析支持 + +### 技术实现要点: + +- 使用事务确保数据一致性 +- 异步处理提高系统性能 +- 缓存机制减少数据库压力 +- 完善的日志记录便于问题排查 +- 模块化设计便于功能扩展 + +这些流程图展示了系统的核心业务逻辑和技术架构,为开发和运维提供了清晰的指导。 \ No newline at end of file diff --git a/docs/数据库设计图.md b/docs/数据库设计图.md new file mode 100644 index 00000000..e53b8d2d --- /dev/null +++ b/docs/数据库设计图.md @@ -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. 扩展性设计 +- 预留扩展字段支持功能升级 +- 模块化表结构便于维护 +- 标准化命名规范提升可读性 + +这个数据库设计充分考虑了抽奖盲盒系统的业务复杂性,在保证数据完整性的同时,也为系统的高性能和可扩展性提供了良好的基础。 \ No newline at end of file diff --git a/docs/系统架构图.md b/docs/系统架构图.md new file mode 100644 index 00000000..9a05e5de --- /dev/null +++ b/docs/系统架构图.md @@ -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. 可维护性 +- 清晰的分层架构 +- 标准化的开发规范 +- 完善的日志和监控体系 + +这个架构设计充分考虑了抽奖盲盒系统的业务特点,在保证系统稳定性和性能的同时,也为未来的功能扩展预留了空间。 \ No newline at end of file