feat: 实现协议全文与同意记录功能
新增协议全文后台管理、版本化发布及本人同意记录功能,支持可撤销授权;完善资料与授权相关边界提示,调整评估提交时的资料与授权校验逻辑,同步更新相关页面文案与路由。
This commit is contained in:
@@ -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`。只有正文适用且结果符合服务端最终规则时展示;标准规则推荐仅允许满足,不推荐允许不满足或资料不足。自由关联相同条件共用判断,正文适用性分别判断;模板不新增准入门槛或改变分数。未适用模板返回空槽值,适用模板的槽数必须精确匹配,事实引用及金额单位须校验;资料不足不能写成确定不符合,保存前重新验证冻结输入和结果。
|
||||
Reference in New Issue
Block a user