submit cursor rule
This commit is contained in:
31
Server/.cursor/rules/01-project-overview.mdc
Normal file
31
Server/.cursor/rules/01-project-overview.mdc
Normal file
@@ -0,0 +1,31 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Project Overview
|
||||
|
||||
存客宝微信管理系统是基于ThinkPHP 5.1和PHP 7.4的微信账号管理和营销自动化平台。
|
||||
|
||||
## 主要功能
|
||||
|
||||
- **设备管理**: 设备添加、删除、状态监控和任务配置
|
||||
- **微信账号管理**: 微信账号列表、微信好友管理和好友转移功能
|
||||
- **内容库**: 内容创建与管理、朋友圈内容采集和内容分类管理
|
||||
- **工作台功能**: 自动点赞、朋友圈同步、群消息推送和自动建群
|
||||
- **流量管理**: 流量标签、流量池管理和订单导入
|
||||
|
||||
## 核心文件
|
||||
|
||||
- 入口文件: [public/index.php](mdc:public/index.php)
|
||||
- 应用配置: [config/app.php](mdc:config/app.php)
|
||||
- 数据库配置: [config/database.php](mdc:config/database.php)
|
||||
- 路由配置: [route/route.php](mdc:route/route.php)
|
||||
- 公共函数: [application/common.php](mdc:application/common.php)
|
||||
|
||||
## 环境要求
|
||||
|
||||
- PHP >= 7.0 (推荐 PHP 7.4)
|
||||
- MySQL 5.6+
|
||||
- Composer
|
||||
- ThinkPHP 5.1所需的PHP扩展
|
||||
50
Server/.cursor/rules/02-directory-structure.mdc
Normal file
50
Server/.cursor/rules/02-directory-structure.mdc
Normal file
@@ -0,0 +1,50 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# 目录结构
|
||||
|
||||
整个项目遵循ThinkPHP 5.1的目录结构规范,主要包含以下目录:
|
||||
|
||||
## 核心目录
|
||||
|
||||
- **application/** - 应用目录,包含所有模块和业务逻辑
|
||||
- [api/](mdc:application/api) - API模块,提供RESTful API接口
|
||||
- [command/](mdc:application/command) - 命令行脚本
|
||||
- [common/](mdc:application/common) - 公共模块,包含共享功能
|
||||
- [cunkebao/](mdc:application/cunkebao) - 村客宝主模块
|
||||
- [store/](mdc:application/store) - 商店模块
|
||||
- [superadmin/](mdc:application/superadmin) - 超级管理员模块
|
||||
- [cozeai/](mdc:application/cozeai) - 智能AI模块
|
||||
- [job/](mdc:application/job) - 后台任务模块
|
||||
|
||||
- **config/** - 配置目录
|
||||
- [app.php](mdc:config/app.php) - 应用配置
|
||||
- [database.php](mdc:config/database.php) - 数据库配置
|
||||
- [queue.php](mdc:config/queue.php) - 队列配置
|
||||
- [worker.php](mdc:config/worker.php) - Worker配置
|
||||
|
||||
- **extend/** - 扩展目录,存放第三方扩展类库
|
||||
|
||||
- **public/** - 公共资源目录,Web访问入口
|
||||
- [index.php](mdc:public/index.php) - 入口文件
|
||||
|
||||
- **route/** - 路由目录
|
||||
- [route.php](mdc:route/route.php) - 路由配置
|
||||
|
||||
- **runtime/** - 运行时目录,存放日志和缓存文件
|
||||
|
||||
- **thinkphp/** - ThinkPHP框架核心目录
|
||||
|
||||
- **vendor/** - Composer依赖目录
|
||||
|
||||
## 模块结构
|
||||
|
||||
每个模块通常包含以下目录结构:
|
||||
|
||||
- **controller/** - 控制器
|
||||
- **model/** - 数据模型
|
||||
- **service/** - 服务层
|
||||
- **validate/** - 验证器
|
||||
- **config/** - 模块配置,包括独立的路由配置
|
||||
66
Server/.cursor/rules/03-main-modules.mdc
Normal file
66
Server/.cursor/rules/03-main-modules.mdc
Normal file
@@ -0,0 +1,66 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# 主要模块
|
||||
|
||||
村客宝系统由多个功能模块组成,各模块负责不同的业务功能:
|
||||
|
||||
## API模块
|
||||
|
||||
[application/api/](mdc:application/api) 提供RESTful API服务,主要包括:
|
||||
|
||||
- [DeviceController.php](mdc:application/api/controller/DeviceController.php) - 设备相关API
|
||||
- [WechatController.php](mdc:application/api/controller/WechatController.php) - 微信账号相关API
|
||||
- [WechatFriendController.php](mdc:application/api/controller/WechatFriendController.php) - 微信好友相关API
|
||||
- [WechatChatroomController.php](mdc:application/api/controller/WechatChatroomController.php) - 微信群相关API
|
||||
- [MessageController.php](mdc:application/api/controller/MessageController.php) - 消息相关API
|
||||
- [MomentsController.php](mdc:application/api/controller/MomentsController.php) - 朋友圈相关API
|
||||
- [WebSocketController.php](mdc:application/api/controller/WebSocketController.php) - WebSocket通信API
|
||||
|
||||
## 村客宝主模块
|
||||
|
||||
[application/cunkebao/](mdc:application/cunkebao) 是系统的核心模块,包含主要业务逻辑:
|
||||
|
||||
- [Device.php](mdc:application/cunkebao/controller/Device.php) - 设备管理控制器
|
||||
- [DeviceWechat.php](mdc:application/cunkebao/controller/DeviceWechat.php) - 设备微信管理
|
||||
- [ContentLibraryController.php](mdc:application/cunkebao/controller/ContentLibraryController.php) - 内容库管理
|
||||
- [WorkbenchController.php](mdc:application/cunkebao/controller/WorkbenchController.php) - 工作台功能
|
||||
- [TrafficPool.php](mdc:application/cunkebao/controller/TrafficPool.php) - 流量池管理
|
||||
- [TrafficTag.php](mdc:application/cunkebao/controller/TrafficTag.php) - 流量标签管理
|
||||
|
||||
## 公共模块
|
||||
|
||||
[application/common/](mdc:application/common) 包含系统共享的功能和工具:
|
||||
|
||||
- [service/](mdc:application/common/service) - 公共服务
|
||||
- [model/](mdc:application/common/model) - 核心数据模型
|
||||
- [util/](mdc:application/common/util) - 工具类
|
||||
- [socket/](mdc:application/common/socket) - WebSocket通信
|
||||
- [middleware/](mdc:application/common/middleware) - 中间件
|
||||
|
||||
## 命令行模块
|
||||
|
||||
[application/command/](mdc:application/command) 包含系统的命令行工具:
|
||||
|
||||
- 定时任务
|
||||
- 队列处理
|
||||
- 数据迁移
|
||||
- 系统维护
|
||||
|
||||
## 存储模块
|
||||
|
||||
[application/store/](mdc:application/store) 提供资源存储相关的功能:
|
||||
|
||||
- 图片存储
|
||||
- 文件上传
|
||||
- 资源管理
|
||||
|
||||
## 超级管理员模块
|
||||
|
||||
[application/superadmin/](mdc:application/superadmin) 提供系统管理功能:
|
||||
|
||||
- 用户管理
|
||||
- 权限管理
|
||||
- 系统配置
|
||||
71
Server/.cursor/rules/04-development-workflow.mdc
Normal file
71
Server/.cursor/rules/04-development-workflow.mdc
Normal file
@@ -0,0 +1,71 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# 开发工作流程
|
||||
|
||||
本项目基于ThinkPHP 5.1框架开发,遵循MVC设计模式。开发时请参考以下工作流程和规范:
|
||||
|
||||
## 框架特性
|
||||
|
||||
ThinkPHP 5.1使用以下特性:
|
||||
- 命名空间和自动加载
|
||||
- 依赖注入和容器
|
||||
- 门面(Facade)模式
|
||||
- 中间件机制
|
||||
- 路由定义
|
||||
|
||||
## 开发流程
|
||||
|
||||
1. **理解需求** - 明确功能需求和业务逻辑
|
||||
2. **设计数据库** - 设计相关数据表和字段
|
||||
3. **创建模型** - 在对应模块的`model`目录下创建数据模型
|
||||
4. **编写服务层** - 在`service`目录下实现业务逻辑
|
||||
5. **创建控制器** - 在`controller`目录下创建控制器处理请求
|
||||
6. **定义路由** - 在模块的`config/route.php`中定义路由规则
|
||||
7. **编写前端代码** - 实现页面交互和UI
|
||||
|
||||
## 关键文件和位置
|
||||
|
||||
- **模型定义**: `application/模块名/model/`
|
||||
- **控制器**: `application/模块名/controller/`
|
||||
- **服务层**: `application/模块名/service/`
|
||||
- **路由配置**: `application/模块名/config/route.php`
|
||||
- **公共函数**: `application/common.php`
|
||||
- **配置文件**: `config/` 和 `application/模块名/config/`
|
||||
|
||||
## 命名规范
|
||||
|
||||
- **类名**: 使用Pascal命名法(如`DeviceController`)
|
||||
- **方法名**: 使用camel命名法(如`getUserInfo`)
|
||||
- **变量名**: 使用camel命名法(如`$deviceInfo`)
|
||||
- **常量**: 使用大写下划线(如`APP_DEBUG`)
|
||||
- **配置参数**: 使用小写下划线(如`app_debug`)
|
||||
|
||||
## 使用命令行
|
||||
|
||||
ThinkPHP提供了命令行工具,可用于执行各种任务:
|
||||
|
||||
```bash
|
||||
# 查看可用命令
|
||||
php think
|
||||
|
||||
# 启动内置服务器
|
||||
php think run
|
||||
|
||||
# 清除缓存
|
||||
php think clear
|
||||
|
||||
# 执行数据库迁移
|
||||
php think migrate:run
|
||||
```
|
||||
|
||||
## 扩展包依赖
|
||||
|
||||
项目使用Composer管理依赖,主要依赖见[composer.json](mdc:composer.json):
|
||||
|
||||
- topthink/framework: 5.1.*
|
||||
- phpoffice/phpexcel
|
||||
- guzzlehttp/guzzle
|
||||
- 等其他扩展包
|
||||
85
Server/.cursor/rules/05-api-reference.mdc
Normal file
85
Server/.cursor/rules/05-api-reference.mdc
Normal file
@@ -0,0 +1,85 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# API 参考
|
||||
|
||||
村客宝系统提供RESTful风格的API,主要通过`application/api`模块实现。
|
||||
|
||||
## API路由结构
|
||||
|
||||
系统API遵循RESTful设计,主要路由前缀为`/v1`,详细路由定义见[application/api/config/route.php](mdc:application/api/config/route.php)
|
||||
|
||||
## 主要API控制器
|
||||
|
||||
- [DeviceController.php](mdc:application/api/controller/DeviceController.php) - 设备管理API
|
||||
- [WechatController.php](mdc:application/api/controller/WechatController.php) - 微信账号API
|
||||
- [WechatFriendController.php](mdc:application/api/controller/WechatFriendController.php) - 微信好友API
|
||||
- [WechatChatroomController.php](mdc:application/api/controller/WechatChatroomController.php) - 微信群API
|
||||
- [MessageController.php](mdc:application/api/controller/MessageController.php) - 消息API
|
||||
- [MomentsController.php](mdc:application/api/controller/MomentsController.php) - 朋友圈API
|
||||
- [UserController.php](mdc:application/api/controller/UserController.php) - 用户API
|
||||
|
||||
## 常用API端点
|
||||
|
||||
### 设备管理
|
||||
|
||||
- `GET /v1/devices` - 获取设备列表
|
||||
- `GET /v1/devices/{id}` - 获取设备详情
|
||||
- `POST /v1/devices` - 添加设备
|
||||
- `PUT /v1/devices/{id}` - 更新设备信息
|
||||
- `DELETE /v1/devices/{id}` - 删除设备
|
||||
|
||||
### 微信账号管理
|
||||
|
||||
- `GET /v1/wechats` - 获取微信账号列表
|
||||
- `GET /v1/wechats/{id}` - 获取微信账号详情
|
||||
- `PUT /v1/wechats/{id}` - 更新微信账号信息
|
||||
- `DELETE /v1/wechats/{id}` - 删除微信账号
|
||||
|
||||
### 微信好友管理
|
||||
|
||||
- `GET /v1/wechats/{id}/friends` - 获取好友列表
|
||||
- `POST /v1/wechats/{id}/friends` - 添加好友
|
||||
- `PUT /v1/wechats/{id}/friends/{friendId}` - 更新好友信息
|
||||
|
||||
### 工作台功能
|
||||
|
||||
- `POST /v1/workbench/auto-like` - 自动点赞
|
||||
- `POST /v1/workbench/sync-moments` - 同步朋友圈
|
||||
- `POST /v1/workbench/send-message` - 发送消息
|
||||
|
||||
## API鉴权
|
||||
|
||||
API使用Token认证机制,每个请求需要在Header中包含授权信息:
|
||||
|
||||
```
|
||||
Authorization: Bearer {token}
|
||||
```
|
||||
|
||||
获取Token的方法:
|
||||
- `POST /v1/auth/login` - 登录获取Token
|
||||
- `POST /v1/auth/refresh` - 刷新Token
|
||||
|
||||
## 响应格式
|
||||
|
||||
API统一返回JSON格式数据,基本结构:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200, // 状态码
|
||||
"message": "success", // 消息
|
||||
"data": {}, // 数据(可选)
|
||||
"time": 1628160000 // 时间戳
|
||||
}
|
||||
```
|
||||
|
||||
## WebSocket通信
|
||||
|
||||
实时通信通过WebSocket实现,在[WebSocketController.php](mdc:application/api/controller/WebSocketController.php)中定义:
|
||||
|
||||
- 连接地址:`ws://{host}/ws`
|
||||
- 支持设备状态实时推送
|
||||
- 支持消息实时通知
|
||||
- 支持任务执行状态更新
|
||||
96
Server/.cursor/rules/06-data-models.mdc
Normal file
96
Server/.cursor/rules/06-data-models.mdc
Normal file
@@ -0,0 +1,96 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# 数据模型
|
||||
|
||||
系统使用ThinkPHP的ORM框架进行数据库操作,主要模型如下:
|
||||
|
||||
## 核心模型
|
||||
|
||||
### 设备相关
|
||||
|
||||
- **Device模型** - 设备信息
|
||||
- 位置:[application/common/model/Device.php](mdc:application/common/model/Device.php)
|
||||
- 主要字段:id, name, device_id, status, online_status, created_at, updated_at
|
||||
|
||||
- **DeviceWechat模型** - 设备上的微信账号
|
||||
- 位置:[application/common/model/DeviceWechat.php](mdc:application/common/model/DeviceWechat.php)
|
||||
- 主要字段:id, device_id, wechat_id, status, login_status, created_at, updated_at
|
||||
|
||||
### 微信相关
|
||||
|
||||
- **Wechat模型** - 微信账号信息
|
||||
- 位置:[application/common/model/Wechat.php](mdc:application/common/model/Wechat.php)
|
||||
- 主要字段:id, wxid, nickname, avatar, gender, country, province, city, created_at, updated_at
|
||||
|
||||
- **WechatFriend模型** - 微信好友
|
||||
- 位置:[application/common/model/WechatFriend.php](mdc:application/common/model/WechatFriend.php)
|
||||
- 主要字段:id, wechat_id, wxid, nickname, remark, avatar, gender, created_at, updated_at
|
||||
|
||||
- **WechatChatroom模型** - 微信群
|
||||
- 位置:[application/common/model/WechatChatroom.php](mdc:application/common/model/WechatChatroom.php)
|
||||
- 主要字段:id, chatroom_id, name, owner_wxid, member_count, created_at, updated_at
|
||||
|
||||
### 内容相关
|
||||
|
||||
- **ContentLibrary模型** - 内容库
|
||||
- 位置:[application/common/model/ContentLibrary.php](mdc:application/common/model/ContentLibrary.php)
|
||||
- 主要字段:id, title, content, type, category_id, tags, created_at, updated_at
|
||||
|
||||
- **ContentCategory模型** - 内容分类
|
||||
- 位置:[application/common/model/ContentCategory.php](mdc:application/common/model/ContentCategory.php)
|
||||
- 主要字段:id, name, parent_id, sort, created_at, updated_at
|
||||
|
||||
### 工作台相关
|
||||
|
||||
- **Task模型** - 任务
|
||||
- 位置:[application/common/model/Task.php](mdc:application/common/model/Task.php)
|
||||
- 主要字段:id, name, type, status, config, created_at, updated_at
|
||||
|
||||
- **Plan模型** - 计划
|
||||
- 位置:[application/common/model/Plan.php](mdc:application/common/model/Plan.php)
|
||||
- 主要字段:id, name, type, status, config, schedule, created_at, updated_at
|
||||
|
||||
### 流量相关
|
||||
|
||||
- **TrafficPool模型** - 流量池
|
||||
- 位置:[application/common/model/TrafficPool.php](mdc:application/common/model/TrafficPool.php)
|
||||
- 主要字段:id, name, description, created_at, updated_at
|
||||
|
||||
- **TrafficTag模型** - 流量标签
|
||||
- 位置:[application/common/model/TrafficTag.php](mdc:application/common/model/TrafficTag.php)
|
||||
- 主要字段:id, name, color, created_at, updated_at
|
||||
|
||||
## 模型关联
|
||||
|
||||
系统中的模型通过ThinkPHP的关联关系进行关联:
|
||||
|
||||
- Device模型 hasMany DeviceWechat模型
|
||||
- DeviceWechat模型 belongsTo Device模型
|
||||
- DeviceWechat模型 belongsTo Wechat模型
|
||||
- Wechat模型 hasMany WechatFriend模型
|
||||
- Wechat模型 hasMany WechatChatroom模型
|
||||
- ContentLibrary模型 belongsTo ContentCategory模型
|
||||
|
||||
## 模型使用示例
|
||||
|
||||
```php
|
||||
// 查询设备列表
|
||||
$devices = Device::where('status', 1)->order('id', 'desc')->paginate(10);
|
||||
|
||||
// 关联查询设备上的微信账号
|
||||
$device = Device::with('wechats')->find($deviceId);
|
||||
|
||||
// 创建新设备
|
||||
$device = new Device;
|
||||
$device->name = '设备名称';
|
||||
$device->device_id = 'DEVICE_123456';
|
||||
$device->status = 1;
|
||||
$device->save();
|
||||
```
|
||||
|
||||
## 数据验证
|
||||
|
||||
模型验证规则定义在对应的验证器类中,位于`application/模块名/validate/`目录下。
|
||||
104
Server/.cursor/rules/07-websocket-communication.mdc
Normal file
104
Server/.cursor/rules/07-websocket-communication.mdc
Normal file
@@ -0,0 +1,104 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# WebSocket通信
|
||||
|
||||
村客宝系统使用WebSocket实现实时通信功能,主要用于设备状态监控和消息实时推送。
|
||||
|
||||
## WebSocket服务
|
||||
|
||||
系统使用ThinkPHP的think-worker扩展实现WebSocket服务:
|
||||
|
||||
- 服务配置:[config/worker.php](mdc:config/worker.php)和[config/worker_server.php](mdc:config/worker_server.php)
|
||||
- Gateway配置:[config/gateway_worker.php](mdc:config/gateway_worker.php)
|
||||
|
||||
## WebSocket控制器
|
||||
|
||||
WebSocket服务主要通过以下文件实现:
|
||||
|
||||
- [application/api/controller/WebSocketController.php](mdc:application/api/controller/WebSocketController.php) - WebSocket控制器
|
||||
- [application/common/socket/](mdc:application/common/socket) - WebSocket核心实现
|
||||
|
||||
## 消息格式
|
||||
|
||||
WebSocket消息使用JSON格式,基本结构如下:
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "message_type", // 消息类型
|
||||
"data": {}, // 消息数据
|
||||
"time": 1628160000 // 时间戳
|
||||
}
|
||||
```
|
||||
|
||||
## 常用消息类型
|
||||
|
||||
- `device_status` - 设备状态更新
|
||||
- `wechat_login` - 微信登录状态更新
|
||||
- `new_message` - 新消息通知
|
||||
- `task_status` - 任务状态更新
|
||||
- `error` - 错误消息
|
||||
|
||||
## 客户端连接
|
||||
|
||||
客户端可以通过以下方式连接WebSocket服务:
|
||||
|
||||
```javascript
|
||||
const ws = new WebSocket('ws://{host}/ws');
|
||||
|
||||
ws.onopen = function() {
|
||||
console.log('Connected to WebSocket server');
|
||||
// 发送认证消息
|
||||
ws.send(JSON.stringify({
|
||||
type: 'auth',
|
||||
data: {
|
||||
token: 'YOUR_AUTH_TOKEN'
|
||||
}
|
||||
}));
|
||||
};
|
||||
|
||||
ws.onmessage = function(event) {
|
||||
const message = JSON.parse(event.data);
|
||||
console.log('Received message:', message);
|
||||
|
||||
// 根据消息类型处理
|
||||
switch(message.type) {
|
||||
case 'device_status':
|
||||
// 处理设备状态更新
|
||||
break;
|
||||
case 'new_message':
|
||||
// 处理新消息
|
||||
break;
|
||||
// ...其他消息类型
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
## WebSocket命令
|
||||
|
||||
系统提供命令行工具管理WebSocket服务:
|
||||
|
||||
```bash
|
||||
# 启动WebSocket服务
|
||||
php think worker:server start
|
||||
|
||||
# 停止WebSocket服务
|
||||
php think worker:server stop
|
||||
|
||||
# 重启WebSocket服务
|
||||
php think worker:server restart
|
||||
|
||||
# 查看WebSocket服务状态
|
||||
php think worker:server status
|
||||
```
|
||||
|
||||
## 消息推送服务
|
||||
|
||||
系统使用队列实现消息的异步推送:
|
||||
|
||||
- 队列配置:[config/queue.php](mdc:config/queue.php)
|
||||
- 消息推送任务:[application/job/](mdc:application/job)
|
||||
|
||||
通过队列可以实现高效的消息推送,避免阻塞主进程。
|
||||
@@ -16,7 +16,7 @@
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.6.0",
|
||||
"php": ">=7.0",
|
||||
"topthink/framework": "5.1.*",
|
||||
"phpoffice/phpexcel": "^1.8",
|
||||
"endroid/qr-code": "^2.5",
|
||||
|
||||
19
Server/config/wechat_device_api.php
Normal file
19
Server/config/wechat_device_api.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
// 默认使用的供应商适配器标识
|
||||
'default_adapter' => 'ChuKeBao',
|
||||
|
||||
// 各个供应商适配器的配置
|
||||
'adapters' => [
|
||||
'ChuKeBao' => [
|
||||
'driver' => \WeChatDeviceApi\Adapters\ChuKebao\Adapter::class,
|
||||
// 'api_key' => env('ChuKebao_API_KEY', ''),
|
||||
// 'api_secret' => env('ChuKebao_API_SECRET', ''),
|
||||
'base_url' => env('api.wechat_url'),
|
||||
'username' => env('api.username', ''),
|
||||
'password' => env('api.password', ''),
|
||||
],
|
||||
// ... 更多供应商
|
||||
],
|
||||
];
|
||||
98
Server/extend/WeChatDeviceApi/Adapters/ChuKeBao/Adapter.php
Normal file
98
Server/extend/WeChatDeviceApi/Adapters/ChuKeBao/Adapter.php
Normal file
@@ -0,0 +1,98 @@
|
||||
<?php
|
||||
namespace WeChatDeviceApi\Adapters\ChuKeBao;
|
||||
|
||||
use WeChatDeviceApi\Contracts\WeChatServiceInterface;
|
||||
use WeChatDeviceApi\Exceptions\ApiException;
|
||||
//use WeChatDeviceApi\Exceptions\DeviceOfflineException;
|
||||
// 如果有 Client.php
|
||||
// use WeChatDeviceApi\Adapters\VendorA\Client as VendorAApiClient;
|
||||
|
||||
class Adapter implements WeChatServiceInterface
|
||||
{
|
||||
protected $config;
|
||||
// protected $apiClient; // 如果使用 VendorAApiClient
|
||||
|
||||
public function __construct(array $config)
|
||||
{
|
||||
$this->config = $config;
|
||||
// $this->apiClient = new VendorAApiClient($config['api_key'], $config['api_secret'], $config['base_url']);
|
||||
// 校验配置等...
|
||||
if (empty($config['api_key']) || empty($config['base_url'])) {
|
||||
throw new \InvalidArgumentException("VendorA API key and base_url are required.");
|
||||
}
|
||||
}
|
||||
|
||||
public function addFriend(string $deviceId, string $targetWxId): bool
|
||||
{
|
||||
// 1. 构建请求参数 (VendorA 特定的格式)
|
||||
$params = [
|
||||
'device_identifier' => $deviceId,
|
||||
'wechat_user_to_add' => $targetWxId,
|
||||
'apiKey' => $this->config['api_key'],
|
||||
// ... 其他 VendorA 特定参数
|
||||
];
|
||||
|
||||
// 2. 调用 VendorA 的 API (例如使用 GuzzleHttp 或 cURL)
|
||||
// $response = $this->apiClient->post('/friend/add', $params);
|
||||
// 伪代码:
|
||||
$url = $this->config['base_url'] . '/friend/add';
|
||||
// $httpClient = new \GuzzleHttp\Client();
|
||||
// $response = $httpClient->request('POST', $url, ['form_params' => $params]);
|
||||
// $responseData = json_decode($response->getBody()->getContents(), true);
|
||||
|
||||
// 模拟API调用
|
||||
echo "VendorA: Adding friend {$targetWxId} using device {$deviceId}\n";
|
||||
$responseData = ['code' => 0, 'message' => 'Success']; // 假设的响应
|
||||
|
||||
// 3. 处理响应,转换为标准结果
|
||||
if (!isset($responseData['code'])) {
|
||||
throw new ApiException("VendorA: Invalid API response for addFriend.");
|
||||
}
|
||||
// if ($responseData['code'] === 1001) { // 假设1001是设备离线
|
||||
// throw new DeviceOfflineException("VendorA: Device {$deviceId} is offline.");
|
||||
// }
|
||||
if ($responseData['code'] !== 0) {
|
||||
throw new ApiException("VendorA: Failed to add friend - " . ($responseData['message'] ?? 'Unknown error'));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function likeMoment(string $deviceId, string $momentId): bool
|
||||
{
|
||||
echo "VendorA: Liking moment {$momentId} using device {$deviceId}\n";
|
||||
// 实现 VendorA 的点赞逻辑
|
||||
return true;
|
||||
}
|
||||
|
||||
public function getGroupList(string $deviceId): array
|
||||
{
|
||||
echo "VendorA: Getting group list for device {$deviceId}\n";
|
||||
// 实现 VendorA 的获取群列表逻辑,并转换数据格式
|
||||
return [
|
||||
['id' => 'group1_va', 'name' => 'VendorA Group 1', 'member_count' => 10],
|
||||
];
|
||||
}
|
||||
|
||||
public function getFriendList(string $deviceId): array
|
||||
{
|
||||
echo "VendorA: Getting friend list for device {$deviceId}\n";
|
||||
return [
|
||||
['id' => 'friend1_va', 'nickname' => 'VendorA Friend 1', 'remark' => 'VA-F1'],
|
||||
];
|
||||
}
|
||||
|
||||
public function getDeviceInfo(string $deviceId): array
|
||||
{
|
||||
echo "VendorA: Getting device info for device {$deviceId}\n";
|
||||
return ['id' => $deviceId, 'status' => 'online_va', 'battery' => '80%'];
|
||||
}
|
||||
|
||||
public function bindDeviceToCompany(string $deviceId, string $companyId): bool
|
||||
{
|
||||
echo "VendorA: Binding device {$deviceId} to company {$companyId}\n";
|
||||
return true;
|
||||
}
|
||||
|
||||
// ... 实现接口中的其他方法
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
namespace WeChatDeviceApi\Contracts;
|
||||
|
||||
interface WeChatServiceInterface
|
||||
{
|
||||
/**
|
||||
* 添加好友
|
||||
* @param string $deviceId 设备ID
|
||||
* @param string $targetWxId 目标微信ID
|
||||
* @return bool 是否成功
|
||||
* @throws \WeChatDeviceApi\Exceptions\ApiException
|
||||
// * @throws \WeChatDeviceApi\Exceptions\DeviceOfflineException
|
||||
*/
|
||||
public function addFriend(string $deviceId, string $targetWxId): bool;
|
||||
|
||||
/**
|
||||
* 朋友圈点赞
|
||||
* @param string $deviceId 设备ID
|
||||
* @param string $momentId 朋友圈ID
|
||||
* @return bool 是否成功
|
||||
*/
|
||||
public function likeMoment(string $deviceId, string $momentId): bool;
|
||||
|
||||
/**
|
||||
* 获取群列表
|
||||
* @param string $deviceId 设备ID
|
||||
* @return array 群信息列表
|
||||
*/
|
||||
public function getGroupList(string $deviceId): array;
|
||||
|
||||
/**
|
||||
* 获取好友列表
|
||||
* @param string $deviceId 设备ID
|
||||
* @return array 好友信息列表
|
||||
*/
|
||||
public function getFriendList(string $deviceId): array;
|
||||
|
||||
/**
|
||||
* 获取设备信息
|
||||
* @param string $deviceId 设备ID
|
||||
* @return array 设备详情
|
||||
*/
|
||||
public function getDeviceInfo(string $deviceId): array;
|
||||
|
||||
/**
|
||||
* 绑定设备到公司
|
||||
* @param string $deviceId 设备ID
|
||||
* @param string $companyId 公司ID
|
||||
* @return bool 是否成功
|
||||
*/
|
||||
public function bindDeviceToCompany(string $deviceId, string $companyId): bool;
|
||||
|
||||
// ... 其他方法定义
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
namespace WeChatDeviceApi\Exceptions;
|
||||
|
||||
class ApiException extends \RuntimeException // 或者 \Exception
|
||||
{
|
||||
// 可以添加更多上下文信息
|
||||
}
|
||||
94
Server/extend/WeChatDeviceApi/Manager.php
Normal file
94
Server/extend/WeChatDeviceApi/Manager.php
Normal file
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
namespace WeChatDeviceApi;
|
||||
|
||||
use think\facade\Config;
|
||||
use WeChatDeviceApi\Contracts\WeChatServiceInterface;
|
||||
|
||||
class Manager
|
||||
{
|
||||
/**
|
||||
* @var array 适配器实例缓存
|
||||
*/
|
||||
protected $adapters = [];
|
||||
|
||||
/**
|
||||
* @var array 配置
|
||||
*/
|
||||
protected $config;
|
||||
|
||||
public function __construct(array $config = null)
|
||||
{
|
||||
$this->config = $config ?: Config::get('wechat_device_api.');
|
||||
if (empty($this->config)) {
|
||||
throw new \InvalidArgumentException("WeChat Device API configuration not found.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取指定的适配器实例
|
||||
*
|
||||
* @param string|null $name 适配器名称 (例如 'vendor_a', 'vendor_b'),null 则使用默认
|
||||
* @return WeChatServiceInterface
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function adapter(string $name = null): WeChatServiceInterface
|
||||
{
|
||||
$name = $name ?: $this->getDefaultAdapterName();
|
||||
|
||||
if (!isset($this->config['adapters'][$name])) {
|
||||
throw new \InvalidArgumentException("Adapter [{$name}] configuration not found.");
|
||||
}
|
||||
|
||||
if (!isset($this->adapters[$name])) {
|
||||
$this->adapters[$name] = $this->createAdapter($name);
|
||||
}
|
||||
|
||||
return $this->adapters[$name];
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建适配器实例
|
||||
*
|
||||
* @param string $name
|
||||
* @return WeChatServiceInterface
|
||||
*/
|
||||
protected function createAdapter(string $name): WeChatServiceInterface
|
||||
{
|
||||
$adapterConfig = $this->config['adapters'][$name];
|
||||
$driverClass = $adapterConfig['driver'] ?? null;
|
||||
|
||||
if (!$driverClass || !class_exists($driverClass)) {
|
||||
throw new \InvalidArgumentException("Driver class for adapter [{$name}] not found or not specified.");
|
||||
}
|
||||
|
||||
$adapterInstance = new $driverClass($adapterConfig);
|
||||
|
||||
if (!$adapterInstance instanceof WeChatServiceInterface) {
|
||||
throw new \LogicException("Driver class [{$driverClass}] must implement WeChatServiceInterface.");
|
||||
}
|
||||
|
||||
return $adapterInstance;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取默认适配器名称
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getDefaultAdapterName(): string
|
||||
{
|
||||
return $this->config['default_adapter'] ?? '';
|
||||
}
|
||||
|
||||
/**
|
||||
* 动态调用默认适配器的方法
|
||||
*
|
||||
* @param string $method
|
||||
* @param array $parameters
|
||||
* @return mixed
|
||||
*/
|
||||
public function __call(string $method, array $parameters)
|
||||
{
|
||||
return $this->adapter()->{$method}(...$parameters);
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user