6.3 KiB
6.3 KiB
绘制服务重构总结
重构目标
基于 baseDraw.ts 和 baseHeaderDraw.ts 统一所有绘制服务的公共部分,提取并统一 Header 绘制功能。
完成的工作
1. ✅ 统一基础服务类
所有绘制服务现在都继承自 BaseDrawService(位于 service/baseDraw.ts):
- ✅
AdditionDraw- 加减法计算 - ✅
CompareDraw- 数一数比大小 - ✅
CountMatchDraw- 数一数连一连 - ✅
CountingSelectDraw- 数一数选一选/填一填 - ✅
MissingNumberDraw- 填上缺少的数字 - ✅
NumberColorDraw- 按数字涂颜色 - ✅
NumberDecomposeDraw- 10以内数的分与合 - ✅
NumberFindDraw- 数字涂色(找数字、写数字)
2. ✅ 统一 Header 绘制
所有服务使用统一的 Header 绘制功能(位于 service/baseHeaderDraw.ts):
drawBaseHeader()- 完整 Header(包含 Logo、应用名称、标题、副标题)drawBaseMiniHeader()- 迷你 Header(简化版本)
3. ✅ 修复相关导入
- ✅ 修复
base/pageMixin.ts中的导入路径- 从
../mathPages/service/baseMathDraw改为../service/baseDraw
- 从
4. ✅ 清理旧文件
- ✅ 删除
mathPages/shared/service/baseMathDraw.ts(已被BaseDrawService替代) - ✅ 删除
mathPages/shared/service/mathHeaderDraw.ts(已被baseHeaderDraw.ts替代)
架构设计
基础服务类 (BaseDrawService)
提供以下公共功能:
class BaseDrawService {
// Canvas 和上下文
canvas: Canvas;
ctx: RenderingContext;
// 配置
options: Record<string, any>;
paperSize: PaperSize;
headerType: PrintHeader;
// 坐标管理
currentX: number;
currentY: number;
canvasWidth: number;
canvasHeight: number;
// 公共方法
setPrintConfig(); // 设置打印配置
setPaper(); // 设置 Paper 尺寸
clear(); // 清除画布
drawHeader(); // 绘制完整 Header
drawMiniHeader(); // 绘制迷你 Header
drawDivider(); // 绘制分割线
}
Header 绘制 (baseHeaderDraw.ts)
提供统一的 Header 绘制函数:
-
drawBaseHeader()- 支持多种 Header 类型:wechat- 微信小程序码(默认)LogoImage- Logo 图片noLogoImage- 无 Logominimal- 极简模式
-
drawBaseMiniHeader()- 迷你版本,居中显示
具体服务类
每个具体服务类:
-
继承
BaseDrawService -
实现
draw()方法,通常包含以下步骤:async draw(data: any) { // 1. 设置配置 this.setPrintConfig(); // 2. 清除并设置 Paper this.clear(); this.setPaper(); // 3. 绘制 Header if (this.headerType !== 'minimal') { await this.drawHeader(); } else { this.drawMiniHeader(); } // 4. 绘制分割线 this.drawDivider(); // 5. 绘制内容(调用 ContentDraw 函数) await drawXXXContent({ canvas: this.canvas, ctx: this.ctx, data: data, canvasWidth: this.canvasWidth, startY: this.currentY, }); } -
使用 ContentDraw 函数绘制具体内容(例如
drawAdditionContent)
文件结构
service/
├── baseDraw.ts # 基础绘制服务类 ✅
├── baseHeaderDraw.ts # Header 绘制函数 ✅
└── ...
mathPages/shared/service/
├── additionDraw.ts # 加减法绘制服务 ✅
├── compareDraw.ts # 比较绘制服务 ✅
├── countMatchDraw.ts # 连线绘制服务 ✅
├── countingSelectDraw.ts # 选择绘制服务 ✅
├── missingNumberDraw.ts # 缺失数字绘制服务 ✅
├── numberColorDraw.ts # 数字涂色绘制服务 ✅
├── numberDecomposeDraw.ts # 分解绘制服务 ✅
├── numberFindDraw.ts # 数字查找绘制服务 ✅
├── additionContentDraw.ts # 加减法内容绘制
├── compareContentDraw.ts # 比较内容绘制
├── ... # 其他 ContentDraw 函数
└── (已删除)
├── baseMathDraw.ts # ❌ 已删除
└── mathHeaderDraw.ts # ❌ 已删除
使用示例
创建新的绘制服务
import { BaseDrawService } from '../../../service/baseDraw';
import { drawMyContent } from './myContentDraw';
class MyDraw extends BaseDrawService {
myData: any;
constructor(
canvas: Canvas,
ctx: RenderingContext,
options?: Record<string, any>,
) {
super(canvas, ctx, options);
this.myData = null;
}
async draw(myData: any) {
if (!myData) return;
this.setPrintConfig();
this.myData = myData;
this.clear();
this.setPaper();
// 绘制 Header
if (this.headerType !== 'minimal') {
await this.drawHeader();
} else {
this.drawMiniHeader();
}
// 绘制内容
this.drawDivider();
await drawMyContent({
canvas: this.canvas,
ctx: this.ctx,
data: this.myData,
canvasWidth: this.canvasWidth,
startY: this.currentY,
});
}
}
export default MyDraw;
优势
- ✅ 代码复用:公共逻辑集中在基类中
- ✅ 统一 Header:所有服务使用相同的 Header 绘制逻辑
- ✅ 易于维护:修改 Header 只需修改一个地方
- ✅ 类型安全:TypeScript 类型支持完整
- ✅ 扩展性好:新增服务只需继承基类并实现
draw()方法
注意事项
- ContentDraw 函数:具体内容绘制函数通常以
drawXXXContent命名,接收参数包括canvas、ctx、数据、canvasWidth、startY等 - 坐标管理:使用
this.currentY管理垂直坐标,ContentDraw 函数需要更新该值 - Header 类型:通过
this.headerType判断使用完整 Header 还是迷你 Header - 逻辑像素:所有尺寸都已除以 3,使用逻辑像素
后续优化建议
- 考虑将 ContentDraw 函数也提取到
service/目录下的统一位置 - 可以考虑创建更多的基础绘制工具函数(如绘制表格、绘制网格等)
- 可以考虑支持更多 Paper 尺寸(目前仅支持 A4)