2026-04-18-23-19-44 - 七项优化:排版对齐、间距微调、PDF文件名、北京时间、模板批量操作
This commit is contained in:
90
工程分析/实现方案-2026-04-18-23-19-44.md
Normal file
90
工程分析/实现方案-2026-04-18-23-19-44.md
Normal file
@@ -0,0 +1,90 @@
|
||||
# 实现方案 —— 2026-04-18-23-19-44
|
||||
|
||||
## 方案目标
|
||||
修复排版对齐问题,优化导出文件名,实现模板批量操作。
|
||||
|
||||
## 需求 1:修复 field-value 输入内容往上飘
|
||||
|
||||
### 修改文件
|
||||
`src/utils/defaultContent.ts`、`src/utils/print.ts`
|
||||
|
||||
### 修改内容
|
||||
- `defaultContent.ts` 中 `smartField()`:
|
||||
- `vertical-align:text-bottom` → `vertical-align:baseline`
|
||||
- `line-height:1.2;min-height:1.2em;` → `line-height:inherit;`
|
||||
- `print.ts` 中 `.field-value` 打印样式同步修改 `vertical-align:baseline; line-height:inherit;`
|
||||
- 打印时下划线 `padding-bottom` 改为 `1px` 以紧贴文字
|
||||
|
||||
## 需求 2、3、4:微调排版间距和 Logo 位置
|
||||
|
||||
### 修改文件
|
||||
`src/utils/defaultContent.ts`
|
||||
|
||||
### 修改内容
|
||||
- 姓名栏横线:`padding-bottom: 1px;`(原来是 `padding: 0 0 1px 0`,可能需要调整)
|
||||
- 手术记录标题:`margin-top: 2px;`(原来是 `margin-bottom: 8px` 等,需要精确调整)
|
||||
- Logo:使用 `position:absolute` 向左上偏移 5px,或调整父容器 `gap`/`margin`
|
||||
|
||||
## 需求 5:导出 PDF 文件名修正
|
||||
|
||||
### 修改文件
|
||||
`src/utils/print.ts`
|
||||
|
||||
### 修改内容
|
||||
在 `printDocument` 函数中:
|
||||
1. 保存原始 `document.title`
|
||||
2. 设置 `document.title = docTitle`
|
||||
3. 打印完成后恢复 `document.title = originalTitle`
|
||||
|
||||
这样浏览器在 `window.print()` 时会使用正确的文件名。
|
||||
|
||||
## 需求 6:导出 JSON 时间使用北京时间
|
||||
|
||||
### 修改文件
|
||||
`src/pages/ReportEditor.tsx`、`src/pages/ReportManage.tsx`、`src/pages/TemplateManage.tsx`
|
||||
|
||||
### 修改内容
|
||||
定义一个全局格式化函数 `getBeijingTimeStr()`:
|
||||
```ts
|
||||
const getBeijingTimeStr = () => {
|
||||
const d = new Date();
|
||||
const bjTime = new Date(d.getTime() + (8 * 60 * 60 * 1000));
|
||||
return bjTime.toISOString().replace(/T/, '-').replace(/:/g, '-').slice(0, 16);
|
||||
};
|
||||
```
|
||||
|
||||
替换所有 `new Date().toISOString().replace(/[:.]/g, '-')` 的调用。
|
||||
|
||||
## 需求 7:模板管理批量操作
|
||||
|
||||
### 修改文件
|
||||
`src/pages/TemplateManage.tsx`
|
||||
|
||||
### 修改内容
|
||||
1. **新增状态**:`const [selectedIds, setSelectedIds] = useState<string[]>([]);`
|
||||
2. **批量删除**:`handleBatchDelete()` 过滤掉选中 ID,清空 `selectedIds`
|
||||
3. **批量导出**:`handleBatchExport()` 将选中模板打包为 JSON 数组下载
|
||||
4. **UI 调整**:
|
||||
- 模板列表每行前增加复选框
|
||||
- 当有选中项时,显示批量操作工具栏(批量删除 + 批量导出)
|
||||
5. **允许空列表**:移除 `templates.length > 1` 对删除按钮的限制(改为只在批量删除时确认)
|
||||
|
||||
### 冲突检查
|
||||
- 现有 `handleDeleteTemplate` 单个删除逻辑可复用
|
||||
- `Login.tsx` 中的默认模板初始化逻辑需要检查:如果用户删除了所有模板,系统是否会在登录时强制创建默认模板
|
||||
|
||||
## 涉及文件及修改点
|
||||
| 文件 | 修改点 |
|
||||
|------|--------|
|
||||
| `src/utils/defaultContent.ts` | smartField 基线对齐;姓名栏间距;手术记录间距;Logo 位置 |
|
||||
| `src/utils/print.ts` | field-value 打印样式;document.title 动态设置 |
|
||||
| `src/pages/ReportEditor.tsx` | 导出文件名使用北京时间 |
|
||||
| `src/pages/ReportManage.tsx` | 导出文件名使用北京时间 |
|
||||
| `src/pages/TemplateManage.tsx` | 导出文件名使用北京时间;批量操作状态和 UI |
|
||||
|
||||
## 风险与注意事项
|
||||
1. `vertical-align:baseline` 后,需要验证不同字号混合时(如 11pt 正文 + 12pt 字段)的对齐效果。
|
||||
2. Logo 使用 `position:absolute` 时需要确保父容器有 `position:relative`,且不会遮挡其他元素。
|
||||
3. 修改 `document.title` 后需确保在打印失败或用户取消时也能恢复。
|
||||
4. 批量删除后如果 `currentTemplateId` 被删除,需要重置为 `null` 或自动选中其他模板。
|
||||
5. 北京时间计算 `new Date(d.getTime() + (8 * 60 * 60 * 1000))` 在夏令时转换时可能有 1 小时偏差,但中国大陆不使用夏令时,所以安全。
|
||||
73
工程分析/测试方案-2026-04-18-23-19-44.md
Normal file
73
工程分析/测试方案-2026-04-18-23-19-44.md
Normal file
@@ -0,0 +1,73 @@
|
||||
# 测试方案 —— 2026-04-18-23-19-44
|
||||
|
||||
## 测试目标
|
||||
验证排版修复、导出文件名优化和模板批量操作的正确性。
|
||||
|
||||
## 测试用例
|
||||
|
||||
### TC-1:field-value 文字与正文齐平
|
||||
**前置条件**:新建报告,加载默认模板。
|
||||
**步骤**:
|
||||
1. 在「姓名」字段中输入文字。
|
||||
2. 观察文字与「姓名:」的基线对齐情况。
|
||||
**预期结果**:字段中的文字与周围正文在同一水平线上,无明显上浮。
|
||||
|
||||
### TC-2:打印时下划线紧贴文字
|
||||
**前置条件**:模板中有带下划线的字段。
|
||||
**步骤**:
|
||||
1. 点击打印预览。
|
||||
2. 观察下划线与文字的距离。
|
||||
**预期结果**:下划线与文字底部距离约 1px,不悬空。
|
||||
|
||||
### TC-3:排版间距微调
|
||||
**前置条件**:默认模板已加载。
|
||||
**步骤**:
|
||||
1. 观察「姓名:」与下方横线的距离。
|
||||
2. 观察「手术记录」与上方横线的距离。
|
||||
3. 观察 Logo 与医院名称的相对位置。
|
||||
**预期结果**:
|
||||
- 姓名栏横线紧贴文字下方(约 1px)
|
||||
- 手术记录距上方横线约 2px
|
||||
- Logo 比原来偏左上约 5px
|
||||
|
||||
### TC-4:导出 PDF 文件名正确
|
||||
**前置条件**:报告已填写完整信息。
|
||||
**步骤**:
|
||||
1. 点击「导出报告」→「导出 PDF」。
|
||||
**预期结果**:浏览器保存对话框中的默认文件名为 `图文报告-{title}-{patient}-{hid}-{time}.pdf`,而非「My Google AI Studio App.pdf」。
|
||||
|
||||
### TC-5:导出 JSON 时间使用北京时间
|
||||
**前置条件**:任意可导出 JSON 的页面。
|
||||
**步骤**:
|
||||
1. 点击导出 JSON。
|
||||
2. 查看文件名中的时间戳。
|
||||
**预期结果**:时间戳为北京时间(如当前是北京时间 23:19,文件名中应显示 23-19 而非 15-19)。
|
||||
|
||||
### TC-6:模板批量删除
|
||||
**前置条件**:模板列表中有多个模板。
|
||||
**步骤**:
|
||||
1. 选中 2 个模板的复选框。
|
||||
2. 点击「批量删除」。
|
||||
3. 确认删除。
|
||||
**预期结果**:选中的模板被删除,列表中不再显示。未选中的模板保留。
|
||||
|
||||
### TC-7:模板批量导出
|
||||
**前置条件**:模板列表中有多个模板。
|
||||
**步骤**:
|
||||
1. 选中 2 个模板的复选框。
|
||||
2. 点击「批量导出」。
|
||||
**预期结果**:下载的 JSON 文件包含 2 个模板的完整数据(名称、描述、内容、字段配置)。
|
||||
|
||||
### TC-8:允许空模板列表
|
||||
**前置条件**:模板列表中有模板。
|
||||
**步骤**:
|
||||
1. 选中所有模板并批量删除。
|
||||
**预期结果**:列表显示为空,无报错。
|
||||
|
||||
## 回归测试
|
||||
- 确保打印功能正常,样式无异常。
|
||||
- 确保单个模板导出/导入功能正常。
|
||||
- 确保报告编辑、保存、加载功能正常。
|
||||
|
||||
## 测试通过标准
|
||||
所有用例均通过,无控制台报错,排版对齐准确,文件名正确。
|
||||
43
工程分析/需求分析-2026-04-18-23-19-44.md
Normal file
43
工程分析/需求分析-2026-04-18-23-19-44.md
Normal file
@@ -0,0 +1,43 @@
|
||||
# 需求分析 —— 2026-04-18-23-19-44
|
||||
|
||||
## 需求来源
|
||||
用户在实际使用和打印预览中发现多项排版和功能优化点。
|
||||
|
||||
## 需求概述
|
||||
|
||||
### 需求 1:修复 field-value 输入内容往上飘
|
||||
`.field-value` 输入框中的文字与模板正文不在同一基线上,总是向上偏移。即使去掉下划线,也希望文字内容与周围正文齐平。
|
||||
|
||||
### 需求 2:姓名栏下方横线距离过远
|
||||
「姓名:」下方的横线(`border-bottom`)与「姓名:」文字之间的距离太远,希望缩小到约 1px。
|
||||
|
||||
### 需求 3:手术记录标题距上方横线过远
|
||||
「手术记录」标题与上方医院名称的横线之间距离过大,希望缩小到约 2px。
|
||||
|
||||
### 需求 4:Logo 插图位置微调
|
||||
Logo 占位符相对于「西安交通大学第一附属医院 手术记录」的文字整体偏右下,希望向左移动 5px,向上移动 5px。
|
||||
|
||||
### 需求 5:导出 PDF 文件名修正
|
||||
点击「导出报告」导出 PDF 时,浏览器默认文件名为「My Google AI Studio App.pdf」,希望改为与报告内容相关的自定义文件名(如 `图文报告-{title}-{patient}-{hid}-{time}.pdf`)。
|
||||
|
||||
### 需求 6:导出 JSON 文件名时间使用北京时间
|
||||
导出 JSON 时文件名中的时间戳使用 `new Date().toISOString()`(UTC 时间),希望改为北京时间(UTC+8)。
|
||||
|
||||
### 需求 7:模板管理批量操作
|
||||
在模板列表中为每个模板增加复选框,支持:
|
||||
- 批量导出(将选中的多个模板打包为一个 JSON 文件)
|
||||
- 批量删除(删除选中的多个模板)
|
||||
- 允许列表中不留任何模板
|
||||
|
||||
## 涉及文件
|
||||
- `src/utils/defaultContent.ts`(需求 1、2、3、4)
|
||||
- `src/utils/print.ts`(需求 1、5)
|
||||
- `src/pages/ReportEditor.tsx`(需求 5、6)
|
||||
- `src/pages/ReportManage.tsx`(需求 6)
|
||||
- `src/pages/TemplateManage.tsx`(需求 6、7)
|
||||
|
||||
## 需求影响范围
|
||||
- 默认模板排版细节(基线对齐、间距、Logo 位置)
|
||||
- 打印样式(下划线紧贴文字)
|
||||
- 导出文件名生成逻辑
|
||||
- 模板列表交互(复选框、批量操作)
|
||||
Reference in New Issue
Block a user