submit cursor rule

This commit is contained in:
xavier
2025-05-07 17:43:39 +08:00
parent 21a6907e52
commit 6fa41e3f4a
14 changed files with 1755 additions and 980 deletions

View 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扩展

View 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/** - 模块配置,包括独立的路由配置

View 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) 提供系统管理功能:
- 用户管理
- 权限管理
- 系统配置

View 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
- 等其他扩展包

View 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`
- 支持设备状态实时推送
- 支持消息实时通知
- 支持任务执行状态更新

View 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/`目录下。

View 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)
通过队列可以实现高效的消息推送,避免阻塞主进程。

View File

@@ -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",

View 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', ''),
],
// ... 更多供应商
],
];

View 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;
}
// ... 实现接口中的其他方法
}

View File

@@ -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;
// ... 其他方法定义
}

View File

@@ -0,0 +1,7 @@
<?php
namespace WeChatDeviceApi\Exceptions;
class ApiException extends \RuntimeException // 或者 \Exception
{
// 可以添加更多上下文信息
}

View 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