feat: 完成 4 个TabBar 页面初版样式修改
This commit is contained in:
+86
-69
@@ -12,12 +12,14 @@
|
||||
|
||||
### 1.1 核心原则
|
||||
|
||||
| 原则 | 说明 |
|
||||
| ------------ | ------------------------------------------------------------------------------------------------- |
|
||||
| **成本优先** | 现阶段用云开发免费额度控制成本;**2026-09-15** 前复盘是否续用或迁移自建;核心逻辑仍保持前端执行 |
|
||||
| **渐进增强** | 先小程序跑通,后续再扩展 PC Web,不为未来过度设计 |
|
||||
| **前端为主** | Canvas 渲染、随机生成、PNG 导出等核心逻辑保持前端执行,零服务器成本;后端仅做必要的数据存储和服务 |
|
||||
| **可迁移** | 核心绘制逻辑与平台 API 解耦,为将来迁移 Web 做准备 |
|
||||
|
||||
| 原则 | 说明 |
|
||||
| -------- | ------------------------------------------------------- |
|
||||
| **成本优先** | 现阶段用云开发免费额度控制成本;**2026-09-15** 前复盘是否续用或迁移自建;核心逻辑仍保持前端执行 |
|
||||
| **渐进增强** | 先小程序跑通,后续再扩展 PC Web,不为未来过度设计 |
|
||||
| **前端为主** | Canvas 渲染、随机生成、PNG 导出等核心逻辑保持前端执行,零服务器成本;后端仅做必要的数据存储和服务 |
|
||||
| **可迁移** | 核心绘制逻辑与平台 API 解耦,为将来迁移 Web 做准备 |
|
||||
|
||||
|
||||
### 1.2 后端方案决策
|
||||
|
||||
@@ -51,15 +53,17 @@
|
||||
|
||||
#### 方案对比与选择
|
||||
|
||||
| 维度 | 微信云开发 | 自有云服务器(NestJS) | 现阶段决策(至 2026-09-15) |
|
||||
| ----------- | ----------------------------- | --------------------------- | --------------------------- |
|
||||
| 接入成本 | ⭐ 极低(原生集成) | ⭐⭐ 需搭建部署(~3-5天) | **云开发 ✅** |
|
||||
| 运维成本 | ⭐ 免运维 | ⭐⭐ 需简单维护(PM2 守护) | **云开发 ✅** |
|
||||
| 费用 | 免费额度内 ¥0;超出按套餐计费 | 已有服务器可零增量 | **云开发(阶段内)✅** |
|
||||
| 小程序集成 | ⭐ 鉴权零成本 | ⭐⭐ 需对接微信登录+JWT | **云开发 ✅** |
|
||||
| PC Web 支持 | ⭐⭐ 需通过 HTTP API 桥接 | ⭐ RESTful API 天然支持 | 远期再评估 NestJS |
|
||||
| 灵活性 | ⭐⭐ 受限于云开发 SDK | ⭐ 完全自由 | 到期后按需评估 |
|
||||
| 数据迁移 | ⭐⭐ 可导出 | ⭐ 标准 MySQL | 到期后按需评估 |
|
||||
|
||||
| 维度 | 微信云开发 | 自有云服务器(NestJS) | 现阶段决策(至 2026-09-15) |
|
||||
| --------- | ------------------ | ------------------ | ------------------- |
|
||||
| 接入成本 | ⭐ 极低(原生集成) | ⭐⭐ 需搭建部署(~3-5天) | **云开发 ✅** |
|
||||
| 运维成本 | ⭐ 免运维 | ⭐⭐ 需简单维护(PM2 守护) | **云开发 ✅** |
|
||||
| 费用 | 免费额度内 ¥0;超出按套餐计费 | 已有服务器可零增量 | **云开发(阶段内)✅** |
|
||||
| 小程序集成 | ⭐ 鉴权零成本 | ⭐⭐ 需对接微信登录+JWT | **云开发 ✅** |
|
||||
| PC Web 支持 | ⭐⭐ 需通过 HTTP API 桥接 | ⭐ RESTful API 天然支持 | 远期再评估 NestJS |
|
||||
| 灵活性 | ⭐⭐ 受限于云开发 SDK | ⭐ 完全自由 | 到期后按需评估 |
|
||||
| 数据迁移 | ⭐⭐ 可导出 | ⭐ 标准 MySQL | 到期后按需评估 |
|
||||
|
||||
|
||||
**最终决策(分阶段)**
|
||||
|
||||
@@ -162,14 +166,16 @@ miniprogram/
|
||||
|
||||
**问题分析:**
|
||||
|
||||
| 问题 | 详情 |
|
||||
| -------------- | ------------------------------------------------------------------- |
|
||||
| Mixin 模式笨重 | `pageMixin` 通过对象展开合并,无类型安全,难以追踪数据流 |
|
||||
| Draw 服务分散 | 每个分包下各有 `shared/service/`,大量重复的绘制工具方法 |
|
||||
| 平台耦合严重 | Draw 服务直接使用 `wx.createImage`、`canvas.createImage` 等 API |
|
||||
|
||||
| 问题 | 详情 |
|
||||
| ---------- | ------------------------------------------------------------- |
|
||||
| Mixin 模式笨重 | `pageMixin` 通过对象展开合并,无类型安全,难以追踪数据流 |
|
||||
| Draw 服务分散 | 每个分包下各有 `shared/service/`,大量重复的绘制工具方法 |
|
||||
| 平台耦合严重 | Draw 服务直接使用 `wx.createImage`、`canvas.createImage` 等 API |
|
||||
| 模板重复 | `mathPages` 和 `focusPages` 的 `canvas-page-template.wxml` 内容相同 |
|
||||
| 无共享核心 | 数据模型、生成算法与 UI 逻辑混在一起,无法跨平台复用 |
|
||||
| 状态管理原始 | 纯 `setData`,无统一的状态管理方案 |
|
||||
| 无共享核心 | 数据模型、生成算法与 UI 逻辑混在一起,无法跨平台复用 |
|
||||
| 状态管理原始 | 纯 `setData`,无统一的状态管理方案 |
|
||||
|
||||
|
||||
### 3.2 目标架构
|
||||
|
||||
@@ -958,21 +964,25 @@ createPage({
|
||||
|
||||
### 6.1 现阶段:微信云开发(摘要)
|
||||
|
||||
| 组件 | 技术 | 说明 |
|
||||
| ---------- | ---------------------------- | -------------------------------------- |
|
||||
| 数据 | 云数据库(文档型) | worksheets / categories / users 等集合 |
|
||||
| 文件 | 云存储(COS) | 预览图、涂色线稿、字体等 |
|
||||
| 逻辑 | 云函数(Node.js) | 统一入口路由、业务 action |
|
||||
| 小程序接入 | `wx.cloud` + `cloud-adapter` | 与业务服务层解耦,便于日后替换为 HTTP |
|
||||
|
||||
| 组件 | 技术 | 说明 |
|
||||
| ----- | ---------------------------- | ----------------------------------- |
|
||||
| 数据 | 云数据库(文档型) | worksheets / categories / users 等集合 |
|
||||
| 文件 | 云存储(COS) | 预览图、涂色线稿、字体等 |
|
||||
| 逻辑 | 云函数(Node.js) | 统一入口路由、业务 action |
|
||||
| 小程序接入 | `wx.cloud` + `cloud-adapter` | 与业务服务层解耦,便于日后替换为 HTTP |
|
||||
|
||||
|
||||
### 6.2 远期可选:自建 NestJS(摘要)
|
||||
|
||||
| 组件 | 技术 | 说明 |
|
||||
| ---- | ----------------------- | --------------------------- |
|
||||
| 应用 | NestJS + TypeScript | RESTful API,多端统一 |
|
||||
| 数据 | MySQL 8.0 + Prisma | 关系型存储与迁移 |
|
||||
| 文件 | 本地磁盘 + Nginx | 静态素材 URL 由自有域名提供 |
|
||||
| 鉴权 | 微信 code2Session + JWT | 小程序与 Web 可共用逻辑 |
|
||||
|
||||
| 组件 | 技术 | 说明 |
|
||||
| --- | --------------------- | ---------------- |
|
||||
| 应用 | NestJS + TypeScript | RESTful API,多端统一 |
|
||||
| 数据 | MySQL 8.0 + Prisma | 关系型存储与迁移 |
|
||||
| 文件 | 本地磁盘 + Nginx | 静态素材 URL 由自有域名提供 |
|
||||
| 鉴权 | 微信 code2Session + JWT | 小程序与 Web 可共用逻辑 |
|
||||
|
||||
|
||||
(接口路径、表结构、部署步骤等以 [后端部署方案](./后端部署方案.md) 为准,此处不重复。)
|
||||
|
||||
@@ -1180,46 +1190,53 @@ PDF 导出方案(远期增值功能,会员专属):
|
||||
|
||||
## 十一、技术风险与应对
|
||||
|
||||
| 风险 | 影响 | 应对方案 |
|
||||
| -------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------- |
|
||||
| 云开发免费额度不足 | 功能受限或需付费 | ① 优化查询与缓存 ② 控制云函数调用 ③ **2026-09-15 前**复盘是否升级套餐或迁移 [后端部署方案](./后端部署方案.md) |
|
||||
| 服务器宕机(迁移自建后) | 后端不可用 | ① PM2 自动重启 ② 前端兜底数据 ③ 定期备份数据库 |
|
||||
| Canvas 兼容性 | 低端机渲染异常 | ① 使用 Canvas 2D(已采用)② 控制单次绘制复杂度 ③ 降级方案 |
|
||||
| 小程序包体积 | 超 2MB 限制 | ① 素材用云存储 / CDN ② 合理分包 ③ 图片压缩 |
|
||||
| 素材制作瓶颈 | 涂色卡等需设计资源 | ① 使用开源 SVG 素材 ② AI 生成线稿 ③ 社区投稿 |
|
||||
| 跨平台迁移成本 | Web 端重复开发 | ① core/ 层保持平台无关 ② 适配器隔离差异(详见 [PC-Web端技术预案](./PC-Web端技术预案.md)) |
|
||||
| 带宽与加载(迁移自建远期) | 素材加载慢 | ① 图片压缩 ② 长缓存 ③ 可接入 CDN |
|
||||
|
||||
| 风险 | 影响 | 应对方案 |
|
||||
| ------------- | --------- | ----------------------------------------------------------------------- |
|
||||
| 云开发免费额度不足 | 功能受限或需付费 | ① 优化查询与缓存 ② 控制云函数调用 ③ **2026-09-15 前**复盘是否升级套餐或迁移 [后端部署方案](./后端部署方案.md) |
|
||||
| 服务器宕机(迁移自建后) | 后端不可用 | ① PM2 自动重启 ② 前端兜底数据 ③ 定期备份数据库 |
|
||||
| Canvas 兼容性 | 低端机渲染异常 | ① 使用 Canvas 2D(已采用)② 控制单次绘制复杂度 ③ 降级方案 |
|
||||
| 小程序包体积 | 超 2MB 限制 | ① 素材用云存储 / CDN ② 合理分包 ③ 图片压缩 |
|
||||
| 素材制作瓶颈 | 涂色卡等需设计资源 | ① 使用开源 SVG 素材 ② AI 生成线稿 ③ 社区投稿 |
|
||||
| 跨平台迁移成本 | Web 端重复开发 | ① core/ 层保持平台无关 ② 适配器隔离差异(详见 [PC-Web端技术预案](./PC-Web端技术预案.md)) |
|
||||
| 带宽与加载(迁移自建远期) | 素材加载慢 | ① 图片压缩 ② 长缓存 ③ 可接入 CDN |
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 附录 A:现有代码与目标架构映射
|
||||
|
||||
| 现有文件 | 目标位置 | 迁移动作 |
|
||||
| -------------------------------- | -------------------------------------- | ------------------------------------------------ |
|
||||
| `constants/mathFunctions.ts` | `core/data/worksheets.ts` | 合并,增加字段 |
|
||||
| `constants/focusFunctions.ts` | `core/data/worksheets.ts` | 合并,增加字段 |
|
||||
| `constants/words.ts` | `core/data/words.ts` | 移动 |
|
||||
| `constants/colors.ts` | `core/data/colors.ts` | 移动 |
|
||||
| `constants/shapes.ts` | `core/data/shapes.ts` | 移动 |
|
||||
| `service/baseDraw.ts` | `core/draw/base-draw.ts` | 重构,去除 wx.\* 依赖 |
|
||||
| `service/wordDrawService.ts` | `core/draw/chinese-draw/word-draw.ts` | 移动,去除 wx.\* |
|
||||
| `service/drawServiceFactory.ts` | `core/draw/draw-factory.ts` | 扩展 |
|
||||
| `mathPages/shared/service/*.ts` | `core/draw/legacy/math-draw/*.ts` | 移入 legacy,去除 wx.\*,逐步迁移到模板引擎 |
|
||||
| `focusPages/shared/service/*.ts` | `core/draw/legacy/focus-draw/*.ts` | 移入 legacy,去除 wx.\*,逐步迁移到模板引擎 |
|
||||
| `base/pageMixin.ts` | `services/print-service.ts` + 页面代码 | 拆分职责 |
|
||||
| `base/callCloud.ts` | `platform/cloud-adapter.ts` | 封装 wx.cloud;迁移 NestJS 后再考虑 http-adapter |
|
||||
| `utils/saveImage.ts` | `platform/canvas-adapter.ts` | 合并到适配器 |
|
||||
| `utils/downloadPrint.ts` | `services/print-service.ts` | 整合 |
|
||||
| `utils/tracker.ts` | `services/stats-service.ts` | 整合 |
|
||||
| `config/config.ts` | `core/models/print-config.ts` | 类型化 |
|
||||
|
||||
| 现有文件 | 目标位置 | 迁移动作 |
|
||||
| -------------------------------- | ------------------------------------- | --------------------------------------- |
|
||||
| `constants/mathFunctions.ts` | `core/data/worksheets.ts` | 合并,增加字段 |
|
||||
| `constants/focusFunctions.ts` | `core/data/worksheets.ts` | 合并,增加字段 |
|
||||
| `constants/words.ts` | `core/data/words.ts` | 移动 |
|
||||
| `constants/colors.ts` | `core/data/colors.ts` | 移动 |
|
||||
| `constants/shapes.ts` | `core/data/shapes.ts` | 移动 |
|
||||
| `service/baseDraw.ts` | `core/draw/base-draw.ts` | 重构,去除 wx. 依赖 |
|
||||
| `service/wordDrawService.ts` | `core/draw/chinese-draw/word-draw.ts` | 移动,去除 wx. |
|
||||
| `service/drawServiceFactory.ts` | `core/draw/draw-factory.ts` | 扩展 |
|
||||
| `mathPages/shared/service/*.ts` | `core/draw/legacy/math-draw/*.ts` | 移入 legacy,去除 wx.,逐步迁移到模板引擎 |
|
||||
| `focusPages/shared/service/*.ts` | `core/draw/legacy/focus-draw/*.ts` | 移入 legacy,去除 wx.,逐步迁移到模板引擎 |
|
||||
| `base/pageMixin.ts` | `services/print-service.ts` + 页面代码 | 拆分职责 |
|
||||
| `base/callCloud.ts` | `platform/cloud-adapter.ts` | 封装 wx.cloud;迁移 NestJS 后再考虑 http-adapter |
|
||||
| `utils/saveImage.ts` | `platform/canvas-adapter.ts` | 合并到适配器 |
|
||||
| `utils/downloadPrint.ts` | `services/print-service.ts` | 整合 |
|
||||
| `utils/tracker.ts` | `services/stats-service.ts` | 整合 |
|
||||
| `config/config.ts` | `core/models/print-config.ts` | 类型化 |
|
||||
|
||||
|
||||
## 附录 B:技术选型决策记录
|
||||
|
||||
| 决策点 | 选项 | 决策 | 理由 |
|
||||
| --------- | ---------------------------- | --------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 跨端框架 | Taro / uni-app / 原生 | **原生** | 项目已用原生开发,迁移成本高;Taro 等框架对 Canvas 2D 支持有限;core/ 层抽取足以实现代码复用 |
|
||||
| 状态管理 | MobX / 自定义 / 原生 setData | **轻量自定义** | 小程序场景简单,不需要 Redux 级方案;页面级 setData + 全局 Store 够用 |
|
||||
| UI 组件库 | Vant / 自研 | **Vant + 自定义组件** | 已用 Vant,保持;业务组件自研 |
|
||||
| 后端方案 | 云开发 / 自有云服务器 | **现阶段云开发(至 2026-09-15)** | 详见 [小程序云开发方案](./小程序云开发方案.md);到期后可选迁移 [后端部署方案](./后端部署方案.md)(NestJS) |
|
||||
| 导出方案 | PNG 保存相册 / PDF | **PNG 为主,PDF 为增值** | PNG 保存到相册是手机端最短路径(用户教育成本低、零服务器开销);PDF 作为远期会员增值功能,服务端 pdfkit 合并,Web 用 jsPDF |
|
||||
| Monorepo | pnpm workspace / Turborepo | **暂不采用** | 当前只有小程序,过早引入增加复杂度;core/ 作为目录组织,未来再拆包 |
|
||||
|
||||
| 决策点 | 选项 | 决策 | 理由 |
|
||||
| -------- | -------------------------- | ------------------------ | -------------------------------------------------------------------------- |
|
||||
| 跨端框架 | Taro / uni-app / 原生 | **原生** | 项目已用原生开发,迁移成本高;Taro 等框架对 Canvas 2D 支持有限;core/ 层抽取足以实现代码复用 |
|
||||
| 状态管理 | MobX / 自定义 / 原生 setData | **轻量自定义** | 小程序场景简单,不需要 Redux 级方案;页面级 setData + 全局 Store 够用 |
|
||||
| UI 组件库 | Vant / 自研 | **Vant + 自定义组件** | 已用 Vant,保持;业务组件自研 |
|
||||
| 后端方案 | 云开发 / 自有云服务器 | **现阶段云开发(至 2026-09-15)** | 详见 [小程序云开发方案](./小程序云开发方案.md);到期后可选迁移 [后端部署方案](./后端部署方案.md)(NestJS) |
|
||||
| 导出方案 | PNG 保存相册 / PDF | **PNG 为主,PDF 为增值** | PNG 保存到相册是手机端最短路径(用户教育成本低、零服务器开销);PDF 作为远期会员增值功能,服务端 pdfkit 合并,Web 用 jsPDF |
|
||||
| Monorepo | pnpm workspace / Turborepo | **暂不采用** | 当前只有小程序,过早引入增加复杂度;core/ 作为目录组织,未来再拆包 |
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user