diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..1c78ea81 --- /dev/null +++ b/.gitignore @@ -0,0 +1,280 @@ +# 操作系统生成的文件 +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# IDE和编辑器文件 +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# 日志文件 +*.log +logs/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# 依赖目录 +node_modules/ +vendor/ + +# 构建输出目录 +dist/ +build/ +out/ + +# 环境配置文件 +# .env.local +# .env.development.local +# .env.test.local +# .env.production.local + +# PHP相关 +# server/php/.env +server/php/runtime/ +server/php/vendor/ +server/php/composer.lock + +# 缓存文件 +*.cache +.cache/ + +# 临时文件 +tmp/ +temp/ +*.tmp + +# 备份文件 +*.bak +*.backup +*.old + +# 压缩文件 +*.zip +*.rar +*.7z +*.tar.gz + +# 数据库文件 +*.sqlite +*.db + +# 上传文件目录 +uploads/ +upload/ + +# 小程序相关 +honey_box/unpackage/ +honey_box/node_modules/ + +# HBuilderX相关 +.hbuilderx/ + +# 微信开发者工具相关 +project.config.json +project.private.config.json + +# 图片和媒体文件(可选,根据需要调整) +# *.jpg +# *.jpeg +# *.png +# *.gif +# *.mp4 +# *.mp3 + +# 文档生成的临时文件 +*.pdf +*.docx + +# 测试覆盖率报告 +coverage/ +.nyc_output/ + +# 包管理器锁定文件(可选) +# package-lock.json +# yarn.lock + +# 本地配置文件 +config.local.js +config.local.php + +# 错误报告 +error_log +php_errors.log + +# 系统文件 +*.pid +*.seed +*.pid.lock + +# 运行时文件 +pids/ +*.pid +*.seed +*.pid.lock + +# 覆盖率目录 +lib-cov/ + +# nyc测试覆盖率 +.nyc_output + +# Grunt中间存储 +.grunt + +# Bower依赖目录 +bower_components + +# node-waf配置 +.lock-wscript + +# 编译的二进制插件 +build/Release + +# 依赖目录 +jspm_packages/ + +# TypeScript v1声明文件 +typings/ + +# 可选的npm缓存目录 +.npm + +# 可选的eslint缓存 +.eslintcache + +# Microbundle缓存 +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# 可选的REPL历史 +.node_repl_history + +# yarn完整性文件 +.yarn-integrity + +# dotenv环境变量文件 +.env.test + +# parcel-bundler缓存 +.parcel-cache + +# Next.js构建输出 +.next + +# Nuxt.js构建/生成输出 +.nuxt +dist + +# Gatsby文件 +.cache/ +public + +# Storybook构建输出 +.out +.storybook-out + +# Temporary folders +tmp/ +temp/ + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +# .env +.env.test +.env.production + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* \ No newline at end of file diff --git a/docs/README.md b/README.md similarity index 58% rename from docs/README.md rename to README.md index 92966e67..24cdd060 100644 --- a/docs/README.md +++ b/README.md @@ -1,10 +1,10 @@ -# 抽奖盲盒系统文档 +# 抽奖盲盒系统 -欢迎来到抽奖盲盒系统的技术文档中心!本文档集合包含了系统的完整技术资料,帮助开发者、运维人员和产品经理全面了解系统架构和业务流程。 +欢迎来到抽奖盲盒系统!这是一个基于 **UniApp + ThinkPHP 6.0** 架构开发的**跨平台抽奖盲盒系统**,主要面向娱乐抽奖和商品销售场景。 ## 📚 文档目录 -### 🎯 [业务流程图](./业务流程图.md) +### 🎯 [业务流程图](./docs/业务流程图.md) 详细展示了系统的核心业务流程,包括: - 系统整体业务流程 - 用户注册登录流程 @@ -15,10 +15,11 @@ - 集市交易流程 - 数据统计分析流程 -### 🏗️ [系统架构图](./系统架构图.md) +### 🏗️ [系统架构图](./docs/系统架构图.md) 全面介绍了系统的技术架构设计,包括: - 系统整体架构 -- 应用模块架构 +- 前后端架构设计 +- 小程序技术架构 - 抽奖算法架构 - 支付系统架构 - 缓存架构设计 @@ -26,7 +27,7 @@ - 安全架构设计 - 监控运维架构 -### 🗄️ [数据库设计图](./数据库设计图.md) +### 🗄️ [数据库设计图](./docs/数据库设计图.md) 完整的数据库设计文档,包含: - 数据库整体ER图 - 核心业务表关系图 @@ -37,52 +38,83 @@ - 数据库分表策略 - 数据备份与恢复策略 -### 🔌 [API接口文档](./API接口文档.md) +### 🔌 [API接口文档](./docs/API接口文档.md) 详细的API接口说明文档,包括: - 用户认证接口 - 商品相关接口 - 订单相关接口 - 抽奖相关接口 -- 集市相关接口 +- 盒柜相关接口 - 财务相关接口 -- 发货相关接口 +- 福利相关接口 - 系统配置接口 -- 错误码说明 -- 接口调用示例 +- UniApp调用示例 ## 🎮 系统概述 -### 项目简介 -这是一个基于 **ThinkPHP 6.0** 框架开发的**抽奖盲盒系统**,主要面向娱乐抽奖和商品销售场景。系统采用前后端分离架构,支持多种抽奖模式和支付方式。 +### 项目结构 +``` +抽奖盲盒系统/ +├── honey_box/ # 前端小程序项目(UniApp) +│ ├── pages/ # 页面文件 +│ ├── components/ # 组件库 +│ ├── common/ # 公共模块 +│ └── static/ # 静态资源 +├── server/php/ # 后端API项目(ThinkPHP 6.0) +│ ├── app/ # 应用目录 +│ ├── config/ # 配置文件 +│ └── public/ # 入口文件 +└── docs/ # 项目文档 +``` ### 核心特性 - 🎲 **多样化抽奖模式**:支持一番赏、无限赏、擂台赏、抽卡机等9种抽奖类型 +- 📱 **跨平台支持**:一套代码支持微信小程序、H5、Android、iOS多端运行 - 💰 **灵活支付系统**:支持微信支付、支付宝、余额、虚拟货币等多种支付方式 - 🎁 **智能奖品管理**:支持普通奖品、宝箱奖品、特殊奖品等多种类型 - 🛒 **完整交易流程**:从下单到收货的完整闭环,支持发货、回收、集市交易 - 📊 **数据分析系统**:全方位的用户行为分析和销售数据统计 - 🔒 **安全防护机制**:多层安全防护,完善的权限控制体系 +- ⚡ **高性能算法**:优化的抽奖算法,内存占用减少90%+ ### 技术栈 -- **后端框架**:ThinkPHP 6.0 +**前端技术栈:** +- **框架**:UniApp + Vue.js 2.x +- **构建工具**:HBuilderX +- **UI组件**:uni-ui + 自定义组件 +- **状态管理**:全局配置管理 + 本地存储 +- **网络请求**:封装RequestManager +- **多端支持**:微信小程序、H5、Android、iOS + +**后端技术栈:** +- **框架**:ThinkPHP 6.0 - **数据库**:MySQL 5.7+ - **缓存**:Redis - **PHP版本**:7.1+ (兼容 PHP 8.0) - **依赖管理**:Composer +- **文件存储**:腾讯云COS ## 🚀 快速开始 ### 环境要求 +**前端环境:** +- HBuilderX 3.0+ +- Node.js 12+ +- 微信开发者工具(小程序开发) + +**后端环境:** - PHP 7.1+ - MySQL 5.7+ - Redis 3.0+ - Composer ### 安装步骤 + +#### 后端安装 1. **克隆项目** ```bash git clone [项目地址] - cd lottery-system + cd lottery-system/server/php ``` 2. **安装依赖** @@ -106,17 +138,35 @@ php think run ``` +#### 前端安装 +1. **打开项目** + - 使用HBuilderX打开 `honey_box` 目录 + +2. **配置环境** + - 修改 `common/env.js` 中的API地址 + - 配置小程序AppID(manifest.json) + +3. **运行项目** + - 选择运行到微信小程序开发者工具 + - 或运行到浏览器(H5版本) + ### 配置说明 -主要配置文件位于 `config/` 目录下: +**后端配置文件位于 `server/php/config/` 目录下:** - `database.php` - 数据库配置 - `app.php` - 应用配置 - `cache.php` - 缓存配置 - `route.php` - 路由配置 +**前端配置文件位于 `honey_box/common/` 目录下:** +- `env.js` - 环境配置(API地址、图片地址等) +- `config.js` - 全局配置管理 +- `request.js` - 网络请求配置 + ## 📋 业务模块 ### 用户系统 - 手机号注册登录 +- 微信授权登录 - 用户信息管理 - 等级体系 - 推荐机制 @@ -153,6 +203,23 @@ ## 🔧 开发指南 ### 代码结构 +**前端结构(honey_box/):** +``` +honey_box/ +├── pages/ # 页面文件 +│ ├── shouye/ # 首页模块 +│ ├── user/ # 用户中心 +│ ├── mall/ # 商城模块 +│ ├── infinite/ # 福利模块 +│ └── hegui/ # 盒柜模块 +├── components/ # 组件库 +├── common/ # 公共模块 +├── static/ # 静态资源 +├── uni_modules/ # uni-app插件 +└── package/ # 分包模块 +``` + +**后端结构(server/php/):** ``` server/php/ ├── app/ # 应用目录 @@ -169,19 +236,20 @@ server/php/ ``` ### 开发规范 +**前端开发规范:** +- 遵循Vue.js开发规范 +- 使用UniApp官方组件和API +- 组件命名采用kebab-case +- 页面路由统一管理 +- 网络请求统一封装 + +**后端开发规范:** - 遵循 PSR-4 自动加载规范 - 使用 ThinkPHP 6.0 开发规范 - 数据库操作使用 ORM - 接口返回统一 JSON 格式 - 完善的异常处理机制 -### 扩展开发 -系统采用模块化设计,支持功能扩展: -- 新增抽奖类型 -- 自定义支付方式 -- 扩展奖品类型 -- 增加数据分析维度 - ## 🛡️ 安全特性 ### 数据安全 @@ -197,7 +265,7 @@ server/php/ - 操作审计 ### 系统安全 -- JWT认证 +- Token认证 - 权限控制 - 访问日志 - 安全配置 @@ -262,22 +330,9 @@ server/php/ - 包含复现步骤 - 提供环境信息 -## 📞 技术支持 - -### 联系方式 -- 技术交流群:[群号] -- 邮箱:[邮箱地址] -- 官网:[官网地址] - -### 常见问题 -- 查看 FAQ 文档 -- 搜索历史 Issue -- 参考技术文档 -- 联系技术支持 - ## 📄 许可证 -本项目采用 [Apache 2.0](../LICENSE) 许可证。 +本项目采用 [Apache 2.0](./LICENSE) 许可证。 --- diff --git a/docs/API接口文档.md b/docs/API接口文档.md index d911a0d8..0d0f923c 100644 --- a/docs/API接口文档.md +++ b/docs/API接口文档.md @@ -3,16 +3,17 @@ ## 1. 接口概览 ### 基础信息 -- **基础URL**: `https://api.example.com` +- **基础URL**: `https://api.zfunbox.cn/api/` - **API版本**: `v1` - **数据格式**: `JSON` - **字符编码**: `UTF-8` -- **认证方式**: `JWT Token` +- **认证方式**: `Token认证` +- **签名方式**: `MD5签名 + 时间戳防重放` ### 通用响应格式 ```json { - "code": 200, + "status": 1, "msg": "success", "data": {}, "timestamp": 1640995200 @@ -22,25 +23,35 @@ ### 状态码说明 | 状态码 | 说明 | |--------|------| -| 200 | 请求成功 | -| 400 | 请求参数错误 | -| 401 | 未授权访问 | -| 403 | 权限不足 | -| 404 | 资源不存在 | -| 500 | 服务器内部错误 | +| 1 | 请求成功 | +| 0 | 请求失败 | +| -1 | 未登录 | +| -9 | 需要绑定手机号 | +| 2222 | 特殊状态(如已领取等) | + +### 请求签名机制 +所有POST请求都需要包含以下参数: +- `timestamp`: 当前时间戳 +- `nonce`: 随机字符串 +- `sign`: MD5签名 + +签名算法: +1. 将所有参数按键名排序 +2. 拼接为 `key1=value1&key2=value2` 格式 +3. 添加密钥:`host + timestamp` +4. 对整个字符串进行MD5加密 ## 2. 用户认证接口 -### 2.1 发送验证码 +### 2.1 发送短信验证码 ```http -POST /api/user/sendCode +POST /v2/account/sendSms ``` **请求参数:** ```json { - "phone": "13800138000", - "type": 1 + "phone": "13800138000" } ``` @@ -48,137 +59,149 @@ POST /api/user/sendCode | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | phone | string | 是 | 手机号 | -| type | int | 是 | 类型:1-登录注册 | **响应示例:** ```json { - "code": 200, + "status": 1, "msg": "验证码发送成功", - "data": { - "expire_time": 300 - } + "data": 60 } ``` -### 2.2 用户登录/注册 +### 2.2 手机号登录 ```http -POST /api/user/login +POST /mobileLogin ``` **请求参数:** ```json { - "phone": "13800138000", + "mobile": "13800138000", "code": "123456", - "openid": "wx_openid_123" + "pid": "" +} +``` + +**参数说明:** +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| mobile | string | 是 | 手机号 | +| code | string | 是 | 验证码 | +| pid | string | 否 | 推荐人ID | + +**响应示例:** +```json +{ + "status": 1, + "msg": "登录成功", + "data": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..." +} +``` + +### 2.3 微信授权登录 +```http +POST /login +``` + +**请求参数:** +```json +{ + "code": "wx_auth_code", + "nickname": "用户昵称", + "avatar": "头像URL" } ``` **响应示例:** ```json { - "code": 200, + "status": 1, "msg": "登录成功", + "data": "token_string" +} +``` + +### 2.4 获取用户信息 +```http +POST /user +``` + +**请求头:** +``` +token: {user_token} +``` + +**响应示例:** +```json +{ + "status": 1, + "msg": "success", "data": { - "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", - "user_info": { + "userinfo": { "id": 1001, - "phone": "13800138000", + "phone": "138****8000", "nickname": "用户昵称", "avatar": "头像URL", "money": "100.00", "integral": "50.00", - "level": 1 + "money2": "20.00", + "level": 1, + "mobile_is": 1 } } } ``` -### 2.3 获取用户信息 +### 2.5 注销账号 ```http -GET /api/user/info -``` - -**请求头:** -``` -Authorization: Bearer {token} +POST /user_log_off ``` **响应示例:** ```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 - } + "status": 1, + "msg": "注销成功" } ``` ## 3. 商品相关接口 -### 3.1 获取商品分类 +### 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 +POST /goods ``` **请求参数:** +```json +{ + "page": 1, + "type": 0, + "keyword": "" +} +``` + +**参数说明:** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| -| category_id | int | 否 | 分类ID | -| type | int | 否 | 商品类型 | -| page | int | 否 | 页码,默认1 | -| limit | int | 否 | 每页数量,默认20 | +| page | int | 是 | 页码,从1开始 | +| type | int | 否 | 商品类型:0-全部,1-一番赏,2-无限赏等 | | keyword | string | 否 | 搜索关键词 | **响应示例:** ```json { - "code": 200, + "status": 1, "msg": "success", "data": { - "list": [ + "data": [ { "id": 1001, "title": "精美手办盲盒", "imgurl": "商品图片URL", "price": "29.90", "type": 1, - "type_name": "一番赏", "stock": 100, "sale_stock": 50, "status": 1, @@ -187,35 +210,43 @@ GET /api/goods/list } ], "total": 100, - "page": 1, - "limit": 20 + "current_page": 1, + "last_page": 10 } } ``` -### 3.3 获取商品详情 +### 3.2 获取商品详情(一番赏) ```http -GET /api/goods/detail/{id} +POST /goodsdetail +``` + +**请求参数:** +```json +{ + "goods_id": 1001, + "num": 0 +} ``` **响应示例:** ```json { - "code": 200, + "status": 1, "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": [ + "goods": { + "id": 1001, + "title": "精美手办盲盒", + "imgurl": "商品封面图", + "imgurl_detail": "商品详情图", + "price": "29.90", + "type": 1, + "stock": 100, + "prize_num": 1, + "goods_describe": "商品描述" + }, + "goods_list": [ { "id": 2001, "title": "限定手办A", @@ -231,44 +262,88 @@ GET /api/goods/detail/{id} } ``` -### 3.4 获取商品奖品列表 +### 3.3 获取无限赏商品详情 ```http -GET /api/goods/prizeList/{goods_id} +POST /infinite_goodsdetail ``` **请求参数:** -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| num | int | 否 | 第几套,默认0 | +```json +{ + "goods_id": 1001 +} +``` **响应示例:** ```json { - "code": 200, + "status": 1, "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 - } - ] + "data": { + "goods": { + "id": 1001, + "title": "无限赏盲盒", + "imgurl": "商品图片", + "price": "19.90", + "type": 2, + "lingzhu_is": 1, + "king_user_id": 1234 + }, + "goods_list": [ + { + "id": 2001, + "title": "稀有奖品", + "imgurl": "奖品图片", + "price": "199.00", + "real_pro": "0.01000" + } + ] + } +} +``` + +### 3.4 获取商品奖品数量统计 +```http +POST /goodslist_count +``` + +**请求参数:** +```json +{ + "goods_id": 1001 +} +``` + +### 3.5 获取商品奖品内容 +```http +POST /goodslist_content +``` + +**请求参数:** +```json +{ + "goods_id": 1001, + "num": 0 +} +``` + +### 3.6 获取预售日历 +```http +POST /yushourili +``` + +**请求参数:** +```json +{ + "page": 1 } ``` ## 4. 订单相关接口 -### 4.1 创建订单 +### 4.1 计算订单金额(一番赏) ```http -POST /api/order/create +POST /ordermoney ``` **请求参数:** @@ -277,10 +352,10 @@ POST /api/order/create "goods_id": 1001, "num": 0, "prize_num": 1, - "coupon_id": 0, - "use_money": "0.00", - "use_integral": "0.00", - "use_draw": 0 + "coupon_id": "", + "use_money_is": 2, + "use_integral_is": 2, + "use_money2_is": 2 } ``` @@ -290,56 +365,61 @@ POST /api/order/create | goods_id | int | 是 | 商品ID | | num | int | 是 | 第几套 | | prize_num | int | 是 | 抽奖数量 | -| coupon_id | int | 否 | 优惠券ID | -| use_money | decimal | 否 | 使用余额 | -| use_integral | decimal | 否 | 使用积分 | -| use_draw | int | 否 | 使用抽奖券 | +| coupon_id | string | 否 | 优惠券ID | +| use_money_is | int | 否 | 是否使用余额:1-是,2-否 | +| use_integral_is | int | 否 | 是否使用积分:1-是,2-否 | +| use_money2_is | int | 否 | 是否使用哈尼券:1-是,2-否 | **响应示例:** ```json { - "code": 200, - "msg": "订单创建成功", + "status": 1, + "msg": "success", "data": { - "order_id": 10001, - "order_num": "202401010001", "order_total": "29.90", "price": "29.90", "goods_info": { "id": 1001, "title": "精美手办盲盒", "imgurl": "商品图片" + }, + "goodsExtend": { + "pay_wechat": 1, + "pay_balance": 1, + "pay_currency": 1, + "pay_currency2": 1 } } } ``` -### 4.2 获取支付参数 +### 4.2 创建订单并支付(一番赏) ```http -POST /api/order/pay +POST /orderbuy ``` **请求参数:** ```json { - "order_id": 10001, - "pay_type": 1 + "goods_id": 1001, + "num": 0, + "prize_num": 1, + "coupon_id": "", + "use_money_is": 2, + "use_integral_is": 2, + "use_money2_is": 2 } ``` -**参数说明:** -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| order_id | int | 是 | 订单ID | -| pay_type | int | 是 | 支付方式:1-微信,2-支付宝 | - **响应示例:** ```json { - "code": 200, + "status": 1, "msg": "success", "data": { - "pay_params": { + "status": 1, + "order_num": "202401010001", + "res": { "appId": "wx123456789", "timeStamp": "1640995200", "nonceStr": "abc123", @@ -351,25 +431,77 @@ POST /api/order/pay } ``` -### 4.3 获取订单列表 +### 4.3 无限赏订单金额计算 ```http -GET /api/order/list +POST /infinite_ordermoney ``` **请求参数:** -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| status | int | 否 | 订单状态:0-未支付,1-已支付 | -| page | int | 否 | 页码 | -| limit | int | 否 | 每页数量 | +```json +{ + "goods_id": 1001, + "prize_num": 1, + "use_money_is": 2, + "use_integral_is": 2, + "use_money2_is": 2, + "coupon_id": "" +} +``` + +### 4.4 无限赏创建订单 +```http +POST /infinite_orderbuy +``` + +**请求参数:** +```json +{ + "goods_id": 1001, + "prize_num": 1, + "use_money_is": 2, + "use_integral_is": 2, + "use_money2_is": 2, + "coupon_id": "" +} +``` + +### 4.5 商城订单金额计算 +```http +POST /mall_ordermoney +``` + +**请求参数:** +```json +{ + "goods_id": 1001, + "prize_num": 1, + "goods_num": 1, + "use_money_is": 2, + "use_integral_is": 2, + "use_money2_is": 2 +} +``` + +### 4.6 获取订单列表 +```http +POST /order_list +``` + +**请求参数:** +```json +{ + "page": 1, + "page_size": 20 +} +``` **响应示例:** ```json { - "code": 200, + "status": 1, "msg": "success", "data": { - "list": [ + "data": [ { "id": 10001, "order_num": "202401010001", @@ -384,185 +516,270 @@ GET /api/order/list } ], "total": 50, - "page": 1, - "limit": 20 + "current_page": 1, + "last_page": 3 } } ``` +### 4.7 获取订单详情 +```http +POST /order_detail +``` + +**请求参数:** +```json +{ + "order_num": "202401010001" +} +``` + ## 5. 抽奖相关接口 -### 5.1 获取中奖记录 +### 5.1 获取抽奖结果(一番赏) ```http -GET /api/prize/list +POST /prizeorderlog ``` **请求参数:** -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| status | int | 否 | 状态:0-待选择,1-回收,2-发货,3-集市 | -| page | int | 否 | 页码 | -| limit | int | 否 | 每页数量 | +```json +{ + "order_num": "202401010001" +} +``` **响应示例:** ```json { - "code": 200, + "status": 1, "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 - } + "data": [ + { + "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 + } + ] } ``` -### 5.2 选择奖品处理方式 +### 5.2 获取无限赏抽奖结果 ```http -POST /api/prize/choose +POST /infinite_prizeorderlog ``` **请求参数:** ```json { - "order_list_ids": [20001, 20002], - "type": 1 + "order_num": "202401010001" +} +``` + +### 5.3 获取中奖记录 +```http +POST /shang_log +``` + +**请求参数:** +```json +{ + "goods_id": 1001, + "num": 0, + "page": 1 +} +``` + +**响应示例:** +```json +{ + "status": 1, + "msg": "success", + "data": { + "data": [ + { + "user_nickname": "用户***", + "goodslist_title": "限定手办A", + "addtime": "2024-01-01 10:30:00", + "luck_no": 1 + } + ] + } +} +``` + +### 5.4 获取无限赏中奖记录 +```http +POST /infinite_shang_log +``` + +**请求参数:** +```json +{ + "goods_id": 1001, + "page": 1 +} +``` + +### 5.5 获取每日抽奖记录 +```http +POST /infinite_prizerecords +``` + +**请求参数:** +```json +{ + "goods_id": 1001 +} +``` + +### 5.6 使用道具卡抽奖 +```http +POST /item_card_chou +``` + +**请求参数:** +```json +{ + "goods_id": 1001, + "item_card_id": 1 +} +``` + +## 6. 盒柜(仓库)相关接口 + +### 6.1 获取仓库首页 +```http +POST /warehouse_index +``` + +**请求参数:** +```json +{ + "page": 1, + "status": 0 } ``` **参数说明:** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| -| order_list_ids | array | 是 | 中奖记录ID数组 | -| type | int | 是 | 处理方式:1-回收,2-发货,3-集市 | +| page | int | 是 | 页码 | +| status | int | 否 | 状态:0-待选择,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, + "status": 1, "msg": "success", "data": { - "list": [ + "data": [ { - "id": 30001, - "order_num": "M202401010001", - "price": "280.00", - "stock": 1, + "id": 20001, + "goodslist_title": "限定手办A", + "goodslist_imgurl": "奖品图片", + "goodslist_price": "299.00", + "goodslist_money": "150.00", "status": 0, - "addtime": 1640995400, - "goods_info": [ - { - "title": "限定手办A", - "imgurl": "奖品图片", - "price": "299.00" - } - ] + "addtime": 1640995300 } - ], - "total": 100, - "page": 1, - "limit": 20 + ] } } ``` -### 6.2 发布集市商品 +### 6.2 回收奖品 ```http -POST /api/market/publish +POST /warehouse_recovery ``` **请求参数:** ```json { - "order_list_ids": [20001], - "price": "280.00" + "order_list_ids": "20001,20002" } ``` -**响应示例:** -```json -{ - "code": 200, - "msg": "发布成功", - "data": { - "market_id": 30001, - "order_num": "M202401010001" - } -} -``` - -### 6.3 购买集市商品 +### 6.3 发货奖品 ```http -POST /api/market/buy +POST /warehouse_send ``` **请求参数:** ```json { - "market_id": 30001, - "pay_type": 1 + "order_list_ids": "20001,20002", + "name": "张三", + "mobile": "13800138000", + "address": "北京市朝阳区xxx街道xxx号", + "message": "请小心轻放" } ``` -**响应示例:** +### 6.4 确认发货 +```http +POST /warehouse_send_confirm +``` + +**请求参数:** ```json { - "code": 200, - "msg": "购买成功", - "data": { - "order_id": 40001, - "pay_params": { - "appId": "wx123456789", - "timeStamp": "1640995200", - "nonceStr": "abc123", - "package": "prepay_id=wx123456789", - "signType": "RSA", - "paySign": "signature" - } - } + "id": 70001 +} +``` + +### 6.5 获取发货记录 +```http +POST /warehouse_send_record +``` + +**请求参数:** +```json +{ + "page": 1 +} +``` + +### 6.6 获取发货记录详情 +```http +POST /warehouse_send_record_detail +``` + +**请求参数:** +```json +{ + "id": 70001 +} +``` + +### 6.7 获取回收记录 +```http +POST /warehouse_recovery_record +``` + +**请求参数:** +```json +{ + "page": 1 +} +``` + +### 6.8 获取物流信息 +```http +POST /warehouse_order_logistics +``` + +**请求参数:** +```json +{ + "id": 70001 } ``` @@ -570,23 +787,30 @@ POST /api/market/buy ### 7.1 获取资金明细 ```http -GET /api/finance/moneyLog +POST /profitMoney ``` **请求参数:** +```json +{ + "page": 1, + "type": 0 +} +``` + +**参数说明:** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| -| type | int | 否 | 类型:1-充值,2-消费,3-回收等 | -| page | int | 否 | 页码 | -| limit | int | 否 | 每页数量 | +| page | int | 是 | 页码 | +| type | int | 否 | 类型:0-全部,1-充值,2-消费,3-回收等 | **响应示例:** ```json { - "code": 200, + "status": 1, "msg": "success", "data": { - "list": [ + "data": [ { "id": 50001, "change_money": "+150.00", @@ -596,177 +820,255 @@ GET /api/finance/moneyLog "content": "回收奖品获得", "addtime": 1640995500 } - ], - "total": 50, - "page": 1, - "limit": 20 + ] } } ``` ### 7.2 获取积分明细 ```http -GET /api/finance/integralLog -``` - -**响应格式同资金明细** - -### 7.3 获取优惠券列表 -```http -GET /api/finance/couponList +POST /profitScore ``` **请求参数:** +```json +{ + "page": 1, + "type": 0 +} +``` + +### 7.3 获取支付明细 +```http +POST /profitPay +``` + +**请求参数:** +```json +{ + "page": 1, + "type": 0 +} +``` + +### 7.4 获取优惠券列表 +```http +POST /coupon_list +``` + +**请求参数:** +```json +{ + "page": 1, + "status": 0 +} +``` + +**参数说明:** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| +| page | int | 是 | 页码 | | status | int | 否 | 状态:0-未使用,1-已使用,2-已过期 | **响应示例:** ```json { - "code": 200, + "status": 1, "msg": "success", - "data": [ - { - "id": 60001, - "title": "新人专享券", - "price": "5.00", - "man_price": "30.00", - "end_time": 1641081600, - "status": 0, - "state": 0 - } - ] + "data": { + "data": [ + { + "id": 60001, + "title": "新人专享券", + "price": "5.00", + "man_price": "30.00", + "end_time": 1641081600, + "status": 0, + "state": 0 + } + ] + } } ``` -## 8. 发货相关接口 - -### 8.1 创建发货订单 +### 7.5 领取优惠券 ```http -POST /api/delivery/create +POST /coupon_ling ``` **请求参数:** ```json { - "order_list_ids": [20001, 20002], - "name": "张三", - "mobile": "13800138000", - "address": "北京市朝阳区xxx街道xxx号", - "message": "请小心轻放" + "coupon_id": 60001 } ``` -**响应示例:** -```json -{ - "code": 200, - "msg": "发货订单创建成功", - "data": { - "send_id": 70001, - "send_num": "S202401010001", - "freight": "10.00", - "total_price": "10.00" - } -} -``` - -### 8.2 获取发货订单列表 +### 7.6 分享优惠券 ```http -GET /api/delivery/list +POST /coupon_share ``` -**响应示例:** +**请求参数:** ```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 - } - ] - } + "coupon_id": 60001 } ``` -### 8.3 获取物流信息 +### 7.7 合成优惠券 ```http -GET /api/delivery/track/{send_id} +POST /coupon_synthesis +``` + +**请求参数:** +```json +{ + "coupon_ids": "60001,60002,60003" +} +``` + +### 7.8 计算优惠券合成 +```http +POST /coupon_ji_suan +``` + +**请求参数:** +```json +{ + "coupon_ids": "60001,60002,60003" +} +``` + +## 8. 福利相关接口 + +### 8.1 获取福利屋列表 +```http +POST /welfare_house_list ``` **响应示例:** ```json { - "code": 200, + "status": 1, "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": "快件已到达中转站" - } - ] - } + "data": [ + { + "id": 1001, + "title": "每日福利", + "imgurl": "福利图片", + "status": 1 + } + ] +} +``` + +### 8.2 获取福利屋详情 +```http +POST /fuliwu_detail +``` + +**请求参数:** +```json +{ + "goods_id": 1001 +} +``` + +### 8.3 获取福利屋参与者 +```http +POST /fuliwu_participants +``` + +**请求参数:** +```json +{ + "goods_id": 1001, + "page": 1 +} +``` + +### 8.4 获取福利屋记录 +```http +POST /fuliwu_records +``` + +**请求参数:** +```json +{ + "goods_id": 1001, + "page": 1 +} +``` + +### 8.5 获取用户福利屋参与记录 +```http +GET /fuliwu_user_records +``` + +### 8.6 获取用户福利屋中奖记录 +```http +GET /fuliwu_user_winning_records +``` + +### 8.7 完成任务 +```http +POST /ling_task +``` + +**请求参数:** +```json +{ + "task_list_id": 1001 } ``` ## 9. 系统配置接口 -### 9.1 获取系统配置 +### 9.1 获取全局配置 ```http -GET /api/system/config +GET /config ``` **响应示例:** ```json { - "code": 200, + "status": 1, "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" + "good_type": [ + { + "value": 1, + "name": "一番赏", + "is_show": 1, + "pay_wechat": 1, + "pay_balance": 1 + } + ], + "app_setting": { + "app_name": "友达赏", + "balance_name": "钻石", + "currency1_name": "UU币", + "currency2_name": "哈尼券", + "applet_version": "v1.0.3" + } } } ``` ### 9.2 获取轮播图 ```http -GET /api/system/banner +GET /getAdvert ``` **请求参数:** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| -| type | int | 否 | 类型:1-首页轮播,2-抽卡机轮播 | +| type_id | int | 否 | 类型:1-首页轮播,2-抽卡机轮播 | **响应示例:** ```json { - "code": 200, + "status": 1, "msg": "success", "data": [ { @@ -780,141 +1082,251 @@ GET /api/system/banner } ``` -## 10. 错误码说明 +### 9.3 获取单页内容 +```http +GET /getDanye +``` + +**请求参数:** +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| type | int | 是 | 页面类型:1-服务协议,2-隐私政策,3-公告 | + +**响应示例:** +```json +{ + "status": 1, + "msg": "success", + "data": { + "title": "用户协议", + "content": "协议内容..." + } +} +``` + +### 9.4 获取优惠券中心 +```http +POST /coupon +``` + +**响应示例:** +```json +{ + "status": 1, + "msg": "success", + "data": { + "status": 1, + "goods": { + "list": [ + { + "id": 60001, + "title": "新人券", + "price": "5.00" + } + ] + } + } +} +``` + +### 9.5 领取优惠券 +```http +POST /receive +``` + +**请求参数:** +```json +{ + "coupon_id": "60001,60002" +} +``` + +### 9.6 添加收藏 +```http +POST /addCollect +``` + +**请求参数:** +```json +{ + "goods_id": 1001, + "type": 1, + "num": 0 +} +``` + +## 10. 其他功能接口 + +### 10.1 获取排行榜 +```http +GET /getRankList +``` + +**请求参数:** +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| type | string | 是 | 排行榜类型:invite-邀请榜,consume-消费榜 | + +### 10.2 获取邀请信息 +```http +POST /invitation +``` + +**请求参数:** +```json +{ + "page": 1 +} +``` + +### 10.3 绑定邀请码 +```http +POST /bind_invite_code +``` + +**请求参数:** +```json +{ + "invite_code": "ABC123" +} +``` + +### 10.4 获取VIP列表 +```http +POST /vip_list +``` + +### 10.5 使用兑换码 +```http +POST /used +``` + +**请求参数:** +```json +{ + "code": "EXCHANGE123" +} +``` + +## 11. 错误码说明 | 错误码 | 说明 | |--------|------| -| 10001 | 参数错误 | -| 10002 | 用户不存在 | -| 10003 | 验证码错误 | -| 10004 | 验证码已过期 | -| 20001 | 商品不存在 | -| 20002 | 商品已下架 | -| 20003 | 商品库存不足 | -| 30001 | 订单不存在 | -| 30002 | 订单状态错误 | -| 30003 | 余额不足 | -| 40001 | 支付失败 | -| 40002 | 支付超时 | -| 50001 | 抽奖失败 | -| 50002 | 奖品库存不足 | +| 1 | 请求成功 | +| 0 | 请求失败 | +| -1 | 用户未登录 | +| -9 | 需要绑定手机号 | +| 2222 | 特殊状态(如已领取、已完成等) | -## 11. 接口调用示例 +## 12. UniApp小程序接口调用示例 -### JavaScript示例 +### 12.1 请求封装使用 ```javascript -// 用户登录 -const login = async (phone, code) => { - const response = await fetch('/api/user/login', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' +// 在小程序页面中调用API +export default { + methods: { + // 获取商品列表 + async getGoodsList() { + try { + const res = await this.$request.post('goods', { + page: 1, + type: 0 + }); + + if (res.status === 1) { + this.goodsList = res.data.data; + } else { + this.$c.toast(res.msg); + } + } catch (error) { + console.error('获取商品列表失败:', error); + } }, - 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')}` + + // 创建订单并支付 + async createOrder() { + const res = await this.req({ + url: 'orderbuy', + data: { + goods_id: this.goodsId, + num: 0, + prize_num: 1, + use_money_is: 2, + use_integral_is: 2 + } + }); + + if (res.status === 1 && res.data.status === 1) { + // 调起微信支付 + const payResult = await this.$platform.pay({ + data: res.data.res + }, this); + + if (payResult === 'success') { + // 支付成功,获取抽奖结果 + this.getPrizeResult(res.data.order_num); + } + } }, - 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)); + // 获取抽奖结果 + async getPrizeResult(orderNum) { + const res = await this.$request.post('prizeorderlog', { + order_num: orderNum + }); + + if (res.status === 1) { + // 显示中奖结果 + this.showPrizeResult(res.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 +### 12.2 配置管理使用 +```javascript +// 获取全局配置 +const appName = this.$config.getAppSetting('app_name'); +const balanceName = this.$config.getAppSetting('balance_name'); + +// 获取商品类型配置 +const goodTypes = this.$config.getGoodType(); + +// 检查支付方式 +const goodTypeConfig = this.$config.getGoodTypeFind(1); // 一番赏 +if (goodTypeConfig.pay_wechat === 1) { + // 支持微信支付 +} +``` + +### 12.3 路由跳转使用 +```javascript +// 跳转到商品详情页 +this.$c.to({ + url: '/pages/shouye/detail', + query: { + goods_id: 1001, + num: 0 + } +}); + +// 跳转到用户中心 +this.$customRouter.navigateTo('/pages/user/index'); +``` + +### 12.4 平台适配使用 +```javascript +// 调起支付(自动适配不同平台) +const payResult = await this.$platform.pay({ + data: payParams +}, this); + +// 平台特定功能 +if (this.$platform.code === 'mp-weixin') { + // 微信小程序特有功能 + wx.requestPayment(payParams); +} +``` + +这份更新后的API文档基于小程序中实际使用的接口,包含了完整的请求参数、响应格式和使用示例,更贴近实际开发需求。 \ No newline at end of file diff --git a/docs/系统架构图.md b/docs/系统架构图.md index 9a05e5de..fddd846b 100644 --- a/docs/系统架构图.md +++ b/docs/系统架构图.md @@ -5,54 +5,59 @@ ```mermaid graph TB subgraph "客户端层" - A1[微信小程序] - A2[H5页面] - A3[管理后台] + A1[微信小程序
honey_box] + A2[H5页面
UniApp多端] + A3[管理后台
Web界面] + A4[APP应用
Android/iOS] end subgraph "网关层" B1[Nginx反向代理] B2[负载均衡] + B3[SSL证书] end - subgraph "应用层" - C1[API接口模块] - C2[管理后台模块] - C3[定时任务模块] + subgraph "应用层 - ThinkPHP 6.0" + C1[API接口模块
app/api] + C2[管理后台模块
app/admin] + C3[前台页面模块
app/index] + C4[定时任务模块
app/command] end subgraph "业务服务层" - D1[用户服务] - D2[商品服务] - D3[订单服务] - D4[支付服务] - D5[抽奖服务] - D6[物流服务] - D7[集市服务] + D1[用户服务
登录注册/用户管理] + D2[商品服务
盒子管理/奖品配置] + D3[订单服务
订单处理/支付管理] + D4[抽奖服务
9种抽奖算法] + D5[物流服务
发货/物流跟踪] + D6[集市服务
二手交易] + D7[财务服务
资金流水/优惠券] end subgraph "数据层" - E1[MySQL主库] - E2[MySQL从库] - E3[Redis缓存] - E4[文件存储] + E1[MySQL主库
业务数据] + E2[MySQL从库
读写分离] + E3[Redis缓存
会话/配置缓存] + E4[腾讯云COS
图片/文件存储] end subgraph "外部服务" - F1[微信支付] - F2[支付宝] - F3[短信服务] - F4[物流接口] - F5[腾讯云COS] + F1[微信支付
小程序支付] + F2[支付宝
APP支付] + F3[短信服务
验证码发送] + F4[物流接口
快递查询] + F5[微信开放平台
授权登录] end A1 --> B1 A2 --> B1 A3 --> B1 + A4 --> B1 B1 --> B2 B2 --> C1 B2 --> C2 + B2 --> C3 C1 --> D1 C1 --> D2 @@ -65,10 +70,11 @@ graph TB C2 --> D1 C2 --> D2 C2 --> D3 + C2 --> D7 - C3 --> D1 - C3 --> D2 - C3 --> D3 + C4 --> D1 + C4 --> D2 + C4 --> D3 D1 --> E1 D2 --> E1 @@ -86,76 +92,202 @@ graph TB D2 --> E3 D3 --> E3 D4 --> E3 - D5 --> E3 D2 --> E4 - D6 --> E4 + D5 --> E4 - D4 --> F1 - D4 --> F2 + D3 --> F1 + D3 --> F2 D1 --> F3 - D6 --> F4 - D2 --> F5 + D5 --> F4 + D1 --> F5 ``` -## 2. 应用模块架构 +## 2. 前后端架构设计 ```mermaid graph TD - subgraph "ThinkPHP 6.0 框架" - A[应用入口 public/index.php] + subgraph "前端架构 - UniApp框架" + A[honey_box小程序项目] - subgraph "多应用模式" - B1[admin - 管理后台] - B2[api - 接口服务] - B3[index - 前台页面] + subgraph "页面模块" + B1[pages/shouye - 首页模块] + B2[pages/user - 用户中心] + B3[pages/mall - 商城模块] + B4[pages/infinite - 福利模块] + B5[pages/hegui - 盒柜模块] + B6[pages/other - 其他页面] + end + + subgraph "组件系统" + C1[components/banner - 轮播组件] + C2[components/detail-* - 详情组件] + C3[components/pay-dialog - 支付组件] + C4[components/lucky-canvas - 抽奖组件] + C5[components/prize-wheel - 转盘组件] end subgraph "公共模块" - C1[common/model - 数据模型] - C2[common/service - 业务服务] - C3[common/helper - 工具类] - C4[common/server - 服务类] + D1[common/request.js - 请求管理] + D2[common/config.js - 配置管理] + D3[common/router.js - 路由管理] + D4[common/env.js - 环境配置] + D5[common/platform - 平台适配] end - subgraph "中间件层" - D1[认证中间件] - D2[权限中间件] - D3[日志中间件] - D4[跨域中间件] + subgraph "分包模块" + E1[package/index - 首页分包] + E2[package/mine - 个人中心分包] + end + end + + subgraph "后端架构 - ThinkPHP 6.0" + F[server/php项目] + + subgraph "应用模块" + G1[app/admin - 管理后台] + G2[app/api - API接口] + G3[app/index - 前台页面] + G4[app/command - 定时任务] + end + + subgraph "公共模块" + H1[app/common/model - 数据模型] + H2[app/common/service - 业务服务] + H3[app/common/helper - 工具类] + H4[app/common/server - 服务类] end subgraph "配置管理" - E1[数据库配置] - E2[缓存配置] - E3[路由配置] - E4[应用配置] + I1[config/database.php - 数据库配置] + I2[config/app.php - 应用配置] + I3[config/cache.php - 缓存配置] + I4[config/route.php - 路由配置] end end A --> B1 A --> B2 A --> B3 + A --> B4 + A --> B5 + A --> B6 B1 --> C1 - B1 --> C2 - B2 --> C1 B2 --> C2 - B3 --> C1 - B3 --> C2 + B3 --> C3 + B4 --> C4 + B5 --> C5 - B1 --> D1 - B1 --> D2 - B2 --> D1 - B2 --> D3 + C1 --> D1 + C2 --> D2 + C3 --> D3 + C4 --> D4 + C5 --> D5 - C1 --> E1 - C2 --> E2 - B1 --> E3 - B2 --> E3 + D1 --> G2 + D2 --> G2 + + F --> G1 + F --> G2 + F --> G3 + F --> G4 + + G1 --> H1 + G2 --> H1 + G3 --> H1 + G4 --> H1 + + G1 --> H2 + G2 --> H2 + + H1 --> I1 + H2 --> I2 ``` -## 3. 数据库架构设计 +## 3. 小程序技术架构 + +```mermaid +graph TD + subgraph "UniApp跨平台架构" + A[UniApp框架] + + subgraph "编译目标" + B1[微信小程序
wx683d8a8a499d7ec6] + B2[H5网页版] + B3[Android APP] + B4[iOS APP] + B5[支付宝小程序] + B6[字节跳动小程序] + end + + subgraph "核心依赖" + C1[@lucky-canvas/uni
抽奖转盘组件] + C2[js-md5
MD5加密] + C3[uqrcodejs
二维码生成] + C4[eruda
调试工具] + end + + subgraph "页面路由" + D1[TabBar导航
5个主要页面] + D2[普通页面
50+功能页面] + D3[分包页面
按需加载] + end + + subgraph "状态管理" + E1[全局配置
ConfigManager] + E2[用户状态
Token/UserInfo] + E3[缓存管理
Storage] + E4[环境配置
EnvConfig] + end + end + + subgraph "网络通信" + F1[请求封装
RequestManager] + F2[签名验证
MD5+时间戳] + F3[错误处理
统一异常处理] + F4[缓存策略
5分钟缓存] + end + + subgraph "平台适配" + G1[微信平台
支付/登录/分享] + G2[H5平台
网页支付] + G3[APP平台
原生功能] + G4[其他平台
功能适配] + end + + A --> B1 + A --> B2 + A --> B3 + A --> B4 + A --> B5 + A --> B6 + + A --> C1 + A --> C2 + A --> C3 + A --> C4 + + B1 --> D1 + B2 --> D2 + B3 --> D3 + + D1 --> E1 + D2 --> E2 + D3 --> E3 + + E1 --> F1 + E2 --> F2 + E3 --> F3 + E4 --> F4 + + F1 --> G1 + F2 --> G2 + F3 --> G3 + F4 --> G4 +``` + +## 4. 数据库架构设计 ```mermaid erDiagram @@ -233,7 +365,7 @@ erDiagram } ``` -## 4. 抽奖算法架构 +## 5. 抽奖算法架构 ```mermaid graph TD @@ -283,24 +415,30 @@ graph TD J --> K[返回结果] ``` -## 5. 支付系统架构 +## 6. 支付系统架构 ```mermaid graph TD A[支付请求] --> B[支付路由] B --> C{支付方式} - C --> D1[微信支付] - C --> D2[支付宝支付] - C --> D3[余额支付] - C --> D4[虚拟货币支付] + C --> D1[微信支付
小程序支付] + C --> D2[支付宝支付
APP支付] + C --> D3[余额支付
钻石扣除] + C --> D4[虚拟货币支付
UU币/哈尼券] - subgraph "支付处理" - E1[订单验证] - E2[金额计算] - E3[优惠券处理] - E4[支付执行] - E5[回调处理] + subgraph "支付处理流程" + E1[订单验证
检查订单状态] + E2[金额计算
优惠券抵扣] + E3[支付执行
调用支付接口] + E4[回调处理
异步通知] + E5[状态更新
订单完成] + end + + subgraph "小程序支付集成" + F1[wx.requestPayment
调起支付] + F2[支付参数生成
签名验证] + F3[支付结果处理
成功/失败] end D1 --> E1 @@ -311,48 +449,38 @@ graph TD E1 --> E2 E2 --> E3 E3 --> E4 + E4 --> E5 - E4 --> F{支付结果} - F -->|成功| G[触发抽奖] - F -->|失败| H[订单取消] + D1 --> F1 + F1 --> F2 + F2 --> F3 - subgraph "外部支付" - I1[微信支付API] - I2[支付宝API] - end - - D1 --> I1 - D2 --> I2 - - I1 --> E5 - I2 --> E5 - - E5 --> J[更新订单状态] - J --> G + E5 --> G[触发抽奖算法] + G --> H[生成中奖结果] ``` -## 6. 缓存架构设计 +## 7. 缓存架构设计 ```mermaid graph TD - subgraph "应用层缓存" - A1[用户信息缓存] - A2[商品信息缓存] - A3[配置信息缓存] - A4[热点数据缓存] + subgraph "前端缓存策略" + A1[小程序缓存
uni.setStorageSync] + A2[配置缓存
ConfigManager] + A3[用户信息缓存
Token/UserInfo] + A4[请求缓存
5分钟有效期] end - subgraph "Redis集群" - B1[Redis Master] - B2[Redis Slave 1] - B3[Redis Slave 2] + subgraph "后端Redis集群" + B1[Redis Master
主节点写入] + B2[Redis Slave 1
从节点读取] + B3[Redis Slave 2
从节点读取] end subgraph "缓存策略" - C1[读写分离] - C2[主从同步] - C3[故障转移] - C4[数据持久化] + C1[读写分离
主写从读] + C2[主从同步
实时同步] + C3[故障转移
自动切换] + C4[数据持久化
RDB+AOF] end A1 --> B1 @@ -372,10 +500,10 @@ graph TD C3 --> C4 subgraph "缓存更新策略" - D1[定时更新] - D2[事件触发更新] - D3[LRU淘汰] - D4[TTL过期] + D1[定时更新
配置刷新] + D2[事件触发更新
数据变更] + D3[LRU淘汰
内存管理] + D4[TTL过期
自动清理] end C4 --> D1 @@ -384,29 +512,29 @@ graph TD C4 --> D4 ``` -## 7. 消息队列架构 +## 8. 消息队列架构 ```mermaid graph TD subgraph "消息生产者" - A1[订单服务] - A2[支付服务] - A3[抽奖服务] - A4[物流服务] + A1[订单服务
下单事件] + A2[支付服务
支付回调] + A3[抽奖服务
中奖结果] + A4[物流服务
发货状态] end subgraph "消息队列" - B1[支付成功队列] - B2[抽奖结果队列] - B3[发货通知队列] - B4[数据统计队列] + B1[支付成功队列
触发抽奖] + B2[抽奖结果队列
推送通知] + B3[发货通知队列
物流更新] + B4[数据统计队列
业务分析] end subgraph "消息消费者" - C1[抽奖处理器] - C2[通知处理器] - C3[统计处理器] - C4[日志处理器] + C1[抽奖处理器
执行抽奖算法] + C2[通知处理器
小程序推送] + C3[统计处理器
数据汇总] + C4[日志处理器
操作记录] end A1 --> B1 @@ -421,43 +549,43 @@ graph TD B3 --> C2 B4 --> C3 - C1 --> D1[执行抽奖] - C2 --> D2[发送通知] - C3 --> D3[更新统计] - C4 --> D4[记录日志] + C1 --> D1[执行抽奖
生成中奖记录] + C2 --> D2[发送通知
微信模板消息] + C3 --> D3[更新统计
实时数据] + C4 --> D4[记录日志
审计追踪] ``` -## 8. 安全架构设计 +## 9. 安全架构设计 ```mermaid graph TD subgraph "网络安全" - A1[HTTPS加密] - A2[防火墙] - A3[DDoS防护] - A4[IP白名单] + A1[HTTPS加密
SSL证书] + A2[防火墙
端口控制] + A3[DDoS防护
流量清洗] + A4[IP白名单
访问控制] end subgraph "应用安全" - B1[JWT认证] - B2[权限控制] - B3[参数验证] - B4[SQL注入防护] - B5[XSS防护] + B1[JWT认证
Token验证] + B2[权限控制
RBAC模型] + B3[参数验证
输入过滤] + B4[SQL注入防护
ORM框架] + B5[XSS防护
输出转义] end subgraph "数据安全" - C1[数据加密] - C2[敏感信息脱敏] - C3[数据备份] - C4[访问日志] + C1[数据加密
敏感字段加密] + C2[信息脱敏
手机号脱敏] + C3[数据备份
定时备份] + C4[访问日志
操作审计] end subgraph "业务安全" - D1[防刷机制] - D2[风控系统] - D3[异常监控] - D4[操作审计] + D1[防刷机制
频率限制] + D2[风控系统
异常检测] + D3[签名验证
MD5+时间戳] + D4[白名单机制
API访问控制] end A1 --> B1 @@ -477,58 +605,6 @@ graph TD 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. 高可用性 @@ -556,4 +632,93 @@ graph TD - 标准化的开发规范 - 完善的日志和监控体系 -这个架构设计充分考虑了抽奖盲盒系统的业务特点,在保证系统稳定性和性能的同时,也为未来的功能扩展预留了空间。 \ No newline at end of file +这个架构设计充分考虑了抽奖盲盒系统的业务特点,在保证系统稳定性和性能的同时,也为未来的功能扩展预留了空间。 +## 10. 监控运维架构 + +```mermaid +graph TD + subgraph "应用监控" + A1[性能监控
响应时间/吞吐量] + A2[错误监控
异常捕获/错误率] + A3[业务监控
抽奖成功率/支付成功率] + A4[用户行为监控
页面访问/操作路径] + end + + subgraph "系统监控" + B1[服务器监控
CPU/内存/磁盘] + B2[数据库监控
连接数/慢查询] + B3[缓存监控
Redis性能/命中率] + B4[网络监控
带宽/延迟] + end + + subgraph "日志管理" + C1[应用日志
业务操作日志] + C2[访问日志
API调用记录] + 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. 前后端分离架构 +- **前端**:基于UniApp框架的跨平台小程序,支持微信小程序、H5、APP等多端部署 +- **后端**:基于ThinkPHP 6.0的RESTful API服务,提供统一的数据接口 + +### 2. 小程序技术栈 +- **框架**:UniApp + Vue.js 2.x +- **构建工具**:HBuilderX +- **状态管理**:全局配置管理 + 本地存储 +- **网络请求**:封装的RequestManager,支持签名验证和缓存 +- **UI组件**:自定义组件 + uni-ui组件库 + +### 3. 后端技术架构 +- **框架**:ThinkPHP 6.0 +- **数据库**:MySQL 5.7+ 主从架构 +- **缓存**:Redis集群 +- **文件存储**:腾讯云COS +- **队列**:基于Redis的消息队列 + +### 4. 核心业务特性 +- **多端适配**:一套代码支持小程序、H5、APP多端运行 +- **抽奖算法**:9种不同类型的抽奖模式,优化的概率算法 +- **支付集成**:微信支付、支付宝、虚拟货币等多种支付方式 +- **实时通信**:WebSocket推送中奖结果和系统通知 + +### 5. 安全防护 +- **前端安全**:请求签名、参数加密、防重放攻击 +- **后端安全**:JWT认证、权限控制、SQL注入防护 +- **业务安全**:防刷机制、风控系统、操作审计 + +### 6. 性能优化 +- **前端优化**:分包加载、图片懒加载、请求缓存 +- **后端优化**:数据库索引、Redis缓存、CDN加速 +- **算法优化**:抽奖算法内存优化,性能提升90%+ + +这个架构设计充分考虑了抽奖盲盒系统的业务特点和技术需求,在保证系统稳定性和性能的同时,也为未来的功能扩展和多端部署提供了良好的基础。 \ No newline at end of file