name: 模板系统代码设计 overview: 基于现有代码结构和前端原型,设计并实现完整的模板系统,包括模板CRUD、占位符解析、数据源绑定、模板渲染、复制/替换模式等核心功能。 todos:
flowchart TB
subgraph Frontend[前端]
TemplateList[模板列表]
TemplateEditor[模板编辑器]
TemplatePreview[模板预览]
end
subgraph Backend[后端 graph-service]
Controller[TemplateController]
Service[TemplateService]
Renderer[TemplateRenderService]
Parser[PlaceholderParser]
Repository[TemplateRepository]
end
subgraph Dependencies[依赖服务]
DataSourceService[DataSourceService]
DocumentService[DocumentService]
end
TemplateList --> Controller
TemplateEditor --> Controller
TemplatePreview --> Controller
Controller --> Service
Controller --> Renderer
Service --> Repository
Renderer --> Parser
Renderer --> DataSourceService
Service --> DataSourceService
{
"{{项目名称}}": {
"dataSourceId": "ds_001",
"type": "text",
"defaultValue": "未设置"
},
"{{投资金额}}": {
"dataSourceId": "ds_002",
"type": "text",
"format": "currency"
},
"{{市场数据表}}": {
"dataSourceId": "ds_003",
"type": "table"
},
"{{项目图片}}": {
"dataSourceId": "ds_004",
"type": "image"
}
}
# {{项目名称}}可行性研究报告
## 一、项目概述
本项目预计总投资{{投资金额}},位于{{项目地点}}。
## 二、市场分析
{{市场数据表}}
## 三、项目效果
{{项目图片}}
graph-service/src/main/java/com/lingyue/graph/
├── controller/
│ └── TemplateController.java # 模板API接口
├── service/
│ ├── TemplateService.java # 模板业务逻辑
│ └── TemplateRenderService.java # 模板渲染服务
├── dto/
│ ├── CreateTemplateRequest.java # 创建模板请求
│ ├── UpdateTemplateRequest.java # 更新模板请求
│ ├── CopyTemplateRequest.java # 复制模板请求
│ ├── ReplaceDataSourceRequest.java # 替换数据源请求
│ ├── TemplateRenderRequest.java # 渲染请求
│ ├── TemplateRenderResult.java # 渲染结果
│ ├── PlaceholderInfo.java # 占位符信息
│ └── PlaceholderMapping.java # 占位符映射
└── util/
└── PlaceholderParser.java # 占位符解析工具
| 方法 | 路径 | 描述 |
|-----|------|-----|
| POST | /api/templates | 创建模板 |
| GET | /api/templates/{id} | 获取模板详情 |
| GET | /api/templates | 查询模板列表 |
| PUT | /api/templates/{id} | 更新模板 |
| DELETE | /api/templates/{id} | 删除模板 |
| POST | /api/templates/{id}/copy | 复制模板 |
| PUT | /api/templates/{id}/placeholders | 更新占位符映射 |
| POST | /api/templates/{id}/replace-datasources | 批量替换数据源 |
| POST | /api/templates/{id}/render | 渲染模板 |
| GET | /api/templates/{id}/placeholders | 获取占位符列表 |
public interface TemplateService {
// CRUD
Template create(String userId, CreateTemplateRequest request);
Template getById(String id);
List<Template> getByUserId(String userId);
Template update(String id, UpdateTemplateRequest request);
void delete(String id);
// 复制模式
Template copy(String sourceTemplateId, CopyTemplateRequest request);
// 占位符管理
List<PlaceholderInfo> extractPlaceholders(String content);
Template updatePlaceholderMapping(String id, Map<String, PlaceholderMapping> mapping);
// 批量替换数据源
Template replaceDataSources(String id, ReplaceDataSourceRequest request);
}
public interface TemplateRenderService {
// 渲染模板
TemplateRenderResult render(String templateId);
TemplateRenderResult render(Template template);
// 预览渲染(不保存)
TemplateRenderResult preview(String templateId);
// 渲染单个占位符
String renderPlaceholder(String placeholder, PlaceholderMapping mapping);
}
sequenceDiagram
participant Client
participant Controller as TemplateController
participant RenderService as TemplateRenderService
participant Parser as PlaceholderParser
participant DataSourceService
Client->>Controller: POST /templates/{id}/render
Controller->>RenderService: render(templateId)
RenderService->>RenderService: getTemplate(id)
RenderService->>Parser: extractPlaceholders(content)
Parser-->>RenderService: List<PlaceholderInfo>
loop 每个占位符
RenderService->>RenderService: getMapping(placeholder)
RenderService->>DataSourceService: getValue(dataSourceId)
DataSourceService-->>RenderService: DataSourceValue
RenderService->>RenderService: formatValue(value, type)
end
RenderService->>RenderService: replacePlaceholders()
RenderService-->>Controller: TemplateRenderResult
Controller-->>Client: 渲染结果
sequenceDiagram
participant Client
participant Controller as TemplateController
participant Service as TemplateService
participant Repository as TemplateRepository
Client->>Controller: POST /templates/{id}/copy
Controller->>Service: copy(sourceId, request)
Service->>Repository: selectById(sourceId)
Repository-->>Service: 源模板
Service->>Service: 复制模板内容和占位符映射
Service->>Service: 设置sourceTemplateId
Service->>Repository: insert(newTemplate)
Repository-->>Service: 新模板
Service-->>Controller: Template
Controller-->>Client: 新模板信息
{{占位符名称}}\{\{([^}]+)\}\}支持两种替换方式:
{"oldDataSourceId": "newDataSourceId"}public class TemplateRenderResult {
private String templateId;
private String renderedContent; // HTML格式
private String renderedMarkdown; // Markdown格式
private String renderedPlainText; // 纯文本格式
private List<RenderDetail> details; // 每个占位符的渲染详情
private List<String> warnings; // 警告信息(如数据源缺失)
private Map<String, Object> metadata;
}
| 类型 | 处理方式 |
|-----|---------|
| text | 直接替换为文本值 |
| image | 生成 <img> 标签或 Markdown 图片语法 |
| table | 生成 HTML 表格或 Markdown 表格 |
| mixed | 根据实际数据类型自动处理 |