mirror of
https://github.com/crmeb/CRMEB.git
synced 2026-10-28 21:40:50 +00:00
Merge branch 'master' of https://gitee.com/ZhongBangKeJi/CRMEB
This commit is contained in:
commit
85fbde26b0
246
.codebuddy/skills/crmeb-complete/README.md
Normal file
246
.codebuddy/skills/crmeb-complete/README.md
Normal file
@ -0,0 +1,246 @@
|
||||
# CRMEB电商系统Skill包
|
||||
|
||||
## 📦 包说明
|
||||
|
||||
这是一个完整的CRMEB开源电商系统开发指南Skill包,旨在帮助开发者快速理解、上手和开发CRMEB项目。
|
||||
|
||||
## 🎯 适用人群
|
||||
|
||||
- **新手开发者**:快速了解CRMEB项目架构和开发流程
|
||||
- **后端开发者**:学习ThinkPHP 6后端开发规范
|
||||
- **前端开发者**:学习管理端和移动端开发
|
||||
- **全栈开发者**:掌握完整的电商系统开发
|
||||
- **项目经理**:了解项目结构和技术栈
|
||||
|
||||
## 📚 包含内容
|
||||
|
||||
### 主文档
|
||||
|
||||
- **[SKILL.md](./SKILL.md)** - 主Skill文件,项目概览和快速参考
|
||||
- 项目概述和架构
|
||||
- 目录结构详解
|
||||
- 核心业务模块介绍
|
||||
- 开发规范和最佳实践
|
||||
- 常用命令速查
|
||||
- 环境配置指南
|
||||
|
||||
### 参考文档
|
||||
|
||||
- **[references/quick_start.md](./references/quick_start.md)** - 快速开始指南
|
||||
- Docker一键部署
|
||||
- 手动安装步骤
|
||||
- 环境配置详解
|
||||
- 常见问题排查
|
||||
|
||||
- **[references/api_flow.md](./references/api_flow.md)** - API请求流程详解
|
||||
- API生命周期
|
||||
- 请求处理流程
|
||||
- 统一响应格式
|
||||
- 认证与授权
|
||||
- 参数验证
|
||||
- 错误处理
|
||||
- 性能优化
|
||||
|
||||
- **[references/code_style.md](./references/code_style.md)** - 代码规范
|
||||
- 命名规范
|
||||
- 代码分层规范
|
||||
- 控制器层规范
|
||||
- 服务层规范
|
||||
- DAO层规范
|
||||
- 模型层规范
|
||||
- 注释规范
|
||||
|
||||
- **[references/db_design.md](./references/db_design.md)** - 数据库设计规范
|
||||
- 表命名规范
|
||||
- 字段命名规范
|
||||
- 索引设计
|
||||
- 关联关系设计
|
||||
- 数据迁移
|
||||
|
||||
- **[references/system_config.md](./references/system_config.md)** - 系统配置详解
|
||||
- 应用配置
|
||||
- 数据库配置
|
||||
- Redis配置
|
||||
- 队列配置
|
||||
- Workerman配置
|
||||
- 第三方服务配置
|
||||
|
||||
- **[references/mcp_integration.md](./references/mcp_integration.md)** - MCP接口集成
|
||||
- MCP接口说明
|
||||
- 调用方式
|
||||
- 示例代码
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 方式一:使用Docker(推荐)
|
||||
|
||||
```bash
|
||||
# 1. 克隆项目
|
||||
git clone https://gitee.com/ZhongBangKeJi/CRMEB.git
|
||||
cd CRMEB
|
||||
|
||||
# 2. 启动服务
|
||||
docker-compose up -d
|
||||
|
||||
# 3. 访问系统
|
||||
# 后台:http://localhost:8011/admin (admin/crmeb.com)
|
||||
# 前台:http://localhost:8011
|
||||
```
|
||||
|
||||
详细步骤请查看:[references/quick_start.md](./references/quick_start.md)
|
||||
|
||||
### 方式二:手动安装
|
||||
|
||||
```bash
|
||||
# 1. 克隆项目
|
||||
git clone https://gitee.com/ZhongBangKeJi/CRMEB.git
|
||||
cd CRMEB
|
||||
|
||||
# 2. 安装依赖
|
||||
cd crmeb && composer install
|
||||
cd ../template/admin && npm install
|
||||
cd ../uni-app && npm install
|
||||
|
||||
# 3. 配置环境
|
||||
cp crmeb/.env.example crmeb/.env
|
||||
# 编辑.env文件,配置数据库和Redis
|
||||
|
||||
# 4. 导入数据库
|
||||
mysql -u root -p crmeb < database.sql
|
||||
|
||||
# 5. 启动服务
|
||||
# 后端:配置Nginx/Apache,指向crmeb/public
|
||||
# 队列:php think queue:listen --queue
|
||||
# 前端:npm run dev/build
|
||||
```
|
||||
|
||||
详细步骤请查看:[references/quick_start.md](./references/quick_start.md)
|
||||
|
||||
## 📖 学习路径
|
||||
|
||||
### 阶段一:项目了解(10分钟)
|
||||
|
||||
1. 阅读 [SKILL.md](./SKILL.md) 的"项目概述"章节
|
||||
2. 了解技术架构和核心特点
|
||||
3. 查看目录结构
|
||||
4. 熟悉核心业务流程
|
||||
|
||||
### 阶段二:环境搭建(30分钟)
|
||||
|
||||
1. 按照 [references/quick_start.md](./references/quick_start.md) 部署项目
|
||||
2. 熟悉后台管理功能
|
||||
3. 体验前端商城流程
|
||||
4. 验证各项功能是否正常
|
||||
|
||||
### 阶段三:后端开发(2-3小时)
|
||||
|
||||
1. 阅读 [SKILL.md](./SKILL.md) 的"核心业务模块"章节
|
||||
2. 查看 [references/api_flow.md](./references/api_flow.md) 了解API开发
|
||||
3. 学习代码分层规范:[references/code_style.md](./references/code_style.md)
|
||||
4. 尝试使用代码生成器创建CRUD
|
||||
5. 开发一个简单的功能模块
|
||||
|
||||
### 阶段四:前端开发(管理端)
|
||||
|
||||
1. 阅读管理端前端文档
|
||||
2. 了解Vue 2.x + Element UI开发
|
||||
3. 学习API调用方式
|
||||
4. 开发一个管理端页面
|
||||
|
||||
### 阶段五:移动端开发
|
||||
|
||||
1. 阅读UniApp开发文档
|
||||
2. 了解跨端开发特性
|
||||
3. 学习移动端API调用
|
||||
4. 开发或修改一个页面
|
||||
|
||||
### 阶段六:高级特性
|
||||
|
||||
1. 学习队列使用
|
||||
2. 了解定时任务
|
||||
3. 掌握WebSocket实时通信
|
||||
4. 阅读MCP接口文档
|
||||
5. 优化系统性能
|
||||
|
||||
## 🔧 开发工具
|
||||
|
||||
### 后端开发
|
||||
- **IDE**: PhpStorm / VS Code
|
||||
- **API测试**: Postman / Apifox
|
||||
- **数据库**: Navicat / phpMyAdmin
|
||||
- **Redis**: Redis Desktop Manager
|
||||
|
||||
### 前端开发
|
||||
- **IDE**: VS Code / WebStorm
|
||||
- **浏览器**: Chrome(推荐)
|
||||
- **调试工具**: Vue DevTools
|
||||
|
||||
### 移动端开发
|
||||
- **IDE**: HBuilderX(官方推荐)
|
||||
- **模拟器**: 微信开发者工具 / 真机调试
|
||||
|
||||
## 📌 开发建议
|
||||
|
||||
### 1. 使用代码生成器
|
||||
|
||||
在后台管理中,使用"代码生成器"可以快速生成CRUD代码,大大提高开发效率。
|
||||
|
||||
### 2. 遵循开发规范
|
||||
|
||||
务必遵循项目开发规范:[references/code_style.md](./references/code_style.md)
|
||||
|
||||
### 3. 使用事件系统
|
||||
|
||||
合理使用系统事件,解耦业务逻辑,提高代码可维护性。
|
||||
|
||||
### 4. 编写注释
|
||||
|
||||
为复杂业务逻辑编写清晰的注释,方便团队协作。
|
||||
|
||||
### 5. 使用队列
|
||||
|
||||
将耗时操作(发送短信、生成海报等)放入队列,提高响应速度。
|
||||
|
||||
### 6. 注意安全性
|
||||
|
||||
- 验证所有用户输入
|
||||
- 使用参数绑定防止SQL注入
|
||||
- 敏感数据加密存储
|
||||
- 严格权限控制
|
||||
|
||||
## 🤝 贡献指南
|
||||
|
||||
如果你在使用过程中发现文档有误或需要补充,欢迎提交PR或Issue。
|
||||
|
||||
**贡献方式:**
|
||||
1. Fork本仓库
|
||||
2. 修改或补充文档
|
||||
3. 提交Pull Request
|
||||
|
||||
## 📞 获取帮助
|
||||
|
||||
- **技术社区**: https://www.crmeb.com/ask/thread/list/147
|
||||
- **官方文档**: https://doc.crmeb.com
|
||||
- **在线客服**: https://www.crmeb.com
|
||||
- **GitHub Issues**: https://gitee.com/ZhongBangKeJi/CRMEB/issues
|
||||
|
||||
## 📝 更新日志
|
||||
|
||||
### v1.0.0 (2025-03-17)
|
||||
- 初始版本发布
|
||||
- 包含项目概览、快速开始、API流程等核心文档
|
||||
- 完整的开发规范和最佳实践
|
||||
|
||||
## 📄 许可证
|
||||
|
||||
本项目基于 [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0) 协议开源。
|
||||
|
||||
## 🙏 致谢
|
||||
|
||||
感谢CRMEB开源社区和所有贡献者。
|
||||
|
||||
---
|
||||
|
||||
**文档版本**: v1.0.0
|
||||
**最后更新**: 2025-03-17
|
||||
**维护者**: CRMEB开源社区
|
||||
585
.codebuddy/skills/crmeb-complete/SKILL.md
Normal file
585
.codebuddy/skills/crmeb-complete/SKILL.md
Normal file
@ -0,0 +1,585 @@
|
||||
---
|
||||
name: CRMEB电商系统完整开发指南
|
||||
description: 完整的CRMEB开源电商系统开发指南,包含后端API、管理端、移动端uniapp的全栈开发说明,帮助开发者快速理解和开发CRMEB项目
|
||||
version: 1.0.0
|
||||
tags: [电商, CRMEB, ThinkPHP, Vue, UniApp, 全栈开发]
|
||||
---
|
||||
|
||||
# CRMEB电商系统完整开发指南
|
||||
|
||||
## 0. 项目概述
|
||||
|
||||
### 0.1 项目简介
|
||||
|
||||
CRMEB是一款高品质的开源电商系统,基于Apache-2.0协议,100%开源免费商用。系统采用前后端分离架构,支持多端覆盖(公众号、小程序、H5、APP、PC),内置20+核心营销模块。
|
||||
|
||||
**核心特点:**
|
||||
- ✅ 100%开源,Apache-2.0协议,无任何隐藏费用
|
||||
- ✅ 前后端分离,ThinkPHP 6 + Vue 2.x + UniApp
|
||||
- ✅ 多端覆盖,数据实时互通
|
||||
- ✅ 20+营销模块(拼团、砍价、秒杀、优惠券、直播等)
|
||||
- ✅ 代码生成器,快速开发增删改查
|
||||
- ✅ 强大的权限管理系统(RBAC)
|
||||
- ✅ 支持队列、定时任务、WebSocket实时通信
|
||||
- ✅ Docker一键部署
|
||||
|
||||
### 0.2 技术架构
|
||||
|
||||
**后端架构:**
|
||||
- **框架**: ThinkPHP 6.x (PHP 7.1-7.4)
|
||||
- **架构模式**: MVC + Service + DAO 分层架构
|
||||
- **数据库**: MySQL 5.7-8.0 (InnoDB引擎)
|
||||
- **缓存**: Redis (可选)
|
||||
- **消息队列**: ThinkPHP Queue + Workerman
|
||||
- **实时通信**: Workerman WebSocket
|
||||
|
||||
**前端架构:**
|
||||
- **管理端**: Vue 2.x + Element UI + Vuex + Vue Router
|
||||
- **移动端**: UniApp + uView UI (支持小程序、H5、APP)
|
||||
- **PC端**: Nuxt.js (Vue SSR)
|
||||
|
||||
**项目地址:**
|
||||
- **官网**: https://www.crmeb.com
|
||||
- **Gitee**: https://gitee.com/ZhongBangKeJi/CRMEB
|
||||
- **在线体验**: http://v5.crmeb.net/admin (账号: demo, 密码: crmeb.com)
|
||||
|
||||
### 0.3 快速开始
|
||||
|
||||
**Docker一键部署:**
|
||||
```bash
|
||||
# 启动服务
|
||||
docker-compose up -d
|
||||
|
||||
# 访问地址
|
||||
# 网站: http://localhost:8011
|
||||
# MySQL: localhost:33061 (root/123456)
|
||||
# Redis: localhost:63791 (123456)
|
||||
```
|
||||
|
||||
**默认账号:**
|
||||
- 后台管理: http://localhost:8011/admin (admin/crmeb.com)
|
||||
- 移动端: http://localhost:8011
|
||||
|
||||
## 1. 目录结构
|
||||
|
||||
### 1.1 后端核心目录 (`/crmeb`)
|
||||
|
||||
```
|
||||
crmeb/
|
||||
├── app/ # 应用目录
|
||||
│ ├── adminapi/ # 后台管理API
|
||||
│ │ ├── controller/ # 控制器层
|
||||
│ │ ├── middleware/ # 中间件
|
||||
│ │ ├── route/ # 路由定义
|
||||
│ │ └── validate/ # 验证器
|
||||
│ ├── api/ # 移动端API
|
||||
│ ├── kefuapi/ # 客服端API
|
||||
│ ├── outapi/ # 外部接口API(MCP)
|
||||
│ ├── dao/ # 数据访问层(180+文件)
|
||||
│ ├── model/ # 数据模型层(150+文件)
|
||||
│ ├── services/ # 业务服务层(230+文件)
|
||||
│ │ ├── user/ # 用户服务
|
||||
│ │ ├── product/ # 商品服务
|
||||
│ │ ├── order/ # 订单服务
|
||||
│ │ ├── activity/ # 营销服务
|
||||
│ │ ├── agent/ # 分销服务
|
||||
│ │ └── system/ # 系统服务
|
||||
│ ├── jobs/ # 队列任务(30+任务)
|
||||
│ ├── listener/ # 事件监听器(20+监听器)
|
||||
│ └── common.php # 公共函数
|
||||
├── crmeb/ # 核心框架目录
|
||||
│ ├── basic/ # 基础类库
|
||||
│ │ ├── BaseController.php
|
||||
│ │ ├── BaseServices.php
|
||||
│ │ ├── BaseDao.php
|
||||
│ │ └── BaseModel.php
|
||||
│ └── ...
|
||||
├── config/ # 配置文件
|
||||
├── public/ # Web入口
|
||||
├── runtime/ # 运行时文件
|
||||
└── .env # 环境配置
|
||||
```
|
||||
|
||||
### 1.2 前端目录
|
||||
|
||||
**管理端 (`/template/admin`):**
|
||||
```
|
||||
template/admin/src/
|
||||
├── api/ # API接口定义
|
||||
├── assets/ # 静态资源
|
||||
├── components/ # 通用组件
|
||||
├── pages/ # 页面组件
|
||||
├── router/ # 路由配置
|
||||
├── store/ # Vuex状态管理
|
||||
└── utils/ # 工具函数
|
||||
```
|
||||
|
||||
**移动端 (`/template/uni-app`):**
|
||||
```
|
||||
template/uni-app/
|
||||
├── pages/ # 页面目录
|
||||
│ ├── index/ # 首页
|
||||
│ ├── goods/ # 商品
|
||||
│ ├── cart/ # 购物车
|
||||
│ ├── order/ # 订单
|
||||
│ └── user/ # 用户中心
|
||||
├── components/ # 组件目录
|
||||
├── static/ # 静态资源
|
||||
├── utils/ # 工具函数
|
||||
└── api/ # API接口
|
||||
```
|
||||
|
||||
## 2. 核心业务模块
|
||||
|
||||
### 2.1 用户模块
|
||||
|
||||
**核心服务:**
|
||||
- `UserServices` - 用户主服务
|
||||
- `LoginServices` - 登录服务
|
||||
- `UserBillServices` - 账单流水
|
||||
- `UserMoneyServices` - 用户余额
|
||||
- `UserLevelServices` - 用户等级
|
||||
|
||||
**数据表:**
|
||||
```sql
|
||||
eb_user # 用户表
|
||||
eb_user_bill # 账单表
|
||||
eb_user_extract # 提现表
|
||||
eb_user_level # 用户等级表
|
||||
```
|
||||
|
||||
**开发要点:**
|
||||
- 支持多种登录方式(账号密码、手机验证码、微信授权)
|
||||
- 余额变动必须记录账单
|
||||
- 支持多级会员等级
|
||||
- 标签分组实现精准营销
|
||||
|
||||
### 2.2 商品模块
|
||||
|
||||
**核心服务:**
|
||||
- `StoreProductServices` - 商品主服务
|
||||
- `StoreCategoryServices` - 商品分类
|
||||
- `StoreProductAttrServices` - 商品属性
|
||||
- `StoreProductReplyServices` - 商品评价
|
||||
|
||||
**数据表:**
|
||||
```sql
|
||||
eb_store_product # 商品表
|
||||
eb_store_category # 分类表
|
||||
eb_store_product_attr # 属性表
|
||||
eb_store_product_reply # 评价表
|
||||
```
|
||||
|
||||
**开发要点:**
|
||||
- 支持多规格SKU,自动计算价格和库存
|
||||
- 商品类型(普通、积分、预售、虚拟)
|
||||
- 多级分类管理
|
||||
- 商品采集(淘宝、京东)
|
||||
|
||||
### 2.3 订单模块
|
||||
|
||||
**核心服务:**
|
||||
- `StoreOrderServices` - 订单主服务
|
||||
- `StoreOrderCreateServices` - 订单创建
|
||||
- `StoreOrderDeliveryServices` - 订单发货
|
||||
- `StoreOrderRefundServices` - 订单退款
|
||||
- `StoreCartServices` - 购物车
|
||||
|
||||
**数据表:**
|
||||
```sql
|
||||
eb_store_order # 订单表
|
||||
eb_store_order_cart # 订单商品表
|
||||
eb_store_order_status # 订单状态记录表
|
||||
eb_store_cart # 购物车表
|
||||
eb_store_refund # 退款表
|
||||
```
|
||||
|
||||
**订单状态流转:**
|
||||
```
|
||||
未支付 (0) → 待发货 (1) → 待收货 (2) → 已完成 (3)
|
||||
↓ ↓
|
||||
已取消 (-1) 退款中 (-2) → 已退款 (-3)
|
||||
```
|
||||
|
||||
**开发要点:**
|
||||
- 下单时扣减库存,取消订单恢复库存
|
||||
- 支持多种支付方式(微信、支付宝、余额)
|
||||
- 定时任务自动取消未支付订单
|
||||
- 定时任务自动确认收货
|
||||
- 订单状态变更触发系统事件
|
||||
|
||||
### 2.4 支付模块
|
||||
|
||||
**核心服务:**
|
||||
- `PayServices` - 支付主服务
|
||||
- `WechatPayServices` - 微信支付
|
||||
- `AlipayServices` - 支付宝支付
|
||||
|
||||
**支付方式:**
|
||||
- 微信支付(JSAPI、小程序、H5、扫码)
|
||||
- 支付宝支付(手机网站、扫码)
|
||||
- 余额支付
|
||||
- 积分支付
|
||||
|
||||
**支付流程:**
|
||||
```
|
||||
1. 创建支付订单
|
||||
2. 调用第三方支付接口
|
||||
3. 返回支付参数给客户端
|
||||
4. 客户端调起支付
|
||||
5. 支付结果异步回调
|
||||
6. 更新订单状态
|
||||
7. 触发支付成功事件
|
||||
```
|
||||
|
||||
**开发要点:**
|
||||
- 支付回调必须验证签名
|
||||
- 保证幂等性,避免重复支付
|
||||
- 事务处理多个业务(订单、账单、通知等)
|
||||
- 支持原路退款
|
||||
|
||||
### 2.5 营销模块
|
||||
|
||||
**2.5.1 优惠券**
|
||||
- 支持通用券、品类券、商品券、新人券
|
||||
- 可设置使用门槛、有效期、适用商品
|
||||
- 下单时自动计算优惠金额
|
||||
- 定时任务自动清理过期优惠券
|
||||
|
||||
**2.5.2 拼团**
|
||||
- 创建拼团活动(拼团价、成团人数、时长)
|
||||
- 用户发起拼团或参与拼团
|
||||
- 拼团成功后创建订单
|
||||
- 拼团失败自动退款
|
||||
|
||||
**2.5.3 砍价**
|
||||
- 发起砍价活动,分享好友帮砍
|
||||
- 每个好友可帮砍一次
|
||||
- 达到底价或帮砍人数后可购买
|
||||
- 超时未达成则砍价失败
|
||||
|
||||
**2.5.4 秒杀**
|
||||
- 设置秒杀时间和库存
|
||||
- 使用Redis缓存库存,防止超卖
|
||||
- 限制用户购买数量
|
||||
- 未支付订单自动恢复库存
|
||||
|
||||
**2.5.5 积分系统**
|
||||
- 购物返积分、签到积分、任务积分
|
||||
- 积分兑换商品或抵扣现金
|
||||
- 设置积分有效期
|
||||
- 定时任务清理过期积分
|
||||
|
||||
### 2.6 分销模块
|
||||
|
||||
**核心服务:**
|
||||
- `AgentLevelServices` - 分销等级
|
||||
- `AgentManageServices` - 分销员管理
|
||||
- `DivisionServices` - 事业部管理
|
||||
|
||||
**分销流程:**
|
||||
```
|
||||
1. 用户申请成为分销员
|
||||
2. 管理员审核通过
|
||||
3. 分销员分享推广链接
|
||||
4. 新用户注册成为下级
|
||||
5. 下级用户下单
|
||||
6. 计算分销佣金
|
||||
7. 佣金结算到余额
|
||||
```
|
||||
|
||||
**开发要点:**
|
||||
- 支持多级分销(一级、二级、三级)
|
||||
- 分销等级自动升级(完成任务)
|
||||
- 佣金冻结期(防止退款)
|
||||
- 佣金结算到分销员余额
|
||||
|
||||
### 2.7 系统管理模块
|
||||
|
||||
**2.7.1 代码生成器**
|
||||
- 快速生成CRUD代码
|
||||
- 支持自定义字段类型、搜索类型、表单类型
|
||||
- 自动生成前后端代码
|
||||
- 自动生成菜单和权限
|
||||
|
||||
**2.7.2 系统配置**
|
||||
- 后台动态配置系统参数
|
||||
- 支持多种配置类型
|
||||
- 配置分组管理
|
||||
- 配置缓存优化
|
||||
|
||||
**2.7.3 系统事件**
|
||||
- 内置30+事件锚点
|
||||
- 支持动态添加监听器
|
||||
- 事件驱动解耦业务
|
||||
- 支持异步事件处理
|
||||
|
||||
**核心事件:**
|
||||
- `user.register` - 用户注册
|
||||
- `user.login` - 用户登录
|
||||
- `order.create` - 订单创建
|
||||
- `order.pay_success` - 订单支付成功
|
||||
- `pay.success` - 支付成功
|
||||
|
||||
**2.7.4 定时任务**
|
||||
- 基于Workerman的定时任务
|
||||
- 支持Cron表达式
|
||||
- 后台动态配置
|
||||
|
||||
**系统预置任务:**
|
||||
1. 自动取消未支付订单(30分钟)
|
||||
2. 自动确认收货(每天)
|
||||
3. 自动好评(每天)
|
||||
4. 自动关闭拼团(10分钟)
|
||||
5. 自动关闭砍价(10分钟)
|
||||
6. 积分到期处理(每天)
|
||||
7. 优惠券过期处理(每天)
|
||||
8. 分销佣金结算(每天)
|
||||
|
||||
## 3. 开发规范
|
||||
|
||||
### 3.1 命名规范
|
||||
|
||||
**类命名:**
|
||||
- 控制器:模块名 + Controller,如 `UserController`
|
||||
- 服务:模块名 + Services,如 `UserServices`
|
||||
- DAO:模块名 + Dao,如 `UserDao`
|
||||
- 模型:模块名,如 `User`
|
||||
- 验证器:模块名 + Validate,如 `UserValidate`
|
||||
|
||||
**方法命名:**
|
||||
- 控制器:小写+下划线,如 `get_list`, `save_data`
|
||||
- 服务:驼峰法,如 `getUserList`, `saveData`
|
||||
- DAO:数据库操作相关,如 `selectList`, `insert`
|
||||
|
||||
### 3.2 代码分层规范
|
||||
|
||||
**控制器层:**
|
||||
- 接收和验证请求参数
|
||||
- 调用服务层处理业务
|
||||
- 返回统一的JSON响应
|
||||
- 不直接操作数据库
|
||||
|
||||
**服务层:**
|
||||
- 实现核心业务逻辑
|
||||
- 数据验证和权限验证
|
||||
- 调用DAO层操作数据库
|
||||
- 事务管理
|
||||
|
||||
**DAO层:**
|
||||
- 封装数据库查询逻辑
|
||||
- 构建查询条件
|
||||
- 防止SQL注入
|
||||
- 不提供业务逻辑
|
||||
|
||||
### 3.3 API响应格式
|
||||
|
||||
**成功响应:**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"msg": "操作成功",
|
||||
"data": {}
|
||||
}
|
||||
```
|
||||
|
||||
**分页响应:**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"msg": "操作成功",
|
||||
"data": {
|
||||
"list": [],
|
||||
"count": 100,
|
||||
"page": 1,
|
||||
"limit": 10
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**错误响应:**
|
||||
```json
|
||||
{
|
||||
"code": 400,
|
||||
"msg": "错误信息",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
|
||||
## 4. 常用命令
|
||||
|
||||
### 4.1 ThinkPHP命令
|
||||
```bash
|
||||
php think # 查看所有命令
|
||||
php think make:controller # 创建控制器
|
||||
php think make:model # 创建模型
|
||||
php think make:middleware # 创建中间件
|
||||
php think make:validate # 创建验证器
|
||||
php think clear # 清除缓存
|
||||
php think run # 启动内置服务器
|
||||
```
|
||||
|
||||
### 4.2 队列命令
|
||||
```bash
|
||||
php think queue:listen # 监听队列
|
||||
php think queue:work # 处理队列任务
|
||||
php think queue:restart # 重启队列
|
||||
php think queue:fail # 查看失败任务
|
||||
```
|
||||
|
||||
### 4.3 定时任务命令
|
||||
```bash
|
||||
php think timer start # 启动定时任务
|
||||
php think timer stop # 停止定时任务
|
||||
php think timer restart # 重启定时任务
|
||||
php think timer status # 查看状态
|
||||
```
|
||||
|
||||
### 4.4 Workerman命令
|
||||
```bash
|
||||
php think workerman start # 启动WebSocket
|
||||
php think workerman stop # 停止WebSocket
|
||||
php think workerman restart # 重启WebSocket
|
||||
php think workerman status # 查看状态
|
||||
```
|
||||
|
||||
## 5. 开发环境配置
|
||||
|
||||
### 5.1 环境要求
|
||||
- PHP >= 7.1
|
||||
- MySQL >= 5.7
|
||||
- Redis >= 5.0(可选)
|
||||
- Node.js >= 14
|
||||
- Composer
|
||||
|
||||
### 5.2 数据库配置
|
||||
```env
|
||||
[DATABASE]
|
||||
TYPE = mysql
|
||||
HOSTNAME = 127.0.0.1
|
||||
HOSTPORT = 3306
|
||||
USERNAME = root
|
||||
PASSWORD = 123456
|
||||
DATABASE = crmeb
|
||||
PREFIX = eb_
|
||||
CHARSET = utf8mb4
|
||||
```
|
||||
|
||||
### 5.3 Redis配置
|
||||
```env
|
||||
[CACHE]
|
||||
DRIVER = redis
|
||||
CACHE_PREFIX = cache_
|
||||
|
||||
[REDIS]
|
||||
REDIS_HOSTNAME = 127.0.0.1
|
||||
PORT = 6379
|
||||
REDIS_PASSWORD = 123456
|
||||
SELECT = 0
|
||||
```
|
||||
|
||||
### 5.4 队列配置
|
||||
```env
|
||||
[QUEUE]
|
||||
QUEUE_NAME = default
|
||||
```
|
||||
|
||||
## 6. 常见问题
|
||||
|
||||
### 6.1 数据库连接错误
|
||||
```bash
|
||||
# 检查MySQL服务
|
||||
systemctl status mysql
|
||||
|
||||
# 检查配置文件.env
|
||||
# 测试连接
|
||||
mysql -u root -p
|
||||
```
|
||||
|
||||
### 6.2 队列不执行
|
||||
```bash
|
||||
# 检查队列消费者
|
||||
php think queue:work
|
||||
|
||||
# 检查Redis连接
|
||||
redis-cli ping
|
||||
|
||||
# 查看队列日志
|
||||
tail -f runtime/log/queue.log
|
||||
```
|
||||
|
||||
### 6.3 定时任务不执行
|
||||
```bash
|
||||
# 检查定时任务状态
|
||||
php think timer status
|
||||
|
||||
# 查看定时任务日志
|
||||
tail -f runtime/log/timer.log
|
||||
```
|
||||
|
||||
### 6.4 WebSocket连接失败
|
||||
```bash
|
||||
# 检查WebSocket服务
|
||||
php think workerman status
|
||||
|
||||
# 检查端口占用
|
||||
netstat -tlnp | grep 40001
|
||||
```
|
||||
|
||||
## 7. 参考资源
|
||||
|
||||
### 7.1 官方文档
|
||||
- [ThinkPHP 6 官方文档](https://www.kancloud.cn/manual/thinkphp6_0)
|
||||
- [Vue 2 官方文档](https://v2.vuejs.org/)
|
||||
- [Element UI 官方文档](https://element.eleme.io/)
|
||||
- [UniApp 官方文档](https://uniapp.dcloud.net.cn/)
|
||||
|
||||
### 7.2 项目文档
|
||||
- 代码理解指南: `/help/dev-docs/AI代码理解指南.md`
|
||||
- 错误码说明: `/help/dev-docs/错误码说明文档.md`
|
||||
- 后端API文档: `/help/dev-docs/phpapi/`
|
||||
- 移动端文档: `/help/dev-docs/uniapp/`
|
||||
- 管理端文档: `/help/dev-docs/admin/`
|
||||
|
||||
### 7.3 开发工具
|
||||
- **IDE**: PhpStorm / VS Code
|
||||
- **API测试**: Postman / Apifox
|
||||
- **数据库**: Navicat / phpMyAdmin
|
||||
- **Redis**: Redis Desktop Manager
|
||||
|
||||
## 8. 获取帮助
|
||||
|
||||
### 8.1 技术社区
|
||||
- CRMEB技术社区: https://www.crmeb.com/ask/thread/list/147
|
||||
- 开源技术交流群: 查看项目README.md
|
||||
|
||||
### 8.2 官方支持
|
||||
- 官网: https://www.crmeb.com
|
||||
- 文档中心: https://doc.crmeb.com
|
||||
- 在线客服: https://www.crmeb.com
|
||||
|
||||
### 8.3 问题反馈
|
||||
- Gitee Issues: https://gitee.com/ZhongBangKeJi/CRMEB/issues
|
||||
- 技术社区发帖: https://www.crmeb.com/ask/
|
||||
|
||||
## 9. 扩展阅读
|
||||
|
||||
### 9.1 专项Skill文档
|
||||
本目录下还包含以下专项skill文档,点击对应文件查看详情:
|
||||
|
||||
- **crmeb-agent**: CRMEB电商系统Agent(智能开发助手)
|
||||
- **php-api**: PHP后端开发专项说明
|
||||
- **admin-element**: 管理端前端开发专项说明
|
||||
- **uniapp**: 移动端UniApp开发专项说明
|
||||
|
||||
### 9.2 进阶文档
|
||||
- **references/api_flow.md**: 接口请求流程详解
|
||||
- **references/code_style.md**: 代码规范详解
|
||||
- **references/db_design.md**: 数据库设计规范
|
||||
- **references/system_config.md**: 系统配置说明
|
||||
|
||||
---
|
||||
|
||||
**最后更新**: 2025年3月17日
|
||||
**维护者**: CRMEB开源社区
|
||||
**版本**: v1.0.0
|
||||
258
.codebuddy/skills/crmeb-complete/SKILL_PACKAGE_SUMMARY.md
Normal file
258
.codebuddy/skills/crmeb-complete/SKILL_PACKAGE_SUMMARY.md
Normal file
@ -0,0 +1,258 @@
|
||||
# CRMEB Skill包创建完成总结
|
||||
|
||||
## 📦 创建完成的文件清单
|
||||
|
||||
已成功创建完整的CRMEB电商系统Skill包,文件结构如下:
|
||||
|
||||
```
|
||||
.codebuddy/skills/crmeb-complete/
|
||||
├── SKILL.md # 主Skill文件(项目概览)
|
||||
├── README.md # Skill包说明文档
|
||||
└── references/ # 参考文档目录
|
||||
├── quick_start.md # 快速开始指南
|
||||
├── api_flow.md # API接口请求流程详解
|
||||
├── code_style.md # 代码开发规范
|
||||
├── db_design.md # 数据库设计规范
|
||||
└── system_config.md # 系统配置详解
|
||||
```
|
||||
|
||||
## 📚 Skill包内容概览
|
||||
|
||||
### 1. 主Skill文件(SKILL.md)
|
||||
**文件大小:** 约15KB
|
||||
**内容涵盖:**
|
||||
- 项目概述(技术架构、核心特点、项目地址)
|
||||
- 目录结构详解(后端、前端、Docker)
|
||||
- 核心业务模块详解(用户、商品、订单、支付、营销、分销、系统管理)
|
||||
- 开发规范(命名、代码分层、API响应格式)
|
||||
- 常用命令(ThinkPHP、队列、定时任务、Workerman)
|
||||
- 开发环境配置(环境要求、数据库、Redis、队列)
|
||||
- 常见问题(数据库、队列、定时任务、WebSocket)
|
||||
- 参考资源(官方文档、项目文档、开发工具)
|
||||
|
||||
### 2. 快速开始指南(references/quick_start.md)
|
||||
**文件大小:** 约12KB
|
||||
**内容涵盖:**
|
||||
- Docker一键部署(推荐)
|
||||
- 手动安装步骤
|
||||
- 环境配置详解
|
||||
- 验证安装
|
||||
- 常见问题排查(10+常见问题及解决方案)
|
||||
- 下一步建议
|
||||
|
||||
### 3. API接口请求流程详解(references/api_flow.md)
|
||||
**文件大小:** 约18KB
|
||||
**内容涵盖:**
|
||||
- API请求生命周期
|
||||
- 请求处理流程详解
|
||||
- 统一响应格式(成功、分页、错误)
|
||||
- 认证与授权流程
|
||||
- 参数验证方式
|
||||
- 错误处理机制
|
||||
- 日志记录规范
|
||||
- 性能优化建议
|
||||
|
||||
### 4. 代码开发规范(references/code_style.md)
|
||||
**文件大小:** 约20KB
|
||||
**内容涵盖:**
|
||||
- 命名规范(类、方法、变量、数据库)
|
||||
- 代码分层规范(控制器、服务层、DAO层、模型层)
|
||||
- 注释规范(文件、类、方法、复杂逻辑)
|
||||
- 数据库规范(表设计、索引设计、SQL编写)
|
||||
- API接口规范(路由、请求方法、响应格式、状态码)
|
||||
- 性能优化(数据库、缓存、队列)
|
||||
- 安全规范(SQL注入、XSS、CSRF、敏感信息保护)
|
||||
|
||||
### 5. 数据库设计规范(references/db_design.md)
|
||||
**文件大小:** 约22KB
|
||||
**内容涵盖:**
|
||||
- 数据库架构和配置
|
||||
- 表命名规范
|
||||
- 字段命名规范
|
||||
- 核心表结构详解(用户表、商品表、订单表)
|
||||
- 索引设计规范
|
||||
- 数据类型优化
|
||||
- 关联查询设计
|
||||
- 性能优化建议(表分区、分表、读写分离)
|
||||
- 数据备份与恢复
|
||||
- 数据库监控
|
||||
|
||||
### 6. 系统配置详解(references/system_config.md)
|
||||
**文件大小:** 约18KB
|
||||
**内容涵盖:**
|
||||
- 配置文件结构
|
||||
- 应用配置详解
|
||||
- 数据库配置详解(含读写分离)
|
||||
- 缓存配置详解
|
||||
- 队列配置详解
|
||||
- Workerman配置详解
|
||||
- 日志配置详解
|
||||
- 文件存储配置(本地、云存储)
|
||||
- 微信支付配置
|
||||
- 支付宝配置
|
||||
- 短信服务配置
|
||||
- 邮件服务配置
|
||||
- 第三方登录配置
|
||||
- 安全配置
|
||||
- 完整环境变量示例
|
||||
|
||||
## 🎯 Skill包特点
|
||||
|
||||
### 1. 完整性
|
||||
- 涵盖CRMEB系统的所有核心模块
|
||||
- 包含前端、后端、移动端开发指南
|
||||
- 覆盖从安装部署到高级优化的全流程
|
||||
|
||||
### 2. 实用性
|
||||
- 提供可直接使用的代码示例
|
||||
- 包含常见问题排查指南
|
||||
- 提供性能优化和安全加固建议
|
||||
|
||||
### 3. 规范性
|
||||
- 详细的开发规范和最佳实践
|
||||
- 统一的命名和代码风格指南
|
||||
- 完整的数据库设计规范
|
||||
|
||||
### 4. 易用性
|
||||
- 清晰的目录结构和导航
|
||||
- 详细的步骤说明
|
||||
- 丰富的示例和截图建议
|
||||
|
||||
### 5. 可维护性
|
||||
- 模块化文档结构
|
||||
- 统一的文档格式
|
||||
- 版本管理和更新记录
|
||||
|
||||
## 🚀 使用建议
|
||||
|
||||
### 对于新手开发者
|
||||
1. **第一步**:阅读 `README.md` 了解Skill包结构
|
||||
2. **第二步**:按照 `references/quick_start.md` 部署项目
|
||||
3. **第三步**:阅读 `SKILL.md` 了解项目架构和核心模块
|
||||
4. **第四步**:参考 `references/code_style.md` 开始开发
|
||||
|
||||
### 对于后端开发者
|
||||
1. **必读**:`SKILL.md` 的"核心业务模块"章节
|
||||
2. **必读**:`references/api_flow.md` 了解API开发流程
|
||||
3. **参考**:`references/code_style.md` 遵循开发规范
|
||||
4. **参考**:`references/db_design.md` 数据库设计规范
|
||||
|
||||
### 对于前端开发者
|
||||
1. **必读**:`SKILL.md` 的"目录结构"章节
|
||||
2. **必读**:`references/api_flow.md` 了解接口规范
|
||||
3. **参考**:管理端或移动端专项Skill文档
|
||||
|
||||
### 对于全栈开发者
|
||||
1. **完整阅读**所有文档
|
||||
2. **重点关注**系统架构和设计模式
|
||||
3. **深入学习**性能优化和安全加固
|
||||
|
||||
## 📖 学习路径
|
||||
|
||||
### 阶段一:环境搭建(30分钟)
|
||||
- 阅读 `README.md`
|
||||
- 按照 `references/quick_start.md` 部署项目
|
||||
- 验证系统正常运行
|
||||
|
||||
### 阶段二:项目了解(1小时)
|
||||
- 阅读 `SKILL.md` 的"项目概述"和"目录结构"
|
||||
- 浏览后台管理功能
|
||||
- 体验前端商城流程
|
||||
|
||||
### 阶段三:后端开发(3-5小时)
|
||||
- 深入学习 `SKILL.md` 的"核心业务模块"
|
||||
- 阅读 `references/api_flow.md`
|
||||
- 学习 `references/code_style.md`
|
||||
- 学习 `references/db_design.md`
|
||||
- 实践代码生成器
|
||||
|
||||
### 阶段四:功能开发(持续)
|
||||
- 选择一个小功能模块进行开发
|
||||
- 参考现有代码实现
|
||||
- 遵循开发规范
|
||||
- 编写必要注释
|
||||
|
||||
### 阶段五:高级特性(2-3小时)
|
||||
- 学习队列使用
|
||||
- 了解定时任务
|
||||
- 掌握WebSocket通信
|
||||
- 性能优化实践
|
||||
|
||||
## 🔧 开发工具推荐
|
||||
|
||||
### 后端开发
|
||||
- **IDE**: PhpStorm / VS Code
|
||||
- **API测试**: Postman / Apifox
|
||||
- **数据库**: Navicat / phpMyAdmin
|
||||
- **Redis**: Redis Desktop Manager
|
||||
|
||||
### 前端开发
|
||||
- **IDE**: VS Code / WebStorm
|
||||
- **浏览器**: Chrome + Vue DevTools
|
||||
|
||||
### 移动端开发
|
||||
- **IDE**: HBuilderX(官方推荐)
|
||||
- **调试**: 微信开发者工具 + 真机调试
|
||||
|
||||
## 💡 最佳实践
|
||||
|
||||
### 1. 使用代码生成器
|
||||
在后台管理中使用"代码生成器"快速生成CRUD代码,节省开发时间。
|
||||
|
||||
### 2. 遵循开发规范
|
||||
严格按照 `references/code_style.md` 中的规范进行开发,保证代码质量。
|
||||
|
||||
### 3. 合理使用缓存
|
||||
对于读多写少的数据,合理使用Redis缓存提高性能。
|
||||
|
||||
### 4. 异步处理耗时任务
|
||||
将发送短信、生成海报等耗时操作放入队列异步处理。
|
||||
|
||||
### 5. 编写单元测试
|
||||
为关键业务逻辑编写单元测试,保证代码稳定性。
|
||||
|
||||
### 6. 定期备份数据
|
||||
使用自动化脚本定期备份数据库和文件。
|
||||
|
||||
### 7. 监控和日志
|
||||
配置完善的监控和日志系统,及时发现和解决问题。
|
||||
|
||||
## 🎉 Skill包优势
|
||||
|
||||
1. **节省时间**:无需从零开始研究项目,快速上手
|
||||
2. **降低门槛**:详细的文档和示例,降低学习难度
|
||||
3. **提高效率**:规范的代码和最佳实践,提高开发效率
|
||||
4. **减少错误**:包含常见问题排查,减少踩坑
|
||||
5. **促进协作**:统一的开发规范,便于团队协作
|
||||
|
||||
## 📞 获取帮助
|
||||
|
||||
- **技术社区**:https://www.crmeb.com/ask/thread/list/147
|
||||
- **官方文档**:https://doc.crmeb.com
|
||||
- **在线客服**:https://www.crmeb.com
|
||||
- **GitHub Issues**:https://gitee.com/ZhongBangKeJi/CRMEB/issues
|
||||
|
||||
## 📄 许可证
|
||||
|
||||
本项目基于 [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0) 协议开源。
|
||||
|
||||
## 📝 更新日志
|
||||
|
||||
### v1.0.0 (2025-03-17)
|
||||
- ✅ 初始版本发布
|
||||
- ✅ 包含项目概览、快速开始、API流程等核心文档
|
||||
- ✅ 完整的开发规范和最佳实践
|
||||
- ✅ 详细的数据库设计规范
|
||||
- ✅ 完整的系统配置详解
|
||||
- ✅ 覆盖CRMEB所有核心模块
|
||||
|
||||
## 🙏 致谢
|
||||
|
||||
感谢CRMEB开源社区和所有贡献者的支持。
|
||||
|
||||
---
|
||||
|
||||
**文档版本**: v1.0.0
|
||||
**最后更新**: 2025-03-17
|
||||
**维护者**: CRMEB开源社区
|
||||
**贡献者**: AI助手 + CRMEB社区
|
||||
845
.codebuddy/skills/crmeb-complete/references/api_flow.md
Normal file
845
.codebuddy/skills/crmeb-complete/references/api_flow.md
Normal file
@ -0,0 +1,845 @@
|
||||
# API接口请求流程详解
|
||||
|
||||
## 1. API请求生命周期
|
||||
|
||||
### 1.1 请求流程图
|
||||
|
||||
```
|
||||
客户端请求
|
||||
↓
|
||||
Nginx/Apache
|
||||
↓
|
||||
入口文件 (public/index.php)
|
||||
↓
|
||||
ThinkPHP应用初始化
|
||||
↓
|
||||
路由解析 (route/*.php)
|
||||
↓
|
||||
中间件处理 (app/http/middleware/)
|
||||
↓
|
||||
控制器 (app/*/controller/)
|
||||
↓
|
||||
服务层 (app/services/)
|
||||
↓
|
||||
DAO层 (app/dao/)
|
||||
↓
|
||||
模型层 (app/model/)
|
||||
↓
|
||||
数据库 (MySQL)
|
||||
↓
|
||||
返回响应
|
||||
↓
|
||||
JSON格式化
|
||||
↓
|
||||
客户端接收
|
||||
```
|
||||
|
||||
### 1.2 请求处理详解
|
||||
|
||||
**步骤1:路由解析**
|
||||
- 配置文件:`route/app.php`, `route/adminapi.php`, `route/api.php`
|
||||
- 路由规则:支持GET、POST、PUT、DELETE等HTTP方法
|
||||
- 路由分组:按模块分组,统一前缀
|
||||
|
||||
**步骤2:中间件处理**
|
||||
- 权限验证:验证用户登录状态和权限
|
||||
- 请求日志:记录请求日志
|
||||
- 参数过滤:过滤非法参数
|
||||
- 跨域处理:处理CORS跨域请求
|
||||
|
||||
**步骤3:控制器层**
|
||||
- 接收参数:从GET/POST获取参数
|
||||
- 参数验证:验证参数合法性
|
||||
- 调用服务:调用服务层处理业务
|
||||
- 返回响应:返回JSON格式数据
|
||||
|
||||
**步骤4:服务层**
|
||||
- 业务逻辑:处理核心业务逻辑
|
||||
- 数据验证:验证业务规则
|
||||
- 调用DAO:调用DAO层操作数据库
|
||||
- 事务管理:处理数据库事务
|
||||
- 事件触发:触发系统事件
|
||||
|
||||
**步骤5:DAO层**
|
||||
- 构建查询:构建SQL查询条件
|
||||
- 执行查询:执行数据库操作
|
||||
- 返回结果:返回查询结果
|
||||
|
||||
**步骤6:模型层**
|
||||
- 数据映射:ORM对象关系映射
|
||||
- 数据转换:自动转换数据类型
|
||||
- 关联查询:处理表关联关系
|
||||
|
||||
## 2. API调用示例
|
||||
|
||||
### 2.1 用户登录API
|
||||
|
||||
**请求URL:**
|
||||
```
|
||||
POST /api/login
|
||||
```
|
||||
|
||||
**请求参数:**
|
||||
```json
|
||||
{
|
||||
"account": "13800138000",
|
||||
"password": "123456",
|
||||
"type": "account" // account:账号密码, mobile:手机验证码
|
||||
}
|
||||
```
|
||||
|
||||
**处理流程:**
|
||||
```php
|
||||
// 1. 路由定义 (route/api.php)
|
||||
Route::post('login', 'api.Login/login');
|
||||
|
||||
// 2. 控制器 (app/api/controller/Login.php)
|
||||
class Login
|
||||
{
|
||||
public function login()
|
||||
{
|
||||
// 获取参数
|
||||
$data = $this->request->postMore([
|
||||
['account', ''],
|
||||
['password', ''],
|
||||
['type', 'account']
|
||||
]);
|
||||
|
||||
// 调用登录服务
|
||||
$loginServices = app()->make(LoginServices::class);
|
||||
$token = $loginServices->login($data['account'], $data['password'], $data['type']);
|
||||
|
||||
// 返回token
|
||||
return app('json')->success(['token' => $token]);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 服务层 (app/services/user/LoginServices.php)
|
||||
class LoginServices extends BaseServices
|
||||
{
|
||||
public function login($account, $password, $type)
|
||||
{
|
||||
// 验证验证码(如果需要)
|
||||
// 查询用户
|
||||
$user = $this->dao->getUserByAccount($account);
|
||||
|
||||
// 验证密码
|
||||
if (!password_verify($password, $user['pwd'])) {
|
||||
throw new ValidateException('密码错误');
|
||||
}
|
||||
|
||||
// 生成token
|
||||
$token = $this->createToken($user['uid']);
|
||||
|
||||
// 更新登录信息
|
||||
$this->dao->update($user['uid'], [
|
||||
'last_login_time' => time(),
|
||||
'last_login_ip' => request()->ip()
|
||||
]);
|
||||
|
||||
return $token;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**响应结果:**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"msg": "登录成功",
|
||||
"data": {
|
||||
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2.2 商品列表API
|
||||
|
||||
**请求URL:**
|
||||
```
|
||||
GET /api/products
|
||||
```
|
||||
|
||||
**请求参数:**
|
||||
```
|
||||
page: 1 // 页码
|
||||
limit: 10 // 每页数量
|
||||
category_id: 1 // 分类ID
|
||||
keywords: "手机" // 搜索关键词
|
||||
sort: "id-desc" // 排序方式
|
||||
```
|
||||
|
||||
**处理流程:**
|
||||
```php
|
||||
// 1. 路由定义
|
||||
Route::get('products', 'api.Product/get_list');
|
||||
|
||||
// 2. 控制器
|
||||
class Product
|
||||
{
|
||||
public function get_list()
|
||||
{
|
||||
// 获取参数
|
||||
$where = $this->request->getMore([
|
||||
['page', 1],
|
||||
['limit', 10],
|
||||
['category_id', 0],
|
||||
['keywords', ''],
|
||||
['sort', 'id-desc']
|
||||
]);
|
||||
|
||||
// 调用服务层
|
||||
$productServices = app()->make(StoreProductServices::class);
|
||||
$list = $productServices->getProductList($where);
|
||||
|
||||
return app('json')->success($list);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 服务层
|
||||
class StoreProductServices extends BaseServices
|
||||
{
|
||||
public function getProductList(array $where)
|
||||
{
|
||||
// 构建查询条件
|
||||
$query = $this->dao->search($where);
|
||||
|
||||
// 分页查询
|
||||
$list = $query->page($where['page'], $where['limit'])->select();
|
||||
|
||||
// 处理数据
|
||||
foreach ($list as &$item) {
|
||||
$item['price'] = bcadd($item['price'], '0', 2);
|
||||
$item['image'] = $this->getImageUrl($item['image']);
|
||||
}
|
||||
|
||||
return [
|
||||
'list' => $list,
|
||||
'count' => $query->count(),
|
||||
'page' => $where['page'],
|
||||
'limit' => $where['limit']
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// 4. DAO层
|
||||
class StoreProductDao extends BaseDao
|
||||
{
|
||||
public function search(array $where = [])
|
||||
{
|
||||
$query = $this->getModel()
|
||||
->where('is_del', 0)
|
||||
->where('is_show', 1);
|
||||
|
||||
// 分类筛选
|
||||
if ($where['category_id']) {
|
||||
$query = $query->where('category_id', $where['category_id']);
|
||||
}
|
||||
|
||||
// 关键词搜索
|
||||
if ($where['keywords']) {
|
||||
$query = $query->whereLike('name|keyword', "%{$where['keywords']}%");
|
||||
}
|
||||
|
||||
// 排序
|
||||
[$field, $sort] = explode('-', $where['sort']);
|
||||
$query = $query->order($field, $sort);
|
||||
|
||||
return $query;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2.3 创建订单API
|
||||
|
||||
**请求URL:**
|
||||
```
|
||||
POST /api/order/create
|
||||
```
|
||||
|
||||
**请求头:**
|
||||
```
|
||||
Authorization: Bearer {token}
|
||||
```
|
||||
|
||||
**请求参数:**
|
||||
```json
|
||||
{
|
||||
"cart_id": "1,2,3", // 购物车ID(多个用逗号分隔)
|
||||
"address_id": 10, // 收货地址ID
|
||||
"pay_type": "wechat", // 支付方式: wechat, alipay, yue
|
||||
"coupon_id": 5, // 优惠券ID(可选)
|
||||
"mark": "尽快发货", // 买家留言(可选)
|
||||
"use_integral": false // 是否使用积分
|
||||
}
|
||||
```
|
||||
|
||||
**处理流程:**
|
||||
```php
|
||||
// 1. 路由定义
|
||||
Route::post('order/create', 'api.Order/create')->middleware(AuthTokenMiddleware::class);
|
||||
|
||||
// 2. 中间件验证
|
||||
class AuthTokenMiddleware
|
||||
{
|
||||
public function handle($request, \Closure $next)
|
||||
{
|
||||
// 验证token
|
||||
$token = $request->header('Authorization');
|
||||
$user = $this->checkToken($token);
|
||||
|
||||
// 将用户信息存入请求
|
||||
$request->user = $user;
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 控制器
|
||||
class Order
|
||||
{
|
||||
public function create()
|
||||
{
|
||||
// 获取当前用户
|
||||
$uid = $this->request->user['uid'];
|
||||
|
||||
// 获取参数
|
||||
$data = $this->request->postMore([
|
||||
['cart_id', ''],
|
||||
['address_id', 0],
|
||||
['pay_type', ''],
|
||||
['coupon_id', 0],
|
||||
['mark', ''],
|
||||
['use_integral', false]
|
||||
]);
|
||||
|
||||
// 调用订单创建服务
|
||||
$orderServices = app()->make(StoreOrderCreateServices::class);
|
||||
$orderId = $orderServices->createOrder($uid, $data);
|
||||
|
||||
return app('json')->success(['order_id' => $orderId]);
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 订单创建服务
|
||||
class StoreOrderCreateServices extends BaseServices
|
||||
{
|
||||
public function createOrder($uid, $data)
|
||||
{
|
||||
// 1. 参数验证
|
||||
$this->validateOrderData($data);
|
||||
|
||||
// 2. 查询购物车
|
||||
$carts = $this->getCarts($uid, $data['cart_id']);
|
||||
|
||||
// 3. 查询收货地址
|
||||
$address = $this->getAddress($uid, $data['address_id']);
|
||||
|
||||
// 4. 验证优惠券
|
||||
$coupon = null;
|
||||
if ($data['coupon_id']) {
|
||||
$coupon = $this->validateCoupon($uid, $data['coupon_id']);
|
||||
}
|
||||
|
||||
// 5. 计算订单金额
|
||||
$priceInfo = $this->computeOrderPrice($carts, $coupon, $data['use_integral']);
|
||||
|
||||
// 6. 开启事务
|
||||
$this->transaction(function () use ($uid, $data, $carts, $address, $priceInfo) {
|
||||
// 6.1 创建订单
|
||||
$orderId = $this->createOrderRecord($uid, $data, $address, $priceInfo);
|
||||
|
||||
// 6.2 创建订单商品
|
||||
$this->createOrderCartInfo($orderId, $carts);
|
||||
|
||||
// 6.3 扣减库存
|
||||
$this->decrementStock($carts);
|
||||
|
||||
// 6.4 清空购物车
|
||||
$this->clearCart($uid, $data['cart_id']);
|
||||
|
||||
// 6.5 使用优惠券
|
||||
if ($data['coupon_id']) {
|
||||
$this->useCoupon($uid, $data['coupon_id'], $orderId);
|
||||
}
|
||||
|
||||
// 6.6 触发订单创建事件
|
||||
event('order.create', ['order_id' => $orderId]);
|
||||
|
||||
return $orderId;
|
||||
});
|
||||
|
||||
// 7. 返回订单ID
|
||||
return $orderId;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 3. 统一响应格式
|
||||
|
||||
### 3.1 成功响应
|
||||
|
||||
**格式:**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"msg": "操作成功",
|
||||
"data": {}
|
||||
}
|
||||
```
|
||||
|
||||
**示例:**
|
||||
```php
|
||||
// 返回成功,无数据
|
||||
return app('json')->success();
|
||||
|
||||
// 返回成功,带数据
|
||||
return app('json')->success($data);
|
||||
|
||||
// 返回成功,自定义消息
|
||||
return app('json')->success('登录成功');
|
||||
|
||||
// 返回成功,带数据和消息
|
||||
return app('json')->success($data, '获取成功');
|
||||
```
|
||||
|
||||
### 3.2 分页响应
|
||||
|
||||
**格式:**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"msg": "操作成功",
|
||||
"data": {
|
||||
"list": [],
|
||||
"count": 100,
|
||||
"page": 1,
|
||||
"limit": 10
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**示例:**
|
||||
```php
|
||||
// 构建分页数据
|
||||
$data = [
|
||||
'list' => $list,
|
||||
'count' => $total,
|
||||
'page' => $page,
|
||||
'limit' => $limit
|
||||
];
|
||||
|
||||
return app('json')->success($data);
|
||||
```
|
||||
|
||||
### 3.3 错误响应
|
||||
|
||||
**格式:**
|
||||
```json
|
||||
{
|
||||
"code": 400,
|
||||
"msg": "错误信息",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
|
||||
**示例:**
|
||||
```php
|
||||
// 返回错误
|
||||
return app('json')->fail('参数错误');
|
||||
|
||||
// 返回错误,带错误码
|
||||
return app('json')->fail('用户不存在', 404);
|
||||
|
||||
// 抛出异常(框架自动捕获并返回错误)
|
||||
throw new ValidateException('手机号格式错误');
|
||||
throw new AuthException('登录已过期');
|
||||
```
|
||||
|
||||
### 3.4 特殊状态码
|
||||
|
||||
**系统定义的状态码:**
|
||||
|
||||
| 状态码 | 说明 |
|
||||
|--------|------|
|
||||
| 200 | 操作成功 |
|
||||
| 400 | 参数错误 |
|
||||
| 401 | 未授权(未登录或token过期) |
|
||||
| 403 | 无权限访问 |
|
||||
| 404 | 资源不存在 |
|
||||
| 429 | 请求过于频繁 |
|
||||
| 500 | 服务器内部错误 |
|
||||
| 502 | 服务不可用 |
|
||||
|
||||
## 4. 认证与授权
|
||||
|
||||
### 4.1 Token认证流程
|
||||
|
||||
```
|
||||
1. 用户登录
|
||||
2. 服务端验证账号密码
|
||||
3. 生成JWT Token
|
||||
4. 返回Token给客户端
|
||||
5. 客户端存储Token(localStorage)
|
||||
6. 后续请求携带Token(Header: Authorization: Bearer {token})
|
||||
7. 服务端验证Token
|
||||
8. 返回请求数据
|
||||
```
|
||||
|
||||
### 4.2 Token验证中间件
|
||||
|
||||
```php
|
||||
<?php
|
||||
namespace app\http\middleware;
|
||||
|
||||
use crmeb\exceptions\AuthException;
|
||||
|
||||
class AuthTokenMiddleware
|
||||
{
|
||||
public function handle($request, \Closure $next)
|
||||
{
|
||||
// 获取Token
|
||||
$token = $request->header('Authorization');
|
||||
|
||||
if (!$token) {
|
||||
throw new AuthException('请先登录', 401);
|
||||
}
|
||||
|
||||
// 验证Token格式
|
||||
if (!preg_match('/Bearer\s+(.+)/', $token, $matches)) {
|
||||
throw new AuthException('Token格式错误', 401);
|
||||
}
|
||||
|
||||
$jwt = $matches[1];
|
||||
|
||||
// 验证JWT
|
||||
try {
|
||||
$payload = JWTAuth::decode($jwt);
|
||||
} catch (\Exception $e) {
|
||||
throw new AuthException('Token已过期', 401);
|
||||
}
|
||||
|
||||
// 查询用户
|
||||
$user = \app\model\user\User::find($payload['uid']);
|
||||
if (!$user || $user['status'] == 0) {
|
||||
throw new AuthException('用户不存在或已被禁用', 401);
|
||||
}
|
||||
|
||||
// 将用户信息存入请求
|
||||
$request->user = $user->toArray();
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4.3 路由中应用中间件
|
||||
|
||||
```php
|
||||
<?php
|
||||
use think\facade\Route;
|
||||
|
||||
// 需要登录的接口
|
||||
Route::group('api/user', function () {
|
||||
Route::get('info', 'api.User/info');
|
||||
Route::post('update', 'api.User/update');
|
||||
Route::get('order/list', 'api.Order/get_user_order_list');
|
||||
})->middleware([AuthTokenMiddleware::class]);
|
||||
|
||||
// 需要登录和权限验证的接口(后台管理)
|
||||
Route::group('adminapi', function () {
|
||||
Route::get('dashboard', 'adminapi.Index/index');
|
||||
Route::get('user/list', 'adminapi.User/get_list');
|
||||
})->middleware([AuthTokenMiddleware::class, CheckAdminMiddleware::class]);
|
||||
```
|
||||
|
||||
## 5. 参数验证
|
||||
|
||||
### 5.1 控制器参数验证
|
||||
|
||||
```php
|
||||
<?php
|
||||
namespace app\api\controller;
|
||||
|
||||
class User
|
||||
{
|
||||
public function update()
|
||||
{
|
||||
// 获取并验证参数
|
||||
$data = $this->request->postMore([
|
||||
['nickname', '', '昵称长度应在2-20位之间', function($value) {
|
||||
return mb_strlen($value) >= 2 && mb_strlen($value) <= 20;
|
||||
}],
|
||||
['avatar', '', '头像地址不能为空'],
|
||||
['sex', 0, '性别格式错误', function($value) {
|
||||
return in_array($value, [0, 1, 2]);
|
||||
}]
|
||||
]);
|
||||
|
||||
// 业务处理...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5.2 验证器类
|
||||
|
||||
```php
|
||||
<?php
|
||||
namespace app\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class UserValidate extends Validate
|
||||
{
|
||||
protected $rule = [
|
||||
'account' => 'require|length:2,20',
|
||||
'password' => 'require|length:6,20',
|
||||
'phone' => 'require|mobile',
|
||||
'email' => 'email',
|
||||
'code' => 'require|length:4,6'
|
||||
];
|
||||
|
||||
protected $message = [
|
||||
'account.require' => '账号不能为空',
|
||||
'account.length' => '账号长度应在2-20位之间',
|
||||
'password.require' => '密码不能为空',
|
||||
'password.length' => '密码长度应在6-20位之间',
|
||||
'phone.require' => '手机号不能为空',
|
||||
'phone.mobile' => '手机号格式错误',
|
||||
'email.email' => '邮箱格式错误',
|
||||
'code.require' => '验证码不能为空',
|
||||
'code.length' => '验证码长度错误'
|
||||
];
|
||||
|
||||
protected $scene = [
|
||||
'login' => ['account', 'password'],
|
||||
'register' => ['account', 'password', 'phone', 'code'],
|
||||
'update' => ['nickname', 'avatar', 'sex']
|
||||
];
|
||||
}
|
||||
```
|
||||
|
||||
### 5.3 在控制器中使用验证器
|
||||
|
||||
```php
|
||||
<?php
|
||||
namespace app\api\controller;
|
||||
|
||||
use app\validate\UserValidate;
|
||||
|
||||
class User
|
||||
{
|
||||
public function register()
|
||||
{
|
||||
// 验证参数
|
||||
$validate = new UserValidate();
|
||||
if (!$validate->scene('register')->check($this->request->post())) {
|
||||
return app('json')->fail($validate->getError());
|
||||
}
|
||||
|
||||
// 业务处理...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 6. 错误处理
|
||||
|
||||
### 6.1 异常类型
|
||||
|
||||
**系统定义的异常类:**
|
||||
|
||||
```php
|
||||
// 验证异常(参数错误)
|
||||
throw new \crmeb\exceptions\ValidateException('参数验证失败');
|
||||
|
||||
// 授权异常(登录过期、无权限)
|
||||
throw new \crmeb\exceptions\AuthException('请先登录', 401);
|
||||
|
||||
// 业务异常(通用业务错误)
|
||||
throw new \crmeb\exceptions\AdminException('操作失败');
|
||||
|
||||
// 系统异常(服务器错误)
|
||||
throw new \crmeb\exceptions\SystemException('系统错误');
|
||||
```
|
||||
|
||||
### 6.2 全局异常处理
|
||||
|
||||
**异常处理配置:** `app/ExceptionHandle.php`
|
||||
|
||||
```php
|
||||
<?php
|
||||
namespace app;
|
||||
|
||||
use think\exception\Handle;
|
||||
use think\exception\ValidateException;
|
||||
use think\exception\HttpException;
|
||||
|
||||
class ExceptionHandle extends Handle
|
||||
{
|
||||
public function render($request, \Throwable $e): \think\Response
|
||||
{
|
||||
// 验证异常
|
||||
if ($e instanceof ValidateException) {
|
||||
return app('json')->fail($e->getError(), 400);
|
||||
}
|
||||
|
||||
// HTTP异常(404等)
|
||||
if ($e instanceof HttpException) {
|
||||
return app('json')->fail($e->getMessage(), $e->getStatusCode());
|
||||
}
|
||||
|
||||
// 授权异常
|
||||
if ($e instanceof \crmeb\exceptions\AuthException) {
|
||||
return app('json')->fail($e->getMessage(), $e->getCode() ?: 401);
|
||||
}
|
||||
|
||||
// 业务异常
|
||||
if ($e instanceof \crmeb\exceptions\AdminException) {
|
||||
return app('json')->fail($e->getMessage(), $e->getCode() ?: 400);
|
||||
}
|
||||
|
||||
// 系统异常(生产环境不显示详细信息)
|
||||
if (app()->isDebug()) {
|
||||
return app('json')->fail($e->getMessage(), 500);
|
||||
} else {
|
||||
return app('json')->fail('系统错误,请稍后重试', 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 7. 日志记录
|
||||
|
||||
### 7.1 记录业务日志
|
||||
|
||||
```php
|
||||
<?php
|
||||
// 记录一般日志
|
||||
\think\facade\Log::info('用户登录成功', ['uid' => $uid, 'ip' => $ip]);
|
||||
|
||||
// 记录错误日志
|
||||
\think\facade\Log::error('订单创建失败', ['uid' => $uid, 'error' => $error]);
|
||||
|
||||
// 记录调试日志
|
||||
\think\facade\Log::debug('调试信息', ['data' => $data]);
|
||||
|
||||
// 指定日志通道
|
||||
\think\facade\Log::channel('order')->info('订单日志', ['order_id' => $orderId]);
|
||||
```
|
||||
|
||||
### 7.2 日志配置
|
||||
|
||||
**配置文件:** `config/log.php`
|
||||
|
||||
```php
|
||||
<?php
|
||||
return [
|
||||
// 默认日志通道
|
||||
'default' => env('log.channel', 'file'),
|
||||
|
||||
// 日志通道
|
||||
'channels' => [
|
||||
'file' => [
|
||||
'type' => 'file',
|
||||
'path' => app()->getRuntimePath() . 'log/',
|
||||
'level' => ['info', 'error', 'warning'],
|
||||
'single' => false, // 是否单文件日志
|
||||
'max_files' => 10, // 最大文件数
|
||||
],
|
||||
|
||||
'order' => [
|
||||
'type' => 'file',
|
||||
'path' => app()->getRuntimePath() . 'log/order/',
|
||||
'level' => ['info', 'error'],
|
||||
],
|
||||
|
||||
'pay' => [
|
||||
'type' => 'file',
|
||||
'path' => app()->getRuntimePath() . 'log/pay/',
|
||||
'level' => ['info', 'error'],
|
||||
]
|
||||
]
|
||||
];
|
||||
```
|
||||
|
||||
## 8. 性能优化
|
||||
|
||||
### 8.1 数据库优化
|
||||
|
||||
**使用索引:**
|
||||
```php
|
||||
// 在DAO层中,为常用查询字段添加索引
|
||||
$query = $this->getModel()
|
||||
->where('uid', $uid) // uid应添加索引
|
||||
->where('status', 1) // status应添加索引
|
||||
->where('is_del', 0) // is_del应添加索引
|
||||
->order('id', 'desc');
|
||||
```
|
||||
|
||||
**避免N+1查询:**
|
||||
```php
|
||||
// 错误示例:循环中查询
|
||||
foreach ($orders as $order) {
|
||||
$user = User::find($order['uid']); // 每次循环都查询数据库
|
||||
}
|
||||
|
||||
// 正确示例:预加载
|
||||
$orders = Order::with('user')->select(); // 一次查询关联数据
|
||||
```
|
||||
|
||||
### 8.2 缓存使用
|
||||
|
||||
```php
|
||||
<?php
|
||||
use think\facade\Cache;
|
||||
|
||||
// 设置缓存
|
||||
Cache::set('user_' . $uid, $user, 3600); // 缓存1小时
|
||||
|
||||
// 获取缓存
|
||||
$user = Cache::get('user_' . $uid);
|
||||
if (!$user) {
|
||||
$user = User::find($uid);
|
||||
Cache::set('user_' . $uid, $user, 3600);
|
||||
}
|
||||
|
||||
// 删除缓存
|
||||
Cache::delete('user_' . $uid);
|
||||
|
||||
// 清空缓存
|
||||
Cache::clear();
|
||||
|
||||
// 使用Redis缓存(推荐)
|
||||
Cache::store('redis')->set('key', $value, 3600);
|
||||
```
|
||||
|
||||
### 8.3 队列使用
|
||||
|
||||
```php
|
||||
<?php
|
||||
// 将耗时任务放入队列
|
||||
\think\facade\Queue::push(Job::class, $data, $queue);
|
||||
|
||||
// 示例:订单创建后发送通知
|
||||
class OrderJob
|
||||
{
|
||||
public function fire($job, $data)
|
||||
{
|
||||
// 发送短信通知
|
||||
\app\services\sms\SmsServices::send($data['phone'], 'order_success', [
|
||||
'order_sn' => $data['order_sn']
|
||||
]);
|
||||
|
||||
// 发送模板消息(微信)
|
||||
\app\services\wechat\WechatTemplateServices::sendOrderSuccess($data);
|
||||
|
||||
// 处理完成删除任务
|
||||
$job->delete();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**文档版本**: v1.0.0
|
||||
**最后更新**: 2025-03-17
|
||||
1072
.codebuddy/skills/crmeb-complete/references/code_style.md
Normal file
1072
.codebuddy/skills/crmeb-complete/references/code_style.md
Normal file
File diff suppressed because it is too large
Load Diff
847
.codebuddy/skills/crmeb-complete/references/db_design.md
Normal file
847
.codebuddy/skills/crmeb-complete/references/db_design.md
Normal file
@ -0,0 +1,847 @@
|
||||
# CRMEB数据库设计规范
|
||||
|
||||
## 1. 数据库架构
|
||||
|
||||
### 1.1 数据库配置
|
||||
|
||||
**环境配置(.env文件):**
|
||||
```env
|
||||
[DATABASE]
|
||||
TYPE = mysql
|
||||
HOSTNAME = 127.0.0.1
|
||||
HOSTPORT = 3306
|
||||
USERNAME = root
|
||||
PASSWORD = 123456
|
||||
DATABASE = crmeb
|
||||
PREFIX = eb_
|
||||
CHARSET = utf8mb4
|
||||
DEBUG = false
|
||||
```
|
||||
|
||||
**数据库配置文件(config/database.php):**
|
||||
```php
|
||||
<?php
|
||||
return [
|
||||
// 默认使用的数据库连接
|
||||
'default' => env('database.type', 'mysql'),
|
||||
|
||||
// 数据库连接信息
|
||||
'connections' => [
|
||||
'mysql' => [
|
||||
'type' => 'mysql',
|
||||
'hostname' => env('database.hostname', '127.0.0.1'),
|
||||
'database' => env('database.database', 'crmeb'),
|
||||
'username' => env('database.username', 'root'),
|
||||
'password' => env('database.password', ''),
|
||||
'hostport' => env('database.hostport', '3306'),
|
||||
'charset' => env('database.charset', 'utf8mb4'),
|
||||
'prefix' => env('database.prefix', 'eb_'),
|
||||
'debug' => env('database.debug', false),
|
||||
'deploy' => 0,
|
||||
'rw_separate' => false,
|
||||
'master_num' => 1,
|
||||
'slave_no' => '',
|
||||
'break_reconnect' => false,
|
||||
'trigger_sql' => env('app_debug', true),
|
||||
'fields_strict' => true,
|
||||
'auto_timestamp' => false,
|
||||
],
|
||||
],
|
||||
];
|
||||
```
|
||||
|
||||
### 1.2 数据库设计原则
|
||||
|
||||
**核心原则:**
|
||||
1. **统一前缀**:所有表使用 `eb_` 前缀
|
||||
2. **清晰命名**:表名和字段名应清晰表达其含义
|
||||
3. **适当冗余**:在性能关键处适当冗余,减少JOIN查询
|
||||
4. **索引优化**:为高频查询字段添加索引
|
||||
5. **数据归档**:定期归档历史数据,保持表体积合理
|
||||
6. **字段类型**:选择合适的字段类型,避免浪费空间
|
||||
|
||||
## 2. 表命名规范
|
||||
|
||||
### 2.1 通用规则
|
||||
|
||||
```sql
|
||||
-- ✅ 正确示例
|
||||
eb_user -- 用户表
|
||||
eb_store_product -- 商品表
|
||||
eb_store_order -- 订单表
|
||||
eb_system_config -- 系统配置表
|
||||
|
||||
-- ❌ 错误示例
|
||||
user -- 缺少前缀
|
||||
StoreProduct -- 使用大写
|
||||
systemconfig -- 无下划线
|
||||
```
|
||||
|
||||
### 2.2 模块命名
|
||||
|
||||
**用户模块:**
|
||||
```sql
|
||||
eb_user -- 用户主表
|
||||
eb_user_bill -- 用户账单
|
||||
eb_user_extract -- 用户提现
|
||||
eb_user_recharge -- 用户充值
|
||||
eb_user_level -- 用户等级
|
||||
eb_user_group -- 用户分组
|
||||
eb_user_label -- 用户标签
|
||||
eb_user_sign -- 用户签到
|
||||
eb_user_task -- 用户任务
|
||||
```
|
||||
|
||||
**商品模块:**
|
||||
```sql
|
||||
eb_store_category -- 商品分类
|
||||
eb_store_product -- 商品主表
|
||||
eb_store_product_attr -- 商品属性
|
||||
eb_store_product_attr_result -- 属性结果
|
||||
eb_store_product_description -- 商品详情
|
||||
eb_store_product_relation -- 商品关联(收藏、点赞)
|
||||
eb_store_product_reply -- 商品评价
|
||||
```
|
||||
|
||||
**订单模块:**
|
||||
```sql
|
||||
eb_store_cart -- 购物车
|
||||
eb_store_order -- 订单主表
|
||||
eb_store_order_cart_info -- 订单商品
|
||||
eb_store_order_status -- 订单状态记录
|
||||
eb_store_refund -- 退款记录
|
||||
eb_store_order_invoice -- 发票信息
|
||||
```
|
||||
|
||||
**营销模块:**
|
||||
```sql
|
||||
eb_store_coupon -- 优惠券
|
||||
eb_store_coupon_user -- 用户优惠券
|
||||
eb_store_combination -- 拼团商品
|
||||
eb_store_pink -- 拼团记录
|
||||
eb_store_bargain -- 砍价商品
|
||||
eb_store_seckill -- 秒杀商品
|
||||
eb_store_integral -- 积分商品
|
||||
```
|
||||
|
||||
**分销模块:**
|
||||
```sql
|
||||
eb_agent_level -- 分销等级
|
||||
eb_agent_level_task -- 分销任务
|
||||
eb_spread_user -- 分销员
|
||||
eb_spread_order -- 分销订单
|
||||
eb_spread_commission -- 分销佣金
|
||||
eb_division -- 事业部
|
||||
```
|
||||
|
||||
**系统模块:**
|
||||
```sql
|
||||
eb_system_admin -- 管理员
|
||||
eb_system_role -- 角色
|
||||
eb_system_menus -- 菜单
|
||||
eb_system_config -- 配置
|
||||
eb_system_log -- 操作日志
|
||||
```
|
||||
|
||||
## 3. 字段命名规范
|
||||
|
||||
### 3.1 通用字段
|
||||
|
||||
**主键和ID:**
|
||||
```sql
|
||||
id INT PRIMARY KEY AUTO_INCREMENT -- 主键,所有表必须有
|
||||
```
|
||||
|
||||
**外键:**
|
||||
```sql
|
||||
user_id INT -- 关联用户表
|
||||
category_id INT -- 关联分类表
|
||||
product_id INT -- 关联商品表
|
||||
order_id INT -- 关联订单表
|
||||
```
|
||||
|
||||
**状态字段:**
|
||||
```sql
|
||||
status TINYINT(1) -- 状态(0禁用/下架,1启用/上架)
|
||||
is_del TINYINT(1) -- 是否删除(0未删除,1已删除)
|
||||
is_show TINYINT(1) -- 是否显示(0不显示,1显示)
|
||||
```
|
||||
|
||||
**时间字段:**
|
||||
```sql
|
||||
create_time INT -- 创建时间(时间戳)
|
||||
update_time INT -- 更新时间(时间戳)
|
||||
delete_time INT -- 删除时间(时间戳,用于软删除)
|
||||
```
|
||||
|
||||
### 3.2 字段类型选择
|
||||
|
||||
**整数类型:**
|
||||
```sql
|
||||
-- TINYINT: -128到127(无符号0-255)
|
||||
status TINYINT(1) -- 状态字段
|
||||
type TINYINT(1) -- 类型字段
|
||||
is_del TINYINT(1) -- 删除标记
|
||||
|
||||
-- SMALLINT: -32768到32767(无符号0-65535)
|
||||
category_id SMALLINT -- 分类ID
|
||||
sort SMALLINT -- 排序
|
||||
|
||||
-- INT: -21亿到21亿(无符号0-42亿)
|
||||
id INT -- 主键
|
||||
user_id INT -- 用户ID
|
||||
order_id INT -- 订单ID
|
||||
create_time INT -- 时间戳
|
||||
|
||||
-- BIGINT: 更大范围
|
||||
snowflake_id BIGINT -- 雪花算法ID
|
||||
```
|
||||
|
||||
**小数类型:**
|
||||
```sql
|
||||
-- DECIMAL: 精确小数(推荐用于金额)
|
||||
price DECIMAL(10,2) -- 价格(最多10位,小数2位)
|
||||
total_price DECIMAL(10,2) -- 总价
|
||||
commission DECIMAL(10,2) -- 佣金
|
||||
|
||||
-- FLOAT/DOUBLE: 非精确小数(少用)
|
||||
weight FLOAT -- 重量(可接受精度损失)
|
||||
```
|
||||
|
||||
**字符串类型:**
|
||||
```sql
|
||||
-- VARCHAR: 变长字符串
|
||||
account VARCHAR(30) -- 账号
|
||||
phone VARCHAR(11) -- 手机号
|
||||
real_name VARCHAR(50) -- 真实姓名
|
||||
nickname VARCHAR(50) -- 昵称
|
||||
title VARCHAR(255) -- 标题
|
||||
image VARCHAR(255) -- 图片路径
|
||||
|
||||
-- TEXT: 长文本
|
||||
description TEXT -- 商品描述
|
||||
content TEXT -- 文章内容
|
||||
remark TEXT -- 备注
|
||||
```
|
||||
|
||||
**时间类型:**
|
||||
```sql
|
||||
-- INT存储时间戳(推荐,灵活)
|
||||
create_time INT -- 创建时间
|
||||
|
||||
-- DATETIME(可视性好,但时区不灵活)
|
||||
create_time DATETIME -- 创建时间
|
||||
```
|
||||
|
||||
## 4. 核心表结构详解
|
||||
|
||||
### 4.1 用户表(eb_user)
|
||||
|
||||
```sql
|
||||
CREATE TABLE `eb_user` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
|
||||
`account` varchar(30) NOT NULL DEFAULT '' COMMENT '账号',
|
||||
`pwd` varchar(255) NOT NULL DEFAULT '' COMMENT '密码',
|
||||
`real_name` varchar(50) NOT NULL DEFAULT '' COMMENT '真实姓名',
|
||||
`nickname` varchar(50) NOT NULL DEFAULT '' COMMENT '昵称',
|
||||
`avatar` varchar(255) NOT NULL DEFAULT '' COMMENT '头像',
|
||||
`phone` varchar(11) NOT NULL DEFAULT '' COMMENT '手机号',
|
||||
`sex` tinyint(1) NOT NULL DEFAULT '0' COMMENT '性别(0未知,1男,2女)',
|
||||
`birthday` int(11) NOT NULL DEFAULT '0' COMMENT '生日',
|
||||
`level` tinyint(1) NOT NULL DEFAULT '0' COMMENT '会员等级',
|
||||
`group_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户分组ID',
|
||||
`label_id` varchar(255) NOT NULL DEFAULT '' COMMENT '用户标签ID(多个用逗号分隔)',
|
||||
`money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '余额',
|
||||
`integral` int(11) NOT NULL DEFAULT '0' COMMENT '积分',
|
||||
`spread_uid` int(11) NOT NULL DEFAULT '0' COMMENT '推广人UID',
|
||||
`spread_time` int(11) NOT NULL DEFAULT '0' COMMENT '推广时间',
|
||||
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态(0禁用,1启用)',
|
||||
`is_del` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除',
|
||||
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
|
||||
`update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idx_account` (`account`),
|
||||
UNIQUE KEY `idx_phone` (`phone`),
|
||||
KEY `idx_spread_uid` (`spread_uid`),
|
||||
KEY `idx_status` (`status`),
|
||||
KEY `idx_create_time` (`create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
|
||||
```
|
||||
|
||||
**索引说明:**
|
||||
- `PRIMARY KEY (id)`:主键索引
|
||||
- `idx_account`:账号唯一索引
|
||||
- `idx_phone`:手机号唯一索引
|
||||
- `idx_spread_uid`:推广人ID索引(用于分销查询)
|
||||
- `idx_status`:状态索引(用于筛选启用用户)
|
||||
- `idx_create_time`:创建时间索引(用于时间范围查询)
|
||||
|
||||
### 4.2 商品表(eb_store_product)
|
||||
|
||||
```sql
|
||||
CREATE TABLE `eb_store_product` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品ID',
|
||||
`mer_id` int(11) NOT NULL DEFAULT '0' COMMENT '商户ID',
|
||||
`cate_id` int(11) NOT NULL DEFAULT '0' COMMENT '分类ID',
|
||||
`store_name` varchar(255) NOT NULL DEFAULT '' COMMENT '商品名称',
|
||||
`store_info` varchar(500) NOT NULL DEFAULT '' COMMENT '商品简介',
|
||||
`keyword` varchar(255) NOT NULL DEFAULT '' COMMENT '关键字',
|
||||
`bar_code` varchar(50) NOT NULL DEFAULT '' COMMENT '商品条码',
|
||||
`image` varchar(255) NOT NULL DEFAULT '' COMMENT '商品主图',
|
||||
`slider_image` text COMMENT '商品轮播图(JSON数组)',
|
||||
`description` longtext COMMENT '商品详情',
|
||||
`spec_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '规格类型(0单规格,1多规格)',
|
||||
`price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品价格',
|
||||
`cost` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品成本价',
|
||||
`ot_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品原价',
|
||||
`stock` int(11) NOT NULL DEFAULT '0' COMMENT '商品库存',
|
||||
`sales` int(11) NOT NULL DEFAULT '0' COMMENT '商品销量',
|
||||
`unit_name` varchar(50) NOT NULL DEFAULT '件' COMMENT '商品单位',
|
||||
`is_show` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否上架(0下架,1上架)',
|
||||
`is_hot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否热销',
|
||||
`is_benefit` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否优惠',
|
||||
`is_best` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否精品',
|
||||
`is_new` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否新品',
|
||||
`is_good` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否优品',
|
||||
`is_postage` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否包邮',
|
||||
`sort` smallint(6) NOT NULL DEFAULT '0' COMMENT '排序',
|
||||
`give_integral` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '赠送积分',
|
||||
`is_del` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除',
|
||||
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '审核状态(0未审核,1已审核)',
|
||||
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
|
||||
`update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_cate_id` (`cate_id`),
|
||||
KEY `idx_mer_id` (`mer_id`),
|
||||
KEY `idx_is_show` (`is_show`),
|
||||
KEY `idx_is_hot` (`is_hot`),
|
||||
KEY `idx_is_new` (`is_new`),
|
||||
KEY `idx_sort` (`sort`),
|
||||
KEY `idx_create_time` (`create_time`),
|
||||
FULLTEXT KEY `idx_keyword` (`keyword`,`store_name`,`store_info`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
|
||||
```
|
||||
|
||||
### 4.3 订单表(eb_store_order)
|
||||
|
||||
```sql
|
||||
CREATE TABLE `eb_store_order` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
|
||||
`order_id` varchar(32) NOT NULL DEFAULT '' COMMENT '订单号(唯一)',
|
||||
`uid` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID',
|
||||
`real_name` varchar(50) NOT NULL DEFAULT '' COMMENT '收货人姓名',
|
||||
`user_phone` varchar(20) NOT NULL DEFAULT '' COMMENT '收货人电话',
|
||||
`user_address` varchar(255) NOT NULL DEFAULT '' COMMENT '收货地址',
|
||||
`cart_id` text COMMENT '购物车ID',
|
||||
`total_num` int(11) NOT NULL DEFAULT '0' COMMENT '商品总数',
|
||||
`total_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品总价',
|
||||
`total_postage` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '邮费',
|
||||
`pay_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '实际支付金额',
|
||||
`pay_postage` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '实际支付邮费',
|
||||
`deduction_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '抵扣金额',
|
||||
`coupon_id` int(11) NOT NULL DEFAULT '0' COMMENT '优惠券ID',
|
||||
`coupon_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '优惠券金额',
|
||||
`paid` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否支付(0未支付,1已支付)',
|
||||
`pay_time` int(11) NOT NULL DEFAULT '0' COMMENT '支付时间',
|
||||
`pay_type` varchar(20) NOT NULL DEFAULT '' COMMENT '支付方式',
|
||||
`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '订单状态(0未支付,1待发货,2待收货,3已完成,-1已取消,-2退款中,-3已退款)',
|
||||
`refund_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '退款状态',
|
||||
`refund_reason` varchar(255) NOT NULL DEFAULT '' COMMENT '退款原因',
|
||||
`refund_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '退款金额',
|
||||
`delivery_name` varchar(50) NOT NULL DEFAULT '' COMMENT '快递公司名称',
|
||||
`delivery_id` varchar(50) NOT NULL DEFAULT '' COMMENT '快递单号',
|
||||
`delivery_type` varchar(20) NOT NULL DEFAULT 'express' COMMENT '配送方式(express快递,send商家配送,pick自取)',
|
||||
`delivery_time` int(11) NOT NULL DEFAULT '0' COMMENT '发货时间',
|
||||
`gain_integral` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '赠送积分',
|
||||
`mark` varchar(500) NOT NULL DEFAULT '' COMMENT '买家备注',
|
||||
`remark` varchar(500) NOT NULL DEFAULT '' COMMENT '商家备注',
|
||||
`cost` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '成本价',
|
||||
`is_del` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除',
|
||||
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
|
||||
`update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idx_order_id` (`order_id`),
|
||||
KEY `idx_uid` (`uid`),
|
||||
KEY `idx_paid` (`paid`),
|
||||
KEY `idx_status` (`status`),
|
||||
KEY `idx_pay_time` (`pay_time`),
|
||||
KEY `idx_create_time` (`create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
|
||||
```
|
||||
|
||||
## 5. 索引设计规范
|
||||
|
||||
### 5.1 索引使用原则
|
||||
|
||||
**必须添加索引的场景:**
|
||||
1. 主键字段
|
||||
2. 外键字段
|
||||
3. WHERE条件中的字段
|
||||
4. ORDER BY排序字段
|
||||
5. JOIN关联字段
|
||||
6. 唯一性约束字段
|
||||
|
||||
**索引命名规范:**
|
||||
- 主键索引:`PRIMARY`
|
||||
- 唯一索引:`uk_字段名` 或 `idx_字段名`
|
||||
- 普通索引:`idx_字段名`
|
||||
- 组合索引:`idx_字段1_字段2`
|
||||
- 全文索引:`ft_字段名`
|
||||
|
||||
**示例:**
|
||||
```sql
|
||||
-- 主键索引(自动创建)
|
||||
PRIMARY KEY (`id`)
|
||||
|
||||
-- 唯一索引
|
||||
UNIQUE KEY `uk_account` (`account`)
|
||||
UNIQUE KEY `uk_phone` (`phone`)
|
||||
UNIQUE KEY `uk_order_id` (`order_id`)
|
||||
|
||||
-- 普通索引
|
||||
KEY `idx_user_id` (`user_id`)
|
||||
KEY `idx_status` (`status`)
|
||||
KEY `idx_create_time` (`create_time`)
|
||||
|
||||
-- 组合索引
|
||||
KEY `idx_user_status` (`user_id`, `status`)
|
||||
KEY `idx_create_type` (`create_time`, `type`)
|
||||
|
||||
-- 全文索引
|
||||
FULLTEXT KEY `ft_keyword` (`keyword`, `name`)
|
||||
```
|
||||
|
||||
### 5.2 组合索引最左前缀原则
|
||||
|
||||
**正确示例:**
|
||||
```sql
|
||||
-- 创建组合索引
|
||||
KEY `idx_user_status_time` (`user_id`, `status`, `create_time`)
|
||||
|
||||
-- 以下查询会使用索引
|
||||
WHERE user_id = 1
|
||||
WHERE user_id = 1 AND status = 1
|
||||
WHERE user_id = 1 AND status = 1 AND create_time > 1234567890
|
||||
WHERE user_id = 1 AND create_time > 1234567890 -- 部分使用
|
||||
|
||||
-- 以下查询不会使用索引
|
||||
WHERE status = 1 -- 缺少最左列user_id
|
||||
WHERE create_time > 1234567890 -- 缺少最左列user_id
|
||||
WHERE status = 1 AND create_time > 1234567890 -- 缺少最左列user_id
|
||||
```
|
||||
|
||||
### 5.3 索引优化建议
|
||||
|
||||
1. **选择性高的列放前面**:区分度高的字段放在组合索引前面
|
||||
2. **避免过多索引**:每个表索引数量不超过6个
|
||||
3. **避免冗余索引**:idx_a_b和idx_a是冗余的
|
||||
4. **定期维护索引**:使用 `OPTIMIZE TABLE` 优化表
|
||||
5. **监控索引使用**:使用 `EXPLAIN` 分析查询
|
||||
|
||||
**使用EXPLAIN分析:**
|
||||
```sql
|
||||
EXPLAIN SELECT * FROM eb_store_order WHERE user_id = 1 AND status = 1;
|
||||
|
||||
-- 输出解读:
|
||||
-- type: ALL(全表扫描,性能差)
|
||||
-- type: const(主键查询,性能最好)
|
||||
-- type: ref(索引查找,性能好)
|
||||
-- type: range(范围查询,性能较好)
|
||||
-- key: 使用的索引名
|
||||
-- rows: 扫描的行数(越少越好)
|
||||
```
|
||||
|
||||
## 6. 数据类型优化
|
||||
|
||||
### 6.1 整数类型选择
|
||||
|
||||
| 类型 | 有符号范围 | 无符号范围 | 占用空间 | 适用场景 |
|
||||
|------|-----------|-----------|----------|----------|
|
||||
| TINYINT | -128~127 | 0~255 | 1字节 | 状态、布尔值、小范围枚举 |
|
||||
| SMALLINT | -32768~32767 | 0~65535 | 2字节 | 分类ID、排序 |
|
||||
| INT | -21亿~21亿 | 0~42亿 | 4字节 | 主键、用户ID、订单ID |
|
||||
| BIGINT | 很大 | 很大 | 8字节 | 雪花算法ID、大数值 |
|
||||
|
||||
**示例:**
|
||||
```sql
|
||||
-- 状态字段使用TINYINT
|
||||
status TINYINT(1) NOT NULL DEFAULT '1'
|
||||
is_del TINYINT(1) NOT NULL DEFAULT '0'
|
||||
type TINYINT(1) NOT NULL DEFAULT '0'
|
||||
|
||||
-- 主键使用INT或BIGINT
|
||||
id INT(11) NOT NULL AUTO_INCREMENT
|
||||
id BIGINT(20) NOT NULL AUTO_INCREMENT -- 分布式ID
|
||||
|
||||
-- 分类ID、排序使用SMALLINT
|
||||
cate_id SMALLINT(6) NOT NULL DEFAULT '0'
|
||||
sort SMALLINT(6) NOT NULL DEFAULT '0'
|
||||
```
|
||||
|
||||
### 6.2 小数类型选择
|
||||
|
||||
**金额使用DECIMAL(精确计算):**
|
||||
```sql
|
||||
-- 正确:金额使用DECIMAL
|
||||
price DECIMAL(10,2) NOT NULL DEFAULT '0.00'
|
||||
total_price DECIMAL(10,2) NOT NULL DEFAULT '0.00'
|
||||
commission DECIMAL(10,2) NOT NULL DEFAULT '0.00'
|
||||
|
||||
-- 参数说明:DECIMAL(M, D)
|
||||
-- M: 总位数(整数+小数)
|
||||
-- D: 小数位数
|
||||
|
||||
-- DECIMAL(10,2) 范围:-99999999.99 到 99999999.99
|
||||
```
|
||||
|
||||
**避免使用FLOAT/DOUBLE存储金额:**
|
||||
```sql
|
||||
-- 错误:FLOAT/DOUBLE无法精确表示小数
|
||||
price FLOAT -- 可能导致精度丢失
|
||||
price DOUBLE -- 可能导致精度丢失
|
||||
```
|
||||
|
||||
### 6.3 字符串类型选择
|
||||
|
||||
**VARCHAR vs TEXT:**
|
||||
```sql
|
||||
-- VARCHAR:变长,占用实际长度+1-2字节
|
||||
-- 适合短字符串,有长度限制
|
||||
account VARCHAR(30) -- 账号
|
||||
phone VARCHAR(11) -- 手机号
|
||||
real_name VARCHAR(50) -- 姓名
|
||||
title VARCHAR(255) -- 标题
|
||||
|
||||
-- TEXT:长文本,占用额外空间
|
||||
-- 适合长内容,无长度限制
|
||||
description TEXT -- 商品描述
|
||||
content TEXT -- 文章内容
|
||||
remark TEXT -- 备注
|
||||
|
||||
-- 性能考虑:
|
||||
-- 1. VARCHAR可以创建索引,TEXT只能创建前缀索引
|
||||
-- 2. VARCHAR查询性能更好
|
||||
-- 3. TEXT字段会单独存储,查询时需要额外IO
|
||||
```
|
||||
|
||||
### 6.4 时间存储方式
|
||||
|
||||
**时间戳(INT)vs DATETIME:**
|
||||
|
||||
```sql
|
||||
-- 方案1:使用INT存储时间戳(推荐)
|
||||
create_time INT(11) NOT NULL DEFAULT '0'
|
||||
|
||||
-- 优点:
|
||||
-- 1. 时区灵活,可根据用户时区转换
|
||||
-- 2. 计算方便(加减秒数)
|
||||
-- 3. 占用空间小(4字节)
|
||||
-- 4. 兼容性好
|
||||
|
||||
-- 缺点:
|
||||
-- 1. 不直观,需转换才能查看
|
||||
-- 2. 范围有限(2038年问题)
|
||||
|
||||
-- 方案2:使用DATETIME
|
||||
-- create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||
|
||||
-- 优点:
|
||||
-- 1. 直观,可直接查看时间
|
||||
-- 2. 支持日期函数(YEAR(), MONTH()等)
|
||||
|
||||
-- 缺点:
|
||||
-- 1. 时区不灵活
|
||||
-- 2. 占用空间大(5-8字节)
|
||||
-- 3. 性能略差
|
||||
```
|
||||
|
||||
## 7. 关联查询设计
|
||||
|
||||
### 7.1 一对多关系
|
||||
|
||||
**示例:用户和订单**
|
||||
```sql
|
||||
-- 用户表(一)
|
||||
CREATE TABLE `eb_user` (
|
||||
`id` int(11) PRIMARY KEY,
|
||||
`account` varchar(30),
|
||||
...
|
||||
);
|
||||
|
||||
-- 订单表(多)
|
||||
CREATE TABLE `eb_store_order` (
|
||||
`id` int(11) PRIMARY KEY,
|
||||
`user_id` int(11) NOT NULL, -- 关联用户表
|
||||
`order_id` varchar(32),
|
||||
...
|
||||
KEY `idx_user_id` (`user_id`) -- 添加索引
|
||||
);
|
||||
|
||||
-- 查询用户的所有订单
|
||||
SELECT o.*
|
||||
FROM eb_store_order o
|
||||
JOIN eb_user u ON o.user_id = u.id
|
||||
WHERE u.id = 1;
|
||||
```
|
||||
|
||||
### 7.2 多对多关系
|
||||
|
||||
**示例:用户和角色**
|
||||
```sql
|
||||
-- 用户表
|
||||
CREATE TABLE `eb_system_admin` (
|
||||
`id` int(11) PRIMARY KEY,
|
||||
`account` varchar(30),
|
||||
...
|
||||
);
|
||||
|
||||
-- 角色表
|
||||
CREATE TABLE `eb_system_role` (
|
||||
`id` int(11) PRIMARY KEY,
|
||||
`role_name` varchar(50),
|
||||
...
|
||||
);
|
||||
|
||||
-- 中间表(用户-角色关联)
|
||||
CREATE TABLE `eb_system_admin_role` (
|
||||
`admin_id` int(11) NOT NULL, -- 用户ID
|
||||
`role_id` int(11) NOT NULL, -- 角色ID
|
||||
PRIMARY KEY (`admin_id`, `role_id`), -- 联合主键
|
||||
KEY `idx_admin_id` (`admin_id`),
|
||||
KEY `idx_role_id` (`role_id`)
|
||||
);
|
||||
|
||||
-- 查询用户拥有的角色
|
||||
SELECT r.*
|
||||
FROM eb_system_role r
|
||||
JOIN eb_system_admin_role ar ON r.id = ar.role_id
|
||||
WHERE ar.admin_id = 1;
|
||||
|
||||
-- 查询拥有某角色的所有用户
|
||||
SELECT a.*
|
||||
FROM eb_system_admin a
|
||||
JOIN eb_system_admin_role ar ON a.id = ar.admin_id
|
||||
WHERE ar.role_id = 1;
|
||||
```
|
||||
|
||||
### 7.3 一对一关系
|
||||
|
||||
**示例:用户和用户详情**
|
||||
```sql
|
||||
-- 用户主表
|
||||
CREATE TABLE `eb_user` (
|
||||
`id` int(11) PRIMARY KEY,
|
||||
`account` varchar(30),
|
||||
...
|
||||
);
|
||||
|
||||
-- 用户详情表
|
||||
CREATE TABLE `eb_user_info` (
|
||||
`id` int(11) PRIMARY KEY,
|
||||
`user_id` int(11) NOT NULL, -- 关联用户ID
|
||||
`birthday` int(11),
|
||||
`address` varchar(255),
|
||||
...
|
||||
UNIQUE KEY `uk_user_id` (`user_id`) -- 唯一索引,确保一对一
|
||||
);
|
||||
|
||||
-- 查询用户详情
|
||||
SELECT u.*, ui.birthday, ui.address
|
||||
FROM eb_user u
|
||||
LEFT JOIN eb_user_info ui ON u.id = ui.user_id
|
||||
WHERE u.id = 1;
|
||||
```
|
||||
|
||||
## 8. 性能优化建议
|
||||
|
||||
### 8.1 表分区
|
||||
|
||||
**按时间分区(适用于大表):**
|
||||
```sql
|
||||
-- 订单表按月分区
|
||||
CREATE TABLE `eb_store_order` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`order_id` varchar(32),
|
||||
`create_time` int(11),
|
||||
...
|
||||
) ENGINE=InnoDB
|
||||
PARTITION BY RANGE (create_time) (
|
||||
PARTITION p202501 VALUES LESS THAN (1735689600), -- 2025-01-01
|
||||
PARTITION p202502 VALUES LESS THAN (1738368000), -- 2025-02-01
|
||||
PARTITION p202503 VALUES LESS THAN (1740950400), -- 2025-03-01
|
||||
PARTITION p202504 VALUES LESS THAN (1743628800), -- 2025-04-01
|
||||
PARTITION p_max VALUES LESS THAN MAXVALUE
|
||||
);
|
||||
|
||||
-- 优点:
|
||||
-- 1. 提高查询性能(只扫描相关分区)
|
||||
-- 2. 方便数据归档(删除旧分区)
|
||||
-- 3. 分散IO压力
|
||||
```
|
||||
|
||||
### 8.2 分表策略
|
||||
|
||||
**水平分表(按ID取模):**
|
||||
```php
|
||||
<?php
|
||||
// 用户订单分表
|
||||
$userId = 12345;
|
||||
$tableSuffix = $userId % 10; // 分成10张表
|
||||
$tableName = "eb_store_order_{$tableSuffix}";
|
||||
|
||||
// 查询订单
|
||||
$orders = Db::name($tableName)
|
||||
->where('user_id', $userId)
|
||||
->select();
|
||||
|
||||
-- 分表规则:
|
||||
-- eb_store_order_0: user_id取模为0
|
||||
-- eb_store_order_1: user_id取模为1
|
||||
-- ...
|
||||
-- eb_store_order_9: user_id取模为9
|
||||
```
|
||||
|
||||
**垂直分表(按字段热度):**
|
||||
```sql
|
||||
-- 商品主表(常用字段)
|
||||
CREATE TABLE `eb_store_product` (
|
||||
`id` int(11) PRIMARY KEY,
|
||||
`store_name` varchar(255),
|
||||
`price` decimal(10,2),
|
||||
`stock` int(11),
|
||||
...
|
||||
);
|
||||
|
||||
-- 商品详情表(不常用字段)
|
||||
CREATE TABLE `eb_store_product_detail` (
|
||||
`product_id` int(11) PRIMARY KEY,
|
||||
`description` longtext, -- 详情(不常查询)
|
||||
`slider_image` text, -- 轮播图(不常查询)
|
||||
`parameter` text, -- 参数(不常查询)
|
||||
...
|
||||
);
|
||||
```
|
||||
|
||||
### 8.3 读写分离
|
||||
|
||||
**主从复制架构:**
|
||||
```php
|
||||
<?php
|
||||
// 主库(写操作)
|
||||
'master' => [
|
||||
'type' => 'mysql',
|
||||
'hostname' => '192.168.1.1',
|
||||
'username' => 'root',
|
||||
'password' => 'password',
|
||||
'hostport' => '3306',
|
||||
],
|
||||
|
||||
// 从库(读操作)
|
||||
'slaves' => [
|
||||
[
|
||||
'type' => 'mysql',
|
||||
'hostname' => '192.168.1.2',
|
||||
'username' => 'root',
|
||||
'password' => 'password',
|
||||
'hostport' => '3306',
|
||||
],
|
||||
[
|
||||
'type' => 'mysql',
|
||||
'hostname' => '192.168.1.3',
|
||||
'username' => 'root',
|
||||
'password' => 'password',
|
||||
'hostport' => '3306',
|
||||
],
|
||||
]
|
||||
|
||||
// 在DAO层指定读写
|
||||
// 写操作(主库)
|
||||
Db::name('user')->insert($data);
|
||||
|
||||
// 读操作(从库)
|
||||
Db::name('user')->readMaster(false)->find($id);
|
||||
```
|
||||
|
||||
### 8.4 慢查询优化
|
||||
|
||||
**开启慢查询日志:**
|
||||
```ini
|
||||
# MySQL配置文件my.cnf
|
||||
[mysqld]
|
||||
slow_query_log = 1
|
||||
slow_query_log_file = /var/log/mysql/slow.log
|
||||
long_query_time = 2 # 超过2秒的查询记录
|
||||
log_queries_not_using_indexes = 1
|
||||
```
|
||||
|
||||
**优化慢查询:**
|
||||
```sql
|
||||
-- 1. 使用EXPLAIN分析
|
||||
EXPLAIN SELECT * FROM eb_store_order
|
||||
WHERE user_id = 1 AND status = 1
|
||||
ORDER BY id DESC;
|
||||
|
||||
-- 2. 添加合适的索引
|
||||
CREATE INDEX idx_user_status ON eb_store_order(user_id, status);
|
||||
|
||||
-- 3. 优化查询语句
|
||||
-- 错误:SELECT *(查询所有字段)
|
||||
-- 正确:只查询需要的字段
|
||||
SELECT id, order_id, pay_price FROM eb_store_order
|
||||
WHERE user_id = 1 AND status = 1;
|
||||
|
||||
-- 4. 避免使用函数在WHERE条件中
|
||||
-- 错误:WHERE DATE(create_time) = '2025-01-01'
|
||||
-- 正确:WHERE create_time >= 1735689600 AND create_time < 1735776000
|
||||
```
|
||||
|
||||
## 9. 数据备份与恢复
|
||||
|
||||
### 9.1 备份策略
|
||||
|
||||
**定期备份:**
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# 备份脚本 backup.sh
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_DIR="/backup/mysql"
|
||||
|
||||
# 全量备份
|
||||
mysqldump -u root -p'password' crmeb > $BACKUP_DIR/crmeb_full_$DATE.sql
|
||||
|
||||
# 压缩备份
|
||||
gzip $BACKUP_DIR/crmeb_full_$DATE.sql
|
||||
|
||||
# 保留最近7天的备份
|
||||
find $BACKUP_DIR -name "crmeb_full_*.sql.gz" -mtime +7 -delete
|
||||
```
|
||||
|
||||
### 9.2 数据恢复
|
||||
|
||||
```bash
|
||||
# 恢复数据
|
||||
gunzip /backup/mysql/crmeb_full_20250317_000000.sql.gz
|
||||
mysql -u root -p'password' crmeb < /backup/mysql/crmeb_full_20250317_000000.sql
|
||||
```
|
||||
|
||||
## 10. 数据库监控
|
||||
|
||||
### 10.1 监控指标
|
||||
|
||||
**关键指标:**
|
||||
- QPS(每秒查询数)
|
||||
- TPS(每秒事务数)
|
||||
- 慢查询数量
|
||||
- 连接数
|
||||
- 缓存命中率
|
||||
- 磁盘IO
|
||||
- 表空间使用率
|
||||
|
||||
**监控工具:**
|
||||
- MySQL自带:`SHOW STATUS`, `SHOW PROCESSLIST`
|
||||
- 第三方:Prometheus + Grafana, Percona Monitoring
|
||||
|
||||
---
|
||||
|
||||
**文档版本**: v1.0.0
|
||||
**最后更新**: 2025-03-17
|
||||
411
.codebuddy/skills/crmeb-complete/references/quick_start.md
Normal file
411
.codebuddy/skills/crmeb-complete/references/quick_start.md
Normal file
@ -0,0 +1,411 @@
|
||||
# CRMEB快速开始指南
|
||||
|
||||
## 环境准备
|
||||
|
||||
### 1.1 安装Docker(推荐)
|
||||
|
||||
```bash
|
||||
# MacOS
|
||||
brew install docker
|
||||
|
||||
# 启动Docker
|
||||
open /Applications/Docker.app
|
||||
```
|
||||
|
||||
### 1.2 克隆项目
|
||||
|
||||
```bash
|
||||
git clone https://gitee.com/ZhongBangKeJi/CRMEB.git
|
||||
cd CRMEB
|
||||
```
|
||||
|
||||
### 1.3 启动服务
|
||||
|
||||
```bash
|
||||
# 使用docker-compose启动
|
||||
docker-compose up -d
|
||||
|
||||
# 查看日志
|
||||
docker-compose logs -f
|
||||
|
||||
# 查看运行状态
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
**输出示例:**
|
||||
```
|
||||
NAME COMMAND SERVICE STATUS PORTS
|
||||
crmeb_mysql "docker-entrypoint.s…" mysql running 0.0.0.0:33061->3306/tcp
|
||||
crmeb_redis "docker-entrypoint.s…" redis running 0.0.0.0:63791->6379/tcp
|
||||
crmeb_php "docker-php-entrypoi…" phpfpm running 0.0.0.0:9000->9000/tcp, 0.0.0.0:40001-40002->40001-40002/tcp
|
||||
crmeb_nginx "/docker-entrypoint.…" nginx running 0.0.0.0:8011->80/tcp
|
||||
```
|
||||
|
||||
### 1.4 访问系统
|
||||
|
||||
**后台管理:**
|
||||
- URL: http://localhost:8011/admin
|
||||
- 账号: admin
|
||||
- 密码: crmeb.com
|
||||
|
||||
**前端商城:**
|
||||
- URL: http://localhost:8011
|
||||
- 移动端: 浏览器模拟手机访问
|
||||
|
||||
**数据库:**
|
||||
- Host: localhost:33061
|
||||
- 账号: root
|
||||
- 密码: 123456
|
||||
- 数据库: crmeb
|
||||
|
||||
**Redis:**
|
||||
- Host: localhost:63791
|
||||
- 密码: 123456
|
||||
|
||||
### 1.5 启动后台服务
|
||||
|
||||
```bash
|
||||
# 进入PHP容器
|
||||
docker exec -it crmeb_php bash
|
||||
|
||||
# 在容器内启动队列(必须)
|
||||
php think queue:listen --queue
|
||||
|
||||
# 启动定时任务(可选)
|
||||
php think timer start --d
|
||||
|
||||
# 启动WebSocket(可选,用于实时通知)
|
||||
php think workerman start --d
|
||||
```
|
||||
|
||||
## 手动安装(非Docker)
|
||||
|
||||
### 2.1 环境要求
|
||||
|
||||
- PHP 7.1 - 7.4
|
||||
- MySQL 5.7+
|
||||
- Redis 5.0+(可选)
|
||||
- Composer
|
||||
- Node.js 14+
|
||||
|
||||
### 2.2 安装步骤
|
||||
|
||||
```bash
|
||||
# 1. 安装PHP依赖
|
||||
cd crmeb
|
||||
composer install
|
||||
|
||||
# 如果安装慢,使用国内镜像
|
||||
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
|
||||
composer install
|
||||
|
||||
# 2. 配置环境变量
|
||||
cp .env.example .env
|
||||
|
||||
# 3. 修改.env配置文件
|
||||
APP_DEBUG = false
|
||||
|
||||
[APP]
|
||||
DEFAULT_TIMEZONE = Asia/Shanghai
|
||||
|
||||
[DATABASE]
|
||||
TYPE = mysql
|
||||
HOSTNAME = 127.0.0.1
|
||||
HOSTPORT = 3306
|
||||
USERNAME = root
|
||||
PASSWORD = your_password
|
||||
DATABASE = crmeb
|
||||
PREFIX = eb_
|
||||
CHARSET = utf8mb4
|
||||
|
||||
[REDIS]
|
||||
REDIS_HOSTNAME = 127.0.0.1
|
||||
PORT = 6379
|
||||
REDIS_PASSWORD = your_password
|
||||
SELECT = 0
|
||||
|
||||
# 4. 导入数据库
|
||||
mysql -u root -p crmeb < database.sql
|
||||
|
||||
# 5. 设置目录权限
|
||||
chmod -R 755 runtime
|
||||
chmod -R 755 public/uploads
|
||||
|
||||
# 6. 配置Nginx/Apache
|
||||
# Nginx配置示例:
|
||||
server {
|
||||
listen 80;
|
||||
server_name your-domain.com;
|
||||
root /path/to/CRMEB/crmeb/public;
|
||||
index index.php index.html;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php?$query_string;
|
||||
}
|
||||
|
||||
location ~ \.php$ {
|
||||
fastcgi_pass 127.0.0.1:9000;
|
||||
fastcgi_index index.php;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
include fastcgi_params;
|
||||
}
|
||||
}
|
||||
|
||||
# 7. 启动队列(必须)
|
||||
php think queue:listen --queue
|
||||
|
||||
# 8. 启动定时任务(可选)
|
||||
php think timer start --d
|
||||
|
||||
# 9. 启动WebSocket(可选)
|
||||
php think workerman start --d
|
||||
```
|
||||
|
||||
### 2.3 前端构建
|
||||
|
||||
**管理端:**
|
||||
```bash
|
||||
cd template/admin
|
||||
|
||||
# 安装依赖
|
||||
npm install
|
||||
|
||||
# 开发环境
|
||||
npm run dev
|
||||
|
||||
# 生产构建
|
||||
npm run build
|
||||
```
|
||||
|
||||
**移动端(UniApp):**
|
||||
```bash
|
||||
cd template/uni-app
|
||||
|
||||
# 安装依赖
|
||||
npm install
|
||||
|
||||
# 开发环境 - H5
|
||||
npm run dev:h5
|
||||
|
||||
# 开发环境 - 微信小程序
|
||||
npm run dev:mp-weixin
|
||||
|
||||
# 生产构建 - H5
|
||||
npm run build:h5
|
||||
|
||||
# 生产构建 - 微信小程序
|
||||
npm run build:mp-weixin
|
||||
```
|
||||
|
||||
## 验证安装
|
||||
|
||||
### 3.1 检查后端API
|
||||
|
||||
```bash
|
||||
# 使用curl测试API
|
||||
curl http://localhost:8011/api/index
|
||||
|
||||
# 预期响应
|
||||
{"code":200,"msg":"ok","data":{...}}
|
||||
```
|
||||
|
||||
### 3.2 检查队列
|
||||
|
||||
```bash
|
||||
# 进入PHP容器
|
||||
docker exec -it crmeb_php bash
|
||||
|
||||
# 查看队列状态
|
||||
php think queue:status
|
||||
```
|
||||
|
||||
### 3.3 检查定时任务
|
||||
|
||||
```bash
|
||||
# 查看定时任务状态
|
||||
php think timer status
|
||||
```
|
||||
|
||||
### 3.4 检查WebSocket
|
||||
|
||||
```bash
|
||||
# 查看WebSocket服务状态
|
||||
php think workerman status
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
### 4.1 Docker容器无法启动
|
||||
|
||||
**问题:**
|
||||
```
|
||||
Error: Ports are not available: exposing port TCP 0.0.0.0:33061
|
||||
```
|
||||
|
||||
**解决:**
|
||||
```bash
|
||||
# 检查端口占用
|
||||
lsof -i :33061
|
||||
lsof -i :63791
|
||||
lsof -i :8011
|
||||
|
||||
# 杀死占用进程
|
||||
kill -9 <PID>
|
||||
|
||||
# 修改docker-compose.yml中的端口映射
|
||||
# 例如:将 "33061:3306" 改为 "33062:3306"
|
||||
```
|
||||
|
||||
### 4.2 MySQL连接失败
|
||||
|
||||
**问题:**
|
||||
```
|
||||
SQLSTATE[HY000] [2002] Connection refused
|
||||
```
|
||||
|
||||
**解决:**
|
||||
```bash
|
||||
# 检查MySQL容器状态
|
||||
docker ps | grep mysql
|
||||
|
||||
# 查看MySQL日志
|
||||
docker logs crmeb_mysql
|
||||
|
||||
# 检查.env配置
|
||||
# 使用Docker时HOSTNAME应为crmeb_mysql
|
||||
# 手动安装时HOSTNAME应为127.0.0.1
|
||||
|
||||
# 测试MySQL连接
|
||||
docker exec -it crmeb_mysql mysql -u root -p
|
||||
```
|
||||
|
||||
### 4.3 Redis连接失败
|
||||
|
||||
**问题:**
|
||||
```
|
||||
RedisException: Connection refused
|
||||
```
|
||||
|
||||
**解决:**
|
||||
```bash
|
||||
# 检查Redis容器状态
|
||||
docker ps | grep redis
|
||||
|
||||
# 测试Redis连接
|
||||
docker exec -it crmeb_redis redis-cli -a 123456 ping
|
||||
|
||||
# 检查.env配置
|
||||
# REDIS_HOSTNAME应为crmeb_mysql(Docker)或127.0.0.1(手动安装)
|
||||
```
|
||||
|
||||
### 4.4 队列不工作
|
||||
|
||||
**问题:**
|
||||
```
|
||||
队列任务不执行,消息积压在Redis中
|
||||
```
|
||||
|
||||
**解决:**
|
||||
```bash
|
||||
# 检查队列进程
|
||||
ps aux | grep queue
|
||||
|
||||
# 重新启动队列
|
||||
docker exec -it crmeb_php php think queue:restart
|
||||
docker exec -it crmeb_php php think queue:listen --queue
|
||||
|
||||
# 查看队列日志
|
||||
docker exec -it crmeb_php tail -f runtime/log/queue.log
|
||||
```
|
||||
|
||||
### 4.5 前端页面空白
|
||||
|
||||
**问题:**
|
||||
```
|
||||
访问http://localhost:8011/admin,页面空白或404
|
||||
```
|
||||
|
||||
**解决:**
|
||||
```bash
|
||||
# 检查Nginx配置
|
||||
docker exec -it crmeb_nginx cat /etc/nginx/conf.d/default.conf
|
||||
|
||||
# 检查public目录是否存在
|
||||
docker exec -it crmeb_php ls -la /var/www/public/admin/
|
||||
|
||||
# 如果是手动安装,确保Nginx配置正确
|
||||
# root指向/crmeb/public目录
|
||||
# 确保伪静态配置正确
|
||||
|
||||
# 重新构建前端(手动安装)
|
||||
cd template/admin
|
||||
npm run build
|
||||
```
|
||||
|
||||
### 4.6 图片上传失败
|
||||
|
||||
**问题:**
|
||||
```
|
||||
上传图片提示失败,或无法显示
|
||||
```
|
||||
|
||||
**解决:**
|
||||
```bash
|
||||
# 检查上传目录权限
|
||||
docker exec -it crmeb_php ls -la /var/www/public/uploads/
|
||||
|
||||
# 修改权限
|
||||
docker exec -it crmeb_php chmod -R 755 /var/www/public/uploads/
|
||||
|
||||
# 检查存储配置
|
||||
# 后台管理 > 系统设置 > 文件存储
|
||||
```
|
||||
|
||||
### 4.7 微信支付配置
|
||||
|
||||
**配置步骤:**
|
||||
1. 登录微信商户平台:https://pay.weixin.qq.com
|
||||
2. 获取商户号(MCH_ID)
|
||||
3. 获取API密钥(KEY)
|
||||
4. 下载API证书(apiclient_key.pem, apiclient_cert.pem)
|
||||
5. 在微信开放平台获取AppID和AppSecret
|
||||
6. 后台配置:系统设置 > 支付配置 > 微信支付
|
||||
|
||||
**注意:**
|
||||
- 公众号支付需要配置JS接口安全域名
|
||||
- 小程序支付需要在小程序后台配置
|
||||
- 支付目录需要配置正确
|
||||
- 回调地址需要外网可访问
|
||||
|
||||
### 4.8 支付宝支付配置
|
||||
|
||||
**配置步骤:**
|
||||
1. 登录支付宝开放平台:https://open.alipay.com
|
||||
2. 创建应用并获取APP_ID
|
||||
3. 生成RSA2密钥(应用私钥、公钥)
|
||||
4. 配置支付宝公钥
|
||||
5. 签约支付产品(手机网站支付、当面付等)
|
||||
6. 后台配置:系统设置 > 支付配置 > 支付宝支付
|
||||
|
||||
## 下一步
|
||||
|
||||
完成安装后,你可以:
|
||||
|
||||
1. **阅读代码结构文档**:了解项目架构和目录结构
|
||||
2. **查看专项Skill文档**:
|
||||
- PHP后端开发:`.codebuddy/skills/php-api/SKILL.md`
|
||||
- 管理端前端:`.codebuddy/skills/admin-element/SKILL.md`
|
||||
- 移动端开发:`.codebuddy/skills/uniapp/SKILL.md`
|
||||
|
||||
3. **尝试代码生成器**:在后台管理中快速生成CRUD代码
|
||||
|
||||
4. **开发新功能**:参考开发规范,创建你的第一个功能模块
|
||||
|
||||
5. **查看示例代码**:在`crmeb/app/services/`中查看现有功能实现
|
||||
|
||||
6. **加入社区**:加入CRMEB技术社区,获取更多帮助
|
||||
|
||||
---
|
||||
|
||||
**文档版本**: v1.0.0
|
||||
**最后更新**: 2025-03-17
|
||||
1024
.codebuddy/skills/crmeb-complete/references/system_config.md
Normal file
1024
.codebuddy/skills/crmeb-complete/references/system_config.md
Normal file
File diff suppressed because it is too large
Load Diff
177
.dockerignore
Normal file
177
.dockerignore
Normal file
@ -0,0 +1,177 @@
|
||||
# ===========================================
|
||||
# Docker 构建镜像过滤配置文件
|
||||
# 作用:在 docker build 时排除不需要的文件,减小构建上下文
|
||||
# ===========================================
|
||||
|
||||
# ===========================================
|
||||
# 1. 版本控制与 Git 相关
|
||||
# ===========================================
|
||||
.git
|
||||
.gitignore
|
||||
.gitattributes
|
||||
.gitmodules
|
||||
|
||||
# ===========================================
|
||||
# 2. Docker 相关文件(构建时使用,不需要进入镜像)
|
||||
# ===========================================
|
||||
Dockerfile
|
||||
.dockerignore
|
||||
docker-compose*.yml
|
||||
docker-compose*.yaml
|
||||
.docker
|
||||
Dockerfile.*
|
||||
*.mdc
|
||||
|
||||
# ===========================================
|
||||
# 3. IDE 和编辑器配置
|
||||
# ===========================================
|
||||
.idea/
|
||||
.vscode/
|
||||
.vs/
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
Desktop.ini
|
||||
|
||||
# ===========================================
|
||||
# 4. 项目辅助目录
|
||||
# ===========================================
|
||||
help/
|
||||
template/
|
||||
docs/
|
||||
doc/
|
||||
*.md
|
||||
LICENSE
|
||||
README*
|
||||
CHANGELOG*
|
||||
CHANGE*
|
||||
HISTORY*
|
||||
CONTRIBUTING*
|
||||
|
||||
# ===========================================
|
||||
# 5. 缓存和临时文件
|
||||
# ===========================================
|
||||
.runtime/
|
||||
runtime/
|
||||
*.log
|
||||
*.tmp
|
||||
*.temp
|
||||
*.cache
|
||||
*.bak
|
||||
*.backup
|
||||
*_backup
|
||||
*.old
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
.DS_Store
|
||||
|
||||
# ===========================================
|
||||
# 6. Node.js 相关(前端依赖,构建后不需要)
|
||||
# ===========================================
|
||||
node_modules/
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.npm
|
||||
.yarn/
|
||||
.browserslistrc
|
||||
.eslintcache
|
||||
.node_repl_history
|
||||
|
||||
# ===========================================
|
||||
# 7. PHP Composer 依赖(不使用时的清理)
|
||||
# ===========================================
|
||||
# 注意:如果 vendor 目录需要,进入镜像时不要排除
|
||||
# 如果使用 composer install 构建,则可以排除
|
||||
# vendor/test/
|
||||
# vendor/tests/
|
||||
# vendor/docs/
|
||||
# vendor/*.txt
|
||||
# vendor/*.md
|
||||
|
||||
# ===========================================
|
||||
# 8. 大型字体文件(不必要的资源)
|
||||
# ===========================================
|
||||
# simsun.ttc
|
||||
# WenQuanZhengHei.ttf
|
||||
crmeb/vendor/dh2y/think-qrcode/src/simsun.ttc
|
||||
crmeb/vendor/fastknife/ajcaptcha/resources/fonts/WenQuanZhengHei.ttf
|
||||
|
||||
# ===========================================
|
||||
# 9. 数据库和安装文件(运行镜像时重新生成)
|
||||
# ===========================================
|
||||
*.sql
|
||||
*.sql.gz
|
||||
*.sql.bak
|
||||
|
||||
# ===========================================
|
||||
# 10. 测试和开发文件
|
||||
# ===========================================
|
||||
phpunit.xml
|
||||
phpunit.xml.dist
|
||||
tests/
|
||||
test/
|
||||
Benchmark/
|
||||
coverage/
|
||||
.phpunit.result.cache
|
||||
.php_cs
|
||||
.php-cs-fixer.cache
|
||||
.styleci.yml
|
||||
codesniffer.ruleset.xml
|
||||
|
||||
# ===========================================
|
||||
# 11. 环境配置文件(敏感信息,运行时挂载)
|
||||
# ===========================================
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
.secret
|
||||
.secrets
|
||||
*.key
|
||||
*.pem
|
||||
*.crt
|
||||
*.csr
|
||||
|
||||
# ===========================================
|
||||
# 12. 备份和历史文件
|
||||
# ===========================================
|
||||
*backup*
|
||||
*_backup*
|
||||
*_bak*
|
||||
*.backup
|
||||
*.bak
|
||||
*~
|
||||
*.orig
|
||||
*.rej
|
||||
*_COPYING_*
|
||||
*_TRASH_*
|
||||
|
||||
# ===========================================
|
||||
# 13. 开发辅助文件
|
||||
# ===========================================
|
||||
.trae/
|
||||
.codebuddy/
|
||||
.scribe/
|
||||
.phpunit.result.cache
|
||||
php_errors.log
|
||||
*.log
|
||||
|
||||
# ===========================================
|
||||
# 14. 其他大型或不必要的文件
|
||||
# ===========================================
|
||||
*.zip
|
||||
*.tar
|
||||
*.tar.gz
|
||||
*.tgz
|
||||
*.rar
|
||||
*.7z
|
||||
*.iso
|
||||
*.img
|
||||
*.dmg
|
||||
*.pdf
|
||||
*.exe
|
||||
*.msi
|
||||
76
.gitignore
vendored
76
.gitignore
vendored
@ -1,26 +1,78 @@
|
||||
/.git
|
||||
/.idea
|
||||
.vscode/
|
||||
*.log
|
||||
*.DS_Store
|
||||
/crmeb/runtime/cache
|
||||
/crmeb/runtime/log
|
||||
/crmeb/runtime/session
|
||||
/crmeb/runtime/temp
|
||||
*.iml
|
||||
|
||||
# CRMEB运行时
|
||||
/crmeb/runtime/*
|
||||
/crmeb/backup/*
|
||||
/crmeb/public/install.lock
|
||||
/crmeb/public/uploads
|
||||
/crmeb/runtime/timer.pid
|
||||
/crmeb/runtime/workerman.pid
|
||||
crmeb/public/uploads/*
|
||||
|
||||
|
||||
# Docker数据
|
||||
/docker-compose/mysql/data/
|
||||
/docker-compose/mysql/log/
|
||||
/docker-compose/nginx/log/
|
||||
/docker-compose-universal/*/mysql/
|
||||
/docker-compose-universal/*/data/
|
||||
|
||||
# 构建产物
|
||||
/template/admin/dist/
|
||||
/template/admin/.idea/
|
||||
/template/admin/node_modules/
|
||||
/template/uni-app/node_modules/
|
||||
/template/uni-app/unpackage/
|
||||
/template/uni-app/.hbuilderx/
|
||||
/crmeb/.idea/
|
||||
/docker-compose/MacArm/mysql/data/
|
||||
/docker-compose/MacArm/mysql/log/
|
||||
/docker-compose/linux/mysql/data/
|
||||
/docker-compose/linux/mysql/log/
|
||||
|
||||
# 备份文件
|
||||
*_backup/
|
||||
|
||||
# Docker Compose
|
||||
/docker-compose-dev/
|
||||
/help/docker/mysql/data/
|
||||
|
||||
# 配置文件(敏感信息)
|
||||
crmeb/.env
|
||||
crmeb/.constant
|
||||
crmeb/supervisord.log
|
||||
crmeb/supervisord.pid
|
||||
|
||||
crmeb/start.sh
|
||||
crmeb/supervisord.conf
|
||||
crmeb/my.cnf
|
||||
crmeb/redis.conf
|
||||
crmeb/vhost.conf
|
||||
crmeb/php-ini-overrides.ini
|
||||
crmeb/php-fpm.conf
|
||||
|
||||
# 代码助手规则文件
|
||||
.codebuddy/rules/dockerfile-buid.mdc
|
||||
.codebuddy/rules/docker-compose-buid.mdc
|
||||
|
||||
.trae/rules/docker.md
|
||||
.trae/rules/dockerinone.md
|
||||
|
||||
|
||||
.trae/skills/dockercompose/ALLINONE_SKILL.md
|
||||
.gitignore
|
||||
crmeb/Dockerfile
|
||||
crmeb/nginx.conf
|
||||
crmeb/.env.example
|
||||
crmeb/.dockerignore
|
||||
|
||||
crmeb/backup/readme.md
|
||||
crmeb/runtime/readme.md
|
||||
crmeb/runtime/cache/readme.md
|
||||
crmeb/runtime/log/readme.md
|
||||
crmeb/runtime/session/readme.md
|
||||
crmeb/runtime/temp/readme.md
|
||||
|
||||
|
||||
.codebuddy/rules/git-commit-standard.mdc
|
||||
.codebuddy/rules/readme.mdc
|
||||
Dockerfile
|
||||
.codebuddy/models.json
|
||||
.codebuddy/rules/project-intro.mdc
|
||||
|
||||
3
crmeb/.constant
Normal file → Executable file
3
crmeb/.constant
Normal file → Executable file
@ -0,0 +1,3 @@
|
||||
<?php
|
||||
define('INSTALL_DATE',1774254397);
|
||||
define('SERIALNUMBER','ige3SU');
|
||||
@ -0,0 +1 @@
|
||||
APP_DEBUG = false
[APP]
DEFAULT_TIMEZONE = Asia/Shanghai
[DATABASE]
TYPE = mysql
HOSTNAME = crmeb_mysql
HOSTPORT = 3306
USERNAME = crmeb
PASSWORD = 123456
DATABASE = crmeb
PREFIX = eb_
CHARSET = utf8mb4
DEBUG = true
[LANG]
default_lang = zh-cn
[CACHE]
DRIVER = redis
CACHE_PREFIX = cache_69c0f93c026ee:
CACHE_TAG_PREFIX = cache_tag_69c0f93c026ee:
[REDIS]
REDIS_HOSTNAME = crmeb_redis
PORT = 6379
REDIS_PASSWORD = 123456
SELECT = 0
[QUEUE]
QUEUE_NAME = 69c0f93c026ee
|
||||
0
crmeb/.version
Normal file → Executable file
0
crmeb/.version
Normal file → Executable file
@ -856,7 +856,8 @@ class PublicController
|
||||
], true);
|
||||
$themeInfo = app()->make(ThemeServices::class)->getThemeInfo($theme_id, $type);
|
||||
|
||||
if ($themeInfo && isset($themeInfo['value'])) {
|
||||
|
||||
if ($type != 'category' && $themeInfo) {
|
||||
foreach ($themeInfo['value'] as &$userDataItem) {
|
||||
if ($userDataItem['name'] == 'customerService') {
|
||||
$userDataItem['routine_contact_type'] = (int)sys_config('routine_contact_type');
|
||||
|
||||
482
crmeb/app/outapi/mcp.md
Normal file
482
crmeb/app/outapi/mcp.md
Normal file
@ -0,0 +1,482 @@
|
||||
# CRMEB MCP Server
|
||||
|
||||
基于 Model Context Protocol (MCP) 的 CRMEB API 工具服务器,已集成到 CRMEB outapi 模块中,允许 AI 助手通过标准协议调用 CRMEB 对外开放接口。
|
||||
|
||||
## 功能特性
|
||||
|
||||
- 🔗 集成到 CRMEB outapi 模块,无需额外部署
|
||||
- 📦 商品管理(列表、详情、创建)
|
||||
- 📂 分类管理(列表、详情、创建)
|
||||
- 🛒 订单管理(列表、详情、发货)
|
||||
- 💰 售后管理(列表、详情、同意/拒绝退款)
|
||||
- 🎫 优惠券管理
|
||||
- 👥 用户管理(列表、详情、赠送余额/积分)
|
||||
|
||||
## 环境要求
|
||||
|
||||
- CRMEB 系统
|
||||
- PHP >= 7.4
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 创建开放接口账号
|
||||
|
||||
1. 登录 CRMEB 管理后台
|
||||
2. 进入 **设置** -> **系统设置** -> **开放接口**
|
||||
3. 创建应用获取账号和密码
|
||||
|
||||
### 2. 配置到 Claude Desktop
|
||||
|
||||
编辑配置文件:
|
||||
|
||||
**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
||||
**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
||||
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"crmeb": {
|
||||
"url": "http://your-domain/outapi/mcp",
|
||||
"headers": {
|
||||
"account": "your_account",
|
||||
"password": "your_password",
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
"disabled": false
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**配置示例(演示环境):**
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"crmebdemo": {
|
||||
"url": "https://v5.crmeb.net/outapi/mcp",
|
||||
"headers": {
|
||||
"account": "ceshi",
|
||||
"password": "ceshiceshi",
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
"disabled": false
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 配置到 Cursor
|
||||
|
||||
在 Cursor 设置中添加:
|
||||
|
||||
```json
|
||||
{
|
||||
"mcp.servers": {
|
||||
"crmeb": {
|
||||
"url": "http://your-domain/outapi/mcp",
|
||||
"headers": {
|
||||
"account": "your_account",
|
||||
"password": "your_password",
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
"disabled": false
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**参数说明:**
|
||||
|
||||
| 参数 | 说明 | 获取方式 |
|
||||
|------|------|---------|
|
||||
| `url` | CRMEB MCP 接口地址 | 固定值:`http://域名/outapi/mcp` |
|
||||
| `account` | 开放接口账号 | CRMEB 后台 -> 设置 -> 开放接口 |
|
||||
| `password` | 开放接口密码 | CRMEB 后台 -> 设置 -> 开放接口 |
|
||||
| `disabled` | 是否禁用该服务 | 可选,默认为 false |
|
||||
|
||||
> 注意:直接配置 account 和 password 即可,系统会自动完成认证
|
||||
|
||||
## 支持的 MCP 客户端应用
|
||||
|
||||
以下是目前主流的支持 MCP 协议的应用程序,您可以在这些应用中配置和使用 CRMEB MCP 服务。
|
||||
|
||||
### 1. Claude Desktop
|
||||
|
||||
Anthropic 官方桌面应用,首个原生支持 MCP 的客户端。
|
||||
|
||||
**配置步骤:**
|
||||
1. 下载并安装 [Claude Desktop](https://claude.ai/download)
|
||||
2. 找到配置文件:
|
||||
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
||||
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
||||
3. 添加 CRMEB MCP 配置:
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"crmeb": {
|
||||
"url": "http://your-domain/outapi/mcp",
|
||||
"headers": {
|
||||
"account": "your_account",
|
||||
"password": "your_password",
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
"disabled": false
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
4. 重启 Claude Desktop
|
||||
|
||||
**使用方法:**
|
||||
在对话中直接询问,例如:
|
||||
```
|
||||
帮我查询 CRMEB 中的商品分类列表
|
||||
```
|
||||
|
||||
### 2. Cursor
|
||||
|
||||
AI 驱动的代码编辑器,内置 MCP 支持。
|
||||
|
||||
**配置步骤:**
|
||||
1. 下载并安装 [Cursor](https://cursor.sh/)
|
||||
2. 打开设置(Settings -> Features -> Model Context Protocol)
|
||||
3. 添加 MCP 服务器配置:
|
||||
```json
|
||||
{
|
||||
"mcp.servers": {
|
||||
"crmeb": {
|
||||
"url": "http://your-domain/outapi/mcp",
|
||||
"headers": {
|
||||
"account": "your_account",
|
||||
"password": "your_password",
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
"disabled": false
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
4. 或者直接编辑配置文件:
|
||||
- **macOS/Linux**: `~/.cursor/mcp.json`
|
||||
- **Windows**: `%APPDATA%\Cursor\mcp.json`
|
||||
|
||||
**使用方法:**
|
||||
在 Cursor 的 AI 聊天窗口中直接使用:
|
||||
```
|
||||
查询 CRMEB 中的订单列表
|
||||
```
|
||||
|
||||
### 3. Cline (VS Code 扩展)
|
||||
|
||||
VS Code 中的自主 AI 编程助手扩展。
|
||||
|
||||
**配置步骤:**
|
||||
1. 在 VS Code 中安装 [Cline 扩展](https://marketplace.visualstudio.com/items?itemName=saoudrizwan.claude-dev)
|
||||
2. 打开 VS Code 设置
|
||||
3. 搜索 "Cline MCP" 或在 Cline 面板中找到 MCP 配置
|
||||
4. 添加 MCP 服务器:
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"crmeb": {
|
||||
"url": "http://your-domain/outapi/mcp",
|
||||
"headers": {
|
||||
"account": "your_account",
|
||||
"password": "your_password",
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
"disabled": false
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**使用方法:**
|
||||
在 Cline 面板中输入指令:
|
||||
```
|
||||
获取 CRMEB 商品 ID 为 1 的详情
|
||||
```
|
||||
|
||||
### 4. Windsurf
|
||||
|
||||
Codeium 推出的 AI 原生 IDE。
|
||||
|
||||
**配置步骤:**
|
||||
1. 下载并安装 [Windsurf](https://codeium.com/windsurf)
|
||||
2. 打开设置 -> Developer Settings -> MCP Servers
|
||||
3. 添加配置:
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"crmeb": {
|
||||
"url": "http://your-domain/outapi/mcp",
|
||||
"headers": {
|
||||
"account": "your_account",
|
||||
"password": "your_password",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5. Continue (VS Code/JetBrains 扩展)
|
||||
|
||||
开源的 AI 代码助手扩展。
|
||||
|
||||
**配置步骤:**
|
||||
1. 安装 Continue 扩展
|
||||
- [VS Code](https://marketplace.visualstudio.com/items?itemName=Continue.continue)
|
||||
- [JetBrains](https://plugins.jetbrains.com/plugin/22707-continue)
|
||||
2. 打开 Continue 配置文件(`~/.continue/config.json`)
|
||||
3. 添加 MCP 配置:
|
||||
```json
|
||||
{
|
||||
"models": [...],
|
||||
"mcpServers": {
|
||||
"crmeb": {
|
||||
"url": "http://your-domain/outapi/mcp",
|
||||
"headers": {
|
||||
"account": "your_account",
|
||||
"password": "your_password",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 6. Zed
|
||||
|
||||
高性能代码编辑器,支持 MCP 协议。
|
||||
|
||||
**配置步骤:**
|
||||
1. 下载并安装 [Zed](https://zed.dev/)
|
||||
2. 打开配置文件(`~/.zed/settings.json`)
|
||||
3. 添加 MCP 服务器配置:
|
||||
```json
|
||||
{
|
||||
"mcp_servers": {
|
||||
"crmeb": {
|
||||
"url": "http://your-domain/outapi/mcp",
|
||||
"headers": {
|
||||
"account": "your_account",
|
||||
"password": "your_password",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 7. 其他支持 MCP 的应用
|
||||
|
||||
以下应用也在逐步支持 MCP 协议:
|
||||
|
||||
- **Codeium**:AI 代码补全工具
|
||||
- **Tabnine**:AI 代码助手
|
||||
- **Sourcegraph Cody**:代码智能助手
|
||||
|
||||
> 💡 **提示**:MCP 是一个开放协议,越来越多的 AI 应用正在支持。如果您的应用支持 MCP,通常可以在设置中找到 MCP 或 Model Context Protocol 相关配置项。
|
||||
|
||||
## 可用工具
|
||||
|
||||
### 分类管理
|
||||
|
||||
| 工具名称 | 描述 | 必需参数 | 可选参数 |
|
||||
|---------|------|---------|---------|
|
||||
| `crmeb_category_list` | 获取分类列表 | - | page, limit |
|
||||
| `crmeb_category_detail` | 获取分类详情 | id | - |
|
||||
| `crmeb_category_create` | 创建分类 | name | pid, sort |
|
||||
|
||||
### 商品管理
|
||||
|
||||
| 工具名称 | 描述 | 必需参数 | 可选参数 |
|
||||
|---------|------|---------|---------|
|
||||
| `crmeb_product_list` | 获取商品列表 | - | page, limit, cate_id, keyword, stock_min, stock_max |
|
||||
| `crmeb_product_detail` | 获取商品详情 | id | - |
|
||||
| `crmeb_product_create` | 创建商品 | name, cate_id, price, stock | image, unit |
|
||||
|
||||
### 订单管理
|
||||
|
||||
| 工具名称 | 描述 | 必需参数 | 可选参数 |
|
||||
|---------|------|---------|---------|
|
||||
| `crmeb_order_list` | 获取订单列表 | - | page, limit, status, keyword |
|
||||
| `crmeb_order_detail` | 获取订单详情 | order_id | - |
|
||||
| `crmeb_order_delivery` | 订单发货 | order_id, delivery_type | delivery_name, delivery_id |
|
||||
| `crmeb_order_express_list` | 获取物流公司列表 | - | - |
|
||||
|
||||
### 售后管理
|
||||
|
||||
| 工具名称 | 描述 | 必需参数 | 可选参数 |
|
||||
|---------|------|---------|---------|
|
||||
| `crmeb_refund_list` | 获取售后列表 | - | page, limit |
|
||||
| `crmeb_refund_detail` | 获取售后详情 | order_id | - |
|
||||
| `crmeb_refund_agree` | 同意退款 | order_id | - |
|
||||
| `crmeb_refund_refuse` | 拒绝退款 | order_id, refuse_reason | - |
|
||||
|
||||
### 优惠券管理
|
||||
|
||||
| 工具名称 | 描述 | 必需参数 | 可选参数 |
|
||||
|---------|------|---------|---------|
|
||||
| `crmeb_coupon_list` | 获取优惠券列表 | - | page, limit |
|
||||
|
||||
### 用户管理
|
||||
|
||||
| 工具名称 | 描述 | 必需参数 | 可选参数 |
|
||||
|---------|------|---------|---------|
|
||||
| `crmeb_user_list` | 获取用户列表 | - | page, limit, keyword |
|
||||
| `crmeb_user_detail` | 获取用户详情 | uid | - |
|
||||
| `crmeb_user_give_balance` | 赠送余额 | uid, balance | title |
|
||||
| `crmeb_user_give_point` | 赠送积分 | uid, point | title |
|
||||
|
||||
## 使用示例
|
||||
|
||||
在 Claude 或 Cursor 中,您可以这样使用:
|
||||
|
||||
```
|
||||
帮我查询 CRMEB 中的商品列表
|
||||
```
|
||||
|
||||
```
|
||||
创建一个新商品:名称"测试商品",分类ID 1,价格 99.00,库存 100
|
||||
```
|
||||
|
||||
```
|
||||
查询订单号 202403130001 的详情
|
||||
```
|
||||
|
||||
```
|
||||
给用户 ID 为 1 的用户赠送 100 积分
|
||||
```
|
||||
|
||||
## 接口测试
|
||||
|
||||
```bash
|
||||
# 测试 MCP 初始化
|
||||
curl -X POST "http://localhost:8011/outapi/mcp" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "account: your_account" \
|
||||
-H "password: your_password" \
|
||||
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'
|
||||
|
||||
# 获取工具列表
|
||||
curl -X POST "http://localhost:8011/outapi/mcp" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "account: your_account" \
|
||||
-H "password: your_password" \
|
||||
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'
|
||||
|
||||
# 调用工具 - 获取商品列表
|
||||
curl -X POST "http://localhost:8011/outapi/mcp" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "account: your_account" \
|
||||
-H "password: your_password" \
|
||||
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"crmeb_product_list","arguments":{"page":1,"limit":10}}}'
|
||||
|
||||
# 调用工具 - 创建分类
|
||||
curl -X POST "http://localhost:8011/outapi/mcp" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "account: your_account" \
|
||||
-H "password: your_password" \
|
||||
-d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"crmeb_category_create","arguments":{"name":"新分类","sort":100}}}'
|
||||
|
||||
# 调用工具 - 查询库存大于500的商品
|
||||
curl -X POST "http://localhost:8011/outapi/mcp" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "account: your_account" \
|
||||
-H "password: your_password" \
|
||||
-d '{"jsonrpc":"2.0","id":5,"method":"tools/call","params":{"name":"crmeb_product_list","arguments":{"stock_min":500}}}'
|
||||
|
||||
# 使用演示环境测试
|
||||
curl -X POST "https://v5.crmeb.net/outapi/mcp" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "account: ceshi" \
|
||||
-H "password: ceshiceshi" \
|
||||
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"crmeb_category_list","arguments":{}}}'
|
||||
```
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
crmeb/app/outapi/
|
||||
├── controller/
|
||||
│ ├── Mcp.php # MCP 控制器
|
||||
│ ├── Login.php # 认证控制器
|
||||
│ ├── StoreProduct.php # 商品控制器
|
||||
│ ├── StoreCategory.php # 分类控制器
|
||||
│ ├── StoreOrder.php # 订单控制器
|
||||
│ ├── RefundOrder.php # 售后控制器
|
||||
│ ├── StoreCoupon.php # 优惠券控制器
|
||||
│ ├── User.php # 用户控制器
|
||||
│ └── ...
|
||||
├── route/
|
||||
│ └── route.php # 路由配置
|
||||
├── middleware/
|
||||
│ └── AuthTokenMiddleware.php
|
||||
├── mcp.md # 本文档
|
||||
└── README.md # outapi 模块说明
|
||||
```
|
||||
|
||||
## 协议说明
|
||||
|
||||
### MCP 协议版本
|
||||
|
||||
- 支持版本:`2024-11-05`
|
||||
|
||||
### JSON-RPC 2.0 格式
|
||||
|
||||
**请求格式:**
|
||||
```json
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"id": 1,
|
||||
"method": "tools/call",
|
||||
"params": {
|
||||
"name": "工具名称",
|
||||
"arguments": { "参数": "值" }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**成功响应:**
|
||||
```json
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"id": 1,
|
||||
"result": {
|
||||
"content": [
|
||||
{
|
||||
"type": "text",
|
||||
"text": "{...结果数据...}"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**错误响应:**
|
||||
```json
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"id": 1,
|
||||
"error": {
|
||||
"code": -32603,
|
||||
"message": "错误信息"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 错误码说明
|
||||
|
||||
| 错误码 | 说明 |
|
||||
|-------|------|
|
||||
| -32700 | JSON 解析错误 |
|
||||
| -32600 | 请求无效(认证失败等) |
|
||||
| -32601 | 方法不存在 |
|
||||
| -32603 | 内部错误 |
|
||||
|
||||
## 相关链接
|
||||
|
||||
- [Model Context Protocol 文档](https://modelcontextprotocol.io/)
|
||||
- [CRMEB 开放接口](./README.md)
|
||||
Loading…
x
Reference in New Issue
Block a user