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

44 lines
7.9 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项、29页面、63任务保持;产品机构库、已回撤产品AI、短信默认关闭均保持。两仓既有未提交短信/协议改动保留,仅在协议读取控制器追加本人资料引用,无提交、推送、PR、生产连接、迁移、发布或真实短信/模型请求。
## 实现与边界
后端 `PrivateDocuments` 和 `v1/Documents` 提供三个接口:multipart `POST /api/v1/documents`(file、category、consentId)、Bearer `GET /api/v1/documents/:id/content`、JSON `{}` `POST /api/v1/documents/:id/delete`。返回附件ID字符串,不返回文件路径或公开地址。类别沿用身份证正反面、银行卡、收入证明、营业执照、银行流水、经营证明。
照片仅接收真实JPG/PNG,原图和处理后文件均不超过5MiB,长宽不超过4096、总像素不超过400万。沿用头像的图片解码及PNG重编码方法,去除用户文件名、元数据和尾随内容,再用已有Secret/AES-GCM密钥加密保存。`fa_private_document` 记录归属、随机storage_key、类别、格式/大小、同意ID及创建/删除时间,不进入公开attachment表。单表SQL同步到schema,仅安装于本轮合成隔离库。
存储配置 `private_documents.enabled=false`、`directory=''`。需操作者明确提供已存在且位于Web目录外的本地目录;目录不能与Web根重叠,也不能是Web根的祖先。未配置时拒绝,运行代码不创建正式目录。私有文件0600,正式目录ACL、备份、密钥托管及恢复方式仍需运营确认;本轮不拟定生产保留期限。
上传在用户锁内复核Token及本人未撤销的documents同意记录,与同意撤销使用相同锁顺序;撤销后禁止新上传,本人仍可读/删已有资料。明确的保存失败清理本次文件;提交回执未知保留加密文件并报DOCUMENT_SAVE_UNKNOWN,用户手动重试可能产生另一份照片,不自动重发。删除先提交不可读标记,再移除文件;只有确认文件不存在才报成功,失败保留同ID供重试。无云层、命令账本、租约、复杂状态机或清理worker。
小程序复用原资料卡片。复用现有协议服务取得服务端同意记录;未确认不得选图上传。保存失败显示“未上传·重试”,删除失败显示“删除未完成·重试”;上传成功后直接在原上传卡片显示所选照片缩略图,查看/删除从卡片菜单操作;同类多张先选择照片再管理,不在下方新增独立列表。重新进入资料步骤时按类别携带Bearer下载恢复缩略图,预览重新携带Bearer下载,不在URL中携带Token、不存相册。页面及会话守卫拒绝退出、换账户和离页后的迟到回包,清空临时路径引用,原生端尽力删除下载临时文件。查看协议时保留当前自填表单与服务端ID;文件路径不传给确认流程。
资料仍选填,照片单独保存、未核验、暂不参与评估,不做OCR、自动核验或外部查询。确认页明示边界;已取得合法服务端ID的照片不再触发旧“上传未开放”拒绝,但未上传/删除未完成的选择须先处理。评估JSON仍发送空documents/consentIds,只提交自填信息;服务端继续拒绝任何非空评估附件或授权。外部查询选择继续拒绝,不把本机路径当附件ID。
三个业务接口保持。复用现有GET /consents?scope=documents返回独立documents字段:按当前登录user_id读取全部资料ID/类别/consentId/deletePending,不暴露路径,不受同意分页、版本或撤销状态限制。已物理删除的ID不再显示,删除未完成且文件仍存在的ID可恢复重试。未启用时返回空引用,不查询未安装的资料表。普通离页、提交成功、刷新后重新进入均从服务端恢复,不把私密图片路径持久保存。同类全部ID可通过原卡片逐份管理,未上传项优先处理,未知回执后重新读取不会遮住本地重试/移除入口。未知保存回执若已提交入表可恢复ID;未入表的孤立加密文件仍需正式启用前明确运营处理方式,本轮不增加清理worker。
## 验证证据
本轮新建专属MySQL/Redis/ROOT/存储环境:`D:/AAdesk/202609/airz-backups/private-documents/1791787367342`。默认生产.env未读取,独立ENV_PREFIX与全新合成空库,Token/队列使用独立Redis DB15和命名空间;模型客户端被类替身拦截,短信关闭。只读取旧隔离工具的实现参考,没有复跑已清理协议runner。
| 验证 | 最终结果 |
| --- | --- |
| 私有照片真实HTTP/SQL/文件专项 | 168项、44次本机HTTP通过 |
| 公开头像回归 | 268项、76次本机HTTP通过 |
| 原有协议后端回归 | 351项、86次本机HTTP通过 |
| UTS服务/页面/评估边界 | 26组场景通过 |
| 既有协议纯源码 / 微信分包 | 30项 / 31项通过 |
| Android / 微信 | 当前29页编译通过;日志android.log / mp.log |
| 受控H5 | 58项、39合成API、12POST,0运行错误、0未知外呼 |
上传专项覆盖PNG/JPG、重编码/加密、非法图片/GIF、原大小/长宽/像素超限、缺少文件、未登录/跨用户、撤销同意、篡改密文、SQL插入失败与文件清理、物理删除失败后不可读与同ID重试、公开目录拒绝、评估附件拒绝和撤销Token。前端覆盖回执校验、Bearer下载、原会话401不得清除新账户、失败重试、离页/退出/换账户迟到响应、删除回执确认、协议往返保留表单、照片不进入评估JSON。
页面副本:`C:/Users/JUN/AppData/Local/Temp/airz-private-documents-ui-1791787367342`,仅副本配置改为synthetic.invalid;新建5181预览,导航前拦截全部网络,业务响应仅在进程内合成,原5174服务保持。Browser插件未提供,使用已有Playwright及非持久Chromium,无新增依赖。390×844和1280×900截图核对无横向裁切;三条console 503来自故意模拟一次上传关闭和两次删除失败,0未解释的业务错误。H5共享layout已有类型警告保持,不等同真机下载/临时文件清理验收。
Android最终编译15:57:08、微信15:58:32(2026-10-12,Asia/Shanghai)。独立审查先后发现离页丢失ID和恢复后遮住同类待上传项,均先复现红测试后修复;新增卡片缩略图/多份管理/迟到清理场景通过;自动缩略图不得删除手动预览的临时文件,同类多张菜单分组以满足微信六项限制。开发途中缺少接口红测试、缺少文件的错误处理、Android局部前向声明及匿名函数默认参数问题已定位修正;测试首次清理触发框架无条件删除保护、独立H5环境标记及页面选择器问题也已修正。失败或重复运行不累计。`source-manifest.json`仅绑定本次相关运行文件和测试入口,不是整仓或发行包摘要。最终verification与cleanup回执由本轮归档记录:29张合成表零行、Redis零键、私有目录零文件后删除精确合成库并停止所属MySQL/Redis;最后58项H5通过后关闭非持久浏览器及5181的所属进程和子进程。重启预览冷编译阶段曾加载超时并触发取DOM错误,已补全finally关闭保护,待编译完成后最终复验通过;失败或重复运行不累计。归档含合成私密配置,不整包共享。
## 正式启用条件
正式资料用途、协议正文/版本、保存期限、撤销后处理、实际私有目录及ACL、容量/备份/密钥恢复、孤立文件运营处理方式,以及微信/Android真机选择/下载/临时文件清理仍待确认。FILE-001保持阻塞;FILE-002/004仅内部开发完成,正式验收未完成;FILE-003原内部协议实现状态保持。附件绑定评估另做最小集成,不将上传成功或本轮编译当作已核验、已进入分析或正式上线。