diff --git a/App.uvue b/App.uvue
index 3e72170..c5aa6b1 100644
--- a/App.uvue
+++ b/App.uvue
@@ -26,9 +26,9 @@
.page { background-color: #f5f8fc; }
.page-white { background-color: #ffffff; }
.content { padding: 24rpx 28rpx 190rpx; }
- .primary-button, .orange-button { height: 92rpx; border-radius: 16rpx; color: #ffffff; font-size: 30rpx; font-weight: 700; line-height: 92rpx; text-align: center; box-shadow: 0 14rpx 28rpx rgba(0, 100, 255, 0.20); }
+ .primary-button, .orange-button { height: 92rpx; border-radius: 16rpx; color: #ffffff; font-size: 30rpx; font-weight: 700; line-height: 92rpx; text-align: center; box-shadow: 0 5rpx 14rpx rgba(0, 100, 255, 0.10); }
.primary-button { background-color: #0868f7; }
- .orange-button { background-color: #ff7a16; box-shadow: 0 14rpx 28rpx rgba(255, 122, 22, 0.18); }
+ .orange-button { background-color: #ff7a16; box-shadow: 0 5rpx 14rpx rgba(255, 122, 22, 0.10); }
.section-title { font-size: 32rpx; font-weight: 700; color: #13213c; }
.muted { color: #8793a8; }
.surface { background-color: #ffffff; border: 2rpx solid #e8eef7; border-radius: 16rpx; }
diff --git a/README.md b/README.md
index 177694b..8d20285 100644
--- a/README.md
+++ b/README.md
@@ -36,3 +36,9 @@ $projectPath = (Get-Location).Path
- 线上使用的轻量位图位于 `static/mobile/`,原始图片保留在 `static/images/` 与 `static/icons-generated/`。箭头继续使用 `static/icons/` 下的 SVG。
- 微信打包忽略原始图片目录和未使用的 `static/logo.png`,规则位于 `manifest.json` 的 `mp-weixin.packOptions.ignore`。新增资源要检查引用与排除规则,最终包体以微信开发者工具结果为准。
- API 地址目前为空,表示模拟模式。接入后端时需补齐环境配置、认证、错误契约及真实业务校验,再进行联调。
+
+## 当前前端交互
+
+个人与企业评估分别保存本机草稿;选图仅供本机预览,资料上传和数据查询尚未接入。课程章节进度、消息已读与体验签到均保存在当前设备,不代表服务器账户数据。
+
+新闻与课程的数据定义位于 `services/content.uts`,产品定义位于 `services/finance.uts`。产品列表与详情共用 ID;预留 `GET /matches`(`items` 数组)及 `GET /products/:id`(单个产品),字段见 `FinanceProduct`,其中 `amount` 为万元数值、`rate` 为年化百分比数值。申请入口目前仅引导准备资料,不向金融机构提交申请。
diff --git a/components/AppHeader.uvue b/components/AppHeader.uvue
index 8ef6280..5f2bf25 100644
--- a/components/AppHeader.uvue
+++ b/components/AppHeader.uvue
@@ -2,7 +2,7 @@
@@ -25,25 +27,37 @@
import AppIcon from '@/components/AppIcon.uvue'
import { sendAssistantMessage } from '@/services/api.uts'
const questions = ['我的融资额度受哪些因素影响?', '如何提高贷款通过率?', '企业融资需要哪些材料?', '有哪些适合我的方案?']
- const messages = ref([])
+ type ChatMessage = { role: string, text: string }
+ const messages = ref([])
const draft = ref('')
const lastMessageId = ref('')
const lastQuestion = ref('')
const sending = ref(false)
const errorMessage = ref('')
- const send = async () => {
+ const scrollToEnd = async () => {
+ lastMessageId.value = ''
+ await nextTick()
+ lastMessageId.value = 'chat-end'
+ }
+ const requestAnswer = async (text: string) => {
+ sending.value = true
+ errorMessage.value = ''
+ scrollToEnd()
+ try { const answer = await sendAssistantMessage(text); const response: ChatMessage = { role: 'assistant', text: answer }; messages.value.push(response) } catch (error) { errorMessage.value = '暂未收到回复,请重试' }
+ sending.value = false
+ scrollToEnd()
+ }
+ const send = () => {
const text = draft.value.trim()
if (text.length == 0 || sending.value) return
lastQuestion.value = text
- messages.value.push({ role: 'user', text: text })
+ const message: ChatMessage = { role: 'user', text: text }
+ messages.value.push(message)
draft.value = ''
- sending.value = true
- errorMessage.value = ''
- try { const answer = await sendAssistantMessage(text); messages.value.push({ role: 'assistant', text: answer }); lastMessageId.value = 'message-' + (messages.value.length - 1) } catch (error) { errorMessage.value = '消息发送失败,请稍后重试' }
- sending.value = false
+ requestAnswer(text)
}
- const ask = (text: string) => { draft.value = text; send() }
- const retry = () => { draft.value = lastQuestion.value; errorMessage.value = ''; send() }
+ const ask = (text: string) => { if (sending.value) return; draft.value = text; send() }
+ const retry = () => { if (!sending.value && lastQuestion.value.length > 0) requestAnswer(lastQuestion.value) }
diff --git a/pages/classroom/classroom.uvue b/pages/classroom/classroom.uvue
index 399d575..c3046eb 100644
--- a/pages/classroom/classroom.uvue
+++ b/pages/classroom/classroom.uvue
@@ -1,11 +1,26 @@
-
+
- 融资课堂把融资知识,变成申请底气从准备材料到优化信用,分阶段掌握实用方法
- 热门课程12 节课程{{ item.title }}{{ item.desc }}{{ item.duration }}{{ item.tag }}
- 按场景学习个人信用提升3 节课程小微经营融资4 节课程材料准备清单5 节课程
+ 实用融资知识准备更充分申请更从容每次几分钟,掌握一个知识点
+
+ 按场景学习
+
+
+
+ {{ item.title }}{{ item.desc }}
+ 已选
+
+
+
+
+ {{ activeTopic == '' ? '精选课程' : activeTopicTitle }}{{ activeTopic == '' ? lessons.length + ' 门课程' : '查看全部' }}
+
+
+ {{ item.title }}{{ item.desc }}{{ item.duration }}{{ item.tag }}
+
+
@@ -13,45 +28,53 @@
diff --git a/pages/confirm/confirm.uvue b/pages/confirm/confirm.uvue
index 78b4db8..e8863a2 100644
--- a/pages/confirm/confirm.uvue
+++ b/pages/confirm/confirm.uvue
@@ -1,50 +1,121 @@
-
- ✓信息填写完成请确认以下信息准确无误
- {{ section.title }}编辑{{ row.label }}{{ row.value }}
-
-
+
+
+ 5/5
+ ✓{{ assessmentType == 'enterprise' ? '企业融资信息' : '个人融资信息' }}请确认后再开始评估,可随时返回修改。
+ 还没有评估信息,请先完成信息填写。
+ {{ section.title }}编辑{{ row.label }}{{ row.value }}{{ section.expanded ? '收起详情' : '查看其余信息' }}
+ 本次为演示评估,不会发起真实融资申请。
+
+
+
+
diff --git a/pages/entry/entry.uvue b/pages/entry/entry.uvue
index bb0b3c9..62b41d6 100644
--- a/pages/entry/entry.uvue
+++ b/pages/entry/entry.uvue
@@ -6,7 +6,7 @@
{{ type == 'enterprise' ? '企业信用融资' : '个人信用融资' }}
{{ type == 'enterprise' ? '适合企业 / 个体工商户' : '适合有稳定收入的个人用户' }}
- {{ item }}
+ {{ item }}
@@ -14,12 +14,12 @@
评估流程预览
- 填写信息
- AI分析
- 匹配方案
+ 填写信息
+ AI分析
+ 匹配方案
- 信息将加密传输,仅用于本次融资评估
+ 自主选择授权范围,随时补充评估资料
@@ -30,11 +30,11 @@
import AppHeader from '@/components/AppHeader.uvue'
import AppIcon from '@/components/AppIcon.uvue'
const type = ref('personal')
- const benefits = ref(['最高可借额度', '审批快 放款快', '多种产品任你选'])
+ const benefits = ref(['了解可选融资额度', '在线评估,便捷省时', '多家机构方案对比'])
onLoad((options) => {
if (options != null && options['type'] == 'enterprise') {
type.value = 'enterprise'
- benefits.value = ['最高可借额度', '企业信用贷款', '多种融资方案']
+ benefits.value = ['匹配企业资金需求', '多维度经营资质评估', '多种融资方案对比']
}
})
const start = () => { uni.navigateTo({ url: '/pages/assessment/assessment?type=' + type.value }) }
@@ -50,9 +50,9 @@
.intro-sub { font-size: 23rpx; color: #5f6d82; margin-top: 8rpx; margin-bottom: 30rpx; }
.benefit { flex-direction: row; align-items: center; margin-top: 18rpx; color: #23324a; font-size: 25rpx; font-weight: 600; }
.benefit .app-icon { margin-right: 12rpx; }
-/* #ifndef APP */
-.enterprise-page .benefit .app-icon { filter: hue-rotate(330deg) saturate(1.7); }
-/* #endif */
+ .benefit-text { color: #34445c; font-size: 25rpx; line-height: 38rpx; }
+ .benefit-dot { width: 10rpx; height: 10rpx; border-radius: 5rpx; background-color: #0868f7; margin-right: 14rpx; flex-shrink: 0; }
+ .enterprise-page .benefit-dot { background-color: #f47a1a; }
.entry-image { position: absolute; width: 285rpx; height: 300rpx; right: -35rpx; bottom: -22rpx; }
.start-button { margin-top: 30rpx; }
@@ -61,9 +61,8 @@
.process-item { align-items: center; color: #455369; font-size: 22rpx; }
.process-icon { width: 88rpx; height: 88rpx; border-radius: 26rpx; background-color: #e9f2ff; align-items: center; justify-content: center; margin-bottom: 14rpx; }
.enterprise-page .process-icon { background-color: #fff0e5; }
-/* #ifndef APP */
-.enterprise-page .process-icon .app-icon { filter: hue-rotate(330deg) saturate(1.7); }
-/* #endif */
+ .process-label { font-size: 24rpx; color: #455369; }
+ .privacy-text { font-size: 22rpx; color: #748398; text-align: center; line-height: 34rpx; }
.arrow { margin-top: -28rpx; }
.privacy-tip { margin-top: 55rpx; align-items: center; color: #97a3b4; font-size: 21rpx; }
diff --git a/pages/home/home.uvue b/pages/home/home.uvue
index 0e4479b..cb2d3bb 100644
--- a/pages/home/home.uvue
+++ b/pages/home/home.uvue
@@ -1,6 +1,6 @@
-
+
@@ -12,14 +12,15 @@
企业信用融资企业/个体工商户
- 融资课堂
- AI融资助手
- 融资测算
- 邀请有礼
+ 融资课堂
+ AI融资助手
+ 融资测算
+ 邀请有礼
- 我的融资方案查看全部 ›
- 信用优享方案3家机构可申请 · 最高50万85综合分
- 融资课堂进入课堂 ›
+ 我的融资档案去完善
+ 我的融资方案查看全部
+ 信用融资方案了解额度、利率与申请条件3示例方案
+ 融资课堂进入课堂
如何提高个人贷款通过率信用管理 · 6分钟阅读
@@ -33,6 +34,8 @@
import BrandLogo from '@/components/BrandLogo.uvue'
import BottomNav from '@/components/BottomNav.uvue'
import AppIcon from '@/components/AppIcon.uvue'
+ const hasUnread = ref(true)
+ onShow(() => { hasUnread.value = uni.getStorageSync('finance.notice.read.assessment-guide') != true })
const go = (url: string) => { uni.navigateTo({ url: url }) }
const openEntry = (type: string) => { go('/pages/entry/entry?type=' + type) }
@@ -46,24 +49,28 @@
.red-dot { position: absolute; width: 13rpx; height: 13rpx; right: 2rpx; top: 0; background-color: #ff4d4f; border-radius: 50%; border: 3rpx solid #fff; }
.home-scroll { }
.home-content { padding: 18rpx 28rpx 180rpx; }
- .ai-banner { height: 260rpx; border-radius: 20rpx; padding: 32rpx; overflow: hidden; flex-direction: row; align-items: center; background: linear-gradient(125deg, #1263f0 0%, #0788ff 100%); box-shadow: 0 16rpx 36rpx rgba(0, 100, 237, .20); }
+ .ai-banner { height: 246rpx; border-radius: 20rpx; padding: 30rpx; overflow: hidden; flex-direction: row; align-items: center; position: relative; background: linear-gradient(125deg, #1263f0 0%, #0788ff 100%); }
.banner-copy { z-index: 2; }
.banner-title { color: #ffffff; font-size: 39rpx; font-weight: 800; }
.banner-subtitle { color: #ffffff; font-size: 30rpx; font-weight: 700; margin-top: 12rpx; }
.banner-desc { color: #dceeff; font-size: 22rpx; margin-top: 14rpx; }
- .robot-img { position: absolute; right: 5rpx; width: 270rpx; height: 235rpx; }
+ .robot-img { position: absolute; right: 0; width: 240rpx; height: 220rpx; }
.entry-row { flex-direction: row; margin-top: 22rpx; }
.finance-entry { flex: 1; height: 180rpx; border-radius: 18rpx; padding: 26rpx 22rpx; flex-direction: row; overflow: hidden; position: relative; }
.entry-following { margin-left: 18rpx; }
- .personal { background-color: #eaf3ff; }
- .enterprise { background-color: #fff1e7; }
+ .personal { background-color: #126df1; }
+ .enterprise { background-color: #ff821c; }
.finance-entry-image { position: absolute; width: 150rpx; height: 135rpx; right: -8rpx; bottom: -8rpx; }
.entry-title { font-size: 29rpx; font-weight: 800; }
- .personal .entry-title { color: #0868f7; }
- .enterprise .entry-title { color: #ff7115; }
- .entry-subtitle { margin-top: 10rpx; color: #65738a; font-size: 21rpx; }
+ .personal .entry-title { color: #ffffff; }
+ .enterprise .entry-title { color: #ffffff; }
+ .entry-subtitle { margin-top: 10rpx; color: #ffffff; font-size: 21rpx; }
.shortcut-row { height: 160rpx; margin-top: 24rpx; flex-direction: row; align-items: center; justify-content: space-between; background-color: #fff; border-radius: 18rpx; padding: 0 8rpx; border: 1rpx solid #eaf0f7; }
- .shortcut { flex: 1; align-items: center; color: #536176; font-size: 18rpx; white-space: nowrap; text-align: center; }
+ .shortcut { flex: 1; align-items: center; }
+ .shortcut-label { font-size: 23rpx; color: #34445c; text-align: center; }
+ .archive-entry { margin-top: 20rpx; padding: 20rpx 24rpx; flex-direction: row; align-items: center; background-color: #ffffff; border: 1rpx solid #e6edf7; border-radius: 16rpx; }
+ .archive-label { flex: 1; margin-left: 16rpx; font-size: 27rpx; font-weight: 600; color: #243650; }
+ .archive-action { color: #0868f7; font-size: 23rpx; margin-right: 8rpx; }
.shortcut-icon { width: 76rpx; height: 76rpx; border-radius: 24rpx; align-items: center; justify-content: center; margin-bottom: 10rpx; }
.green { background-color: #e7f8f1; }
.purple { background-color: #efebff; }
@@ -71,10 +78,12 @@
.orange { background-color: #fff0e8; }
.section-head { margin-top: 34rpx; margin-bottom: 18rpx; flex-direction: row; justify-content: space-between; align-items: center; }
.more { color: #1673ed; font-size: 22rpx; }
+ .more-link { flex-direction: row; align-items: center; }
.plan-card { height: 150rpx; background-color: #fff; border: 1rpx solid #e6edf7; border-radius: 16rpx; padding: 26rpx; flex-direction: row; align-items: center; justify-content: space-between; }
.plan-name { font-size: 29rpx; font-weight: 700; }
.plan-meta { margin-top: 12rpx; color: #8290a5; font-size: 22rpx; }
- .score { align-items: center; color: #18aa78; font-size: 19rpx; }
+ .score { align-items: center; }
+ .score-label { color: #718198; font-size: 21rpx; }
.score-number { font-size: 48rpx; line-height: 52rpx; color: #0868f7; font-weight: 800; }
.news-preview { min-height: 130rpx; background-color: #fff; border-radius: 16rpx; padding: 24rpx; flex-direction: row; justify-content: space-between; align-items: center; border: 1rpx solid #e6edf7; }
.news-copy { flex: 1; padding-right: 16rpx; }
diff --git a/pages/index/index.uvue b/pages/index/index.uvue
index 383d8fc..960ef85 100644
--- a/pages/index/index.uvue
+++ b/pages/index/index.uvue
@@ -7,7 +7,7 @@
让融资更简单
- 开启智能融资新体验
+ 开启智能融资新体验
@@ -38,4 +38,5 @@
.splash-art { width: 550rpx; height: 420rpx; margin-top: 35rpx; }
.launch-line { position: absolute; bottom: 82rpx; flex-direction: row; align-items: center; color: #9aa7ba; font-size: 22rpx; }
.launch-dot { width: 9rpx; height: 9rpx; border-radius: 50%; background-color: #2d8cff; margin-right: 12rpx; box-shadow: 0 0 18rpx rgba(45, 140, 255, .7); }
+ .launch-text { color: #7d8ca3; font-size: 24rpx; }
diff --git a/pages/lesson/lesson.uvue b/pages/lesson/lesson.uvue
index 6e4a9a7..3db3229 100644
--- a/pages/lesson/lesson.uvue
+++ b/pages/lesson/lesson.uvue
@@ -1,55 +1,112 @@
- {{ title }}{{ tag }}{{ duration }} · 课程本课程将从实际申请场景出发,帮助你理解准备材料、评估资质和选择产品的关键步骤。{{ index + 1 }}{{ item }}预计 2 分钟 · 可随时回看
+
+
+
+ {{ lesson.title }}
+ {{ lesson.tag }}{{ lesson.duration }} · {{ lesson.chapters.length }} 节图文
+ {{ lesson.intro }}
+ 学习进度已完成 {{ completedCount }}/{{ lesson.chapters.length }} 节
+
+
+ 课程目录
+
+
+ {{ index + 1 }}
+ {{ item.title }}{{ completed[index] ? '已完成 · 可再次阅读' : '点击展开阅读' }}
+
+
+
+ {{ item.body }}
+
+
+
+
+ 暂未找到这门课程返回融资课堂,选择其他课程。
+
diff --git a/pages/login/login.uvue b/pages/login/login.uvue
index 2787017..8e23fbb 100644
--- a/pages/login/login.uvue
+++ b/pages/login/login.uvue
@@ -1,101 +1,85 @@
-
-
-
- 欢迎登录 AI融资
-
- 手机号登录
- 密码登录
+
+
+
+
+ 欢迎登录 AI融资
+ 智能评估,让融资更简单
+ {{ mode == 'phone' ? '手机号登录 / 注册' : '密码登录' }}
+ +86
+
+ {{ countdown > 0 ? countdown.toString() + 's 后重试' : '重新获取' }}
+ {{ errorMessage }}
+
+ {{ mode == 'phone' ? '密码登录' : '使用验证码登录' }}演示模式
+ 未发送真实短信,可输入任意 6 位数字体验。
+ 其他登录方式
+ 微信一键登录
+ ✓我已阅读并同意《用户协议》和《隐私政策》
- +86
- 密码
- 验证码{{ countdown > 0 ? countdown.toString() + 's' : '重新获取' }}
- {{ errorMessage }}
-
- 其他登录方式
-
-
-
- ✓我已阅读并同意《用户协议》和《隐私政策》
-
+
diff --git a/pages/matches/matches.uvue b/pages/matches/matches.uvue
index 4964992..d99b21e 100644
--- a/pages/matches/matches.uvue
+++ b/pages/matches/matches.uvue
@@ -1,18 +1,21 @@
-
- 综合排序额度高利率低
-
+
+ {{ item.label }}
+
- 正在为您匹配方案...
- {{ errorMessage }}
-
- {{ item.rank }}
-
- {{ item.bank }}个人信用贷 · 资料简{{ item.amount }}最高额度{{ item.rate }}年利率{{ item.term }}贷款期限
-
+ 正在匹配融资方案…
+ {{ errorMessage }}
+ 暂无可展示方案,请完善评估资料后重试
+
+ 共 {{ matches.length }} 个方案 · {{ isDemo ? '示例数据' : '按您的评估信息匹配' }}
+
+ {{ item.initials }}{{ item.bank }}个人信用融资{{ item.score }}%匹配
+ {{ item.amount }} 万最高额度{{ item.rate.toFixed(2) }}%年化利率(起){{ item.term }}贷款期限
+
+
- 匹配结果基于您的评估信息,实际额度以机构审批为准
+ 展示参数仅供参考,实际额度、利率及条件以机构审批为准。银行以文字简称标识。
@@ -21,48 +24,68 @@
diff --git a/pages/messages/messages.uvue b/pages/messages/messages.uvue
index 195db7c..5b5a229 100644
--- a/pages/messages/messages.uvue
+++ b/pages/messages/messages.uvue
@@ -1,10 +1,17 @@
- {{ item }}
-
+ {{ item }}
+
- {{ item.title }}{{ item.time }}{{ item.desc }}
+ {{ unreadCount > 0 ? unreadCount + ' 条未读消息' : '消息已全部阅读' }}全部已读
+
+
+
+ {{ item.title }}{{ item.time }}{{ item.desc }}{{ item.category }}
+
+
+
@@ -13,37 +20,62 @@
diff --git a/pages/news/news.uvue b/pages/news/news.uvue
index bd06191..23cc039 100644
--- a/pages/news/news.uvue
+++ b/pages/news/news.uvue
@@ -1,56 +1,66 @@
-
- {{ item }}
-
+
+
+ {{ item }}
+
+
- 政策速递普惠金融新政解读:小微企业迎来融资利好2026-09-08
- {{ item.title }}{{ item.summary }}{{ item.category }} · {{ item.date }}
- 暂无该分类新闻
+
+ 政策观察{{ headline.title }}{{ headline.date }}
+
+
+ {{ tab == '推荐' ? '最新资讯' : tab }}{{ filteredArticles.length }} 篇
+
+
+ {{ item.title }}{{ item.summary }}{{ item.category }} · {{ item.date }}
+
+
+
+
diff --git a/pages/points/points.uvue b/pages/points/points.uvue
index d1e4d64..64754ea 100644
--- a/pages/points/points.uvue
+++ b/pages/points/points.uvue
@@ -1,12 +1,31 @@
-
+
- 我的积分2680
- {{ item.name }}+{{ item.score }}
- 邀请有礼每邀请1位好友,双方都可获得积分我的邀请码AI2680复制
- 积分明细全部 ›{{ item.name }}{{ item.date }}+{{ item.score }}
+
+ 我的体验积分
+ {{ totalPoints }}本地体验 · 仅在本机记录
+
+
+
+
+ {{ item.id == 'checkin' && signedToday ? '已签到' : item.name }}
+ {{ item.id == 'checkin' && signedToday ? '明天再来' : item.caption }}
+
+
+
+ 与好友一起了解融资分享实用知识,提前做好申请准备。
+ 体验邀请码AI2680复制
+ 当前为本地体验,复制或分享不会发放积分。
+
+
+ 积分明细{{ recordsExpanded ? '收起' : '展开' }}
+
+ 还没有积分记录完成今日签到,获得 10 体验积分。
+ 每日签到{{ item.date }} · 本地体验+{{ item.score }}
+
+
@@ -14,42 +33,100 @@
diff --git a/pages/product/product.uvue b/pages/product/product.uvue
index d72d025..cb56b14 100644
--- a/pages/product/product.uvue
+++ b/pages/product/product.uvue
@@ -1,53 +1,95 @@
- 分享
-
+ 分享
+
- 招商银行·闪电贷个人信用贷 线上申请 快速放款
- 最高额度50万年利率3.85%贷款期限12-36期
- 产品优势{{ item }}
- 申请条件年龄要求22-55周岁工作要求现单位满6个月信用要求近两年无严重逾期
- 所需材料身份证 · 银行卡 · 收入证明
+ 正在加载产品…
+ {{ loadFailed ? '产品加载失败' : '暂未找到该产品' }}请重试或返回方案列表选择其他产品
+
+ {{ product.initials }}{{ product.bank }}个人信用融资 · {{ isDemo ? '示例产品' : '产品信息' }}
+ 最高额度{{ product.amount }}万年化利率(起){{ product.rate.toFixed(2) }}%贷款期限{{ product.term }}
+ 产品优势{{ item }}
+ 申请条件年龄要求{{ product.age }}工作要求{{ product.work }}信用要求{{ product.credit }}
+ 所需材料{{ product.materials }}
+ 额度、利率及申请条件仅供参考,以机构实际审批为准。{{ isDemo ? '当前可体验申请准备流程,尚未向机构提交资料。' : '' }}
+
-
+
diff --git a/pages/profile/profile.uvue b/pages/profile/profile.uvue
index 54ef0c8..e99da31 100644
--- a/pages/profile/profile.uvue
+++ b/pages/profile/profile.uvue
@@ -1,14 +1,13 @@
-
+
- 张张三138****8888已认证
- 1申请中3已匹配2680积分
-
-
+ {{ displayName }}{{ loggedIn ? maskedPhone : '登录后管理您的融资信息' }}{{ loggedIn ? '演示账户' : '未登录' }}
+ {{ completion }}%档案完整度{{ hasReport ? '已生成' : '暂无' }}评估报告积分中心
+
+
+ AI融资 · 让融资更简单
@@ -17,49 +16,63 @@
diff --git a/pages/report/report.uvue b/pages/report/report.uvue
index 549112c..a85b35b 100644
--- a/pages/report/report.uvue
+++ b/pages/report/report.uvue
@@ -3,9 +3,9 @@
- 综合评分85分优秀您的融资资质超过 82% 的用户
- 85还款能力收入稳定信用状况资产条件负债情况
- 评估结论您的资质整体良好,符合多家银行产品要求。建议额度6-36个月
+ 综合评分 · 示例报告85分良好从五个维度了解融资资质
+ 还款能力收入稳定信用状况资产条件负债情况
+ 评估结论示例资质整体良好,可进一步比较信用融资产品的额度、期限与还款安排。建议期限6–36个月本报告为体验示例,正式评估以授权资料和机构审核为准。
@@ -29,17 +29,19 @@
.score-unit { font-size: 28rpx; margin: 0 16rpx 14rpx 5rpx; }
.score-badge { padding: 8rpx 17rpx; border-radius: 10rpx; background-color: #e5f8ee; color: #0ba868; font-size: 22rpx; margin-bottom: 15rpx; }
.score-caption { color: #8793a6; font-size: 22rpx; margin-top: 6rpx; }
- .radar-panel { height: 500rpx; margin-top: 24rpx; border-radius: 18rpx; background-color: #fff; border: 1rpx solid #e7edf6; align-items: center; justify-content: center; position: relative; overflow: hidden; }
- .radar-image { width: 430rpx; height: 430rpx; }
+ .radar-panel { height: 370rpx; margin-top: 20rpx; border-radius: 18rpx; background-color: #fff; border: 1rpx solid #e7edf6; align-items: center; justify-content: center; position: relative; overflow: hidden; }
+ .radar-image { width: 340rpx; height: 310rpx; }
.radar-core { position: absolute; width: 92rpx; height: 92rpx; left: 50%; top: 50%; margin-left: -46rpx; margin-top: -46rpx; border-radius: 50%; background-color: #0868f7; align-items: center; justify-content: center; color: white; font-size: 34rpx; font-weight: 800; box-shadow: 0 0 32rpx rgba(8,104,247,.28); }
.radar-label { position: absolute; color: #58667b; font-size: 21rpx; }
.top { top: 28rpx; }
- .left { left: 27rpx; top: 224rpx; }
- .right { right: 27rpx; top: 224rpx; }
+ .left { left: 27rpx; top: 162rpx; }
+ .right { right: 27rpx; top: 162rpx; }
.bottom-left { left: 95rpx; bottom: 32rpx; }
.bottom-right { right: 86rpx; bottom: 32rpx; }
.conclusion { margin: 24rpx 0 32rpx; background-color: #fff; border-radius: 18rpx; padding: 28rpx; border: 1rpx solid #e7edf6; }
.conclusion-text { margin-top: 18rpx; font-size: 24rpx; color: #59677b; line-height: 42rpx; }
.suggest-row { margin-top: 24rpx; padding-top: 22rpx; border-top: 1rpx solid #edf1f6; flex-direction: row; justify-content: space-between; font-size: 25rpx; }
- .suggest-value { color: #0868f7; font-weight: 700; }
+ .suggest-value { color: #0868f7; font-size: 27rpx; font-weight: 700; }
+ .suggest-label { color: #53667f; font-size: 25rpx; }
+ .report-note { font-size: 21rpx; line-height: 34rpx; color: #78889e; margin-top: 20rpx; }
diff --git a/services/api.uts b/services/api.uts
index ab7cd78..5835dc4 100644
--- a/services/api.uts
+++ b/services/api.uts
@@ -1,4 +1,5 @@
/** Mobile API adapter with deterministic local mocks. */
+import { demoProducts, parseProduct, FinanceProduct } from '@/services/finance.uts'
export const API_BASE_URL = ''
const REQUEST_TIMEOUT = 10000
const SESSION_KEY = 'aiFinanceSession'
@@ -97,18 +98,24 @@ export async function submitAssessment(payload: UTSJSONObject): Promise
return id
}
-export async function fetchMatches(): Promise {
+export async function fetchMatches(): Promise {
if (API_BASE_URL.length == 0) {
await wait(320)
- return [
- { rank: 1, bank: '招商银行·闪电贷', amount: '50万', rate: '3.85%', term: '12-36期', score: 96 },
- { rank: 2, bank: '平安银行·新一贷', amount: '30万', rate: '4.20%', term: '12-60期', score: 91 },
- { rank: 3, bank: '建设银行·快e贷', amount: '20万', rate: '4.35%', term: '12-36期', score: 88 }
- ]
+ return demoProducts.slice()
}
const result = await requestJson('/matches', 'GET', new UTSJSONObject())
const items = result['items'] as UTSJSONObject[] | null
- return items == null ? [] : items
+ return items == null ? [] : items.map((item: UTSJSONObject): FinanceProduct => parseProduct(item))
+}
+
+export async function fetchProduct(id: string): Promise {
+ if (API_BASE_URL.length == 0) {
+ await wait(180)
+ const products = demoProducts.filter((item: FinanceProduct): boolean => item.id == id)
+ return products.length > 0 ? products[0] : null
+ }
+ const result = await requestJson('/products/' + encodeURIComponent(id), 'GET', new UTSJSONObject())
+ return parseProduct(result)
}
export async function sendAssistantMessage(message: string): Promise {
diff --git a/services/assessment.uts b/services/assessment.uts
new file mode 100644
index 0000000..b7bf643
--- /dev/null
+++ b/services/assessment.uts
@@ -0,0 +1,82 @@
+export type AssessmentForm = {
+ name: string, idCard: string, phone: string, city: string, maritalStatus: string,
+ occupation: string, company: string, monthlyIncome: string, socialSecurity: string,
+ housingFund: string, house: string, car: string, savings: string, creditCard: string,
+ otherAssets: string, enterpriseName: string, businessCode: string, annualRevenue: string, operatingYears: string
+}
+export type SelectedDocument = { name: string, path: string }
+export type DataAuthorization = { key: string, name: string, selected: boolean }
+
+export function emptyAssessmentForm(): AssessmentForm {
+ return { name: '', idCard: '', phone: '', city: '', maritalStatus: '', occupation: '', company: '', monthlyIncome: '', socialSecurity: '', housingFund: '', house: '', car: '', savings: '', creditCard: '', otherAssets: '', enterpriseName: '', businessCode: '', annualRevenue: '', operatingYears: '' }
+}
+export function draftText(saved: UTSJSONObject, key: string): string {
+ const value = saved[key]
+ return typeof value == 'string' ? value as string : ''
+}
+export function activeAssessmentType(): string {
+ const type = uni.getStorageSync('assessmentActiveType')
+ if (type == 'enterprise' || type == 'personal') return type as string
+ const legacy = uni.getStorageSync('assessmentDraft')
+ if (legacy != null && typeof legacy == 'object' && draftText(legacy as UTSJSONObject, 'type') == 'enterprise') return 'enterprise'
+ return 'personal'
+}
+export function loadAssessmentDraft(type: string): UTSJSONObject | null {
+ const scoped = uni.getStorageSync('assessmentDraft:' + type)
+ if (scoped != null && typeof scoped == 'object') return scoped as UTSJSONObject
+ const legacy = uni.getStorageSync('assessmentDraft')
+ if (legacy != null && typeof legacy == 'object') {
+ const saved = legacy as UTSJSONObject
+ if (draftText(saved, 'type') == type) return saved
+ }
+ return null
+}
+export function formFromDraft(saved: UTSJSONObject): AssessmentForm {
+ return {
+ name: draftText(saved, 'name'), idCard: draftText(saved, 'idCard'), phone: draftText(saved, 'phone'), city: draftText(saved, 'city'), maritalStatus: draftText(saved, 'maritalStatus'),
+ occupation: draftText(saved, 'occupation'), company: draftText(saved, 'company'), monthlyIncome: draftText(saved, 'monthlyIncome'), socialSecurity: draftText(saved, 'socialSecurity'), housingFund: draftText(saved, 'housingFund'),
+ house: draftText(saved, 'house'), car: draftText(saved, 'car'), savings: draftText(saved, 'savings'), creditCard: draftText(saved, 'creditCard'), otherAssets: draftText(saved, 'otherAssets'),
+ enterpriseName: draftText(saved, 'enterpriseName'), businessCode: draftText(saved, 'businessCode'), annualRevenue: draftText(saved, 'annualRevenue'), operatingYears: draftText(saved, 'operatingYears')
+ }
+}
+export function documentsFromDraft(saved: UTSJSONObject): SelectedDocument[] {
+ const results: SelectedDocument[] = []
+ const items = saved['documents'] as UTSJSONObject[] | null
+ if (items == null) return results
+ items.forEach((item) => {
+ const name = draftText(item, 'name'); const path = draftText(item, 'path')
+ if (name.length > 0 && path.length > 0) { const document: SelectedDocument = { name, path }; results.push(document) }
+ })
+ return results
+}
+export function saveAssessmentDraft(type: string, step: number, form: AssessmentForm, documents: SelectedDocument[], authorizations: DataAuthorization[], documentConsent: boolean, dataConsent: boolean): void {
+ const files: UTSJSONObject[] = documents.map((item): UTSJSONObject => ({ name: item.name, path: item.path }))
+ const grants: string[] = authorizations.filter((item) => item.selected).map((item) => item.key)
+ const payload: UTSJSONObject = {
+ type, step, name: form.name, idCard: form.idCard, phone: form.phone, city: form.city, maritalStatus: form.maritalStatus,
+ occupation: form.occupation, company: form.company, monthlyIncome: form.monthlyIncome, socialSecurity: form.socialSecurity, housingFund: form.housingFund,
+ house: form.house, car: form.car, savings: form.savings, creditCard: form.creditCard, otherAssets: form.otherAssets,
+ enterpriseName: form.enterpriseName, businessCode: form.businessCode, annualRevenue: form.annualRevenue, operatingYears: form.operatingYears,
+ documents: files, authorizations: grants, documentConsent, dataConsent
+ }
+ uni.setStorageSync('assessmentActiveType', type)
+ uni.setStorageSync('assessmentDraft:' + type, payload)
+ // 保留现有提交与档案入口读取的活动草稿。
+ uni.setStorageSync('assessmentDraft', payload)
+}
+export function showAgreementNotice(title: string): void {
+ uni.showModal({ title, content: '正式协议尚未配置。当前为功能演示,勾选仅记录本地选择,不会发起实名认证、查询外部数据或上传资料。正式服务开放前,将展示完整协议供您阅读与确认。', showCancel: false, confirmText: '我知道了' })
+}
+
+export type AssessmentProgress = { percent: number, basicDone: boolean, incomeDone: boolean, assetsDone: boolean, authorizationSelected: boolean }
+export function assessmentProgress(type: string): AssessmentProgress {
+ const saved = loadAssessmentDraft(type)
+ if (saved == null) return { percent: 0, basicDone: false, incomeDone: false, assetsDone: false, authorizationSelected: false }
+ const basic = type == 'enterprise' ? ['enterpriseName', 'businessCode', 'name', 'phone', 'city'] : ['name', 'idCard', 'phone', 'city', 'maritalStatus']
+ const income = type == 'enterprise' ? ['occupation', 'operatingYears', 'annualRevenue'] : ['occupation', 'company', 'monthlyIncome', 'socialSecurity', 'housingFund']
+ const assets = ['house', 'car', 'savings', 'creditCard']
+ const keys = basic.concat(income).concat(assets)
+ const filled = keys.filter((key) => draftText(saved, key).trim().length > 0).length
+ const grants = saved['authorizations'] as string[] | null
+ return { percent: Math.round(filled / keys.length * 100), basicDone: basic.every((key) => draftText(saved, key).length > 0), incomeDone: income.every((key) => draftText(saved, key).length > 0), assetsDone: assets.every((key) => draftText(saved, key).length > 0), authorizationSelected: documentsFromDraft(saved).length > 0 || (grants != null && grants.length > 0) }
+}
diff --git a/services/content.uts b/services/content.uts
new file mode 100644
index 0000000..11c8b2b
--- /dev/null
+++ b/services/content.uts
@@ -0,0 +1,104 @@
+export type ContentSection = { title: string, body: string }
+export type NewsArticle = {
+ id: string, title: string, summary: string, category: string,
+ date: string, source: string, readingTime: string, image: string, sections: ContentSection[]
+}
+export type FinanceLesson = {
+ id: string, title: string, desc: string, duration: string, tag: string,
+ image: string, intro: string, topics: string[], chapters: ContentSection[]
+}
+
+// 新闻与课程独立建模,接入后端时可分别替换为对应接口。
+export const newsArticles: NewsArticle[] = [
+ {
+ id: 'inclusive-finance', title: '普惠金融政策,企业申请前应关注什么?',
+ summary: '看清适用主体、申请条件与材料要求,找到适合企业的支持方式。', category: '政策解读',
+ date: '2026-09-08', source: 'AI融资编辑整理', readingTime: '4 分钟', image: '/static/mobile/images/news-city.png',
+ sections: [
+ { title: '先核对政策适用范围', body: '普惠金融支持措施通常对经营主体、企业规模和经营所在地设有适用条件。阅读政策时,先核对发文机构、生效时间与适用范围,再确认企业是否满足基本要求。' },
+ { title: '区分贷款、担保与贴息', body: '信贷产品、融资担保和财政贴息的申请渠道与审核流程可能不同。获得政策支持不等于贷款必然获批,额度、利率和期限仍需以金融机构的实际审核结果为准。' },
+ { title: '从官方渠道核实并准备资料', body: '建议通过当地政府、金融管理部门或银行官方网站核实细则,准备营业执照、经营流水、纳税记录与资金用途说明。本文提供阅读方法,不代表具体政策承诺。' }
+ ]
+ },
+ {
+ id: 'personal-credit', title: '申请个人信用融资,先核对这三项信息',
+ summary: '征信记录、收入稳定性与现有负债,是申请前的重点检查项。', category: '个人融资',
+ date: '2026-09-05', source: 'AI融资编辑整理', readingTime: '3 分钟', image: '/static/mobile/images/news-calculator.png',
+ sections: [
+ { title: '查看信用记录是否准确', body: '通过官方渠道查询个人信用报告,核对账户、还款记录与查询记录。发现错误信息时,应通过正规异议渠道处理,不轻信付费“修复征信”承诺。' },
+ { title: '整理可以核验的收入证明', body: '根据职业情况整理工资流水、经营收款、社保或纳税记录,确保填写的收入与材料一致。不同机构认可的材料范围有所不同,请以申请页面或机构说明为准。' },
+ { title: '量力确定额度与月供', body: '将现有贷款和信用卡应还金额纳入每月支出,再评估新增还款是否可持续。避免为尝试额度而短期内集中向多家机构提交申请。' }
+ ]
+ },
+ {
+ id: 'loan-comparison', title: '比较融资产品时,别只看宣传利率',
+ summary: '年化利率、附加费用与还款方式,需要放在一起比较。', category: '个人融资',
+ date: '2026-09-03', source: 'AI融资编辑整理', readingTime: '3 分钟', image: '/static/mobile/images/news-city.png',
+ sections: [
+ { title: '先统一利率口径', body: '日利率、月利率与年化利率并不是同一个口径。比较时应查看机构披露的年化利率及计算方式,尤其注意“低至”利率所附的适用条件。' },
+ { title: '将费用计入总成本', body: '核对合同是否包含担保费、服务费等支出,以及提前还款是否有额外费用。应以正式合同、还款计划和实际审核结果为准。' },
+ { title: '让还款安排匹配现金流', body: '等额本息、等额本金、先息后本的还款节奏各不相同。除了总利息,还应关注每期应还金额和到期本金,避免因最后一期集中还款造成压力。' }
+ ]
+ },
+ {
+ id: 'business-documents', title: '小微企业融资:常见材料如何提前整理',
+ summary: '按主体、经营和用途三类整理资料,减少补充沟通。', category: '企业融资',
+ date: '2026-08-30', source: 'AI融资编辑整理', readingTime: '4 分钟', image: '/static/mobile/images/news-business.png',
+ sections: [
+ { title: '主体资料保持一致', body: '核对营业执照、实际经营地址、法定代表人及联系人信息。涉及经营主体或股权变更时,准备相应说明,避免不同材料之间的信息不一致。' },
+ { title: '整理持续经营的证明', body: '经营流水、纳税记录、采购或销售合同可以帮助机构了解业务情况。按照时间顺序整理,并区分经营性收入、借款与其他往来款。' },
+ { title: '说明资金用途与还款来源', body: '将资金需求对应到采购、周转或设备投入等具体用途,并准备与之匹配的凭证。不同机构要求不同,正式提交前请核对其最新材料清单。' }
+ ]
+ }
+]
+
+export const financeLessons: FinanceLesson[] = [
+ {
+ id: 'credit-basics', title: '个人信用申请准备课', desc: '用三步梳理信用、收入与负债', duration: '6 分钟',
+ tag: '个人融资', image: '/static/mobile/images/news-calculator.png', topics: ['credit', 'documents'],
+ intro: '从自己的实际情况出发,建立一份清晰的申请前检查清单。完成每一节阅读后,可手动记录学习进度。',
+ chapters: [
+ { title: '读懂自己的信用记录', body: '先通过官方渠道获取个人信用报告,核对账户数量、当前负债与还款记录。\n\n对确有错误的信息,按官方异议流程申请核查;真实的不良记录不能通过付费承诺消除。\n\n本节练习:记录需要核对的账户,并确认最近的还款安排。' },
+ { title: '整理收入与还款支出', body: '把稳定收入、必要生活支出及已有月供分别列出,观察每月可用于新增还款的资金是否充足。\n\n奖金、临时收入与不确定的经营回款不宜直接视为稳定收入。预留应急资金也有助于避免还款压力。\n\n本节练习:用最近几个月的实际流水,估算可持续的月供范围。' },
+ { title: '核对材料并选择申请渠道', body: '按照目标机构的清单准备身份证明、收入证明及相关授权,检查姓名、工作与收入信息是否一致。\n\n通过银行或持牌机构的官方渠道申请,不向不明个人账户支付所谓“保证通过”的费用。审批结果以机构审核为准。\n\n本节练习:列出已准备和待补充的材料,提交前再核对一次。' }
+ ]
+ },
+ {
+ id: 'business-checklist', title: '小微经营融资准备课', desc: '把经营情况整理成完整材料清单', duration: '8 分钟',
+ tag: '企业融资', image: '/static/mobile/images/news-business.png', topics: ['business', 'documents'],
+ intro: '围绕真实经营、资金用途和还款来源,分步骤整理企业融资所需的信息。具体材料要求以申请机构为准。',
+ chapters: [
+ { title: '核对企业主体与经营信息', body: '核对营业执照、经营地址、法定代表人与实际控制人信息,确保材料在有效期内。\n\n介绍企业业务时,可以说明主要产品、客户类型和经营年限。信息以真实经营情况为准,无需为了申请夸大规模。\n\n本节练习:核对主体证件与申请表中各项信息是否一致。' },
+ { title: '归集流水与纳税记录', body: '按照申请机构要求的时间范围整理经营账户流水、纳税记录和业务合同。将经营收入与借款、股东往来等款项区分开。\n\n对季节性波动或较大的单笔交易,准备可核验的业务说明,帮助机构理解经营现金流。\n\n本节练习:按月份归档资料,标记需要补充解释的收支。' },
+ { title: '写清资金用途与还款计划', body: '将需求拆解为采购、订单周转或设备投入等实际用途,并评估资金回笼时间。\n\n融资期限应尽量与经营周期相匹配,避免依赖不确定的下一笔借款偿还到期本金。\n\n本节练习:写下所需金额、预计使用时间与还款来源。' },
+ { title: '检查授权范围与提交清单', body: '提交前阅读数据授权说明,确认授权对象、用途、范围与期限。不要将账户密码、短信验证码交给不明中介。\n\n将所有附件与机构清单逐项比对,保留提交记录,后续按机构通知补充材料。\n\n本节练习:完成材料清单核对,并确认使用的是官方申请渠道。' }
+ ]
+ },
+ {
+ id: 'loan-cost', title: '利率与还款方式入门', desc: '看懂总成本,选好还款节奏', duration: '5 分钟',
+ tag: '基础知识', image: '/static/mobile/images/news-policy.png', topics: ['credit', 'business'],
+ intro: '把利率、期限和还款方式放在一起理解,学会用统一口径比较融资方案。',
+ chapters: [
+ { title: '比较利率先看口径', body: '比较产品时,优先查看正式披露的年化利率及计算方式。日息、月息或“每万元每天几元”的宣传表达不能直接互相比高低。\n\n实际适用利率通常与审核结果相关,页面显示的最低利率不代表每个人都能获得。\n\n本节练习:找到一份产品说明中的年化利率、适用条件与费用说明。' },
+ { title: '认识不同的还款节奏', body: '等额本息通常每期还款额相近;等额本金的本金部分相同,随着剩余本金减少,利息逐步降低。\n\n先息后本需要在到期时集中偿还本金。每月压力较小并不意味着到期压力也小,应提前规划本金来源。\n\n本节练习:对照还款计划,找出金额最大的一期。' },
+ { title: '把费用与现金流一起算', body: '核对担保费、服务费与提前还款规则,将必要费用计入总成本。比较方案时还要统一金额与期限。\n\n选择能被自身现金流持续覆盖的还款安排,不只追求额度或最长的期限。最终以合同约定和实际审核结果为准。\n\n本节练习:记录总还款额、每期应还金额及提前还款条件。' }
+ ]
+ }
+]
+
+export function findNewsArticle(id: string, legacyTitle: string): NewsArticle | null {
+ let articleId = id
+ if (legacyTitle == 'headline' || legacyTitle == '普惠金融新政解读' || legacyTitle == '普惠金融新政解读:小微企业迎来融资利好') articleId = 'inclusive-finance'
+ if (legacyTitle == '如何提高个人贷款通过率') articleId = 'personal-credit'
+ if (legacyTitle == '银行最新贷款产品汇总') articleId = 'loan-comparison'
+ if (legacyTitle == '小微企业融资材料清单') articleId = 'business-documents'
+ return newsArticles.find((item: NewsArticle): boolean => item.id == articleId || item.title == legacyTitle) ?? null
+}
+
+export function findFinanceLesson(id: string, legacyTitle: string): FinanceLesson | null {
+ let lessonId = id
+ if (id == '0' || legacyTitle == '个人信用提升' || legacyTitle == '如何提高个人贷款通过率') lessonId = 'credit-basics'
+ if (id == '1' || legacyTitle == '小微经营融资' || legacyTitle == '材料准备清单' || legacyTitle == '小微企业融资材料清单') lessonId = 'business-checklist'
+ if (id == '2' || legacyTitle == '读懂贷款利率与还款方式') lessonId = 'loan-cost'
+ return financeLessons.find((item: FinanceLesson): boolean => item.id == lessonId || item.title == legacyTitle) ?? null
+}
diff --git a/services/finance.uts b/services/finance.uts
new file mode 100644
index 0000000..6b12ab3
--- /dev/null
+++ b/services/finance.uts
@@ -0,0 +1,24 @@
+export type FinanceProduct = {
+ id: string, bank: string, initials: string, color: string,
+ amount: number, rate: number, term: string, score: number,
+ advantages: string[], age: string, work: string, credit: string, materials: string
+}
+
+// 列表和详情共用产品标识;正式数据由 API 适配层提供。
+export const demoProducts: FinanceProduct[] = [
+ { id: '1', bank: '招商银行·闪电贷', initials: '招', color: '#c93547', amount: 50, rate: 3.85, term: '12–36个月', score: 96, advantages: ['线上申请', '无需抵押', '额度循环', '还款灵活'], age: '22–55周岁', work: '现单位工作满6个月', credit: '近两年无严重逾期', materials: '身份证 · 银行卡 · 收入证明' },
+ { id: '2', bank: '平安银行·新一贷', initials: '平', color: '#ed7924', amount: 30, rate: 4.20, term: '12–60个月', score: 91, advantages: ['信用融资', '期限可选', '在线预审', '无需担保'], age: '23–55周岁', work: '有稳定工作或经营收入', credit: '征信记录良好', materials: '身份证 · 收入证明 · 居住证明' },
+ { id: '3', bank: '建设银行·快e贷', initials: '建', color: '#2869b7', amount: 20, rate: 4.35, term: '12–36个月', score: 88, advantages: ['线上办理', '便捷用款', '信用授信', '支持提前还款'], age: '22–60周岁', work: '有稳定收入来源', credit: '符合机构信用要求', materials: '身份证 · 银行卡 · 资产或收入证明' }
+]
+
+export function parseProduct(item: UTSJSONObject): FinanceProduct {
+ return {
+ id: item['id'] as string ?? '', bank: item['bank'] as string ?? '融资产品',
+ initials: item['initials'] as string ?? '融', color: item['color'] as string ?? '#2869b7',
+ amount: item['amount'] as number ?? 0, rate: item['rate'] as number ?? 0,
+ term: item['term'] as string ?? '以审批为准', score: item['score'] as number ?? 0,
+ advantages: item['advantages'] as string[] ?? [], age: item['age'] as string ?? '以机构要求为准',
+ work: item['work'] as string ?? '以机构要求为准', credit: item['credit'] as string ?? '以机构要求为准',
+ materials: item['materials'] as string ?? '以机构要求为准'
+ }
+}
diff --git a/static/icons/chevron-circle.svg b/static/icons/chevron-circle.svg
index dc8b1bb..4788b42 100644
--- a/static/icons/chevron-circle.svg
+++ b/static/icons/chevron-circle.svg
@@ -1 +1 @@
-
+