签入版本

This commit is contained in:
2026-10-08 17:50:29 +08:00
parent 809750b47e
commit e213a9b31d
444 changed files with 39366 additions and 37533 deletions
@@ -1,146 +1,84 @@
# 6.14 文件模板管理
:::tip 概述
文件模板管理用于维护系统中使用的文件模板,支持按编码查询模板。继承 BaseLogic(系统共享,不隔离)。
文件模板管理用于维护系统中使用的文件模板(如导出模板、协议文本等),支持按编码查询模板。`FileTemplateService` 继承 `BaseService`(系统共享,不隔离)。
:::
## 模块特点
| 特性 | 说明 |
|------|------|
| 基类 | BaseLogic(系统共享,不隔离) |
| 文件字段 | file_path(模板文件),保存到 file_template 目录 |
| 唯一校验 | code 全局唯一 |
| 特殊接口 | getTemplateByCode 按编码查询模板 |
| 基类 | `BaseService`(系统共享,不隔离) |
| Trait 组合 | `HasCrudOperations, HasFileProcessing, HasQueryScopes, HasUniqueCheck` |
| 文件字段 | `file_path`(模板文件路径),读取时补全域名 |
| 唯一校验 | `code` 全局唯一 |
| 模糊搜索 | `name`、`code` |
| 特殊接口 | `getTemplateByCode` 按编码查询模板 |
## API 接口
| 方法 | 路径 | 权限码 | 说明 |
|------|------|--------|------|
| GET | `/api/file/template/page` | sys:fileTemplate:page | 分页列表 |
| GET | `/api/file/template/detail/:id` | sys:fileTemplate:detail | 详情 |
| GET | `/api/file/template/detail/{id}` | sys:fileTemplate:detail | 详情 |
| POST | `/api/file/template/add` | sys:fileTemplate:add | 新增 |
| PUT | `/api/file/template/update` | sys:fileTemplate:update | 修改 |
| DELETE | `/api/file/template/delete/:id` | sys:fileTemplate:delete | 删除 |
| DELETE | `/api/file/template/delete/{id}` | sys:fileTemplate:delete | 删除 |
| DELETE | `/api/file/template/batchDelete` | sys:fileTemplate:batchDelete | 批量删除 |
| GET | `/api/file/template/getTemplateByCode/:code` | - | 按编码查询模板 |
| GET | `/api/file/template/getTemplateByCode/{code}` | — | 按编码查询模板 |
## 核心代码
:::tip 路径风格
本模块路由为二级路径 `file/template/*`(2026-10 起由驼峰 `fileTemplate/*` 调整),前端 API 模块 URL 需与之一致。
:::
## Service 配置(来自项目实际代码)
```php
// app/logic/FileTemplateLogic.php
class FileTemplateLogic extends BaseLogic
class FileTemplateService extends BaseService
{
/**
* 关联的模型类
*
* @var string
*/
use HasCrudOperations, HasFileProcessing, HasQueryScopes, HasUniqueCheck;
protected string $modelClass = FileTemplate::class;
/**
* 需要自动处理的文件上传字段
*
* @var array
*/
// 单文件字段:模板文件路径保存时迁移、读取时补全域名
protected array $fileFields = ['file_path'];
/**
* 文件保存的子目录
*
* @var string
*/
protected string $fileSaveDir = 'file_template';
/**
* LIKE 模糊匹配字段
*
* @var array
*/
protected array $pageLikeFields = ['name', 'code'];
protected array $pageEqFields = [];
/**
* 默认排序规则
*
* @var array
*/
protected array $pageOrderBy = ['field' => 'sort', 'type' => 'asc'];
/**
* 唯一性校验字段
*
* @var array
*/
// code 全局唯一
protected array $uniqueFields = ['code'];
// 按编码查询模板
public function getByCode(string $code): ?array
{
$result = FileTemplate::where('code', $code)->find();
return $result ? $result->toArray() : null;
}
// 按编码查询模板(getTemplateByCode 接口使用)
public function getTemplateByCode(string $code): ?array { /* ... */ }
}
```
### Controller 代码
## Controller(getTemplateByCode)
```php
// app/controller/FileTemplateController.php
// app/Http/Controllers/Api/FileTemplateController.php(来自项目实际代码)
class FileTemplateController extends BaseController
public function getTemplateByCode(string $code): JsonResponse
{
protected FileTemplateLogic $logic;
protected function initialize(): void
{
$this->logic = new FileTemplateLogic();
$result = $this->fileTemplateService->getTemplateByCode($code);
if (! $result) {
return $this->fail('模板不存在');
}
#[Log('文件模板-查询分页记录', Log::TYPE_QUERY)]
#[Permission('sys:fileTemplate:page', '模板分页')]
public function page(): Json
{
return parent::_index($this->logic);
}
#[Log('文件模板-新增记录', Log::TYPE_ADD, '新增模板:{name}')]
#[Permission('sys:fileTemplate:add', '添加模板')]
public function add(): Json
{
return parent::_add($this->logic, $this->getJsonBody());
}
#[Log('文件模板-修改记录', Log::TYPE_UPDATE, '修改模板ID:{id}')]
#[Permission('sys:fileTemplate:update', '修改模板')]
public function update(): Json
{
$data = $this->getJsonBody();
$id = $data['id'] ?? 0;
if (empty($id)) return $this->fail('缺少id参数');
return parent::_edit($this->logic, $id, $data);
}
#[Log('文件模板-删除记录', Log::TYPE_DELETE, '删除模板ID:{id}')]
#[Permission('sys:fileTemplate:delete', '删除模板')]
public function delete(int $id): Json
{
return parent::_remove($this->logic, $id);
}
// 按编码查询(无权限注解,已登录即可访问)
#[Log('文件模板-按编码查询', Log::TYPE_QUERY)]
public function getTemplateByCode(string $code): Json
{
$result = $this->logic->getByCode($code);
if (!$result) {
return $this->fail('模板不存在', 404);
}
return $this->success($result);
}
return $this->success($result);
}
```
:::tip 按编码查询
`getTemplateByCode` 接口未配置权限注解,通常用于前端按编码读取模板配置的场景。
:::
`getTemplateByCode` 接口未配置 `#[Permission]` 注解,所有已登录用户均可访问——常用于前端按编码读取模板配置的场景(如打印模板、协议文本动态加载)。
:::
## 使用场景
| 场景 | 编码示例 | 说明 |
|------|---------|------|
| 导出模板 | `export_user` | 前端按编码取模板定义渲染导出字段 |
| 协议/合同文本 | `agreement_v1` | 动态加载富文本模板 |
| 通知文案 | `notice_welcome` | 统一维护文案,改库即生效 |