# MathPage 公共工具

这个目录包含了数学页面的公共工具和复用代码。

## mathPageMixin.ts

提供了所有数学页面的公共功能，包括：

- Canvas 初始化
- 分享功能（小程序分享、朋友圈分享）
- 导出打印功能
- 页面信息初始化

### 使用方法

```typescript
import { getMathPageCommonMethods } from '../common/mathPageMixin';
import YourDrawService from '../service/yourDrawService';

// 获取公共方法，传入页面路径
const commonMethods = getMathPageCommonMethods({
    pagePath: 'yourPage/yourPage', // 相对于 mathPages 目录的路径
});

Page({
    // Canvas 相关属性
    canvas: null as Canvas | null,
    ctx: null as RenderingContext | null,
    boxHeight: 0,
    boxWidth: 0,
    drawService: null as YourDrawService | null,

    // 页面数据（包含公共数据）
    data: {
        functionId: '',
        pageTitle: '',
        subTitle: '',
        hasContent: false,
        showShareDialog: false,
        boxWidth: 0,
        boxHeight: 0,
        // ... 其他页面特定的数据
    },

    onLoad(options: { id?: string }) {
        const functionId = options.id || 'your-function-id';
        // 使用公共方法初始化页面信息
        this.initPageInfo(functionId, '默认标题');
    },

    onReady() {
        // 使用公共方法初始化 Canvas
        this.initCanvas({
            createDrawService: (canvas, ctx, options) => {
                return new YourDrawService(canvas, ctx, options);
            },
            drawServiceOptions: {
                // 传递给绘制服务的选项
            },
            onCanvasReady: () => {
                // Canvas 初始化完成后的回调
                this.onRandom(); // 或其他初始化操作
            },
        });
    },

    // 实现页面特定的绘制逻辑
    async drawCanvas() {
        if (!this.ctx || !this.drawService || !this.yourData) {
            return;
        }
        try {
            await this.drawService.draw(this.yourData);
            this.setData({ hasContent: true });
        } catch (error) {
            console.error('绘制失败:', error);
            this.setData({ hasContent: false });
        }
    },

    // 页面特定的方法
    onRandom() {
        // 生成数据逻辑
        this.drawCanvas();
    },

    // ========== 使用公共方法 ==========
    initCanvas: commonMethods.initCanvas,
    exportToPrint: commonMethods.exportToPrint,
    onShareAppMessage: commonMethods.onShareAppMessage,
    onShareTimeline: commonMethods.onShareTimeline,
    onCloseShareDialog: commonMethods.onCloseShareDialog,
    onShareSuccess: commonMethods.onShareSuccess,
    initPageInfo: commonMethods.initPageInfo,
});
```

### 提供的公共方法

1. **initCanvas(options)** - 初始化 Canvas

    - `createDrawService`: 创建绘制服务的工厂函数
    - `drawServiceOptions`: 传递给绘制服务的选项
    - `onCanvasReady`: Canvas 初始化完成后的回调

2. **drawCanvas()** - 绘制 Canvas 内容（需要子类实现）

3. **exportToPrint()** - 导出打印

4. **onShareAppMessage()** - 小程序分享

5. **onShareTimeline()** - 朋友圈分享

6. **onCloseShareDialog()** - 关闭分享引导弹窗

7. **onShareSuccess()** - 分享成功回调

8. **initPageInfo(functionId, defaultTitle)** - 初始化页面信息
    - 从 `MATH_FUNCTION_TYPES` 中获取标题和描述
    - 设置导航栏标题

### 优势

- ✅ **代码复用**: 消除了重复代码
- ✅ **类型安全**: 完整的 TypeScript 类型支持
- ✅ **易于维护**: 公共功能集中管理
- ✅ **灵活扩展**: 每个页面可以重写特定方法

### 迁移指南

从旧代码迁移到使用 mixin：

1. 导入公共方法
2. 移除重复的方法（exportToPrint、分享相关等）
3. 使用 `initCanvas` 替代原有的 Canvas 初始化代码
4. 使用 `initPageInfo` 替代页面信息初始化代码
5. 将公共方法添加到 Page 配置中
