This commit is contained in:
liangzai 2025-01-29 12:58:31 +08:00
parent 1a40fabb93
commit 092f473603
52 changed files with 2300 additions and 657 deletions

View File

@ -1,71 +1,123 @@
<!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>
(function (w, d, s, q, i) {
w[q] = w[q] || [];
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s);
j.async = true;
j.id = "beacon-aplus";
j.src = "https://d.alicdn.com/alilog/mlog/aplus/" + i + ".js";
f.parentNode.insertBefore(j, f);
})(window, document, "script", "aplus_queue", "203467608");
aplus_queue.push({
action: "aplus.setMetaInfo",
arguments: ["appKey", "6790b8479a16fe6dcd350d51"],
});
aplus_queue.push({
action: "aplus.setMetaInfo",
arguments: ["aplus-waiting", "MAN"],
});
aplus_queue.push({
action: "aplus.setMetaInfo",
arguments: ["DEBUG", false],
});
aplus_queue.push({
action: "aplus.setMetaInfo",
arguments: ["aplus-idtype", "uuid"], //取值参考见附表1
});
</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>
<!-- <script type="text/javascript" src="./src/assets/webview.js"></script>
<script type="text/javascript" src="./src/assets/jweixin.js"></script>
<script type="text/javascript">
const webViewJs = uni.webView;
const wxJs = wx.miniProgram;
console.log("wxJs", wxJs);
console.log("webViewJs", webViewJs);
</script> -->
<script type="text/javascript">
document.write(
'<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"><\/script>'
);
</script>
<script
type="text/javascript"
src="./src/assets/uni-webview.js"
></script>
</body>
</html>

View File

@ -1,6 +1,8 @@
<script setup>
import { RouterLink, RouterView } from 'vue-router'
import WechatOverlay from './components/WechatOverlay.vue';
import { useWebView } from "@/composables/useWebView"
const { platform } = useWebView()
onMounted(() => {
RefreshToken()
})

View File

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 155 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 941 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1007 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 991 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 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="1737208489098" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5709" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M166.6 99.6h228.6c37.9 0 68.6 30.7 68.6 68.6v228.6c0 37.9-30.7 68.6-68.6 68.6H166.6c-38 0-68.6-30.8-68.6-68.6V168.2c0-38 30.7-68.6 68.6-68.6z m457.3 0h228.6c38 0 68.6 30.7 68.6 68.6v228.6c0 37.9-30.7 68.6-68.6 68.6H623.9c-37.9 0-68.6-30.7-68.6-68.6V168.2c0-38 30.7-68.6 68.6-68.6zM166.6 556.8h228.6c37.9 0 68.6 30.7 68.6 68.6V854c0 37.9-30.7 68.6-68.6 68.6H166.6c-38 0-68.6-30.7-68.6-68.6V625.5c0-37.9 30.7-68.7 68.6-68.7z m685.9 45.8c12.7 0 22.8 10.3 22.8 22.8V854c0 12.7-10.3 22.8-22.8 22.8H623.9c-12.7 0-22.8-10.3-22.8-22.8V625.5c0-12.7 10.3-22.8 22.8-22.8h228.6z m0-45.8H623.9c-37.9 0-68.6 30.7-68.6 68.6V854c0 37.9 30.7 68.6 68.6 68.6h228.6c37.9 0 68.6-30.7 68.6-68.6V625.5c0.1-37.9-30.6-68.7-68.6-68.7z" fill="#4B64FA" p-id="5710"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

1
src/assets/jweixin.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
src/assets/webview.js Normal file

File diff suppressed because one or more lines are too long

View File

@ -92,6 +92,7 @@ declare global {
const shallowReactive: typeof import('vue')['shallowReactive']
const shallowReadonly: typeof import('vue')['shallowReadonly']
const shallowRef: typeof import('vue')['shallowRef']
const showConfirmDialog: typeof import('vant/es')['showConfirmDialog']
const showLoadingToast: typeof import('vant/es')['showLoadingToast']
const showToast: typeof import('vant/es')['showToast']
const syncRef: typeof import('@vueuse/core')['syncRef']
@ -201,6 +202,7 @@ declare global {
const useMediaQuery: typeof import('@vueuse/core')['useMediaQuery']
const useMemoize: typeof import('@vueuse/core')['useMemoize']
const useMemory: typeof import('@vueuse/core')['useMemory']
const useMenuItems: typeof import('./composables/useMenuItems.js')['useMenuItems']
const useModel: typeof import('vue')['useModel']
const useMounted: typeof import('@vueuse/core')['useMounted']
const useMouse: typeof import('@vueuse/core')['useMouse']

View File

@ -7,10 +7,14 @@
<h2 class="text-xl font-semibold text-gray-700 mb-2">
没有查询到相关结果
</h2>
<p class=" font-semibold text-gray-700 mb-2">
可能由于春节期间系统维护导致未能查询到相关信息<br />请过后再试
</p>
<p class="text-gray-500 text-sm mb-2 leading-relaxed">
订单已申请退款预计
<span class="text-blue-500 font-medium">24小时内到账</span>
</p>
<p class="text-gray-400 text-xs">
如果已到账您可以忽略本提示
</p>
@ -24,12 +28,12 @@
</template>
<script setup>
const route = useRoute();
const router = useRouter();
//
function goBack() {
route.goBack()
router.back()
}
</script>

View File

@ -84,6 +84,7 @@ async function getPayment() {
.json()
if (data.value && !error.value) {
console.log("useApiFetch", data.value)
orderId.value = data.value.data.order_id
const prepayUrl = data.value.data.prepay_id;
const paymentForm = document.createElement('form');
@ -94,6 +95,8 @@ async function getPayment() {
paymentForm.submit();
}
show.value = false
}
</script>

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

@ -17,8 +17,8 @@ const isWeChat = ref(false);
//
const checkIfWeChat = () => {
const userAgent = navigator.userAgent.toLowerCase();
isWeChat.value = /micromessenger/.test(userAgent);
// const userAgent = navigator.userAgent.toLowerCase();
// isWeChat.value = /micromessenger/.test(userAgent);
};
//

View File

@ -16,15 +16,21 @@ const useApiFetch = createFetch({
})
// 获取平台信息
const brand = "qnc"; // 固定的品牌信息
let platform = "h5"
// 在请求前添加通用的 Header例如 Authorization
const token = localStorage.getItem('token')
const webviewEnv = localStorage.getItem('webview_env')
if (webviewEnv) {
platform = webviewEnv
}
options.headers = {
...options.headers,
'X-Platform': platform, // 添加平台信息
'X-Brand': "qnc", // 添加品牌信息
}
if (token) {
options.headers = {
...options.headers,
'X-Platform': 'h5', // 添加平台信息
'X-Brand': brand, // 添加品牌信息
Authorization: `${token}`,
}
}

View File

@ -5,7 +5,6 @@ export function useHttp(url, options = {}, token) {
baseUrl: '/api/v1',
options: {
async beforeFetch({ url, options, cancel }) {
console.log("asdasd", options)
options.headers = {
...options.headers,
Authorization: `${token}`,

View File

@ -0,0 +1,212 @@
// src/composables/useMenuItems.js
import { ref, computed, watch } from "vue";
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"; // 双人婚姻
import grblIcon from "@/assets/images/grbl_icon.svg";
import gdrqgxIcon from "@/assets/images/gdrqgx_icon.svg";
import carClgzIcon from "@/assets/images/car_cheliangguzhi.png";
import carClghIcon from "@/assets/images/car_cheliangguohu.png";
import carCxxxIcon from "@/assets/images/car_chexian.png";
import carCxsxIcon from "@/assets/images/car_cheliangshangxian.png";
import carCjhccIcon from "@/assets/images/car_vinchache.png";
import carWbxxIcon from "@/assets/images/car_weibao.png";
// 定义所有菜单项
const allMenuItems = [
{
title: "手机三要素",
icon: sjsysIcon,
product: "toc_PhoneThreeElements",
description: "查询个人与手机号码是否匹配,确保手机号码的真实性。",
},
{
title: "银行卡黑名单",
icon: yhkhmdIcon,
product: "toc_BankCardBlacklist",
description: "查询银行卡是否被列入黑名单,帮助您识别潜在的金融风险。",
},
{
title: "身份证二要素",
icon: sfzeysIcon,
product: "toc_IDCardTwoElements",
description: "验证姓名与身份证号码的匹配情况,确保身份真实性。",
},
{
title: "手机二要素",
icon: sjeysIcon,
product: "toc_PhoneTwoElements",
description: "查询手机号码和身份证的匹配情况,用于验证身份的真实性。",
},
{
title: "手机在网时长",
icon: sjzwscIcon,
product: "toc_NetworkDuration",
description: "查询手机号码的在网时长,帮助评估号码的稳定性与历史。",
},
{
title: "手机二次卡",
icon: sjeckIcon,
product: "toc_PhoneSecondaryCard",
description: "检查手机是否有二次卡,防止诈骗等风险。",
},
{
title: "手机号码风险",
icon: sjhmfxIcon,
product: "toc_PhoneNumberRisk",
description: "评估手机号码的潜在风险,包括是否与违法行为关联。",
},
{
title: "银行卡四要素",
icon: yhk4ysIcon,
product: "toc_BankCardFourElements",
description:
"通过四要素核验银行卡与个人是否匹配,进一步验证银行账户的真实性。",
},
{
title: "自然人生存状态",
icon: zrrscztIcon,
product: "toc_NaturalLifeStatus",
description: "查询个人的生存状态,帮助验证其是否真实存在。",
},
{
title: "银行卡三要素",
icon: yhksysIcon,
product: "toc_BankCardThreeElements",
description: "查询银行卡的三要素,验证账户信息的安全性。",
},
{
title: "学历核验",
icon: xlhyIcon,
product: "toc_EducationVerification",
description: "验证学历信息的真实性,确保所提供的学历符合实际。",
},
{
title: "人车核验",
icon: rchyIcon,
product: "toc_PersonVehicleVerification",
description: "查询个人与车辆的关联情况,帮助识别车辆的所有权和风险。",
},
{
title: "名下车辆",
icon: mxclIcon,
product: "toc_VehiclesUnderName",
description: "查询个人名下拥有车辆的数量,了解其车辆资产。",
},
{
title: "车辆出险信息",
icon: carCxxxIcon,
product: "toc_vehicleInsuranceSummary",
description:
"车辆出险综合信息查询功能可以帮助用户全面了解车辆的出险记录和历史,提供详尽的事故和保险信息,帮助用户做出更明智的决策。",
},
{
title: "车辆维保记录",
icon: carWbxxIcon,
product: "toc_vehicleMaintenanceRecord",
description:
"车辆维修保养记录查询功能可以帮助用户查看车辆的所有维修和保养历史,确保车辆的状态和性能得到全面了解。",
},
// {
// title: "车辆上险信息",
// icon: "sxInfoIcon",
// product: "toc_vehicleInsuranceInfo",
// description:
// "车辆上险信息查询功能可以帮助用户了解车辆的保险情况,包括是否已投保、保险公司及保单详情,确保车辆的风险得到保障。",
// },
{
title: "车架号查车",
icon: carCjhccIcon,
product: "toc_chassisNumberCheck",
description:
"车架号查车功能帮助用户通过车辆的车架号查询车辆的详细信息,包括品牌、型号、生产年份等,有助于验证车辆的真实情况。",
},
{
title: "车辆过户次数",
icon: carClghIcon,
product: "toc_vehicleTransferCount",
description:
"车辆过户次数查询功能可以帮助用户了解车辆的过户历史,提供车辆的转手记录和所有权变更情况,帮助用户判断车辆的历史背景。",
},
{
title: "车辆估值",
icon: carClgzIcon,
product: "toc_vehicleValuation",
description:
"车辆估值功能帮助用户评估车辆的市场价值,提供基于车型、年限、车况等因素的估值报告,帮助用户做出购买或出售决策。",
},
{
title: "双人婚姻",
icon: srhyIcon,
product: "toc_DualMarriage",
description: "查询双人婚姻状况,帮助评估婚姻的法律状态和风险。",
},
{
title: "个人不良",
icon: grblIcon,
product: "toc_PersonalBadRecord",
description:
"通过查询个人的不良记录,评估其风险等级(低、中、高风险)。帮助您识别潜在的信用和法律风险,确保合作方的合法合规。",
},
{
title: "人企关系",
icon: gdrqgxIcon,
product: "toc_ShareholderBusinessRelation",
description:
"通过个人关联的企业,了解其可能涉及的风险,帮助您判断该个人的风险水平,特别是与高风险企业有联系的个人。",
},
];
// 定义 Composable返回过滤后的菜单项
export function useMenuItems() {
const availableProducts = ref([]);
const requestUrl = ref(`/product/render_list/`);
const { data, error, execute, isFetching, onFetchResponse } = useApiFetch(
requestUrl,
{ immediate: false, refetch: true }
)
.get()
.json();
onFetchResponse((response) => {
if (data.value && !error.value) {
if (data.value.code === 200) {
availableProducts.value = data.value.data.Product.map(
(product) => product.product_en
);
console.log("allMenuItems");
}
}
});
// fetchRenderData 支持外部传入 verify 参数
const fetchRenderData = async (verifyParam) => {
requestUrl.value = `/product/render_list/${verifyParam}`;
// execute()
};
// 返回过滤后的菜单项
const availableMenuItems = computed(() => {
return allMenuItems.filter((item) =>
availableProducts.value.includes(item.product)
);
});
return {
fetchRenderData,
availableMenuItems,
isFetching,
};
}

View File

@ -12,15 +12,21 @@ export function useWebView() {
};
// 获取 Token从 URL 中解析)
const getTokenFromUrl = () => {
const getFromUrl = () => {
const urlParams = new URLSearchParams(window.location.search);
const tokenFromUrl = urlParams.get("token");
token.value = tokenFromUrl || ""; // 如果 URL 没有 token返回空字符串
if (token.value) {
localStorage.setItem("token", token.value);
}
return tokenFromUrl;
const env = urlParams.get("env");
// 是在webview模式下
if (env) {
document.title = "全能查"
platform.value = env
localStorage.setItem("webview_env", env)
}
};
// 封装 postMessage 方法
@ -100,17 +106,17 @@ export function useWebView() {
});
};
onMounted(async () => {
try {
const envValue = await getEnv();
console.log("当前环境", envValue)
// 将返回的键名(如 'h5', 'mp-weixin')存储到 platform
handleBridgeReady();
} catch (error) {
console.error(error);
}
// 获取 Token
getTokenFromUrl();
onMounted(() => {
// try {
// const envValue = await getEnv();
// console.log("当前环境", envValue)
// // 将返回的键名(如 'h5', 'mp-weixin')存储到 platform
// handleBridgeReady();
// } catch (error) {
// console.error(error);
// }
// 获取 Token
getFromUrl();
});
return {

View File

@ -1,54 +1,59 @@
<template>
<div class="home-layout min-h-screen flex flex-col">
<!-- Header -->
<div class="header">
<img class="logo" src="@/assets/images/logo.png" alt="Logo" />
<div class="title">全能查</div>
</div>
<!-- Content Area -->
<div class="content flex flex-col flex-1">
<template v-if="webviewEnv">
<div class="h-screen flex flex-col">
<router-view />
</div>
</template>
<template v-else>
<div class="home-layout min-h-screen flex flex-col">
<!-- Header -->
<div class="header">
<img class="logo" src="@/assets/images/logo.png" alt="Logo" />
<div class="title">全能查</div>
</div>
<!-- Vant Tabbar -->
<!-- Content Area -->
<div class="content flex flex-col flex-1">
<router-view />
</div>
<van-tabbar v-model="tabbar" @change="tabChange">
<van-tabbar-item v-for="(item, index) in menu" :key="index" :name="item.name" :icon="item.icon">{{
item.title }} </van-tabbar-item>
</van-tabbar>
<!-- Vant Tabbar -->
<!-- Complaint Button -->
<div @click="toComplaint" class="complaint-button">
<!-- <i class="icon-warning"></i> -->
<span>投诉</span>
</div>
<div class="disclaimer">
<div class="flex flex-col items-center">
<div class="flex items-center">
<img class="w-4 h-4 mr-2" src="@/assets/images/public_security_record_icon.png" alt="公安备案" />
<text>琼公网安备46010002000443号</text>
<van-tabbar v-model="tabbar" @change="tabChange">
<van-tabbar-item v-for="(item, index) in menu" :key="index" :name="item.name" :icon="item.icon">{{
item.title }} </van-tabbar-item>
</van-tabbar>
<!-- Complaint Button -->
<div @click="toComplaint" class="complaint-button">
<!-- <i class="icon-warning"></i> -->
<span>投诉</span>
</div>
<div class="disclaimer">
<div class="flex flex-col items-center">
<div class="flex items-center">
<img class="w-4 h-4 mr-2" src="@/assets/images/public_security_record_icon.png" alt="公安备案" />
<text>琼公网安备46010002000443号</text>
</div>
<div>
<a class="text-blue-500" href="https://beian.miit.gov.cn">
琼ICP备2024038584号-2
</a>
</div>
</div>
<div>
<a class="text-blue-500" href="https://beian.miit.gov.cn">
琼ICP备2024038584号-2
</a>
海南省学宇思网络科技有限公司版权所有
</div>
</div>
<div>
海南省学宇思网络科技有限公司版权所有
</div>
</div>
</div>
</template>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue';
import { useRoute, useRouter } from 'vue-router'; // Vue Router
const webviewEnv = localStorage.getItem('webview_env')
const router = useRouter();
const route = useRoute();
const tabbar = ref('index');
@ -68,11 +73,11 @@ const onClickOverlay = () => { }
//
const tabChange = (name) => {
router.push({ name }); // 使 Vue Router
};
}
//
const toComplaint = () => {
router.push({ name: 'complaint' }); // 使 Vue Router
window.location.href = 'https://work.weixin.qq.com/kfid/kfc5c19b2b93a5e73b9' //
// router.push({ name: 'complaint' }); // 使 Vue Router
};

View File

@ -1,5 +1,5 @@
<template>
<van-nav-bar fixed :border="false" placeholder :title="pageTitle" left-text="返回" left-arrow
<van-nav-bar v-if="!webviewEnv" fixed :border="false" placeholder :title="pageTitle" left-text="返回" left-arrow
@click-left="onClickLeft" />
<router-view />
</template>
@ -7,6 +7,7 @@
<script setup>
import { ref, watch } from 'vue'
import { useRouter, useRoute } from 'vue-router'
const webviewEnv = localStorage.getItem('webview_env')
const router = useRouter()
const route = useRoute()
@ -20,7 +21,9 @@ const onClickLeft = () => {
router.back()
}
}
onMounted(() => {
})
//
watch(

View File

@ -1,158 +1,187 @@
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: "me",
name: "me",
component: () => import("@/views/Me.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: "/list_marriage",
name: "listMarriage",
component: () =>
import("@/views/list_marriage.vue"),
meta: { title: "婚姻查询" },
},
{
path: "/list_risk",
name: "listRisk",
component: () => import("@/views/list_risk.vue"),
meta: { title: "风险查询" },
},
{
path: "/list_lawsuit",
name: "listLawsuit",
component: () => import("@/views/list_lawsuit.vue"),
meta: { title: "诉讼查询" },
},
{
path: "/list_car",
name: "listCar",
component: () => import("@/views/list_car.vue"),
meta: { title: "查车辆" },
},
{
path: "/list_verify",
name: "listVerify",
component: () => import("@/views/list_verify.vue"),
meta: { title: "核验查询" },
},
{
path: "/list_enterprise",
name: "listEnterprise",
component: () =>
import("@/views/list_enterprise.vue"),
meta: { title: "企业查询" },
},
{
path: "/inquire/:feature",
name: "inquire",
component: () => import("@/views/Inquire.vue"),
meta: { title: "查询报告" },
},
],
},
],
},
{
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: "/login",
name: "login",
component: () => import("@/views/Login.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(); // 结束进度条
const { aplus_queue } = window;
aplus_queue.push({
action: "aplus.sendPV",
arguments: [
{
is_auto: false,
},
{
param1: 111,
param2: "222",
},
],
});
NProgress.done(); // 结束进度条
});
export default router
export default router;

222
src/ui/CAR058.vue Normal file
View File

@ -0,0 +1,222 @@
<template>
<div class="flex flex-col items-center card">
<div class="max-w-4xl w-full space-y-6">
<!-- 基本信息 -->
<div>
<LTitle title="基本信息" type="blue-green" class="mb-4"></LTitle>
<div class="grid grid-cols-1 gap-4">
<div class="flex justify-between">
<span class="font-medium text-gray-800">号牌种类:</span>
<span>{{ plateTypeMapping[data.plateType] }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">核定载客数:</span>
<span>{{ data.passengers }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">车牌号:</span>
<span>{{ data.plate }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">车架号:</span>
<span>{{ data.vin }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">使用性质:</span>
<span>{{ data.properties }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">车辆类型:</span>
<span>{{ data.vehicleType }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">品牌名称:</span>
<span>{{ data.brandName }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">车身颜色:</span>
<span>{{ filterDataNull(bodyColorMapping[data.bodyColor]) }}</span>
</div>
</div>
</div>
<!-- 一致性核验 -->
<div>
<LTitle title="一致性核验" type="blue-green" class="mb-4"></LTitle>
<div class="grid grid-cols-1 gap-4">
<div class="flex justify-between">
<span class="font-medium text-gray-800">车牌种类一致性:</span>
<span>{{ data.carType }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">车牌号一致性:</span>
<span>{{ data.carNumber }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">姓名一致性:</span>
<span>{{ data.name }}</span>
</div>
</div>
</div>
<!-- 发动机信息 -->
<div>
<LTitle title="发动机信息" type="blue-green" class="mb-4"></LTitle>
<div class="grid grid-cols-1 gap-4">
<div class="flex justify-between">
<span class="font-medium text-gray-800">发动机型号:</span>
<span>{{ data.engineModel }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">发动机号:</span>
<span>{{ data.engineNumber }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">排量:</span>
<span>{{ data.cc }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">燃料种类:</span>
<span>{{ data.fuelType }}</span>
</div>
</div>
</div>
<!-- 车辆状态 -->
<div>
<LTitle title="车辆状态" type="blue-green" class="mb-4"></LTitle>
<div class="grid grid-cols-1 gap-4">
<div class="flex justify-between">
<span class="font-medium text-gray-800">机动车状态:</span>
<span>{{ data.vehicleStatus }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">强制报废期止:</span>
<span>{{ filterDataNull(data.retirementDate) }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">检验有效期止:</span>
<span>{{ filterDataNull(data.validityDayEnd) }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">初次登记日期:</span>
<span>{{ filterDataNull(data.firstIssueDate) }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">年检日期:</span>
<span>{{ filterDataNull(data.jianCheTime) }}</span>
</div>
</div>
</div>
<!-- 尺寸及重量 -->
<div>
<LTitle title="车辆尺寸及重量" type="blue-green" class="mb-4"></LTitle>
<div class="grid grid-cols-1 gap-4">
<div class="flex justify-between">
<span class="font-medium text-gray-800">总质量:</span>
<span>{{ filterDataNull(data.crossWeight) }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">整备质量:</span>
<span>{{ filterDataNull(data.curbWeight) }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">轴数:</span>
<span>{{ filterDataNull(data.shaft) }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">轴距:</span>
<span>{{ filterDataNull(data.wheelBase) }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">前轮距:</span>
<span>{{ filterDataNull(data.frontTread) }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">后轮距:</span>
<span>{{ filterDataNull(data.rearTread) }}</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
const props = defineProps({
data: {
type: Object,
required: true,
},
params: {
type: Object,
required: true,
},
});
//
const plateTypeMapping = {
"02": "小型汽车",
"01": "大型汽车",
"03": "使馆汽车",
"04": "领馆汽车",
"05": "境外汽车",
"06": "外籍汽车",
"07": "普通摩托车",
"08": "轻便摩托车",
"09": "使馆摩托车",
"10": "领馆摩托车",
"11": "境外摩托车",
"12": "外籍摩托车",
"13": "低速车",
"14": "拖拉机",
"15": "挂车",
"16": "教练汽车",
"17": "教练摩托车",
"20": "临时入境汽车",
"21": "临时入境摩托车",
"22": "临时行驶车",
"23": "警用汽车",
"24": "警用摩托",
"51": "新能源大型汽车",
"52": "新能源小型汽车"
};
//
const bodyColorMapping = {
"A": "白",
"B": "灰",
"C": "黄",
"D": "粉",
"E": "红",
"F": "紫",
"G": "绿",
"H": "蓝",
"I": "棕",
"J": "黑",
"K": "香槟",
"L": "银",
"M": "橙",
"N": "金",
"Z": "其他"
};
//
const maskValue = (value, type) => {
if (type === "name") {
return value.length > 1 ? value[0] + "*".repeat(value.length - 1) : "*";
} else if (type === "car_license") {
return value.slice(0, 2) + "*".repeat(value.length - 2) + value.slice(-2);
}
return value;
};
const filterDataNull = (data) => {
return data ? data : '-'
}
</script>
<style scoped></style>

76
src/ui/CAR066.vue Normal file
View File

@ -0,0 +1,76 @@
<template>
<view class="car-info-wrap">
<view class="car-info">
<view class="car-title">车辆过户次数</view>
<view class="car-num">{{ transferTimes[status] }}</view>
<!-- <view class="explanation">
<view class="explanation-text">解释说明: 机动车状态无异常显示正常反之为异常</view>
</view> -->
</view>
</view>
</template>
<script setup>
import { defineProps, computed } from "vue";
//
const props = defineProps({
data: Object,
});
//
const status = computed(() => props.data?.status);
//
const transferTimes = {
0: "过户0次",
1: "过户1-2次",
2: "过户3-5次",
3: "过户5次以上",
};
</script>
<style scoped>
.car-info-wrap {
width: 100vw;
}
.car-info {
margin: 8px 20px;
background-color: #ffffff;
padding: 20px;
border-radius: 4px;
box-shadow: 0px 0px 1px #d0d0d0;
text-align: center;
}
.car-num {
font-size: 38px;
color: green;
font-weight: bold;
}
.car-title {
font-size: 18px;
font-weight: bold;
margin-bottom: 8px;
}
.explanation-text {
font-size: 16px;
color: #999;
}
.tags {
display: flex;
flex-wrap: wrap;
}
.tag {
background-color: #e0e0e0;
border-radius: 3px;
padding: 5px 10px;
margin: 5px;
font-size: 14px;
}
</style>

310
src/ui/CAR074.vue Normal file
View File

@ -0,0 +1,310 @@
<template>
<div class="flex flex-col items-center card">
<div class="max-w-4xl w-full space-y-6">
<!-- 基本信息 -->
<div>
<LTitle
title="基本信息"
type="blue-green"
class="mb-4"
></LTitle>
<div class="grid grid-cols-1 gap-4">
<div class="flex justify-between">
<span class="font-medium text-gray-800">号牌种类:</span>
<span>{{ plateTypeMapping[data.PlateType] }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800"
>核定载客数:</span
>
<span>{{ data.RatedCapacity || "-" }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">车牌号:</span>
<span>{{ data.LicensePlate || "-" }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">车身颜色:</span>
<span>{{
bodyColorMapping[data.BodyColor] || "-"
}}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">车辆类型:</span>
<span>{{ data.CarType || "-" }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">发动机号:</span>
<span>{{ data.EngineNumber || "-" }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">燃料种类:</span>
<span>{{ data.FuelType || "-" }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800"
>是否为营运车辆:</span
>
<span>{{
data.IsOperation === "1" ? "是" : "否"
}}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">排放标准:</span>
<span>{{ data.EmiStandard || "-" }}</span>
</div>
</div>
</div>
<!-- 一致性核验 -->
<div>
<LTitle
title="一致性核验"
type="blue-green"
class="mb-4"
></LTitle>
<div class="grid grid-cols-1 gap-4">
<div class="flex justify-between">
<span class="font-medium text-gray-800"
>车牌种类一致性:</span
>
<span>{{ data.CarType || "-" }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800"
>车牌号一致性:</span
>
<span>{{ data.LicensePlate || "-" }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800"
>姓名一致性:</span
>
<span>{{ data.Name || "-" }}</span>
</div>
</div>
</div>
<!-- 车辆状态 -->
<div>
<LTitle
title="车辆状态"
type="blue-green"
class="mb-4"
></LTitle>
<div class="grid grid-cols-1 gap-4">
<div class="flex justify-between">
<span class="font-medium text-gray-800"
>机动车状态:</span
>
<span>{{ data.VehicleStatus || "-" }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800"
>强制报废期止:</span
>
<span>{{ data.ExpireDate || "-" }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800"
>检验有效期止:</span
>
<span>{{ data.ValidationDate || "-" }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800"
>初次登记日期:</span
>
<span>{{ data.FirstRegDate || "-" }}</span>
</div>
</div>
</div>
<!-- 出险信息 -->
<div>
<LTitle
title="出险信息"
type="blue-green"
class="mb-4"
></LTitle>
<div class="grid grid-cols-1 gap-4">
<div class="flex justify-between">
<span class="font-medium text-gray-800"
>商业险出险次数:</span
>
<span
>{{
data.CommercialPolicyDangerCount.split(":")[1]
}}</span
>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800"
>交强险出险次数:</span
>
<span
>{{
data.CompulsoryPolicyDangerCount.split(":")[1]
}}</span
>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800"
>重大事故标志:</span
>
<div class="tags">
<span
v-for="(value, key) in majorAccidents"
:key="key"
class="tag"
>
{{ key }}
</span>
</div>
</div>
</div>
</div>
<!-- 保单信息 -->
<div>
<LTitle
title="保单信息"
type="blue-green"
class="mb-4"
></LTitle>
<div class="grid grid-cols-1 gap-4">
<div class="flex justify-between">
<span class="font-medium text-gray-800"
>是否为高风险车损单:</span
>
<span>{{
data.IsHighriskVehicle === "1" ? "是" : "否"
}}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800"
>商业险保单倒计时:</span
>
<span>{{
formatPolicyTime(data.CommercialPolicyTime)
}}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800"
>交强险保单倒计时:</span
>
<span>{{
formatPolicyTime(data.CompulsoryPolicyTime)
}}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800"
>是否投保车损险:</span
>
<span>{{
data.IfCarDamage === "1" ? "是" : "否"
}}</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { computed } from "vue";
const props = defineProps({
data: Object,
});
const { data } = props;
//
const plateTypeMapping = {
"02": "小型汽车",
"01": "大型汽车",
"03": "使馆汽车",
"04": "领馆汽车",
"05": "境外汽车",
"06": "外籍汽车",
"07": "普通摩托车",
"08": "轻便摩托车",
"09": "使馆摩托车",
10: "领馆摩托车",
11: "境外摩托车",
12: "外籍摩托车",
13: "低速车",
14: "拖拉机",
15: "挂车",
16: "教练汽车",
17: "教练摩托车",
20: "临时入境汽车",
21: "临时入境摩托车",
22: "临时行驶车",
23: "警用汽车",
24: "警用摩托",
51: "新能源大型汽车",
52: "新能源小型汽车",
};
//
const formatPolicyTime = (policyTime) => {
const parts = policyTime.split(":");
if (parts[0] === "2" || parts[0] === "4") {
return "当期保单天数小于0";
}
if (parts[1] === "null") {
return "无保单";
} else {
return `剩余${parts[0]}`;
}
};
//
const accidentDescriptions = {
A: "碰撞",
B: "火自燃",
C: "水淹",
D: "盗抢",
};
const majorAccidents = computed(() => {
const accidents = {};
data.MajorAccident.split(",").forEach((part) => {
const [key, value] = part.split(":");
if (value === "1") {
const description = accidentDescriptions[key] || key;
accidents[description] = "是出过";
}
});
return accidents;
});
</script>
<style scoped>
/* 适用tailwindcss的样式 */
.card {
margin: 8px 20px;
background-color: #ffffff;
padding: 20px;
border-radius: 4px;
box-shadow: 0px 0px 1px #d0d0d0;
}
.tags {
display: flex;
flex-wrap: wrap;
}
.tag {
background-color: #e0e0e0;
border-radius: 3px;
padding: 5px 10px;
margin: 5px;
font-size: 14px;
}
</style>

222
src/ui/CAR079.vue Normal file
View File

@ -0,0 +1,222 @@
<template>
<div class="flex flex-col items-center card">
<div class="max-w-4xl w-full space-y-6">
<!-- 基本信息 -->
<div>
<LTitle title="基本信息" type="blue-green" class="mb-4"></LTitle>
<div class="grid grid-cols-1 gap-4">
<div class="flex justify-between">
<span class="font-medium text-gray-800">号牌种类:</span>
<span>{{ plateTypeMapping[data.plateType] }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">核定载客数:</span>
<span>{{ data.passengers }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">车牌号:</span>
<span>{{ data.plate }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">车架号:</span>
<span>{{ data.vin }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">使用性质:</span>
<span>{{ data.properties }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">车辆类型:</span>
<span>{{ data.vehicleType }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">品牌名称:</span>
<span>{{ data.brandName }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">车身颜色:</span>
<span>{{ filterDataNull(bodyColorMapping[data.bodyColor]) }}</span>
</div>
</div>
</div>
<!-- 一致性核验 -->
<div>
<LTitle title="一致性核验" type="blue-green" class="mb-4"></LTitle>
<div class="grid grid-cols-1 gap-4">
<div class="flex justify-between">
<span class="font-medium text-gray-800">车牌种类一致性:</span>
<span>{{ data.carType }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">车牌号一致性:</span>
<span>{{ data.carNumber }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">姓名一致性:</span>
<span>{{ data.name }}</span>
</div>
</div>
</div>
<!-- 发动机信息 -->
<div>
<LTitle title="发动机信息" type="blue-green" class="mb-4"></LTitle>
<div class="grid grid-cols-1 gap-4">
<div class="flex justify-between">
<span class="font-medium text-gray-800">发动机型号:</span>
<span>{{ data.engineModel }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">发动机号:</span>
<span>{{ data.engineNumber }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">排量:</span>
<span>{{ data.cc }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">燃料种类:</span>
<span>{{ data.fuelType }}</span>
</div>
</div>
</div>
<!-- 车辆状态 -->
<div>
<LTitle title="车辆状态" type="blue-green" class="mb-4"></LTitle>
<div class="grid grid-cols-1 gap-4">
<div class="flex justify-between">
<span class="font-medium text-gray-800">机动车状态:</span>
<span>{{ data.vehicleStatus }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">强制报废期止:</span>
<span>{{ filterDataNull(data.retirementDate) }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">检验有效期止:</span>
<span>{{ filterDataNull(data.validityDayEnd) }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">初次登记日期:</span>
<span>{{ filterDataNull(data.firstIssueDate) }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">年检日期:</span>
<span>{{ filterDataNull(data.jianCheTime) }}</span>
</div>
</div>
</div>
<!-- 尺寸及重量 -->
<div>
<LTitle title="车辆尺寸及重量" type="blue-green" class="mb-4"></LTitle>
<div class="grid grid-cols-1 gap-4">
<div class="flex justify-between">
<span class="font-medium text-gray-800">总质量:</span>
<span>{{ filterDataNull(data.crossWeight) }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">整备质量:</span>
<span>{{ filterDataNull(data.curbWeight) }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">轴数:</span>
<span>{{ filterDataNull(data.shaft) }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">轴距:</span>
<span>{{ filterDataNull(data.wheelBase) }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">前轮距:</span>
<span>{{ filterDataNull(data.frontTread) }}</span>
</div>
<div class="flex justify-between">
<span class="font-medium text-gray-800">后轮距:</span>
<span>{{ filterDataNull(data.rearTread) }}</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
const props = defineProps({
data: {
type: Object,
required: true,
},
params: {
type: Object,
required: true,
},
});
//
const plateTypeMapping = {
"02": "小型汽车",
"01": "大型汽车",
"03": "使馆汽车",
"04": "领馆汽车",
"05": "境外汽车",
"06": "外籍汽车",
"07": "普通摩托车",
"08": "轻便摩托车",
"09": "使馆摩托车",
"10": "领馆摩托车",
"11": "境外摩托车",
"12": "外籍摩托车",
"13": "低速车",
"14": "拖拉机",
"15": "挂车",
"16": "教练汽车",
"17": "教练摩托车",
"20": "临时入境汽车",
"21": "临时入境摩托车",
"22": "临时行驶车",
"23": "警用汽车",
"24": "警用摩托",
"51": "新能源大型汽车",
"52": "新能源小型汽车"
};
//
const bodyColorMapping = {
"A": "白",
"B": "灰",
"C": "黄",
"D": "粉",
"E": "红",
"F": "紫",
"G": "绿",
"H": "蓝",
"I": "棕",
"J": "黑",
"K": "香槟",
"L": "银",
"M": "橙",
"N": "金",
"Z": "其他"
};
//
const maskValue = (value, type) => {
if (type === "name") {
return value.length > 1 ? value[0] + "*".repeat(value.length - 1) : "*";
} else if (type === "car_license") {
return value.slice(0, 2) + "*".repeat(value.length - 2) + value.slice(-2);
}
return value;
};
const filterDataNull = (data) => {
return data ? data : '-'
}
</script>
<style scoped></style>

51
src/ui/CAR100.vue Normal file
View File

@ -0,0 +1,51 @@
<template>
<view class="car-info-wrap">
<view class="car-info">
<view class="car-title">车辆估值</view>
<!-- 若数据为空显示未估值 -->
<view class="car-num">{{ formattedAssessment }}</view>
</view>
</view>
</template>
<script setup>
import { defineProps, computed } from "vue";
// `data`
const props = defineProps({
data: Object,
});
//
const formattedAssessment = computed(() => {
// ""
return props.data?.assessment ? `${props.data.assessment}` : "未估值";
});
</script>
<style scoped>
.car-info-wrap {
width: 100vw;
}
.car-info {
margin: 8px 20px;
background-color: #ffffff;
padding: 20px;
border-radius: 4px;
box-shadow: 0px 0px 1px #d0d0d0;
text-align: center;
}
.car-num {
font-size: 38px;
color: green;
font-weight: bold;
}
.car-title {
font-size: 18px;
font-weight: bold;
margin-bottom: 8px;
}
</style>

View File

@ -1,19 +1,31 @@
<template>
<div class="flex flex-col box-border from-blue-100 to-white bg-gradient-to-b pt-4 flex-1 pb-4">
<div class="mx-4 flex flex-col flex-1 rounded-xl shadow-lg">
<!-- Chat Window -->
<div class="w-full text-center py-2 text-slate-800 font-bold text-xl bg-white rounded-t-xl">AI律师</div>
<!-- 角色切换部分 -->
<div class="flex border-blue-300 mx-4 p-1 bg-white rounded-xl">
<div class="flex items-center flex-1 p-2 box-border rounded-xl cursor-pointer"
:class="selectedRole === 'legal' ? 'bg-blue-300 text-white' : ''" @click="selectRole('legal')">
<img src="@/assets/images/ai_lvshi.webp" class="w-10 h-10 rounded-xl mr-2" alt="AI律师">
法律咨询
</div>
<div class="flex items-center flex-1 p-2 box-border rounded-xl cursor-pointer"
:class="selectedRole === 'emotional' ? 'bg-blue-300 text-white' : ''" @click="selectRole('emotional')">
<img src="@/assets/images/ai_qinggan.png" class="w-10 h-10 rounded-xl mr-2" alt="AI心理咨询师">
情感咨询
</div>
</div>
<!-- 聊天窗口 -->
<div class="mx-4 flex flex-col flex-1 rounded-xl shadow-lg">
<div class="flex flex-col flex-1 p-4">
<div class=" flex-1 overflow-y-auto">
<div v-for="(message, index) in messages" :key="index" class="mb-4">
<div class="flex-1 overflow-y-auto">
<div v-for="(message, index) in currentMessages" :key="index" class="mb-4">
<div v-if="message.sender === 'ai'" class="flex justify-start items-start">
<img class="w-10 h-10 rounded-xl mr-2" src="@/assets/images/ai_picture.webp" alt="AI律师">
<div
class="inline-block max-w-max rounded-xl bg-white p-2 text-left text-green-600 font-medium shadow-md">
<!-- If AI message, show loading or text -->
<!-- 可根据角色显示不同的AI形象 -->
<div class="inline-block max-w-max rounded-xl bg-white p-2 text-left"
:class="selectedRole === 'legal' ? 'text-green-600' : 'text-purple-600'">
<!-- 如果是AI消息显示加载中或文本 -->
<div v-if="message.loading" class="flex justify-center items-center">
<div class="loader"></div> <!-- Loading Spinner -->
<div class="loader"></div> <!-- 加载动画 -->
</div>
<div v-else>
{{ message.text }}
@ -21,136 +33,204 @@
</div>
</div>
<div v-else class="flex justify-end">
<div class=" ml-auto inline-block max-w-max rounded-xl from-sky-300 via-sky-300 to-sky-300
bg-gradient-to-r p-2 text-right text-white font-medium shadow-md">
<div class="ml-auto inline-block max-w-max rounded-xl from-sky-300 via-sky-300 to-sky-300
bg-gradient-to-r p-2 text-right text-white font-medium shadow-md">
{{ message.text }}
</div>
</div>
</div>
</div>
<!-- Input Area -->
<!-- 输入区域 -->
<div class="p-2 w-full input-area flex items-center gap-2">
<input v-model="userMessage" placeholder="请输入您的问题..." class="flex-1 p-2 border rounded-lg"
type="text" />
<input v-model="userMessage"
:placeholder="selectedRole === 'legal' ? '请输入您的法律问题...' : '请输入您的情感问题...'"
class="flex-1 p-2 border rounded-lg" type="text" @keyup.enter="sendMessage" />
<button class="shadow p-2 bg-blue-500 text-white rounded-lg" @click="sendMessage">
发送
</button>
<!-- <button class="shadow p-2 bg-blue-500 text-white rounded-lg" @click="handleService">
服务
</button> -->
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue'
import { ref, onBeforeUnmount, computed } from 'vue'
import chatEncrypt from "@/utils/chatEncrypt"
const userMessage = ref('') //
const messages = ref([ // AI
{ sender: 'ai', text: '欢迎!请问有什么可以帮助您的吗?' },
])
const sessionID = ref("") // sessionID
let reader;
//
const selectedRole = ref('legal')
//
const userMessage = ref('')
//
const messages = ref({
legal: [
{ sender: 'ai', text: '欢迎!请问有什么法律问题需要帮助?' },
],
emotional: [
{ sender: 'ai', text: '欢迎!请问有什么情感问题需要帮助?' },
]
})
// sessionID
const sessionID = ref({
legal: "",
emotional: ""
})
let reader = {
legal: null,
emotional: null
}
//
const currentMessages = computed(() => messages.value[selectedRole.value])
//
function selectRole(role) {
if (selectedRole.value !== role) {
selectedRole.value = role
//
if (!messages.value[role]) {
messages.value[role] = [
{ sender: 'ai', text: role === 'legal' ? '欢迎!请问有什么法律问题需要帮助?' : '欢迎!请问有什么情感问题需要帮助?' },
]
sessionID.value[role] = ""
}
}
}
async function sendMessage() {
if (userMessage.value.trim() === '') return;
//
messages.value.push({ sender: 'user', text: userMessage.value });
//
const role = selectedRole.value
const t = Date.now();
const x = chatEncrypt(String(t));
//
messages.value[role].push({ sender: 'user', text: userMessage.value })
const t = Date.now()
const x = chatEncrypt(String(t))
// AI
const aiMessage = { sender: 'ai', text: '', loading: true };
messages.value.push(aiMessage);
const aiMessage = { sender: 'ai', text: '', loading: true }
messages.value[role].push(aiMessage)
//
fetch('/api/v1/chat/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
x,
t,
'x': x,
't': t,
},
body: JSON.stringify({
prompt: userMessage.value,
platform_id: 2,
roleid: 1,
role_id: 1, // roleid
openid: 'openid' + localStorage.getItem("token"),
userid: 'userid' + localStorage.getItem("token"),
sessionid: sessionID.value // sessionID
sessionid: sessionID.value[role] // 使 sessionID
}),
})
.then((response) => {
if (response.ok && response.body) {
// ReadableStream
reader = response.body.getReader();
const decoder = new TextDecoder();
let buffer = '';
reader[role] = response.body.getReader()
const decoder = new TextDecoder()
let buffer = ''
// 使
const readStream = () => {
reader.read().then(({ done, value }) => {
reader[role].read().then(({ done, value }) => {
if (done) {
return;
return
}
buffer += decoder.decode(value, { stream: true });
buffer += decoder.decode(value, { stream: true })
//
let newLineIndex;
let newLineIndex
while ((newLineIndex = buffer.indexOf('\n')) !== -1) {
let message = buffer.slice(0, newLineIndex).trim();
let message = buffer.slice(0, newLineIndex).trim()
if (message) {
aiMessage.loading = false; //
aiMessage.loading = false //
if (message.startsWith('data:')) {
message = message.replace('data:', '').trim(); // 'message data:'
message = message.replace('data:', '').trim() // 'data:'
}
try {
//
const parsedMessage = JSON.parse(message);
const parsedMessage = JSON.parse(message)
console.log("parsedMessage", parsedMessage)
// session_id
sessionID.value = parsedMessage.output.session_id;
sessionID.value[role] = parsedMessage.output.session_id
// AI
const aiText = parsedMessage.output.text;
const aiText = parsedMessage.output.text
// AI
aiMessage.text += aiText;
messages.value = [...messages.value]; //
aiMessage.text += aiText
messages.value[role] = [...messages.value[role]] //
} catch (e) {
console.error('Failed to parse message:', e);
console.error('Failed to parse message:', e)
}
}
buffer = buffer.slice(newLineIndex + 1);
buffer = buffer.slice(newLineIndex + 1)
}
//
readStream();
});
};
readStream();
readStream()
})
}
readStream()
} else {
console.error('Failed to fetch stream');
console.error('Failed to fetch stream')
}
})
.catch((error) => {
console.error('Request failed:', error);
});
console.error('Request failed:', error)
})
userMessage.value = ''; //
userMessage.value = '' //
}
onBeforeUnmount(() => {
if (reader) {
reader.cancel(); //
}
});
//
Object.keys(reader).forEach(role => {
if (reader[role]) {
reader[role].cancel()
}
})
})
const handleService = () => {
showConfirmDialog({
title: '更多服务',
message:
'更多服务请访问全能查官网: https://www.quannengcha.com 或关注全能查公众号',
})
.then(() => {
// //
// const url = 'https://www.quannengcha.com';
// navigator.clipboard.writeText(url)
// .then(() => {
// showToast('');
// })
// .catch(err => {
// //
// console.error(':', err);
// });
})
.catch(() => {
// on cancel
});
}
</script>
<style scoped>
@ -192,4 +272,9 @@ button:hover {
transform: rotate(360deg);
}
}
/* Tab Styles */
.flex.border-blue-300>div {
transition: all 0.3s;
}
</style>

View File

@ -80,8 +80,28 @@ const featureMap = {
},
CAR061: {
name: '名下车辆',
component: defineAsyncComponent(() => import('@/ui/CCAR061.vue')),
}
component: defineAsyncComponent(() => import('@/ui/CAR061.vue')),
},
CAR074: {
name: "车辆出险信息",
component: defineAsyncComponent(() => import("@/ui/CAR074.vue")),
},
CAR058: {
name: "车辆维保记录",
component: defineAsyncComponent(() => import("@/ui/CAR058.vue")),
},
CAR079: {
name: "车架号查车",
component: defineAsyncComponent(() => import("@/ui/CAR079.vue")),
},
CAR066: {
name: "车辆过户次数",
component: defineAsyncComponent(() => import("@/ui/CAR066.vue")),
},
CAR100: {
name: "车辆估值",
component: defineAsyncComponent(() => import("@/ui/CAR100.vue")),
},
};
@ -97,6 +117,8 @@ const reportName = ref("")
const reportDateTime = ref(null)
const feature = ref("")
const isEmpty = ref(false)
const webviewEnv = localStorage.getItem('webview_env')
onMounted(() => {
const query = new URLSearchParams(window.location.search);
feature.value = query.get("feature");
@ -181,8 +203,8 @@ 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暂未上线建议将此网站加入收藏夹或书签或可以百度搜索全能查以及在微信全能查小程序复制链接打开" />
<van-notice-bar v-if="!webviewEnv" 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">
@ -278,7 +300,8 @@ const maskValue = computed(() => {
&nbsp; &nbsp;本报告的数据由用户本人明确授权后我们才向相关合法存有用户个人数据的机构调取本报告相关内容本平台只做大数据的获取与分析仅向用户个人展示参考
</div>
<p>
&nbsp; &nbsp; 报告有效期<strong class="text-red-500">30</strong>过期自动删除
&nbsp; &nbsp; 报告有效期<strong class="text-red-500">{{ webviewEnv ? '7' : '30'
}}</strong>过期自动删除
</p>
<p>
&nbsp; &nbsp;
@ -293,7 +316,7 @@ const maskValue = computed(() => {
</div>
</template>
</div>
<div class="disclaimer">
<div class="disclaimer" v-if="!webviewEnv">
<div class="flex flex-col items-center">
<div class="flex items-center">
<img class="w-4 h-4 mr-2" src="@/assets/images/public_security_record_icon.png" alt="公安备案" />

View File

@ -1,99 +1,118 @@
<script setup>
import { ref, onMounted } from 'vue'
const router = useRouter()
const page = ref(1)
const pageSize = ref(10)
const total = ref(0)
const reportList = ref([])
const num = ref(0)
const max = ref(60)
const loading = ref(false)
const finished = ref(false)
import { ref, onMounted } from "vue";
const router = useRouter();
const page = ref(1);
const pageSize = ref(10);
const total = ref(0);
const reportList = ref([]);
const num = ref(0);
const max = ref(60);
const loading = ref(false);
const finished = ref(false);
//
async function fetchData() {
// { page: page.value, page_size: pageSize.value }
loading.value = true
const { data, error } = await useApiFetch(`query/list?page=${page.value}&page_size=${pageSize.value}`)
loading.value = true;
const { data, error } = await useApiFetch(
`query/list?page=${page.value}&page_size=${pageSize.value}`
)
.get()
.json()
.json();
if (data.value && !error.value) {
if (data.value.code === 200) {
total.value = data.value.data.total
total.value = data.value.data.total;
if (data.value.data.list && data.value.data.list.length > 0) {
reportList.value.push(...data.value.data.list)
page.value += 1
reportList.value.push(...data.value.data.list);
page.value += 1;
}
if (reportList.value.length >= total.value) {
finished.value = true
finished.value = true;
}
}
}
loading.value = false
loading.value = false;
}
//
onMounted(() => {
fetchData()
})
fetchData();
});
//
const onLoad = () => {
if (!finished.value) {
console.log("finished", finished.value)
console.log("finished", finished.value);
if (num.value >= max.value) {
finished.value = true
finished.value = true;
} else {
fetchData()
fetchData();
}
}
}
};
function toDetail(item) {
router.push({ path: '/report', query: { orderId: item.order_id } });
router.push({ path: "/report", query: { orderId: item.order_id } });
}
//
function stateText(state) {
switch (state) {
case 'pending':
return '查询中'
case 'success':
return '查询成功'
case 'failed':
return '查询失败'
case "pending":
return "查询中";
case "success":
return "查询成功";
case "failed":
return "查询失败";
default:
return '未知状态'
return "未知状态";
}
}
//
function statusClass(state) {
switch (state) {
case 'pending':
return 'status-pending'
case 'success':
return 'status-success'
case 'failed':
return 'status-failed'
case "pending":
return "status-pending";
case "success":
return "status-success";
case "failed":
return "status-failed";
default:
return ''
return "";
}
}
const webviewEnv = localStorage.getItem("webview_env");
</script>
<template>
<!-- Vant 通知栏 -->
<van-notice-bar color="#1989fa" background="#ecf9ff" left-icon="info-o"
text="为保证用户的隐私以及数据安全您的报告生成30天之后将自动清除请及时保存您的报告。" />
<van-notice-bar
v-if="!webviewEnv"
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">
<div class=" text-gray-600 flex flex-col gap-2">
<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"
>
<div class="text-gray-600 flex flex-col gap-2">
<div class="flex items-center justify-between">
<div>状态:</div>
<div class="rounded-xl px-2 py-1" :class="[statusClass(item.query_state)]">
<div
class="rounded-xl px-2 py-1"
:class="[statusClass(item.query_state)]"
>
{{ stateText(item.query_state) }}
</div>
</div>
@ -108,7 +127,6 @@ function statusClass(state) {
</div>
</van-cell>
</van-list>
</div>
</template>

View File

@ -23,6 +23,8 @@ const mobile = ref("");
const bankCard = ref("");
const startDate = ref([])
const dateVal = ref("")
const vinCode = ref("")
const carDrivingPermit = ref('')
const showDatePicker = ref(false)
//
const today = new Date();
@ -80,21 +82,13 @@ const formatterDate = (type, option) => {
return option;
};
const onConfirmDate = ({ selectedValues, selectedOptions }) => {
console.log("selectedValues", selectedValues)
console.log("startDate", startDate.value)
dateVal.value = selectedOptions.map(item => item.text).join('');
showDatePicker.value = false
}
const carLicenseChange = (e) => {
console.log("carLicenseChange", e);
carLicense.value = e;
};
const onConfirmCarType = ({ selectedValues, selectedOptions }) => {
console.log(
"selectedValues, selectedOptions",
selectedValues,
selectedOptions
);
showCarTypePicker.value = false;
carPickerVal.value = selectedValues;
carType.value = selectedOptions[0].text;
@ -104,28 +98,12 @@ const onConfirmCarType = ({ selectedValues, selectedOptions }) => {
onMounted(() => {
// discountPriceInit()
isFinishPayment()
getProduct();
initAuthorization();
});
const discountPrice = ref(false) //
// const discountPriceInit = () => {
// 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 //
// }
// }
function isFinishPayment() {
const query = new URLSearchParams(window.location.search);
let orderNo = query.get("out_trade_no");
@ -183,7 +161,7 @@ const isBankCardValid = computed(() => {
return sum % 10 === 0; // 10
});
const isVinCodeValid = computed(() => vinCode.value.trim().length === 17);
function handleSubmit() {
if (!agreeToTerms.value) {
showToast({ message: `请阅读并同意用户协议、隐私政策${!NeedAuthorization.includes(feature.value) ? '和授权书' : ''}` });
@ -192,6 +170,7 @@ function handleSubmit() {
if (
!validateField("name", name.value, (v) => v, "请输入姓名") ||
!validateField("nameMan", nameMan.value, (v) => v, "请输入男方姓名") ||
!validateField("carDrivingPermit", carDrivingPermit.value, (v) => v, "请上传行驶证") ||
!validateField(
"nameWoman",
nameWoman.value,
@ -246,6 +225,12 @@ function handleSubmit() {
(v) => isCarLicense.value,
"请输入正确的车牌号"
) ||
!validateField(
"vinCode",
vinCode.value,
(v) => isVinCodeValid.value,
"请输入正确的车架号"
) ||
!validateField("entName", entName.value, (v) => v, "请输入企业名称") ||
!validateField(
"entCode",
@ -288,6 +273,12 @@ const specialProduct = {
toc_NetworkDuration: ["mobile"],
toc_PhoneSecondaryCard: ["mobile", "date"],
toc_PhoneNumberRisk: ["mobile"],
toc_PhoneNumberRisk: ["mobile"],
toc_vehicleInsuranceSummary: ["vinCode"],
toc_vehicleMaintenanceRecord: ["vinCode", "carDrivingPermit"],
toc_chassisNumberCheck: ["vinCode"],
toc_vehicleTransferCount: ["vinCode"],
toc_vehicleValuation: ["vinCode", "carLicense"],
};
const NeedAuthorization = [
"toc_Marriage"
@ -328,12 +319,18 @@ async function submitRequest() {
if (isHasInput("verificationCode")) {
req.code = verificationCode.value;
}
if (isHasInput("vinCode")) {
req.vin_code = vinCode.value;
}
if (isHasInput("carType")) {
req.car_type = carPickerVal.value[0].value;
}
if (isHasInput("carLicense")) {
req.car_license = carLicense.value.trim();
}
if (isHasInput("carDrivingPermit")) {
req.car_drivingPermit = carDrivingPermit.value;
}
if (isHasInput("date")) {
req.start_date = startDate.value.map(item => item).join('')
}
@ -351,7 +348,7 @@ async function submitRequest() {
if (data.value.code === 200) {
queryId.value = data.value.data.id;
if (authorization.value) {
showPayment.value = true;
toPayment()
} else {
showAuthorizationPopup.value = true;
}
@ -405,9 +402,18 @@ function toAuthorization() {
const agreed = () => {
showAuthorizationPopup.value = false;
authorization.value = true;
showPayment.value = true;
toPayment()
};
const toPayment = () => {
const webviewEnv = localStorage.getItem('webview_env')
if (webviewEnv === 'mp-weixin') {
webUni.navigateTo({
url: `/pages/payment?payment_id=${queryId.value}`
});
} else {
showPayment.value = true;
}
}
//
const cancel = () => {
showAuthorizationPopup.value = false;
@ -420,6 +426,33 @@ onUnmounted(() => {
clearInterval(timer);
}
});
//
const handleFileChange = (event) => {
const file = event.target.files[0]
if (file) {
//
const isValidFormat = ['image/png', 'image/jpeg', 'image/jpg'].includes(file.type)
const isValidSize = file.size <= 2 * 1024 * 1024 // 2MB
if (!isValidFormat) {
showToast({ message: '只支持上传 PNG 格式的图片' });
return
}
if (!isValidSize) {
showToast({ message: '图片大小不能超过 2MB' });
return
}
// 使 FileReader Base64
const reader = new FileReader()
reader.onload = () => {
carDrivingPermit.value = reader.result //
}
reader.readAsDataURL(file) // Base64
}
}
</script>
<template>
@ -479,6 +512,31 @@ onUnmounted(() => {
<CarNumberInput class="form-input" @number-input-result="carLicenseChange" :default-str="carLicense">
</CarNumberInput>
</div>
<div class="flex justify-center items-center flex-col p-4 space-y-4" v-if="isHasInput('carDrivingPermit')">
<!-- 自定义上传按钮 -->
<label for="file-upload"
class="flex justify-center items-center w-full h-48 bg-blue-100 rounded-lg border-2 border-blue-300 cursor-pointer hover:bg-blue-200 hover:border-blue-400 transition-all relative">
<!-- 图片上传后展示的图片 -->
<div v-if="carDrivingPermit"
class="w-full h-full flex justify-center items-center rounded-lg overflow-hidden">
<img :src="carDrivingPermit" alt="Uploaded License" class="object-cover w-full h-full">
</div>
<!-- 未上传图片时显示文本 -->
<span v-else class="text-lg text-blue-700 text-center font-medium">点击上传行驶证<br />PNG格式最大2MB</span>
<!-- 隐藏原生文件输入框 -->
<input type="file" id="file-upload" accept="image/png, image/jpeg, image/jpg"
class="absolute inset-0 opacity-0 cursor-pointer" @change="handleFileChange" />
</label>
<!-- 图片上传格式说明 -->
<div class="text-sm text-gray-600">
<p>只支持PNG格式最大2MB</p>
</div>
</div>
<div class="mb-4 flex items-center" v-if="isHasInput('vinCode')">
<label for="vinCode" class="form-label">车架号</label>
<input v-model="vinCode" id="vinCode" type="text" placeholder="请输入车架号" class="form-input" />
</div>
<div class="mb-4 flex items-center" v-if="isHasInput('bankCard')">
<label for="bankCard" class="form-label">银行卡号</label>
<input v-model="bankCard" id="bankCard" type="tel" placeholder="请输入银行卡号" class="form-input" />
@ -548,9 +606,7 @@ onUnmounted(() => {
</div>
</div>
<div v-if="discountPrice" class="text-sm text-right text-red-500 mb-4">
限时活动价2折优惠
</div>
<div class="mb-4 text-gray-600 leading-relaxed" v-html="featureData.description">
</div>

View File

@ -89,9 +89,6 @@ async function handleLogin() {
if (data.value.code === 200) {
localStorage.setItem('token', data.value.data.accessToken)
localStorage.setItem('refreshAfter', data.value.data.refreshAfter)
// if (phoneNumber.value === "18276151590") {
// localStorage.setItem('m', "shifenliangzai")
// }
window.location.href = '/'
}
}

View File

@ -69,7 +69,7 @@ function handleLogout() {
}
function toService() {
window.location.href = '/service' //
window.location.href = 'https://work.weixin.qq.com/kfid/kfc5c19b2b93a5e73b9' //
}
async function fetchUserInfo() {

View File

@ -1,90 +1,115 @@
<script setup>
const featureMap = {
G09SC02: {
name: '单人婚姻',
component: defineAsyncComponent(() => import('@/ui/CMarriage.vue')),
name: "单人婚姻",
component: defineAsyncComponent(() => import("@/ui/CMarriage.vue")),
},
G27BJ05: {
name: '借贷意向',
name: "借贷意向",
component: defineAsyncComponent(() =>
import('@/ui/CBankLoanApplication.vue')
import("@/ui/CBankLoanApplication.vue")
),
},
G28BJ05: {
name: '借贷行为',
name: "借贷行为",
component: defineAsyncComponent(() =>
import('@/ui/CBankLoanBehavior.vue')
import("@/ui/CBankLoanBehavior.vue")
),
},
G26BJ05: {
name: '特殊名单',
component: defineAsyncComponent(() =>
import('@/ui/CSpecialList.vue')
),
name: "特殊名单",
component: defineAsyncComponent(() => import("@/ui/CSpecialList.vue")),
},
G34BJ03: {
name: '个人不良',
component: defineAsyncComponent(() => import('@/ui/CBad.vue')),
name: "个人不良",
component: defineAsyncComponent(() => import("@/ui/CBad.vue")),
},
G35SC01: {
name: '个人诉讼',
component: defineAsyncComponent(() => import('@/ui/CLawsuit.vue')),
name: "个人诉讼",
component: defineAsyncComponent(() => import("@/ui/CLawsuit.vue")),
},
G05HZ01: {
name: '股东人企关系',
component: defineAsyncComponent(() => import('@/ui/CRelatedEnterprises.vue')),
name: "股东人企关系",
component: defineAsyncComponent(() =>
import("@/ui/CRelatedEnterprises.vue")
),
},
Q23SC01: {
name: '企业涉诉',
component: defineAsyncComponent(() => import('@/ui/CLawsuit.vue')),
name: "企业涉诉",
component: defineAsyncComponent(() => import("@/ui/CLawsuit.vue")),
},
G15BJ02: {
name: '手机三要素',
component: defineAsyncComponent(() => import('@/ui/CPhoneThreeElements.vue')),
name: "手机三要素",
component: defineAsyncComponent(() =>
import("@/ui/CPhoneThreeElements.vue")
),
},
KZEYS: {
name: '身份证二要素',
component: defineAsyncComponent(() => import('@/ui/CIDCardTwoElements.vue')),
name: "身份证二要素",
component: defineAsyncComponent(() =>
import("@/ui/CIDCardTwoElements.vue")
),
},
G17BJ02: {
name: '手机号二要素',
component: defineAsyncComponent(() => import('@/ui/CPhoneTwoElements.vue')),
name: "手机号二要素",
component: defineAsyncComponent(() =>
import("@/ui/CPhoneTwoElements.vue")
),
},
G10SC02: {
name: '双人婚姻核验',
component: defineAsyncComponent(() => import('@/ui/CDualMarriage.vue')),
name: "双人婚姻核验",
component: defineAsyncComponent(() => import("@/ui/CDualMarriage.vue")),
},
P_C_B332: {
name: '人车核验',
component: defineAsyncComponent(() => import('@/ui/CP_C_B332.vue')),
name: "人车核验",
component: defineAsyncComponent(() => import("@/ui/CP_C_B332.vue")),
},
FIN019: {
name: '银行卡黑名单',
component: defineAsyncComponent(() => import('@/ui/CFIN019.vue')),
name: "银行卡黑名单",
component: defineAsyncComponent(() => import("@/ui/CFIN019.vue")),
},
G20GZ01: {
name: '银行卡四要素核验',
component: defineAsyncComponent(() => import('@/ui/CG20GZ01.vue')),
name: "银行卡四要素核验",
component: defineAsyncComponent(() => import("@/ui/CG20GZ01.vue")),
},
G03HZ01: {
name: '手机号码风险',
component: defineAsyncComponent(() => import('@/ui/CG03HZ01.vue')),
name: "手机号码风险",
component: defineAsyncComponent(() => import("@/ui/CG03HZ01.vue")),
},
G19BJ02: {
name: '手机二次卡',
component: defineAsyncComponent(() => import('@/ui/CG19BJ02.vue')),
name: "手机二次卡",
component: defineAsyncComponent(() => import("@/ui/CG19BJ02.vue")),
},
G02BJ02: {
name: '手机在网时长',
component: defineAsyncComponent(() => import('@/ui/CG02BJ02.vue')),
name: "手机在网时长",
component: defineAsyncComponent(() => import("@/ui/CG02BJ02.vue")),
},
CAR061: {
name: '名下车辆',
component: defineAsyncComponent(() => import('@/ui/CCAR061.vue')),
}
name: "名下车辆",
component: defineAsyncComponent(() => import("@/ui/CAR061.vue")),
},
CAR074: {
name: "车辆出险信息",
component: defineAsyncComponent(() => import("@/ui/CAR074.vue")),
},
CAR058: {
name: "车辆维保记录",
component: defineAsyncComponent(() => import("@/ui/CAR058.vue")),
},
CAR079: {
name: "车架号查车",
component: defineAsyncComponent(() => import("@/ui/CAR079.vue")),
},
CAR066: {
name: "车辆过户次数",
component: defineAsyncComponent(() => import("@/ui/CAR066.vue")),
},
CAR100: {
name: "车辆估值",
component: defineAsyncComponent(() => import("@/ui/CAR100.vue")),
},
};
import LEmpty from "@/components/LEmpty.vue";
import LPendding from "@/components/LPendding.vue";
import LTitle from "@/components/LTitle.vue";
@ -93,14 +118,16 @@ const route = useRoute();
const productId = ref(null);
const isDone = ref(true);
const reportData = ref([])
const reportParams = ref({})
const reportName = ref("")
const reportDateTime = ref(null)
const reportData = ref([]);
const reportParams = ref({});
const reportName = ref("");
const reportDateTime = ref(null);
const orderId = ref(null);
const orderNo = ref("")
const isEmpty = ref(false)
const isPending = ref(false)
const orderNo = ref("");
const isEmpty = ref(false);
const isPending = ref(false);
const webviewEnv = localStorage.getItem('webview_env')
onMounted(() => {
const query = new URLSearchParams(window.location.search);
orderNo.value = query.get("out_trade_no");
@ -111,41 +138,38 @@ onMounted(() => {
}
if (!orderId.value && !orderNo.value) return;
getReport()
getReport();
});
const getReport = async () => {
let queryUrl = ""
let queryUrl = "";
if (orderNo.value) {
queryUrl = `/query/orderNo/${orderNo.value}`
queryUrl = `/query/orderNo/${orderNo.value}`;
} else if (orderId.value) {
queryUrl = `/query/orderId/${orderId.value}`
queryUrl = `/query/orderId/${orderId.value}`;
} else {
return
return;
}
const { data, error } = await useApiFetch(queryUrl)
.get()
.json()
const { data, error } = await useApiFetch(queryUrl).get().json();
if (data.value && !error.value) {
if (data.value.code === 200) {
if (data.value.data.product_name === '婚姻评估') {
reportData.value = data.value.data.query_data.reverse()
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;
}
productId.value = data.value.data.product_id;
reportParams.value = data.value.data.query_params
reportName.value = data.value.data.product_name
reportDateTime.value = data.value.data.create_time
reportParams.value = data.value.data.query_params;
reportName.value = data.value.data.product_name;
reportDateTime.value = data.value.data.create_time;
} else if (data.value.code === 200003) {
isEmpty.value = true
isEmpty.value = true;
} else if (data.value.code === 200002) {
isPending.value = true
isPending.value = true;
}
}
}
};
//
const maskValue = computed(() => {
return (type, value) => {
@ -153,36 +177,48 @@ const maskValue = computed(() => {
if (type === "name") {
//
if (value.length === 1) {
return "*"; // "*"
return "*"; // "*"
} else if (value.length === 2) {
return value[0] + "*"; // "*"
return value[0] + "*"; // "*"
} else {
return value[0] + "*".repeat(value.length - 2) + value[value.length - 1]; // "*"
return (
value[0] +
"*".repeat(value.length - 2) +
value[value.length - 1]
); // "*"
}
} else if (type === "id_card") {
// 64
return value.replace(/^(.{6})(?:\d+)(.{4})$/, "$1****$2");
} else if (type === 'mobile') {
} else if (type === "mobile") {
if (value.length === 11) {
return value.substring(0, 3) + "****" + value.substring(7);
}
return value; // 11
return value; // 11
} else if (type === "bank_card") {
// 64
return value.replace(/^(.{6})(?:\d+)(.{4})$/, "$1****$2");
} else if (type === "ent_name") {
// 33 "*"
if (value.length <= 6) {
return value[0] + "*".repeat(value.length - 1); // 6 *
return value[0] + "*".repeat(value.length - 1); // 6 *
} else {
return value.slice(0, 3) + "*".repeat(value.length - 6) + value.slice(-3); // 633
return (
value.slice(0, 3) +
"*".repeat(value.length - 6) +
value.slice(-3)
); // 633
}
} else if (type === "ent_code") {
// 44 "*"
if (value.length <= 8) {
return value.slice(0, 4) + "*".repeat(value.length - 4); // 84 *
return value.slice(0, 4) + "*".repeat(value.length - 4); // 84 *
} else {
return value.slice(0, 4) + "*".repeat(value.length - 8) + value.slice(-4); // 844
return (
value.slice(0, 4) +
"*".repeat(value.length - 8) +
value.slice(-4)
); // 844
}
} else if (type === "car_license") {
// 22 "*"
@ -190,19 +226,22 @@ const maskValue = computed(() => {
return value[0] + "*".repeat(value.length - 1); // 4
} else {
// 22 "*"
return value.slice(0, 2) + "*".repeat(value.length - 4) + value.slice(-2);
return (
value.slice(0, 2) +
"*".repeat(value.length - 4) +
value.slice(-2)
);
}
}
return value;
}
};
});
</script>
<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暂未上线建议将此网站加入收藏夹或书签或可以百度搜索全能查以及在微信全能查小程序复制链接打开" />
text="由于全能查APP暂未上线建议将此网站加入收藏夹或书签或可以百度搜索全能查以及在微信全能查小程序复制链接打开,更多功能敬请关注全能查公众号" v-if="!webviewEnv" />
<!-- <CTabs :tabs="sortedTabs" type="blue-green" /> -->
<template v-if="isDone">
<div class="flex flex-col gap-y-4 p-4">
@ -214,7 +253,9 @@ const maskValue = computed(() => {
<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>
<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>
@ -227,67 +268,115 @@ const maskValue = computed(() => {
<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>
<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>
{{
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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<span class="text-gray-600">{{
maskValue(
"ent_code",
reportParams?.ent_code
)
}}</span>
</div>
</div>
</template>
@ -297,7 +386,9 @@ const maskValue = computed(() => {
<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>
<div id="lawsuit" class="title">
{{ featureMap[item.apiID].name }}
</div>
<component :is="featureMap[item.apiID].component" :data="item.data" :params="reportParams">
</component>
</template>
@ -305,25 +396,27 @@ const maskValue = computed(() => {
<div>
<div class="text-bold text-blue-500 mb-2">报告说明</div>
<div>
&nbsp; &nbsp;本报告的数据由用户本人明确授权后我们才向相关合法存有用户个人数据的机构调取本报告相关内容本平台只做大数据的获取与分析仅向用户个人展示参考
&nbsp;
&nbsp;本报告的数据由用户本人明确授权后我们才向相关合法存有用户个人数据的机构调取本报告相关内容本平台只做大数据的获取与分析仅向用户个人展示参考
</div>
<p>
&nbsp; &nbsp; 报告有效期<strong class="text-red-500">30</strong>过期自动删除
&nbsp; &nbsp; 报告有效期<strong class="text-red-500">{{ webviewEnv ? '7' : '30'
}}</strong>过期自动删除
</p>
<p>
&nbsp; &nbsp;
若您的数据不全面可能是数据具有延迟性或者合作信息机构未获取到您的数据若数据有错误请联系客服
</p>
<p> &nbsp;
<p>
&nbsp;
&nbsp;本产品所有数据均来自第三方可能部分数据未公开数据更新延迟或信息受到限制贵司不对数据的准确性真实性完整性做任何承诺用户需根据实际情况结合报告内容自行判断与决策
</p>
</div>
</div>
</div>
</template>
</div>
<div class="disclaimer">
<div class="disclaimer" v-if="!webviewEnv">
<div class="flex flex-col items-center">
<div class="flex items-center">
<img class="w-4 h-4 mr-2" src="@/assets/images/public_security_record_icon.png" alt="公安备案" />
@ -335,9 +428,7 @@ const maskValue = computed(() => {
</a>
</div>
</div>
<div>
海南省学宇思网络科技有限公司版权所有
</div>
<div>海南省学宇思网络科技有限公司版权所有</div>
</div>
</template>

View File

@ -2,11 +2,11 @@
const router = useRouter();
function toInquire(name) {
if (name === 'Marriage') {
if (name === 'marriage') {
router.push(`/inquire/toc_Marriage`);
}
else {
router.push(`/list${name}`,);
router.push(`/list_${name}`,);
}
}
@ -27,7 +27,7 @@ function toHistory() {
<div class="grid grid-cols-2 gap-3">
<div
class="relative flex flex-col cursor-pointer rounded-bl-[35px] rounded-br-lg rounded-tl-[35px] rounded-tr-lg bg-white px-4 py-6 shadow-lg"
@click="toInquire('Risk')">
@click="toInquire('risk')">
<div class="min-h-18 gap-2 bg-white px-1">
<div class="mb-2 flex justify-around">
<img class="h-12 w-12 flex-shrink-0" src="@/assets/images/icon_3.png" />
@ -42,7 +42,7 @@ function toHistory() {
</div>
<div
class="relative flex flex-col cursor-pointer rounded-bl-lg rounded-br-[35px] rounded-tl-lg rounded-tr-[35px] bg-white px-4 py-6 shadow-lg"
@click="toInquire('Marriage')">
@click="toInquire('marriage')">
<div class="min-h-18 gap-2 bg-white px-1">
<div class="mb-2 flex justify-around">
<div class="mt-1 max-w-max flex-shrink-0 text-left text-lg text-gray-600 font-bold">
@ -57,7 +57,7 @@ function toHistory() {
</div>
<div
class="relative flex flex-col cursor-pointer rounded-bl-[35px] rounded-br-lg rounded-tl-[35px] rounded-tr-lg bg-white px-4 py-6 shadow-lg"
@click="toInquire('Lawsuit')">
@click="toInquire('lawsuit')">
<div class="min-h-18 gap-2 bg-white px-1">
<div class="mb-2 flex justify-around">
<img class="h-12 w-12 flex-shrink-0" src="@/assets/images/icon_2.png" />
@ -72,7 +72,7 @@ function toHistory() {
</div>
<div
class="relative flex flex-col cursor-pointer rounded-bl-lg rounded-br-[35px] rounded-tl-lg rounded-tr-[35px] bg-white px-4 py-6 shadow-lg"
@click="toInquire('Verify')">
@click="toInquire('verify')">
<div class="min-h-18 gap-2 bg-white px-1">
<div class="mb-2 flex justify-around">
<div class="mt-1 max-w-max flex-shrink-0 text-left text-lg text-gray-600 font-bold">

82
src/views/list_car.vue Normal file
View File

@ -0,0 +1,82 @@
<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/car_banner.png"
alt="查车辆"
class="w-full h-auto"
/>
</div>
<div class="p-6 -my-24 z-1000 absolute">
<!-- 功能菜单 -->
<div class="card">
<van-skeleton
:row="5"
:loading="availableMenuItems.length === 0"
>
<div class="grid grid-cols-3 gap-6">
<div
v-for="(item, index) in availableMenuItems"
: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>
</van-skeleton>
</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>
<van-skeleton
:row="3"
:loading="availableMenuItems.length === 0"
>
<ul
class="list-disc list-inside mt-4 space-y-2 text-gray-600"
>
<li
v-for="(item, index) in availableMenuItems"
:key="index"
>
<strong>{{ item.title }}</strong>
{{ item.description }}
</li>
</ul>
</van-skeleton>
</div>
</div>
</div>
</template>
<script setup>
import { onMounted } from "vue";
const router = useRouter();
const { fetchRenderData, availableMenuItems } = useMenuItems();
const toInquire = (product) => {
router.push("/inquire/" + product);
};
onMounted(() => {
fetchRenderData("car");
});
</script>
<style scoped></style>

View File

@ -0,0 +1,82 @@
<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/ent_banner.png"
alt="查企业"
class="w-full h-auto"
/>
</div>
<div class="p-6 -my-24 z-1000 absolute">
<!-- 功能菜单 -->
<div class="card">
<van-skeleton
:row="5"
:loading="availableMenuItems.length === 0"
>
<div class="grid grid-cols-3 gap-6">
<div
v-for="(item, index) in availableMenuItems"
: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>
</van-skeleton>
</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>
<van-skeleton
:row="3"
:loading="availableMenuItems.length === 0"
>
<ul
class="list-disc list-inside mt-4 space-y-2 text-gray-600"
>
<li
v-for="(item, index) in availableMenuItems"
:key="index"
>
<strong>{{ item.title }}</strong>
{{ item.description }}
</li>
</ul>
</van-skeleton>
</div>
</div>
</div>
</template>
<script setup>
import { onMounted } from "vue";
const router = useRouter();
const { fetchRenderData, availableMenuItems } = useMenuItems();
const toInquire = (product) => {
router.push("/inquire/" + product);
};
onMounted(() => {
fetchRenderData("enterprise");
});
</script>
<style scoped></style>

View File

@ -1,87 +1,77 @@
<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 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">
<van-skeleton :row="5" :loading="isFetching">
<div class="grid grid-cols-3 gap-6">
<div v-for="(item, index) in availableMenuItems" :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 class="flex flex-col items-center" @click="toMore">
<div class="bg-slate-100 rounded-full p-4">
<img src="@/assets/images/more.svg" alt="更多功能" class="w-10 h-10" />
</div>
<p class="mt-2 text-sm font-semibold">更多功能</p>
</div>
<p class="mt-2 text-sm font-semibold">{{ item.title }}</p>
</div>
</div>
</van-skeleton>
</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 class="card mt-4" v-if="availableMenuItems.length !== 0">
<h2 class="text-lg font-bold text-blue-500 mb-4">
核验工具服务
</h2>
<p class="text-gray-700 leading-6">
本平台提供全方位核验工具服务助您全面防范风险功能包括
</p>
<van-skeleton :row="3" :loading="isFetching">
<ul class="list-disc list-inside mt-4 space-y-2 text-gray-600">
<li v-for="(item, index) in availableMenuItems" :key="index">
<strong>{{ item.title }}</strong>
{{ item.description }}
</li>
</ul>
</van-skeleton>
</div>
</div>
</div>
<QrcodePop v-model:show="show"></QrcodePop>
</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" },
];
import { onMounted } from "vue";
const router = useRouter();
const { fetchRenderData, availableMenuItems, isFetching } = useMenuItems();
const toInquire = (product) => {
router.push('/inquire/' + product)
}
router.push("/inquire/" + product);
};
onMounted(() => {
fetchRenderData("verify");
});
const toMore = () => {
show.value = true;
// showConfirmDialog({
// title: "",
// message:
// "访: https://www.quannengcha.com ",
// })
// .then(() => { })
// .catch(() => { });
};
const show = ref(false)
</script>
<style scoped></style>
<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.quannengcha.com', // 本地接口地址
// changeOrigin: true,
// },
'/api/v1/chat': {
target: 'https://www.quannengcha.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: 5679, // 自定义端口号,可选
strictPort: true, // 如果端口被占用则抛出错误而不是使用下一个可用端口
proxy: {
"/api/v1": {
target: "https://www.quannengcha.com", // 本地接口地址
changeOrigin: true,
},
"/api/v1/chat": {
target: "https://www.quannengcha.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)),
},
},
},
})
});