# Angular 管理后台与云函数迁移状态 ## 已确认的迁移基线 - 旧 Web 交付物是 ASP.NET Core 发布包,没有 `.sln`、`.csproj` 与原始 Razor 管理页面源码。 - `ZoomLaCMS.dll` 可恢复 79 个后台控制器、至少 1,042 个公开动作;详细清单见 `legacy-admin-inventory.generated.md`。 - 线上 Parse 应用为 `7pIbDBJmKx_main`,当前可见 109 个 Schema,其中 96 个为 SQL Server 规范化迁移目标类。 - 核心数据已存在:`CommonModel` 92,435、`VocabularyWord` 89,620、`NodeAuth` 5,935、`PracticeRecord` 816、`CourseAppointment` 345、`DailyStudyRecord` 108、`LessonRecord` 82。 - 迁移开始前 `Function` 表为空;本阶段已部署 9 个云函数。 ## 本阶段已实现 - Angular 18 独立管理端路由 `/admin`,包含独立登录、后台布局、概览、动态 Schema 表格、动态编辑表单、分页、搜索、软删除和迁移状态页。 - 后台迁移状态页直接读取线上 `xiaoshu.app.gateway/migration_status`,动态显示已实现 action 数量及完整阻塞原因清单,不再使用前端硬编码阻塞计数。 - 后台“全部数据类”目录由管理员云函数实时返回白名单,所有已开放规范化类均可从界面进入动态列表/编辑页;`_Session`、`Function` 等敏感系统类不进入目录。 - 动态编辑器对 Object/Array 执行 JSON 类型校验,错误格式会阻止保存;Relation、File、GeoPoint 等无法安全通用写入的 Parse 类型由前后端共同设为只读,避免结构化字段被字符串覆盖。 - 动态资源表按 `objectId/name/title/username` 等业务字段稳定优先展示,总页数采用向上取整;只读类使用查看抽屉且不显示保存/删除操作。 - `_User` 详情抽屉已接入专用 `resetPassword` 管理员云函数,执行 8 位最小长度与二次确认;新密码不进入通用资源字段或前端持久化存储。 - `_User` 新建入口已改为专用 `createUser` 管理员云函数:帐套内校验邀请账号,事务锁原子分配 `legacyUserId`,固定默认普通组 1,并初始化旧版余额/经验数据;请求不接受管理员或角色字段,开户密码也不进入通用资源草稿。 - 旧 `User_API` 的锁定、解锁和移动用户组已迁为专用 `userBatch` 管理员云函数:支持每批 1–100 人、强制帐套边界,原子同步 `isDisabled/legacyUserData.State` 或 `legacyGroupId/legacyUserData.GroupID`;停用会撤销全部 Parse 会话,普通管理员不能停用自己或管理其他管理员。旧版账号登录也会拒绝已停用/已删除用户。 - `_User` 的状态、旧用户 ID、旧用户组与旧资料 JSON 已从通用字段编辑中移除;密码重置和用户删除新增管理员目标保护并撤销目标会话,避免绕过专用一致性流程。 - 当前线上 `Group` 表为空;用户组移动只接受当前帐套中真实存在的 `Group.groupId`,界面会明确提示先在“全部数据类”建立用户组,不会把不存在的默认编号伪装成可选组。 - 旧 `GroupAdd/GroupAdd_Submit` 已迁为专用 `saveGroup`:新增组使用 PostgreSQL 事务锁在帐套内原子分配只读 `groupId`,校验同名组、父组归属与层级循环;通用保存不能绕过。删除组前会拒绝仍被用户或下级组引用的记录。 - 旧 `ContentManage_Status`、`ContentManage_Del`、回收站恢复与 `ContentMove_Submit` 已迁为专用 `contentBatch`:支持每批 1–100 条内容、限定旧状态 `-3/-2/-1/0/99`、校验目标节点帐套并保留 addon 关联。`CommonModel` 的 `generalId/modelId/nodeId/itemId/tableName/status/sourceKey/orderId` 改为通用只读;新增按钮关闭,避免只写主表却遗漏模型附表。 - 旧 `GetMDFile` 的固定空响应、`Content_API.duptitle` 与 `ContentManage_Refresh` 已由 `legacyContentUtility/contentBatch` 等价迁移;Angular 内容页增加重复标题检查、单条/批量时间刷新和八列 CSV 安全导出。旧 XLSX 格式暂为部分迁移;专题关系、定时发布、静态 HTML、采集和 Markdown 因物理数据或旧运行时缺失均返回明确 `migration_blocked`。 - `Design/Counter` 与 `Extend/Counter` 共 14 个访问统计动作已完成数据审计:目标全部 Schema 不含旧 `ZL_Com_VisitCount` 或等价访问明细,无法还原 InfoID、日期、地域、浏览器、系统和来源聚合;全站统计代码还缺少 `SiteInfo.AllSiteJS` 注入运行时。对应云函数统一返回细分 `migration_blocked`,不会以 `SysLog` 或问卷 `SurveyLog` 伪造访问统计。 - CRM 中仍有真实数据的 `CType/CTypeAdd/CType_Add/CType_Del` 已迁为 `crmClientTypes/saveCrmClientType/crmClientTypeBatch` 与 Angular“CRM 客户类型”页面:只管理 `CRMSAttr.ztype=ctype`,按帐套隔离、名称防重并通过 PostgreSQL 事务锁原子分配旧字符串编号。旧 `CRMS_Client`、`CRMS_Contact`、`IServer`、经销商申请和 Licence/PDF 链均未进入目标 Schema;`ContactInfo` 是企业微信联系人,未被错误当作 CRM 联系人复用。 - 旧 `ECharts/ECharts` 六个动作依赖 `Content_Chart` 的 TName/ChartTitle/ToolBox/Package/option/SType/Tag 数据、七类 .NET 配置生成器、`SiteInfo.SiteUrl` 与 `/Common/ShowM` 渲染页;目标 Schema 中不存在任何 chart/echart/graph 数据类。所有动作通过 `legacyEChartsBlocker` 返回逐项原因,不用问卷统计或普通 Angular 图表冒充旧图表编辑器。 - Exam 模块已把仍有历史数据的 `ExamSysPapers/ExamSysQuestions/PaperQuestions/ExamType/ContentPublish/PublishNode` 接入 Angular 只读列表、搜索、分页和详情,并关闭通用写入,防止破坏试卷 `qids/questList`、复合答案和报刊父子结构。教材版本、学校、班级、班级学员、旧 Course、答卷评分数据均未迁入;对应 21 个动作由 `legacyExamBlocker` 返回数据或运行时阻塞。`CourseBinding` 明确不冒充旧考试 Course。 - 商城 `DeliverType/DeliverAdd/DeliverAdd_Submit/Deliver_API` 已由 `ShopFareTlp` 真实历史数据、`shopFareTemplates/saveShopFareTemplate/shopFareTemplateBatch` 和 Angular“商城运费模板”页面迁移:校验 Express JSON、名称防重并原子分配旧数字 ID。订单/物流单、Manufacturers 厂商和 Trademark 品牌表均不存在,剩余 12 个动作返回细分阻塞;`DeliveryCenter` 不被误作运费模板。 - Helper 的数据库自初始化与帮助精灵依赖服务器 `DBConfig.json`、本地 SQL 文件、旧 Notification 数据和 SignalR 分组协议,目标均不存在,两个动作由 `legacyHelperBlocker` 明确阻塞。Hms 的 10 个动作管理的是另一个产品“逐浪主题大师”的七档会员卡,依赖 `ZL_UserBase.cardType/ICQ` 及 `ZL_Orderinfo/ZL_CartPro`;迁移数据没有这些字段或表,不能误用小树现有 `VIP` 合伙人等级,已由 `legacyHmsBlocker` 逐项说明。 - `Index` 后台入口控制器的 Default/Main/WorkTable、Login/Login_AJAX、Logout 已由 Angular 后台壳、管理概览、Parse 登录与会话撤销等价替代;FuncList/SiteMap 由侧栏、资源目录和后台快捷入口部分覆盖。旧主题桌面、ASP.NET Session 锁屏、动态 ASCX/Razor 加载、全局动画开关及公开管理员申请缺少服务器配置或安全审批链,8 个动作由 `legacyIndexBlocker` 明确阻塞,绝不复刻随机密码加固定高权限角色的不安全流程。 - `Extend/Log.SysLog` 已用线上 470 条 `SysLog` 实际记录迁为只读 `systemLogs` 云函数和 Angular“系统日志”页,支持帐套隔离、分页、一级/二级类型、关键词与日期筛选,并禁止通用写入。旧文本日志目录和 Hangfire 任务中心缺少文件系统、`Content_ScheTask` 数据及调度控制面;`SenTask` 为空且语义不等价。Design/Interactive、Office/iServer、Office/Licence 也分别缺少 `Design_Pub`、服务工单/回复、协议/申请/签约主表及 PDF 文件运行时,合计 32 个动作由专用阻塞契约逐项返回原因。 - Manager 修改密码已迁为 Angular 专用页面和 `changeOwnPassword`:验证当前口令、限制新密码 8–72 位、拒绝复用原密码,保存后撤销该管理员全部 Parse 会话并强制重新登录。旧 MarkDown 五个动作依赖未迁入的 MarkDown 主表、`wwwroot/UploadFiles/MarkDown` 本地目录和 `/PreView/md` 渲染页,均由 `legacyMarkdownBlocker` 返回数据或运行时阻塞。 - User/Message 的五个站内信动作缺少 Message 收发主表;`MailTemp` 只是邮件模板,不被误用。Mobile 两个空控制器动作只剩已丢失的 Razor 视图,无法恢复页面基线。栏目 `ZhiDing` 的旧实现会把所有有效栏目强制扁平为根节点,现有 `saveNode/nodeBatch` 已安全维护层级并拒绝该破坏性修复;`UnionNode_Merge` 同时依赖未迁入的 `ZL_Commodities`,不能只改内容表形成半合并。以上均由专用云函数返回细分原因。 - Office/OA 中字段完全匹配的 `MisType` 已迁为 Angular“OA 流程类型”页与 `misTypes/saveMisType/misTypeBatch`,支持帐套隔离、搜索、防重、原子旧 ID 和 `MisProcedure.typeId` 引用保护删除;用户选择与邮件通讯录复用现有用户管理,模型选择为部分迁移。其余旧 `OA_AuditFlow/OA_AuditFlowItem/Mis_Model/OA_Sign/OA_Document` 主表及套红文件运行时未迁入;目标空的 `MisProcedure/MisProLevel/MisSign/DocModel` 是不同版本结构,不被强行冒充,21 个动作由 `legacyOABlocker` 逐项说明。 - `Page` 控制器中与旧字段完全匹配的 `PageStyle` 已迁为 Angular“黄页样式”页与 `pageStyles/savePageStyle/pageStyleBatch`:支持帐套隔离、名称搜索与防重、路径和状态校验、原子分配旧 `PageNodeid`、单一默认样式及 `PageTemplate.userGroup` 引用保护删除。目标 `PageTemplate` 虽保留旧字段但为空,且没有 `PageReg` 用户黄页申请主表或 `SiteOption` 黄页配置层;内容管理仅部分复用现有 `CommonModel`,其余 15 个旧入口由 `legacyPageBlocker` 返回逐项数据或基础设施原因。 - `Office/Plat` 的 `PlatComp` 与折叠在 `_User.legacyUserPlat` 的旧 `User_Plat` 数据已迁为 Angular“协同办公企业”页面以及 `platformCompanies/savePlatformCompany/platformCompanyMembers/platformCompanyMemberBatch/platformCompanyBatch`:兼容失真的 count,支持企业资料防重、原子旧 ID、同帐套创建人、成员查看/加入/移动/移出,并保护仍有成员或 `PlatUserRole` 角色的企业删除;`legacyUserPlat` 已从通用用户编辑锁定。旧 `Common_UserApply/Blog_Msg/Plat_Topic/Plat_Group` 主表均不存在,申请审核、动态消息、话题和企业群组入口由 `legacyPlatBlocker` 逐项返回原因;旧 Razor `CreateComp/WordTlp` 视图也没有可恢复的交互基线。 - `Printer/Index` 的控制器本身只是返回已丢失的 Razor 视图;旧程序集可确认其候选业务依赖 `ZL_Shop_PrintDevice/ZL_Shop_PrintTlp/ZL_Shop_PrintMessage` 和飞印客户端,但签约文档与线上 110 个 Schema 均没有这些设备、模板和消息数据,旧客户端还向 `my.feyin.net` 发送明文 HTTP 请求。无法在不知道页面、历史设备密钥和第三方协议可用性的情况下安全伪造 1:1 打印后台,已由 `legacyPrinterBlocker` 明确登记为基础设施阻塞。 - `User/PrivacyPolicy` 管理的不是普通静态文案,而是 `ZL_LicenceFiles` 用户协议、强制签署、PDF 表单字段、限定用户/用户组以及 `ZL_LicenceUserSign` 逐用户签约历史。目标 Schema 与签约文档均无这两类数据或协议 PDF,5 个动作复用 `legacyLicenceBlocker` 返回逐项数据阻塞原因,不能用注销通道或任意新文本冒充已经签署过的法律记录。 - `User/Promo.PromoList` 已迁为只读 `UserPromotion` 虚拟资源与 `userPromotions/getUserPromotion`:从 `_User.legacyUserData.ParentUserID` 实时还原用户、邀请人、直属推广人数,支持账号/昵称、邀请人 ID、“仅推广人”和推广成员注册日期筛选,日期语义保持旧版只约束直属成员统计。旧 `Cash` 提现申请、预扣退款账本和 `User_Bank` 提现账户均未迁入,提现首页、审核/驳回及账户维护等 10 个动作由 `legacyUserPromoBlocker` 明确阻塞,发票银行字段不会被误作提现账户。 - 旧 `Pub` 互动模块新增链会同时创建动态 SQL 表、Model/ModelField、XML 调用标签与两套服务器 HTML 模板;目标虽签约了 `Pub/PubTw/PubWTHD/PubZXDC` 四类旧字段 Schema,但线上四类真实记录均为 0,也没有 `ZL_Pub_BDQYSH` 企业入驻表或旧模板/标签运行时。四类已从通用写入锁为只读,12 个模块定义、提交审核、企业入驻和回复动作由 `legacyPubBlocker` 返回逐项数据或基础设施原因,避免空 Schema 被误报为已迁移能力。 - 旧 `Push` 后台依赖 `Mobile_PushAPI/Mobile_PushTlp/Mobile_PushMsg` 三张表、极光 AppKey/AppSecret、服务端 JPush SDK 和 `ZL_UserBase.UC` 设备注册号。签约文档与线上 110 个 Schema 均没有 push/notification/device/message 数据类,当前客户端也没有等价设备注册消费者;12 个配置、模板、发送和历史入口由 `legacyPushBlocker` 返回逐项数据或基础设施原因,不存储无消费者的密钥,也不伪报消息已发送。 - 旧 `Extend/PWA` 会在 ASP.NET 站点上读写 `SiteConfig.SiteOption`,缩放八种图标,生成 `manifest.json`,注入页面 head,并从 `pwa_sw_js.tlp` 覆盖站点根目录 `/sw.js`。当前 Angular 构建没有 service-worker 发布链,云函数也不能修改已部署静态资产;6 个页面和提交动作由 `legacyPWABlocker` 明确为基础设施阻塞,不提供“保存成功但客户端不生效”的伪配置。 - `Extend/QuartzTask` 管理的是 `QuartzNetTask` 任务记录、任务内日志及常驻进程中的 `IScheduler/ScheduleTaskHandler`,创建、更新、立即执行、暂停、恢复和删除都必须同步调度器。目标只存在语义不同且为空的 `SenTask`,云函数没有 Quartz 控制面;含 GET/POST 两个同名 `TaskAdd` 在内的 11 个动作由 `legacyQuartzTaskBlocker` 分别返回数据或基础设施阻塞原因。 - 旧 `Design/Resource` 的历史资源已从线上 `DesignRes` 恢复到 Angular“可视化设计资源”页:`designResources` 提供帐套隔离、分页、搜索和 `ztype` 精确筛选,`saveDesignResource` 只允许更新名称、类型、用途、状态及 `style/use/fun` 元数据,`designResourceBatch` 覆盖单条和批量删除。`id/vpath/previewimg/cdate/userid/sourceKey` 均锁为只读;线上 Parse 文件适配器仍错误要求 MongoDB 连接串,而当前项目使用 PostgreSQL,因此新增及替换原文件/预览图继续以 `migration_blocked` 明确拒绝,不会伪造可用资源路径。 - 旧 `User/Role` 的 9 个管理员角色、3 个用户角色与 `ARoleAuth` 权限记录已迁到 Angular“系统角色”页及 `roles/saveRole/roleAuthorization/saveRoleAuthorization/roleBatch`:支持角色类型切换、搜索、分页、名称防重、原子 `roleId`、12 个旧权限域完整编辑及权限码格式校验。角色类型创建后不得在 `admin/user` 之间迁移;删除前同时检查 `Manager.adminRole` 和 `_User.legacyUserData.UserRole`,无账号引用时才级联删除 `ARoleAuth`。Parse 原生 `_Role` 为空,`Permission` 是另一套网页设计师模型,二者都没有被误当作旧 `ZL_Role`。交付程序中 `B_ARoleAuth.Check/CheckEx/AuthCheckEx` 均固定返回 `true`,因此保留的旧权限码不用来绕过当前云函数的独立管理员会话与帐套校验。 - `Extend/Safe` 的 15 个入口已完成数据与运行时审计:线上全部 Schema 仅命中不相关的 `SafeMobile`,没有旧 `Safe_IP`、非法词库、扫描结果或站点保护配置。旧聚合 `API` 还依赖服务器站点文件、五秒后返回的 Razor 局部页、`ContentWordHelper` 常驻线程与进度缓存;`SiteProtect_Submit` 只更新旧 `SiteConfig.Safe_ContentCheck_Models`,`ContentCheckConfig_Submit` 直接写 `IllegalWordsVerify.keywordsVPath` 服务器文件。当前内容写入链不消费这些配置,单纯存入 Parse Config 会伪造安全能力;因此 IP 三项按数据缺失、其余按基础设施缺失由 `legacySafeBlocker` 返回逐项 `migration_blocked`。 - 旧组织架构 14 个动作依赖 `ZL_Structure` 的父子树、排序、权限、提醒、成员/管理员 ID 集合、结构经验,以及 `ZL_User.StructureID` 双向关系。线上 110 个 Schema 不存在 `Structure`/`ZL_Structure`,`Profile` 与 `Group` 均不是这套结构数据,不能用现有部门标签伪造历史组织关系;全部动作由 `legacyStructureBlocker` 返回逐项数据阻塞。 - 旧 Vue 模板后台依赖未迁入的 `ZL_Vue_Tlp`,预览与发布还要读取 `SiteOption.TemplateDir` 下的服务器模板、运行 `B_CreateHtml` 标签渲染、套用 `/Config/CodeTlp/vue.tlp` 并复制到 `SiteOption.VUE_DirCopy`。目标既无模板数据,也无这些文件与发布运行时;5 个动作由 `legacyVueBlocker` 分别返回数据或基础设施阻塞。旧工作量页的 `GroupDayCount` 必须将 `ZL_CommonModel` 与缺失的 `ZL_Comment` 按 `GeneralID` 内连接后逐日统计内容、评论和点击;目标只有 `CommonModel`,不能把内容数伪装成旧工作量报表,`Default` 由 `legacyWorkloadBlocker` 明确数据阻塞。 - 旧 H5 电子书 6 个动作全部依赖未迁入的 `ZL_H5_Item`,包括标题、封面、模板关系、推荐状态与 `SetTemplate` 行为;线上 Schema 没有 H5/电子书候选类,均由 `legacyVBookBlocker` 返回数据阻塞。 - 旧 `Vdesign` 应用后台管理的是 `ZL_Vdesign`、文章/商品绑定、留言、模板、模板分类、站点变更与模板购买日志共八组数据。线上 `DesignSiteInfo/DesignPage/DesignTlp` 来自另一套 `ZL_Design_*` 可视化系统,字段、ID、模板关系和生命周期不等价,商品主表 `ZL_Commodities` 也未迁入;19 个动作由 `legacyVdesignBlocker` 逐项说明,不污染现有可视化场景数据。`Extend/VDesign` 的 15 个 SPage 动作则依赖缺失的 `ZL_SPage_Page`、旧组件/布局 Razor 视图、Zoomla 标签库与 `B_CreateHtml` 渲染器,由 `legacySPageBlocker` 分别登记数据或基础设施阻塞。 - 旧书法珍珠后台 10 个动作依赖 `ZL_Write_Copybook/ZL_Write_Manuscripts/ZL_Write_Word/ZL_Write_UserFiles` 的字帖、文稿、字词和逐文件授权到期历史;目标 Schema 没有任何 Write/Copybook/Manuscript 候选类,账户会员期限也不等价于指定书写文件授权。全部动作由 `legacyWritePearlBlocker` 返回逐项数据阻塞。 - 旧 `Design/Scene` 的普通场景管理已迁到 Angular“可视化场景”页:`designScenes` 复刻 `ZType=0、TlpID=0` 及正常/回收站状态范围,提供帐套隔离、搜索和分页;`saveDesignScene` 只更新旧编辑页允许的标题、用户、积分、状态、搜索标记、预览图、缩略图、说明和 Meta,并从同帐套 `_User` 同步用户名。`designSceneBatch` 覆盖回收、恢复与彻底删除;`createDesignSceneTemplate` 完整复制布局/组件/资源数据,分别用 PostgreSQL advisory lock 原子分配 `DesignTlp.id` 和模板副本 `DesignScence.id`,任一步失败都会补偿清理。普通场景的新建仍依赖已丢失的可视化设计器初始化协议,因此专用保存接口只接受现有场景。 - 旧 `Design/Template` 的模板列表、回收站、表单和生命周期已迁到 Angular“可视化模板”页:`designTemplates` 支持帐套、状态、原始 `classId` 和关键词筛选;`saveDesignTemplate` 白名单维护名称、分类编号、价格、预览图、积分、状态、来源和说明,新建时原子分配模板及空模板场景编号,失败会补偿清理;`designTemplateBatch` 覆盖回收、恢复及模板与关联场景的完整删除。目标没有 `DesignTlpClass`,因此页面保留历史 `classId` 数字而不伪造分类名称。`designTemplateEditorTarget` 可解析真实场景 GUID 与旧 `/design/default?id=...` 地址,但旧可视化编辑器的前端资产、布局交互和渲染运行时未交付,所以 `GoDesign` 保持明确的部分迁移状态。 - 旧 `NodeAdd_Submit`、`Node_API` 与 `UnionNode_Move` 的核心栏目生命周期已迁为专用 `saveNode/nodeBatch`:新增栏目以临时来源键完成 Parse 初始写入,再使用 PostgreSQL 事务锁原子分配 `nodeId/orderId` 并替换为旧 `sourceKey`;保存会校验同级名称/目录重复、父栏目帐套和回收状态,移动会阻断自身/下级循环并递归修正所有后代深度。回收、恢复和每批 1–100 个栏目迁移已接入 Angular;永久删除仅在没有内容、下级栏目、节点权限和模型模板引用时开放,通用保存与删除不能绕过。 - 旧 `SpecialAdd_Save` 与 `UnionSpecial_Move` 已迁为专用 `saveSpecial/specialBatch`:新增专题使用临时来源键和 PostgreSQL 事务锁原子分配 `specId/orderId`,保存时校验全帐套名称/目录唯一、父专题归属与层级循环;删除会拒绝仍有下级专题的记录。旧 `UnionSpecial_Merge` 被明确列为数据阻塞:`CommonModel.specialId` 只存在于 Parse Schema、PostgreSQL 物理列缺失,商品主表也未迁移,无法安全改写内容/商品专题关系。 - 旧 `ModelManage/Field/Order_Submit` 的安全部分已迁为 `saveModelMetadata/saveModelFieldMetadata/modelFieldOrder`:现有模型可编辑名称、条目文案、图标、说明和内容模板元数据,现有字段可编辑别名、提示、显示/搜索配置,并可在同模型内批量排序;`modelId/modelType/tableName/fieldId/modelId/fieldName/fieldType/sourceKey` 等结构字段通用只读。新增、复制、删除模型或字段会显式返回 501,因为旧实现同时执行 PostgreSQL 建表/改列、标签生成和模板文件写入,目标托管环境没有该 DDL/旧模板运行时。 - 旧 `Guest/MsgList/ReplyGuest/MsgShow/Msg_API` 已迁为 `saveGuestbook/guestbookReply/guestbookBatch`:留言列表支持帐套分页、标题搜索和每批 1–100 条审核/取消审核/回收/恢复;详情可白名单编辑标题与正文,管理员回复继承原分类和父 `gid`,再以事务锁原子分配新 `gid/sourceKey`。永久删除会拒绝仍有回复的留言;普通留言新增继续只走已上线 H5 留言云函数。`gid/parentid/cateid/userid/status/sourceKey/gdate/ip` 均通用只读。 - 旧 `Guest/Bar` 共用的分类新增、编辑、推荐与删除已迁为 `saveGuestCategory/guestCategoryBatch`:新增分类用事务锁原子分配 `cateid/orderId/sourceKey`,`gtype=0` 留言分类固定顶级,`gtype=1` 贴吧分类支持父子结构并阻断循环;同父同类型名称防重,删除前同时检查下级分类、留言与帖子引用。贴吧发帖频率仍依赖旧 `GuestConfig` 文件,版块清空与用户级贴吧授权也尚未开放,因此对应动作保守标为部分实现。 - 旧 `Bar/TieList/TieDetail/TieMove/Tie_API` 的帖子工作流已迁为 `barBatch`:每批 1–100 条支持审核/取消审核、回收/恢复、全局/版块置顶、取消排序、沉底、精华/取消精华和移动贴吧分类;移动会验证目标为同帐套 `gtype=1` 分类。`GuestBar` 在通用资源中改为结构只读,避免直接篡改帖子 ID、作者、父回复、状态、排序和精华标记。旧“勋章”动作依赖未迁移奖章关系表,继续保守标为部分实现而不伪造成功。 - 旧 `BarAuthSet/BarAuthSet_Submit` 经逐浪官方源码模型复核,依赖独立 `ZL_Guest_BarAuth` 用户版块关系(`Uid/BarID/Look/Send/Reply`),并非仅靠 `Guestcate.needLog/postAuth` 即可等价实现;目标 109 个 Parse Schema 中只有 `GuestBar/Guestcate`,没有该权限关系或 `ZL_Guest_Medals` 勋章关系。管理员网关新增 `barAuthorization/barMedal` 显式 501 响应,避免界面或调用方误以为保存成功,并将两项授权动作列入最终数据阻塞清单。 - 旧考试后台 `Question_Class_Manage/AddQuestion_Class/Question_Class_GetChild/Question_Class_Add` 已按官方 `ZL_Exam_Class` 模型迁到目标 `ExamClass`:`saveExamClass` 用 PostgreSQL 帐套事务锁原子分配 `cId/cOrderBy/sourceKey`,校验名称唯一、父分类归属和层级循环;`examClassChildren` 保留旧按父编号取子项能力,删除会拒绝仍有下级分类或 `ExamSysQuestions.pClass` 试题引用的记录。Angular 新增“试题分类”导航和结构表单;旧展开树视觉布局尚未复刻,因此列表动作仍保守标为部分实现。 - 旧考试后台 `ExamPointManage/AddExamPoint/ExamPoint_Add` 已按官方 `ZL_ExamPoint` 模型迁到目标 `ExamPoint`:`saveExamPoint` 使用帐套事务锁原子分配 `id/orderBy/sourceKey`,自动记录创建管理员与时间,并校验名称唯一、上级考点归属和层级循环;删除拒绝仍有下级考点的记录。Angular 新增“考点管理”导航及父级/排序结构表单,通用保存不能绕过专用一致性规则。 - 新版考试后台 `KnowledgeManage/AddKnowledge/Knowledge_Add/Knowledge_GetChild` 已单独迁到 `QuestionsKnowledge`,不再与早期把 `ExamPoint` 称作“知识点”的页面混用:`saveKnowledge` 原子分配 `kId/kOrderBy/sourceKey`,要求绑定同帐套真实 `ExamClass`,父知识点必须同科目,并阻断名称重复和层级循环;`knowledgeChildren` 保留科目内子级读取,删除会检查下级知识点及 `ExamSysQuestions.pKnowledge` 引用。Angular 新增知识点导航和科目/父级/排序结构表单;旧展开树视觉仍标为部分实现。 - 旧考试后台 `ExTeacherManage/AddExTeacher/Teacher_Add` 已迁到 `ExTeacher`:`saveExamTeacher` 仅白名单保存姓名、岗位、授课、头像路径和简介,使用帐套事务锁原子分配旧 `id/sourceKey`,服务端记录创建管理员与时间,并校验任教 `ExamClass` 属于同一帐套。Angular 新增“考试教师”入口和任教分类结构控件;线上 Schema 扫描未发现指向 `ExTeacher` 的 Pointer 或明确数字外键,删除仍保留帐套隔离和审计。 - 旧数据字典 `DicCateList/DictCate_API/DicCateSel/DicItemList/DicItem_API` 已按官方 `ZL_Datadiccategory/ZL_Datadic` 模型迁为 `saveDictionaryCategory/saveDictionaryItem/dictionaryCategories/dictionaryBatch`:分类与字典项分别分配旧 `DicCateID/DicID`,校验帐套内分类名称和分类内字典项名称防重,支持每批 1–100 条启用、停用和删除;分类仍有字典项时禁止删除。线上这两类的业务字段由迁移兼容层从登记数据还原,Parse Schema 虽声明字段但 PostgreSQL 物理表没有对应列,因此编号改为经 Parse 读取全局最大值并依靠唯一 `sourceKey` 冲突重试,未伪装成不可执行的物理列事务;新分类编号还会高于所有既有 `diccate` 引用,避免错误接管历史字典项。Angular 新增分类、字典项导航和帐套隔离分类选择控件。 - 旧多级数据字典 `GradeCateManage/GCateAdd/GCateAdd_Submit/GCate_API/GradeOption/GOptionAdd/GOptionAdd_Submit/GOption_API` 已按官方 `ZL_GradeCate/ZL_Grade` 模型迁为 `saveGradeCategory/saveGradeOption/gradeCategories/gradeOptions/gradeBatch`:分类维护至少两级的 `gradeField` 层级别名,选项按分类和父选项自动推导 `grade`,校验同级名称防重、父级归属和最大层级;编辑选项只允许改名,不能篡改 `cate/parentId/grade`。分类和选项分别保护仍有选项、下级选项的删除,Angular 提供按分类及父选项查看当前层、专用新建表单与批量删除。`GradeCate` 的兼容层计数会错误返回 0,因此编号和读取同样使用 Parse 行结果与唯一 `sourceKey` 冲突重试,不依赖失真的 count 或缺失物理业务列。 - 旧商城扩展 `Currency/Currency_API` 的现有货币管理已迁到目标 `Currency`:`saveCurrency` 白名单更新货币名称、2–10 位大写代码、符号、正数当前汇率与备注,并校验帐套内名称及代码唯一;`currencyBatch` 支持每批 1–100 条帐套隔离删除。`CurrencyAdd/CurrencyAdd_Submit` 明确列为基础设施阻塞:旧数字字段就叫 `id`,与 Parse SDK 对象保留 `id` 冲突,兼容层物理表又没有可写业务列,实测以 `sourceKey` 新增后重新读取仍无法得到旧数字 ID;Angular 已隐藏新增入口,云函数对新增返回 501,避免产生坏数据。 - 旧系统 `Config/Holiday/Holiday_API` 的现有节假日管理已迁到 `SysHoliday`:`saveHoliday` 只允许更新名称、公/农历类型、`MM月DD日` 日期、影响天数、状态与展示文本,保护旧 ID、创建人、创建时间和来源键;`holidayBatch` 支持每批 1–100 条帐套隔离删除。`HolidayAdd/HolidayAdd_Submit` 因 `SysHoliday.id` 与 Parse 保留字段冲突且物理表缺少可写旧 ID 列而明确列为基础设施阻塞,Angular 隐藏新增入口,新增请求返回 501。目标 `CourseAppointment/LessonRecord` 均无节假日外键,未伪造删除级联。 - 旧 `Config/SearchFunc/SearchFunc_API/SearchFuncAdd/SearchFuncAdd_Submit` 已映射到目标 `Search`(后台快捷入口,非内容搜索日志):`searchNavigations` 按管理后台/用户中心类型、启停和推荐状态筛选,`saveSearchNavigation` 白名单维护名称、站内路径、图标、打开方式、移动端、尺寸、颜色、用户组和推荐级别,`searchNavigationBatch` 覆盖启停、推荐/取消推荐、排序和删除。目标兼容层只能在不指定字段时还原旧数据;可回滚的临时创建—读取—删除实测证实 `sourceKey` 无法还原保留名为 `id` 的数字业务键,因此 Angular 隐藏新增,云函数返回 501。旧 `starturl` 依赖不存在的 `SiteConfig.SiteOption.Admin_StartUrl` 持久层,同样明确 501,未以浏览器本地存储伪造全局配置。 - 旧 `Config/APIInfo/ReadFile` 页面的文档功能已迁为 Angular 云函数接口目录:`apiCatalog` 从实时 `Function` 元数据安全返回名称、路径、描述、参数、响应类型和更新时间,不暴露 `code`;界面可搜索并复制路径。`FontIcon` 替换为完整 Lucide 图标库的搜索、分页和点击复制页。旧 API 密钥/IP 策略、Swagger 开关、协议文件、进程关闭、`KeyboardConfig/Hotkey` XML 快捷键与 `PrizeConfig/PrizeTask` 奖励规则在目标 Schema/云函数运行时均无等价执行层;`legacyConfigBlocker` 对全部 11 个旧请求返回逐项 501 原因,避免伪保存。 - 旧广告后台 `Extend/AD/ZoneManage/Zone_API/InfoManage/Info_API` 已映射到目标 `AdZone/AdInfo`:`adZones/adInfos` 支持帐套隔离、关键词、广告位类型/归属和启停/审核状态筛选;`saveAdZone/saveAdInfo` 对现有记录白名单维护版位、素材、链接、有效期、权重和状态,`adZoneBatch/adInfoBatch` 覆盖每批 1–100 条启停、审核、取消审核和删除,删除广告位前会阻止仍被广告内容引用。Angular 新增广告位、广告内容导航和当前生效广告预览;旧 HTML 仅作为源码文本展示,不在管理端执行脚本。可回滚创建探测证明 `AdZone.id/AdInfo.id` 被 Parse 当作保留字段拒绝,省略 `id` 又不会生成旧编号,因此两个新增分支明确返回 501,现有编辑分支继续可用。 - 旧字体图后台的 `Shape/ShapeInfo/ShapeInfo_Submit/Shape_API/ShapeType/ShapeTypeInfo/ShapeTypeInfo_Submit/ShapeType_API` 已映射到目标 `FontPicShape/FontPicShapeType`:专用列表支持帐套、关键词和分类筛选;现有素材可维护名称、备注、分类并安全预览原路径,现有分类可维护名称和备注,删除分类前检查素材引用,素材/分类批量删除限制每次 1–100 条。可回滚探测证明省略 `id` 创建不会生成旧编号,因此新增素材/分类明确 501。图片替换也明确列为基础设施阻塞:线上实测 `Parse.File` SDK 与 `/parse/files` REST 端点均返回“要求 mongodb:// 或 mongodb+srv:// 连接串”,说明当前 PostgreSQL 部署的 Parse 文件存储适配器配置错误;Angular 不展示失效上传控件,云函数收到 `file` 时返回 501,避免伪成功。线上完整 Schema 核验只有 `FontPicShape/FontPicShapeType/UserSIcon`,其中 `UserSIcon` 是积分流水而非字体图;旧 `FontPic` 成品图和 `FontPicDraft` 草稿主表及数据均不存在,其 8 个动作由 `legacyFontPicBlocker` 返回逐项数据阻塞原因。 - 旧问卷后台 `SurveyManage/Survey_API/SurveyAdd/SurveyAdd_Submit/SurveyItemList/SurveyItemAdd/SurveyItemAdd_Submit/SurveyItem_API/SurveyResultChart/SurveyResultList` 已按真实兼容模型 `DesignAsk/DesignQuestion/DesignAnswer` 迁移:问卷支持状态和关键词筛选、启停与删除,题目按问卷分页、编辑、排序和删除,答卷只读展示并可删除,结果统计从旧 `answer` JSON 聚合各选项计数且单独报告不可解析历史答卷。目标 `SurveyItem/SurveyLog` 属于新的考试测评模型,没有错误拼接到旧问卷。兼容层的 `count` 对 `DesignAsk` 错报 0,专用云函数改为读取实际行后分页;线上实际存在 2 份问卷、96 道题和 105 份答卷。可回滚 `sourceKey` 创建探测证明无法生成旧数字 ID,因此新增问卷和题目明确 501,现有记录编辑继续可用。Angular 新增问卷、题目、答卷入口、问卷范围筛选、批量工具和安全统计视图。 - 旧客服后台 `Default/Seat/SeatAdd/SeatAdd_Submit/CodeAdd/CodeAdd_Submit/Seat_API/CodeList` 已映射到 `ServiceSeat` 与 `Temp(useType=12)`:`serviceSeats/saveServiceSeat` 支持帐套隔离列表、现有编辑、绑定同帐套有效账号、默认席位互斥、排序与原子生成 `sId/sourceKey`,`serviceCodes/saveServiceCode` 只读取并白名单维护客服欢迎语的名称、HTML 内容和主题,`serviceBatch` 覆盖席位及欢迎语删除。Angular 新增客服席位、客服欢迎语入口、账号绑定控件和批量删除。旧逻辑在用户名不存在时以固定密码 `123456` 自动开户,该弱密码行为不迁移:云函数明确 501,并要求先走现有安全开户流程。`Temp.id` 与 Parse 保留字段冲突且省略 ID 无法生成旧编号,因此欢迎语新增明确阻塞。目标 Schema 完全缺少 `ChatMsg` 或等价消息类,`MsgEx/MsgInfo/MsgList` 以及 `Seat_API.chat_del` 由 `legacyServiceChatBlocker` 返回逐项数据阻塞原因。 - 旧店铺后台 `StoreManage/Store_API/StoreStyle/Style_API/StoreStyleAdd/StoreStyleAdd_Submit/StoreUpdate/StoreUpdate_Submit` 已映射到规范化 `StoreApplication/StoreStyle`:店铺按状态和关键词筛选,支持审核、取消审核、推荐、取消推荐,现有资料可维护同帐套所属账号、样式、联系方式、地址和展示内容;样式可维护三类模板路径、缩略图和说明,删除前检查店铺引用。Angular 新增店铺、店铺样式入口、状态工具和归属/样式选择。店铺与样式旧数字 ID 都不能通过兼容层安全新增,店铺创建还依赖已丢失的模型 6 动态字段链,因此新增明确 501。旧 `ZL_Commodities` 商品主表完全缺失,目标 `Product/StoreProduct` 只有图片等扩展碎片,无法核验店铺商品引用,所以真实删除店铺与 `Product` 页面均明确数据阻塞,未冒险制造孤儿商品。 - 旧内容附加功能 `TagKey/TagKey_Submit` 已迁移为 Angular 全局内容标签词库:保留管道符分隔、移除空白/引号/反斜杠和原顺序语义,改由 `saveContentTagKeys` 管理云函数写入 Parse Config,不再依赖旧 ASP.NET 服务器的 `/js/ICMS/tags.json` 本地文件。线上完整 Schema 核验不存在 `Comment/ContentAudit/ContentVerBak` 或等价类,因此 `Comment/Commont_API`、4 个内容审核流动作以及 `VerBak/VerBak_Del` 均由 `legacyContentAddonBlocker` 返回逐项数据阻塞原因,未用 `CommonModel` 状态伪造丢失的审批历史。 - 旧商城供应商 `Vendor/Vendor_API/VendorAdd/VendorAdd_Submit` 全部依赖未迁入的 `ZL_Shop_Vendor`:线上 Schema 与签约数据库文档均没有 `Vendor/ShopVendor/Manufacturers`。现有 `Agency` 只有机构编号/名称/负责人,`DeliveryCenter` 只有交付中心编号/负责人,都缺供应商地址、手机、传真、邮箱和状态,不能等价映射。`legacyShopVendorBlocker` 已按动作返回数据阻塞原因,未擅自新建未签约数据类或污染机构数据。 - 旧用户附加功能中,`PointGroup/PointGroupAdd/PointGroup_API/PointGroup_Submit` 已映射到 `UserLevel`:提供帐套隔离列表、关键词搜索、现有等级别名/积分阈值/图片/备注编辑和批量删除;旧 `id` 与 Parse 保留字段冲突,因此新增等级明确 501。`VMoneyLog/UserExp/UserExp_Submit` 已由 `UserMoneyLog` 与 `adjustUserBalance` 覆盖:统一聚合 `UserExpDomP/UserSIcon/UserExpHis/UserUserPoint/UserDummyPoint/UserCredit` 六类规范化账本,支持类型、日期、用户名与摘要筛选;管理员调整会在单个 PostgreSQL 事务中锁定用户、写不可变新流水并同步 `Purse/SilverCoin/UserExp/UserPoint/DummyPurse/UserCreit`,扣减不能产生负数,既有流水仍不允许篡改。旧 `ThirdInfo.config` 六个提供商和密钥未迁入,现有 `ThirdPlatInfo` 是不同业务平台且没有旧 OAuth/XML 消费者;`PrizeTaskLog(Global.SignIn)` 用户签到日志与 `UserRealNameAuth` 实名申请/奖励链也全部缺失。这 6 个动作由 `legacyUserAddonBlocker` 逐项返回数据或基础设施阻塞,未把 `MisSign` 工作签到或 `Profile` 零散身份字段伪装成旧审批历史。 - `UserController` 最后一批动作已完成逐项核验:表格用户名辅助方法由 `_User` 规范化字段直接替代;管理员资金调整已完整迁移;管理员自身改密、角色权限、协同企业成员和推广关系图分别由现有专用云函数部分或完整覆盖。用户订单与 CRM 客户表、Bugle 归属管理员、邮件/订阅历史、`Plat_Group` 部门树均未迁入;旧 Office/Word 导出、密码代登、随机密码邮件审核、Jobs/Zone Razor 配置和 `SiteInfo.APIClose` WebService 宿主也不存在。19 个不可等价入口统一由 `legacyUserRemainderBlocker` 返回具体原因,管理员 `Manager` 数据只通过隐藏密码字段的资源页查看,不把孤立 Manager 行伪报成可登录 Parse 管理账号。 - 旧问答后台 11 个动作无法从目标数据库等价重建:线上 Schema 没有 `Ask/GuestAnswer`、`ZL_Ask/ZL_GuestAnswer` 历史记录或 `QueId` 问题—回答关系。`Baike` 是百科词条,`Guestbook` 是留言/回复,`GuestBar` 是论坛帖子,`DesignQuestion/DesignAnswer` 是问卷题目/答卷,都不能伪冒问答主从表。`Default/AskInfo/AskAdd/AskAdd_Submit/Ask_API/AnswerList/AnswerAdd/AnswerAdd_Submit/Answer_API` 已按数据阻塞登记;`Config/Config_Submit` 依赖已丢失的 `GuestConfig.WDOption` 问答运行时、用户组权限与积分消费者,按基础设施阻塞登记。`legacyAskBlocker` 会对每个请求返回具体原因。 - 旧裱件计算后台 5 个动作全部依赖未迁入的 `BiaoCalcModel/BiaoCalcUserFiles`:目标 Schema 与签约数据库文档都没有裱件主记录、用户文件授权、等级或 `ExpireTime` 历史数据。现有账户会员到期时间控制整个账户权益,不等价于指定裱件用户文件授权,因此不用它伪实现到期/续期。`legacyBiaoCalcBlocker` 已对 `Default/BiaoDetail/Biao_API/UserFiles/UserFiles_API` 返回逐项数据阻塞原因。 - 旧 `Office/Chart.Index` 控制器只执行 `View()`,但反编译交付包和 Zoomla 官方 `cms2` 源码树都不包含对应 `Areas/Admin/Views/Office/Chart/Index.cshtml`,也没有任何参数、数据源或交互合约可供推导。该动作按缺失旧视图资产的基础设施阻塞登记,不把无关的问卷统计或 `ECharts` 编辑器冒充为 1:1 页面。 - 旧聊天后台的用户消息数、个人/群聊历史、好友、群组、群成员和管理员操作全部依赖 `ChatMsg/ChatGroup/ChatGroupUser/User_Friend`,目标 Schema 与数据库文档均未迁入这些类和历史关系。`UserFriendGroup` 仅保留好友分组,不是好友关系;旧 `RoomConfig` 的 TRTC AppID/SecretKey 与消费它的聊天运行时也不存在。因此 9 个数据动作和 2 个配置动作分别登记为数据/基础设施阻塞,`legacyChatBlocker` 返回逐项原因。 - 旧可视化模板分类 `Design/Class` 的 4 个动作依赖 `DesignTlpClass/Design_TlpClass`,但线上两个候选 Schema 都不存在。现有 `DesignTlp` 确有 2 条历史模板且均引用 `classId=6`,分类 6 的名称、父级、排序和说明却已丢失。不擅自新建分类伪造语义,也不执行可能使模板引用悬空的删除;`legacyDesignClassBlocker` 会返回逐项数据阻塞原因。 - 旧 `Com` 通用控制器中,`Logout` 已迁为管理云函数销毁当前 Parse `_Session`,Angular 再清除本地会话并返回登录页;`BootLayout` 已完整迁为 Angular Bootstrap 栅格工具,保留 `.container/.container-fluid`、2–8 列、5 类设备断点、6 组预设、预览和复制 HTML。`SPwdCheck` 依赖旧 `Manager.RandNumber` 二级密码 Session 及业务消费者;6 个 Excel 导入动作依赖已缺失的 `/Config/Import/{mode}.xml`、NPOI、动态模型附表和 `ZL_Commodities`,由 `legacyComBlocker` 返回基础设施原因。`Sort/Sort_API` 中的 `ModelField` 帐套安全排序已由 `modelFieldOrder` 覆盖,内容、商品、栏目和贴吧分类分支仍按部分迁移登记。 - 旧 `Common/UserBaseField` 依赖 `B_UserBaseField + ZL_UserBase` 动态用户扩展字段,目标 `Profile` 不是这套任意动态表单的等价数据;`ContentField` 依赖根据 `CommonModel.TableName/ModelID` 实时解析任意动态内容附表,目标只保留部分签约副表。两者按数据阻塞登记。`SelUploadFiles` 视图在交付包和官方源码均缺失,当前 PostgreSQL Parse 文件适配器又无法完成上传,按基础设施阻塞登记;`legacyCommonBlocker` 会返回逐项原因。 - 旧 `Config` 中除已迁移的节假日与另行审计的 API/快捷键/奖励页外,本批 18 个站点配置动作均依赖 ASP.NET `SiteConfig/OrderConfig/SMSConfig/WaterModuleConfig`、XML/单例文件、`web.config` 与宿主重启。目标没有签约的统一配置模型,也没有能同时消费站点、上传、SMTP、注册奖励、订单文案、短信、水印缩略图、MIME/错误页与重新安装设置的云运行时。不把值单纯塞入 Parse Config 伪装成“已生效”;`legacySiteConfigBlocker` 对每个页面/提交动作返回具体基础设施原因。 - 旧百科后台的主词条审查已映射到 `Baike`:`baikeEntries` 提供帐套、关键词、审核/未审核和推荐/未推荐筛选,`baikeBatch` 支持审核、取消审核、推荐和取消推荐,Angular 新增百科审核入口和只读详情。线上仅保留 1 条 `Baike` 主记录,完全没有旧 `BaikeEdit` 版本表,因此 `BKVersionList/Version_API/BKList` 及 `BK_API` 的版本删除/应用部分明确数据阻塞。`GuestConfig.BKOption` 百科创建/编辑/推荐权限与积分奖励消费者也缺失,`Config/Config_Submit` 按基础设施阻塞登记;推荐操作不伪造已发放奖励。 - `_User`、`CommonModel`、`Node` 与 `Special` 表格已补齐当前页全选和批量工具栏,可直接批量停用/解锁/移动用户组,审核、回收、恢复、移动内容节点,回收、恢复、移动栏目,以及移动专题;翻页或重新查询会清空选择,避免误操作隐藏页记录。 - 迁移状态页已接入从反编译基线自动生成的 1,042 项旧后台动作台账,可按模块、action、原因与状态搜索筛选;当前最终登记为 161 项已实现、109 项部分实现、429 项数据阻塞、343 项基础设施阻塞、0 项待逐项核验。`final-blocked-actions.generated.md` 同步列出全部 772 个无法等价迁移动作及逐项原因,生成器和 `admin-coverage:check` 会阻止台账、清单与源码基线漂移。 - Parse 登录只在浏览器保存当前 `sessionToken`;`masterKey` 只在部署进程中使用。 - 云函数网关强制校验管理员身份、`company` 帐套、类白名单、字段白名单和敏感字段过滤。 - `_Session` 不开放,`Function` 源码不开放通用查询或编辑;用户密码只允许专用重置操作。 - 8 个管理/CMS 函数均验证未认证请求返回 401;临时帐套管理员完成真实只读冒烟测试后已删除。 - `xiaoshu.app.gateway` 已覆盖旧 H5 源码静态清单的 91 个 action,并提供上传、英语阅读等兼容动作;生产 `migration_status` 当前为 86 个已实现、16 个阻塞项。商品、购物车、优惠券、订单、学习豆支付、物流、评价、商户销售和代理库存已经使用锁定规范类及专用云函数完成真实读写、幂等和审计。Angular 浏览器端全部收口到该云函数,不再携带旧 API 凭据或回退旧 `/api/WXAPP`;剩余短信、微信、外部资金、支付密码和实名动作仍不算业务语义迁移完成。详见 `wxapp-cloud-action-matrix.md`。 - 旧数据的 `isDeleted` 在部分物理表与 Parse Schema 不一致,把它放入 Parse 查询条件会返回 500;网关改为公司条件查询后在结果侧兼容过滤。 - Angular H5 已开始按页回归切换:账号密码登录、版本、栏目、公开内容、8 类 addon 联表,以及学习记录详情、预约详情、生词本、21 天抗遗忘列表可走云函数;私有读取只在真实 Parse 会话下切换,其余 action 仍由显式迁移路由保留旧端点。 ## SQL 视图 / 函数替代状态 | 旧对象 | 云函数替代 | 状态 | 说明 | |---|---|---|---| | `ZL_StripeHtmlTag`、`ZL_StripeTrimstr` | `cms.content-normalizer` | 已实现 | 保守转换为纯文本,覆盖脚本、样式、实体和空白 | | `ZL_EX_UserView` | `cms.users.extended` | 已实现 | 过滤密码、哈希、会话、Token 与 Secret | | `ZL_Exam_ClassView` | `cms.exams.classes` | 已实现基础投影 | 当前目标类缺少可证明的学校/年级 Pointer 时不伪造关联 | | `ZL_Guest_BarView` | `cms.guest.bar` | 已实现基础投影 | 支持帐套与分页 | | `ZL_SearchView` | `cms.search` | 已实现 | 搜索 `CommonModel` 并清理输出 HTML | | `ZL_User_PlatView` | `cms.users.platform` | 已实现 | 使用合并进 `_User` 的 legacy 平台资料 | | `ZL_User_WXView` | `cms.users.wechat` | 已实现 | 使用合并进 `_User` 的微信资料并过滤密钥 | | `ZL_CartProView` | `cart_list` / `ShoppingCartItem + CommerceProduct` | 已实现 | 按帐套、本人、发布状态和软删除状态联查 | | `ZL_Order_PayedView` | `order_list` / `CommerceOrder + CommercePayment` | 已实现 | 学习豆支付采用原子事务并保存支付快照 | | `ZL_Order_ProSaleView` | `user_shop_sales` / `CommerceOrderItem` | 已实现 | 按商户及周、月、累计维度汇总真实订单明细 | | `ZL_Order_ShareView` | — | 数据阻塞 | 目标 Schema 无订单分享关系类 | | `ZL_Plat_BlogView` | — | 数据阻塞 | 目标 Schema 无博客正文/回复类 | ## 仍需逐页专用迁移 动态 Schema CRUD 覆盖的是规范化业务数据管理能力,不代表旧后台 1,042 个动作已逐页复刻。考试组卷、微信配置、订单支付、模板编辑、数据库备份、站点集群、PowerShell、文件管理等必须逐项判断: 1. 有目标业务类且仍属当前产品范围:新增专用 Angular 页面和专用云函数。 2. 需要第三方密钥或基础设施权限:取得新系统凭据后再实现,前端不得存储密钥。 3. 依赖未迁移表、IIS、Windows 文件系统或旧 Zoomla 运行时:列入最终无法迁移清单,不以空成功响应代替。 ## 管理员启用前置条件 线上 435 个 `_User` 在核验时没有任何 `isAdmin=true`、`role=admin` 或 `adminRoleKey` 管理员。系统因此默认不可登录管理端。上线前必须由持有 Parse `masterKey` 的部署人员为明确指定的现有用户设置: - `isAdmin: true` - `roles: ["admin"]` - `company: Pointer` 跨帐套管理员才可设置 `adminRoleKey: "super-admin"`;不允许从浏览器执行管理员提权。