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,90 @@
# 协议与照片独立测试部署清单(2026-10-12)
更新:用户随后明确只有现有服务器并授权直接部署,后端已于2026-10-12发布agreement-documents-r1;当前前端默认production并填写既有正式API,test地址仍空。无需新增独立测试服务器。下表及后文保留本机测试阶段快照,当前发布/启用边界以[本轮发布说明](后端协议与照片发布-20261012.md)为准。
本清单落实“第1步”:先分开测试与生产配置,在独立测试环境接通协议与照片,仅用合成资料,短信及真实模型关闭。远程测试主机/域名尚未指定,本轮只做本机准备与联调;不代表远程部署或微信真机验收。
## 环境配置
| 环境 | 前端配置 | 后端配置与数据 |
| --- | --- | --- |
| 当前源码默认 | `APP_ENVIRONMENT='test'`,`TEST_API_URL=''`,请求明确失败 | 仓库`.env`原样保留;不能直接启动它进行测试 |
| 本机联调副本 | `development`,`http://127.0.0.1:18580/api/v1`;端口以本轮回执为准 | 新建独立ROOT、空MySQL数据目录/库、Redis实例、Web外目录和随机密钥 |
| 微信远程测试 | `test`,填写独立测试HTTPS域名的`/api/v1` | 单独站点/库/Redis命名空间/密钥,合成账号与协议,不使用生产库或产品数据 |
| 正式发行 | `production`,正式地址需要发行时明确填写 | 正式用途、正文、期限、目录/ACL、备份恢复及发行验收另行完成 |
`services/config.uts`原先的test地址指向已发布服务,已清空。未知环境字符串同样返回空地址,不自动切换到本机或其他环境。`API_DEMO_ENABLED=false`保持。
后端样例:[.env.test.sample](D:/AAdesk/202609/airz/.env.test.sample)。ThinkPHP默认仅读取ROOT下`.env`,样例文件名不会自动切换环境;它只能用于**独立测试站点**的配置,不能覆盖当前仓库或生产`.env`。本轮隔离入口使用独立ENV_PREFIX注入并核对生效值,ROOT内不放`.env`。
测试样例库名为`airz_product_test_2026101201`,MySQL3345、Redis6425/DB15;这些只是独立实例样例,使用前确认归属和端口空闲,本轮临时实例实际采用空闲端口。`airz_test`不是已有账户,需由测试库管理员配置仅限该库的账号和密码。不得在共享Redis上执行FLUSHDB;每轮另设命名空间。生成32字节随机测试密钥,不复用生产密钥;私密配置不提交或共享。
`deepseek.enabled=false`、`api_key=''`、`base_url='http://127.0.0.1:1'`;不启动分析worker。`application/extra/sms_verification.php`硬编码关闭,当前没有真实供应商配置入口;添加环境开关不会启用短信。本机合成账号走密码登录,不绕过正式短信流程或使用真实号码。
## 最小配套源码
后端以当前已发布profile-grade-r4及既有鉴权/Secret/内容CSRF代码为基线。以下是当前未部署功能的配套集合,不能只上传Documents控制器;同步时先对目标源码做差异核对,尤其`AssessmentRecords.php`存在已审阅线上变体,不得整文件覆盖丢失它。
| 功能 | 后端相对路径 |
| --- | --- |
| 路由与账户 | `application/route.php`、`application/api/controller/v1/Session.php`、`application/common/library/Auth.php` |
| 默认关闭的短信配套 | `application/common/library/AccountSms.php`、`SmsVerification.php`、`smsverification/Provider.php`、`smsverification/UnavailableProvider.php`、`application/extra/sms_verification.php` |
| 协议与同意API | `application/api/controller/v1/Agreements.php`、`application/common/library/AgreementRegistry.php`、`AgreementPublication.php`、`ConsentLedger.php` |
| 协议后台 | `application/admin/controller/Agreements.php`、`application/admin/model/Agreements.php`、`application/admin/view/agreements/{index,form,add,edit}.html`、`public/assets/js/backend/agreements.js` |
| 内容后台配套 | `application/admin/library/BusinessPermissions.php`、`application/admin/library/traits/ContentEditor.php`、`ContentModel.php` |
| 私有照片与评估边界 | `application/api/controller/v1/Documents.php`、`application/common/library/PrivateDocuments.php`、`application/extra/private_documents.php`、`application/common/library/AssessmentRecords.php`中的边界文案 |
前端以当前完整29页项目重新编译,不向小程序局部拷贝UTS。新增`pages/agreement/agreement.uvue`、`packages/account/consents/consents.uvue`;配套`pages.json`、账户login/profile、融资assessment/confirm/services/records、`services/api.uts`、`assessment.uts`、`agreements.uts`、`agreements-route.uts`、`documents.uts`、`config.uts`。具体路径及当前文件SHA-256见本轮源码清单,若继续修改需重新生成;它不是上传包摘要。
复用现有vendor/extend依赖,不安装或升级系统/生产依赖。PHP至少7.4,现有pdo_mysql/redis/GD/openssl/json/fileinfo及mbstring等项目扩展需齐全;GD必须可解码JPG/PNG。Nginx/宝塔保留原API路由与Bearer头转发,Web根为public;私有目录无公开映射。应用原图上限5MiB,设置`upload_max_filesize>=5M`、`post_max_size>5M`和Web请求体上限覆盖multipart开销;不能以提高PHP限额替代应用像素/边长检查。
## 数据库及后台权限
只在**新建合成空库**安装完整`database/schema.sql`。对已有测试库或今后授权目标库,先只读确认现状、备份、逐份执行缺少的增量;禁止用完整schema覆盖现有库,禁止重复建表:
1. `database/agreement-revision-schema.sql`:`fa_agreement_revision`。
2. `database/user-consent-schema.sql`:`fa_user_consent`。
3. `database/private-document-schema.sql`:`fa_private_document`。
使用InnoDB及现有REPEATABLE READ约定;三份SQL不修改旧表、不导入正文、账号、产品或正式同意记录。存量`fa_acticle`协议HTML不会自动成为正式快照,须通过协议后台逐份审核发布。测试正文明确标注“仅供合成联调”,不得迁到正式站点。
协议后台五节点:`agreements`、`agreements/index`、`agreements/add`、`agreements/edit`、`agreements/multi`;独立`业务模板-运营-v2`新增一个模板,旧运营v1、客服v2、技术v5保持。沿用`database/migrate_admin_permissions.php`对**明确独立测试目标**只读预检,实际增量以输出为准;应用、备份和账号绑定按明确目标授权进行。照片API沿用本人Bearer鉴权,不新增管理端照片权限。当前账号/权限未迁移或绑定。
## 执行顺序与验收
1. 明确独立站点、HTTPS域名、空库、Redis实例、Web外目录、运行账号和备份位置;先核对与生产不同。后端和前端都记录源码摘要,已有目标则备份配套文件/结构/数据/配置,私密备份不整包共享。
2. 先部署后端完整配套源码,照片保持关闭;安装缺少的三表,按需要预检/安装协议后台节点。运行账号仅对私有目录读写,Web无权限公开读取;目录预先存在且不能与public重叠、成为其祖先或链接。
3. 在独立测试库通过审核发布合成`terms`、`privacy`、`document-use`协议;如需读取数据授权再单独发布合成`data-authorization`,不能把它当第三方查询授权。
4. 核对实际生效数据库/Redis/密钥、短信false、模型false/无供应商密钥;仅测试配置显式开启照片并填写目录。运行本人同意→multipart上传→Bearer下载→恢复→删除。另验未登录/跨账号拒绝、撤销后拒绝新上传、本人仍可读删、关闭上传时明确提示。
5. 前端测试副本显式使用该API,重新编译29页;照片须在原卡片显示,通过卡片菜单管理,离页后恢复。确认评估仅提交自填信息,附件/consentIds仍为空;本轮不执行真实评估/模型任务。
6. 保存请求计数、配置审计、源码清单、截图及清理回执。本机合成环境测试后停止所属API/H5/MySQL/Redis,清理所属账号/同意/协议/照片/Token和精确合成库;不触碰其他服务或共享数据。
关闭照片功能会使上传、下载、删除不可用,资料引用返回空,但不删除已保存照片;已有测试环境退回前先让本人完成删除及核对私有目录。源码回退先恢复前端兼容版、关闭新上传/入口、保留新增表/协议快照/同意及密钥,不反向DROP有数据的表。需要恢复整个测试站点时使用同批备份,避免密文、表与密钥不匹配。
## 微信真机的下一步
本机127.0.0.1是手机自身,不能作为真机API;微信真机需要独立可信HTTPS测试域名。小程序后台把相同测试域名加入request、uploadFile、downloadFile合法域名,使用体验版测试配置重新编译上传。开发者工具“忽略域名校验”只能辅助模拟器,不能作为真机通过证据。
在微信/Android真机验证选择照片、原卡片缩略图、Bearer下载、原卡片菜单删除、重新进入恢复、换账号及临时文件清理;记录设备/系统/微信版本、体验版版本、源码/上传包摘要和北京时间。正式照片用途、正文、保留期限、撤销后处理、目录/ACL、密钥恢复和孤立文件运营处理仍需确认;本机合成联调不解除FILE-001或正式验收阻塞。
## 本轮验证与回执
本机准备与联调已完成,远程测试站点和微信真机尚未执行。
| 检查 | 本轮结果 |
| --- | --- |
| 默认/production/未知环境/显式development配置 | 未配置目标均返回空地址,只有显式development使用本机18580 |
| 配置与真实本机API预检 | 13项通过;非本机DB、模型开启、无效密钥、ROOT中隐式.env均在加载框架前拒绝 |
| 前端既有专项 | 26组照片、30项协议检查通过 |
| 实际前后端H5联调 | 32项通过;20次页面本机API请求,0页面/控制台错误、0未知外呼 |
| 界面及流程 | 390×844、1280×900;同意→真实上传→原卡片缩略图/菜单预览→离页恢复→撤销后禁止新上传但本人仍可恢复/删除→删除后引用为空;跨账户读取404 |
| 生效配置审计 | 63份bootstrap审计,真实模型加载、短信开启、生产.env加载均false;未提交评估或启动worker |
| 归属清理 | 29表零行、Redis零键、私有目录零文件;精确合成库已删除,所属API/H5及子进程/MySQL/Redis停止,端口释放 |
本轮API为`http://127.0.0.1:18580/api/v1`,H5为`http://127.0.0.1:5182`,现已停止。四份合成协议和两个合成账号仅在该全新空库生成,使用真实密码登录API;没有真实短信、正式正文或产品数据导入。PHP所需pdo_mysql/redis/GD/openssl/json/fileinfo/mbstring实测存在,未安装依赖。
证据:[配置检查](D:/AAdesk/202609/airz-backups/test-configuration/1791793388934/configuration-verification.json)、[页面/API联调](D:/AAdesk/202609/airz-backups/test-configuration/1791793388934/ui-verification.json)、[配置审计](D:/AAdesk/202609/airz-backups/test-configuration/1791793388934/audit-summary.json)、[清理回执](D:/AAdesk/202609/airz-backups/test-configuration/1791793388934/cleanup.json)、[源码清单](D:/AAdesk/202609/airz-backups/test-configuration/1791793388934/source-manifest.json)。源码清单绑定14个前端文件、30个后端运行/DDL/配置文件;正式发布前需与目标基线核对,后续改动需重新绑定,不是发行包摘要。合成私密配置不整包共享,已清理环境不能直接重新start。
Browser plugin not available,使用现有Playwright/Chromium及非持久浏览器,网络只允许本机H5/API。截图:[原卡片上传](D:/AAdesk/202609/airz-backups/test-configuration/1791793388934/uploaded-390.png)、[重新进入恢复](D:/AAdesk/202609/airz-backups/test-configuration/1791793388934/recovered-390.png)、[宽屏恢复](D:/AAdesk/202609/airz-backups/test-configuration/1791793388934/recovered-1280.png)、[删除完成](D:/AAdesk/202609/airz-backups/test-configuration/1791793388934/deleted-1280.png)。本轮前端修改仅配置,不重复微信/Android全量编译;前轮29页编译证据保持,正式测试域名配置后再编译体验版。
临时工具首次启动的H5归属校验缺少工作目录识别,停止所属服务后另建新环境;最终按PID创建时间、完整命令及工作目录核验。H5首次缺少`HX_APP_ROOT`导致现有内置组件定位失败,仅重启本轮预览并补HBuilderX环境后通过;共享layout.uts既有类型警告保留。配置拒绝测试修正PHP错误输出通道/CRLF匹配;页面恢复检查等待异步缩略图后最终通过。失败轮不计通过数,不改产品逻辑。