feat: 增加反馈消息闭环相关功能及文件
新增反馈目标登录白名单、账户切换守卫、待确认反馈存储、缓存生命周期管理,补充相关文档及截图,完善消息跳转逻辑
This commit is contained in:
+26
-4
@@ -1,6 +1,28 @@
|
||||
# AI 融资平台开发文档
|
||||
|
||||
> 版本:v1.43 · 基线日期:2026-09-22 · 更新日期:2026-10-02 · 状态:积分后端已随5fee3cf部署,默认关闭、DEC-POINT待确认;原表未迁移,积分页面真实读取、异常恢复及隔离联调完成,前端未重新发行。以下后台和内容模块的历史部署状态以新会话交接及后端deployment-baota.md最新发布记录为准。微信/Android编译通过,小程序需重新发行,H5未部署、真机及多设备待验收。最新资料/评估版本及会话精简约定保留。
|
||||
> 版本:v1.46 · 基线日期:2026-09-22 · 更新日期:2026-10-05 · 状态:用户确认此前小程序端已发布,版本号/渠道未提供;后端已于10月4日发布,最新记录见交接及后端deployment-baota.md。反馈回复通知、会员反馈原键恢复及后台反馈处理增强为新增源码,尚未配套发布;新前端依赖后端requestId回执,反馈目标需配套更新前端。0.57—0.59的配套文件、顺序、兼容性和回滚准备见[反馈与消息发布清单](./反馈消息发布清单.md),当前未部署/发行。积分默认关闭、DEC-POINT待确认、原表未迁移;H5未部署、真机及多设备待验收。最新资料/评估版本及会话精简约定保留。
|
||||
|
||||
### 0.59 2026-10-04 反馈回复与站内消息契约
|
||||
|
||||
后台处理时 `resolved/closed` 非空回复为有效通知事件,复用 `fa_user_message`:`type=2,business_type=feedback_replied,business_id=feedback_id`。既有 `(user_id,business_type,business_id)` 唯一索引原子去重,每条反馈首次有效回复通知一次;相同保存、修订回复及后续状态变化不增通知、不重置已读,点击后查看当前回复。处理中、空回复、匿名或已删除会员跳过,不自动补发未修改的历史反馈。通知正文仅提示查看,不包含原文或回复。`FeedbackEditor` 将回复、审计及通知写入同一事务,通知错误返回503 `FEEDBACK_NOTIFICATION_UNAVAILABLE` 并回滚全部变更;审计失败同样回滚。
|
||||
|
||||
本人消息详情增加 `target:{kind:feedback,feedbackId:string}`;反馈必须仍存在并属于同一鉴权会员,否则 `target:null,targetUnavailable:true`。旧评估目标契约不变。前端只构造 `/packages/content/help/help?feedback=1&feedbackId=<正INT编号>`,详情通过已有本人接口单独读取并核对响应ID,不依赖列表首页。帮助页局部错误可重试;退出/换账户清理已显示回复和旧目标,离页拒绝迟到回包。登录白名单只保留合法反馈编号,重新鉴权后再次校验归属。消息旧列表点击、全部已读和弹窗确认均先核对页面所属Token。
|
||||
|
||||
无需DDL或新路由。部署时配套更新后台处理服务、`UserMessages.php` 和消息/反馈/登录前端,旧前端不能解析新增目标;本轮未发布或正式验收。后端142项、页面48项隔离检查及27页面Android/微信编译通过,环境/证据/私密文件保留情况见台账0.59。
|
||||
|
||||
### 0.58 2026-10-04 会员反馈未知提交恢复契约
|
||||
|
||||
发送前用当前鉴权会员ID生成 `airz:v1:user:<userId>:content.feedback.pending`,只保存并回读 `{requestId:string, content:string}`,内容为用户本次确认发送的去首尾空白原文。普通编辑草稿不持久化,待确认记录不含Token、反馈列表或回复。已有未知命令优先恢复,锁定原内容并保留原键;刷新/离页/进程重启不自动发送,须点击“确认上次提交”,列表不可读也不阻止确认。退出/401/会话切换的缓存清理保留该例外,原会员重新鉴权前不能恢复到页面或发送,另一会员不能接管。
|
||||
|
||||
后端 `Feedback` DTO新增 `requestId:string|null`,历史NULL保持;新提交与原键重放返回相同请求键,重放返回该记录最新处理状态,不重置正文/状态/时间。前端POST回执先核对原键再严格解析,之后比较本机待确认命令才删除;清理失败继续原键确认。确定的400/413/422且业务码为 `VALIDATION_ERROR` 或 `FEEDBACK_ATTACHMENTS_UNAVAILABLE` 才弃键并保留可编辑原文,网络/401/服务不可用/409/坏回执继续保留。页面以账户、Token及代次阻止迟到结果回填,存储异常或坏记录阻止新提交并提供“重新读取提交状态”,不得按空记录覆盖。H5读取空值须结合键是否存在判定,删除成功按键不存在核验。
|
||||
|
||||
新前端须在后端回执支持 `requestId` 后或与其配套发行,否则旧后端已入库但前端不能核对成功。此次复用既有请求键列和唯一索引,无新增DDL;本轮未部署/发行、未正式验收。后端67项、页面93项隔离检查、Android/微信编译与环境清理状态见台账0.58及交接最新节。下一开发项为反馈回复与消息通知联动。
|
||||
|
||||
### 0.57 2026-10-04 反馈处理并发保护与事务审计
|
||||
|
||||
后台 `feedback/edit` GET 生成 CSRF 和处理快照 `row[expectedVersion]`,POST业务字段恰好为 `row[status/reply/expectedVersion]`。SHA-256版本包含原文、状态、回复、处理归属和原始时间,不能用秒级时间单独判定冲突;在反馈行锁内核验,旧页面以 `FEEDBACK_VERSION_CONFLICT` 拒绝,当前输入保留,须重新打开核对后提交。
|
||||
|
||||
`FeedbackEditor` 在事务内锁定并复核管理员、有效角色及 `feedback/edit` 权限,复用 `FeedbackRecords::handle` 保存。成功审计与反馈同事务,`FEEDBACK_AUDIT_UNAVAILABLE` 表示此次修改未保存;同状态同回复保持处理元数据并不写重复成功审计。成功/拒绝及历史读取均投影安全白名单,回复、原文、CSRF和未知字段省略,不新增表或权限节点。页面/控制器/服务/管理员日志及反馈JS需配套发布,JS将版本冲突持续显示在表单内并保留输入;新控制器拒绝缺版本/CSRF的旧后台表单,小程序会员反馈接口保持原契约。隔离检查结果见台账0.57,不视为正式验收。
|
||||
|
||||
### 0.51 2026-10-02 积分页面恢复与隔离联调
|
||||
|
||||
@@ -134,7 +156,7 @@ FAQ复用`fa_acticle`的`type=6`,正文保存为`schemaVersion=1`、`kind=faq`
|
||||
|
||||
会员反馈接口为`POST/GET /api/v1/feedback`与`GET /api/v1/feedback/:id`,鉴权会员ID来自Bearer会话。提交体只接受`content`、`attachmentIds`、`requestId`;内容去HTML、保留换行、最多255字,`requestId`为8—64位ASCII安全字符。同用户同请求键同正文幂等返回记录,不同正文返回409;当前附件服务未开放,`attachmentIds`必须为空数组。
|
||||
|
||||
返回项为`id/content/attachmentIds/status/reply/createdAt/updatedAt/handledAt`,状态包括`pending`、`processing`、`resolved`、`closed`。列表只读取当前会员,`page/pageSize`默认20、上限50;详情严格校验归属。后台反馈编辑白名单仅为`status/reply`,状态进入处理中或完成状态自动记录`handled_by/handled_at`,回到待处理则清空;新增、删除、批量更新和导入均拒绝。
|
||||
返回项为`id/requestId/content/attachmentIds/status/reply/createdAt/updatedAt/handledAt`,其中requestId为0.58新增回执字段,历史记录为null;状态包括`pending`、`processing`、`resolved`、`closed`。列表只读取当前会员,`page/pageSize`默认20、上限50;详情严格校验归属。后台反馈编辑白名单仅为`status/reply`,状态进入处理中或完成状态自动记录`handled_by/handled_at`,回到待处理则清空;新增、删除、批量更新和导入均拒绝,版本及CSRF要求见0.57。
|
||||
|
||||
`fa_feedback`迁移由`database/migrate_feedback.php`执行,新增请求键、回复和处理元数据列及唯一索引,历史NULL请求键保留。脚本默认只预检,必须显式`--env`、`--target`,写入还需`--apply --backup-dir`;本轮只在隔离库应用并有完整备份,未执行正式迁移或部署。帮助页的意见反馈使用空附件数组、失败重试复用请求键,并展示本人的处理状态和回复。
|
||||
|
||||
@@ -987,7 +1009,7 @@ REPORT-004页面子项完成本地联调:report/report改为评估概况、匹
|
||||
| Article/Lesson | id、title、summary、imageUrl、category、publishedAt、version;课程chapters包含稳定chapterId、title、body |
|
||||
| Message | id、type:system/service/activity、title、content、isRead、readAt、createdAt;详情另含target:{kind:report/revision,assessmentId,revisionId,type:personal/enterprise}或null、targetUnavailable |
|
||||
| PointsLedger | id、delta:int、before:int、after:int、businessType、businessId、memo、createdAt |
|
||||
| Feedback | id、content、attachmentIds、status、reply、createdAt、handledAt;用户端不暴露无关管理信息 |
|
||||
| Feedback | id、requestId:string或null(历史记录)、content、attachmentIds、status、reply、createdAt、updatedAt、handledAt;POST回执核对原请求键,用户端不暴露无关管理信息 |
|
||||
|
||||
数据库JSON采用已有snake_case字段时,由DTO统一转换为camelCase;文档中的API对象不是直接暴露数据库行。当前match_result结构使用product_id/rank/score/reasons/product_snapshot;计划v2补eligibility、positive_reasons/blocking_reasons/cautions及evidence等字段,具体映射见专项契约第5.3节,不沿用单一reasons表达所有类型的解释。
|
||||
|
||||
@@ -1093,7 +1115,7 @@ REPORT-004页面子项完成本地联调:report/report改为评估概况、匹
|
||||
| GET /points/tasks | 登录 | 无 | serverDate、timezone、items:{task,status,reward,ruleVersion}[] | 源码已实现未部署;draft签到及资料/邀请均unavailable、奖励为null,不能客户端自报完成 |
|
||||
| GET /invitations | 登录 | 无 | personalCode、shareUrl、统计摘要 | 后续POINT-003草案,当前无个人真实码 |
|
||||
| POST /invitations/bind | 登录 | inviteCode、requestId | bindStatus | 后续POINT-003草案;首次有效绑定/禁止自邀,绑定不直接发奖 |
|
||||
| POST /feedback | 登录 | content、attachmentIds、requestId | Feedback | 非空且当前表内容最长255字符;附件归属;幂等 |
|
||||
| POST /feedback | 登录 | content、attachmentIds:[]、requestId | Feedback(含原requestId) | 非空且最长255字符;同会员同键同规范化正文返回原记录当前状态,异正文409;前端回执核对原键,未知结果沿原键确认,见0.58 |
|
||||
| GET /feedback | 登录 | page/pageSize | Feedback分页 | 只本人 |
|
||||
| GET /feedback/:id | 所有者 | 无 | Feedback | 处理回复可读 |
|
||||
| POST /support/session | 登录 | scene、returnPath可选 | 客服渠道、短期会话配置、online/offline状态 | 服务端身份签名;不下发供应商私钥;会话复用策略按供应商核验 |
|
||||
|
||||
Reference in New Issue
Block a user