This commit is contained in:
liangzai 2025-02-20 12:34:25 +08:00
parent ac45db1b20
commit ce708e3cfa
36 changed files with 1453 additions and 1115 deletions

View File

@ -1,71 +1,86 @@
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
/>
<title>
天远数据 - 婚恋评估、司法涉诉查询、婚姻状态、判决书查询工具
</title>
<meta
name="description"
content="天远数据提供婚恋评估报告、司法涉诉查询、婚姻状态查询、判决书查询、失信人、司法涉诉、企业涉诉、车辆核验等多项服务,帮助您查询婚姻信息、名下车辆、涉诉风险等,提供全面的法律与金融风险防范工具。"
/>
<meta
name="keywords"
content="婚恋评估, 司法涉诉查询, 判决书查询, 婚姻状态查询, 失信人, 司法涉诉查询, 企业涉诉查询, 名下车辆核验, 车辆核验, 婚姻报告, 法律风险, 信用风险, 银行卡黑名单, 手机身份证核验, 学历核验, AI律师"
/>
<meta name="author" content="天远数据" />
<meta
name="baidu-site-verification"
content="4d551d55896a88badef8dcdb14cf874c"
/>
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script>
window.jWeixin = window.wx;
delete window.wx;
</script>
<style>
#app-loading {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background-color: #fff;
z-index: 9999;
font-family: Arial, sans-serif;
color: #666;
}
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>天远数据 - 婚恋评估、司法涉诉查询、婚姻状态、判决书查询工具</title>
<meta name="description"
content="天远数据提供婚恋评估报告、司法涉诉查询、婚姻状态查询、判决书查询、失信人、个人涉诉、企业涉诉、车辆核验等多项服务,帮助您查询婚姻信息、名下车辆、涉诉风险等,提供全面的法律与金融风险防范工具。" />
<meta name="keywords"
content="婚恋评估, 司法涉诉查询, 判决书查询, 婚姻状态查询, 失信人, 个人涉诉查询, 企业涉诉查询, 名下车辆核验, 车辆核验, 婚姻报告, 法律风险, 信用风险, 银行卡黑名单, 手机身份证核验, 学历核验, AI律师" />
<meta name="author" content="天远数据" />
<meta name="baidu-site-verification" content="4d551d55896a88badef8dcdb14cf874c" />
<style>
#app-loading {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background-color: #fff;
z-index: 9999;
font-family: Arial, sans-serif;
color: #666;
}
/* 加载动画 */
.loading-spinner {
width: 50px;
height: 50px;
border: 5px solid #ccc;
border-top: 5px solid #3498db;
border-radius: 50%;
animation: spin 1s linear infinite;
margin-bottom: 16px;
/* 与文字的间距 */
}
/* 加载动画 */
.loading-spinner {
width: 50px;
height: 50px;
border: 5px solid #ccc;
border-top: 5px solid #3498db;
border-radius: 50%;
animation: spin 1s linear infinite;
margin-bottom: 16px;
/* 与文字的间距 */
}
/* 文字样式 */
.loading-text {
font-size: 16px;
color: #666;
}
/* 文字样式 */
.loading-text {
font-size: 16px;
color: #666;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
</style>
</head>
100% {
transform: rotate(360deg);
}
}
</style>
</head>
<body>
<div id="app-loading">
<div class="loading-spinner"></div>
<div class="loading-text">加载中</div>
</div>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
<body>
<div id="app-loading">
<div class="loading-spinner"></div>
<div class="loading-text">加载中</div>
</div>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

View File

@ -1,16 +1,30 @@
<script setup>
import { RouterLink, RouterView } from 'vue-router'
import WechatOverlay from './components/WechatOverlay.vue';
const { isWeChat } = useEnv()
onMounted(() => {
RefreshToken()
})
const RefreshToken = async () => {
const token = localStorage.getItem("token")
const refreshAfter = localStorage.getItem("refreshAfter")
const accessExpire = localStorage.getItem("accessExpire")
const currentTime = new Date().getTime();
if (accessExpire) {
const accessExpireInMilliseconds = parseInt(accessExpire) * 1000; //
if (currentTime > accessExpireInMilliseconds) {
if (isWeChat.value) {
h5WeixinLogin()
}
return
}
}
// 1. token
if (!token) {
if (isWeChat.value) {
h5WeixinLogin()
}
return;
}
@ -21,23 +35,77 @@ const RefreshToken = async () => {
return;
}
}
// 3. refreshAfter refreshAfter token
refreshToken()
}
const mpWeixinLogin = () => {
}
const refreshToken = async () => {
const { data, error } = await useApiFetch("/user/getToken")
.post()
.json();
if (data.value && !error.value) {
if (data.value !== 200) {
if (data.value.code === 200) {
localStorage.setItem("token", data.value.data.accessToken);
localStorage.setItem("refreshAfter", data.value.data.refreshAfter);
localStorage.setItem("accessExpire", data.value.data.accessExpire);
}
}
}
const h5WeixinLogin = async () => {
// URL
const url = new URL(window.location.href);
//
const params = new URLSearchParams(url.search);
//
const code = params.get('code');
const state = params.get('state')
if (code && state) {
const { data, error } = await useApiFetch("/user/wxh5Auth")
.post({ code })
.json();
if (data.value && !error.value) {
if (data.value.code === 200) {
localStorage.setItem("token", data.value.data.accessToken);
localStorage.setItem("refreshAfter", data.value.data.refreshAfter);
localStorage.setItem("accessExpire", data.value.data.accessExpire);
params.delete('code');
params.delete('state');
// URL
const newUrl = `${url.origin}${url.pathname}?${params.toString()}`;
window.history.replaceState({}, '', newUrl);
}
}
} else {
h5WeixinGetCode()
}
}
const h5WeixinGetCode = () => {
const currentUrl = window.location.origin;
let redirectUri = encodeURIComponent(currentUrl);
// let redirectUri = "https://www.quannengcha.com"
let appId = 'wxa581992dc74d860e';
let state = "snsapi_base"
let scope = "snsapi_base";
let authUrl =
`https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${redirectUri}&response_type=code&scope=${scope}&state=${state}#wechat_redirect`;
// URL
window.location.href = authUrl;
}
</script>
<template>
<WechatOverlay />
<RouterView />
</template>

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1739431145867" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1589" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M795.442 73a38 38 0 0 1 35.204 23.693L951.218 393.37c7.042 17.326 0.43 37.2-15.589 46.854l-2.63 1.583L933 860c0 52.49-42.125 95.14-94.412 95.987L837 956H198c-52.49 0-95.14-42.125-95.987-94.412L102 860V450.436l-16.391-10.474c-15.605-9.972-21.727-29.72-14.57-46.741l0.22-0.515L201.222 95.764A38 38 0 0 1 236.034 73z m-77.406 373.306l-37.677 22.708c-41.905 25.255-94.4 24.824-135.854-1.01l-1.252-0.79-32.717-20.908-37.677 22.708c-41.905 25.255-94.4 24.824-135.854-1.01l-1.252-0.79-32.717-20.908-39.657 23.901c-30.927 18.64-67.792 22.875-101.38 12.828L162 860c0 19.683 15.797 35.677 35.405 35.995L198 896h639c19.683 0 35.677-15.797 35.995-35.405L873 860V476.714c-39.43 17.315-85.348 14.08-122.247-9.5l-32.717-20.908z m62.598-313.307H250.42L133.766 399.531l28.744 18.37a66.275 66.275 0 0 0 69.25 1.303l0.648-0.386 71.555-43.124 64.099 40.962a70 70 0 0 0 73.827 0.969l69.574-41.931 64.099 40.962a70 70 0 0 0 73.827 0.969l69.574-41.931 64.099 40.962a70 70 0 0 0 73.827 0.969l31.665-19.084-107.92-265.542z" fill="#1296db" p-id="1590"></path><path d="M335.81 565.173l54.876 0.41 82.301 190-55.056 23.85-16.649-38.434h-78.957l-17.52 38.844-54.693-24.67 85.699-190z m26.792 86.529l-13.215 29.297h25.905l-12.69-29.297zM502.395 561.66l60 0.11v0.236l0.492 0.005c45.692 0.736 82.613 37.772 82.613 83.489 0 45.717-36.92 82.753-82.613 83.489l-0.803 0.005-0.084 46.061-60-0.11 0.395-213.286z m59.888 60.352l-0.087 46.978c12.991-0.36 23.304-10.8 23.304-23.49 0-12.662-10.267-23.083-23.217-23.488zM691.697 561.66l60 0.11-0.394 213.285-60-0.11z" fill="#1296db" p-id="1591"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1736930506398" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="18562" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M997.307733 535.210667A353.09568 353.09568 0 0 1 791.893333 600.746667c-59.255467 0-115.0976-14.609067-164.2496-40.277334-149.9136 11.0592-300.987733 1.024-448.7168-30.378666 24.712533-67.9936 46.011733-131.549867 74.205867-193.262934a57.685333 57.685333 0 0 1 37.205333-25.463466l152.234667-2.389334C438.954667 288.426667 436.906667 267.332267 436.906667 245.76c0-8.055467 0.341333-16.042667 0.887466-23.9616-62.805333 0.6144-110.523733 3.345067-121.105066 5.3248-71.8848 5.870933-132.369067 56.1152-151.483734 125.610667-14.472533 47.104-31.470933 93.3888-50.926933 138.717866-3.549867 9.216-15.223467 21.367467-21.2992 21.367467C40.96 508.040533 20.548267 539.716267 5.3248 580.471467a61.269333 61.269333 0 0 0 0 24.917333l53.6576 13.789867c-3.072 74.205867-3.072 147.933867-3.072 221.5936 0 39.7312 0 78.301867 3.072 119.057066 0.136533 19.456 6.485333 38.2976 18.158933 53.8624a477.934933 477.934933 0 0 0 166.0928 0c11.127467-4.096 16.725333-61.986133 26.350934-96.597333h492.1344c12.0832 32.494933-11.195733 72.635733 26.282666 96.597333a475.436373 475.436373 0 0 0 162.133334-3.072 80.827733 80.827733 0 0 0 17.2032-46.557866V682.3936c-1.092267-20.48-3.4816-40.891733-7.031467-61.098667l57.7536-15.496533c2.594133-10.376533 2.594133-21.162667 0-31.5392-2.935467-15.428267-10.4448-28.808533-20.753067-39.048533z m-688.128 206.848a50.223787 50.223787 0 0 1-32.836266 24.917333c-17.885867 3.072-36.0448 4.096-54.203734 3.072l2.389334-1.160533c-28.330667-2.594133-53.179733-3.549867-79.0528-8.669867-32.904533-7.031467-43.281067-31.470933-32.904534-75.639467 5.051733-30.037333 29.422933-31.5392 50.722134-24.507733a1187.089067 1187.089067 0 0 1 126.634666 50.926933c10.103467 4.642133 21.845333 23.483733 19.2512 31.061334z m576.375467 17.681066c-26.282667 4.9152-52.8384 8.3968-79.530667 10.376534h-0.273066v-0.546134c-22.9376-0.6144-45.738667-2.594133-68.4032-6.075733-25.326933-5.597867-33.3824-35.157333-11.127467-45.806933 49.152-23.074133 99.9424-42.461867 152.029867-57.9584 20.753067-6.075733 34.542933 6.621867 35.976533 33.518933 1.4336 26.965333 9.216 58.026667-28.672 66.491733z" p-id="18563" fill="#1296db"></path><path d="M589.073067 230.263467h7.645866c0 88.064 72.772267 160.836267 160.836267 160.836266s160.836267-72.772267 160.836267-160.836266-72.772267-160.836267-160.836267-160.836267-160.836267 72.704-160.836267 160.836267h-7.645866z m421.205333 210.5344c11.4688 11.4688 11.4688 30.651733 0 42.120533s-30.651733 11.4688-42.120533 0L891.562667 406.3232c-38.2976 30.651733-84.241067 45.943467-134.075734 45.943467-122.538667 0-222.0032-99.601067-222.0032-222.0032 0-122.538667 99.601067-222.0032 222.0032-222.0032 122.538667 0 222.0032 99.601067 222.0032 222.0032 0 49.7664-15.291733 95.778133-45.943466 134.075733l76.731733 76.458667z" p-id="18564" fill="#1296db"></path></svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1739523534229" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="14507" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M491.52 0c-20.48 0-40.96 2.275556-59.164444 4.551111-47.786667 4.551111-93.297778 15.928889-136.533334 31.857778 0 0 354.986667 336.782222 364.088889 350.435555V27.306667c-11.377778-4.551111-20.48-6.826667-31.857778-9.102223-43.235556-11.377778-88.746667-18.204444-136.533333-18.204444z" fill="#F26848" p-id="14508"></path><path d="M853.333333 118.328889c-13.653333-15.928889-29.582222-29.582222-45.511111-40.96C769.137778 45.511111 728.177778 20.48 682.666667 0c0 0 2.275556 530.204444 0 546.133333l273.066666-279.893333c-4.551111-11.377778-11.377778-20.48-15.928889-31.857778-22.755556-40.96-52.337778-79.644444-86.471111-116.053333z" fill="#5D62D4" p-id="14509"></path><path d="M987.591111 295.822222S650.808889 650.808889 637.155556 659.911111h359.537777c4.551111-11.377778 6.826667-20.48 9.102223-31.857778 11.377778-43.235556 18.204444-88.746667 18.204444-136.533333 0-20.48-2.275556-40.96-4.551111-59.164444-4.551111-47.786667-15.928889-93.297778-31.857778-136.533334z" fill="#4694E9" p-id="14510"></path><path d="M757.76 955.733333c9.102222-4.551111 20.48-11.377778 29.582222-15.928889 38.684444-22.755556 75.093333-52.337778 106.951111-86.471111 13.653333-13.653333 27.306667-29.582222 38.684445-45.511111 27.306667-38.684444 52.337778-79.644444 70.542222-125.155555 0 0-484.693333 2.275556-500.622222 0l254.862222 273.066666z" fill="#69DEF0" p-id="14511"></path><path d="M364.088889 637.155556v359.537777c11.377778 4.551111 20.48 6.826667 31.857778 9.102223 43.235556 11.377778 88.746667 18.204444 136.533333 18.204444 20.48 0 40.96-2.275556 59.164444-4.551111 47.786667-4.551111 93.297778-15.928889 136.533334-34.133333C728.177778 987.591111 373.191111 650.808889 364.088889 637.155556z" fill="#83E45A" p-id="14512"></path><path d="M341.333333 455.111111L68.266667 735.004444c4.551111 11.377778 11.377778 20.48 15.928889 31.857778 22.755556 43.235556 52.337778 81.92 86.471111 116.053334 13.653333 15.928889 29.582222 29.582222 45.511111 40.96C254.862222 955.733333 298.097778 983.04 341.333333 1001.244444c0 0-2.275556-530.204444 0-546.133333z" fill="#BBDC64" p-id="14513"></path><path d="M18.204444 395.946667c-11.377778 43.235556-18.204444 88.746667-18.204444 136.533333 0 20.48 2.275556 40.96 4.551111 59.164444 4.551111 47.786667 15.928889 93.297778 34.133333 136.533334 0 0 336.782222-354.986667 350.435556-364.088889H27.306667c-4.551111 11.377778-6.826667 20.48-9.102223 31.857778z" fill="#F3DF68" p-id="14514"></path><path d="M248.035556 84.195556C207.075556 106.951111 170.666667 136.533333 136.533333 170.666667c-13.653333 13.653333-27.306667 29.582222-40.96 45.511111C65.991111 254.862222 40.96 295.822222 22.755556 341.333333c0 0 507.448889-2.275556 523.377777 0L277.617778 68.266667c-11.377778 4.551111-20.48 11.377778-29.582222 15.928889z" fill="#F7B964" p-id="14515"></path></svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1739523547121" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="15535" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M1024 512c0 282.794667-229.205333 512-512 512S0 794.794667 0 512 229.205333 0 512 0s512 229.205333 512 512" fill="#FA7268" p-id="15536"></path><path d="M685.226667 355.157333h-27.374934a20.616533 20.616533 0 0 0-20.6848 20.718934c0 11.434667 9.216 20.650667 20.6848 20.650666h27.374934c5.051733 0 9.216 4.130133 9.216 9.216v305.732267a9.216 9.216 0 0 1-9.216 9.216H339.114667a9.216 9.216 0 0 1-9.216-9.216v-305.732267c0-5.085867 4.096-9.216 9.216-9.216h27.989333c11.4688 0 20.6848-9.216 20.6848-20.6848a20.616533 20.616533 0 0 0-20.6848-20.650666h-27.989333a50.517333 50.517333 0 0 0-50.5856 50.551466v305.732267c0 27.989333 22.562133 50.5856 50.551466 50.5856h345.8048a50.517333 50.517333 0 0 0 50.5856-50.5856v-305.732267a50.005333 50.005333 0 0 0-50.244266-50.5856" fill="#FFFFFF" p-id="15537"></path><path d="M480.6656 500.565333a20.923733 20.923733 0 0 0-29.2864 0l-86.8352 86.8352a20.923733 20.923733 0 0 0 0 29.2864c4.130133 4.096 9.216 6.007467 14.6432 6.007467a20.241067 20.241067 0 0 0 14.6432-6.007467l72.192-72.226133 72.226133 72.226133a4.949333 4.949333 0 0 0 1.604267 1.262934 20.241067 20.241067 0 0 0 13.0048 4.437333 18.944 18.944 0 0 0 9.250133-2.218667 20.514133 20.514133 0 0 0 5.393067-3.822933l86.8352-86.869333a20.855467 20.855467 0 0 0 0-29.252267 20.923733 20.923733 0 0 0-29.218133 0l-72.260267 72.226133-72.192-71.8848zM497.834667 440.763733c4.130133 4.130133 9.216 6.0416 14.6432 6.0416a20.206933 20.206933 0 0 0 14.6432-6.0416l87.7568-87.825066a20.855467 20.855467 0 0 0 0-29.252267 20.8896 20.8896 0 0 0-29.218134 0L532.821333 376.490667V231.424a20.616533 20.616533 0 0 0-20.650666-20.650667 20.616533 20.616533 0 0 0-20.6848 20.650667v144.418133l-52.189867-51.882666a20.957867 20.957867 0 0 0-29.252267 0 20.923733 20.923733 0 0 0 0 29.320533l87.790934 87.483733z" fill="#FFFFFF" p-id="15538"></path></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1739523560037" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="16553" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M512 0C229.376 0 0 229.376 0 512s229.376 512 512 512 512-229.376 512-512S794.624 0 512 0z" fill="#0087FF" p-id="16554"></path><path d="M575.8976 449.536l-11.264-11.264c-5.7344-5.7344-11.264-5.7344-16.9984-5.7344-14.1312 0-25.6 11.264-25.6 25.6 0 5.7344 2.8672 11.264 5.7344 16.9984 0 0 2.8672 2.8672 5.7344 2.8672 2.8672 2.8672 5.7344 2.8672 5.7344 5.7344l2.8672 2.8672c25.6 25.6 16.9984 70.8608-8.6016 96.256l-110.592 110.592c-25.6 25.6-67.9936 25.6-93.5936 0l-2.8672-2.8672c-25.6-25.6-25.6-67.9936 0-93.5936l48.128-48.128c5.7344-5.7344 11.264-11.264 11.264-22.7328 0-14.1312-11.264-28.2624-28.2624-28.2624-5.7344 2.8672-11.264 5.7344-14.1312 8.6016-2.8672 0-2.8672 2.8672-5.7344 5.7344L286.72 560.3328c-48.128 48.128-48.128 127.5904 0 175.7184l2.8672 2.8672c48.128 48.128 127.5904 48.128 175.7184 0l110.592-110.592c48.128-51.4048 50.9952-127.7952 0-178.7904z m0 0" fill="#FFFFFF" p-id="16555"></path><path d="M737.4848 287.9488c-50.9952-50.9952-130.4576-50.9952-175.7184-2.8672l-113.2544 110.592c-48.128 48.128-50.9952 116.1216-2.8672 167.1168h2.8672l11.264 11.264c2.8672 2.8672 8.6016 2.8672 11.264 2.8672 14.1312 0 22.7328-11.264 22.7328-22.7328 0-2.8672 0-8.6016-2.8672-11.264 0-5.7344-5.7344-11.264-8.6016-14.1312l-2.8672-2.8672c-25.6-25.6-16.9984-62.2592 8.6016-90.7264l110.592-110.592c25.6-25.6 67.9936-25.6 93.5936 0l2.8672 2.8672c25.6 25.6 25.6 67.9936 0 93.5936l-48.128 48.128c-5.7344 5.7344-11.264 14.1312-11.264 22.7328 0 14.1312 11.264 28.2624 28.2624 28.2624 5.7344 0 11.264 0 14.1312-2.8672 2.8672-2.8672 5.7344-2.8672 5.7344-5.7344l50.9952-48.128c50.7904-50.7904 50.7904-127.3856 2.6624-175.5136z m0 0" fill="#FFFFFF" p-id="16556"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1739523523170" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13404" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M512 512m-512 0a512 512 0 1 0 1024 0 512 512 0 1 0-1024 0Z" fill="#15C521" p-id="13405"></path><path d="M665.00608 409.47712c3.66592 0 7.24992 0.06144 10.83392 0.24576-18.96448-104.448-125.68576-184.44288-254.50496-184.44288C279.10144 225.28 163.84 322.7648 163.84 443.02336c0 70.51264 39.6288 133.20192 101.0688 172.99456l2.37568 1.49504L242.3808 696.32l93.10208-47.9232 4.38272 1.24928a300.8512 300.8512 0 0 0 98.77504 10.56768 170.63936 170.63936 0 0 1-8.192-51.93728c0-109.7728 105.0624-198.79936 234.55744-198.79936z m-154.07104-76.84096c19.968 0 36.1472 15.83104 36.1472 35.40992 0 19.51744-16.1792 35.38944-36.1472 35.38944-19.98848 0-36.1472-15.872-36.1472-35.38944 0-19.57888 16.1792-35.40992 36.1472-35.40992z m-179.2 70.79936c-19.968 0-36.1472-15.872-36.1472-35.38944 0-19.57888 16.1792-35.40992 36.1472-35.40992 19.98848 0 36.18816 15.83104 36.18816 35.40992 0 19.51744-16.19968 35.38944-36.18816 35.38944z" fill="#FFFFFF" p-id="13406"></path><path d="M450.56 609.93536c0 99.34848 96.29696 179.89632 215.08096 179.89632a253.07136 253.07136 0 0 0 71.68-10.26048L815.02208 819.2l-20.76672-65.1264 1.98656-1.2288C847.52384 719.9744 880.64 668.20096 880.64 609.93536 880.64 510.60736 784.384 430.08 665.64096 430.08 546.85696 430.08 450.56 510.60736 450.56 609.93536z m259.6864-61.952c0-16.13824 13.49632-29.20448 30.16704-29.20448 16.71168 0 30.22848 13.06624 30.22848 29.20448 0 16.1792-13.5168 29.26592-30.22848 29.26592-16.67072 0-30.16704-13.1072-30.16704-29.26592z m-149.66784 0c0-16.13824 13.5168-29.20448 30.208-29.20448 16.6912 0 30.208 13.06624 30.208 29.20448 0 16.1792-13.5168 29.26592-30.208 29.26592-16.6912 0-30.208-13.1072-30.208-29.26592z" fill="#FFFFFF" p-id="13407"></path></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1739502172305" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4607" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M569.2 788.4H215.8c-77.8 0-141.5-63.7-141.5-141.5V207.5C74.3 129.6 137.9 66 215.8 66h353.4c77.8 0 141.5 63.7 141.5 141.5v439.4c0 77.8-63.7 141.5-141.5 141.5z" fill="#D6F3FA" p-id="4608"></path><path d="M678.8 276.5v42.7c0 0.6-0.5 1.1-1.1 1.1h-418c-0.6 0-1.1-0.5-1.1-1.1v-42.7c0-0.6 0.5-1.1 1.1-1.1h418c0.6 0 1.1 0.5 1.1 1.1zM677.6 463h-418c-0.6 0-1.1 0.5-1.1 1.1v42.7c0 0.6 0.5 1.1 1.1 1.1h418c0.6 0 1.1-0.5 1.1-1.1v-42.7c0.1-0.6-0.4-1.1-1.1-1.1zM485 650.7H259.6c-0.6 0-1.1 0.5-1.1 1.1v42.7c0 0.6 0.5 1.1 1.1 1.1H485c0.6 0 1.1-0.5 1.1-1.1v-42.7c0-0.6-0.5-1.1-1.1-1.1z m466.5-24.1c0-59.1-48.1-107.3-107.3-107.3-59.1 0-107.3 48.1-107.3 107.3 0 59.1 48.1 107.3 107.3 107.3 59.2-0.1 107.3-48.2 107.3-107.3z m-34.4 0c0 40.2-32.7 72.9-72.9 72.9s-72.9-32.7-72.9-72.9 32.7-72.9 72.9-72.9 72.9 32.7 72.9 72.9zM706 759.5c0-50.9-41.4-92.3-92.3-92.3s-92.3 41.4-92.3 92.3 41.4 92.3 92.3 92.3c50.9-0.1 92.3-41.4 92.3-92.3z m-34.4 0c0 31.9-26 57.9-57.9 57.9s-57.9-26-57.9-57.9 26-57.9 57.9-57.9 57.9 26 57.9 57.9z m135.1 80.4c-33.2 0-60 26.9-60 60 0 33.2 26.9 60 60 60s60-26.9 60-60c0-33.2-26.8-60-60-60z m-27.2-148.1L755 649.3l-83.5 48.2L696 740l83.5-48.2z m-105.7 99.9L650.5 832 787 910.8l23.3-40.3-136.5-78.8z m-135.1 95.4c0-12.4-10.1-22.5-22.5-22.5H246c-41.5 0-75.1-33.6-75.1-75.1V234.1c0-41.5 33.6-75.1 75.1-75.1h52.5c12.4 0 22.5-10.1 22.5-22.5S310.9 114 298.5 114H246c-66.3 0-120.1 53.8-120.1 120.1v555.4c0 66.3 53.8 120.1 120.1 120.1h270.2c12.4 0 22.5-10.1 22.5-22.5z m277.7-488.3V234.1c0-66.3-53.8-120.1-120.1-120.1H448.6c-12.4 0-22.5 10.1-22.5 22.5s10.1 22.5 22.5 22.5h247.7c41.5 0 75.1 33.6 75.1 75.1v164.7c0 12.4 10.1 22.5 22.5 22.5s22.5-10.1 22.5-22.5zM408.1 157.9v-42.7c0-0.6-0.5-1.1-1.1-1.1h-65.3c-0.6 0-1.1 0.5-1.1 1.1v42.7c0 0.6 0.5 1.1 1.1 1.1H407c0.6 0 1.1-0.5 1.1-1.1z" fill="#18BAE5" p-id="4609"></path></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1739502235932" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12319" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M512 0C229.2 0 0 229.2 0 512s229.2 512 512 512 512-229.2 512-512S794.8 0 512 0z m177.3 336.7c51 0 92.7 44.7 92.7 99.8s-41.4 99.8-92.7 99.8c-43.6 0-80.5-32.3-90.2-76.2 15.5-20 24.4-45.9 24.4-73.9 0-6.4-0.7-12.4-1.5-18.4 17.1-19.1 40.7-31.1 67.3-31.1zM515 282.1c53.6 0 96.8 46.7 96.8 104.2s-43.6 104.2-97.2 104.2-96.8-46.7-96.8-104.2 43.6-104.2 97.2-104.2z m-181.1 54.6c29.2 0 55.4 14.4 72.4 37.1-0.4 4-0.7 8-0.7 12 0 25.1 7.4 48.3 19.9 67.5-7.4 47.1-45.8 83-91.6 83-51.4 0-92.7-44.7-92.7-99.8 0-55 41.4-99.8 92.7-99.8zM179.5 741.9c0-99.8 69.5-180.4 154.8-180.4 16.6 0 33.3 3.2 49.1 9.2-42.5 41.5-70.9 102.6-74.3 171.3l-129.6-0.1z m153.7 0c0-117 81.3-212 181.8-212s181.8 95 182.2 212h-364z m387.6-0.4c-3.7-69.5-32.5-131.3-76.1-172.5 14.4-4.8 29.9-7.6 45.1-7.6 85.3 0 154.8 80.6 154.8 180l-123.8 0.1z" fill="#2ACE4D" p-id="12320"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

View File

@ -168,6 +168,7 @@ declare global {
const useElementHover: typeof import('@vueuse/core')['useElementHover']
const useElementSize: typeof import('@vueuse/core')['useElementSize']
const useElementVisibility: typeof import('@vueuse/core')['useElementVisibility']
const useEnv: typeof import('./composables/useEnv.js')['useEnv']
const useEnvironment: typeof import('./composables/useEnvironment.js')['useEnvironment']
const useEventBus: typeof import('@vueuse/core')['useEventBus']
const useEventListener: typeof import('@vueuse/core')['useEventListener']

View File

@ -0,0 +1,47 @@
<template>
<div class="card my-2">
<div>
<van-icon name="info-o" class="tips-icon" />
<span class="tips-title">温馨提示</span>
</div>
<div>
<van-text-ellipsis rows="2" :content="content" expand-text="展开" collapse-text="收起" />
</div>
</div>
</template>
<script setup>
import { ref, defineProps } from 'vue';
const props = defineProps({
content: {
type: String,
required: true
}
});
const isExpanded = ref(false);
</script>
<style scoped>
.tips-card {
background: #f7faff;
border-radius: 8px;
padding: 12px;
}
.tips-icon {
color: #1989fa;
margin-right: 5px;
}
.tips-title {
font-weight: bold;
font-size: 16px;
}
.tips-content {
font-size: 14px;
color: #333;
}
</style>

View File

@ -24,8 +24,19 @@
<!-- 支付方式选择 -->
<div class="">
<van-cell-group inset>
<van-cell v-if="isWeChat" title="微信支付" clickable @click="selectedPaymentMethod = 'wechat'">
<template #icon>
<van-icon size="24" name="wechat-pay" color="#1AAD19" class="mr-2" />
</template>
<template #right-icon>
<van-radio v-model="selectedPaymentMethod" name="wechat" />
</template>
</van-cell>
<!-- 支付宝支付 -->
<van-cell title="支付宝支付" clickable @click="selectedPaymentMethod = 'alipay'">
<van-cell v-else title="支付宝支付" clickable @click="selectedPaymentMethod = 'alipay'">
<template #icon>
<van-icon size="24" name="alipay" color="#00A1E9" class="mr-2" />
</template>
@ -44,6 +55,8 @@
<script setup>
import { ref, defineProps } from 'vue'
const { isWeChat } = useEnv()
const props = defineProps({
data: {
type: Object,
@ -56,23 +69,10 @@ const props = defineProps({
})
const show = defineModel()
const orderId = ref("")
const selectedPaymentMethod = ref('alipay')
const router = useRouter()
const selectedPaymentMethod = ref(isWeChat ? 'wechat' : 'alipay')
const discountPrice = ref(false) //
onMounted(() => {
// let m = localStorage.getItem("m")
// let hour = "12"
// if (m === "shifenliangzai") {
// hour = "00"
// }
// const currentDate = new Date()
// const startDate = new Date(`2025-01-01T${hour}:00:00+08:00`) // 20251112
// const endDate = new Date('2025-01-02T12:00:00+08:00') // 20251212
// console.log(startDate, endDate)
// if (currentDate >= startDate && currentDate <= endDate) {
// discountPrice.value = true //
// } else {
// discountPrice.value = false //
// }
})
async function getPayment() {
@ -84,14 +84,28 @@ async function getPayment() {
.json()
if (data.value && !error.value) {
orderId.value = data.value.data.order_id
const prepayUrl = data.value.data.prepay_id;
const paymentForm = document.createElement('form');
paymentForm.method = 'POST';
paymentForm.action = prepayUrl;
paymentForm.style.display = 'none';
document.body.appendChild(paymentForm);
paymentForm.submit();
if (selectedPaymentMethod.value === 'alipay') {
orderId.value = data.value.data.order_id
const prepayUrl = data.value.data.prepay_id;
const paymentForm = document.createElement('form');
paymentForm.method = 'POST';
paymentForm.action = prepayUrl;
paymentForm.style.display = 'none';
document.body.appendChild(paymentForm);
paymentForm.submit();
} else {
const payload = data.value.data.prepay_data
console.log("payload", payload)
WeixinJSBridge.invoke('getBrandWCPayRequest', payload,
function (res) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
console.log("支付成功", res)
router.push({ path: '/report', query: { orderId: data.value.data.order_id } });
}
})
}
}
show.value = false
}

View File

@ -0,0 +1,39 @@
<template>
<van-popup v-model:show="show" position="bottom">
<div class="max-h-[calc(100vh-100px)] m-4 ">
<div class="p-4 bg-gray-200">
<!-- <van-swipe lazy-render>
<van-swipe-item v-for="image in images" :key="image" class="">
</van-swipe-item>
</van-swipe> -->
<img class="rounded-xl shadow h-[500px] m-auto" src="@/assets/images/tg_qrcode_1.jpg" />
</div>
<div class="m-2">分享到</div>
<div class="flex items-center justify-around">
<div class="flex flex-col items-center justify-center" @click="toPromote">
<img src="@/assets/images/icon_share_wechat.svg" class="w-12 h-12 rounded-full" />
<div class="text-center mt-1">微信好友</div>
</div>
<div class="flex flex-col items-center justify-center">
<img src="@/assets/images/icon_share_friends.svg" class="w-12 h-12 rounded-full" />
<div class="text-center mt-1">微信朋友圈</div>
</div>
<div class="flex flex-col items-center justify-center">
<img src="@/assets/images/icon_share_img.svg" class="w-12 h-12 rounded-full" />
<div class="text-center mt-1">保存图片</div>
</div>
<div class="flex flex-col items-center justify-center">
<img src="@/assets/images/icon_share_url.svg" class="w-12 h-12 rounded-full" />
<div class="text-center mt-1">复制链接</div>
</div>
</div>
</div>
</van-popup>
</template>
<script setup>
const show = defineModel()
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,13 @@
<template>
<van-popup v-model:show="show" closeable round :style="{ padding: '18px' }">
<img src="@/assets/images/qrcode_qnc.jpg" alt="qrcode">
<div class="text-center font-bold text-2xl">更多服务请关注全能查官号</div>
</van-popup>
</template>
<script setup>
const show = defineModel('show')
</script>
<style lang="scss" scoped></style>

View File

@ -1,44 +1,49 @@
// src/plugins/fetch.js
import { createFetch } from '@vueuse/core'
import router from '@/router' // 假设你使用 Vue Router
import { createFetch } from "@vueuse/core";
import router from "@/router"; // 假设你使用 Vue Router
// 创建全局的 fetch 实例
const useApiFetch = createFetch({
baseUrl: '/api/v1', // 你的 API 基础路径
baseUrl: "/api/v1", // 你的 API 基础路径
options: {
async beforeFetch({ options }) {
showLoadingToast({
message: '加载中...',
message: "加载中...",
forbidClick: true,
duration: 0, // 设置为 0 表示不会自动关闭
loadingType: 'spinner',
})
loadingType: "spinner",
});
// 获取平台信息
const brand = "qnc"; // 固定的品牌信息
const brand = "tydata"; // 固定的品牌信息
// 在请求前添加通用的 Header例如 Authorization
const token = localStorage.getItem('token')
const token = localStorage.getItem("token");
let platform = "h5";
const userAgent = navigator.userAgent.toLowerCase();
const isWechat = /micromessenger/.test(userAgent);
if (isWechat) {
platform = "h5-weixin";
}
if (token) {
options.headers = {
...options.headers,
'X-Platform': 'h5', // 添加平台信息
'X-Brand': brand, // 添加品牌信息
"X-Platform": platform, // 添加平台信息
"X-Brand": brand, // 添加品牌信息
Authorization: `${token}`,
}
};
}
return { options }
return { options };
},
async afterFetch({ data, response }) {
closeToast();
// 全局处理响应
if (response.status === 401) {
// 清除本地存储的 token
localStorage.removeItem('token')
localStorage.removeItem("token");
// 跳转到登录页
router.replace('/login')
router.replace("/login");
}
if (data.code !== 200) {
@ -46,25 +51,25 @@ const useApiFetch = createFetch({
showToast({ message: data.msg });
}
}
return { data, response }
return { data, response };
},
async onFetchError({ error, response }) {
console.log("error", error)
console.log("error", error);
closeToast();
if (response.status === 401) {
// 清除本地存储的 token
localStorage.removeItem('token')
localStorage.removeItem("token");
// 跳转到登录页
router.replace('/login')
router.replace("/login");
} else {
if (typeof error === 'string') {
if (typeof error === "string") {
showToast({ message: error });
}
}
return { error }
return { error };
},
},
})
});
export default useApiFetch
export default useApiFetch;

15
src/composables/useEnv.js Normal file
View File

@ -0,0 +1,15 @@
// src/composables/useEnv.js
import { ref, onMounted } from "vue";
export function useEnv() {
const isWeChat = ref(false);
onMounted(() => {
const userAgent = navigator.userAgent.toLowerCase();
isWeChat.value = userAgent.includes("micromessenger");
});
return {
isWeChat,
};
}

View File

@ -54,6 +54,7 @@ const route = useRoute();
const tabbar = ref('index');
const menu = reactive([
{ title: '首页', icon: 'home-o', name: 'index' },
{ title: '推广', icon: 'balance-o', name: 'agent' },
{ title: 'AI律师', icon: 'chat-o', name: 'ai' },
{ title: '我的', icon: 'user-o', name: 'me' },
]);
@ -72,7 +73,8 @@ const tabChange = (name) => {
//
const toComplaint = () => {
router.push({ name: 'complaint' }); // 使 Vue Router
window.location.href = 'https://work.weixin.qq.com/kfid/kfc5c19b2b93a5e73b9' //
// router.push({ name: 'complaint' }); // 使 Vue Router
};
@ -135,5 +137,6 @@ const toComplaint = () => {
border-top: 1px solid #e0e0e0;
padding-bottom: 60px;
background: #ffffff;
margin-bottom: 50px;
}
</style>

View File

@ -1,158 +1,159 @@
import { createRouter, createWebHistory } from 'vue-router'
import NProgress from 'nprogress';
import GlobalLayout from '@/layouts/GlobalLayout.vue';
import HomeLayout from '@/layouts/HomeLayout.vue';
import PageLayout from '@/layouts/PageLayout.vue';
import index from '@/views/index.vue';
import { createRouter, createWebHistory } from "vue-router";
import NProgress from "nprogress";
import GlobalLayout from "@/layouts/GlobalLayout.vue";
import HomeLayout from "@/layouts/HomeLayout.vue";
import PageLayout from "@/layouts/PageLayout.vue";
import index from "@/views/index.vue";
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: '/',
component: GlobalLayout, // 使用 Layout 作为父组件
children: [
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: '',
component: HomeLayout, // 使用 Layout 作为父组件
children: [
{
path: '',
name: 'index',
component: index,
},
{
path: 'ai',
name: 'ai',
component: () => import('@/views/Ai.vue'),
},
{
path: 'me',
name: 'me',
component: () => import('@/views/Me.vue'),
},
]
path: "/",
component: GlobalLayout, // 使用 Layout 作为父组件
children: [
{
path: "",
component: HomeLayout, // 使用 Layout 作为父组件
children: [
{
path: "",
name: "index",
component: index,
},
{
path: "ai",
name: "ai",
component: () => import("@/views/Ai.vue"),
},
{
path: "/agent",
name: "agent",
component: () => import("@/views/Agent.vue"),
},
{
path: "me",
name: "me",
component: () => import("@/views/Me.vue"),
},
],
},
{
path: "",
component: PageLayout,
children: [
{
path: "/historyQuery",
name: "history",
component: () => import("@/views/HistoryQuery.vue"),
meta: { title: "历史报告" },
},
{
path: "/promote",
name: "promote",
component: () => import("@/views/Promote.vue"),
meta: { title: "推广" },
},
{
path: "/withdraw",
name: "withdraw",
component: () => import("@/views/Withdraw.vue"),
meta: { title: "提现" },
},
{
path: "/service",
name: "service",
component: () => import("@/views/Service.vue"),
meta: { title: "客服" },
},
{
path: "/complaint",
name: "complaint",
component: () => import("@/views/Complaint.vue"),
meta: { title: "投诉" },
},
{
path: "/report",
name: "report",
component: () => import("@/views/Report.vue"),
meta: { title: "报告结果" },
},
{
path: "/example",
name: "example",
component: () => import("@/views/Example.vue"),
meta: { title: "示例报告" },
},
{
path: "/authorization",
name: "authorization",
component: () =>
import("@/views/Authorization.vue"),
meta: { title: "授权书" },
},
{
path: "/privacyPolicy",
name: "privacyPolicy",
component: () =>
import("@/views/PrivacyPolicy.vue"),
meta: { title: "隐私政策" },
},
{
path: "/userAgreement",
name: "userAgreement",
component: () =>
import("@/views/UserAgreement.vue"),
meta: { title: "用户协议" },
},
{
path: "/inquire/:feature",
name: "inquire",
component: () => import("@/views/Inquire.vue"),
meta: { title: "查询报告" },
},
],
},
],
},
{
path: "/login",
name: "login",
component: () => import("@/views/Login.vue"),
},
{
path: '',
component: PageLayout,
children: [
{
path: '/historyQuery',
name: 'history',
component: () => import('@/views/HistoryQuery.vue'),
meta: { title: '历史报告' },
},
{
path: '/service',
name: 'service',
component: () => import('@/views/Service.vue'),
meta: { title: '客服' },
},
{
path: '/complaint',
name: 'complaint',
component: () => import('@/views/Complaint.vue'),
meta: { title: '投诉' },
},
{
path: '/report',
name: 'report',
component: () => import('@/views/Report.vue'),
meta: { title: '报告结果' },
},
{
path: '/example',
name: 'example',
component: () => import('@/views/Example.vue'),
meta: { title: '示例报告' },
},
{
path: '/authorization',
name: 'authorization',
component: () => import('@/views/Authorization.vue'),
meta: { title: '授权书' },
},
{
path: '/privacyPolicy',
name: 'privacyPolicy',
component: () => import('@/views/PrivacyPolicy.vue'),
meta: { title: '隐私政策' },
},
{
path: '/userAgreement',
name: 'userAgreement',
component: () => import('@/views/UserAgreement.vue'),
meta: { title: '用户协议' },
},
{
path: '/listMarriage',
name: 'listMarriage',
component: () => import('@/views/list_marriage.vue'),
meta: { title: '婚姻查询' },
},
{
path: '/listRisk',
name: 'listRisk',
component: () => import('@/views/list_risk.vue'),
meta: { title: '风险查询' },
},
{
path: '/listLawsuit',
name: 'listLawsuit',
component: () => import('@/views/list_lawsuit.vue'),
meta: { title: '诉讼查询' },
},
{
path: '/listVerify',
name: 'listVerify',
component: () => import('@/views/list_verify.vue'),
meta: { title: '核验查询' },
},
{
path: '/inquire/:feature',
name: 'inquire',
component: () => import('@/views/Inquire.vue'),
meta: { title: '查询报告' },
},
],
path: "/promotionInquire/:feature",
name: "promotionInquire",
component: () => import("@/views/PromotionInquire.vue"),
},
]
},
// {
// path: '/home',
// name: 'home',
// component: () => import('@/views/Home.vue'),
// },
{
path: '/login',
name: 'login',
component: () => import('@/views/Login.vue'),
},
// {
// path: '/home',
// name: 'home',
// component: () => import('@/views/Home.vue'),
// },
{
path: "/:pathMatch(.*)*",
name: "NotFound",
component: () => import('@/views/NotFound.vue')
},
],
})
{
path: "/:pathMatch(.*)*",
name: "NotFound",
component: () => import("@/views/NotFound.vue"),
},
],
});
NProgress.configure({
easing: 'ease', // 动画方式
speed: 500, // 递增进度条的速度(毫秒)
showSpinner: false, // 是否显示加载的圆圈
trickleSpeed: 200, // 自动递增间隔
minimum: 0.3, // 初始化最小百分比
easing: "ease", // 动画方式
speed: 500, // 递增进度条的速度(毫秒)
showSpinner: false, // 是否显示加载的圆圈
trickleSpeed: 200, // 自动递增间隔
minimum: 0.3, // 初始化最小百分比
});
// 路由导航守卫
router.beforeEach((to, from, next) => {
NProgress.start(); // 启动进度条
next();
NProgress.start(); // 启动进度条
next();
});
router.afterEach(() => {
NProgress.done(); // 结束进度条
NProgress.done(); // 结束进度条
});
export default router
export default router;

View File

@ -2,233 +2,231 @@
import LTitle from "@/components/LTitle.vue";
const props = defineProps({
data: {
type: Object,
required: true,
},
data: {
type: Object,
required: true,
},
});
const { data } = props;
const entCollapse = ref([]);
</script>
<template>
<div class="">
<template v-if="!data || data.datalist.length === 0">
<!-- 显示暂无关联企业信息的提示 -->
<div class="card py-10 my-4 text-center text-gray-500">
暂无关联企业信息
<div class="">
<template v-if="!data || data.datalist.length === 0">
<!-- 显示暂无关联企业信息的提示 -->
<div class="card py-10 my-4 text-center text-gray-500">
暂无关联企业信息
</div>
</template>
<template v-else>
<div class="space-y-5">
<div v-for="(item, index) in data.datalist" :key="index" :name="index" class="card">
<div class="w-full space-y-3">
<div class="text-lg text-gray-800 font-bold">
{{ item.orgName }}
</div>
</template>
<template v-else>
<wd-collapse v-model="entCollapse" custom-class="space-y-5"
custom-style="background: transparent; !important">
<wd-collapse-item v-for="(item, index) in data.datalist" :key="index" :name="index" class="card">
<template #title="{ expanded }">
<div class="w-full space-y-3">
<div class="text-lg text-gray-800 font-bold">
{{ item.orgName }}
</div>
<div class="text-sm text-gray-700">
查询人{{ item.pName }}
</div>
<!-- 关联关系 -->
<div class="flex items-center gap-3">
<text class="flex-shrink-0 text-gray-700 font-medium">
与企业关联关系:
</text>
<text v-for="(relation, idx) in item.relationship" :key="idx"
class="flex-shrink-0 rounded-full bg-blue-100 px-3 py-1 text-xs text-blue-800">
{{
relation === "lp"
? "法人"
: relation === "sh"
? "股东"
: "高管"
}}
</text>
</div>
<div class="text-center text-blue-500">
{{ expanded ? "收起" : "点击查看更多" }}
</div>
</div>
</template>
<LTitle title="关联企业信息" type="blue-green" />
<!-- 基本信息 -->
<div class="pt-4 space-y-3">
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
企业状态
</text>
<text class="text-gray-600">
{{ item.basicInfo.regStatus }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
注册资本
</text>
<text class="text-gray-600">
{{ item.basicInfo.regCapital }}
{{ item.basicInfo.regCapitalCurrency }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
法人
</text>
<text class="text-gray-600">
{{ item.basicInfo.legalPersonName }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
统一社会信用代码
</text>
<text class="text-gray-600">
{{ item.basicInfo.creditCode }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
成立日期
</text>
<text class="text-gray-600">
{{ item.basicInfo.estiblishTime }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
经营范围
</text>
<text class="text-gray-600">
<LExpandCollapse :max-length="50">
{{ item.basicInfo.opscope }}
</LExpandCollapse>
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
地址
</text>
<text class="text-gray-600">
{{ item.basicInfo.province }}
{{ item.basicInfo.city }}
{{ item.basicInfo.district }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
行业
</text>
<text class="text-gray-600">
{{ item.basicInfo.industry }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
行业代码
</text>
<text class="text-gray-600">
{{ item.basicInfo.nic_code }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
公司类型
</text>
<text class="text-gray-600">
{{ item.basicInfo.companyOrgType }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
注册机关
</text>
<text class="text-gray-600">
{{ item.basicInfo.regorg }}
</text>
</div>
<div class="text-sm text-gray-700">
查询人{{ item.pName }}
</div>
<!-- 关联关系 -->
<div class="flex items-center gap-3">
<text class="flex-shrink-0 text-gray-700 font-medium">
与企业关联关系:
</text>
<text v-for="(relation, idx) in item.relationship" :key="idx"
class="flex-shrink-0 rounded-full bg-blue-100 px-3 py-1 text-xs text-blue-800">
{{
relation === "lp"
? "法人"
: relation === "sh"
? "股东"
: "高管"
}}
</text>
</div>
<!-- <div class="text-center text-blue-500">
{{ expanded ? "收起" : "点击查看更多" }}
</div> -->
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
行业名称
</text>
<text class="text-gray-600">
{{ item.basicInfo.nic_name }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
注册资本币种
</text>
<text class="text-gray-600">
{{ item.basicInfo.reccapcur }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
审核日期
</text>
<text class="text-gray-600">
{{ item.basicInfo.apprdate }}
</text>
</div>
</div>
<LTitle title="关联企业信息" type="blue-green" />
<!-- 基本信息 -->
<div class="pt-4 space-y-3">
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
企业状态
</text>
<text class="text-gray-600">
{{ item.basicInfo.regStatus }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
注册资本
</text>
<text class="text-gray-600">
{{ item.basicInfo.regCapital }}
{{ item.basicInfo.regCapitalCurrency }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
法人
</text>
<text class="text-gray-600">
{{ item.basicInfo.legalPersonName }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
统一社会信用代码
</text>
<text class="text-gray-600">
{{ item.basicInfo.creditCode }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
成立日期
</text>
<text class="text-gray-600">
{{ item.basicInfo.estiblishTime }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
经营范围
</text>
<text class="text-gray-600">
<LExpandCollapse :max-length="50">
{{ item.basicInfo.opscope }}
</LExpandCollapse>
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
地址
</text>
<text class="text-gray-600">
{{ item.basicInfo.province }}
{{ item.basicInfo.city }}
{{ item.basicInfo.district }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
行业
</text>
<text class="text-gray-600">
{{ item.basicInfo.industry }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
行业代码
</text>
<text class="text-gray-600">
{{ item.basicInfo.nic_code }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
公司类型
</text>
<text class="text-gray-600">
{{ item.basicInfo.companyOrgType }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
注册机关
</text>
<text class="text-gray-600">
{{ item.basicInfo.regorg }}
</text>
</div>
<!-- 高管信息 -->
<div v-if="item.basicInfo.staffList?.result?.length > 0" class="pt-4 space-y-3">
<LTitle title="高管信息" type="blue-green" />
<div v-for="(staff, idx) in item.basicInfo.staffList
.result" :key="idx" class="space-y-3">
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
姓名
</text>
<text class="text-gray-600">
{{ staff.name }}
</text>
</div>
<div v-for="(type, typeIdx) in staff.typeJoin" :key="typeIdx" class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
职位
</text>
<text class="text-gray-600">
{{ type }}
</text>
</div>
</div>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
行业名称
</text>
<text class="text-gray-600">
{{ item.basicInfo.nic_name }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
注册资本币种
</text>
<text class="text-gray-600">
{{ item.basicInfo.reccapcur }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
审核日期
</text>
<text class="text-gray-600">
{{ item.basicInfo.apprdate }}
</text>
</div>
</div>
<!-- 股东信息 -->
<div v-if="item.stockHolderItem" class="pt-4 space-y-3">
<LTitle title="股东信息" type="blue-green" />
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
股东类型
</text>
<text class="text-gray-600">
{{ item.stockHolderItem.orgHolderType }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
占比
</text>
<text class="text-gray-600">
{{ item.stockHolderItem.investRate }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
股东名称
</text>
<text class="text-gray-600">
{{ item.stockHolderItem.orgHolderName }}
</text>
</div>
</div>
<!-- 被执行人信息 -->
<!-- <div v-if="item.executedPerson?.length > 0" class="pt-4">
<!-- 高管信息 -->
<div v-if="item.basicInfo.staffList?.result?.length > 0" class="pt-4 space-y-3">
<LTitle title="高管信息" type="blue-green" />
<div v-for="(staff, idx) in item.basicInfo.staffList
.result" :key="idx" class="space-y-3">
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
姓名
</text>
<text class="text-gray-600">
{{ staff.name }}
</text>
</div>
<div v-for="(type, typeIdx) in staff.typeJoin" :key="typeIdx" class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
职位
</text>
<text class="text-gray-600">
{{ type }}
</text>
</div>
</div>
</div>
<!-- 股东信息 -->
<div v-if="item.stockHolderItem" class="pt-4 space-y-3">
<LTitle title="股东信息" type="blue-green" />
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
股东类型
</text>
<text class="text-gray-600">
{{ item.stockHolderItem.orgHolderType }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
占比
</text>
<text class="text-gray-600">
{{ item.stockHolderItem.investRate }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
股东名称
</text>
<text class="text-gray-600">
{{ item.stockHolderItem.orgHolderName }}
</text>
</div>
</div>
<!-- 被执行人信息 -->
<!-- <div v-if="item.executedPerson?.length > 0" class="pt-4">
<LTitle title="被执行人信息" type="blue-green" />
<div v-for="(person, pidx) in item.executedPerson" :key="pidx" class="border-b border-gray-400 border-b-dashed pb-4 pt-4 space-y-3">
<div class="flex justify-between">
@ -384,81 +382,81 @@ const entCollapse = ref([]);
</div>
</div> -->
<div v-if="item.adminPenalty?.length > 0" class="pt-4">
<LTitle title="行政处罚信息" type="blue-green" />
<div v-for="(penalty, aidx) in item.adminPenalty" :key="aidx"
class="border-b border-gray-400 border-b-dashed pb-4 pt-4 space-y-3">
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
处罚单位
</text>
<text class="text-gray-600">
{{ penalty.departmentName }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
处罚原因
</text>
<text class="text-gray-600">
{{ penalty.reason || "无" }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
处罚决定书文号
</text>
<text class="text-gray-600">
{{ penalty.punishNumber }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
处罚类别
</text>
<text class="text-gray-600">
{{ penalty.type }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
处罚结果
</text>
<text class="text-gray-600">
{{ penalty.content || "无" }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
处罚日期
</text>
<text class="text-gray-600">
{{ penalty.decisionDate }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
法人姓名
</text>
<text class="text-gray-600">
{{ penalty.legalPersonName }}
</text>
</div>
</div>
</div>
</wd-collapse-item>
</wd-collapse>
</template>
</div>
<div v-if="item.adminPenalty?.length > 0" class="pt-4">
<LTitle title="行政处罚信息" type="blue-green" />
<div v-for="(penalty, aidx) in item.adminPenalty" :key="aidx"
class="border-b border-gray-400 border-b-dashed pb-4 pt-4 space-y-3">
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
处罚单位
</text>
<text class="text-gray-600">
{{ penalty.departmentName }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
处罚原因
</text>
<text class="text-gray-600">
{{ penalty.reason || "无" }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
处罚决定书文号
</text>
<text class="text-gray-600">
{{ penalty.punishNumber }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
处罚类别
</text>
<text class="text-gray-600">
{{ penalty.type }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
处罚结果
</text>
<text class="text-gray-600">
{{ penalty.content || "无" }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
处罚日期
</text>
<text class="text-gray-600">
{{ penalty.decisionDate }}
</text>
</div>
<div class="flex justify-between">
<text class="flex-shrink-0 text-gray-700 font-medium">
法人姓名
</text>
<text class="text-gray-600">
{{ penalty.legalPersonName }}
</text>
</div>
</div>
</div>
</div>
</div>
</template>
</div>
</template>
<style scoped lang="scss">
:deep(.wd-collapse-item__header) {
padding: 0;
padding: 0;
}
:deep(.wd-collapse-item__body) {
padding: 0;
@apply text-sm;
padding: 0;
@apply text-sm;
}
</style>

62
src/views/Agent.vue Normal file
View File

@ -0,0 +1,62 @@
<template>
<div class="p-4">
<!-- 资产卡片 -->
<div class="bg-white bg-opacity-80 shadow-lg rounded-xl p-6 mb-6">
<div class="flex justify-between items-center">
<span class="text-xl text-gray-900 font-semibold">可提现金额</span>
<span class="text-3xl text-blue-500 font-bold">¥ 0.0</span>
</div>
<div class="mt-2 text-sm text-gray-600">累计收益¥ 0.0</div>
<div class="mt-6 grid grid-cols-3 gap-4">
<van-button type="primary" round icon="after-sale" @click="withDraw">前往提现</van-button>
<van-button type="primary" round icon="todo-list-o">提现记录</van-button>
<van-button type="primary" round icon="balance-list-o">收入明细</van-button>
</div>
</div>
<!-- 销售金额 -->
<div class="bg-white bg-opacity-80 shadow-lg rounded-xl p-6 mb-6">
<div class="flex justify-between items-center">
<span class="text-lg text-gray-900">销售金额</span>
<span class="text-xl text-blue-500">¥ 0</span>
</div>
<div class="mt-2 text-sm text-gray-600">累计销售 0 </div>
</div>
<!-- 邀请下级收益 -->
<div class="bg-white bg-opacity-80 shadow-lg rounded-xl p-6 mb-6">
<div class="flex justify-between items-center">
<span class="text-lg text-gray-900">邀请下级收益</span>
<span class="text-xl text-blue-500">¥ 0</span>
</div>
<div class="mt-2 text-sm text-gray-600">累计邀请 1 </div>
</div>
<!-- 收益统计 -->
<div class="bg-white bg-opacity-80 shadow-lg rounded-xl p-6 mb-6">
<div class="flex justify-between items-center">
<span class="text-lg text-gray-900">收益统计</span>
</div>
<div class="mt-4 flex justify-between items-center">
<button class="bg-blue-500 text-white px-6 py-2 rounded-lg shadow-md">
近7天
</button>
<button class="bg-gray-300 text-gray-700 px-6 py-2 rounded-lg shadow-md">
近1个月
</button>
</div>
<div class="mt-6 text-xl text-gray-900">近7天累计收益¥ 0.00 </div>
</div>
</div>
</template>
<script setup>
const router = useRouter()
const withDraw = () => {
router.push({ name: "withdraw" })
}
</script>
<style scoped>
/* 在这里你可以添加额外的样式 */
</style>

View File

@ -1,33 +1,34 @@
<script setup>
const featureMap = {
G09SC02: {
name: '单人婚姻',
name: '婚姻状况',
component: defineAsyncComponent(() => import('@/ui/CMarriage.vue')),
remark: "查询结果为“未婚或尚未登记结婚”时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异、离异冷静期。如您对查询结果有疑问,请联系客服反馈。"
},
G27BJ05: {
name: '借贷意向',
name: '借贷申请记录',
component: defineAsyncComponent(() =>
import('@/ui/CBankLoanApplication.vue')
),
},
G28BJ05: {
name: '借贷行为',
name: '借贷行为记录',
component: defineAsyncComponent(() =>
import('@/ui/CBankLoanBehavior.vue')
),
},
G26BJ05: {
name: '特殊名单',
name: '关联人异常检测',
component: defineAsyncComponent(() =>
import('@/ui/CSpecialList.vue')
),
},
G34BJ03: {
name: '个人不良',
name: '不良记录',
component: defineAsyncComponent(() => import('@/ui/CBad.vue')),
},
G35SC01: {
name: '个人诉讼',
name: '司法涉诉',
component: defineAsyncComponent(() => import('@/ui/CLawsuit.vue')),
},
G05HZ01: {
@ -86,10 +87,12 @@ const featureMap = {
import LEmpty from "@/components/LEmpty.vue";
import LRemark from "@/components/LRemark.vue";
const productId = ref(null);
const isDone = ref(true);
const active = ref(null)
const reportData = ref([])
const reportParams = ref({})
@ -114,11 +117,9 @@ const getReport = async () => {
if (data.value && !error.value) {
if (data.value.code === 200) {
if (data.value.data.product_name === '婚姻评估') {
reportData.value = data.value.data.query_data.reverse()
} else {
reportData.value = data.value.data.query_data
}
reportData.value = data.value.data.query_data.sort((a, b) => {
return a.feature.sort - b.feature.sort
});
productId.value = data.value.data.product_id;
reportParams.value = data.value.data.query_params
reportName.value = data.value.data.product_name
@ -181,116 +182,162 @@ const maskValue = computed(() => {
<template>
<div class="min-h-full from-blue-100 to-white bg-gradient-to-b">
<van-notice-bar color="#e03131" background="#ecf9ff" left-icon="info-o"
text="由于天远数据APP暂未上线建议将此网站加入收藏夹或书签或可以百度搜索天远数据以及在微信天远数据小程序复制链接打开" />
<!-- <CTabs :tabs="sortedTabs" type="blue-green" /> -->
<template v-if="isDone">
<div class="flex flex-col gap-y-4 p-4">
<div id="overdiv" class="title">报告概述</div>
<div class="card">
<div class="flex flex-col gap-y-2">
<LTitle title="报告信息" type="blue-green"></LTitle>
<div class="flex flex-col gap-2 my-2">
<div class="flex justify-between border-b pb-2 pl-2">
<span class="text-gray-700 font-bold">报告时间</span>
<span class="text-gray-600">2025-1-1 12:00:00</span>
</div>
<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-600">
{{ reportName }}</span>
</div>
</div>
<template v-if="Object.keys(reportParams).length != 0">
<LTitle title="报告对象" type="blue-green"></LTitle>
<div class="flex flex-col gap-2 my-2">
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.name">
<span class="text-gray-700 font-bold">姓名</span>
<span class="text-gray-600">{{ maskValue("name", reportParams?.name) }}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.id_card">
<span class="text-gray-700 font-bold">身份证号</span>
<span class="text-gray-600">
{{ maskValue("id_card", reportParams?.id_card) }}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.nameMan">
<span class="text-gray-700 font-bold">男方姓名</span>
<span class="text-gray-600">{{ maskValue("name", reportParams?.nameMan) }}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.idCardMan">
<span class="text-gray-700 font-bold">男方身份证号</span>
<span class="text-gray-600">{{ maskValue("id_card", reportParams?.idCardMan)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.nameWoman">
<span class="text-gray-700 font-bold">女方姓名</span>
<span class="text-gray-600">{{ maskValue("name", reportParams?.nameWoman) }}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.idCardWoman">
<span class="text-gray-700 font-bold">女方身份证号</span>
<span class="text-gray-600">{{ maskValue("id_card", reportParams?.idCardWoman)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.bank_card">
<span class="text-gray-700 font-bold">银行卡号</span>
<span class="text-gray-600">{{ maskValue("bank_card", reportParams?.bank_card)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.mobile">
<span class="text-gray-700 font-bold">手机号</span>
<span class="text-gray-600">{{ maskValue("mobile", reportParams?.mobile) }}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.verification_code">
<span class="text-gray-700 font-bold">验证码</span>
<span class="text-gray-600">{{ maskValue("code", reportParams?.verification_code)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.car_license">
<span class="text-gray-700 font-bold">车牌号</span>
<span class="text-gray-600">{{ maskValue("car_license", reportParams?.car_license)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.ent_name">
<span class="text-gray-700 font-bold">企业名称</span>
<span class="text-gray-600">{{ maskValue("ent_name", reportParams?.ent_name)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.ent_code">
<span class="text-gray-700 font-bold">企业代码</span>
<span class="text-gray-600">{{ maskValue("ent_code", reportParams?.ent_code)
}}</span>
</div>
</div>
</template>
</div>
</div>
<LEmpty v-if="isEmpty" />
<template v-for="(item, index) in reportData" :key="index">
<div id="lawsuit" class="title">{{ featureMap[item.apiID].name }}</div>
<component :is="featureMap[item.apiID].component" :data="item.data" :params="reportParams">
</component>
</template>
<div class="card">
<div>
<div class="text-bold text-blue-500 mb-2">报告说明</div>
<div>
&nbsp; &nbsp;本报告的数据由用户本人明确授权后我们才向相关合法存有用户个人数据的机构调取本报告相关内容本平台只做大数据的获取与分析仅向用户个人展示参考
</div>
<p>
&nbsp; &nbsp; 报告有效期<strong class="text-red-500">30</strong>过期自动删除
</p>
<p>
&nbsp; &nbsp;
若您的数据不全面可能是数据具有延迟性或者合作信息机构未获取到您的数据若数据有错误请联系客服
</p>
<p> &nbsp;
&nbsp;本产品所有数据均来自第三方可能部分数据未公开数据更新延迟或信息受到限制贵司不对数据的准确性真实性完整性做任何承诺用户需根据实际情况结合报告内容自行判断与决策
</p>
<template v-if="isDone">
<van-tabs v-model:active="active" shrink scrollspy sticky :offset-top="46">
<div class="flex flex-col gap-y-4 p-4">
<LEmpty v-if="isEmpty" />
<van-tab title="基本信息">
<div id="overdiv" class="title mb-4">基本信息</div>
<div class="card">
<div class="flex flex-col gap-y-2">
<LTitle title="报告信息" type="blue-green"></LTitle>
<div class="flex flex-col gap-2 my-2">
<div class="flex justify-between border-b pb-2 pl-2">
<span class="text-gray-700 font-bold">报告时间</span>
<span class="text-gray-600">2025-1-1 12:00:00</span>
</div>
<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-600">
{{ reportName }}</span>
</div>
</div>
<template v-if="Object.keys(reportParams).length != 0">
<LTitle title="报告对象" type="blue-green"></LTitle>
<div class="flex flex-col gap-2 my-2">
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.name">
<span class="text-gray-700 font-bold">姓名</span>
<span class="text-gray-600">{{ maskValue("name", reportParams?.name)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.id_card">
<span class="text-gray-700 font-bold">身份证号</span>
<span class="text-gray-600">
{{ maskValue("id_card", reportParams?.id_card) }}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.nameMan">
<span class="text-gray-700 font-bold">男方姓名</span>
<span class="text-gray-600">{{ maskValue("name", reportParams?.nameMan)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.idCardMan">
<span class="text-gray-700 font-bold">男方身份证号</span>
<span class="text-gray-600">{{ maskValue("id_card", reportParams?.idCardMan)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.nameWoman">
<span class="text-gray-700 font-bold">女方姓名</span>
<span class="text-gray-600">{{ maskValue("name", reportParams?.nameWoman)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.idCardWoman">
<span class="text-gray-700 font-bold">女方身份证号</span>
<span class="text-gray-600">{{ maskValue("id_card",
reportParams?.idCardWoman)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.bank_card">
<span class="text-gray-700 font-bold">银行卡号</span>
<span class="text-gray-600">{{ maskValue("bank_card",
reportParams?.bank_card)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.mobile">
<span class="text-gray-700 font-bold">手机号</span>
<span class="text-gray-600">{{ maskValue("mobile", reportParams?.mobile)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.verification_code">
<span class="text-gray-700 font-bold">验证码</span>
<span class="text-gray-600">{{ maskValue("code",
reportParams?.verification_code)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.car_license">
<span class="text-gray-700 font-bold">车牌号</span>
<span class="text-gray-600">{{ maskValue("car_license",
reportParams?.car_license)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.ent_name">
<span class="text-gray-700 font-bold">企业名称</span>
<span class="text-gray-600">{{ maskValue("ent_name", reportParams?.ent_name)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.ent_code">
<span class="text-gray-700 font-bold">企业代码</span>
<span class="text-gray-600">{{ maskValue("ent_code", reportParams?.ent_code)
}}</span>
</div>
<div class="flex flex-col gap-4">
<div class="flex items-center bg-blue-100 rounded-xl px-4 py-2 flex-1">
<div
class="bg-green-500 w-12 h-12 text-white text-xl flex items-center justify-center rounded-full mr-4">
</div>
<div>
<div class="font-bold text-lg">身份证检查结果</div>
<div class="text-sm text-gray-600">身份证信息核验通过</div>
</div>
</div>
<div class="flex items-center bg-blue-100 rounded-xl px-4 py-2 flex-1">
<div
class="bg-green-500 w-12 h-12 text-white text-xl flex items-center justify-center rounded-full mr-4">
</div>
<div>
<div class="font-bold text-lg">手机号检测结果</div>
<div class="text-sm text-gray-600">被查询人姓名与运营商提供的一致</div>
<div class="text-sm text-gray-600">被查询人身份证与运营商提供的一致</div>
</div>
</div>
</div>
</div>
</template>
</div>
</div>
<LRemark content="如查询的姓名/身份证与运营商提供的不一致,可能会存在报告内容不匹配的情况" />
</van-tab>
<van-tab v-for="(item, index) in reportData" :key="index" :title="featureMap[item.data.apiID].name">
<div id="lawsuit" class="title mb-4">{{ featureMap[item.data.apiID].name }}</div>
<component :is="featureMap[item.data.apiID].component" :data="item.data.data"
:params="reportParams">
</component>
<LRemark v-if="featureMap[item.data.apiID].remark"
:content="featureMap[item.data.apiID].remark" />
</van-tab>
<div class="card">
<div>
<div class="text-bold text-blue-500 mb-2">报告说明</div>
<div>
&nbsp; &nbsp;本报告的数据由用户本人明确授权后我们才向相关合法存有用户个人数据的机构调取本报告相关内容本平台只做大数据的获取与分析仅向用户个人展示参考
</div>
<p>
&nbsp; &nbsp; 报告有效期<strong class="text-red-500">30</strong>过期自动删除
</p>
<p>
&nbsp; &nbsp;
若您的数据不全面可能是数据具有延迟性或者合作信息机构未获取到您的数据若数据有错误请联系客服
</p>
<p> &nbsp;
&nbsp;本产品所有数据均来自第三方可能部分数据未公开数据更新延迟或信息受到限制贵司不对数据的准确性真实性完整性做任何承诺用户需根据实际情况结合报告内容自行判断与决策
</p>
</div>
</div>
</div>
</div>
</van-tabs>
</template>
</div>
<div class="disclaimer">

View File

@ -83,10 +83,6 @@ function statusClass(state) {
</script>
<template>
<!-- Vant 通知栏 -->
<van-notice-bar color="#1989fa" background="#ecf9ff" left-icon="info-o"
text="为保证用户的隐私以及数据安全您的报告生成30天之后将自动清除请及时保存您的报告。" />
<div class="flex flex-col gap-4 p-4">
<van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad"><van-cell
v-for="item in reportList" :key="item.id" @click="toDetail(item)" class="card mb-4">

View File

@ -55,8 +55,8 @@
<!-- 页脚 -->
<footer class="bg-blue-200 text-gray-700 text-center py-4">
<div class="flex items-center justify-center gap-2">
<img src="https://qcloudimg.tencent-cloud.cn/raw/eed02831a0e201b8d794c8282c40cf2e.png" alt="网安 icon"
class="w-6 h-6" />
<!-- <img src="https://qcloudimg.tencent-cloud.cn/raw/eed02831a0e201b8d794c8282c40cf2e.png" alt="网安 icon"
class="w-6 h-6" /> -->
<p class="text-sm">
<!-- 琼公网安备 46010002000443 | -->
琼ICP备2024048057号-2

View File

@ -7,7 +7,7 @@
<img :src="userAvatar" alt="User Avatar" class="rounded-full" width="100" height="100" />
<div>
<h2 class="text-lg font-bold">
{{ isLoggedIn ? maskName(userName) : '点击登录' }}
{{ isWeChat ? '微信用户' : isLoggedIn ? maskName(userName) : '点击登录' }}
</h2>
</div>
</div>
@ -17,13 +17,27 @@
<!-- Features Section -->
<div class="features-section flex flex-col gap-2">
<div v-for="(feature, index) in features" :key="index"
class="feature-item rounded-md bg-white p-3 shadow-sm cursor-pointer" @click="feature.action">
<div class="flex items-center gap-2">
<!-- <van-icon :name="feature.icon" /> -->
<span>{{ feature.title }}</span>
</div>
</div>
<button class="feature-item w-full cursor-pointer rounded-md bg-white p-3 shadow-sm" @click="toHistory">
我的报告
</button>
<!-- <button class="feature-item w-full cursor-pointer rounded-md bg-white p-3 shadow-sm" @click="">
联系客服
</button> -->
<button class="feature-item w-full cursor-pointer rounded-md bg-white p-3 shadow-sm"
@click="toUserAgreement">
用户协议
</button>
<!-- <button v-if="isWeChat" class="feature-item w-full cursor-pointer rounded-md bg-white p-3 shadow-sm"
type="default" open-type="contact">
联系客服
</button> -->
<button class="feature-item w-full cursor-pointer rounded-md bg-white p-3 shadow-sm" @click="toService">
联系客服
</button>
<button class="feature-item w-full cursor-pointer rounded-md bg-white p-3 shadow-sm"
@click="handleLogout" v-if="!isWeChat">
退出登录
</button>
</div>
</div>
</div>
@ -36,12 +50,13 @@ const router = useRouter()
const userName = ref('点击登录')
const userAvatar = ref('https://img0.baidu.com/it/u=1240274933,2284862568&fm=253&fmt=auto&app=138&f=PNG?w=180&h=180')
const isLoggedIn = ref(false)
const features = ref([
{ title: '我的报告', icon: 'list', action: () => toHistory() },
{ title: '联系客服', icon: 'service-o', action: () => toService() },
{ title: '用户协议', icon: 'file', action: () => toUserAgreement() },
{ title: '退出登录', icon: 'logout', action: () => handleLogout() },
])
// const features = ref([
// { title: '', icon: 'list', action: () => toHistory() },
// { title: '', icon: 'service-o', action: () => toService() },
// { title: '', icon: 'file', action: () => toUserAgreement() },
// { title: '', icon: 'logout', action: () => handleLogout() },
// ])
const { isWeChat } = useEnv()
const maskName = computed(() => {
return (name) => {
@ -69,7 +84,8 @@ function handleLogout() {
}
function toService() {
window.location.href = '/service' //
// window.location.href = '/service' //
window.location.href = 'https://work.weixin.qq.com/kfid/kfc5c19b2b93a5e73b9' //
}
async function fetchUserInfo() {
@ -121,6 +137,7 @@ onMounted(() => {
padding: 1rem;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
text-align: left;
}
.feature-item:hover {

81
src/views/Promote.vue Normal file
View File

@ -0,0 +1,81 @@
<template>
<div class="p-4 ">
<div class="card">
<div class="">
<div class="text-lg font-bold text-orange-500">直推用户查询</div>
<div class="font-bold text-orange-400 mt-1">
自定义价格赚取差价
</div>
</div>
<div class="mt-6">
<div class="mt-2 text-gray-600 bg-orange-100 rounded-xl px-4 py-2">
在下方 自定义价格 处选择报告类型设置客户查询价即可了解推广收益及我的成本价
</div>
</div>
</div>
<div class="card mt-6">
<div class="">
<h2 class="text-xl font-semibold mb-2">生成推广码</h2>
<van-cell-group inset>
<van-field v-model="pickerFieldVal" is-link readonly label="报告类型" placeholder="请选择报告类型"
@click="showPicker = true" />
<van-popup v-model:show="showPicker" destroy-on-close round position="bottom">
<van-picker :model-value="selectedReportType" :columns="reportTypes"
@cancel="showPicker = false" @confirm="onConfirm" />
</van-popup>
<van-field v-model="clientPrice" type="number" label="客户查询价" placeholder="请输入价格" />
<div class="flex items-center justify-between my-2">
<div class="text-sm text-gray-500">推广收益为 {{ promotionRevenue }} </div>
<div class="text-sm text-gray-500">我的成本为 {{ costPrice }} </div>
</div>
</van-cell-group>
</div>
<div class="mt-6">
<van-button type="primary" class="w-full" @click="generatePromotionCode">点击立即推广</van-button>
</div>
</div>
</div>
<PromoteQRcode v-model:show="showQRcode" />
</template>
<script setup>
import { ref, computed } from 'vue';
const reportTypes = [
{ text: '个人风险', value: 'personalRisk' },
{ text: '婚恋风险', value: 'marriageRisk' },
{ text: '家政服务', value: 'domesticService' },
{ text: '租赁风险', value: 'rentalRisk' },
{ text: '人事背调', value: 'hrBackgroundCheck' },
{ text: '企业报告', value: 'enterpriseReport' },
{ text: '贷前背调', value: 'preLoanBackgroundCheck' }
];
const showPicker = ref(false);
const pickerFieldVal = ref('')
const selectedReportType = ref([]);
const onConfirm = ({ selectedValues, selectedOptions }) => {
showPicker.value = false;
selectedReportType.value = selectedValues;
pickerFieldVal.value = selectedOptions[0].text;
};
const clientPrice = ref(49.9);
const costPrice = ref(10.31);
const promotionRevenue = computed(() => {
// 广 ( - )
return (clientPrice.value - costPrice.value).toFixed(2);
});
const showQRcode = ref(false)
const generatePromotionCode = () => {
showQRcode.value = true;
};
</script>
<style scoped>
/* 自定义样式可以添加在这里 */
</style>

View File

@ -0,0 +1,14 @@
<template>
<Inquire />
<RecordFooter v-if="!webviewEnv" />
<div
class=" fixed right-2 top-3/4 px-4 py-2 text-sm bg-blue-400 rounded-xl text-white font-bold shadow active:bg-blue-500">
历史查询
</div>
</template>
<script setup>
import Inquire from './Inquire.vue';
</script>
<style lang="scss" scoped></style>

View File

@ -1,33 +1,34 @@
<script setup>
const featureMap = {
G09SC02: {
name: '单人婚姻',
name: '婚姻状况',
component: defineAsyncComponent(() => import('@/ui/CMarriage.vue')),
remark: "查询结果为“未婚或尚未登记结婚”时,表示婚姻登记处暂无相关的登记记录。婚姻状态信息由婚姻登记处逐级上报,可能存在数据遗漏或更新滞后。当前可查询的婚姻状态包括:未婚或尚未登记结婚、已婚、离异、离异冷静期。如您对查询结果有疑问,请联系客服反馈。"
},
G27BJ05: {
name: '借贷意向',
name: '借贷申请记录',
component: defineAsyncComponent(() =>
import('@/ui/CBankLoanApplication.vue')
),
},
G28BJ05: {
name: '借贷行为',
name: '借贷行为记录',
component: defineAsyncComponent(() =>
import('@/ui/CBankLoanBehavior.vue')
),
},
G26BJ05: {
name: '特殊名单',
name: '关联人异常检测',
component: defineAsyncComponent(() =>
import('@/ui/CSpecialList.vue')
),
},
G34BJ03: {
name: '个人不良',
name: '不良记录',
component: defineAsyncComponent(() => import('@/ui/CBad.vue')),
},
G35SC01: {
name: '个人诉讼',
name: '司法涉诉',
component: defineAsyncComponent(() => import('@/ui/CLawsuit.vue')),
},
G05HZ01: {
@ -92,7 +93,7 @@ const route = useRoute();
const productId = ref(null);
const isDone = ref(true);
const active = ref(null)
const reportData = ref([])
const reportParams = ref({})
const reportName = ref("")
@ -129,11 +130,9 @@ const getReport = async () => {
if (data.value && !error.value) {
if (data.value.code === 200) {
if (data.value.data.product_name === '婚姻评估') {
reportData.value = data.value.data.query_data.reverse()
} else {
reportData.value = data.value.data.query_data
}
reportData.value = data.value.data.query_data.sort((a, b) => {
return a.feature.sort - b.feature.sort
});
productId.value = data.value.data.product_id;
reportParams.value = data.value.data.query_params
reportName.value = data.value.data.product_name
@ -201,126 +200,174 @@ const maskValue = computed(() => {
<template>
<div class="min-h-full from-blue-100 to-white bg-gradient-to-b">
<van-notice-bar color="#e03131" background="#ecf9ff" left-icon="info-o"
text="由于天远数据APP暂未上线建议将此网站加入收藏夹或书签或可以百度搜索天远数据以及在微信天远数据小程序复制链接打开" />
<!-- <CTabs :tabs="sortedTabs" type="blue-green" /> -->
<!-- <van-notice-bar color="#e03131" background="#ecf9ff" left-icon="info-o"
text="由于天远数据APP暂未上线建议将此网站加入收藏夹或书签或可以百度搜索天远数据以及在微信天远数据小程序复制链接打开" /> -->
<template v-if="isDone">
<div class="flex flex-col gap-y-4 p-4">
<template v-if="!isEmpty && !isPending">
<div id="overdiv" class="title">报告概述</div>
<div class="card">
<div class="flex flex-col gap-y-2">
<LTitle title="报告信息" type="blue-green"></LTitle>
<div class="flex flex-col gap-2 my-2">
<div class="flex justify-between border-b pb-2 pl-2">
<span class="text-gray-700 font-bold">报告时间</span>
<span class="text-gray-600">{{ reportDateTime }}</span>
</div>
<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-600">
{{ reportName }}</span>
<van-tabs v-model:active="active" scrollspy sticky :offset-top="46">
<div class="flex flex-col gap-y-4 p-4">
<LEmpty v-if="isEmpty" />
<template v-if="!isEmpty && !isPending">
<van-tab title="基本信息">
<div id="overdiv" class="title mb-4">基本信息</div>
<div class="card">
<div class="flex flex-col gap-y-2">
<LTitle title="报告信息" type="blue-green"></LTitle>
<div class="flex flex-col gap-2 my-2">
<div class="flex justify-between border-b pb-2 pl-2">
<span class="text-gray-700 font-bold">报告时间</span>
<span class="text-gray-600">{{ reportDateTime }}</span>
</div>
<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-600">
{{ reportName }}</span>
</div>
</div>
<template v-if="Object.keys(reportParams).length != 0">
<LTitle title="报告对象" type="blue-green"></LTitle>
<div class="flex flex-col gap-2 my-2">
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.name">
<span class="text-gray-700 font-bold">姓名</span>
<span class="text-gray-600">{{ maskValue("name", reportParams?.name)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.id_card">
<span class="text-gray-700 font-bold">身份证号</span>
<span class="text-gray-600">
{{ maskValue("id_card", reportParams?.id_card) }}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.nameMan">
<span class="text-gray-700 font-bold">男方姓名</span>
<span class="text-gray-600">{{ maskValue("name", reportParams?.nameMan)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.idCardMan">
<span class="text-gray-700 font-bold">男方身份证号</span>
<span class="text-gray-600">{{ maskValue("id_card",
reportParams?.idCardMan)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.nameWoman">
<span class="text-gray-700 font-bold">女方姓名</span>
<span class="text-gray-600">{{ maskValue("name",
reportParams?.nameWoman)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.idCardWoman">
<span class="text-gray-700 font-bold">女方身份证号</span>
<span class="text-gray-600">{{ maskValue("id_card",
reportParams?.idCardWoman)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.bank_card">
<span class="text-gray-700 font-bold">银行卡号</span>
<span class="text-gray-600">{{ maskValue("bank_card",
reportParams?.bank_card)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.mobile">
<span class="text-gray-700 font-bold">手机号</span>
<span class="text-gray-600">{{ maskValue("mobile", reportParams?.mobile)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.verification_code">
<span class="text-gray-700 font-bold">验证码</span>
<span class="text-gray-600">{{ maskValue("code",
reportParams?.verification_code)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.car_license">
<span class="text-gray-700 font-bold">车牌号</span>
<span class="text-gray-600">{{ maskValue("car_license",
reportParams?.car_license)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.ent_name">
<span class="text-gray-700 font-bold">企业名称</span>
<span class="text-gray-600">{{ maskValue("ent_name",
reportParams?.ent_name)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.ent_code">
<span class="text-gray-700 font-bold">企业代码</span>
<span class="text-gray-600">{{ maskValue("ent_code",
reportParams?.ent_code)
}}</span>
</div>
<div class="flex flex-col gap-4">
<div class="flex items-center bg-blue-100 rounded-xl px-4 py-2 flex-1">
<div
class="bg-green-500 w-12 h-12 text-white text-xl flex items-center justify-center rounded-full mr-4">
</div>
<div>
<div class="font-bold text-lg">身份证检查结果</div>
<div class="text-sm text-gray-600">身份证信息核验通过</div>
</div>
</div>
<div class="flex items-center bg-blue-100 rounded-xl px-4 py-2 flex-1">
<div
class="bg-green-500 w-12 h-12 text-white text-xl flex items-center justify-center rounded-full mr-4">
</div>
<div>
<div class="font-bold text-lg">手机号检测结果</div>
<div class="text-sm text-gray-600">被查询人姓名与运营商提供的一致</div>
<div class="text-sm text-gray-600">被查询人身份证与运营商提供的一致</div>
</div>
</div>
</div>
</div>
</template>
</div>
</div>
<template v-if="Object.keys(reportParams).length != 0">
<LTitle title="报告对象" type="blue-green"></LTitle>
<div class="flex flex-col gap-2 my-2">
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.name">
<span class="text-gray-700 font-bold">姓名</span>
<span class="text-gray-600">{{ maskValue("name", reportParams?.name) }}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.id_card">
<span class="text-gray-700 font-bold">身份证号</span>
<span class="text-gray-600">
{{ maskValue("id_card", reportParams?.id_card) }}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.nameMan">
<span class="text-gray-700 font-bold">男方姓名</span>
<span class="text-gray-600">{{ maskValue("name", reportParams?.nameMan)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.idCardMan">
<span class="text-gray-700 font-bold">男方身份证号</span>
<span class="text-gray-600">{{ maskValue("id_card", reportParams?.idCardMan)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.nameWoman">
<span class="text-gray-700 font-bold">女方姓名</span>
<span class="text-gray-600">{{ maskValue("name", reportParams?.nameWoman)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.idCardWoman">
<span class="text-gray-700 font-bold">女方身份证号</span>
<span class="text-gray-600">{{ maskValue("id_card", reportParams?.idCardWoman)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.bank_card">
<span class="text-gray-700 font-bold">银行卡号</span>
<span class="text-gray-600">{{ maskValue("bank_card", reportParams?.bank_card)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.mobile">
<span class="text-gray-700 font-bold">手机号</span>
<span class="text-gray-600">{{ maskValue("mobile", reportParams?.mobile)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.verification_code">
<span class="text-gray-700 font-bold">验证码</span>
<span class="text-gray-600">{{ maskValue("code",
reportParams?.verification_code)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2"
v-if="reportParams?.car_license">
<span class="text-gray-700 font-bold">车牌号</span>
<span class="text-gray-600">{{ maskValue("car_license",
reportParams?.car_license)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.ent_name">
<span class="text-gray-700 font-bold">企业名称</span>
<span class="text-gray-600">{{ maskValue("ent_name", reportParams?.ent_name)
}}</span>
</div>
<div class="flex justify-between border-b pb-2 pl-2" v-if="reportParams?.ent_code">
<span class="text-gray-700 font-bold">企业代码</span>
<span class="text-gray-600">{{ maskValue("ent_code", reportParams?.ent_code)
}}</span>
</div>
</div>
</template>
</div>
</div>
</template>
<LEmpty v-if="isEmpty" />
<LPendding v-if="isPending" />
<template v-for="(item, index) in reportData" :key="index">
<div id="lawsuit" class="title">{{ featureMap[item.apiID].name }}</div>
<component :is="featureMap[item.apiID].component" :data="item.data" :params="reportParams">
</component>
</template>
<div class="card">
<div>
<div class="text-bold text-blue-500 mb-2">报告说明</div>
<div>
&nbsp; &nbsp;本报告的数据由用户本人明确授权后我们才向相关合法存有用户个人数据的机构调取本报告相关内容本平台只做大数据的获取与分析仅向用户个人展示参考
</div>
<p>
&nbsp; &nbsp; 报告有效期<strong class="text-red-500">30</strong>过期自动删除
</p>
<p>
&nbsp; &nbsp;
若您的数据不全面可能是数据具有延迟性或者合作信息机构未获取到您的数据若数据有错误请联系客服
</p>
<p> &nbsp;
&nbsp;本产品所有数据均来自第三方可能部分数据未公开数据更新延迟或信息受到限制贵司不对数据的准确性真实性完整性做任何承诺用户需根据实际情况结合报告内容自行判断与决策
</p>
<LRemark content="如查询的姓名/身份证与运营商提供的不一致,可能会存在报告内容不匹配的情况" />
</van-tab>
</template>
<LPendding v-if="isPending" />
<van-tab v-for="(item, index) in reportData" :key="index" :title="featureMap[item.data.apiID].name">
<div id="lawsuit" class="title mb-4">{{ featureMap[item.data.apiID].name }}</div>
<component :is="featureMap[item.data.apiID].component" :data="item.data.data"
:params="reportParams">
</component>
<LRemark v-if="featureMap[item.data.apiID].remark"
:content="featureMap[item.data.apiID].remark" />
</van-tab>
<div class="card">
<div>
<div class="text-bold text-blue-500 mb-2">报告说明</div>
<div>
&nbsp; &nbsp;本报告的数据由用户本人明确授权后我们才向相关合法存有用户个人数据的机构调取本报告相关内容本平台只做大数据的获取与分析仅向用户个人展示参考
</div>
<p>
&nbsp; &nbsp; 报告有效期<strong class="text-red-500">30</strong>过期自动删除
</p>
<p>
&nbsp; &nbsp;
若您的数据不全面可能是数据具有延迟性或者合作信息机构未获取到您的数据若数据有错误请联系客服
</p>
<p> &nbsp;
&nbsp;本产品所有数据均来自第三方可能部分数据未公开数据更新延迟或信息受到限制贵司不对数据的准确性真实性完整性做任何承诺用户需根据实际情况结合报告内容自行判断与决策
</p>
</div>
</div>
</div>
</div>
</van-tabs>
</template>
</div>
<div class="disclaimer">

65
src/views/Withdraw.vue Normal file
View File

@ -0,0 +1,65 @@
<template>
<div class="p-6">
<!-- 提现信息 -->
<div class="bg-white bg-opacity-90 shadow-lg rounded-xl p-6 mb-6">
<div class="flex justify-between items-center">
<span class="text-xl text-gray-900 font-semibold">提现到</span>
<span class="text-lg text-blue-600">银行账户</span>
</div>
<div class="flex justify-between items-center mt-4">
<span class="text-sm text-gray-600">银行卡号</span>
<span class="text-sm text-blue-500">UPCash</span>
<button class="text-sm text-blue-500">修改</button>
</div>
</div>
<!-- 提现金额 -->
<div class="bg-white bg-opacity-90 shadow-lg rounded-xl p-6 mb-6">
<div class="flex justify-between items-center">
<span class="text-xl text-gray-900 font-semibold">提现金额</span>
<span class="text-3xl text-blue-600 font-bold">¥ 0.0</span>
</div>
<div class="mt-4 text-sm text-gray-600">
<p>可提现金额 0.0 </p>
<p class="mt-2">每天最多提现2次最低提现金额20元提现金额超过1000元会进行人工审核</p>
</div>
<div class="mt-6 flex justify-end">
<button class="bg-blue-600 hover:bg-blue-500 text-white py-2 px-6 rounded-lg shadow-md">
全部提现
</button>
</div>
</div>
<!-- 短信验证码 -->
<div class="bg-white bg-opacity-90 shadow-lg rounded-xl p-6 mb-6">
<div class="flex justify-between items-center">
<span class="text-lg text-gray-900">短信验证码</span>
<button class="text-sm text-blue-500">手机为优先查看注册号码</button>
</div>
<div class="mt-4">
<input type="text" placeholder="请输入短信验证码"
class="w-full p-3 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500" />
</div>
<div class="mt-4 flex justify-between items-center">
<button class="bg-blue-600 text-white py-2 px-6 rounded-lg shadow-md flex items-center space-x-2">
<van-icon name="refresh" size="20" />
<span>获取验证码</span>
</button>
</div>
</div>
<!-- 确认提现 -->
<div class="mt-6">
<button class="bg-blue-600 hover:bg-blue-500 text-white py-3 px-6 rounded-lg w-full shadow-md">
确认提现
</button>
</div>
</div>
</template>
<script setup>
</script>
<style scoped>
/* 如果需要额外的样式,可以在这里添加 */
</style>

View File

@ -10,7 +10,9 @@ import indexIcon7 from '@/assets/images/index_icon_7.png'
function toInquire(name) {
router.push(`/inquire/${name}`)
}
const toPromote = () => {
router.push("/promote")
}
const services = ref([
{
title: '个人风险',
@ -83,14 +85,41 @@ function toHistory() {
<div class="relative p-4">
<img class="h-full w-full rounded-xl overflow-hidden" src="@/assets/images/banner.png" />
</div>
<div class="relative p-4 pb-4 pt-2">
<!-- <div class="mb-1 flex items-center">
<div class="flex-shrink-0 pl-2 font-bold">
在线信息
<div>
<div class="flex items-center justify-around gap-4 px-6 pb-1">
<div class="" @click="toPromote">
<div
class="h-16 w-16 p-2 bg-gradient-to-b from-white to-blue-100/10 rounded-full shadow-lg flex items-center justify-center">
<img src="@/assets/images/icon_tg.svg" alt="直推报告" class="w-12 h-12" />
</div>
<div class="text-center mt-1 font-bold">直推报告</div>
</div>
<wd-notice-bar :text="noticeText" direction="vertical" :delay="5" color="#4c4c4c"
background-color="#00000000" />
</div> -->
<div class="">
<div
class="h-16 w-16 p-2 bg-gradient-to-b from-white to-blue-100/10 rounded-full shadow-lg flex items-center justify-center">
<img src="@/assets/images/icon_xj.svg" alt="邀请下级" class="w-12 h-12" />
</div>
<div class="text-center mt-1 font-bold">邀请下级</div>
</div>
<div class="">
<div
class="h-16 w-16 p-2 bg-gradient-to-b from-white to-blue-100/10 rounded-full shadow-lg flex items-center justify-center">
<img src="@/assets/images/icon_xj.svg" alt="邀请下级" class="w-12 h-12" />
</div>
<div class="text-center mt-1 font-bold">邀请下级</div>
</div>
<div class="">
<div
class="h-16 w-16 p-2 bg-gradient-to-b from-white to-blue-100/10 rounded-full shadow-lg flex items-center justify-center">
<img src="@/assets/images/icon_xj.svg" alt="邀请下级" class="w-12 h-12" />
</div>
<div class="text-center mt-1 font-bold">邀请下级</div>
</div>
</div>
</div>
<div class="relative p-4 pb-4 pt-2">
<div class="grid grid-cols-2 gap-3">
<template v-for="(service, index) in services" :key="index">
<div class="relative flex flex-col px-4 py-2 shadow-lg min-h-24" :class="[

View File

@ -1,55 +0,0 @@
<template>
<div class="bg-gradient-to-b from-[#aeceff] to-white min-h-screen relative">
<!-- banner -->
<div class="w-full flex justify-center " style="clip-path: ellipse(100% 95% at 50% 0%);">
<img src="@/assets/images/sfss_banner.png" alt="司法涉诉" class="w-full h-auto">
</div>
<div class="p-6 -my-24 z-1000 absolute">
<div class="card">
<div class="grid grid-cols-3 gap-6">
<div v-for="(item, index) in menuItems" :key="index" class="flex flex-col items-center"
@click="toInquire(item.product)">
<div class="bg-slate-100 rounded-full p-4">
<img :src="item.icon" :alt="item.title" class="w-10 h-10">
</div>
<p class="mt-2 text-sm font-semibold">{{ item.title }}</p>
</div>
</div>
</div>
<div class="card mt-4">
<h2 class="text-lg font-bold text-blue-500 mb-4">司法涉诉查询服务</h2>
<p class="text-gray-700 leading-6">
本平台提供全方位司法涉诉查询服务助您全面防范功能包括
</p>
<ul class="list-disc list-inside mt-4 space-y-2 text-gray-600">
<li>
<strong>个人涉诉</strong> 查看个人是否涉及诉讼案件了解其法律纠纷情况帮助您判断该个人的法律风险
</li>
<li>
<strong>企业涉诉</strong> 查看企业是否涉及诉讼案件了解企业的法律风险及潜在的经营问题帮助您评估与该企业合作的安全性
</li>
</ul>
</div>
</div>
</div>
</template>
<script setup>
import grssIcon from '@/assets/images/grss_icon.svg';
import qyssIcon from '@/assets/images/qyss_icon.svg';
const router = useRouter()
const menuItems = [
{ title: "个人涉诉", icon: grssIcon, product: "toc_PersonalLawsuit" },
{ title: "企业涉诉", icon: qyssIcon, product: "toc_EnterpriseLawsuit" },
];
const toInquire = (product) => {
if (!product) return
router.push('/inquire/' + product)
}
</script>
<style scoped></style>

View File

@ -1,50 +0,0 @@
<template>
<div class="bg-gradient-to-b from-blue-100 to-white min-h-screen p-6">
<!-- 顶部标题 -->
<div class="text-center my-4">
<h1 class="text-2xl font-bold text-blue-500">真实车况查询</h1>
<p class="text-lg text-orange-400">二手车知根知底</p>
</div>
<!-- 车图 -->
<div class="flex justify-center my-4">
<!-- <img src="/static/car-image.png" alt="Car" class="w-3/4 h-auto"> -->
</div>
<!-- 功能菜单 -->
<div class="grid grid-cols-3 gap-6 my-8">
<div v-for="(item, index) in menuItems" :key="index" class="flex flex-col items-center">
<!-- <img :src="item.icon" :alt="item.title" class="w-14 h-14"> -->
<p :class="item.textColor + ' mt-2 text-sm'">{{ item.title }}</p>
</div>
</div>
<!-- 详情文本 -->
<div class="bg-white shadow-md p-6 rounded-lg">
<h2 class="text-lg font-bold text-blue-500 mb-4">车辆信息查询服务</h2>
<p class="text-gray-700 leading-6">
本平台提供全方位车辆信息查询服务助您全面掌握车况功能包括
</p>
<ul class="list-disc list-inside mt-4 space-y-2 text-gray-600">
<li>车辆维修记录查询车辆历次维修保养的详细记录</li>
<li>出险信息查看车辆过往的出险信息助您评估车辆状况</li>
<li>上险信息获取车辆的保险状态确保车辆保险有效</li>
<li>车辆信息查询通过车架号获取车辆的详细信息包括排量配置等</li>
<li>各下车主数统计列出各下的所有持有车辆数量及统计</li>
<li>人车关系验证校对车辆与车主之间的详细关系</li>
<li>车辆估值提供车辆市场估值帮助您了解车辆的当前市场价值</li>
</ul>
</div>
</div>
</template>
<script setup>
const menuItems = [
{ title: "出险信息", icon: "/static/icon-accident.png", textColor: "text-red-500" },
{ title: "维修记录", icon: "/static/icon-maintain.png", textColor: "text-blue-500" },
];
</script>
<style scoped>
/* 需要添加任何自定义样式时可在这里补充 */
</style>

View File

@ -1,54 +0,0 @@
<template>
<div class="bg-gradient-to-b from-[#aeceff] to-white min-h-screen relative">
<!-- banner -->
<div class="w-full flex justify-center " style="clip-path: ellipse(100% 95% at 50% 0%);">
<img src="@/assets/images/fxpg_banner.png" alt="风险评估" class="w-full h-auto">
</div>
<div class="p-6 -my-24 z-1000 absolute">
<!-- 功能菜单 -->
<div class="card">
<div class="grid grid-cols-3 gap-6">
<div v-for="(item, index) in menuItems" :key="index" class="flex flex-col items-center"
@click="toInquire(item.product)">
<div class="bg-slate-100 rounded-full p-4">
<img :src="item.icon" :alt="item.title" class="w-10 h-10">
</div>
<p class="mt-2 text-sm font-semibold">{{ item.title }}</p>
</div>
</div>
</div>
<!-- 详情文本 -->
<div class="card mt-4">
<h2 class="text-lg font-bold text-blue-500 mb-4">风险评估查询服务</h2>
<p class="text-gray-700 leading-6">
本平台提供全方位风险评估查询服务助您全面防范功能包括
</p>
<ul class="list-disc list-inside mt-4 space-y-2 text-gray-600">
<li>
<strong>个人不良记录查询</strong> 通过查询个人的不良记录评估其风险等级高风险帮助您识别潜在的信用和法律风险确保合作方的合法合规
</li>
<li>
<strong>股东人企关系查询</strong> 通过个人关联的企业了解其可能涉及的风险帮助您判断该个人的风险水平特别是与高风险企业有联系的个人
</li>
</ul>
</div>
</div>
</div>
</template>
<script setup>
import grblIcon from '@/assets/images/grbl_icon.svg';
import gdrqgxIcon from '@/assets/images/gdrqgx_icon.svg';
const router = useRouter()
const menuItems = [
{ title: "个人不良", icon: grblIcon, product: "toc_PersonalBadRecord" },
{ title: "股东人企关系", icon: gdrqgxIcon, product: "toc_ShareholderBusinessRelation" },
];
const toInquire = (product) => {
router.push('/inquire/' + product)
}
</script>
<style scoped></style>

View File

@ -1,87 +0,0 @@
<template>
<div class="bg-gradient-to-b from-[#aeceff] to-white min-h-screen relative">
<!-- banner -->
<div class="w-full flex justify-center " style="clip-path: ellipse(100% 95% at 50% 0%);">
<img src="@/assets/images/hygj_banner.png" alt="核验工具" class="w-full h-auto">
</div>
<div class="p-6 -my-24 z-1000 absolute">
<!-- 功能菜单 -->
<div class="card">
<div class="grid grid-cols-3 gap-6">
<div v-for="(item, index) in menuItems" :key="index" class="flex flex-col items-center"
@click="toInquire(item.product)">
<div class="bg-slate-100 rounded-full p-4">
<img :src="item.icon" :alt="item.title" class="w-10 h-10">
</div>
<p class="mt-2 text-sm font-semibold">{{ item.title }}</p>
</div>
</div>
</div>
<!-- 详情文本 -->
<div class="card mt-4">
<h2 class="text-lg font-bold text-blue-500 mb-4">核验工具服务</h2>
<p class="text-gray-700 leading-6">
本平台提供全方位核验工具服务助您全面防范功能包括
</p>
<ul class="list-disc list-inside mt-4 space-y-2 text-gray-600">
<li><strong>手机三要素</strong> 查询个人与手机号码是否匹配确保手机号码的真实性</li>
<li><strong>银行卡黑名单</strong> 查询银行卡是否被列入黑名单帮助您识别潜在的金融风险</li>
<li><strong>身份证二要素</strong> 验证姓名与身份证号码的匹配情况确保身份真实性</li>
<li><strong>手机二要素</strong> 查询手机号码和身份证的匹配情况用于验证身份的真实性</li>
<li><strong>在网时长</strong> 查询手机号码的在网时长帮助评估号码的稳定性与历史</li>
<li><strong>手机二次卡</strong> 检查手机是否有二次卡防止诈骗等风险</li>
<li><strong>手机号码风险</strong> 评估手机号码的潜在风险包括是否与违法行为关联</li>
<li><strong>银行卡四要素</strong> 通过四要素核验银行卡与个人是否匹配进一步验证银行账户的真实性</li>
<li><strong>人车核验</strong> 查询个人与车辆的关联情况帮助识别车辆的所有权和风险</li>
<li><strong>名下车辆</strong> 查询个人名下的所有车辆信息了解其车辆资产</li>
<li><strong>双人婚姻</strong> 查询双人婚姻状况帮助评估婚姻的法律状态和风险</li>
<li><strong>自然人生存状态</strong> 查询个人的生存状态帮助验证其是否真实存在</li>
<!-- <li><strong>银行卡三要素</strong> 查询银行卡的三要素验证账户信息的安全性</li> -->
<!-- <li><strong>学历核验</strong> 验证学历信息的真实性确保所提供的学历符合实际</li> -->
</ul>
</div>
</div>
</div>
</template>
<script setup>
import yhkhmdIcon from '@/assets/images/yhkhmd_icon.svg';
import sjsysIcon from '@/assets/images/sjsys_icon.svg'; //
import sfzeysIcon from '@/assets/images/sfzeys_icon.svg'; //
import sjeysIcon from '@/assets/images/sjeys_icon.svg'; //
import sjzwscIcon from '@/assets/images/sjzwsc_icon.svg'; //
import sjeckIcon from '@/assets/images/sjeck_icon.svg'; //
import sjhmfxIcon from '@/assets/images/sjhmfx_icon.svg'; //
import yhk4ysIcon from '@/assets/images/yhk4ys_icon.svg'; //
import yhksysIcon from '@/assets/images/yhksys_icon.svg'; //
import zrrscztIcon from '@/assets/images/zrrsczt_icon.svg'; //
import xlhyIcon from '@/assets/images/xlhy_icon.svg'; //
import rchyIcon from '@/assets/images/rchy_icon.svg'; //
import mxclIcon from '@/assets/images/mxcl_icon.svg'; //
import srhyIcon from '@/assets/images/srhy_icon.svg'; //
const router = useRouter()
const menuItems = [
{ title: "手机三要素", icon: sjsysIcon, product: "toc_PhoneThreeElements" },
{ title: "银行卡黑名单", icon: yhkhmdIcon, product: "toc_BankCardBlacklist" },
{ title: "身份证二要素", icon: sfzeysIcon, product: "toc_IDCardTwoElements" },
{ title: "手机二要素", icon: sjeysIcon, product: "toc_PhoneTwoElements" },
{ title: "在网时长", icon: sjzwscIcon, product: "toc_NetworkDuration" },
{ title: "手机二次卡", icon: sjeckIcon, product: "toc_PhoneSecondaryCard" },
{ title: "手机号码风险", icon: sjhmfxIcon, product: "toc_PhoneNumberRisk" },
{ title: "银行卡四要素", icon: yhk4ysIcon, product: "toc_BankCardFourElements" },
{ title: "自然人生存状态", icon: zrrscztIcon, product: "toc_NaturalLifeStatus" },
// { title: "", icon: yhksysIcon, product: "toc_BankCardThreeElements" },
// { title: "", icon: xlhyIcon, product: "toc_EducationVerification" },
{ title: "人车核验", icon: rchyIcon, product: "toc_PersonVehicleVerification" },
{ title: "名下车辆", icon: mxclIcon, product: "toc_VehiclesUnderName" },
{ title: "双人婚姻", icon: srhyIcon, product: "toc_DualMarriage" },
];
const toInquire = (product) => {
router.push('/inquire/' + product)
}
</script>
<style scoped></style>

View File

@ -1,56 +1,55 @@
import { fileURLToPath, URL } from 'node:url'
import AutoImport from 'unplugin-auto-import/vite';
import Components from 'unplugin-vue-components/vite';
import { VantResolver } from '@vant/auto-import-resolver';
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import vueDevTools from 'vite-plugin-vue-devtools'
import { fileURLToPath, URL } from "node:url";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { VantResolver } from "@vant/auto-import-resolver";
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import vueJsx from "@vitejs/plugin-vue-jsx";
import vueDevTools from "vite-plugin-vue-devtools";
// https://vite.dev/config/
export default defineConfig({
server: {
host: '0.0.0.0', // 设置为 0.0.0.0 允许局域网访问
port: 5678, // 自定义端口号,可选
strictPort: true, // 如果端口被占用则抛出错误而不是使用下一个可用端口
proxy: {
// '/api/v1': {
// target: 'https://www.tianyuandb.com', // 本地接口地址
// changeOrigin: true,
// },
'/api/v1/chat': {
target: 'https://www.tianyuandb.com', // 本地接口地址
changeOrigin: true,
// rewrite: (path) => path.replace(/^\/api\/v1\/chat/, '/chat')
},
'/api/v1': {
target: 'https://6m4685017o.goho.co', // 本地接口地址
changeOrigin: true,
},
server: {
host: "0.0.0.0", // 设置为 0.0.0.0 允许局域网访问
port: 5678, // 自定义端口号,可选
strictPort: true, // 如果端口被占用则抛出错误而不是使用下一个可用端口
proxy: {
"/api/v1": {
target: "https://www.tianyuandb.com", // 本地接口地址
changeOrigin: true,
},
"/api/v1/chat": {
target: "https://www.tianyuandb.com", // 本地接口地址
changeOrigin: true,
// rewrite: (path) => path.replace(/^\/api\/v1\/chat/, '/chat')
},
// "/api/v1": {
// target: "https://6m4685017o.goho.co", // 本地接口地址
// changeOrigin: true,
// },
},
},
},
plugins: [
vue(),
AutoImport({
imports: [
'vue', // 自动引入 Vue Composition API如 ref、computed、onMounted 等
'vue-router', // 自动引入 vue-router 中的方法,如 useRoute、useRouter 等(可选)
'@vueuse/core', // 自动引入 VueUse 中的工具函数(可选)
],
dts: 'src/auto-imports.d.ts', // 生成类型定义文件(可选)
dirs: ['src/composables', 'src/stores', 'src/components'],
resolvers: [VantResolver()],
}),
Components({
resolvers: [VantResolver()],
}),
vueJsx(),
// vueDevTools(),
],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
plugins: [
vue(),
AutoImport({
imports: [
"vue", // 自动引入 Vue Composition API如 ref、computed、onMounted 等
"vue-router", // 自动引入 vue-router 中的方法,如 useRoute、useRouter 等(可选)
"@vueuse/core", // 自动引入 VueUse 中的工具函数(可选)
],
dts: "src/auto-imports.d.ts", // 生成类型定义文件(可选)
dirs: ["src/composables", "src/stores", "src/components"],
resolvers: [VantResolver()],
}),
Components({
resolvers: [VantResolver()],
}),
vueJsx(),
// vueDevTools(),
],
resolve: {
alias: {
"@": fileURLToPath(new URL("./src", import.meta.url)),
},
},
},
})
});