Anyon e634118a22 refactor(plugin): 迁移 v8 插件化组件体系
将 v6 中直接放在本地 app 的后台与微信能力迁移为 v8 插件组件,并把运行时基础能力沉淀到独立插件包。

主要内容:

- 新增 think-library、system、worker、static、install 等基础插件包。

- 新增 account、payment、wechat-client、wechat-service、wemall、wuma 等业务插件包。

- 移除 v6 的 app/admin 与 app/wechat 本地应用实现,改由插件分发接管。

- 将 Helper 能力彻底并入 System,统一为 plugin\system\helper\* 命名空间。

- 同步插件迁移发布清单与根 route 占位,保证安装发布流程可复现。
2026-05-08 15:30:46 +08:00

387 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ThinkLibrary
核心基础库,为 ThinkAdmin 提供运行时基础设施。
## 功能定位
- 提供运行时服务、认证会话、路由适配、队列契约等核心能力
- 定义标准控制器、模型、命令等基础类型
- 提供 Helper 工具集(查询、表单、页面构建器)
- 实现 JWT 令牌、CacheSession 等认证机制
- 提供 Storage 门面和标准契约
## 安装
```bash
composer require zoujingli/think-library
```
## 配置
`composer.json` 中注册服务:
```json
{
"extra": {
"think": {
"services": ["think\\admin\\Library"]
}
}
}
```
## 核心功能
### 1. 运行时服务
- **RuntimeService**: 运行时环境配置同步,处理 PHAR 兼容、目录初始化
- **AppService**: 应用管理、插件发现、服务注册、配置管理
- **NodeService**: 节点管理、权限判断、菜单节点处理
- **QueueService**: 队列门面服务(真实实现在 Worker 插件)
### 2. 认证会话
- **JwtToken**: JWT 令牌生成、验证、刷新
- **CacheSession**: 基于 Token SID 的缓存会话管理
- **RequestTokenService**: 请求级令牌识别服务
- **SystemContext**: 系统上下文接口(运行时实现)
- **NullSystemContext**: 空实现上下文(未认证状态)
### 3. 路由适配
- **Route**: 自定义路由对象,支持插件路由注册
- **Url**: URL 构建工具,支持插件 URL 生成
- **MultAccess**: 多应用访问中间件,处理插件前缀切换
### 4. 基础类型
- **Controller**: 标准控制器基类,提供通用控制器方法
- **Model**: 标准模型基类,扩展软删除、时间戳等能力
- **Command**: 标准命令基类,提供命令通用方法
- **Plugin**: 插件管理类,处理插件元数据加载
- **Service**: 服务基类,提供基础服务方法
- **Exception**: 框架异常类,统一异常处理
### 5. Helper 工具
- **QueryHelper**: 数据查询构建器,支持分页、筛选、排序
- **FormBuilder**: 表单构建器,支持表单元素快速生成
- **PageBuilder**: 列表页面构建器,支持表格、筛选、操作列
- **ValidateHelper**: 数据验证器,支持规则验证、错误提示
### 6. 扩展工具
- **CodeToolkit**: 编码工具(加密/解密/Base64/Hash
- **FileTools**: 文件操作工具(目录创建、文件复制、权限管理)
- **HttpClient**: HTTP 客户端cURL 封装、请求构建)
- **ArrayTree**: 数组树工具(树形结构构建、扁平化)
- **FaviconBuilder**: 网站图标生成器
- **ImageSliderVerify**: 图片滑块验证码
- **JsonRpcHttpClient**: JSON-RPC HTTP 客户端
- **JsonRpcHttpServer**: JSON-RPC HTTP 服务端
## 使用示例
### JWT 令牌
```php
use think\admin\service\JwtToken;
// 生成令牌
$token = JwtToken::token([
'user_id' => 1,
'username' => 'admin',
'exp' => time() + 7200
]);
// 验证令牌
try {
$data = JwtToken::verify($token);
// $data['user_id'], $data['username']
} catch (\think\admin\Exception $e) {
// 验证失败
}
```
### CacheSession
```php
use think\admin\service\CacheSession;
// 写入会话
CacheSession::set('key', 'value', 3600);
// 读取会话
$value = CacheSession::get('key', 'default');
// 批量写入
CacheSession::put([
'key1' => 'value1',
'key2' => 'value2'
], 3600);
// 删除会话
CacheSession::delete('key');
// 清空会话
CacheSession::clear();
```
### 控制器基类
```php
<?php
namespace app\index\controller;
use think\admin\Controller;
class Index extends Controller
{
public function index()
{
// 返回成功
$this->success('操作成功', ['id' => 1]);
// 返回失败
$this->error('操作失败');
// 返回视图
$this->fetch('index/index', ['title' => '首页']);
// 数据验证
$data = $this->_vali([
'username.require' => '用户名不能为空',
'email.email' => '邮箱格式不正确'
], 'post');
// 创建异步任务
$this->_queue('导出数据', 'php think export:users');
}
}
```
### 查询构建器
```php
use think\admin\helper\QueryHelper;
// 基础查询
$query = QueryHelper::init(User::class)
->where('status', 1)
->order('id', 'DESC')
->paginate(20);
// 分页查询
$page = $query->getPage();
$list = $query->getList();
// 条件筛选
$query->addWhere($request->get('keyword'), 'username', 'like');
$query->addFilter($request->get('status'), 'status');
```
### 表单构建器
```php
use think\admin\helper\FormBuilder;
$form = FormBuilder::create();
// 文本输入
$form->text('username', '用户名')
->required()
->placeholder('请输入用户名');
// 下拉选择
$form->select('status', '状态')
->options([1 => '正常', 0 => '禁用'])
->default(1);
// 日期选择
$form->date('birthday', '生日');
// 文件上传
$form->file('avatar', '头像')
->image()
->size(2); // 限制 2MB
// 保存数据
if ($form->isPost()) {
$data = $form->getData();
// 保存逻辑
}
```
## 目录结构
```
think-library/
├── src/
│ ├── contract/ # 标准契约接口
│ │ ├── SystemContextInterface.php
│ │ └── ...
│ ├── extend/ # 扩展工具类
│ │ ├── ArrayTree.php
│ │ ├── CodeToolkit.php
│ │ ├── FileTools.php
│ │ └── HttpClient.php
│ ├── helper/ # 构建器工具
│ │ ├── FormBuilder.php
│ │ ├── PageBuilder.php
│ │ ├── QueryHelper.php
│ │ └── ValidateHelper.php
│ ├── middleware/ # 中间件
│ │ └── MultAccess.php
│ ├── model/ # 模型扩展
│ │ └── QueryFactory.php
│ ├── route/ # 路由相关
│ │ ├── Route.php
│ │ └── Url.php
│ ├── runtime/ # 运行时上下文
│ │ ├── RequestContext.php
│ │ ├── RequestTokenService.php
│ │ ├── SystemContext.php
│ │ └── NullSystemContext.php
│ ├── service/ # 核心服务
│ │ ├── AppService.php
│ │ ├── CacheSession.php
│ │ ├── JwtToken.php
│ │ ├── NodeService.php
│ │ ├── QueueService.php
│ │ └── RuntimeService.php
│ ├── common.php # 全局函数
│ ├── Controller.php # 标准控制器
│ ├── Model.php # 标准模型
│ ├── Command.php # 标准命令
│ ├── Plugin.php # 插件管理
│ ├── Service.php # 服务基类
│ ├── Library.php # 服务注册类
│ └── Exception.php # 异常类
└── tests/ # 单元测试
```
## 全局函数
ThinkLibrary 提供以下全局函数:
### 全局函数
ThinkLibrary 提供以下全局函数:
#### 应用相关
- `syspath($path)`: 获取系统根目录路径PHAR 环境下返回包内路径)
- `runpath($path)`: 获取运行时目录路径PHAR 环境下返回外部可写目录)
- `sysconf($name, $default = null)`: 读取系统配置
- `sysvar($key, $value = null)`: 读写系统变量
- `isOnline()`: 判断是否生产环境(非调试模式)
#### URL 相关
- `sysuri($node, $vars = [], $suffix = true)`: 生成系统 URL后台页面
- `apiuri($node, $vars = [], $suffix = true)`: 生成 API URL接口调用
- `plguri($node, $vars = [], $suffix = true)`: 生成插件工作台 URL由 ThinkPlugsSystem 提供)
#### 认证相关
- `auth($node)`: 检查权限(判断当前用户是否有指定节点权限)
- `admin_user()`: 获取当前管理员信息(已认证的系统用户)
- `tsession($name = null, $default = null)`: 读写 Token 会话(基于 CacheSession
#### 工具函数
- `xss_safe($str)`: XSS 安全过滤(过滤危险 HTML/JS 标签)
- `str2arr($str)`: 字符串转数组(支持逗号、分号、换行分隔)
- `arr2str($arr)`: 数组转字符串(逗号连接)
- `data_save($dbQuery, $data, $key = 'id', $where = [])`: 数据保存(新增或更新)
- `normalize($text)`: 文本标准化(全角转半角、统一空格等)
## 依赖要求
- PHP >= 8.1
- ThinkPHP >= 8.1
- 扩展gd, curl, json, zlib, iconv, openssl, mbstring, fileinfo
- 推荐redis (用于 CacheSession 和缓存驱动)
## 开发规范
### 命名空间
所有类使用 `think\admin\` 命名空间
### 代码风格
遵循 PSR-12 规范,使用 PHP-CS-Fixer 统一代码风格
```bash
# 运行代码风格修复
vendor/bin/php-cs-fixer fix
```
### 测试规范
每个核心功能都应该有对应的单元测试
```bash
# 运行 ThinkLibrary 测试
vendor/bin/phpunit plugin/think-library/tests/
```
### 静态分析
使用 PHPStan 进行静态代码分析
```bash
# 运行代码分析
composer analyse
```
## 认证说明
### JWT 令牌
- 后台认证统一使用 `Authorization: Bearer <JWT>`
- JWT 有效期由 `config/app.php` 中的 `system_token_expire` 配置
- JWT 内包含 `sid` 用于绑定 CacheSession
- 不再使用标准 PHP Session 承载后台登录态
### Token Session
- 基于 `CacheSession` 实现
- 统一入口为 `tsession()` 函数
- 支持 file 和 redis 等多种缓存驱动
- 临时用户态绑定到 Token 的 `sid`
## PHAR 兼容性
当使用 PHAR 打包运行时:
- `syspath()` 返回 PHAR 包内路径(只读资源)
- `runpath()` 返回 PHAR 外部路径(可写目录)
- 字体、SQLite、缓存等落盘操作必须使用 `runpath()`
- GD 的 `imagettftext()` 不支持 `phar://` 路径
## 测试覆盖
当前测试覆盖包括:
- 代码加密解密工具测试
- JWT 令牌生成验证测试
- 通用函数测试
- 架构边界测试
- 插件依赖边界测试
- 迁移归属测试
- 表单/页面构建器测试
- 请求令牌服务测试
- 多应用访问调度测试
## 许可证
MIT License
## 相关链接
- 官网文档https://thinkadmin.top
- Gitee: https://gitee.com/zoujingli/ThinkLibrary
- Github: https://github.com/zoujingli/ThinkLibrary