version temp

This commit is contained in:
2025-10-24 14:39:32 +08:00
parent ff5cb63960
commit c1dd5551f0
30 changed files with 556 additions and 304 deletions

View File

@@ -14,15 +14,15 @@
<!-- 基础SEO信息 --> <!-- 基础SEO信息 -->
<title> <title>
天远数据 - 大数据风险报告 | 婚姻状况查询 | 个人信用 | 企业风险 | 免费代理 天远数据大数据风险报告查询与代理平台,支持个人和企业多场景风控应用
</title> </title>
<meta <meta
name="description" name="description"
content="天远数据,大数据风险报告查询与代理管理平台,提供婚姻状况查询、个人信用评估、人事背调、信贷风控、企业风险监测等服务,支持免费开通代理,助力个人与企业全方位风险管理。" content="天远数据,专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用,免费开通代理权限,助力高效识别信用与风险。"
/> />
<meta <meta
name="keywords" name="keywords"
content="大数据风险报告, 婚姻状况查询, 个人信用, 企业风险, 信贷风控, 人事背调, 大数据分析, 免费代理, 风险管控" content="大数据风险报告查询、大数据风险评估、大数据分析报告、个人大数据风险查询、小微企业风险、贷前风险背调、代理管理平台、免费开通代理、风险管控平台、信用风险分析、企业风险报告、贷前信用审核、失信人名单查询、被执行人信息、信用黑名单查询"
/> />
<meta name="author" content="天远数据" /> <meta name="author" content="天远数据" />
<meta name="robots" content="index, follow" /> <meta name="robots" content="index, follow" />
@@ -32,16 +32,16 @@
<!-- Open Graph / Facebook --> <!-- Open Graph / Facebook -->
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:url" content="https://www.zhinengcha.cn/" /> <meta property="og:url" content="https://www.zhinengcha.cn/" />
<meta property="og:title" content="天远数据 - 大数据风险报告 | 婚姻状况查询 | 个人信用 | 企业风险 | 免费代理" /> <meta property="og:title" content="天远数据大数据风险报告查询与代理平台,支持个人和企业多场景风控应用" />
<meta property="og:description" content="天远数据,大数据风险报告查询与代理管理平台,提供婚姻状况查询、个人信用评估、人事背调、信贷风控、企业风险监测等服务,支持免费开通代理,助力个人与企业全方位风险管理。" /> <meta property="og:description" content="天远数据,专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用,免费开通代理权限,助力高效识别信用与风险。" />
<meta property="og:site_name" content="天远数据" /> <meta property="og:site_name" content="天远数据" />
<meta property="og:locale" content="zh_CN" /> <meta property="og:locale" content="zh_CN" />
<!-- Twitter --> <!-- Twitter -->
<meta property="twitter:card" content="summary" /> <meta property="twitter:card" content="summary" />
<meta property="twitter:url" content="https://www.zhinengcha.cn/" /> <meta property="twitter:url" content="https://www.zhinengcha.cn/" />
<meta property="twitter:title" content="天远数据 - 大数据风险报告 | 婚姻状况查询 | 个人信用 | 企业风险 | 免费代理" /> <meta property="twitter:title" content="天远数据大数据风险报告查询与代理平台,支持个人和企业多场景风控应用" />
<meta property="twitter:description" content="天远数据,大数据风险报告查询与代理管理平台,提供婚姻状况查询、个人信用评估、人事背调、信贷风控、企业风险监测等服务,支持免费开通代理,助力个人与企业全方位风险管理。" /> <meta property="twitter:description" content="天远数据,专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用,免费开通代理权限,助力高效识别信用与风险。" />
<!-- 其他重要meta标签 --> <!-- 其他重要meta标签 -->
<meta name="theme-color" content="#3498db" /> <meta name="theme-color" content="#3498db" />
@@ -58,7 +58,7 @@
"@type": "WebSite", "@type": "WebSite",
"name": "天远数据", "name": "天远数据",
"url": "https://www.zhinengcha.cn/", "url": "https://www.zhinengcha.cn/",
"description": "大数据风险报告查询与代理管理平台,提供婚姻状况查询、个人信用评估、人事背调、信贷风控、企业风险监测等服务", "description": "专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用",
"potentialAction": { "potentialAction": {
"@type": "SearchAction", "@type": "SearchAction",
"target": "https://www.zhinengcha.cn/search?q={search_term_string}", "target": "https://www.zhinengcha.cn/search?q={search_term_string}",
@@ -73,7 +73,7 @@
"@type": "Organization", "@type": "Organization",
"name": "天远数据", "name": "天远数据",
"url": "https://www.zhinengcha.cn/", "url": "https://www.zhinengcha.cn/",
"description": "大数据风险报告查询与代理管理平台" "description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
} }
</script> </script>

View File

@@ -1,7 +1,7 @@
{ {
"name": "天远数据 - 大数据风险报告查询与代理管理平台", "name": "天远数据大数据风险报告查询与代理平台,支持个人和企业多场景风控应用",
"short_name": "天远数据", "short_name": "天远数据",
"description": "大数据风险报告查询与代理管理平台,提供婚姻状况查询、个人信用评估、人事背调、信贷风控、企业风险监测等服务", "description": "专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用",
"start_url": "/", "start_url": "/",
"display": "standalone", "display": "standalone",
"background_color": "#ffffff", "background_color": "#ffffff",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

View File

@@ -92,6 +92,7 @@ declare global {
const shallowReactive: typeof import('vue')['shallowReactive'] const shallowReactive: typeof import('vue')['shallowReactive']
const shallowReadonly: typeof import('vue')['shallowReadonly'] const shallowReadonly: typeof import('vue')['shallowReadonly']
const shallowRef: typeof import('vue')['shallowRef'] const shallowRef: typeof import('vue')['shallowRef']
const showConfirmDialog: typeof import('vant/es')['showConfirmDialog']
const showLoadingToast: typeof import('vant/es')['showLoadingToast'] const showLoadingToast: typeof import('vant/es')['showLoadingToast']
const showToast: typeof import('vant/es')['showToast'] const showToast: typeof import('vant/es')['showToast']
const syncRef: typeof import('@vueuse/core')['syncRef'] const syncRef: typeof import('@vueuse/core')['syncRef']

View File

@@ -81,7 +81,8 @@ const processedReportData = computed(() => {
// 拆分CQYGL3F8E数据 // 拆分CQYGL3F8E数据
data = splitCQYGL3F8EForTabs(data); data = splitCQYGL3F8EForTabs(data);
return data; // 过滤掉在featureMap中没有对应的项
return data.filter(item => featureMap[item.data.apiID]);
}); });
watch(reportData, () => { watch(reportData, () => {
@@ -93,6 +94,12 @@ const featureMap = {
component: defineAsyncComponent(() => import("@/ui/CIVYZ5733.vue")), component: defineAsyncComponent(() => import("@/ui/CIVYZ5733.vue")),
remark: '查询结果为"未婚或尚未登记结婚"时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异。如您对查询结果有疑问,请联系客服反馈。', remark: '查询结果为"未婚或尚未登记结婚"时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异。如您对查询结果有疑问,请联系客服反馈。',
}, },
// IVYZ81NC
IVYZ81NC: {
name: "婚姻状况",
component: defineAsyncComponent(() => import("@/ui/CIVYZ81NC.vue")),
remark: '查询结果为"未婚或尚未登记结婚"时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异。如您对查询结果有疑问,请联系客服反馈。',
},
JRZQ0A03: { JRZQ0A03: {
name: "借贷申请记录", name: "借贷申请记录",
component: defineAsyncComponent(() => component: defineAsyncComponent(() =>
@@ -196,13 +203,13 @@ const featureMap = {
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/RiskWarning.vue")), component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/RiskWarning.vue")),
}, },
DWBG8B4D_OverdueRisk: { DWBG8B4D_OverdueRisk: {
name: "逾期风险产品", name: "逾期风险综述",
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/OverdueRiskSection.vue")), component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/OverdueRiskSection.vue")),
}, },
DWBG8B4D_CourtInfo: { // DWBG8B4D_CourtInfo: {
name: "法院曝光台信息", // name: "法院曝光台信息",
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/MultCourtInfoSection.vue")), // component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/MultCourtInfoSection.vue")),
}, // },
DWBG8B4D_LoanEvaluation: { DWBG8B4D_LoanEvaluation: {
name: "借贷评估", name: "借贷评估",
component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/LoanEvaluationSection.vue")), component: defineAsyncComponent(() => import("@/ui/CDWBG8B4D/components/LoanEvaluationSection.vue")),
@@ -288,10 +295,10 @@ const featureMap = {
name: "关联风险监督", name: "关联风险监督",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/RiskSupervisionSection.vue")), component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/RiskSupervisionSection.vue")),
}, },
DWBG6A2C_CourtRiskInfo: { // DWBG6A2C_CourtRiskInfo: {
name: "法院风险信息", // name: "法院风险信息",
component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/CourtRiskInfoSection.vue")), // component: defineAsyncComponent(() => import("@/ui/DWBG6A2C/components/CourtRiskInfoSection.vue")),
}, // },
// 贷款风险报告 // 贷款风险报告
JRZQ5E9F: { JRZQ5E9F: {
name: "贷款风险评估", name: "贷款风险评估",
@@ -780,7 +787,7 @@ const calculateScore = (reportData) => {
<span class="text-gray-600">{{ <span class="text-gray-600">{{
reportDateTime || reportDateTime ||
"2025-01-01 12:00:00" "2025-01-01 12:00:00"
}}</span> }}</span>
</div> </div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="!isEmpty"> <div class="flex justify-between border-b pb-2 pl-2" v-if="!isEmpty">
<span class="text-gray-700 font-bold">报告项目</span> <span class="text-gray-700 font-bold">报告项目</span>
@@ -879,22 +886,18 @@ const calculateScore = (reportData) => {
<div class="card"> <div class="card">
<div> <div>
<div class="text-bold text-blue-500 mb-2"> <div class="text-bold text-blue-500 mb-2">
报告说 免责声
</div> </div>
<div>
&nbsp;
&nbsp;本报告的数据由用户本人明确授权后我们才向相关合法存有用户个人数据的机构调取本报告相关内容本平台只做大数据的获取与分析仅向用户个人展示参考
</div>
<p>
&nbsp; &nbsp; 报告有效期<strong class="text-red-500">30</strong>过期自动删除
</p>
<p> <p>
&nbsp; &nbsp; &nbsp; &nbsp;
若您的数据不全面可能是数据具有延迟性或者合作信息机构未获取到您的数据若数据有错误请联系客服 1本份报告是在取得您个人授权后我们才向合法存有您以上个人信息机构去调取相关内容我们不会以任何形式对您的报告进行存储除您和您授权的人外不会提供给任何人和机构进行查看
</p> </p>
<p> <p>
&nbsp; &nbsp; &nbsp; 2本报告自生成之日起有效期 <strong class="text-red-500">30
&nbsp;本产品所有数据均来自第三方可能部分数据未公开数据更新延迟或信息受到限制贵司不对数据的准确性真实性完整性做任何承诺用户需根据实际情况结合报告内容自行判断与决策 </strong>过期自动删除如果您对本份报告存有异议可能是合作机构数据有延迟或未能获取到您的相关数据出于合作平台数据隐私的保护本平台将不做任何解释
</p>
<p>
&nbsp; &nbsp; 3若以上数据有错误请联系平台客服
</p> </p>
</div> </div>
</div> </div>

View File

@@ -23,7 +23,7 @@
<button class="refresh-btn" @click="refreshCaptcha" :disabled="isRefreshing"> <button class="refresh-btn" @click="refreshCaptcha" :disabled="isRefreshing">
{{ isRefreshing ? '刷新中...' : '刷新验证' }} {{ isRefreshing ? '刷新中...' : '刷新验证' }}
</button> </button>
<button class="confirm-btn" :disabled="clickedList.length < 3 || !!successMessage" @click="handleConfirm"> <button class="confirm-btn" :disabled="clickedList.length < 4 || !!successMessage" @click="handleConfirm">
确认 确认
</button> </button>
</div> </div>
@@ -47,8 +47,8 @@ const canvasWidth = 300
const canvasHeight = 180 const canvasHeight = 180
const bgImgUrl = '/image/clickCaptcha.jpg' // 可替换为任意背景图 const bgImgUrl = '/image/clickCaptcha.jpg' // 可替换为任意背景图
const allChars = ['大', '数', '据', '', '', '风', '险', '报', '告'] const allChars = ['大', '数', '据', '', '', '风', '险', '报', '告']
const targetChars = ref(['', '数', '据']) // 目标点击顺序固定 const targetChars = ref(['天', '远', '数', '据']) // 目标点击顺序固定
const charPositions = ref([]) // [{char, x, y, w, h}] const charPositions = ref([]) // [{char, x, y, w, h}]
const clickedIndex = ref(0) const clickedIndex = ref(0)
const errorMessage = ref('') const errorMessage = ref('')
@@ -134,7 +134,7 @@ function generateCaptcha() {
;[chars[i], chars[j]] = [chars[j], chars[i]] ;[chars[i], chars[j]] = [chars[j], chars[i]]
} }
currentChars = chars currentChars = chars
targetChars.value = ['', '数', '据'] targetChars.value = ['天', '远', '数', '据']
clickedIndex.value = 0 clickedIndex.value = 0
errorMessage.value = '' errorMessage.value = ''
successMessage.value = '' successMessage.value = ''
@@ -190,16 +190,16 @@ function handleCanvasClick(e) {
} }
function handleConfirm() { function handleConfirm() {
if (clickedList.value.length < 3) { if (clickedList.value.length < 4) {
errorMessage.value = '请依次点击3个字' errorMessage.value = '请依次点击4个字'
setTimeout(() => (errorMessage.value = ''), 1200) setTimeout(() => (errorMessage.value = ''), 1200)
return return
} }
const userSeq = clickedList.value const userSeq = clickedList.value
.slice(0, 3) .slice(0, 4)
.map(item => item.char) .map(item => item.char)
.join('') .join('')
if (userSeq === '数据') { if (userSeq === '天远数据') {
successMessage.value = '验证成功!' successMessage.value = '验证成功!'
setTimeout(() => emit('success'), 600) setTimeout(() => emit('success'), 600)
} else { } else {

View File

@@ -92,12 +92,7 @@ const qrCodePositions = ref({
// promote模式的配置 (tg_qrcode) // promote模式的配置 (tg_qrcode)
promote: [ promote: [
{ x: 180, y: 1440, size: 300 }, // tg_qrcode_1.png { x: 180, y: 1440, size: 300 }, // tg_qrcode_1.png
{ x: 525, y: 1955, size: 500 }, // tg_qrcode_2.jpg
{ x: 525, y: 1955, size: 500 }, // tg_qrcode_3.jpg
{ x: 525, y: 1955, size: 500 }, // tg_qrcode_4.jpg { x: 525, y: 1955, size: 500 }, // tg_qrcode_4.jpg
{ x: 525, y: 1955, size: 500 }, // tg_qrcode_5.jpg
{ x: 525, y: 1955, size: 500 }, // tg_qrcode_6.jpg
{ x: 255, y: 940, size: 250 }, // tg_qrcode_7.jpg
{ x: 255, y: 940, size: 250 }, // tg_qrcode_8.jpg { x: 255, y: 940, size: 250 }, // tg_qrcode_8.jpg
], ],
// invitation模式的配置 (yq_qrcode) // invitation模式的配置 (yq_qrcode)
@@ -119,11 +114,11 @@ const loadPosterImages = async () => {
const images = []; const images = [];
const basePrefix = mode.value === "promote" ? "tg_qrcode_" : "yq_qrcode_"; const basePrefix = mode.value === "promote" ? "tg_qrcode_" : "yq_qrcode_";
// 根据模式确定要加载的图片数量 // 根据模式确定要加载的图片编号
const imageCount = mode.value === "promote" ? 8 : 1; const imageNumbers = mode.value === "promote" ? [1, 4, 8] : [1];
// 加载图片 // 加载图片
for (let i = 1; i <= imageCount; i++) { for (const i of imageNumbers) {
// 尝试加载 .png 文件 // 尝试加载 .png 文件
try { try {
const module = await import( const module = await import(

View File

@@ -6,9 +6,9 @@ export function useSEO() {
// 默认SEO信息 // 默认SEO信息
const defaultSEO = { const defaultSEO = {
title: '天远数据 - 大数据风险报告 | 婚姻状况查询 | 个人信用 | 企业风险 | 免费代理', title: '天远数据大数据风险报告查询与代理平台,支持个人和企业多场景风控应用',
description: '天远数据,大数据风险报告查询与代理管理平台,提供婚姻状况查询、个人信用评估、人事背调、信贷风控、企业风险监测等服务,支持免费开通代理,助力个人与企业全方位风险管理。', description: '天远数据,专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用,免费开通代理权限,助力高效识别信用与风险。',
keywords: '大数据风险报告, 婚姻状况查询, 个人信用, 企业风险, 信贷风控, 人事背调, 大数据分析, 免费代理, 风险管控', keywords: '大数据风险报告查询、大数据风险评估、大数据分析报告、个人大数据风险查询、小微企业风险、贷前风险背调、代理管理平台、免费开通代理、风险管控平台、信用风险分析、企业风险报告、贷前信用审核、失信人名单查询、被执行人信息、信用黑名单查询',
url: 'https://www.zhinengcha.cn' url: 'https://www.zhinengcha.cn'
} }
@@ -132,7 +132,7 @@ export function useSEO() {
"@type": "Organization", "@type": "Organization",
"name": "天远数据", "name": "天远数据",
"url": "https://www.zhinengcha.cn/", "url": "https://www.zhinengcha.cn/",
"description": "大数据风险报告查询与代理管理平台" "description": "专业大数据风险报告查询与代理平台,支持个人和企业多场景风控应用"
} }
} }
@@ -146,9 +146,9 @@ export function useSEO() {
const updateSEOByRoute = () => { const updateSEOByRoute = () => {
const routeConfigs = { const routeConfigs = {
'/': { '/': {
title: '天远数据 - 大数据风险报告 | 婚姻状况查询 | 个人信用 | 企业风险 | 免费代理', title: '天远数据大数据风险报告查询与代理平台,支持个人和企业多场景风控应用',
description: '天远数据,大数据风险报告查询与代理管理平台,提供婚姻状况查询、个人信用评估、人事背调、信贷风控、企业风险监测等服务,支持免费开通代理,助力个人与企业全方位风险管理。', description: '天远数据,专业大数据风险报告查询与代理平台,支持个人信用查询、小微企业风控、贷前风险背调等多场景报告应用,免费开通代理权限,助力高效识别信用与风险。',
keywords: '大数据风险报告, 婚姻状况查询, 个人信用, 企业风险, 信贷风控, 人事背调, 大数据分析, 免费代理, 风险管控' keywords: '大数据风险报告查询、大数据风险评估、大数据分析报告、个人大数据风险查询、小微企业风险、贷前风险背调、代理管理平台、免费开通代理、风险管控平台、信用风险分析、企业风险报告、贷前信用审核、失信人名单查询、被执行人信息、信用黑名单查询'
}, },
'/agent': { '/agent': {
title: '天远数据代理 - 免费开通代理权限 | 大数据风险报告代理', title: '天远数据代理 - 免费开通代理权限 | 大数据风险报告代理',

View File

@@ -2,11 +2,7 @@
<div class="home-layout min-h-screen flex flex-col"> <div class="home-layout min-h-screen flex flex-col">
<!-- Header --> <!-- Header -->
<div class="header"> <div class="header">
<img <img class="logo rounded-full overflow-hidden" src="/logo.jpg" alt="Logo" />
class="logo rounded-full overflow-hidden"
src="/logo.jpg"
alt="Logo"
/>
<div class="title">天远数据</div> <div class="title">天远数据</div>
</div> </div>
@@ -18,12 +14,8 @@
<!-- Vant Tabbar --> <!-- Vant Tabbar -->
<van-tabbar v-model="tabbar" @change="tabChange"> <van-tabbar v-model="tabbar" @change="tabChange">
<van-tabbar-item <van-tabbar-item v-for="(item, index) in menu" :key="index" :name="item.name" :icon="item.icon">{{
v-for="(item, index) in menu" item.title }}
:key="index"
:name="item.name"
:icon="item.icon"
>{{ item.title }}
</van-tabbar-item> </van-tabbar-item>
</van-tabbar> </van-tabbar>
@@ -35,11 +27,7 @@
<div class="disclaimer"> <div class="disclaimer">
<div class="flex flex-col items-center"> <div class="flex flex-col items-center">
<div class="flex items-center"> <div class="flex items-center">
<img <img class="w-4 h-4 mr-2" src="@/assets/images/public_security_record_icon.png" alt="公安备案" />
class="w-4 h-4 mr-2"
src="@/assets/images/public_security_record_icon.png"
alt="公安备案"
/>
<text>琼公网安备46010002000584号</text> <text>琼公网安备46010002000584号</text>
</div> </div>
<div> <div>
@@ -54,7 +42,7 @@
</template> </template>
<script setup> <script setup>
import { ref, reactive, onMounted } from "vue"; import { ref, reactive, onMounted, watch } from "vue";
import { useRoute, useRouter } from "vue-router"; // 引入 Vue Router import { useRoute, useRouter } from "vue-router"; // 引入 Vue Router
const router = useRouter(); const router = useRouter();
@@ -62,7 +50,7 @@ const route = useRoute();
const tabbar = ref("index"); const tabbar = ref("index");
const menu = reactive([ const menu = reactive([
{ title: "首页", icon: "home-o", name: "index" }, { title: "首页", icon: "home-o", name: "index" },
{ title: "推广", icon: "fire-o", name: "promote" }, { title: "更多", icon: "more-o", name: "more" },
{ title: "资产", icon: "gold-coin-o", name: "agent" }, { title: "资产", icon: "gold-coin-o", name: "agent" },
{ title: "我的", icon: "user-o", name: "me" } { title: "我的", icon: "user-o", name: "me" }
]); ]);
@@ -73,16 +61,37 @@ onMounted(() => {
tabbar.value = currentPage; tabbar.value = currentPage;
}); });
const onClickOverlay = () => {}; // 监听路由变化,更新 tabbar
watch(() => route.name, (newName) => {
if (newName) {
tabbar.value = newName;
}
});
const onClickOverlay = () => { };
// 跳转到相应页面 // 跳转到相应页面
const tabChange = (name) => { const tabChange = (name, a, b, c) => {
if (name === "more") {
showConfirmDialog({
title: '更多报告',
message:
'是否前往天远查查询更多报告',
})
.then(() => {
window.location.href = "https://www.tianyuancha.cn";
})
.catch(() => {
tabbar.value = route.name;
})
return;
}
router.push({ name }); // 使用 Vue Router 进行跳转 router.push({ name }); // 使用 Vue Router 进行跳转
}; };
// 跳转到投诉页面 // 跳转到投诉页面
const toComplaint = () => { const toComplaint = () => {
window.location.href = window.location.href =
"https://work.weixin.qq.com/kfid/kfc76b1d0f0d562777a"; // 跳转到客服页面 "https://work.weixin.qq.com/kfid/kfc8a32720024833f57"; // 跳转到客服页面
// router.push({ name: 'complaint' }); // 使用 Vue Router 进行跳转 // router.push({ name: 'complaint' }); // 使用 Vue Router 进行跳转
}; };
</script> </script>

BIN
src/ui.zip Normal file

Binary file not shown.

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="overdue-risk-section card"> <div class="overdue-risk-section card">
<LTitle title="逾期风险产品" class="mb-4" /> <LTitle title="逾期风险综述" class="mb-4" />
<!-- 逾期概览 --> <!-- 逾期概览 -->
<div class="overdue-overview mb-4"> <div class="overdue-overview mb-4">
@@ -264,7 +264,7 @@
<div class="grid grid-cols-1 md:grid-cols-3 gap-3"> <div class="grid grid-cols-1 md:grid-cols-3 gap-3">
<div class="text-center p-3 rounded-lg" :class="getRiskFlagClass(overdueRiskProduct.lyjlhyFlag)"> <div class="text-center p-3 rounded-lg" :class="getRiskFlagClass(overdueRiskProduct.lyjlhyFlag)">
<div class="text-sm font-bold">{{ getRiskFlagText(overdueRiskProduct.lyjlhyFlag) }}</div> <div class="text-sm font-bold">{{ getRiskFlagText(overdueRiskProduct.lyjlhyFlag) }}</div>
<div class="text-xs">逾期风险产品</div> <div class="text-xs">逾期风险</div>
</div> </div>
<div class="text-center p-3 rounded-lg" :class="getRiskFlagClass(overdueRiskProduct.dkzhktjFlag)"> <div class="text-center p-3 rounded-lg" :class="getRiskFlagClass(overdueRiskProduct.dkzhktjFlag)">
<div class="text-sm font-bold">{{ getRiskFlagText(overdueRiskProduct.dkzhktjFlag) }}</div> <div class="text-sm font-bold">{{ getRiskFlagText(overdueRiskProduct.dkzhktjFlag) }}</div>
@@ -280,7 +280,8 @@
</div> </div>
<!-- 温馨提示 --> <!-- 温馨提示 -->
<LRemark content="逾期风险产品全面分析申请人的逾期情况和还款行为。包括当前逾期状态、逾期时间分布、还款失败/成功统计等关键指标。逾期机构数和逾期金额是重要的风险评估依据还款失败次数和金额反映还款能力。建议关注最近一次成功还款时间连续还款失败可能预示更高风险。数据来源于各金融机构报送更新频率为T+1。" /> <LRemark
content="逾期风险全面分析申请人的逾期情况和还款行为。包括当前逾期状态、逾期时间分布、还款失败/成功统计等关键指标。逾期机构数和逾期金额是重要的风险评估依据还款失败次数和金额反映还款能力。建议关注最近一次成功还款时间连续还款失败可能预示更高风险。数据来源于各金融机构报送更新频率为T+1。" />
</template> </template>
<script setup> <script setup>

View File

@@ -283,7 +283,7 @@
</div> </div>
<!-- 法院曝光台信息 --> <!-- 法院曝光台信息 -->
<div class="risk-module-card" :class="getModuleCardClass('court')"> <!-- <div class="risk-module-card" :class="getModuleCardClass('court')">
<div class="module-header"> <div class="module-header">
<div class="module-icon bg-purple-500"> <div class="module-icon bg-purple-500">
<svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <svg class="w-5 h-5 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
@@ -328,7 +328,7 @@
<div class="text-xs text-gray-500">该模块未检测到风险</div> <div class="text-xs text-gray-500">该模块未检测到风险</div>
</div> </div>
</div> </div>
</div> </div> -->
<!-- 借贷评估 --> <!-- 借贷评估 -->
<div class="risk-module-card" :class="getModuleCardClass('loan')"> <div class="risk-module-card" :class="getModuleCardClass('loan')">
@@ -429,7 +429,8 @@
</div> </div>
<!-- 温馨提示 --> <!-- 温馨提示 -->
<LRemark content="风险总览以标签化形式展示各类风险模块的详细信息。每个模块都有独立的风险检测机制和评估标准。要素核查验证基础信息的一致性,运营商核验关注手机号状态,公安重点人员核验检查前科记录,逾期风险分析还款表现,司法风险关注涉诉情况,借贷评估分析申请行为,租赁风险评估关注租赁申请。建议重点关注高风险模块的具体风险项目。" /> <LRemark
content="风险总览以标签化形式展示各类风险模块的详细信息。每个模块都有独立的风险检测机制和评估标准。要素核查验证基础信息的一致性,运营商核验关注手机号状态,公安重点人员核验检查前科记录,逾期风险分析还款表现,司法风险关注涉诉情况,借贷评估分析申请行为,租赁风险评估关注租赁申请。建议重点关注高风险模块的具体风险项目。" />
</template> </template>
<script setup> <script setup>

View File

@@ -1,49 +1,31 @@
<template> <template>
<div class="card shadow-sm rounded-xl overflow-hidden"> <div class="card shadow-sm rounded-xl overflow-hidden">
<!-- 报告概览 --> <!-- 报告概览 -->
<ReportOverview <ReportOverview :base-info="data.baseInfo" :check-suggest="data.checkSuggest" :fraud-score="data.fraudScore"
:base-info="data.baseInfo" :credit-score="data.creditScore" :verify-rule="data.verifyRule" :fraud-rule="data.fraudRule" />
:check-suggest="data.checkSuggest"
:fraud-score="data.fraudScore"
:credit-score="data.creditScore"
:verify-rule="data.verifyRule"
:fraud-rule="data.fraudRule"
/>
<!-- 要素核查详情 --> <!-- 要素核查详情 -->
<ElementVerificationSection <ElementVerificationSection :element-verification-detail="data.elementVerificationDetail" />
:element-verification-detail="data.elementVerificationDetail"
/>
<!-- 风险预警 --> <!-- 风险预警 -->
<RiskWarningSection <RiskWarningSection :risk-warning="data.riskWarning" />
:risk-warning="data.riskWarning"
/>
<!-- 逾期风险产品 --> <!-- 逾期风险综述 -->
<OverdueRiskSection <OverdueRiskSection :overdue-risk-product="data.overdueRiskProduct" />
:overdue-risk-product="data.overdueRiskProduct"
/>
<!-- 法院曝光台信息 --> <!-- 法院曝光台信息 - 暂时隐藏 -->
<MultCourtInfoSection <!-- <MultCourtInfoSection
:mult-court-info="data.multCourtInfo" :mult-court-info="data.multCourtInfo"
/> /> -->
<!-- 借贷评估 --> <!-- 借贷评估 -->
<LoanEvaluationSection <LoanEvaluationSection :loan-evaluation-verification-detail="data.loanEvaluationVerificationDetail" />
:loan-evaluation-verification-detail="data.loanEvaluationVerificationDetail"
/>
<!-- 租赁风险评估 --> <!-- 租赁风险评估 -->
<LeasingRiskSection <LeasingRiskSection :leasing-risk-assessment="data.leasingRiskAssessment" />
:leasing-risk-assessment="data.leasingRiskAssessment"
/>
<!-- 关联风险监督 --> <!-- 关联风险监督 -->
<RiskSupervisionSection <RiskSupervisionSection :risk-supervision="data.riskSupervision" />
:risk-supervision="data.riskSupervision"
/>
</div> </div>
</template> </template>

View File

@@ -86,7 +86,7 @@ function splitDWBG8B4DForTabs(reportData) {
} }
}) })
// 逾期风险产品 // 逾期风险
result.push({ result.push({
data: { data: {
apiID: 'DWBG8B4D_OverdueRisk', apiID: 'DWBG8B4D_OverdueRisk',

108
src/ui/CIVYZ81NC.vue Normal file
View File

@@ -0,0 +1,108 @@
<script setup>
import LTitle from "@/components/LTitle.vue";
const props = defineProps({
data: {
type: Object,
required: false,
default: () => null,
},
});
console.log("data", props.data);
// 获取实际的数据对象
const actualData = props.data?.data;
// 日期格式化函数,将 2009-04-16 转换为 2009年04月16日
const formatDate = (dateStr) => {
if (!dateStr) return "";
const [year, month, day] = dateStr.split("-");
return `${year}${month}${day}`;
};
// 状态映射,根据 op_type 判断
const statusMap = {
IA: {
text: "已婚",
bgClass: "bg-green-100",
textClass: "text-green-700",
description: "已登记婚姻,家庭幸福美满",
},
IB: {
text: "离异",
bgClass: "bg-red-100",
textClass: "text-red-700",
description: "离异状态,未来生活可期",
},
INR: {
text: "未登记",
bgClass: "bg-yellow-100",
textClass: "text-yellow-700",
description: "未进行民政登记婚姻",
},
};
// 无记录时的状态
const noRecordStatus = {
text: "无相关记录",
bgClass: "bg-gray-200",
textClass: "text-gray-500",
description: "暂无婚姻相关记录",
opDate: null,
};
// 根据 op_type 确定当前状态,默认值为 "无相关记录"
const currentStatus = !actualData
? noRecordStatus
: actualData.op_type
? { ...statusMap[actualData.op_type], opDate: formatDate(actualData.op_date) }
: noRecordStatus;
</script>
<template>
<div class="card">
<div class="status-info flex flex-col items-center">
<div
:class="`status-label rounded-full px-6 py-3 text-center font-bold shadow-md ${currentStatus.bgClass} ${currentStatus.textClass}`">
{{ currentStatus.text }}
</div>
<div v-if="currentStatus.opDate" class="op-date-container mt-4 px-4 py-2 bg-blue-50 rounded-lg border border-blue-200">
<p class="op-date text-sm font-medium text-blue-700">
登记日期{{ currentStatus.opDate }}
</p>
</div>
<p v-html="currentStatus.description" class="status-description mt-3 text-sm text-gray-600"></p>
</div>
</div>
</template>
<style lang="scss" scoped>
.status-info {
text-align: center;
}
.status-label {
font-size: 1.25rem;
padding: 0.75rem 1.5rem;
border-radius: 9999px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
.status-description {
color: #4a5568;
margin-top: 0.5rem;
font-weight: 500;
}
.additional-info p {
margin-top: 0.5rem;
}
.op-date-container {
box-shadow: 0 2px 4px rgba(59, 130, 246, 0.1);
}
.op-date-container:hover {
box-shadow: 0 4px 8px rgba(59, 130, 246, 0.15);
}
</style>

View File

@@ -34,11 +34,7 @@
<!-- 双柱状图申请次数 vs 申请机构数 --> <!-- 双柱状图申请次数 vs 申请机构数 -->
<div class="mb-4"> <div class="mb-4">
<v-chart <v-chart class="chart-container" :option="timeDistributionChartOption" autoresize />
class="chart-container"
:option="timeDistributionChartOption"
autoresize
/>
</div> </div>
</div> </div>
@@ -66,19 +62,22 @@
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🏢 申请机构数</span> <span class="text-gray-600 text-sm">🏢 申请机构数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationInstitutionsLast3Days)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationInstitutionsLast3Days)"
class="font-semibold">
{{ getInstitutionCount(rentalBehavior?.rentalApplicationInstitutionsLast3Days) }} {{ getInstitutionCount(rentalBehavior?.rentalApplicationInstitutionsLast3Days) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🌙 周末申请次数</span> <span class="text-gray-600 text-sm">🌙 周末申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast3DaysWeekend)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast3DaysWeekend)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast3DaysWeekend) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast3DaysWeekend) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🌃 夜间申请次数</span> <span class="text-gray-600 text-sm">🌃 夜间申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast3DaysNight)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast3DaysNight)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast3DaysNight) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast3DaysNight) }}
</span> </span>
</div> </div>
@@ -100,19 +99,22 @@
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🏢 申请机构数</span> <span class="text-gray-600 text-sm">🏢 申请机构数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationInstitutionsLast7Days)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationInstitutionsLast7Days)"
class="font-semibold">
{{ getInstitutionCount(rentalBehavior?.rentalApplicationInstitutionsLast7Days) }} {{ getInstitutionCount(rentalBehavior?.rentalApplicationInstitutionsLast7Days) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🌙 周末申请次数</span> <span class="text-gray-600 text-sm">🌙 周末申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast7DaysWeekend)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast7DaysWeekend)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast7DaysWeekend) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast7DaysWeekend) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🌃 夜间申请次数</span> <span class="text-gray-600 text-sm">🌃 夜间申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast7DaysNight)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast7DaysNight)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast7DaysNight) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast7DaysNight) }}
</span> </span>
</div> </div>
@@ -134,19 +136,22 @@
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🏢 申请机构数</span> <span class="text-gray-600 text-sm">🏢 申请机构数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationInstitutionsLast14Days)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationInstitutionsLast14Days)"
class="font-semibold">
{{ getInstitutionCount(rentalBehavior?.rentalApplicationInstitutionsLast14Days) }} {{ getInstitutionCount(rentalBehavior?.rentalApplicationInstitutionsLast14Days) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🌙 周末申请次数</span> <span class="text-gray-600 text-sm">🌙 周末申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast14DaysWeekend)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast14DaysWeekend)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast14DaysWeekend) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast14DaysWeekend) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🌃 夜间申请次数</span> <span class="text-gray-600 text-sm">🌃 夜间申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast14DaysNight)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast14DaysNight)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast14DaysNight) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast14DaysNight) }}
</span> </span>
</div> </div>
@@ -168,19 +173,22 @@
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🏢 申请机构数</span> <span class="text-gray-600 text-sm">🏢 申请机构数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationInstitutionsLast1Month)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationInstitutionsLast1Month)"
class="font-semibold">
{{ getInstitutionCount(rentalBehavior?.rentalApplicationInstitutionsLast1Month) }} {{ getInstitutionCount(rentalBehavior?.rentalApplicationInstitutionsLast1Month) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🌙 周末申请次数</span> <span class="text-gray-600 text-sm">🌙 周末申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast1MonthWeekend)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast1MonthWeekend)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast1MonthWeekend) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast1MonthWeekend) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🌃 夜间申请次数</span> <span class="text-gray-600 text-sm">🌃 夜间申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast1MonthNight)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast1MonthNight)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast1MonthNight) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast1MonthNight) }}
</span> </span>
</div> </div>
@@ -204,25 +212,29 @@
<div class="grid grid-cols-1 gap-2 bg-white rounded-lg p-3 border"> <div class="grid grid-cols-1 gap-2 bg-white rounded-lg p-3 border">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">📊 申请次数</span> <span class="text-gray-600 text-sm">📊 申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast3Months)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast3Months)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast3Months) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast3Months) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🏢 申请机构数</span> <span class="text-gray-600 text-sm">🏢 申请机构数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationInstitutionsLast3Months)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationInstitutionsLast3Months)"
class="font-semibold">
{{ getInstitutionCount(rentalBehavior?.rentalApplicationInstitutionsLast3Months) }} {{ getInstitutionCount(rentalBehavior?.rentalApplicationInstitutionsLast3Months) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🌙 周末申请次数</span> <span class="text-gray-600 text-sm">🌙 周末申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast3MonthsWeekend)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast3MonthsWeekend)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast3MonthsWeekend) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast3MonthsWeekend) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🌃 夜间申请次数</span> <span class="text-gray-600 text-sm">🌃 夜间申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast3MonthsNight)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast3MonthsNight)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast3MonthsNight) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast3MonthsNight) }}
</span> </span>
</div> </div>
@@ -238,25 +250,29 @@
<div class="grid grid-cols-1 gap-2 bg-white rounded-lg p-3 border"> <div class="grid grid-cols-1 gap-2 bg-white rounded-lg p-3 border">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">📊 申请次数</span> <span class="text-gray-600 text-sm">📊 申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast6Months)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast6Months)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast6Months) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast6Months) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🏢 申请机构数</span> <span class="text-gray-600 text-sm">🏢 申请机构数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationInstitutionsLast6Months)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationInstitutionsLast6Months)"
class="font-semibold">
{{ getInstitutionCount(rentalBehavior?.rentalApplicationInstitutionsLast6Months) }} {{ getInstitutionCount(rentalBehavior?.rentalApplicationInstitutionsLast6Months) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🌙 周末申请次数</span> <span class="text-gray-600 text-sm">🌙 周末申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast6MonthsWeekend)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast6MonthsWeekend)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast6MonthsWeekend) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast6MonthsWeekend) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🌃 夜间申请次数</span> <span class="text-gray-600 text-sm">🌃 夜间申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast6MonthsNight)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast6MonthsNight)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast6MonthsNight) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast6MonthsNight) }}
</span> </span>
</div> </div>
@@ -280,25 +296,29 @@
<div class="grid grid-cols-1 gap-2 bg-white rounded-lg p-3 border"> <div class="grid grid-cols-1 gap-2 bg-white rounded-lg p-3 border">
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">📊 申请次数</span> <span class="text-gray-600 text-sm">📊 申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast12Months)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast12Months)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast12Months) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast12Months) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🏢 申请机构数</span> <span class="text-gray-600 text-sm">🏢 申请机构数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationInstitutionsLast12Months)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationInstitutionsLast12Months)"
class="font-semibold">
{{ getInstitutionCount(rentalBehavior?.rentalApplicationInstitutionsLast12Months) }} {{ getInstitutionCount(rentalBehavior?.rentalApplicationInstitutionsLast12Months) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🌙 周末申请次数</span> <span class="text-gray-600 text-sm">🌙 周末申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast12MonthsWeekend)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast12MonthsWeekend)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast12MonthsWeekend) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast12MonthsWeekend) }}
</span> </span>
</div> </div>
<div class="flex justify-between items-center"> <div class="flex justify-between items-center">
<span class="text-gray-600 text-sm">🌃 夜间申请次数</span> <span class="text-gray-600 text-sm">🌃 夜间申请次数</span>
<span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast12MonthsNight)" class="font-semibold"> <span :class="getActivityColor(rentalBehavior?.rentalApplicationCountLast12MonthsNight)"
class="font-semibold">
{{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast12MonthsNight) }} {{ getApplicationCount(rentalBehavior?.rentalApplicationCountLast12MonthsNight) }}
</span> </span>
</div> </div>
@@ -315,11 +335,7 @@
<!-- 周末 vs 夜间活动对比图 --> <!-- 周末 vs 夜间活动对比图 -->
<div class="mb-4"> <div class="mb-4">
<v-chart <v-chart class="chart-container" :option="specialTimeChartOption" autoresize />
class="chart-container"
:option="specialTimeChartOption"
autoresize
/>
</div> </div>
<div class="text-xs text-gray-600 bg-white rounded-lg p-3 border"> <div class="text-xs text-gray-600 bg-white rounded-lg p-3 border">
@@ -397,7 +413,8 @@
</div> </div>
<!-- 温馨提示 --> <!-- 温馨提示 -->
<LRemark content="租赁行为分析展示申请人在租赁领域的行为模式,包括租赁申请频率、租赁金额分布、租赁期限和还款表现等。数据来源于租赁公司和金融租赁机构。租赁行为可以反映申请人的消费习惯、资金管理能力和信用意识。频繁的租赁申请或大额租赁可能暗示资金紧张,而良好的租赁还款记录则可以提升信用评价。建议关注租赁逾期情况和还款稳定性。" /> <LRemark
content="租赁行为分析展示申请人在租赁领域的行为模式,包括租赁申请频率、租赁金额分布、租赁期限和还款表现等。数据来源于租赁公司和金融租赁机构。租赁行为可以反映申请人的消费习惯、资金管理能力和信用意识。频繁的租赁申请或大额租赁可能暗示资金紧张,而良好的租赁还款记录则可以提升信用评价。建议关注租赁逾期情况和还款稳定性。" />
</template> </template>
<script setup> <script setup>
@@ -561,7 +578,7 @@ const timeDistributionChartOption = computed(() => {
axisPointer: { axisPointer: {
type: 'shadow' type: 'shadow'
}, },
formatter: function(params) { formatter: function (params) {
let result = params[0].name + '<br/>' let result = params[0].name + '<br/>'
params.forEach(item => { params.forEach(item => {
result += `${item.seriesName}: ${item.value}<br/>` result += `${item.seriesName}: ${item.value}<br/>`
@@ -682,7 +699,7 @@ const specialTimeChartOption = computed(() => {
axisPointer: { axisPointer: {
type: 'shadow' type: 'shadow'
}, },
formatter: function(params) { formatter: function (params) {
let result = params[0].name + '<br/>' let result = params[0].name + '<br/>'
params.forEach(item => { params.forEach(item => {
result += `${item.seriesName}: ${item.value} 次<br/>` result += `${item.seriesName}: ${item.value} 次<br/>`

View File

@@ -1,74 +1,48 @@
<template> <template>
<div class="card shadow-sm rounded-xl overflow-hidden"> <div class="card shadow-sm rounded-xl overflow-hidden">
<!-- 基本信息 --> <!-- 基本信息 -->
<BaseInfoSection <BaseInfoSection :data="{ baseInfo: data.baseInfo }" />
:data="{ baseInfo: data.baseInfo }"
/>
<!-- 身份信息核验 --> <!-- 身份信息核验 -->
<StandLiveInfoSection <StandLiveInfoSection :data="{ standLiveInfo: data.standLiveInfo }" />
:data="{ standLiveInfo: data.standLiveInfo }"
/>
<!-- 命中风险标注 --> <!-- 命中风险标注 -->
<RiskPointSection <RiskPointSection :data="{ riskPoint: data.riskPoint }" />
:data="{ riskPoint: data.riskPoint }"
/>
<!-- 公安重点人员核验 --> <!-- 公安重点人员核验 -->
<SecurityInfoSection <SecurityInfoSection :data="{ securityInfo: data.securityInfo }" />
:data="{ securityInfo: data.securityInfo }"
/>
<!-- 涉赌涉诈人员核验 --> <!-- 涉赌涉诈人员核验 -->
<AntiFraudInfoSection <AntiFraudInfoSection :data="{ antiFraudInfo: data.antiFraudInfo }" />
:data="{ antiFraudInfo: data.antiFraudInfo }"
/>
<!-- 风险名单 --> <!-- 风险名单 -->
<RiskListSection <RiskListSection :data="{ riskList: data.riskList }" />
:data="{ riskList: data.riskList }"
/>
<!-- 历史借贷行为 --> <!-- 历史借贷行为 -->
<ApplicationStatisticsSection <ApplicationStatisticsSection :data="{ applicationStatistics: data.applicationStatistics }" />
:data="{ applicationStatistics: data.applicationStatistics }"
/>
<!-- 近24个月放款情况 --> <!-- 近24个月放款情况 -->
<LendingStatisticsSection <LendingStatisticsSection :data="{ lendingStatistics: data.lendingStatistics }" />
:data="{ lendingStatistics: data.lendingStatistics }"
/>
<!-- 履约情况 --> <!-- 履约情况 -->
<PerformanceStatisticsSection <PerformanceStatisticsSection :data="{ performanceStatistics: data.performanceStatistics }" />
:data="{ performanceStatistics: data.performanceStatistics }"
/>
<!-- 历史逾期记录 --> <!-- 历史逾期记录 -->
<OverdueRecordSection <OverdueRecordSection :data="{ overdueRecord: data.overdueRecord }" />
:data="{ overdueRecord: data.overdueRecord }"
/>
<!-- 授信详情 --> <!-- 授信详情 -->
<CreditDetailSection <CreditDetailSection :data="{ creditDetail: data.creditDetail }" />
:data="{ creditDetail: data.creditDetail }"
/>
<!-- 租赁行为 --> <!-- 租赁行为 -->
<RentalBehaviorSection <RentalBehaviorSection :data="{ rentalBehavior: data.rentalBehavior }" />
:data="{ rentalBehavior: data.rentalBehavior }"
/>
<!-- 关联风险监督 --> <!-- 关联风险监督 -->
<RiskSupervisionSection <RiskSupervisionSection :data="{ riskSupervision: data.riskSupervision }" />
:data="{ riskSupervision: data.riskSupervision }"
/>
<!-- 法院风险信息 --> <!-- 法院风险信息 -->
<CourtRiskInfoSection <!-- <CourtRiskInfoSection
:data="{ judiciaRiskInfos: data.judiciaRiskInfos }" :data="{ judiciaRiskInfos: data.judiciaRiskInfos }"
/> /> -->
</div> </div>
</template> </template>

View File

@@ -22,13 +22,14 @@
<script setup> <script setup>
// 颜色配置(根据产品名称映射) // 颜色配置(根据产品名称映射)
const typeColors = { const typeColors = {
'老板企业风险': { bg: 'bg-blue-100', text: 'text-blue-800', dot: 'bg-blue-500' }, '小微企业': { bg: 'bg-blue-100', text: 'text-blue-800', dot: 'bg-blue-500' },
'入职风险': { bg: 'bg-green-100', text: 'text-green-800', dot: 'bg-green-500' }, '入职风险': { bg: 'bg-green-100', text: 'text-green-800', dot: 'bg-green-500' },
'家政风险': { bg: 'bg-purple-100', text: 'text-purple-800', dot: 'bg-purple-500' }, '家政风险': { bg: 'bg-purple-100', text: 'text-purple-800', dot: 'bg-purple-500' },
'婚恋风险': { bg: 'bg-pink-100', text: 'text-pink-800', dot: 'bg-pink-500' }, '婚恋风险': { bg: 'bg-pink-100', text: 'text-pink-800', dot: 'bg-pink-500' },
'贷前风险': { bg: 'bg-orange-100', text: 'text-orange-800', dot: 'bg-orange-500' }, '贷前风险': { bg: 'bg-orange-100', text: 'text-orange-800', dot: 'bg-orange-500' },
'租赁风险': { bg: 'bg-indigo-100', text: 'text-indigo-800', dot: 'bg-indigo-500' }, '租赁风险': { bg: 'bg-indigo-100', text: 'text-indigo-800', dot: 'bg-indigo-500' },
'个人风险': { bg: 'bg-red-100', text: 'text-red-800', dot: 'bg-red-500' }, '个人风险': { bg: 'bg-red-100', text: 'text-red-800', dot: 'bg-red-500' },
'个人大数据': { bg: 'bg-red-100', text: 'text-red-800', dot: 'bg-red-500' },
// 默认类型 // 默认类型
'default': { bg: 'bg-gray-100', text: 'text-gray-800', dot: 'bg-gray-500' } 'default': { bg: 'bg-gray-100', text: 'text-gray-800', dot: 'bg-gray-500' }
} }

View File

@@ -32,7 +32,7 @@ function toVipApply() {
function toService() { function toService() {
// window.location.href = '/service' // 跳转到客服页面 // window.location.href = '/service' // 跳转到客服页面
window.location.href = window.location.href =
"https://work.weixin.qq.com/kfid/kfc76b1d0f0d562777a"; // 跳转到客服页面 "https://work.weixin.qq.com/kfid/kfc8a32720024833f57"; // 跳转到客服页面
} }
</script> </script>

View File

@@ -1026,7 +1026,7 @@ async function applyVip() {
// 联系客服 // 联系客服
function contactService() { function contactService() {
// 跳转到客服页面 // 跳转到客服页面
window.location.href = 'https://work.weixin.qq.com/kfid/kfc76b1d0f0d562777a' window.location.href = 'https://work.weixin.qq.com/kfid/kfc8a32720024833f57'
} }
function formatExpiryTime(expiryTimeStr) { function formatExpiryTime(expiryTimeStr) {

View File

@@ -178,13 +178,15 @@ import { settings } from "nprogress";
// 报告类型选项 // 报告类型选项
const reportOptions = [ const reportOptions = [
{ text: "入职风险", value: "backgroundcheck", id: 1 }, { text: "小微企业", value: "companyinfo", id: 2 },
{ text: "老板企业风险", value: "companyinfo", id: 2 }, { text: "贷前风险", value: "preloanbackgroundcheck", id: 5 },
{ text: "家政风险", value: "homeservice", id: 3 }, { text: "个人大数据", value: "personaldata", id: 27 },
{ text: "婚恋风险", value: "marriage", id: 4 },
{ text: "贷前风险", value: "prepreloanbackgroundcheck", id: 5 }, // { text: "入职风险", value: "backgroundcheck", id: 1 },
{ text: "租赁风险", value: "rentalrisk", id: 6 }, // { text: "家政风险", value: "homeservice", id: 3 },
{ text: "个人风险", value: "riskassessment", id: 7 }, // { text: "婚恋风险", value: "marriage", id: 4 },
// { text: "租赁风险", value: "rentalrisk", id: 6 },
// { text: "个人风险", value: "riskassessment", id: 7 },
]; ];
// 状态管理 // 状态管理

View File

@@ -2,12 +2,15 @@
import { ref, reactive, computed, onMounted, onUnmounted, nextTick } from "vue"; import { ref, reactive, computed, onMounted, onUnmounted, nextTick } from "vue";
import { aesEncrypt } from "@/utils/crypto"; import { aesEncrypt } from "@/utils/crypto";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import { useUserStore } from "@/stores/userStore";
import { showConfirmDialog } from "vant";
import Payment from "@/components/Payment.vue"; import Payment from "@/components/Payment.vue";
import CarNumberInput from "@/components/CarNumberInput.vue"; import CarNumberInput from "@/components/CarNumberInput.vue";
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
const userStore = useUserStore();
const showPayment = ref(false); const showPayment = ref(false);
const queryId = ref(null); const queryId = ref(null);
const name = ref(""); const name = ref("");
@@ -57,7 +60,35 @@ const isPhoneNumberValid = computed(() => {
return /^1[3-9]\d{9}$/.test(mobile.value); return /^1[3-9]\d{9}$/.test(mobile.value);
}); });
const isIdCardValid = computed(() => /^\d{17}[\dX]$/i.test(idCard.value)); const isIdCardValid = computed(() => /^\d{17}[\dX]$/i.test(idCard.value));
// 检查登录状态
const isLoggedIn = computed(() => userStore.isLoggedIn);
// 处理输入框点击事件
const handleInputClick = async () => {
if (!isLoggedIn.value) {
try {
await showConfirmDialog({
title: '提示',
message: '您需要登录后才能进行查询,是否前往登录?',
confirmButtonText: '前往登录',
cancelButtonText: '取消',
});
// 用户点击确认,跳转到登录页面
router.push('/login');
} catch {
// 用户点击取消,什么都不做
}
}
};
function handleSubmit() { function handleSubmit() {
// 如果未登录,跳转到登录页面
if (!isLoggedIn.value) {
router.push('/login');
return;
}
// 基本协议验证 // 基本协议验证
if (!agreeToTerms.value) { if (!agreeToTerms.value) {
showToast({ message: `请阅读并同意用户协议和隐私政策` }); showToast({ message: `请阅读并同意用户协议和隐私政策` });
@@ -185,7 +216,7 @@ const getFeatureIcon = (apiId) => {
FLXG0V4B: "/inquire_icons/sifasheyu.svg", // 司法涉诉 FLXG0V4B: "/inquire_icons/sifasheyu.svg", // 司法涉诉
JRZQ8203: "/inquire_icons/jiedaixingwei.svg", // 借贷行为记录 JRZQ8203: "/inquire_icons/jiedaixingwei.svg", // 借贷行为记录
JRZQ09J8: "/inquire_icons/beijianguanrenyuan.svg", // 收入评估 JRZQ09J8: "/inquire_icons/beijianguanrenyuan.svg", // 收入评估
JRZQ4B6C: "/inquire_icons/fengxianxingwei.svg", // 信贷表现 JRZQ4B6C: "/inquire_icons/fengxianxingwei.svg", // 探针C风险评估
}; };
return iconMap[apiId] || "/inquire_icons/default.svg"; return iconMap[apiId] || "/inquire_icons/default.svg";
}; };
@@ -200,10 +231,10 @@ const handleIconError = (event) => {
const getCardClass = (index) => { const getCardClass = (index) => {
const colorIndex = index % 4; const colorIndex = index % 4;
const colorClasses = [ const colorClasses = [
'bg-gradient-to-br from-blue-50 via-blue-25 to-white border-2 border-blue-200', 'bg-gradient-to-br from-blue-50 via-blue-25 to-white ',
'bg-gradient-to-br from-green-50 via-green-25 to-white border-2 border-green-200', 'bg-gradient-to-br from-green-50 via-green-25 to-white ',
'bg-gradient-to-br from-purple-50 via-purple-25 to-white border-2 border-purple-200', 'bg-gradient-to-br from-purple-50 via-purple-25 to-white ',
'bg-gradient-to-br from-orange-50 via-orange-25 to-white border-2 border-orange-200' 'bg-gradient-to-br from-orange-50 via-orange-25 to-white '
]; ];
return colorClasses[colorIndex]; return colorClasses[colorIndex];
}; };
@@ -224,21 +255,24 @@ onUnmounted(() => {
<div class="mb-4 text-lg font-semibold" style="color: var(--van-text-color);">基本信息</div> <div class="mb-4 text-lg font-semibold" style="color: var(--van-text-color);">基本信息</div>
<div class="mb-4"> <div class="mb-4">
<label for="name" class="form-label block mb-2">姓名</label> <label for="name" class="form-label block mb-2">姓名</label>
<input v-model="name" id="name" type="text" placeholder="请输入姓名" class="form-input" /> <input v-model="name" id="name" type="text" placeholder="请输入姓名" class="form-input"
@click="handleInputClick" />
</div> </div>
<div class="mb-4"> <div class="mb-4">
<label for="idCard" class="form-label block mb-2">身份证号</label> <label for="idCard" class="form-label block mb-2">身份证号</label>
<input v-model="idCard" id="idCard" type="text" placeholder="请输入身份证号" class="form-input" /> <input v-model="idCard" id="idCard" type="text" placeholder="请输入身份证号" class="form-input"
@click="handleInputClick" />
</div> </div>
<div class="mb-4"> <div class="mb-4">
<label for="mobile" class="form-label block mb-2">手机号</label> <label for="mobile" class="form-label block mb-2">手机号</label>
<input v-model="mobile" id="mobile" type="tel" placeholder="请输入手机号" class="form-input" /> <input v-model="mobile" id="mobile" type="tel" placeholder="请输入手机号" class="form-input"
@click="handleInputClick" />
</div> </div>
<div class="mb-4"> <div class="mb-4">
<label for="verificationCode" class="form-label block mb-2">验证码</label> <label for="verificationCode" class="form-label block mb-2">验证码</label>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<input v-model="verificationCode" id="verificationCode" placeholder="请输入验证码" maxlength="6" <input v-model="verificationCode" id="verificationCode" placeholder="请输入验证码" maxlength="6"
class="form-input flex-1 min-w-0" /> class="form-input flex-1 min-w-0" @click="handleInputClick" />
<button <button
class="px-4 py-2 text-sm whitespace-nowrap flex-shrink-0 rounded-lg border transition-colors" class="px-4 py-2 text-sm whitespace-nowrap flex-shrink-0 rounded-lg border transition-colors"
:class="isCountingDown || !isPhoneNumberValid :class="isCountingDown || !isPhoneNumberValid
@@ -278,7 +312,7 @@ onUnmounted(() => {
<button <button
class="flex-1 rounded-xl sm:rounded-l-none sm:rounded-r-xl py-3 text-white text-base transition-colors" class="flex-1 rounded-xl sm:rounded-l-none sm:rounded-r-xl py-3 text-white text-base transition-colors"
style="background-color: var(--van-theme-primary);" @click="handleSubmit"> style="background-color: var(--van-theme-primary);" @click="handleSubmit">
立即查询 {{ isLoggedIn ? '立即查询' : '前往登录' }}
</button> </button>
</div> </div>
</div> </div>
@@ -303,8 +337,7 @@ onUnmounted(() => {
{ name: '执行案件', icon: 'zhixinganjian.svg' }, { name: '执行案件', icon: 'zhixinganjian.svg' },
{ name: '限高被执行', icon: 'xianzhigaoxiaofei.svg' }, { name: '限高被执行', icon: 'xianzhigaoxiaofei.svg' },
]" :key="`${feature.id}-${caseIndex}`" ]" :key="`${feature.id}-${caseIndex}`"
class="aspect-square rounded-xl text-center text-sm text-gray-700 font-medium flex flex-col items-center justify-center p-2 shadow-lg" class="aspect-square text-center text-sm text-gray-700 font-medium flex flex-col items-center justify-center">
:class="getCardClass(index + caseIndex)">
<div class="mb-1"> <div class="mb-1">
<img :src="`/inquire_icons/${caseType.icon}`" :alt="caseType.name" <img :src="`/inquire_icons/${caseType.icon}`" :alt="caseType.name"
class="w-6 h-6 drop-shadow-sm mx-auto" @error="handleIconError" /> class="w-6 h-6 drop-shadow-sm mx-auto" @error="handleIconError" />
@@ -322,20 +355,19 @@ onUnmounted(() => {
{ name: '要素核查', icon: 'beijianguanrenyuan.svg' }, { name: '要素核查', icon: 'beijianguanrenyuan.svg' },
{ name: '运营商核验', icon: 'mingxiacheliang.svg' }, { name: '运营商核验', icon: 'mingxiacheliang.svg' },
{ name: '公安重点人员检验', icon: 'xingshi.svg' }, { name: '公安重点人员检验', icon: 'xingshi.svg' },
{ name: '逾期风险产品', icon: 'huankuanyali.svg' }, { name: '逾期风险综述', icon: 'huankuanyali.svg' },
{ name: '法院曝光台信息', icon: 'sifasheyu.svg' }, // { name: '法院曝光台信息', icon: 'sifasheyu.svg' },
{ name: '借贷评估', icon: 'jiedaishenqing.svg' }, { name: '借贷评估', icon: 'jiedaishenqing.svg' },
{ name: '租赁风险评估', icon: 'jiedaixingwei.svg' }, { name: '租赁风险评估', icon: 'jiedaixingwei.svg' },
{ name: '关联风险监督', icon: 'renqiguanxi.svg' }, { name: '关联风险监督', icon: 'renqiguanxi.svg' },
{ name: '规则风险提示', icon: 'fengxianxingwei.svg' }, { name: '规则风险提示', icon: 'fengxianxingwei.svg' },
]" :key="`${feature.id}-${moduleIndex}`" ]" :key="`${feature.id}-${moduleIndex}`"
class="aspect-square rounded-xl text-center text-sm text-gray-700 font-medium flex flex-col items-center justify-center p-2 shadow-lg" class="aspect-squaretext-center text-sm text-gray-700 font-medium flex flex-col items-center justify-center">
:class="getCardClass(index + moduleIndex)">
<div class="text-xl mb-1 flex items-center justify-center"> <div class="text-xl mb-1 flex items-center justify-center">
<img :src="`/inquire_icons/${module.icon}`" :alt="module.name" <img :src="`/inquire_icons/${module.icon}`" :alt="module.name"
class="w-6 h-6 drop-shadow-sm" @error="handleIconError" /> class="w-6 h-6 drop-shadow-sm" @error="handleIconError" />
</div> </div>
<div class="text-xs leading-tight px-1 font-medium" <div class="text-xs leading-tight px-1 font-medium text-center"
style="word-break: break-all; line-height: 1.2"> style="word-break: break-all; line-height: 1.2">
{{ module.name }} {{ module.name }}
</div> </div>
@@ -352,13 +384,12 @@ onUnmounted(() => {
{ name: '风险指标详情', icon: 'fengxianxingwei.svg' }, { name: '风险指标详情', icon: 'fengxianxingwei.svg' },
{ name: '专业建议', icon: 'yuepeichang.svg' }, { name: '专业建议', icon: 'yuepeichang.svg' },
]" :key="`${feature.id}-${moduleIndex}`" ]" :key="`${feature.id}-${moduleIndex}`"
class="aspect-square rounded-xl text-center text-sm text-gray-700 font-medium flex flex-col items-center justify-center p-2 shadow-lg" class="aspect-square text-center text-sm text-gray-700 font-medium flex flex-col items-center justify-center">
:class="getCardClass(index + moduleIndex)">
<div class="text-xl mb-1 flex items-center justify-center"> <div class="text-xl mb-1 flex items-center justify-center">
<img :src="`/inquire_icons/${module.icon}`" :alt="module.name" <img :src="`/inquire_icons/${module.icon}`" :alt="module.name"
class="w-6 h-6 drop-shadow-sm" @error="handleIconError" /> class="w-6 h-6 drop-shadow-sm" @error="handleIconError" />
</div> </div>
<div class="text-xs leading-tight px-1 font-medium" <div class="text-xs leading-tight px-1 font-medium text-center"
style="word-break: break-all; line-height: 1.2"> style="word-break: break-all; line-height: 1.2">
{{ module.name }} {{ module.name }}
</div> </div>
@@ -376,13 +407,12 @@ onUnmounted(() => {
{ name: '行政处罚', icon: 'xingzhengfuwu.svg' }, { name: '行政处罚', icon: 'xingzhengfuwu.svg' },
{ name: '经营异常', icon: 'fengxianxingwei.svg' }, { name: '经营异常', icon: 'fengxianxingwei.svg' },
]" :key="`${feature.id}-${moduleIndex}`" ]" :key="`${feature.id}-${moduleIndex}`"
class="aspect-square rounded-xl text-center text-sm text-gray-700 font-medium flex flex-col items-center justify-center p-2 shadow-lg" class="aspect-square text-center text-sm text-gray-700 font-medium flex flex-col items-center justify-center">
:class="getCardClass(index + moduleIndex)">
<div class="text-xl mb-1 flex items-center justify-center"> <div class="text-xl mb-1 flex items-center justify-center">
<img :src="`/inquire_icons/${module.icon}`" :alt="module.name" <img :src="`/inquire_icons/${module.icon}`" :alt="module.name"
class="w-6 h-6 drop-shadow-sm" @error="handleIconError" /> class="w-6 h-6 drop-shadow-sm" @error="handleIconError" />
</div> </div>
<div class="text-xs leading-tight px-1 font-medium" <div class="text-xs leading-tight px-1 font-medium text-center"
style="word-break: break-all; line-height: 1.2"> style="word-break: break-all; line-height: 1.2">
{{ module.name }} {{ module.name }}
</div> </div>
@@ -403,15 +433,14 @@ onUnmounted(() => {
{ name: '授信详情', icon: 'huankuanyali.svg' }, { name: '授信详情', icon: 'huankuanyali.svg' },
{ name: '租赁行为', icon: 'mingxiacheliang.svg' }, { name: '租赁行为', icon: 'mingxiacheliang.svg' },
{ name: '关联风险监督', icon: 'renqiguanxi.svg' }, { name: '关联风险监督', icon: 'renqiguanxi.svg' },
{ name: '法院风险信息', icon: 'sifasheyu.svg' }, // { name: '法院风险信息', icon: 'sifasheyu.svg' },
]" :key="`${feature.id}-${moduleIndex}`" ]" :key="`${feature.id}-${moduleIndex}`"
class="aspect-square rounded-xl text-center text-sm text-gray-700 font-medium flex flex-col items-center justify-center p-2 shadow-lg" class="aspect-square text-center text-sm text-gray-700 font-medium flex flex-col items-center justify-center">
:class="getCardClass(index + moduleIndex)">
<div class="text-xl mb-1 flex items-center justify-center"> <div class="text-xl mb-1 flex items-center justify-center">
<img :src="`/inquire_icons/${module.icon}`" :alt="module.name" <img :src="`/inquire_icons/${module.icon}`" :alt="module.name"
class="w-6 h-6 drop-shadow-sm" @error="handleIconError" /> class="w-6 h-6 drop-shadow-sm" @error="handleIconError" />
</div> </div>
<div class="text-xs leading-tight px-1 font-medium" <div class="text-xs leading-tight px-1 font-medium text-center"
style="word-break: break-all; line-height: 1.2"> style="word-break: break-all; line-height: 1.2">
{{ module.name }} {{ module.name }}
</div> </div>
@@ -420,13 +449,12 @@ onUnmounted(() => {
<!-- 其他功能正常显示 --> <!-- 其他功能正常显示 -->
<div v-else <div v-else
class="aspect-square rounded-xl text-center text-sm text-gray-700 font-medium flex flex-col items-center justify-between p-2 shadow-lg" class="aspect-square text-center text-sm text-gray-700 font-medium flex flex-col items-center justify-between">
:class="getCardClass(index)">
<div class="flex items-center justify-center flex-1"> <div class="flex items-center justify-center flex-1">
<img :src="getFeatureIcon(feature.api_id)" :alt="feature.name" <img :src="getFeatureIcon(feature.api_id)" :alt="feature.name"
class="w-6 h-6 drop-shadow-sm" @error="handleIconError" /> class="w-6 h-6 drop-shadow-sm" @error="handleIconError" />
</div> </div>
<div class="text-xs leading-tight font-medium h-8 flex items-center justify-center" <div class="text-xs leading-tight font-medium h-8 flex items-center justify-center text-center"
style="word-break: break-all; line-height: 1.1"> style="word-break: break-all; line-height: 1.1">
{{ feature.name }} {{ feature.name }}
</div> </div>

View File

@@ -29,12 +29,11 @@
: isWeChat : isWeChat
? "微信用户" ? "微信用户"
: "未绑定手机号" : "未绑定手机号"
}} }}
</h2> </h2>
<!-- 手机号绑定提示 --> <!-- 手机号绑定提示 -->
<template v-if="isLoggedIn && !mobile"> <template v-if="isLoggedIn && !mobile">
<p @click.stop="showBindPhoneDialog" <p @click.stop="showBindPhoneDialog" class="text-sm cursor-pointer hover:underline"
class="text-sm cursor-pointer hover:underline"
style="color: var(--van-theme-primary);"> style="color: var(--van-theme-primary);">
点击绑定手机号码 点击绑定手机号码
</p> </p>
@@ -63,6 +62,12 @@
<button class="feature-item hover:bg-blue-50" @click="toHistory"> <button class="feature-item hover:bg-blue-50" @click="toHistory">
📃 我的报告 📃 我的报告
</button> </button>
<button class="feature-item hover:bg-blue-50" @click="toApiStore">
🏪 API商店
</button>
<button class="feature-item hover:bg-blue-50" @click="toCooperation">
🤝 商务合作
</button>
<button class="feature-item hover:bg-blue-50" @click="toUserAgreement"> <button class="feature-item hover:bg-blue-50" @click="toUserAgreement">
📜 用户协议 📜 用户协议
</button> </button>
@@ -80,8 +85,7 @@
📴 注销账号 📴 注销账号
</button> --> </button> -->
<button v-if="isLoggedIn && !isWeChat" class="feature-item hover:bg-red-50" <button v-if="isLoggedIn && !isWeChat" class="feature-item hover:bg-red-50"
style="color: var(--van-theme-primary);" style="color: var(--van-theme-primary);" @click="handleLogout">
@click="handleLogout">
退出登录 退出登录
</button> </button>
</div> </div>
@@ -151,7 +155,12 @@ const maskName = (name) => {
function toHistory() { function toHistory() {
router.push(`/historyQuery`); router.push(`/historyQuery`);
} }
function toCooperation() {
window.location.href = "https://www.tianyuandata.com";
}
function toApiStore() {
window.location.href = "https://www.tianyuanapi.com/";
}
function toUserAgreement() { function toUserAgreement() {
router.push(`/userAgreement`); router.push(`/userAgreement`);
} }
@@ -200,7 +209,7 @@ function handleCancelAccount() {
function toService() { function toService() {
window.location.href = window.location.href =
"https://work.weixin.qq.com/kfid/kfc76b1d0f0d562777a"; // 跳转到客服页面 "https://work.weixin.qq.com/kfid/kfc8a32720024833f57"; // 跳转到客服页面
} }
const toVipConfig = () => { const toVipConfig = () => {
@@ -292,5 +301,4 @@ onBeforeMount(() => {
.shadow-glow { .shadow-glow {
filter: drop-shadow(0 0 8px rgba(163, 51, 200, 0.2)); filter: drop-shadow(0 0 8px rgba(163, 51, 200, 0.2));
} }
</style> </style>

View File

@@ -422,7 +422,7 @@ function goHome() {
function contactService() { function contactService() {
// 可以替换为实际的客服联系逻辑,如打开聊天窗口或跳转到客服页面 // 可以替换为实际的客服联系逻辑,如打开聊天窗口或跳转到客服页面
window.location.href = window.location.href =
"https://work.weixin.qq.com/kfid/kfc76b1d0f0d562777a"; // 跳转到客服页面 "https://work.weixin.qq.com/kfid/kfc8a32720024833f57"; // 跳转到客服页面
} }
// 暴露方法和数据供父组件或路由调用 // 暴露方法和数据供父组件或路由调用

View File

@@ -88,13 +88,18 @@
import PriceInputPopup from '@/components/PriceInputPopup.vue'; import PriceInputPopup from '@/components/PriceInputPopup.vue';
import VipBanner from '@/components/VipBanner.vue'; import VipBanner from '@/components/VipBanner.vue';
const reportTypes = [ const reportTypes = [
{ text: '入职风险', value: 'backgroundcheck', id: 1 }, { text: "小微企业", value: "companyinfo", id: 2 },
{ text: '老板企业风险', value: 'companyinfo', id: 2 }, { text: "贷前风险", value: "preloanbackgroundcheck", id: 5 },
{ text: '家政风险', value: 'homeservice', id: 3 }, { text: "个人大数据", value: "personaldata", id: 27 },
{ text: '婚恋风险', value: 'marriage', id: 4 },
{ text: '贷前风险', value: 'prepreloanbackgroundcheck', id: 5 }, // { text: '入职风险', value: 'backgroundcheck', id: 1 },
{ text: '租赁风险', value: 'rentalrisk', id: 6 }, // { text: '小微企业', value: 'companyinfo', id: 2 },
{ text: '个人风险', value: 'riskassessment', id: 7 }, // { text: '家政风险', value: 'homeservice', id: 3 },
// { text: '婚恋风险', value: 'marriage', id: 4 },
// { text: '贷前风险', value: 'preloanbackgroundcheck', id: 5 },
// { text: '租赁风险', value: 'rentalrisk', id: 6 },
// { text: '个人风险', value: 'riskassessment', id: 7 },
// { text: "个人大数据", value: "personaldata", id: 27 },
]; ];
const showTypePicker = ref(false); const showTypePicker = ref(false);
const showApplyPopup = ref(false); // 用来控制申请代理弹窗的显示 const showApplyPopup = ref(false); // 用来控制申请代理弹窗的显示

View File

@@ -363,13 +363,13 @@ onUnmounted(() => {
{ name: '要素核查', icon: 'beijianguanrenyuan.svg' }, { name: '要素核查', icon: 'beijianguanrenyuan.svg' },
{ name: '运营商核验', icon: 'mingxiacheliang.svg' }, { name: '运营商核验', icon: 'mingxiacheliang.svg' },
{ name: '公安重点人员检验', icon: 'xingshi.svg' }, { name: '公安重点人员检验', icon: 'xingshi.svg' },
{ name: '逾期风险产品', icon: 'huankuanyali.svg' }, { name: '逾期风险综述', icon: 'huankuanyali.svg' },
{ name: '法院曝光台信息', icon: 'sifasheyu.svg' }, { name: '法院曝光台信息', icon: 'sifasheyu.svg' },
{ name: '借贷评估', icon: 'jiedaishenqing.svg' }, { name: '借贷评估', icon: 'jiedaishenqing.svg' },
{ name: '租赁风险评估', icon: 'jiedaixingwei.svg' }, { name: '租赁风险评估', icon: 'jiedaixingwei.svg' },
{ name: '关联风险监督', icon: 'renqiguanxi.svg' }, { name: '关联风险监督', icon: 'renqiguanxi.svg' },
{ name: '规则风险提示', icon: 'fengxianxingwei.svg' }, { name: '规则风险提示', icon: 'fengxianxingwei.svg' },
]" :key="`${feature.id}-${moduleIndex}`" ]" :key="`${feature.id}-${moduleIndex}`"
class="aspect-square rounded-xl text-center text-sm text-gray-700 font-medium flex flex-col items-center justify-center p-2 shadow-lg" class="aspect-square rounded-xl text-center text-sm text-gray-700 font-medium flex flex-col items-center justify-center p-2 shadow-lg"
:class="getCardClass(index + moduleIndex)"> :class="getCardClass(index + moduleIndex)">
<div class="text-xl mb-1 flex items-center justify-center"> <div class="text-xl mb-1 flex items-center justify-center">
@@ -659,4 +659,3 @@ button:active {
transform: translateY(0); transform: translateY(0);
} }
</style> </style>

View File

@@ -5,7 +5,7 @@ import { storeToRefs } from "pinia";
const agentStore = useAgentStore(); const agentStore = useAgentStore();
const { isAgent } = storeToRefs(agentStore); const { isAgent } = storeToRefs(agentStore);
import personalDataIcon from "@/assets/images/personal_data_bg.png"; import personalDataIcon from "@/assets/images/personal_data_bg.png";
import companyIcon from "@/assets/images/company_bg.png"; import companyIcon from "@/assets/images/index_icon_6.png";
import loanCheckIcon from "@/assets/images/loan_check_bg.png"; import loanCheckIcon from "@/assets/images/loan_check_bg.png";
function toInquire(name) { function toInquire(name) {
router.push(`/inquire/${name}`); router.push(`/inquire/${name}`);
@@ -52,7 +52,7 @@ const services = ref([
name: "companyinfo", name: "companyinfo",
subtitle: "信用报告", subtitle: "信用报告",
bg: companyIcon, bg: companyIcon,
bgColor: "bg-blue-400", bgColor: "bg-purple-400",
position: position:
"rounded-tr-[35px] rounded-br-[35px] rounded-tl-lg rounded-bl-lg", "rounded-tr-[35px] rounded-br-[35px] rounded-tl-lg rounded-bl-lg",
}, },
@@ -66,12 +66,17 @@ const services = ref([
"rounded-tr-[35px] rounded-br-[35px] rounded-tl-lg rounded-bl-lg", "rounded-tr-[35px] rounded-br-[35px] rounded-tl-lg rounded-bl-lg",
}, },
]); ]);
function toCooperation() {
window.location.href = "https://www.tianyuandata.com";
}
const noticeText = ref([]); const noticeText = ref([]);
function toHistory() { function toHistory() {
router.push(`/historyQuery`); router.push(`/historyQuery`);
} }
const toBigData = () => {
window.location.href = "https://www.tybigdata.com/";
};
</script> </script>
<template> <template>
@@ -154,7 +159,8 @@ function toHistory() {
]" :style="`background: url(${service.bg}) no-repeat; background-size: cover; background-position: center;`" ]" :style="`background: url(${service.bg}) no-repeat; background-size: cover; background-position: center;`"
@click="toInquire(service.name)"> @click="toInquire(service.name)">
<div class="min-h-18 flex flex-col items-start px-1"> <div class="min-h-18 flex flex-col items-start px-1">
<div class="mt-1 max-w-max text-left text-gray-600 font-bold text-md" :class="[service.title === '个人大数据' ? 'text-lg' : '']"> <div class="mt-1 max-w-max text-left text-gray-600 font-bold text-md"
:class="[service.title === '个人大数据' ? 'text-lg' : '']">
{{ service.title }} {{ service.title }}
</div> </div>
<div class="max-w-max text-left text-xs text-gray-600"> <div class="max-w-max text-left text-xs text-gray-600">
@@ -167,6 +173,16 @@ function toHistory() {
</div> </div>
</template> </template>
</div> </div>
<div class="mb-6 mt-6 py-4 flex flex-col items-center justify-center rounded-3xl from-blue-500 to-sky-400 bg-gradient-to-b text-center text-lg text-white line-height-12 shadow-xl"
@click="toCooperation">
<div class="flex items-center text-xl">
天远数据邀您共赢共享数据新价值
</div>
<div class="flex items-center">点击进入商务合作</div>
</div>
<div class="mt-4 rounded-2xl overflow-hidden" @click="toBigData">
<img src="@/assets/images/index_b_banner.png" class="w-full h-full" mode="widthFix" />
</div>
<div class="mt-4 box-border h-14 w-full flex items-center rounded-xl bg-white px-4 text-gray-700 shadow-xl" <div class="mt-4 box-border h-14 w-full flex items-center rounded-xl bg-white px-4 text-gray-700 shadow-xl"
@click="toHistory"> @click="toHistory">
<img class="mr-4 h-10 w-10" src="@/assets/images/bg_icon.png" mode="widthFix" /> <img class="mr-4 h-10 w-10" src="@/assets/images/bg_icon.png" mode="widthFix" />

View File

@@ -15,7 +15,8 @@ export default defineConfig({
strictPort: true, // 如果端口被占用则抛出错误而不是使用下一个可用端口 strictPort: true, // 如果端口被占用则抛出错误而不是使用下一个可用端口
proxy: { proxy: {
"/api/v1": { "/api/v1": {
target: "http://127.0.0.1:8888", // 本地接口地址 // target: "http://127.0.0.1:8888", // 本地接口地址
target: "https://www.tianyuandb.com", // 本地接口地址
changeOrigin: true, changeOrigin: true,
}, },
}, },

File diff suppressed because one or more lines are too long