feat: 实现协议全文与同意记录功能

新增协议全文后台管理、版本化发布及本人同意记录功能,支持可撤销授权;完善资料与授权相关边界提示,调整评估提交时的资料与授权校验逻辑,同步更新相关页面文案与路由。
This commit is contained in:
hujun
2026-10-14 14:53:13 +08:00
parent b418969e92
commit c95482a0f3
58 changed files with 3269 additions and 146 deletions
@@ -0,0 +1,12 @@
# 短信账户功能实施计划
依据:[已授权范围与设计](../specs/2026-10-12-account-sms-design.md)。本轮在现有两仓库定向修改,不创建提交/推送/生产发布;同事产品模块不改动。用户已明确先写代码,无需再次选择执行方式。
- [x] 验证码引擎:新增SmsVerification及供应商接口/默认不可用实现和sms_verification配置;先执行缺功能红测试,再验证真实隔离Redis中的发送、限流、摘要及原子单/双码核销。
- [x] 账户接入:新增AccountSms,将Session的短信登录/发送/验证码改密接入,并增加安全发送和手机号换绑路由。复用Auth的注册/直接登录/改密与Token撤销;不迁移表。
- [x] 隔离验证:新建私密ROOT/MySQL/Redis/bootstrap,运行验证码及HTTP新测试、原api_session/api_profile回归,核对结构及模型屏蔽,清理仅归属本轮的资源。
- [x] 文档与复审:独立只读代码复审;记录未配置关闭状态、测试结果及供应商接入要求,更新交接/进度;PHP语法与两仓diff检查。
执行记录只保存在本轮私密归档,历史证据不覆盖。测试发送替身不提供线上配置入口或固定验证码。
结果:[开发记录](../../短信账户功能开发-20261012.md)。四套最终测试894项/200次本机HTTP通过,12PHP语法检查及独立只读复审完成,所属隔离环境已清理;真实供应商接入、目标端及正式验收仍待,默认关闭、未部署。
@@ -0,0 +1,17 @@
# 协议全文与同意记录实施计划
> 本轮用户已授权继续前两项,直接在现有会话执行,不创建提交/推送。三个互不覆盖的子任务按dispatching-parallel-agents处理;共享数据库测试由主控顺序执行。
**目标:** 内容后台能够发布不可变协议版本,小程序可读全文,服务端保存本人可追溯的同意与可选撤销记录。
**架构:** fa_acticle继续承载草稿,新增agreement_revision保留正式版本,user_consent保存幂等同意及撤销命令,首次撤销时间保持。公开全文/鉴权同意API与现有登录契约兼容,短信仍关闭,正式正文不编造。技术栈沿用PHP7.4/ThinkPHP5/MySQL5.7/Redis、uni-app x/UTS。
**设计:** [已授权范围](../specs/2026-10-12-agreement-consents-design.md)。不改融资28项输入/产品模块、不接生产/真实短信/模型,不执行生产迁移。
- [x] 协议发布:AgreementRegistry及后台Agreements使用内容CSRF和权限,红测试先证明服务缺失;冻结(code,version)唯一快照、正文修订须新版本,current与发布同顺序锁定,旧入口不能绕过。提供database/agreement-revision-schema.sql,纯校验/发布测试通过。
- [x] 同意服务:先编写tests/agreements.php并在新隔离环境取得红测试;ConsentLedger执行新同意当前版校验、旧键原回执、账户锁/会话重核、双用途撤销及严格字段/分页校验;新增api/v1/Agreements控制器及完整匹配路由,提供database/user-consent-schema.sql并更新期望schema。
- [x] 前端:新增services/agreements.uts、匿名全文页和本人记录页,现有登录/隐私/资料链接接通。所见版本勾选、认证后保存、未知原键手动确认、账户/代次守卫;参数/守卫红绿测试完成,30项纯源码、31项微信分包通过,最终29页Android 12:21:51/微信12:22:35编译成功。初轮78项与最终复审48项受控页面检查分开保留。
- [x] 隔离验证:全新所属MySQL/Redis/ROOT,初始26表到两表定向安装后的28表基线。按顺序执行协议HTTP/事务/权限/历史/并发、原会话/资料/短信账户回归;测试前后核结构/触发器/空表/零键/进程归属/模型屏蔽。
- [x] 收口:独立只读复审关闭全部明确P1/P2,14项PHP语法和两仓diff通过;源码/测试回执、开发说明与交接已更新。最终前端回执final-return-receipt.json绑定10文件摘要及最新两端编译,初轮与复审证据不累计。精确清理本轮数据库/服务及夹具,保留私密证据;清理末端检查失败已通过后续只读复核补证,具体原因未确认。未发布正文/未部署/真实业务未验收明确记录。
每项只改所属文件,已有短信代码、旧候选和历史发布证据保持。前端新增两页面预计总29页,63业务任务编号不扩增;正式协议、资料留存及真实渠道条件不擅自批准。
@@ -0,0 +1,9 @@
# 私有资料上传实施计划
按已批准的[简化方案](../specs/2026-10-12-private-documents-design.md)直接实施,本轮不重新设计、不提交代码。
- [x] 后端:`PrivateDocuments.php`、`v1/Documents.php`、`extra/private_documents.php`、三条路由及单表 SQL。复用 Auth/Token、Secret、documents 同意记录;默认关闭且私有目录留空。先写隔离 HTTP 测试,再实现。
- [x] 前端:新增 `services/documents.uts`,复用现有资料卡片及协议服务,区分本机待上传与服务端 ID;手动重试、本人鉴权下载/删除、会话及离页迟到回包防护;复用同意读取恢复全部本人ID,照片直接显示在原卡片,通过卡片菜单管理,不加下方列表。
- [x] 评估:资料单独保存、暂不绑定或参与分析;确认页明示此边界,仅已取得合法 ID 的资料可以绕过旧“上传未开放”提示,外部授权仍拒绝;服务端继续拒绝非空评估附件。
- [x] 验证:全新本机合成 MySQL/Redis/私有目录;上传、读取、删除、同意及归属、大小/格式、故障重试;纯 UTS 会话/页面测试、Android/微信编译、拦截全部 API 的受控 H5 页面。
- [x] 收尾:核验合成数据及所属服务清理,更新进度、交接及验证记录。用途、期限、正式私有目录、正式协议和真机验收留待启用前确定;生产、短信和模型全程不连接。
@@ -0,0 +1,22 @@
# 协议与照片独立测试环境实施计划
> 按用户“推进第 1 步”授权在当前会话实施;不创建提交、推送、PR或远程部署。
**目标:** 分开当前源码的测试与生产目标,准备最小配套部署清单,并在新建本机合成环境接通协议与照片流程。
**架构:** 前端默认测试地址留空,独立联调副本显式指向本机API。后端测试配置、ROOT、MySQL数据目录、Redis实例、照片目录和密钥全部独立,复用现有隔离工具,不读取仓库`.env`。本机只使用合成账户、协议和图片,模型客户端阻断、短信关闭,不启动worker。
**技术栈:** uni-app x / UTS、ThinkPHP 5 / PHP 7.4、MySQL 5.7、Redis、现有HBuilderX与Playwright。
**依据:** `docs/私有资料上传开发-20261012.md`及已确认的第1步;融资28项、29页面、63任务保持。
## 实施与验收
- [x] 检查两仓状态、当前与父级指令、配置加载及协议/照片/短信依赖,保留既有改动。
- [x] 修改`services/config.uts`:test与production地址留空;本机副本使用development;未知环境也返回空地址。
- [x] 新建后端`.env.test.sample`:独立数据库/Redis/命名空间,模型关闭且指向本机无服务端口,照片默认关闭,密钥和目录空值必须另行配置。
- [x] 在`docs/协议与照片测试部署清单-20261012.md`记录完整前后端配套文件、三个新增表、权限增量、部署顺序、回退和真机条件。
- [x] 在仓库外新建本轮归属环境;不复跑已清理runner。只在该合成空库安装完整schema,正式/已有库只列出三份增量SQL。
- [x] 使用实际本机协议与照片API验证同意、上传、原卡片缩略图、重新进入恢复、撤销后禁止上传及本人删除;记录请求与配置审计。
- [x] 执行针对性的配置/源码检查和`git diff --check`;记录截图及剩余微信真机条件,不把H5视为真机验收。
- [x] 停止本轮所属服务,清理合成库/Token/照片并保存回执;更新README及交接,不改生产状态。
@@ -0,0 +1,16 @@
# 私有照片存储与备份落地计划
用户已授权继续前述服务器存储步骤,并确认在线照片长期保存、备份副本滚动保留7天。主体及删除联系方式暂无,照片保持关闭;不发布占位协议、不增加在线照片到期删除。
使用现有服务器、宝塔维护通道和本机DPAPI。运行工具保存于Web外root-only目录;不安装依赖、不提交/推送,按步骤在本会话执行。
- [x] 重新核对版本、关闭状态、表计数、目录、FPM、路径限制、服务、时区和配置摘要;保存精确恢复材料。
- [x] 创建public同级私有目录(www:www/0700)和备份目录(root:root/0700);仅写入照片directory,enabled保持false。以www及现有open_basedir验证合成文件读写并清理。
- [x] 现有共享AES密钥经临时RSA公钥封装后传回本机,立即转换为DPAPI文件,仅当前用户/SYSTEM访问;明文只在内存,删除临时私钥。备份包不带密钥或.env。
- [x] 准备并验证每日04:20备份:PDO只读一致快照取得三表结构/元数据及对应文件清单,复制不可变密文,缺文件/链接/摘要漂移则失败;只备份已入表的活动照片,不删除在线文件或孤立密文。定向清理超过7天的本工具备份,未知文件拒绝清理。
- [x] 先在合成临时目录验证备份与到期清理边界,再安装Web外root-only工具及独立cron文件,保持现有cron/数据库备份不改。执行一次当前空资料备份,校验归档摘要和从DPAPI恢复密钥的合成GCM解密能力;不恢复生产库。
- [x] 核对服务、配置变更范围、关闭状态、目录权限、cron、备份及密钥恢复回执;宝塔退出关闭,清理临时材料,更新记录。技术验证不计用户功能验收。
完成证据:[落地记录](../../照片存储配置落地-20261013.md)。生产最终核对为10:55:12,回执final-verification-retry.json;本地草案/源码摘要/文档链接/UTF-8及私密ACL核对见D:/AAdesk/202609/airz-backups/private-storage-setup/20261013-01/local-verification.json。照片/短信仍关闭,首份为空资料快照,定时首次触发及实际照片恢复未验收;无异地照片副本,DPAPI换机前需受控迁移。
恢复:仅撤去本轮cron/工具,保留密钥和备份;.env只能在核对本轮after摘要、仍关闭且无新照片后恢复服务器before。已有照片或配置漂移时先保留现场,不覆盖后续数据、不删密钥/整库。空目录仅在确认本轮所有权且仍为空时可移除,禁止递归清理在线目录。
@@ -0,0 +1,10 @@
# 准入条件统一录入
目标:移除独立“地区与用途”,统一经“添加条件”录入;条件名称支持选择或手输入。用户已明确授权本地实施,不增加审批、提交或部署。
实现:地区/用途列表行继续映射现有地区和用途配置,默认不添加空行;已配置内容回显。已知条件名称映射现有规则,自定义名称与文字阈值保存到原other内展示配置的可选manualConditions列表,仅提示待核实,不进入推荐排名。无新增列、融资项或AI功能;保留旧冻结快照。
- [x] 先补纯内存保存/回显、校验、自定义unknown、适用对象及旧快照测试,确认因未实现失败。
- [x] 修改六个已有后端/管理端文件;保护旧规则、对象范围、重复地区/用途及并发保存。
- [x] 专用本机合成库验证实际管理端选择/手输、保存回显、删除、旧规则重建和窄屏;运行相关纯逻辑与16/28列回归。
- [x] 核对源码摘要、停止所属测试进程、记录结果和交接。不得初始化默认.env、访问正式库、迁移或部署。
@@ -0,0 +1,13 @@
# 产品原字段与文本配置实施计划
用户已选择恢复原字段并把匹配配置放入原文本字段,当前会话顺序实施,不委派、不提交、不部署。规格为 `docs/产品表还原与选填核对-20261013.md`,此选择取代其中“等待范围选择”的状态。
目标:16个原字段名恢复,配置和内部版本放在other,保留InnoDB与100字产品名;管理端仅名称/对象必填,其他缺失显示未提供,实际配置的条件仍严格校验。旧快照不重算、原融资28项不扩展。
- [x] 编码与迁移:先写tests/product_storage.php,覆盖旧28字段→16字段→逻辑数据往返、HTML原文、金额精度、版本、损坏JSON及TEXT字节上限,再实现ProductStorage::decode/pack/encode、新表DDL和显式预检/备份/转换工具。转换保留旧表,未授权不操作生产。
- [x] 读写:Product模型按实际物理列适配,保存持事务行锁、版本校验和部分更新合并;目录日期/地区在服务端读取配置筛选,ID游标按实际扫描位置推进;匹配捕获和当前可用性解码新旧记录。对比转换前后的规则与旧结果。
- [x] 选填:ProductPublication保留名称/对象和格式校验,放宽银行/类型/来源、额度/期限/利率、日期/用途;空参数不生成规则,不补默认值。未知地区与仅原文条件保留待核实提示,不能静默宣称已满足;editor支持原额度/期限说明,新建企业对象按原表默认。UTS兼容新旧DTO及单边范围显示。
- [x] 验证:独立本机合成MySQL真实16字段表验证迁移、模型/表单/上下架/游标/匹配/回滚,原28字段库验证过渡兼容;纯回归、PHP/JS语法、微信29页编译与必要页面检查。保留证据,停止本轮专用服务。
- [x] 文档:更新新库schema、迁移说明、交接与实施结果,明确正式库仍为未迁移,发布必须配套后端及小程序。
实施结果:2120项专项检查与微信29页编译通过;所属四服务停止、端口释放,合成库/回撤表和证据保留。正式库未迁移、未部署,完整说明见docs/产品表还原与选填核对-20261013.md及后端database/product-original-migration.md。
@@ -0,0 +1,17 @@
# 产品机构库原型实施计划
> 采用 superpowers:executing-plans 在当前会话顺序执行;用户已授权实施,不创建提交或委派任务。
目标:接通原型的产品规则配置与真实匹配展示。
架构:保留现有Product CRUD、发布校验、冻结目录和UTS数据服务,添加ProductPresentation纯配置/评分/模板服务,现有other列承载版本化扩展配置。兼容旧说明和旧快照,不新增表。
规格:[实施范围](../specs/2026-10-13-product-prototype-design.md)。技术栈:PHP7.4/ThinkPHP/FastAdmin/RequireJS/uni-app x UTS。
- [x] 配置及评分:新增后端tests/product_presentation.php纯测试,覆盖80基础分、正负分、上下限、unknown/verified来源、模板引用和旧文本;实现ProductPresentation::normalize/view/evaluate/render,ProductEditor::_presentation和万元字段转换。
- [x] 管理端:改add/edit为共用八标签form,所有回显htmlentities,object多选与_base_version;改backend/product.js为稳定规则编辑、资料/模板表、发布预检、保存、上下架;列表加银行/产品切换和筛选。
- [x] 匹配:ProductMatchRules扩展原型指标白名单,ProductPublication设企业范围;ProductMatching固定新版本/评分降序,与旧v1冻结快照兼容;MatchRecords和ProductCatalog投影资料清单、Logo、电话;运行既有规则/发布/编辑纯测试及新增冻结回归。
- [x] 小程序:改matches.uts规范化扩展字段和评分,保持归属与快照检查;改product.uvue头部摘要、分数/资料清单、真实顾问拨号与既有办理准备路径;UTS mock API回归。
- [x] 联调:启动独立本机合成数据服务,真实HTTP保存/编辑/上下架检查,浏览器桌面与窄屏核对;HBuilderX编译微信与H5,路由回归。记录结果和尚未提供的真实指标/顾问渠道;更新交接文档,不部署。
执行结果:980项专项检查、微信29页最终编译、PHP/JS语法与相关diff空白检查通过;截图/证据及限制见实施记录。无提交、部署或代理任务。
@@ -0,0 +1,30 @@
# 条件第一列手输与自定义条件 AI 匹配实施计划
**Goal:** 第一列手输、保留其余结构,自定义条件由 AI 判断准入/评分/关联模板结果。
**Architecture:** 保留原16字段和既有配置,other 中新增可选手输软条件与文字模板。标准规则保持;AI 自定义判断并入现有评估调用,服务端合并及写入前复核。旧报告保持。
**Tech Stack:** ThinkPHP 5、PHP 7.4、jQuery/Bootstrap、现有 Playwright/Chrome。
**Spec:** ../specs/2026-10-14-product-custom-ai-design.md
**Constraints:** 保留两仓既有改动;不用默认 .env;无正式写入/发布/真实模型/提交;不新增融资表单字段;不恢复产品原文 AI 整理。
- [x] 撤回本任务误扩大的整页文字化,并将废弃文件存入仓库外归档;既有未提交改动保留。
- [x] `product.js`、`product/form.html`:四个表格第一列纯手输、隐藏内部编号、多选值勾选、关联名称保存/回显;桌面/窄屏验证。
- [x] `ProductPresentation`/`ProductPublication`:自定义硬/软条件和关联文字模板配置校验及兼容。
- [x] `ProductAiConditions`:白名单事实、完整判断校验、三态、身份及引用边界、输入摘要。
- [x] `ProductMatching`、`AssessmentNeedsReport`、`AnalysisTasks`、`Assessment` 接入:冻结、既有调用复用、合并/保存前重算、旧快照兼容。
- [x] 假模型实际隔离任务与读取/历史回归;针对性 PHP/JS 检查、记录证据和清理所属测试进程。
- [x] 更新交接,说明本地完成状态、正式发布范围及未覆盖真实模型行为。
验证证据:D:/AAdesk/202609/airz-backups/product-first-column-20261014。未部署或调用真实模型;清理状态以cleanup.json为准。
## 后续要求:推荐与不推荐统一 `{X}`
- [x] 管理端移除不推荐触发结果,三列表格、旧变量转换及新模板保存回显。
- [x] 新 `ProductAiTemplates` 与评估/匹配/保存链路接入,复用一次模型调用并保留旧冻结语义。
- [x] 多槽顺序、正文适用性、金额单位、资料不足、身份/摘要/事实引用及预算边界验证;实际隔离任务和最终独立审查。新模板纯测试73项、Chrome表单51项、实际假模型任务49项通过。
- [x] 更新验证回执、当前交接及所属隔离服务清理记录。HTTP/MySQL/Redis所属进程已精确停止,62175/62176/62177端口关闭,合成数据与证据保留。
本轮证据:D:/AAdesk/202609/airz-backups/product-template-x-20261014;仅本地实施,未部署或调用真实模型。
@@ -0,0 +1,12 @@
# 正式产品表还原与配套发布计划
用户已明确授权“正式服务器也一起处理并部署”。目标为airz.hqling.cloud、/www/wwwroot/xctai.cn、127.0.0.1:3306/airz,仅转换fa_product及发布产品库配套代码;小程序由用户发行。不提交、不推送、不委派,不调用真实模型或导入合成业务。
- [x] 固定产品库运行文件和依赖摘要,迁移工具增加显式解除旧日期限制的选项;默认转换仍无损。解除日期的产品版本递增,原值保存在旧表及备份。
- [x] 本机隔离MySQL演练29列(含空bank_logo)转换16列、清除日期、非空Logo拒绝/无损默认、精确回退;回归当前产品保存/发布/匹配。
- [x] 服务器只读核对代码差异、环境摘要、表结构、产品计数、日期使用及活动任务/队列。正式凭据只在服务器读取,不下载.env。
- [x] 固定发布清单,备份旧源码、站点版本、Nginx、产品完整数据及整库灾难材料;维护窗口暂停外部写入、worker与FPM,再转换产品表并原子替换配套源码。旧表保留。
- [x] 核对16列、全部产品内容/配置/版本、非产品表一致、历史快照及服务;29项服务器HTTPS只读检查和精确回退预检通过后恢复入口/worker,再检查31项公网及日志。
- [x] 37个备份文件下载核验,清理临时凭据和传输缓存,退出宝塔;更新发布/交接记录,明确小程序和真实业务验收状态。
恢复:重新暂停写入,先保护发布后新增数据,核对源/表/版本摘要;使用本次迁移回执的双表RENAME恢复原产品表并恢复本次before源码/资源版本。不得整库覆盖,不删除原表、真实产品或用户数据。
@@ -0,0 +1,17 @@
# 短信登录与账户安全内部实现
用户已授权先写相关代码;供应商、已审核签名及模板暂缺。本轮只实现本地代码并使用全新隔离存储验证,不能发送真实短信、部署、提交或修改生产。产品机构库由同事维护,不触及产品代码;不恢复已回撤的产品AI分析,不改融资评估28项输入。
## 接口与行为
沿用手机号登录/注册、验证码改密、手机号双验证换绑页面和JSON契约。发送成功返回retryAfter/expiresIn;未配置短信始终503/SMS_NOT_CONFIGURED,不产生可用验证码或用户。供应商接口只定义send(phone,code,purpose)及可用性,默认不可用,测试替身仅放tests。未来真实适配需明确启用、审核签名/各用途模板及服务端凭据。
验证码六位、安全随机,Redis仅保存带服务端秘密的摘要,手机号/上下文键使用摘要;60秒同号码冷却、号码/IP限流、300秒过期、最多5次错误。验证码绑定用途、号码和账户当前手机号;多挑战同一次Lua原子核销,错误不能消耗另一个正确挑战,重复/并发核销最多成功一次。发送失败/未知不激活,预留失败次数仍算限流。不能在响应、业务日志或持久测试回执中保存明文码。
短信登录支持已存在正常账户及首次注册;随机不可知初始密码、邮箱null、默认昵称和零积分,沿用已有密码哈希与Token。现有唯一手机号约束防并发重复注册,账户行锁与Auth::direct串行防换绑后旧号码登录。注册Hook或存储失败不返回Token。禁用账户不登录。
安全发送/改密/换绑须认证,账户行锁内再次检查会话有效性与当前手机号。验证码改密只支持已登录本人;不新增匿名找回密码流程。换绑同时验证原号码和新号码,校验占用及唯一约束,事务写入当前账户手机号,撤销本人全部会话,不重写历史融资快照。验证码先原子消费,后续业务失败不恢复验证码,须明确重新发送,避免跨Redis/SQL补偿导致重放。
## 验证与发布边界
测试使用全新本机MySQL/Redis、独立ROOT及显式bootstrap,真实模型屏蔽、供应商发送只在测试中注入。覆盖用途/账户隔离、过期/限流/错误上限、发送失败、双码、注册并发、Token撤销、禁用、Hook及事务故障;回归现有密码登录与资料。无渠道配置时上线仍不可发送,本轮不视为短信业务已上线或真实渠道验收。
@@ -0,0 +1,25 @@
# 协议全文与同意记录设计
用户已同意先实施协议全文展示及版本化同意记录。本轮复用内容后台和既有登录/隐私/资料授权入口;不新增融资28项填写内容、不开发私有上传或外部查询,不涉及同事产品机构库,不恢复产品AI条件分析。两仓原有短信未提交改动保留,短信仍默认关闭;本轮不提交、推送、部署或接生产。
## 协议与不可变版本
四种code固定对应scope:terms/account-terms、privacy/account-privacy、document-use/documents、data-authorization/data。fa_acticle作为协议草稿源,只有本轮结构化kind=agreement正文经运营确认已审核并正式发布后才成为可用协议;旧type2/3内容不自动转为正式版本。正式正文未知,本轮不编造、不填正式内容、不发布。
发布同事务保存fa_agreement_revision,唯一(code,version),冻结标题、正文、scope、SHA-256和UTC生效/发布时间。正文为纯文本,最多60000字节,保留换行,不执行HTML。版本ASCII字母数字点横线下划线、1至64字符,标题最多50字。未来生效版本不作为current;同版本不能改正文,修订须新版本。下架不抹除已发布历史,指定版本始终返回原文;新增/编辑/批量/旧入口不得绕过审核与版本约束。沿用后台权限及内容CSRF,不自动绑定正式角色。
## 同意与撤销
新增fa_user_consent保留本人同意的协议code/version/快照ID与摘要、服务端grantedAt、requestId。grant行保存首次revokedAt,每个已受理撤销请求追加event_kind=revoke命令并指向原grant;同意与撤销共享(user_id,request_id)唯一空间,新键重复撤销也不可被后续操作复用。服务端在事务与账户行锁内重核有效会话;grant读取当前已发布版并锁定,与发布锁顺序兼容。新请求必须scope匹配且版本当前,旧键同内容返回已有记录、异内容409,不因后续新版本而破坏旧键补确认。
GET /agreements/:code公开,version可选;GET /consents仅本人、可scope过滤和有界分页;POST /consents要求scope/agreementCode/agreementVersion/requestId;POST /consents/:id/revoke仅本人、重复保留首次时间、同键异操作拒绝。协议使用确认account-terms/account-privacy不当成可撤销的数据查询授权;仅documents/data提供撤销,撤销不删除历史证据。所有本地同意记录均不代表第三方授权或已经查询外部数据。
## 前端与登录
主包新增可匿名协议全文页,账号分包新增本人同意记录页。现有链接跳转全文,具备加载/未发布/失败重试和旧响应守卫;记录页可查看当时版本、手动撤销可选授权。复用现有登录勾选,加载terms/privacy后绑定所见版本;认证成功后使用当前会话保存两项同意,确认成功才跳转。登录已验证但保存未知时手动原键重试,不重复发送短信/验证密码;切换账户和离页不能回填。
后端登录契约和旧客户端兼容,本轮不启用强制协议登录策略;协议未发布时不产生同意证据,原有账户密码登录可继续,真实网络失败不能当未发布。正式正文/留存期限仍需业务确认。融资资料步骤的原选填行为保持,附件和外部查询仍未开放。
## 验证与迁移边界
新两表SQL只在全新私密本机MySQL隔离库安装,生产/schema迁移仅提供文件,不直接执行;独立Redis DB15、ROOT、命名空间和模型屏蔽。TDD先缺功能红测试,再测试发布不可变、历史精确读取、并发/幂等、跨账户、撤销、版本竞争、CSRF及旧内容/短信账户回归。前端纯测试、本地微信/Android编译与合成API受控渲染;不得通过默认H5入口访问生产API。全部完成后精确清理所属环境,真实渠道和正式正文验收不预填通过。
@@ -0,0 +1,42 @@
# 资料上传简化方案
日期:2026-10-12。状态:按用户“还是不设计这么复杂”收缩方案;内部代码与隔离验证已完成,真实上传默认关闭、未上线,见[开发记录](../../私有资料上传开发-20261012.md)。本文件替代此前复杂提案,后续按此范围推进。
## 要做的功能
沿用小程序现有资料选图,只补三个操作:上传照片、本人查看、本人删除。资料继续选填,不增加融资28项填写内容。
复用项目已有登录鉴权、图片校验方式和现有界面。通用Upload类会写public/uploads,因此私有资料不直接调用该公开保存分支;只补必要的私有保存逻辑,不重做通用上传系统。
## 最小实现
- 使用当前服务器的一处私有目录,放在Web可访问目录之外;服务端生成随机文件名。
- 新增一张小型资料表,保存附件ID、所属用户、资料类别、存储位置、格式/大小、同意记录及创建/删除信息,不放入公开附件列表。
- 上传使用现有Bearer登录和documents同意记录;查看、删除校验所属用户,其他用户不能访问。撤销同意后禁止新的资料上传/使用,本人仍可管理自己的资料。
- 首版接收JPG/PNG照片,单张最多5MB;检查真实图片格式、尺寸并重新编码,沿用既有Secret加密保存,不建立新的密钥体系。
- 同步完成保存与删除。文件或数据库明确失败则报告失败并处理本次文件;保存结果未知提示手动重试,不假报成功,不自动重复发送。
- 删除先使资料不可读,再删除文件;只有文件确认删除后才显示成功,失败可以对同一个附件重试。
只提供三个业务接口,沿用现有响应格式:
| 接口 | 用途 |
| --- | --- |
| POST /api/v1/documents | multipart上传一张照片和已有资料类别/同意记录,返回documentId |
| GET /api/v1/documents/:id/content | 鉴权后读取本人的照片,不返回公开文件地址 |
| POST /api/v1/documents/:id/delete | 删除本人指定附件,重复删除安全返回 |
前端继续使用现有资料卡片,上传后在原位置显示照片缩略图,通过卡片菜单查看与删除,不在下方新增独立管理列表。复用已有GET /consents?scope=documents附加本人资料引用,跨离页恢复,不新增业务接口;同类多张全部可选择管理。受保护图片用带Bearer的下载请求取得临时图片再预览;不把Token塞入URL。退出或换账户时废弃迟到响应,清理本次页面持有的临时图片引用。
## 这轮不扩展的内容
取消原提案的云存储替换层、上传命令账本/租约、专门原键查询接口、多阶段状态机、独立清理worker及一组生命周期配置。普通上传允许用户明确重试,不承诺网络回执丢失时绝不多存一份文件。
不做OCR、自动核验或外部数据查询。现有评估仍按自填资料生成报告,附件ID绑定评估时另做最小集成;不能仅移除当前拒绝附件的分支便宣称已接通,也不把上传成功当成已核验。
## 启用与验证
代码可先在全新隔离环境实现。正式协议用途、保存期限和实际私有目录在正式启用前确定;不在本轮指定上线期限,不新增一套自动保留/删除引擎。
验证集中在正常上传/本人预览/删除、非法图片和超限、未登录/跨用户拒绝、失败提示和换账户后的迟到响应。公开头像、现有融资填写及同事产品库保持;短信仍默认关闭,产品AI回撤保持。
设计简化时仅修改方案与台账;后续内部实施及验证见开发记录。FILE-001正式存储/隐私条件仍待,FILE-002/004内部代码完成、正式未验收;真实上传默认关闭,不连接生产/迁移/发布/提交/推送,文档检查不计为功能验收。
@@ -0,0 +1,13 @@
# 产品机构库原型实施范围
用户已同意前轮十项建议,要求尽量以客户原型为准。2026-10-13 确认基础分默认80、每产品可配置,满足软条件时加减分,未知不计分,范围0—100;硬条件不符不推荐。
复用 FastAdmin 产品库、准入编译器、冻结快照及小程序三标签详情。管理端采用银行/产品列表、搜索筛选、头部机构信息及八个规则标签;修复保存、版本保护、金额单位、回显和上下架。银行视图按机构归组展示产品,不新增独立机构表或机构级发布操作。
准入条件使用稳定字段、条件编号和来源要求。补充原型指标仅支持规范配置;没有采集/核验来源时为unknown,不把经营月数当成立年限或营收当开票额,不增加原融资28项采集。理由模板按条件编号与pass/fail/unknown绑定,有限占位符由服务端渲染,再供现有单产品AI解释使用。资料清单和机构Logo/真实顾问电话等展示配置保存为版本化JSON于现有other列;原有文本说明保留。
新匹配快照版本固定评分配置与排序口径;旧快照继续按旧版本执行、旧报告不补分。仅eligible参加排名,按分数降序、同分产品ID升序;unknown/ineligible无推荐排名。
小程序显示真实Logo、额度利率、条件匹配度、资料清单与已有理由分组;顾问电话配置后才拨打,未配置提示联系平台。办理入口复用已有申请准备页;不编造银行办理网址/顾问。保留账户归属、revision与快照一致性检查。
本轮不提交、不部署、不访问正式数据库或真实模型。使用独立本机合成数据验证保存、发布、匹配、旧快照兼容和页面;保留两仓既有改动。覆盖前三文件和相关待改源码已备份至仓库外product-prototype-20261013目录。
@@ -0,0 +1,21 @@
# 条件第一列手输与自定义条件 AI 匹配
用户已纠正范围:仅第一列改为手输,包括准入/加减分的条件项、推荐/不推荐的关联条件。运算符、值、适用对象与分值保持原结构。用户随后要求不推荐移除“触发结果”,推荐与不推荐模板统一只使用 `{X}`,填充内容及正文是否适用由 AI 判断。此前已批准自定义条件由 AI 判断,标准条件继续确定性规则。产品原文 AI 整理仍不恢复。
保留八标签及既有表格。第一列使用普通 input,无下拉、datalist;中文已知字段仍映射标准规则,任意名称保存自定义。关联条件手输名称,自动关联已有唯一名称;同名须明确命名,未关联已有条件的文字保存为独立条件描述,仅决定对应模板是否展示。隐藏内部规则编号。地区/用途和已知枚举多选值改为直接勾选,保存参数保持不变。基础分默认80可配置,加减分继续独立整数分值输入。
新增可选 manualSoftConditions 和 textTemplates,保持 manualConditions 原结构。自定义条件与白名单自填事实作为不可信数据并入既有评估请求,返回满足、不满足、资料不足和有效资料引用。自定义硬条件不满足则不推荐,未知则不排名;软条件满足才按配置分值加减;理由模板仅按关联结果展示,不升级为新硬门槛。分数限制0—100,标准硬不符不能被 AI 覆盖。
模型判断和输入摘要随评估结果保存,写入前依据冻结目录重新校验。复用现有一次模型调用、预算、任务租约和用量记录,输出容量按实际条件数约束。旧目录/报告保持原语义,不补算。失败、截断、遗漏、重复或越界判断不能当作满足。继续使用现有任务失败重试流程。
只在显式本机隔离环境和假模型中验证;不访问正式库、不部署、不调用真实模型、不提交代码。发布必须同步所有配套后端文件,不能只更新管理端 JS。
实施边界:同产品相同文字模板条件共用判断;一次最多32个不同判断、48KB条件描述,超范围明确未判断并保持未知。输出预算按数量调整至4096—8192,真实供应商返回质量和预算支持尚未付费验证。
## 后续要求:推荐与不推荐统一 `{X}`
推荐与不推荐均为“关联条件、模板内容、操作”三列。关联条件继续手输,唯一名称可绑定已有准入或加减分条件;模板允许多个 `{X}`,AI 按出现顺序返回各槽内容。编辑旧模板时,将旧六种变量转换为 `{X}`,旧不符合/资料不足模板均放入不推荐页,由 AI 分别判断正文是否适用;历史报告及未编辑的旧冻结目录保持旧语义。
新增可选 `aiTemplates`,每项精确五键 `id`、`ruleId`、`condition`、`kind`、`text`,`kind` 为 `recommend` 或 `caution`。绑定现有规则时 `ruleId` 非空、`condition` 为空;独立文字关联反之。新编辑保存清空旧 `templates`/`textTemplates`,不新增产品表列。每模板最多8槽、旧新模板合计最多100条,单次 AI 判断及渲染工作合计32条、总32槽、实际关联描述48KB;超出范围明确未评估。
渲染合入既有一次评估模型调用,输出 `templateRenderings` 的产品ID/版本/模板ID/模板摘要、三态 `conditionOutcome`、`applicable`、顺序 `values` 及 `evidenceRefs`。只有正文适用且结果符合服务端最终规则时展示;标准规则推荐仅允许满足,不推荐允许不满足或资料不足。自由关联相同条件共用判断,正文适用性分别判断;模板不新增准入门槛或改变分数。未适用模板返回空槽值,适用模板的槽数必须精确匹配,事实引用及金额单位须校验;资料不足不能写成确定不符合,保存前重新验证冻结输入和结果。