Files
airz-uniapp/docs/协议全文与同意记录开发-20261012.md
hujun c95482a0f3 feat: 实现协议全文与同意记录功能
新增协议全文后台管理、版本化发布及本人同意记录功能,支持可撤销授权;完善资料与授权相关边界提示,调整评估提交时的资料与授权校验逻辑,同步更新相关页面文案与路由。
2026-10-14 14:53:13 +08:00

58 lines
8.7 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-12,用户已授权实现协议全文、后台正文和版本管理、本人同意记录及可选撤销。正式正文尚未提供,本轮不编造或发布正式协议。代码尚未部署;短信仍默认关闭。融资评估28项填写内容、私有资料上传、外部查询及同事维护的产品机构库不在本轮范围,产品AI条件分析回撤保持。
## 实现
| 协议code | 用途scope | 可撤销 |
| --- | --- | --- |
| terms | account-terms | 否,保留账户使用确认 |
| privacy | account-privacy | 否,保留隐私政策确认 |
| document-use | documents | 是 |
| data-authorization | data | 是 |
后台新增独立“协议正文与审核发布”入口。草稿仍保存在fa_acticle,正文为纯文本,换行统一LF;正式发布须明确勾选已审核。fa_agreement_revision保存标题、精确正文、SHA-256、scope和UTC时间,(code,version)唯一;已发布版本修订必须使用新版本号。旧HTML协议不会自动成为正式版本,旧Acticle入口不能修改或删除结构化协议。
未来生效版本可审核发布,但尚未生效时不进入当前版。最新有效版被下架或删除来源后不回退旧版;指定历史版本仍返回冻结原文。提前发布未来版本应新建来源,保留仍有效的旧来源。公开读取在InnoDB REPEATABLE READ下用同一读事务;同意与发布采用一致的版本/来源锁顺序。
fa_user_consent保存grant记录及撤销命令,同意和撤销共享(user_id,request_id)唯一空间。每个受理撤销键追加revoke命令并指向原grant,历史列表只展示grant;重复撤销保持首次时间。新同意必须匹配当前版,旧键同内容可以补确认,不受后续版本更新、下架或撤销影响;异内容或异操作返回409。本人会话在事务和账户行锁内再次核对,跨账户不可查看或撤销。
小程序新增主包协议全文页及账户分包“隐私与授权”记录页,共29页面,63业务任务编号保持。支持加载失败重试、历史版本、可选授权确认及撤销。登录勾选绑定所见terms/privacy版本和摘要,认证后保存两项确认,确认成功才跳转;记录未知时使用原键手动补确认,无需再次验证密码或发送短信。只有明确404/AGREEMENT_NOT_AVAILABLE才允许现有账户密码登录且不生成同意证据;网络或503失败不能当未发布。后端登录契约保持,本轮不启强制同意策略。
待确认键仅在同会话页面内保存;离页返回保留,页面卸载、完整刷新或进程重启不提供持久恢复,不缓存协议正文或新增Token副本。本地同意不等同已上传资料、征信查询或第三方授权。资料步骤原有选填方式和融资输入保持。
## 接口与安装文件
API前缀为/api/v1,JSON请求,记录接口须已有Bearer会话;ID为十进制字符串,时间为UTC ISO秒格式。
| 方法/路径 | 请求 | 行为 |
| --- | --- | --- |
| GET /agreements/:code | 可选version | 当前或指定历史全文,公开可读 |
| GET /consents | 可选scope、page、pageSize | 仅本人grant,page≤1000,pageSize≤50 |
| POST /consents | scope、agreementCode、agreementVersion、requestId | 所见版本确认;requestId为16–64位ASCII字母数字、下划线或横线 |
| POST /consents/:id/revoke | requestId | 仅本人documents/data;共享幂等空间,首次撤销时间不变 |
后端在D:/AAdesk/202609/airz。database/agreement-revision-schema.sql和user-consent-schema.sql仅新增两表,database/schema.sql同步期望结构;本轮只在所属全新隔离库安装,生产未执行。离线权限定义新增五节点及独立运营v2;旧运营v1、客服v2、技术v5和已有账号绑定保持,未迁移正式权限。正式安装与角色分配须使用目标环境的新预检及明确发布授权。
后续发布应先配套部署后端协议接口与两表,再发行依赖这些接口的小程序;缺失接口的普通404不等于明确AGREEMENT_NOT_AVAILABLE,不会触发“未发布”密码登录兼容。运营v2是新模板,已有运营账号不会自动获得权限。发布或回退计划须核对当时真实状态和新增同意数据,不使用整库覆盖。
## 验证与边界
后端最终六套隔离入口:协议351项/86HTTP、后台500/94、会话284/70、资料268/76、短信账户271/54、内容服务56/0,共1730项/380次本机HTTP。协议纯校验40项与离线权限106项另列;失败、中途重复及前轮短信71项不累计。
覆盖精确历史正文、审核/不可变版本、未来/下架、后台角色与撤权、CSRF及旧入口绕过、分页/跨账户、原键补确认、两worker重复请求只一次、SQL故障回滚和会话失效。公开读取与同源发布交错的误404已先复现红测试,再修为同一读快照;验证当次旧版、下一次新版及旧历史保持。后台首轮夹具未关闭合成登录图片验证码,修正仅测试wrapper配置后通过;纯协议首轮输出为JSON被runner误判,精确匹配输出格式后通过,保留原回执。
前端最终结果与复审收口见本轮私密verification.json。受控H5使用导航前全网络拦截,响应只在进程内合成,Browser插件未提供,使用既有Playwright;手机390×844与桌面1280×900。故意注入的404/503/丢回执console与真实运行错误分开记录,合成HTML文字仅测试前端按文本显示,并不代表后台接受HTML正文。
独立审查发现并已通过红绿测试修正:撤销成功后废弃在途列表,防止刷新/筛选/分页的旧GET恢复未撤销状态;同意丢回执后在记录页被撤销,返回全文页的原键可确认“此前已撤销”,清除待确认命令,只有再次明确点击才用新键同意。正常同意成功后去记录页撤销再返回,也恢复显式同意按钮,不自动发送新同意;未知结果仍保留原键。返回记录页时保留离场渲染树,仅使请求代次失效及停止计时,避免退栈过渡时清空记录导致VDOM挂载错误;返回/账户变化仍清理并重新读取,迟到响应不能回填。最终独立只读复审未发现剩余明确P1/P2。
初轮H5完整78项/37合成请求/8POST覆盖全文、历史、记录、登录补确认、404与503区分和账户隔离;该轮是复审修正前源码,不作为最终源码全量验证。最终复审后H5专项48项/25合成请求/9POST覆盖刷新/筛选/分页旧响应、真实返回、已撤销原键收口、正常成功后撤销再返回及显式新同意,0运行错误、1条故意丢回执console、0未知外呼。中间41项及编译回执单独保留,不计入最终数。30项纯源码检查通过,分包及编译分别记录,不跨轮累计。
最终修正后的29页Android class编译于2026-10-12 12:21:51成功,微信小程序编译于12:22:35成功(Asia/Shanghai),日志为android-final-return.log/mp-final-return.log。30项协议源码检查与31项微信产物分包检查均通过,主控已独立复核。最终源码绑定source-manifest.final-return.json、48项页面回执review-final-verification.json与收尾回执final-return-receipt.json,旧12:16编译回执不替代本轮结果。所属H5预览已停止、5176释放,临时浏览器退出,原5174保留;这里只验证开发编译及受控页面,不等同真机或正式发行验收。
后端证据:D:/AAdesk/202609/airz-backups/agreement-consents/1791775959310。前端证据:C:/Users/JUN/AppData/Local/Temp/airz-agreements-ui-20261012及后续专项回执。源码摘要限定本轮相关文件,不是整仓候选或发行包。归档包含私密配置与诊断,不整包分享。
后端清理前28合成表零行、原26表结构及8触发器保持、Redis DB15零键;本轮精确库删除,所属两个服务退出,52786/52787释放,原Python字节码及27份工作树备份保持。692份退出屏蔽回执真实模型/Provider/生产.env加载为0。清理最后归属检查曾失败,但未改脚本的后续只读复核通过,确认精确库目录不存在、所属进程退出与私密ACL正确;原详细stderr未保存,不能确定具体失败点。原检查存在关闭监听后立即核PID的时间窗口,私密检查器仅补同归属进程的15秒退出等待,并保存修改前脚本与摘要。未重跑DROP/服务关闭或启动新服务,cleanup回执已补齐。
FILE-003内部协议与本地记录功能已实现,正式全文、资料用途/保存期限/撤销后资料处理、外部授权凭据、目标端真机及正式运营验收仍待。FILE-001/002/004与真实渠道依各自条件推进;不预填63正式用例通过,不恢复产品AI或自动推进上传/外部查询。