Files
doodle-store/docs/v3.5/生产数据整合与导入方案.md
T
2026-10-20 17:29:10 +08:00

85 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 生产数据整合与导入方案
更新时间:2026-10-20。本文整理本轮最新的数据来源与推荐导入流程,尚未执行导出、合并或云端导入。
## 1. 最新范围与数据来源
目标是建立同时包含本地已整理内容与 CloudBase 最新用户业务数据的 `doodle_prod`。本条替代此前“只导内容”和“直接整库复制本地 doodle_dev”两种约定。
- 内容来源:本地 `doodle_dev` 中已修改的分类、题型、内容关联和七牛资源映射。
- 用户业务来源:小程序实际使用的 CloudBase 环境中最新的用户、收藏和下载记录。
- 统计、头像、设置等跨来源数据按下表逐字段处理,不用任何一个来源整库覆盖另一个来源。
- 原始源文件和本地开发库保留;先在独立迁移库整合和验证,再导入云端。旧云函数、旧数据、预拉取文件及定时任务继续保留,本次不自动修改或停用。
## 2. 表与字段来源
当前 Prisma 定义 13 张业务表,另有 `_prisma_migrations` 技术表。以下为推荐执行规则,实际导入前预演并列出冲突。
| 目标表 | 数据来源与处理 |
| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `categories` | 本地。保留分类 ID、名称、层级、排序、发布状态及图标引用。 |
| `worksheets` | 内容字段取本地:标题、分类、路径、年龄/年级、难度、标签、排序、运营标记、发布状态、生成配置与预览资产引用。按相同 worksheet ID 合并 CloudBase 最新 `downloads` / `likes`;`downloads_seed` / `likes_seed` 保留本地值,不与真实计数混加。 |
| `worksheet_grades` | 本地。保留经本地维护的适用年级关系,不从旧兼容 grade 自动推断。 |
| `worksheet_resources` | 本地。保留内容资源及预览关系。 |
| `worksheet_resource_assets` | 本地。保留内容资源与文件关联。 |
| `assets` | 内容资源映射取本地;用户头像按 CloudBase 最新 `avatarUrl` 匹配已核验的七牛对象,缺失时补迁文件并建立资产。不能整表沿用本地旧头像绑定。 |
| `users` | CloudBase。保留有效的源 `_id → id`、OpenID、UnionID、昵称与原始时间;头像转换为新 `avatar_asset_id`。本地同一微信用户按 OpenID 对照,不带入本地测试身份、管理员授权或凭证状态。 |
| `favorites` | CloudBase 最新完整快照。按迁移后的 user ID 和稳定 worksheet ID 建立关联;校验唯一性,反映已取消的收藏,不将本地测试收藏合入。 |
| `download_logs` | CloudBase。保留原 ID、用户/题型引用、时间和已有 exportId;重复源记录、exportId 冲突及缺失关联进入报告,不对无 exportId 的不同历史记录擅自合并。 |
| `settings` | 逐项转换。导出 CloudBase 设置作为对照,迁移需要继续使用的业务配置;新后端专有配置单独初始化。旧 `homeAutoRefresh` 控制旧云任务,新开关控制新后端任务,不能把二者视为同一个执行器。 |
| `page_configs` | 在数据整合后由新后端重建。保留两边旧快照作核对,不直接恢复含旧资源地址或旧统计的页面缓存,不修改旧线上预拉取文件。 |
| `job_runs` | 初始化新后端任务状态。本地旧任务记录保留在源库/归档中供核对,不让开发环境的运行锁、租约或任务结果成为生产任务状态。 |
| `admin_audit_logs` | 为本次导入生成带来源、批次和摘要的迁移审计。本地历史审计保留归档,不直接当作已在线上发生的管理员操作。 |
| `_prisma_migrations` | 迁移库由仓库锁定的正式迁移初始化,保留其真实执行历史;若最终导出包含结构和该表,恢复后检查迁移状态,不重新手工建表。 |
所有源 ID 和业务计数的最终值均需报告;用户字段或设置缺少对应目标字段时采用明确映射,不透传未知字段。
## 3. 合并时需要单独处理的问题
### 题型计数
旧云函数会实时更新 CloudBase `worksheets.downloads` 和 `likes`,因此这两个字段不能取本地旧值,也不能在导入日志/收藏时再累加一次。旧计数写入与记录写入并非同一事务;先保留线上源计数,同时统计日志/收藏与计数的差异,不未经核实就用记录条数覆盖历史运营计数。
CloudBase 中不存在的本地新题型保留内容及展示 seed,真实计数建议初始化为 0,排除开发操作产生的计数。CloudBase 中存在、但本地不存在的题型进入差异清单;先补齐内容和七牛映射,再处理相关收藏/下载,不丢弃线上记录或用旧预览地址覆盖本地内容。
### 用户身份、头像和权限
CloudBase `_id` 保留为生产 user ID,同一小程序 AppID 下的 OpenID 用于核对本地与线上的相同身份,昵称和头像不能用作身份匹配。若本地资产归属使用了另一个 user ID,需要按已核对的身份映射转换;无法匹配的归属进入冲突清单。
旧用户结构没有新后端的完整权限与凭证字段。缺失时按新后端规则初始化 `role=user`、`status=active`、`auth_version`;生产管理员另按明确授权设置,不继承本地开发授权。线上存在的状态/权限字段须先核对其真实含义,不能盲目套用本地值。
`users.total_downloads` 需与 CloudBase 原始 `totalDownloads` 和有效下载记录对账。当前旧下载云函数未维护用户的 totalDownloads,不能只复制可能一直为 0 的字段;建议按去重和关联校验后的有效下载记录数建立该用户统计,并在报告中保留原值及调整理由。
头像必须以本次线上用户记录为准。已清除的头像保持为空;现有七牛对象只有在源引用和文件校验匹配时才复用。此前备份的头像可能过期,不能按文件名推断归属或默认认为用户仍在使用该图片。
CloudBase 旧注销逻辑仅删除 users,可能留下收藏或下载记录。找不到用户的记录进入隔离报告并保留原始导出,不为了满足关联而重新创建已注销账户。
### 快照时效与后续补导
一次导入得到的是某次快照,不会自动保持实时同步。CloudBase 继续接收用户操作时,导入后仍会新增下载、修改资料、取消收藏或删除账户;仅按时间追加新行无法完整处理这些变化。
正式切换前需另行安排最终快照/补导与对账;旧版本仍写 CloudBase 时还需要明确兼容或持续同步策略。本方案不以“已导入”为由自动停写旧服务,也不宣称新旧系统已实时一致。后续补导以 CloudBase 用户业务为来源,不再用本地旧整库备份覆盖已运行的生产库。
## 4. 推荐流程:先在本机独立迁移库整合
第一阶段分类、题型及必要资产的逐步命令、试导、云端连接和回退流程见 [分类与题型首次导入操作手册](./分类与题型首次导入操作手册.md)。该阶段真实题型计数暂置 0,后续仍按本方案从 CloudBase 最新快照赋值。
建议创建本地 `doodle_migration_YYYYMMDD` 作为本轮一次性整合库;它与日常 `doodle_dev` 分开,也不是需要长期维护的 staging 环境。
```text
本地 doodle_dev:内容与七牛映射 ─┐
├→ 本机独立迁移库 → 对账与恢复验证 → doodle_prod
CloudBase:最新用户业务与统计 ──┘
```
1. 保存两个来源的不可变导出、批次时间、条数与文件 SHA-256;CloudBase 导出覆盖 users、favorites、download_logs,以及用于计数/差异对照的 worksheets、categories、settings、page_configs。
2. 用项目正式 Prisma 迁移初始化独立迁移库,不修改 `doodle_dev`。
3. 导入本地内容及对应资产;若内容资产含用户归属,先按线上身份建立依赖所需的用户骨架。按分类父子及资源依赖顺序写入。
4. 导入 CloudBase 用户主体(头像先留空),核验/补迁头像资产后再绑定;处理 OpenID 重复、源 ID 冲突和用户归属映射。
5. 导入收藏、下载记录,合并线上题型计数,核对用户统计,完成设置转换和页面配置重建。
6. 对账内容完整性、源 ID、关联、记录数量、计数、头像归属、资源可访问性及管理员权限;冲突与隔离记录必须有处理结果或明确保留状态,不将它们默认为成功导入。
7. 对首次空目标制作完整 PostgreSQL 导入包,排除数据库集群角色/密码和本机运行密钥,试恢复验证后上传并导入 `doodle_prod`。若目标已使用,先核查并备份,改用可重复的受控合并流程,不直接覆盖。
8. 云端验证并备份;保留批次清单与映射,作为正式切换前补导、对账和回滚依据。
数据库密码、JWT 密钥、微信 AppSecret、七牛 AK/SK 不写入导出报告或源码。导入包包含用户数据,使用受控目录并通过 SSH/1Panel 传输;不要求开放 PostgreSQL 公网端口。