Files
airz-uniapp/README.md
T
hujun 7c252fc730 feat(融资): 新增产品对比页面及相关接口实现
新增产品对比页面 compare/compare,支持同一评估下最多3个产品的横向对比,展示额度、期限、利率、适用条件等核心指标及匹配详情。
新增 matches.uts 服务层,封装匹配列表、详情、公共产品查询接口。
新增 account 分包的 latest-report.uts 服务,用于查找用户最新成功报告。
调整个人中心页面,将“评估记录”改为“开始评估”,新增最近报告直达功能。
更新文档,标记匹配相关接口及原型07、09页面已实现,调整页面数量至26页。
移除 finance 分包中旧的 fetchMatches、fetchProduct 模拟数据接口,统一使用正式API。
2026-09-28 14:56:46 +08:00

148 lines
19 KiB
Markdown
Raw 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.
# AI 融资移动端
基于 uni-app x、Vue 3、UTS 的移动端原型,包含 26 个页面。使用 HBuilderX(VDOM 模式)开发,已验证 5.24 和 5.26 的本地编译;本项目没有独立的 npm 构建入口。
2026-09-28:原型07产品对比已接通,匹配列表/本次产品详情可选择2—3项历史产品,支持补选、移除、刷新恢复、失败列重试及手机横向滚动。复用本人冻结匹配详情,不新增表或模型调用;当前26页,真实产品与跨平台验收仍待完成。见[开发进度6.16](docs/开发进度.md)。
2026-09-28:原型09报告已改为“评估概况/匹配结果/改善建议”,支持栏目URL刷新、最多3项历史候选、分组产品依据与局部重试;重新评估进入空白个人/企业表单,旧报告不补算。PDF、上下文助手与行动页继续独立开发。验证见[开发进度6.17](docs/开发进度.md)。
## 本地运行
2026-09-24:本地产品库已按用户要求上架6条演示产品(ID22—27)。新评估会冻结目录、计算三态及证据并保存匹配结果;报告已展示实际统计和演示标记,旧报告不补算。匹配列表/详情API和03/04/05/06基础已接通,可从新报告进入本次匹配;07—10扩展待开发。数据、脚本与参数见[产品规则契约第7节](docs/产品匹配规则开发契约.md),验收进度见[开发进度6.12](docs/开发进度.md)。
本地评估分析还需要启动后端队列进程;仅启动 phpStudy、Redis 和前端页面不会执行模型任务。在 PowerShell 中运行下列命令,并保持终端运行(重启电脑后需重新启动):
```powershell
Set-Location 'D:\AAdesk\202609\airz'
& 'D:\Develop\phpstudy_pro\Extensions\php\php7.4.3nts\php.exe' think analysis:work
```
提交后一直“分析中”时,先检查此进程是否运行;未运行时任务会保留在队列中,启动后继续处理,无需重复提交。运行会调用已配置的真实模型并产生用量。生产环境需要独立的进程守护;本地手动启动不代表已配置开机自启。
在 HBuilderX 中导入当前目录,选择“运行 → 运行到浏览器”。共享请求配置位于 `services/api.uts`,账户、融资服务分别位于对应分包的 `services/`。现已接入本地后端密码登录、账户资料、头像、退出及改密,以及融资需求v2录入、正式提交、历史、DeepSeek自填报告与失败重试;完整度/准备状态及报告v2自填支线已接入;短信与真实机构产品资料仍待接入。无草稿;金额显示万元、接口传元字符串。最新状态和验证范围见[开发进度](docs/开发进度.md)0.6及6.6。
也可使用 HBuilderX CLI。以下 PowerShell 命令中的安装路径应按本机环境调整;在项目根目录执行:
```powershell
$hbuilderCli = 'D:\Develop\HBuilderX\cli.exe'
$projectPath = (Get-Location).Path
& $hbuilderCli open
& $hbuilderCli launch web --project $projectPath --compile false --continue-on-error false
```
## 各平台编译
以下命令仅本地编译,不上传、不发布:
```powershell
& $hbuilderCli launch mp-weixin --project $projectPath --compile true --continue-on-error false
& $hbuilderCli launch app-android --project $projectPath --compile true --continue-on-error false
& $hbuilderCli launch app-ios --project $projectPath --iosTarget simulator --compile true --continue-on-error false
```
产物位于 `unpackage/dist/dev/` 对应平台目录。Android 命令可检查 Kotlin/class 编译;Windows 上 iOS 命令只检查当前编译链生成的源码产物,不代表已完成 Xcode 构建或生成 IPA。
运行微信小程序需配置自己的 AppID,并开启微信开发者工具服务端口。Android 真机运行需启用 USB 调试;iOS 真机运行需相应签名环境。正式发行还需配置应用图标、签名、真实接口及平台要求的资料,并完成真机测试。
## 跨端维护约定
- 页面尺寸和安全区计算集中在 `services/layout.uts`。新增页面应复用这里的逻辑,并检查小屏、横屏、键盘弹出及底部安全区。
- 微信小程序首页在右侧预留胶囊区域与 8px 间距;公共页面标题采用左右对称的安全留白,始终按屏幕中心定位。获取胶囊失败时按 104px 避让。产品分享入口在小程序端放在内容区,App 和 Web 仍保留在标题栏右侧。导航不新增顶部空行,顶部按状态栏和安全区计算。
- 首页右上角依次为搜索、消息通知;微信端两个按钮与胶囊等高、顶部对齐,按钮组向左展开,左侧 Logo 对齐胶囊的垂直中心;其他端仍在导航栏内居中。AI 助手保留首页横幅及快捷入口。
- 原生样式遵循 uni-app x 支持范围。仅 Web/小程序支持的样式用条件编译隔离;修改 UTS 类型后应重新验证 Android 编译。
- 首页及跨包共用的轻量位图位于 `static/mobile/`,专属大图位于各分包的 `static/`,原始图片保留在 `static/images/` 与 `static/icons-generated/`。箭头继续使用 `static/icons/` 下的 SVG。
- 底栏使用 `static/mobile/navigation/` 的专用位图,由现有高清图标按可见边界裁切、等高居中得到。更换素材时保持一致的图案高度和画布留白,避免仅统一图片元素尺寸却出现视觉错位。
- 微信打包忽略原始图片目录和未使用的 `static/logo.png`,规则位于 `manifest.json` 的 `mp-weixin.packOptions.ignore`。新增资源要检查引用与排除规则,最终包体以微信开发者工具结果为准。
- API 环境配置在 `services/config.uts`,开发地址为 `http://127.0.0.1/api/v1`。共享请求已统一Bearer、FastAdmin响应解包及401处理;模拟开关关闭,缺服务配置时失败而非模拟成功。测试/生产地址待配置,生产只允许HTTPS。真机需改为可访问的局域网/正式地址,不能使用手机自身127.0.0.1。
## 当前前端交互
个人与企业评估不提供草稿功能:填写页与确认页仅通过内存传递本次输入,离开流程、刷新或退出账户后丢弃;已接入正式提交及历史列表/详情接口;提交后资料只读。选图仅供本机预览,证件资料上传和数据查询尚未接入。课程章节进度、消息已读与体验签到均保存在当前设备,不代表服务器账户数据。
个人中心顶部的头像、昵称、手机号区域统一进入修改资料;账户安全独立提供修改密码、验证码重设密码及换绑手机号。昵称和头像缓存按稳定userId隔离,手机号仅保留为内部兼容键。头像已接入后端上传及持久化,限制 500KB 以内的 JPG / PNG / WebP,服务端验证真实图片并重新编码,保存时校验附件归属,不修改融资档案的实名信息。密码登录、原密码改密及退出已接入Redis会话;短信验证和换绑尚未接入,不在本机模拟成功,也不保存密码、验证码或其散列。安全接口成功后清除当前会话并要求重新登录;验证码计时仅在服务端发送成功后启动。
账户接口集中在 `packages/account/services/account.uts`,请求携带当前会话的 `Authorization: Bearer <token>`;后端需根据 token 确定账户,校验验证码用途与有效期、限制发送频率并完成旧会话撤销。接口状态:
- 已实现 `GET/PUT /account/profile`:PUT 接收 `nickname`(2–20字符)及可选 `avatarId`;省略保留原头像,`null` 恢复默认。GET 返回服务端资料。
- 已实现 `POST /account/avatar`:multipart 的 `file`,返回 `attachmentId`、`avatarUrl`;头像为公开资料,不能用该接口上传私有证件。
- `POST /account/security/sms-code`:`purpose`(`password` / `phone-current` / `phone-new`)与 `newPhone`(仅新号码验证传入);当前号码从认证账户读取。
- `PUT /account/password`:`verification`(`password` / `sms`)、`oldPassword` 或 `code`、`newPassword`。新密码为 8–32 位可打印 ASCII,需含字母和数字,不允许空格。
- `PUT /account/phone`:`newPhone`、`currentCode`、`newCode`;后端验证两组验证码及新号码占用情况。
资产与负债包含 `creditLoanCount`(信用贷款笔数)、`totalDebtBalance`(欠款总余额)、`monthlyLoanPayment`(贷款月还款金额)、`creditCardCount`(银行信用卡张数)、`creditCardTotalLimit`(总额度)、`creditCardUsedLimit`(已使用总额度)、`house` / `car`(有 / 无)。移动端所有金额统一以万元输入和展示,最多六位小数;提交接口前精确换算成元的两位小数字符串,范围为 0–999999999.99 元(DECIMAL(11,2))。数量为非负整数;资产负债保持原来的可跳过规则。企业经营时间使用实际经营月数,不从区间猜测。启动时清理旧评估草稿缓存,不导入、不恢复。
新闻与课程的数据定义位于 `packages/content/services/content.uts`。正式匹配与产品适配位于 `packages/finance/services/matches.uts`;GET /assessments/:id/matches及结果详情返回冻结的产品范围、判定和证据;GET /products/:id返回当前公共资料。金额范围使用元的十进制字符串,在适配层精确转换为万元。旧无评估GET /matches和模拟fetchProduct入口已移除。后端产品表使用独立的额度、期限和利率范围字段,匹配分数与理由属于评估结果。申请入口目前仅引导准备资料,不向金融机构提交申请。
首页搜索进入内容分包的 `search/search`,支持全部、新闻、融资课堂筛选及对应详情跳转。搜索服务位于 `packages/content/services/search.uts`,当前匹配本地标题、简介、分类和正文;空格分隔的多个关键词需同时命中。预留 `GET /content/search`,参数为 `keyword` 与 `type`(`all` / `news` / `lesson`),返回 `{ items: ContentSearchResult[] }`,每项包含 `id`、`type`、`title`、`summary`、`category`、`meta`、`image`。后端接入时需同步接入新闻和课程详情的数据源,确保返回的 ID 可查询详情。
## 页面与分包
“帮助与反馈”从个人中心进入内容分包的 `help/help`,按账户使用、融资评估、资料与隐私分组展示可展开的问答,不跳转 AI 助手。数据与客服接入点位于 `packages/content/services/help.uts`;预留 `GET /help/faqs` 返回 `{ items: HelpQuestion[] }`。联系客服当前只展示暂未开放提示,不发起客服会话或提交反馈。
`pages/` 只保留 `home/home.uvue`,也是唯一主包页面。页面注册统一维护在 `pages.json` 的 `pages` 和 `subPackages`,分包内的 `path` 相对于 `root`。
| 目录 | 内容 | 页面数 |
| --- | --- | --- |
| `pages/home` | 首页 | 1 |
| `packages/finance` | 融资入口、评估、确认、分析、报告、匹配、产品、对比、助手、档案 | 10 |
| `packages/account` | 启动引导、登录、个人中心、修改资料、账户安全、修改密码、更换手机号、积分、消息 | 9 |
| `packages/content` | 搜索、帮助与反馈、新闻、文章、融资课堂、课程详情 | 6 |
当前各模块体积较小,优先保持完整业务链;普通内容统一一个包。新增功能先放入所属分包,再根据微信编译产物大小决定是否细分。单包以 2 MiB 为保守预算,需预留增长空间,最终体积以微信开发者工具为准。
2026-09-20 使用 HBuilderX 5.26 本地微信开发编译,按 `packOptions.ignore` 排除原始素材后统计:主包约 887 KiB,融资包 378 KiB,账户包 148 KiB,内容包 355 KiB。此为磁盘产物统计,不等同于开发者工具上传后的压缩体积。
- 分包页面使用完整绝对路由 `/packages/<模块>/<页面>/<页面>`,包含路由比较和携带参数的跳转;主包首页仍为 `/pages/home/home`。
- 微信按 `subPackages` 下载分包。Android、iOS 使用相同目录、页面注册和路由编译为应用,不将小程序按需下载机制等同于 App 热更新。
- 保留现有自绘 `BottomNav`,新闻、消息、我的允许在分包中;不配置要求页面留在主包的原生 `tabBar`。底栏切换使用 `reLaunch`,详情使用 `navigateTo` / `navigateBack`。
- 冷启动首页通过 `services/launch.uts` 只触发一次账户引导,之后按登录状态进入首页或登录;直接打开分包页面和正常返回首页不会重复触发引导。
- `components/` 与 `services/` 只保留共享组件、布局、请求、会话和当前评估流程的内存状态。主包或其他分包不得 import 某个分包的专属模块;分包间只通过路由与共享服务交互。
- 仅某个分包使用的图片放在该包 `static/`;首页也使用的插图及通用图标保留在根 `static/`,避免分包资源被主包引用。
参考:[uni-app x 页面与分包配置](https://doc.dcloud.net.cn/uni-app-x/collocation/pagesjson.html#subpackages)。
## 2026-09-22 金额与评估存储约定
`services/money.uts` 集中处理万元与元的精确转换;填写页与确认页均为万元,`submitAssessment` 仅在提交边界转换。后端每次评估对应一条 `fa_user_info`,其报告和产品快照保存在唯一关联的 `fa_ai_chat` 中。后端数据库及生命周期服务已准备,移动端已切换真实本地接口,未完成的评估、AI、私有证件上传及授权接口不会模拟成功,需按开发进度继续接入。
## 2026-09-22 开发启动状态
- 登录默认使用密码模式;需已有手机号账户。尚未配置短信服务商,发送验证码会展示后端503提示,不启动倒计时或生成demo Token。
- 会话包含userId/有效期,旧无身份的模拟会话作废。昵称头像、课程本机进度、体验签到和消息已读按userId隔离;退出、会话过期和401时清理当前账户缓存。评估输入不写本机存储,应用启动清理旧草稿键。
- DeepSeek配置已记录在后端私密环境文件,腾讯云TokenHub地址及两个模型见开发文档;密钥不进入前端,尚未发起真实模型调用。
- 首批真实接口不等于25页已业务化。首页/资讯/课程等部分展示仍为原型;正式评估提交与历史已接通,产品匹配和AI助手接口尚未实现。各模块状态以 [开发进度](docs/开发进度.md)为准。
- 默认开发环境不代表正式部署;发布前需核验目标环境、API地址、HTTPS/CORS及所有必做依赖,禁止把本机地址作为生产配置。
## 2026-09-23 正式评估记录
- `packages/finance/services/records.uts` 负责表单白名单DTO、元/万元转换、枚举和历史适配;确认页提交获得assessmentId后清空流程内存及页面栈。幂等键在网络失败时复用,不跨刷新保存。
- 个人/企业评估提交后保存到后端;分析页读取真实状态,只有processing时每5秒轮询,离开停止;不自动跳到固定分数报告。
- 当前分析服务未接通,显示“资料已保存,分析服务尚未开放”;不意味着DeepSeek已经执行。附件/外部授权尚未接入,必须移除本次资料与授权选择后才能提交。
- 档案页展示本人历史、分页、错误重试及只读详情;金额万元,身份证/手机号脱敏。无新增页面,仍为25页。
## 2026-09-23 DeepSeek与分析任务(覆盖此前未接入状态)
已接腾讯云TokenHub,指定Pro/Flash真实权限通过,默认Flash生成自填资料分析。新增POST `/api/v1/assessments/:id/retry`(HTTP202)及GET `/api/v1/assessments/:id/report`,初次提交HTTP201回执保持不变。前端已接真实状态、幂等失败重试、报告与档案跳转,移除固定评分/雷达;金额精确显示万元,无产品规则时明确未执行匹配。
后端目录运行 `php think analysis:work`;`--once`只消费一条,`--recover-only`仅补投和回收过期租约。已开启本地私密.env的deepseek.enabled,示例默认false;配置/代码变更后重启worker。开发进程不代表生产守护。
数据库事务预留任务后投Redis,数据库queued状态支持漏投补偿;running租约过期明确失败,不自动重复调用收费模型。行锁+taskId拦截重复消费和旧结果回写;重试键映射保存原任务回执。fa_ai_chat保存报告和空匹配,fa_ai_chat_log记录用量/状态,未知tokens为null。开发默认每用户每日20次预留、每评估3次;商业预算待确认。
迁移 `database/migrate_analysis_tasks.py --apply` 已执行,仅增补fa_user_info的task_requests/task_stage/attempt_count/lease_until/dispatched_at及idx_task_dispatch;无新表。执行前0条评估,备份为 `D:/AAdesk/202609/airz-backups/analysis-tasks-20260923-172957-846359/user_info.sql`。回退需先停worker并关闭分析,核对新增业务数据后再用备份恢复,不能直接覆盖后来评估;优先保留兼容字段、回退代码。
验证:先停全部worker,运行 `php tests/analysis_tasks.php --worker-stopped`(29项)和 `php tests/analysis_http.php --worker-stopped`(15项),使用合成数据与假模型;恢复扫描可能发现任意queued测试行,不能只依赖随机Redis队列隔离。任务测试可显式追加`--live`真实调用一次;`tests/deepseek_smoke.php --live`真实调用两个模型。常规正式评估HTTP回归需分析关闭,开启时会SKIP。当前真实个人自填报告及企业H5重试→worker→报告均通过,普通Chromium与Android编译通过;生产、微信内H5、Safari/真机、外部数据及真实产品匹配未验收。
## 2026-09-24 匹配读取与页面接入
新增GET /api/v1/assessments/:id/matches、GET /api/v1/assessments/:id/matches/:productId、GET /api/v1/products/:id,均需会员Bearer;前两者还校验评估归属及成功状态。匹配使用已存快照,当前可用性另查,不重跑规则或模型。报告→匹配三态列表→解释/详情/条件三栏已接通,金额显示万元;演示产品明确标识,旧报告不补算。产品对比已完成本地接口联调,报告三栏已完成本地联调;单产品AI解释、PDF和行动页仍待开发。
后端tests/match_records.php --worker-stopped验证62项接口/快照边界(先停止正式worker,合成账户/假模型自动清理,产品变动回滚);前端Web/Android本地编译通过,H5验证记录见前端docs/开发进度.md第6.13节。无新增表或迁移。
## 2026-09-28 融资档案界面
“我的融资档案”恢复个人/企业切换、完整度与四组资料卡;默认读取该类型最新提交,支持历史分页选择与只读展开。完整度使用所选成功报告中的冻结结果,旧版/未完成/无记录显示未评定说明;底部可查看同次报告或发起空白新评估。不恢复草稿,不编辑历史资料。后端沿用GET /assessments的type过滤及详情/报告接口,验证范围见docs/开发进度.md第6.14节。
2026-09-28:个人中心入口去重,顶部为“开始评估”(选择个人/企业)和“最近报告”(本人最近提交且已完成的报告直达),下方“我的融资档案”管理历史资料。无报告但有任务时可查看进度,无记录时明确提示;不重新提交或调用模型。验证范围见开发进度6.15。