Files
airz-uniapp/docs/反馈消息发布清单.md
hujun 1723363b7e feat: 增加反馈消息闭环相关功能及文件
新增反馈目标登录白名单、账户切换守卫、待确认反馈存储、缓存生命周期管理,补充相关文档及截图,完善消息跳转逻辑
2026-10-05 20:11:24 +08:00

98 lines
8.5 KiB
Markdown
Raw Permalink 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-05。本文记录0.57—0.59反馈闭环源码的发布范围、迁移、验收和回滚边界。本轮已完成后端生产发布;小程序端由用户自行发行。目标后端为 `https://airz.hqling.cloud`,生产目录为 `/www/wwwroot/xctai.cn`。
## 1. 发布范围
本次配套范围包括:
- 0.57后台反馈并发保护、CSRF、版本冲突和事务审计。
- 0.58会员反馈 `requestId` 回执、未知提交恢复和原键确认。
- 0.59反馈回复触发本人站内消息、消息目标跳转、通知去重及账户切换守卫。
本地发布包应只从下列清单取文件。前端与后端必须作为同一兼容批次安排;后端先发布并完成回执检查后,才能发行依赖 `requestId` 和反馈目标的前端。
明确排除:积分规则及积分表迁移、首页及内容功能的其他未提交改动、`Home.php`/`HomeCatalog.php`、首页测试、FAQ种子导入、私有附件、短信/数据/人工客服供应商接入,以及本仓库中与本批次无关的 Playwright 产物和 `output/`。不把当前工作树的其他改动带入发布包。
## 2. 精确文件清单
### 前端仓库 `D:\WorkSpace\cyun\ai融资`
| 文件 | 作用 |
| --- | --- |
| `packages/account/login/login.uvue` | 反馈目标登录白名单和登录后回跳 |
| `packages/account/messages/messages.uvue` | 分类消息、已读和反馈目标入口 |
| `packages/content/help/help.uvue` | 反馈列表、详情读取、原键确认和回复展示 |
| `packages/content/services/feedback.uts` | `requestId` 回执、待确认持久化和反馈接口解析 |
| `services/cache-lifecycle.uts` | 账户切换、401 和退出时的缓存生命周期 |
| `services/messages.uts` | 消息分页、详情目标和反馈白名单路由 |
### 后端仓库 `D:\AAdesk\202609\airz`
| 文件 | 作用 |
| --- | --- |
| `application/admin/controller/Feedback.php` | 后台反馈表单的 CSRF、版本和安全投影 |
| `application/admin/library/FeedbackEditor.php` | 并发保护、权限复核、反馈/审计/通知事务 |
| `application/admin/model/AdminLog.php` | 安全审计字段及白名单日志投影 |
| `application/admin/view/feedback/edit.html` | 版本快照、CSRF 字段和冲突表单 |
| `application/common/library/FeedbackRecords.php` | 会员反馈 `requestId` 回执和本人读取 |
| `application/common/library/UserMessages.php` | 反馈回复通知及反馈目标归属校验 |
| `public/assets/js/backend/feedback.js` | 后台冲突提示、草稿保留和重试交互 |
迁移脚本 `database/migrate_feedback.php` 与 `database/migrate_user_messages.php` 仅用于目标结构预检或另行授权的增量迁移,不因出现在仓库中而自动随代码发布执行。
## 3. 数据库预检与迁移前置
发布前在明确的目标环境执行只读预检,命令中的 `.env`、主机、端口和库名必须由本轮维护记录明确填写;不从本机默认 `.env` 推断目标,也不把正式凭据写入本文。
```sh
php database/migrate_feedback.php \
--env <explicit-env> --target <host:port/database>
php database/migrate_user_messages.php \
--env <explicit-env> --target <host:port/database>
```
`fa_feedback` 需要确认 `request_id`、`reply`、`handled_by`、`handled_at` 四列,以及唯一索引 `uk_user_feedback_request(user_id,request_id)`;历史 `request_id IS NULL` 必须保留。`fa_user_message` 需要确认 `uk_user_message_event(user_id,business_type,business_id)`,并确认没有重复事件组。两项预检还应记录 MySQL 版本、InnoDB/字符集、重复组数量、当前行数和活动任务状态。
若字段或索引缺失:先阻断写入、停空闲 worker、确认无 processing/pending/streaming 任务,完成完整表结构和数据备份,再单独取得迁移授权。迁移只能使用脚本的显式 `--apply --backup-dir`,迁移后重跑预检并确认 `changeCount=0`;本轮准备工作不执行 `--apply`,也不自动修复重复键、错误索引或结构漂移。
## 4. 推荐发布顺序
1. 维护窗口开始后阻断后台写入,核对 `airz-analysis`、PHP-FPM、Redis/队列和错误日志;记录进程状态、队列计数、数据库目标和备份位置。
2. 完成上节两个只读预检。缺字段/索引时暂停代码发布,按授权单独迁移并复检。
3. 备份本批后端旧文件、`fa_feedback`/`fa_user_message` 结构和必要行摘要;保存新文件 SHA-256。备份不能替代迁移脚本的结构核对。
4. 先发布后端精确清单,刷新 PHP-FPM/OPcache,确认旧接口仍能鉴权和读取,随后验证新的反馈回执及消息接口。
5. 做后端冒烟:新反馈返回相同 `requestId`;同键重放返回原记录当前状态;旧后台页面缺 CSRF/版本时拒绝保存;版本冲突不覆盖草稿;有效回复只产生一条本人通知;重复保存、修订和后续关闭不重复通知;消息目标只能打开本人的反馈。
6. 后端冒烟通过后,重新编译前端并更新 H5/小程序体验版本。前端发行必须包含本清单的全部六个文件,不能只更新消息页或帮助页。
7. 做前端冒烟:消息分类分页、已读水位、通知跳转、第一页之外反馈读取、登录回跳、账户切换、退出/401、迟到响应、原键确认和反馈列表局部重试;再检查控制台错误、页面横溢和关键截图。
8. 恢复 worker 与入口,观察队列、PHP-FPM、通知错误和 `FEEDBACK_*`/`MESSAGE_*` 业务码;维护窗口结束后记录实际版本、证据和剩余风险。
## 5. 兼容性矩阵
| 后端 | 前端 | 结果 |
| --- | --- | --- |
| 旧0.55 | 旧前端 | 既有流程保持;不含本批新能力 |
| 旧0.55 | 新0.58/0.59前端 | 新反馈成功可能已入库但缺 `requestId` 回执,页面会持续待确认;禁止发行 |
| 新0.57—0.59 | 旧前端 | 旧会员请求没有 `requestId`,新接口会拒绝;旧后台页面缺 CSRF/`expectedVersion` 不能继续保存 |
| 新后端 | 新前端完整批次 | 目标组合;仍需完成迁移预检、后端冒烟和前端发行检查 |
| 新后端仅后台文件 | 新会员前端缺消息/反馈文件 | 回复通知可以落库,但用户不能可靠跳转或确认;禁止拆开发行 |
数据库结构未确认前,不把“源码无新增 DDL”当作线上已兼容。反馈四列和消息唯一索引是本批接口行为的前置条件。
## 6. 回滚边界
代码故障时先阻断写入并恢复本批前的后端文件,刷新 PHP-FPM/OPcache,再按旧前端版本回退 H5/小程序;保留新增反馈、回复、审计和通知行,避免用户已看到的业务结果消失。回退后仍需检查旧接口不会误读新目标字段。
不得整表覆盖 `fa_feedback` 或 `fa_user_message`,不得用旧备份覆盖发布后的新写入,不得因为代码回退而删除通知、已读时间或反馈处理记录。新增字段和唯一索引默认保留;只有单独审查迁移备份、确认旧代码和数据均不再依赖后,才可讨论 DDL 回退,本文不默认执行 `DROP INDEX` 或删列。
前端发行回退不等于数据库回退。回退记录必须包含实际代码版本、前端版本、迁移状态、备份位置、已保留业务数据和复验结果。
## 7. 当前状态
2026-10-05 已在维护窗口内通过宝塔 Playwright 完成明确生产目标 `111.230.144.231:3306/airz` 的迁移与后端发布。完整私密备份为 `/root/airz-feedback-release-20261005-114514`;`fa_feedback` 四列及唯一索引已补齐,`fa_user_message` 唯一索引保持存在,迁移后预检为 `missingFields=[]`、`indexExists=true`、`duplicateGroups=0`、`changeCount=0`。迁移行摘要备份为 `/root/airz-feedback-release-20261005-114514/migration/feedback-20261005-115239-3e7a68c4.json`。
已按精确清单发布 7 个后端文件,发布包 SHA-256 为 `597A2BC55D8877FCA5EFC205C1B0761D14B0B1E614196DD7C1C1FF7B8775D4B3`;线上文件哈希与发布包一致,PHP 7.4 lint 通过,权限为 `644 root:root`。`php-fpm-74`、`redis`、`airz-analysis` 已恢复 active,Redis 认证后分析队列为0,worker 发布后无 warning/error 日志。
只读烟测通过:`/api/v1/home=200`;匿名 `/api/v1/messages`、`/api/v1/products`、`/api/v1/points` 均为401;后台反馈入口返回登录页;`/.env=404`。未创建真实反馈或回复;临时发布包、迁移脚本、临时 env、解压目录和烟测响应已清理。小程序端由用户自行发行,本轮未提交、未推送、未创建 PR。代码回滚保留迁移后的字段、反馈、回复、审计和通知数据,禁止整表恢复。