temp
180
index.html
@ -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>
|
||||
|
@ -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()
|
||||
})
|
||||
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
BIN
src/assets/images/ai_qinggan.png
Normal file
After Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 155 KiB |
BIN
src/assets/images/car_banner.png
Normal file
After Width: | Height: | Size: 51 KiB |
BIN
src/assets/images/car_cheliangguohu.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/assets/images/car_cheliangguzhi.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
src/assets/images/car_cheliangshangxian.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/assets/images/car_chexian.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
src/assets/images/car_mingxiacheliang.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
src/assets/images/car_rencheheyan.png
Normal file
After Width: | Height: | Size: 941 B |
BIN
src/assets/images/car_vinchache.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/assets/images/car_vinchache2.png
Normal file
After Width: | Height: | Size: 1007 B |
BIN
src/assets/images/car_weibao.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
src/assets/images/car_xinnengyuan.png
Normal file
After Width: | Height: | Size: 991 B |
BIN
src/assets/images/ent_banner.png
Normal file
After Width: | Height: | Size: 269 KiB |
1
src/assets/images/more.svg
Normal 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 |
BIN
src/assets/images/qrcode_qnc.jpg
Normal file
After Width: | Height: | Size: 8.4 KiB |
1
src/assets/jweixin.js
Normal file
1
src/assets/webview.js
Normal file
2
src/auto-imports.d.ts
vendored
@ -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']
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
13
src/components/QrcodePop.vue
Normal 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>
|
@ -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);
|
||||
};
|
||||
|
||||
// 在组件挂载后检查环境
|
||||
|
@ -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}`,
|
||||
}
|
||||
}
|
||||
|
@ -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}`,
|
||||
|
212
src/composables/useMenuItems.js
Normal 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,
|
||||
};
|
||||
}
|
@ -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 {
|
||||
|
@ -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 进行跳转
|
||||
};
|
||||
|
||||
|
||||
|
@ -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(
|
||||
|
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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>
|
211
src/views/Ai.vue
@ -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>
|
||||
|
@ -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(() => {
|
||||
本报告的数据由用户本人明确授权后,我们才向相关合法存有用户个人数据的机构调取本报告相关内容,本平台只做大数据的获取与分析,仅向用户个人展示参考。
|
||||
</div>
|
||||
<p>
|
||||
报告有效期<strong class="text-red-500">30天</strong>,过期自动删除。
|
||||
报告有效期<strong class="text-red-500">{{ webviewEnv ? '7' : '30'
|
||||
}}天</strong>,过期自动删除。
|
||||
</p>
|
||||
<p>
|
||||
|
||||
@ -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="公安备案" />
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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`) // 2025年1月1日中午12点
|
||||
// const endDate = new Date('2025-01-02T12:00:00+08:00') // 2025年1月2日中午12点
|
||||
// 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>
|
||||
|
@ -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 = '/'
|
||||
}
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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") {
|
||||
// 身份证号脱敏(保留前6位和最后4位)
|
||||
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") {
|
||||
// 银行卡号脱敏(保留前6位和后4位)
|
||||
return value.replace(/^(.{6})(?:\d+)(.{4})$/, "$1****$2");
|
||||
} else if (type === "ent_name") {
|
||||
// 企业名称脱敏(保留前3个字符和后3个字符,中间部分用 "*" 替代)
|
||||
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); // 多于6个字符时保留前3和后3
|
||||
return (
|
||||
value.slice(0, 3) +
|
||||
"*".repeat(value.length - 6) +
|
||||
value.slice(-3)
|
||||
); // 多于6个字符时保留前3和后3
|
||||
}
|
||||
} else if (type === "ent_code") {
|
||||
// 企业代码脱敏(保留前4个字符和后4个字符,中间部分用 "*" 替代)
|
||||
if (value.length <= 8) {
|
||||
return value.slice(0, 4) + "*".repeat(value.length - 4); // 长度不超过8时,保留前4个字符,其他用 * 替代
|
||||
return value.slice(0, 4) + "*".repeat(value.length - 4); // 长度不超过8时,保留前4个字符,其他用 * 替代
|
||||
} else {
|
||||
return value.slice(0, 4) + "*".repeat(value.length - 8) + value.slice(-4); // 长度超过8时,保留前4个字符和后4个字符
|
||||
return (
|
||||
value.slice(0, 4) +
|
||||
"*".repeat(value.length - 8) +
|
||||
value.slice(-4)
|
||||
); // 长度超过8时,保留前4个字符和后4个字符
|
||||
}
|
||||
} else if (type === "car_license") {
|
||||
// 车牌号脱敏(保留前2个字符,后2个字符,其他部分用 "*" 替代)
|
||||
@ -190,19 +226,22 @@ const maskValue = computed(() => {
|
||||
return value[0] + "*".repeat(value.length - 1); // 如果车牌号长度小于等于4,只保留首字符
|
||||
} else {
|
||||
// 如果车牌号较长,保留前2个字符,后2个字符,其余部分用 "*" 替代
|
||||
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>
|
||||
本报告的数据由用户本人明确授权后,我们才向相关合法存有用户个人数据的机构调取本报告相关内容,本平台只做大数据的获取与分析,仅向用户个人展示参考。
|
||||
|
||||
本报告的数据由用户本人明确授权后,我们才向相关合法存有用户个人数据的机构调取本报告相关内容,本平台只做大数据的获取与分析,仅向用户个人展示参考。
|
||||
</div>
|
||||
<p>
|
||||
报告有效期<strong class="text-red-500">30天</strong>,过期自动删除。
|
||||
报告有效期<strong class="text-red-500">{{ webviewEnv ? '7' : '30'
|
||||
}}天</strong>,过期自动删除。
|
||||
</p>
|
||||
<p>
|
||||
|
||||
若您的数据不全面,可能是数据具有延迟性或者合作信息机构未获取到您的数据。若数据有错误请联系客服
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
|
||||
本产品所有数据均来自第三方。可能部分数据未公开、数据更新延迟或信息受到限制,贵司不对数据的准确性、真实性、完整性做任何承诺。用户需根据实际情况,结合报告内容自行判断与决策。
|
||||
</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>
|
||||
|
||||
|
@ -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
@ -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>
|
82
src/views/list_enterprise.vue
Normal 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>
|
@ -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>
|
||||
|
101
vite.config.js
@ -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)),
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
});
|
||||
|