first commit
30
.gitignore
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
.DS_Store
|
||||
dist
|
||||
dist-ssr
|
||||
coverage
|
||||
*.local
|
||||
|
||||
/cypress/videos/
|
||||
/cypress/screenshots/
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
||||
*.tsbuildinfo
|
3
.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"recommendations": ["Vue.volar"]
|
||||
}
|
29
README.md
Normal file
@ -0,0 +1,29 @@
|
||||
# qnc-website
|
||||
|
||||
This template should help get you started developing with Vue 3 in Vite.
|
||||
|
||||
## Recommended IDE Setup
|
||||
|
||||
[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
|
||||
|
||||
## Customize configuration
|
||||
|
||||
See [Vite Configuration Reference](https://vite.dev/config/).
|
||||
|
||||
## Project Setup
|
||||
|
||||
```sh
|
||||
pnpm install
|
||||
```
|
||||
|
||||
### Compile and Hot-Reload for Development
|
||||
|
||||
```sh
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
### Compile and Minify for Production
|
||||
|
||||
```sh
|
||||
pnpm build
|
||||
```
|
71
index.html
Normal file
@ -0,0 +1,71 @@
|
||||
<!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" />
|
||||
<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-text {
|
||||
font-size: 16px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
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>
|
8
jsconfig.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"paths": {
|
||||
"@/*": ["./src/*"]
|
||||
}
|
||||
},
|
||||
"exclude": ["node_modules", "dist"]
|
||||
}
|
37
package.json
Normal file
@ -0,0 +1,37 @@
|
||||
{
|
||||
"name": "qnc-website",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vueuse/core": "^11.3.0",
|
||||
"axios": "^1.7.7",
|
||||
"crypto-js": "^4.2.0",
|
||||
"echarts": "^5.5.1",
|
||||
"lodash": "^4.17.21",
|
||||
"nprogress": "^0.2.0",
|
||||
"pinia": "^2.2.6",
|
||||
"vant": "^4.9.9",
|
||||
"vue": "^3.5.12",
|
||||
"vue-echarts": "^7.0.3",
|
||||
"vue-router": "^4.4.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vant/auto-import-resolver": "^1.2.1",
|
||||
"@vitejs/plugin-vue": "^5.1.4",
|
||||
"@vitejs/plugin-vue-jsx": "^4.0.1",
|
||||
"autoprefixer": "^10.4.20",
|
||||
"postcss": "^8.4.49",
|
||||
"sass-embedded": "^1.81.0",
|
||||
"tailwindcss": "^3.4.15",
|
||||
"unplugin-auto-import": "^0.18.5",
|
||||
"unplugin-vue-components": "^0.27.5",
|
||||
"vite": "^5.4.10",
|
||||
"vite-plugin-vue-devtools": "^7.5.4"
|
||||
}
|
||||
}
|
3178
pnpm-lock.yaml
Normal file
6
postcss.config.js
Normal file
@ -0,0 +1,6 @@
|
||||
export default {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
};
|
BIN
public/image/app_1.jpg
Normal file
After Width: | Height: | Size: 74 KiB |
BIN
public/image/app_2.jpg
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
public/image/app_3.jpg
Normal file
After Width: | Height: | Size: 26 KiB |
44
src/App.vue
Normal file
@ -0,0 +1,44 @@
|
||||
<script setup>
|
||||
import { RouterLink, RouterView } from 'vue-router'
|
||||
import WechatOverlay from './components/WechatOverlay.vue';
|
||||
onMounted(() => {
|
||||
RefreshToken()
|
||||
})
|
||||
const RefreshToken = async () => {
|
||||
const token = localStorage.getItem("token")
|
||||
const refreshAfter = localStorage.getItem("refreshAfter")
|
||||
const currentTime = new Date().getTime();
|
||||
|
||||
// 1. 如果没有 token,直接返回
|
||||
if (!token) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. 如果有 refreshAfter,检查当前时间是否超过 refreshAfter(refreshAfter 是秒级,需要转换为毫秒级)
|
||||
if (refreshAfter) {
|
||||
const refreshAfterInMilliseconds = parseInt(refreshAfter) * 1000; // 转换为毫秒级
|
||||
if (currentTime < refreshAfterInMilliseconds) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 如果没有 refreshAfter 或者时间超过 refreshAfter,执行刷新 token 的请求
|
||||
const { data, error } = await useApiFetch("/user/getToken")
|
||||
.post()
|
||||
.json();
|
||||
|
||||
if (data.value && !error.value) {
|
||||
if (data.value !== 200) {
|
||||
localStorage.setItem("token", data.value.data.accessToken);
|
||||
localStorage.setItem("refreshAfter", data.value.data.refreshAfter);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<WechatOverlay />
|
||||
<RouterView />
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
24
src/assets/base.css
Normal file
@ -0,0 +1,24 @@
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
font-weight: normal;
|
||||
}
|
||||
html {
|
||||
margin: auto !important;
|
||||
@apply max-w-lg;
|
||||
}
|
||||
body {
|
||||
background-color: #f8f8f8;
|
||||
min-height: 100vh;
|
||||
transition: color 0.5s, background-color 0.5s;
|
||||
line-height: 1.6;
|
||||
font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
|
||||
Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue",
|
||||
sans-serif;
|
||||
font-size: 15px;
|
||||
text-rendering: optimizeLegibility;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
BIN
src/assets/images/ai_picture.webp
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
src/assets/images/banner.png
Normal file
After Width: | Height: | Size: 137 KiB |
BIN
src/assets/images/baogao-icon.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
src/assets/images/bg_2.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
src/assets/images/bg_icon.png
Normal file
After Width: | Height: | Size: 20 KiB |
75
src/assets/images/empty.svg
Normal file
@ -0,0 +1,75 @@
|
||||
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 1024 1024" height="1024px" width="1024px">
|
||||
<title>空空如也</title>
|
||||
<defs>
|
||||
<rect rx="22.1405405" height="1024" width="1024" y="0" x="0" id="path-1"></rect>
|
||||
<linearGradient id="linearGradient-3" y2="64.8840762%" x2="50%" y1="-33.7184979%" x1="115.913479%">
|
||||
<stop offset="0%" stop-color="#6CADFF"></stop>
|
||||
<stop offset="100%" stop-opacity="0" stop-color="#FFFFFF"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient-4" y2="100%" x2="70.4980572%" y1="-20.569195%" x1="10.5031837%">
|
||||
<stop offset="0%" stop-color="#6CADFF"></stop>
|
||||
<stop offset="100%" stop-opacity="0" stop-color="#FFFFFF"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient-5" y2="104.73608%" x2="38.801584%" y1="-97.78046%" x1="100.191761%">
|
||||
<stop offset="0%" stop-color="#6CADFF"></stop>
|
||||
<stop offset="100%" stop-color="#FFFFFF"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient-6" y2="100%" x2="50%" y1="-27.9013949%" x1="50%">
|
||||
<stop offset="0%" stop-color="#6CADFF"></stop>
|
||||
<stop offset="100%" stop-opacity="0" stop-color="#FFFFFF"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient-7" y2="100%" x2="50%" y1="-27.9013949%" x1="50%">
|
||||
<stop offset="0%" stop-color="#6CADFF"></stop>
|
||||
<stop offset="100%" stop-opacity="0" stop-color="#FFFFFF"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient-8" y2="100%" x2="50%" y1="-221.1569%" x1="50%">
|
||||
<stop offset="0%" stop-color="#D2D2D2"></stop>
|
||||
<stop offset="100%" stop-opacity="0" stop-color="#D2D2D2"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient-9" y2="53.7335012%" x2="73.0360423%" y1="48.1527472%" x1="67.5652976%">
|
||||
<stop offset="0%" stop-opacity="0" stop-color="#858585"></stop>
|
||||
<stop offset="100%" stop-opacity="0.5" stop-color="#616161"></stop>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<g fill-rule="evenodd" fill="none" stroke-width="1" stroke="none" id="空空如也">
|
||||
<g>
|
||||
<mask fill="white" id="mask-2">
|
||||
<use xlink:href="#path-1"></use>
|
||||
</mask>
|
||||
<g id="蒙版"></g>
|
||||
<g mask="url(#mask-2)" id="编组-3">
|
||||
<g transform="translate(0, 238.0108)">
|
||||
<g fill-rule="evenodd" fill="none" stroke-width="1" stroke="none" id="编组-2">
|
||||
<g fill-rule="nonzero" transform="translate(162.5599, 0)" id="编组">
|
||||
<polygon points="592.450826 498.100707 589.3555 489.432325 587.255101 479.632083 586.398359 469.500567 586.868185 459.341443 588.001295 452.660716 589.852963 446.421689 592.367915 440.541544 595.711972 435.158313 599.857498 430.520452 604.887401 426.517537 606.932527 428.091097 608.342006 430.133964 609.060564 432.508107 609.032927 435.075494 608.286732 439.989418 607.070711 451.308006 606.794343 463.813666 607.540538 469.25211 608.894743 472.371623 610.248947 473.448269 612.072979 473.393057 614.864299 471.791891 619.037461 467.319668 626.084854 456.884481 638.963619 434.136879 651.870021 411.527309 659.000324 400.705634 667.015006 390.325661 673.758394 383.451689 680.225413 378.42734 686.471338 374.921338 693.159452 372.491982 699.156645 371.470549 704.628738 371.691399 709.8521 373.126928 714.191083 375.639102 717.783871 379.283135 720.32646 383.755358 721.818849 389.331833 722.150491 396.343837 721.155565 403.328234 718.530066 411.610128 713.942351 421.493188 708.884811 429.471413 700.400302 443.19175 696.006046 451.031943 692.219799 458.706498 689.345568 466.270628 688.212458 472.09556 688.46119 475.601562 689.760121 477.920492 692.109252 479.438839 695.232214 479.714902 698.299903 479.052351 705.070927 476.540176 711.924862 473.393057 718.778797 470.383969 725.384001 468.258282 729.805894 467.595731 734.144877 467.8994 738.511497 469.224503 741.966102 471.377796 744.702148 474.055608 746.857821 477.368366 748.985858 483.000054 750.008421 489.349506 750.036057 495.864596 749.206952 502.158835 746.526179 511.40695 742.104286 520.737884 736.21764 529.406266 728.866242 537.16364 723.283601 541.608256 717.203498 545.25229 710.570657 548.123346 703.606175 550.000575 696.199503 550.745946 688.212458 550.359458 675.554788 548.09574 661.238907 544.396494 646.923027 539.537783 632.855878 533.464394 623.76336 528.688502 615.582857 523.526121 608.203822 517.977252 601.543344 511.683013 596.375256 505.140317 592.533736 498.349164" fill="url(#linearGradient-3)" id="路径"></polygon>
|
||||
<polygon points="39.9075893 440.458725 31.7823599 436.096928 23.6571305 430.216783 16.222822 423.287598 9.75580266 415.447406 4.58771456 406.834236 1.21602073 397.834578 0.0552736694 391.623157 0 385.411737 1.05019972 379.117498 3.59278851 378.896647 5.99719313 379.421167 8.12522941 380.635845 9.83871316 382.54068 12.6023966 386.654021 19.2905106 395.87453 27.4986505 405.315889 31.6994494 408.849497 34.7947749 410.257419 36.5082587 410.146993 37.8348267 408.877103 38.8297528 405.840409 38.9403001 399.711807 37.1439059 387.26136 31.3401706 361.863552 25.7022563 336.465744 23.7676779 323.601202 22.8003886 310.488203 23.242578 300.881206 24.6520566 292.820163 26.9459139 286.056616 30.2899709 279.789983 34.0762172 275.014091 38.2770161 271.508089 43.1134622 269.078734 48.0051819 268.0573 53.1179963 268.333363 57.9820792 269.934529 62.8185253 273.081649 67.7655187 278.050785 71.6899493 283.903324 75.3103746 291.798729 78.5162474 302.206309 80.1191838 311.509637 83.0210515 327.383267 85.0385404 336.134468 87.4153082 344.361149 90.3448127 351.870067 93.4125013 356.977234 95.9550901 359.378984 98.4700421 360.234779 101.206089 359.765472 103.748678 357.888243 105.572709 355.320856 108.916766 348.916191 111.873907 342.014613 114.913959 335.195853 118.368563 329.23289 121.215157 325.782101 124.642125 323.159501 128.78765 321.254665 132.794991 320.509295 136.636511 320.674933 140.450394 321.696366 145.81194 324.429391 150.841844 328.459913 155.236101 333.291018 158.856526 338.508611 162.670409 345.575827 166.788298 354.823942 170.381086 364.762215 173.448775 375.639102 175.604448 386.764446 176.5441 397.641334 176.378279 404.874188 175.41099 411.499703 173.697506 417.628304 171.04437 423.315205 167.396308 428.173916 162.642772 432.314863 157.032495 435.62762 150.344381 438.691921 142.440246 441.424946 130.058944 444.572066 116.2958 446.835784 102.173378 448.160887 87.9956817 448.547375 74.0390802 447.967642 61.3537731 446.504508 49.4422973 443.964727 40.1563208 440.707182" fill="url(#linearGradient-4)" id="路径"></polygon>
|
||||
<path fill="url(#linearGradient-5)" id="形状结合" d="M648.498327,284.510663 L644.71208,289.9215 L641.589118,295.939676 L639.350534,302.344341 L638.217424,308.914643 L638.355608,315.567765 L640.013818,322.165674 L642.224765,326.058164 L644.988449,328.92922 L647.94559,331.579426 L650.571089,334.505696 L652.284573,338.039304 L652.83731,343.588173 L651.648926,349.689168 L649.576163,355.458887 L646.619022,360.952544 L640.428371,370.780391 L633.408615,379.945687 L625.615028,388.53125 L630.092195,393.086292 L633.159883,398.524736 L634.735183,404.570518 L634.707546,410.947577 L633.215157,417.186603 L630.755479,423.066748 L627.411422,428.477585 L623.210623,433.336296 L620.115297,436.234959 L616.384325,438.25022 L612.459894,438.691921 L608.535464,438.25022 L595.960704,435.517195 L583.77286,431.624705 L571.944295,426.57275 L566.555112,423.729299 L561.608118,420.250904 L557.545504,416.027138 L554.864731,410.91997 L554.035626,406.723811 L554.25672,403.769935 L555.251646,401.699462 L557.877146,399.049256 L561.41466,396.895963 L562.685955,396.178199 L566.30638,393.886875 L569.180611,390.822574 L571.253374,386.129501 L572.524668,380.939514 L574.127604,370.55954 L575.150167,359.075314 L575.896362,352.781075 L577.444025,347.121781 L579.212782,343.864236 L581.783008,341.352061 L585.292886,339.557651 L592.533736,338.260154 L599.74695,336.935051 L604.389938,334.754152 L608.176185,331.827883 L611.243873,328.128637 L614.974846,321.696366 L618.180719,314.518725 L618.899277,312.751921 L622.630249,304.663271 L624.785922,300.908813 L627.273238,297.568449 L630.313289,294.86303 L634.292994,292.461281 L642.611681,288.430759 L646.28738,286.387892 L648.498327,284.510663 Z M619.009824,341.73855 L615.195941,346.514442 L606.158696,359.323771 L600.935334,367.854122 L595.463241,378.013245 L590.626795,388.807313 L586.702364,400.346752 L584.795423,408.269764 L583.717586,416.192776 L583.468855,424.115788 L595.325057,424.115788 L596.319983,416.109957 L599.912771,395.929742 L602.925186,383.313657 L607.153622,369.234437 L612.432257,355.238037 L619.009824,341.73855 Z"></path>
|
||||
<polygon points="125.250135 60.7614951 125.250135 60.7614951 124.559214 54.3016178 122.431178 48.4214731 119.059484 43.2314863 114.55468 38.9249014 109.165497 35.7777818 102.947209 33.9005525 96.4525532 33.5416704 90.3171759 34.7011355 84.6239879 37.21331 79.6769945 40.9677686 75.6972903 45.7712671 72.8783332 51.6238055 66.8258663 52.3415696 61.3537731 54.5500746 56.6278743 58.111289 52.9245385 62.9147875 50.658318 68.5464754 49.9673972 74.3990138 50.8517759 80.2515521 53.3114542 85.8004211 57.1529742 90.4934943 61.9894203 93.8890708 67.5444241 95.931938 73.569254 96.4564579 123.011551 96.4564579 127.626903 95.7663001 131.634244 94.1375276 135.171759 91.5149279 137.963079 88.1193514 139.78711 84.1992549 140.699126 79.6442132 140.367484 74.9787463 139.013279 70.8654057 136.664148 67.1661597 133.513549 64.1294653 129.727302 62.0037792" fill="url(#linearGradient-6)" id="路径"></polygon>
|
||||
<polygon points="329.569254 33.7073083 329.569254 33.5416704 329.127065 28.130833 327.911044 23.0788777 325.921192 18.3305919 321.665119 11.9259273 316.054842 6.65312145 311.715859 3.89249014 306.934686 1.84962298 301.656051 0.496913635 296.266868 0 291.071143 0.35888207 286.041239 1.49074091 278.993846 4.61025428 272.858469 9.22050857 269.376228 13.0301798 266.557271 17.3643709 264.318687 22.305901 259.205873 22.8856335 254.507611 24.2383429 250.196265 26.364029 246.299471 29.2074792 243.010688 32.6030557 240.302278 36.5783648 238.284789 40.9677686 237.096405 45.6608418 236.681853 50.7956161 237.234589 55.902784 238.588794 60.5682509 240.744467 64.8748357 243.591061 68.7673259 246.990392 72.0524771 250.970096 74.7855021 255.364353 76.7731567 260.062615 77.9878345 265.203066 78.3743228 326.612113 78.3743228 332.360574 77.6565587 337.501026 75.5860852 341.950556 72.3285403 345.488071 68.1047744 347.892475 63.1080317 348.997949 57.4211312 348.611033 51.6514118 346.842276 46.378606 343.885134 41.7683517 339.877793 37.9862868 335.041347 35.2808681 329.403433 33.8453398" fill="url(#linearGradient-7)" id="路径"></polygon>
|
||||
</g>
|
||||
<polygon points="1024 550.359458 999.596675 534.403009 973.839145 519.164324 946.672136 504.615797 918.040376 490.785034 889.159883 478.224161 859.118644 466.491478 827.833747 455.669804 795.305193 445.703925 762.693728 437.007936 729.114974 429.360987 694.541293 422.735472 658.917413 417.186603 623.348807 412.880018 587.034006 409.760505 549.945374 407.883276 512 407.193118 474.054626 407.883276 436.965994 409.760505 400.623556 412.880018 365.082587 417.186603 329.458707 422.735472 294.885026 429.360987 261.306272 437.007936 228.694807 445.703925 196.166253 455.669804 164.881356 466.491478 134.840117 478.224161 105.931987 490.785034 77.3278635 504.615797 50.160855 519.164324 24.4033251 534.403009 0 550.359458" fill-rule="nonzero" fill="url(#linearGradient-8)" id="路径"></polygon>
|
||||
</g>
|
||||
<polygon points="168.585366 389.215532 314.612039 389.215532 461.536985 469.266954 317.214646 465.594981" fill-rule="nonzero" fill="url(#linearGradient-9)" stroke="none" id="矩形"></polygon>
|
||||
<polygon points="481.155803 208.25638 479.722777 299.451613 688.569371 236.303345" fill-rule="nonzero" fill="#B8D6FF" stroke="none" id="路径"></polygon>
|
||||
<polygon points="314.788219 244.959395 481.155803 208.631248 481.155803 264.00952" fill-rule="nonzero" fill="#9CC6FF" stroke="none" id="路径"></polygon>
|
||||
<polygon points="314.788219 244.959395 511.147006 264.384388 511.147006 512.547202 314.788219 465.075243" fill-rule="nonzero" fill="#64ADFF" stroke="none" id="路径"></polygon>
|
||||
<polygon points="314.788219 244.959395 511.283486 263.617612 489.889892 383.428742 314.788219 346.994453" fill-rule="nonzero" fill="#429BFF" stroke="none" id="矩形"></polygon>
|
||||
<polygon points="511.147006 264.384388 688.569371 236.303345 688.569371 458.600245 511.147006 512.547202" opacity="0.99" fill-rule="nonzero" fill="#9CC5FF" stroke="none" id="路径"></polygon>
|
||||
<polygon points="511.283486 264.997809 671.897967 239.34913 688.569371 344.292902 535.025228 383.428742" fill-rule="nonzero" fill="#64ADFF" stroke="none" id="矩形"></polygon>
|
||||
<polygon points="314.788219 244.959395 267.566573 324.806343 465.801946 362.565804 511.147006 264.384388" fill-rule="nonzero" fill="#9CC6FF" stroke="none" id="路径"></polygon>
|
||||
<polygon points="511.147006 264.384388 566.898574 362.565804 745.583366 317.786082 688.569371 236.303345" opacity="0.99" fill-rule="nonzero" fill="#9DC6FF" stroke="none" id="路径"></polygon>
|
||||
<path stroke-dasharray="11.05477807439905,8.29108355579929" fill="none" stroke-width="5.52738904" stroke="#9DC6FF" id="路径-19" d="M583.139543,151.843183 C532.695151,184.875351 501.824507,214.257045 511.001904,232.450753 C523.475834,257.179661 544.659409,246.913618 547.874,236.537816 C551.088588,226.162013 542.242035,205.908265 523.475834,216.933951 C504.709635,227.959637 484.261479,247.732311 479.722777,267.098145"></path>
|
||||
<g transform="translate(555.0939, 41.4059)" fill-rule="evenodd" fill="none" stroke-width="1" stroke="none" id="飞机">
|
||||
<polygon points="163.057977 9.09494702e-13 0 30.854292 41.4554178 58.3378535" fill-rule="nonzero" fill="#9DC6FF" id="路径-16备份"></polygon>
|
||||
<polygon points="163.057977 0 41.4554178 58.3378535 41.4554178 104.894966" fill-rule="nonzero" fill="#64ADFF" id="路径-16备份-2"></polygon>
|
||||
<polygon points="163.057977 0 41.4554178 58.3378535 65.4910753 84.1769753" fill-rule="nonzero" fill="#429BFF" id="路径-16备份-2"></polygon>
|
||||
<polygon points="163.057977 0 58.9237102 70.0692202 108.951745 102.134572" fill-rule="nonzero" fill="#9DC6FF" id="路径-16备份"></polygon>
|
||||
<line stroke-linecap="round" stroke-width="2.76369452" stroke="#429BFF" id="路径-16" y2="32.1173295" x2="0.501635492" y1="58.3378535" x1="41.4554178"></line>
|
||||
<line stroke-linecap="round" stroke-width="2.76369452" stroke="#429BFF" id="路径-17" y2="101.744072" x2="107.648858" y1="71.0666294" x1="59.7211085"></line>
|
||||
<line stroke-linecap="round" stroke-width="2.76369452" stroke="#429BFF" id="路径-18" y2="103.502333" x2="41.4554178" y1="58.3378535" x1="41.4554178"></line>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 15 KiB |
BIN
src/assets/images/fxpg_banner.png
Normal file
After Width: | Height: | Size: 78 KiB |
1
src/assets/images/gdrqgx_icon.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="1733324501181" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6340" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M339.162366 1023.729653c-95.973119 0-127.972351-435.012601-127.97235-518.254842 0-63.900156 121.557758-115.167743 121.557758-115.167743h127.972351s6.390016 51.193856 31.950078 63.900156C466.962679 479.865595 441.476347 742.224889 460.670971 799.759606a214.974871 214.974871 0 0 0 51.193856 95.973119 227.681171 227.681171 0 0 0 63.900156-95.973119c6.414593-51.193856 0-307.212288-25.58464-345.503228a90.394144 90.394144 0 0 0 25.58464-63.900156h127.97235s115.143166 44.80384 108.753151 115.167743c0 76.778495-44.80384 505.450234-140.776959 518.254842z m511.864827-204.750846c12.780031-51.193856 19.170047-319.918589-19.194624-390.307068s-147.166975-89.558526-147.166974-102.363135c0-6.390016 25.584639-12.780031 44.80384-12.780031h211.140861a84.692284 84.692284 0 0 1 83.193088 83.168511l-25.682947 351.893244c-6.414593 51.193856-44.779263 70.38848-102.387712 70.388479z m-729.395704 0c-57.583871 0-89.583103-19.194624-102.363134-70.388479L0 396.697084a84.692284 84.692284 0 0 1 83.168511-83.168511h204.750846c19.170047 0 44.80384 0 44.80384 12.780031s-108.777727 31.950078-147.166975 102.363135-31.950078 339.162366-19.194624 390.307068z m230.261755-652.617209A169.384567 169.384567 0 0 1 518.254842 0a169.581183 169.581183 0 0 1 0 339.162366 170.785455 170.785455 0 0 1-166.361598-172.800768z m377.50246 12.780032a101.060554 101.060554 0 0 1 102.363134-102.363135 95.850234 95.850234 0 0 1 102.363135 95.973119 101.060554 101.060554 0 0 1-102.363135 102.363135 99.635089 99.635089 0 0 1-102.363134-95.973119z m-639.812601 0A101.060554 101.060554 0 0 1 191.946238 76.778495a99.659666 99.659666 0 0 1 102.363134 95.973119 101.060554 101.060554 0 0 1-102.363134 102.363135 95.850234 95.850234 0 0 1-102.363135-95.973119z" fill="#4B64FA" p-id="6341"></path></svg>
|
After Width: | Height: | Size: 2.0 KiB |
1
src/assets/images/grbl_icon.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="1733326573199" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9341" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M390.063158 950.649263a104.286316 104.286316 0 0 0-10.644211 50.149053H26.947368v-150.042948c0-220.779789 177.259789-400.410947 395.290948-400.410947 68.985263 0 133.820632 18.081684 190.383158 49.744842l-222.558316 450.56z m32.175158-550.346105c-109.029053 0-197.658947-89.869474-197.658948-200.218947C224.579368 89.788632 313.236211 0 422.265263 0s197.632 89.734737 197.632 200.218947c0 110.322526-88.656842 200.084211-197.632 200.084211z m571.930947 583.895579c8.973474 18.270316-4.149895 39.801263-24.306526 39.801263H480.741053c-20.156632 0-33.306947-21.530947-24.306527-39.801263l244.601263-495.400421a27.028211 27.028211 0 0 1 48.613053 0l244.493474 495.400421z m-296.016842-42.738526h54.298947v-55.080422h-54.298947v55.080422z m0-110.133895h54.298947v-137.620211h-54.298947v137.620211z" fill="#4B64FA" p-id="9342"></path></svg>
|
After Width: | Height: | Size: 1.1 KiB |
1
src/assets/images/grss_icon.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="1733326791000" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="28866" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M425.3 245.5c80.1 0 126.4 50.8 126.4 147.4 0 55.2-19 102.2-47.9 132.4-9.1 15.2-13.9 37.5-13.9 47.4 0 5.9 4.6 13.7 13 21.9-20.1 9.4-32.7 29-32.5 50.5v22.8c0 24.7 16 45.4 38.5 52.9-8.7 19.1-6.1 41.1 6.7 57.9h-339c-12.7 0-23-10.1-23-24 0-30.9 4.6-51.4 13.7-61.4 22.5-24.7 70.7-46.4 118.3-62.9 47.6-16.4 74.5-42.8 74.5-57.6 0-10.2-5-33.6-14.6-48.8-28.2-30.2-46.6-76.7-46.6-131 0.1-96.8 46.4-147.5 126.4-147.5z m241 266.7l66.9 68.4-9.8 8.6 15.4 16.6-10.3 9 128.3 125.3c6.6 6.3 22.4 21.6 7.1 33.8-15.4 12.2-29.4-4.9-36-11.2l-125.6-124-12.2 10.8-15.4-16.6-8.9 7.6-66.4-68.4 66.9-59.9z m50.8 205.9c7.9 0 14.5 6.3 14.5 14l0.5 3.6c11.7 0 21 9 21 20.2v18h-201v-18c0-11.2 9.3-20.2 21-20.2h1.4v-3.6c0-7.7 6.6-14 14.5-14h128.1zM593.3 578.4l65.5 67.5c6.6 6.7 6.6 18-1 24.3l-10.3 9c-7 6.3-18.7 5.8-25.2-1l-65.5-67.5c-6.6-6.7-6.6-18 1-24.3l10.3-9c7-6.2 18.7-6.2 25.2 1z m116.5-104l65.5 67.5c6.6 6.7 6.6 18-1 24.3l-10.3 9c-7 6.3-18.7 6.3-25.2-0.9l-65.5-67.4c-6.6-6.7-6.6-18 1-24.3l10.3-9c6.9-6.4 18.1-5.9 25.2 0.8z" fill="#4B64FA" p-id="28867"></path></svg>
|
After Width: | Height: | Size: 1.3 KiB |
BIN
src/assets/images/hygj_banner.png
Normal file
After Width: | Height: | Size: 87 KiB |
BIN
src/assets/images/icon_1.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
src/assets/images/icon_2.png
Normal file
After Width: | Height: | Size: 6.4 KiB |
BIN
src/assets/images/icon_3.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
src/assets/images/icon_4.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
src/assets/images/index_icon_1.png
Normal file
After Width: | Height: | Size: 114 KiB |
BIN
src/assets/images/index_icon_2.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
src/assets/images/index_icon_2_2.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
src/assets/images/index_icon_3.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
src/assets/images/index_icon_4.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
src/assets/images/index_icon_4_1.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
src/assets/images/index_icon_5.png
Normal file
After Width: | Height: | Size: 9.5 KiB |
BIN
src/assets/images/index_icon_6.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
src/assets/images/index_icon_7.png
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
src/assets/images/inquire_banner.png
Normal file
After Width: | Height: | Size: 173 KiB |
BIN
src/assets/images/inquire_banner_2.png
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
src/assets/images/liu.png
Normal file
After Width: | Height: | Size: 72 KiB |
BIN
src/assets/images/llqdk.jpg
Normal file
After Width: | Height: | Size: 63 KiB |
BIN
src/assets/images/login_bg.png
Normal file
After Width: | Height: | Size: 507 KiB |
BIN
src/assets/images/logo.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
src/assets/images/logo_title.png
Normal file
After Width: | Height: | Size: 16 KiB |
1
src/assets/images/mxcl_icon.svg
Normal file
After Width: | Height: | Size: 6.3 KiB |
87
src/assets/images/pendding.svg
Normal file
@ -0,0 +1,87 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 1024 1024" height="1024" width="1024">
|
||||
<g clip-path="url(#clip0_1513_110780)">
|
||||
<ellipse fill="url(#paint0_linear_1513_110780)" ry="127.5" rx="467" cy="762.5" cx="506"></ellipse>
|
||||
<path fill="url(#paint1_linear_1513_110780)" d="M230.457 615.502C230.457 615.502 230.233 614.922 229.928 615.542C227.184 621.122 202.334 681.566 200.362 728.218C200.362 728.218 196.215 755.02 230.965 754.665C259.973 754.37 259.2 729.662 259.099 721.337C258.702 687.573 230.457 615.502 230.457 615.502Z"></path>
|
||||
<path fill="url(#paint2_linear_1513_110780)" d="M229.664 784.343C229.105 784.343 228.647 783.886 228.647 783.327V631.754C228.647 631.195 229.105 630.737 229.664 630.737C230.223 630.737 230.68 631.195 230.68 631.754V783.327C230.68 783.896 230.223 784.343 229.664 784.343Z"></path>
|
||||
<path fill="url(#paint3_linear_1513_110780)" d="M869.35 810.661C876.541 808.4 883.517 805.446 889.874 797.176C891.178 795.482 892.404 793.311 891.689 791.283C891.151 789.757 889.594 788.778 888.013 788.529C887.424 788.442 886.827 788.426 886.234 788.48H886.228C885.316 788.574 884.415 788.754 883.536 789.015L883.285 789.089C879.09 790.299 875.093 792.13 871.425 794.524C871.093 794.738 870.698 794.833 870.306 794.792C869.914 794.75 869.548 794.576 869.266 794.296C868.984 794.017 868.804 793.649 868.754 793.252C868.704 792.855 868.789 792.453 868.993 792.111C869.367 791.491 869.803 790.911 870.292 790.38C871.015 789.613 871.807 788.916 872.657 788.299C873.788 787.462 874.994 786.715 876.174 785.951C880.562 783.116 884.719 779.929 888.605 776.42C891.378 773.913 894.091 771.131 895.409 767.607C896.015 765.986 896.291 764.117 895.568 762.547C894.376 759.968 890.999 759.245 888.237 759.78C883.398 760.721 879.532 764.32 876.104 767.908C873.261 770.889 870.075 774.189 865.99 774.372C865.294 774.439 864.594 774.296 863.977 773.963C862.812 773.247 862.512 771.588 862.927 770.271C863.343 768.953 864.304 767.901 865.231 766.89C870.623 761.021 875.928 754.916 879.429 747.725C882.93 740.534 884.481 732.044 882.048 724.409C881.335 722.177 880.263 720.005 878.591 718.383C876.919 716.762 874.575 715.745 872.28 716.056C869.153 716.473 866.798 719.15 865.213 721.915C859.768 731.401 860.101 743.025 858.567 753.891C858.138 756.933 857.514 760.053 855.728 762.557C855.563 762.798 855.35 763 855.101 763.15C853.632 764.013 852.313 762.272 851.761 760.795C849.583 754.95 849.038 748.265 845.139 743.427C843.65 741.585 841.544 740.046 839.197 740.061C836.331 740.081 833.877 742.51 833.04 745.292C832.204 748.074 832.705 751.096 833.601 753.858C835.264 758.98 838.245 763.582 841.759 767.627C843.61 769.763 845.705 771.92 846.261 774.706C846.431 775.653 846.36 776.628 846.054 777.539C845.748 778.45 845.218 779.267 844.513 779.912C844.184 780.202 843.801 780.423 843.386 780.561C842.971 780.699 842.533 780.75 842.098 780.713C841.157 780.626 840.306 780.139 839.484 779.666C839.139 779.467 838.794 779.265 838.447 779.067C837.077 778.276 835.707 777.483 834.336 776.69C830.851 774.674 826.646 772.614 823.018 774.35C821.167 775.238 819.954 776.983 819.383 778.986C818.872 780.804 818.872 782.73 819.383 784.548C820.464 788.328 827.276 798.848 830.086 801.561C833.368 804.729 844.748 818.398 869.35 810.661Z"></path>
|
||||
<path fill="url(#paint4_linear_1513_110780)" d="M649.638 740.684C650.38 738.632 650.88 736.312 651.021 733.581C651.097 732.138 650.946 730.46 649.772 729.604C648.888 728.959 647.648 729.008 646.674 729.474C646.314 729.65 645.975 729.869 645.667 730.126L645.663 730.129C645.193 730.529 644.761 730.974 644.373 731.455L644.261 731.592C642.394 733.869 640.875 736.417 639.754 739.152C639.651 739.399 639.468 739.602 639.235 739.729C639.001 739.856 638.73 739.899 638.467 739.851C638.203 739.802 637.962 739.666 637.782 739.464C637.603 739.262 637.495 739.006 637.478 738.737C637.448 738.249 637.468 737.759 637.537 737.276C637.644 736.573 637.817 735.882 638.053 735.213C638.302 734.488 638.6 733.776 638.897 733.067C638.968 732.898 639.038 732.73 639.108 732.561C640.46 729.305 641.548 725.941 642.363 722.501C642.944 720.045 643.385 717.458 642.767 714.99C642.483 713.856 641.92 712.709 640.917 712.11C639.267 711.129 637.113 712.017 635.783 713.37C633.455 715.744 632.686 719.226 632.155 722.535C631.718 725.282 631.212 728.339 629.013 730.001C628.651 730.304 628.208 730.492 627.737 730.543C626.815 730.589 626.013 729.779 625.739 728.886C625.465 727.994 625.596 727.04 625.724 726.122C626.471 720.792 627.08 715.364 626.27 710.019C625.46 704.675 623.069 699.352 618.792 696.028C617.541 695.056 616.113 694.256 614.563 693.991C613.012 693.727 611.32 694.056 610.164 695.106C608.586 696.534 608.303 698.925 608.482 701.071C608.942 706.634 611.7 711.617 614.449 716.583C615.34 718.193 616.23 719.801 617.041 721.426C617.968 723.285 618.816 725.262 618.783 727.34C618.784 727.537 618.743 727.731 618.662 727.909C618.177 728.952 616.777 728.486 615.904 727.874C614.781 727.084 613.72 726.179 612.661 725.276C610.467 723.405 608.281 721.54 605.57 720.728C604.037 720.27 602.277 720.217 600.979 721.122C599.394 722.229 598.961 724.52 599.562 726.389C600.163 728.259 601.599 729.751 603.155 730.948C606.042 733.166 609.462 734.591 612.964 735.502C613.144 735.549 613.325 735.595 613.507 735.641C615.193 736.072 616.935 736.516 618.178 737.726C618.635 738.189 618.969 738.759 619.148 739.384C619.328 740.008 619.346 740.666 619.201 741.294C619.13 741.582 619.001 741.852 618.824 742.087C618.646 742.322 618.422 742.518 618.166 742.664C617.61 742.975 616.95 743.029 616.312 743.079C616.226 743.086 616.14 743.092 616.053 743.099C615.871 743.113 615.689 743.126 615.507 743.142C614.442 743.224 613.378 743.306 612.312 743.388C609.603 743.596 606.477 744.055 605.127 746.409C604.438 747.611 604.433 749.047 604.883 750.381C605.296 751.589 606.034 752.662 607.014 753.48C608.305 754.547 611.561 756.243 614.443 757.461C618.506 760.98 630.194 760.946 644.502 760.905C646.078 760.9 647.685 760.896 649.318 760.896C650.95 760.896 652.558 760.9 654.133 760.905C671.968 760.956 685.732 760.996 685.732 754.158C685.732 746.756 669.602 740.748 649.638 740.684Z" clip-rule="evenodd" fill-rule="evenodd"></path>
|
||||
<path fill="#E0EFFB" d="M398.378 606.003C398.378 552.319 432.932 506.743 480.916 490.497C432.932 474.257 398.378 428.681 398.378 374.997V340.028H370.877C361.556 340.028 354 332.438 354 323.074V320.955C354 311.591 361.556 304 370.877 304H668.935C678.256 304 685.812 311.591 685.812 320.954V323.074C685.812 332.438 678.256 340.028 668.935 340.028H640.982V374.997C640.982 428.681 606.427 474.257 558.444 490.503C606.427 506.743 640.982 552.319 640.982 606.003V640.972H669.123C678.444 640.972 686 648.562 686 657.926V660.045C686 669.409 678.444 677 669.123 677H371.065C361.744 677 354.189 669.409 354.189 660.046V657.926C354.189 648.562 361.744 640.972 371.065 640.972H398.378V606.003Z"></path>
|
||||
<path fill="#81C2FA" d="M613 637C613 673.451 565.362 656 514 656C462.638 656 427 673.451 427 637C427 600.549 467.638 557 519 557C570.362 557 613 600.549 613 637Z"></path>
|
||||
<path fill="url(#paint5_linear_1513_110780)" d="M668.668 304C678.011 304 685.585 311.591 685.585 320.954V323.074C685.585 332.438 678.011 340.028 668.668 340.028H369.916C360.574 340.028 353 332.438 353 323.074V320.955C353 311.591 360.574 304 369.916 304H668.668V304ZM669.084 640.972C678.426 640.972 686 648.562 686 657.926V660.045C686 669.409 678.426 677 669.084 677H370.331C360.989 677 353.415 669.409 353.415 660.046V657.926C353.415 648.562 360.989 640.972 370.331 640.972H669.084V640.972Z"></path>
|
||||
<ellipse fill-opacity="0.1" fill="#7D7D7D" ry="15.5" rx="56.5" cy="744.5" cx="380.5"></ellipse>
|
||||
<path fill="url(#paint6_linear_1513_110780)" d="M388.138 590.092H362.863V615.366H388.138V590.092Z"></path>
|
||||
<path fill="#FEE0BC" d="M402.423 582.636C404.608 583.518 407.573 581.276 409.047 577.628C410.521 573.98 409.946 570.307 407.761 569.424C405.577 568.542 402.611 570.784 401.137 574.432C399.663 578.08 400.239 581.753 402.423 582.636Z"></path>
|
||||
<path fill="#FEE0BC" d="M348.175 582.595C346.006 583.516 343.001 581.326 341.464 577.704C339.926 574.082 340.438 570.4 342.607 569.479C344.776 568.559 347.78 570.749 349.318 574.37C350.855 577.992 350.343 581.675 348.175 582.595Z"></path>
|
||||
<path fill="url(#paint7_linear_1513_110780)" d="M376.181 600.131C392.089 600.131 404.984 587.403 404.984 571.702C404.984 556.001 392.089 543.272 376.181 543.272C360.274 543.272 347.378 556.001 347.378 571.702C347.378 587.403 360.274 600.131 376.181 600.131Z"></path>
|
||||
<path fill="url(#paint8_linear_1513_110780)" d="M404.119 573.743C414.43 559.996 409.275 525.629 374.907 525.629C340.54 525.629 333.667 561.714 347.414 573.743C352.568 558.278 398.964 558.278 404.119 573.743Z"></path>
|
||||
<path fill="#585449" d="M410.191 557.658C409.554 572.537 393.77 555.533 374.3 555.533C354.829 555.533 337.984 574.237 338.408 555.533C338.408 535.812 355.466 521.95 374.937 521.95C394.407 521.95 411.034 537.955 410.191 557.658Z"></path>
|
||||
<path fill="#747169" d="M408.724 562.119C408.724 565.75 393.233 564.876 374.123 564.876C355.013 564.876 339.521 565.75 339.521 562.119C339.521 558.487 355.013 552.998 374.123 552.998C393.233 552.998 408.724 558.487 408.724 562.119Z"></path>
|
||||
<path fill="url(#paint9_linear_1513_110780)" d="M386.491 606.175C387.05 605.65 387.608 605.068 388.164 604.428L388.174 604.432C388.384 604.433 388.64 604.475 389.128 604.824C391.595 605.916 393.875 607.539 395.959 609.51C419.437 620.293 448.133 651.929 449.682 659.957C451.485 669.295 447.834 674.286 444.137 676.077C442.286 676.974 429.317 681.461 415.201 685.27C416.83 704.65 418.718 723.386 420.606 728.15C421.865 731.327 412.177 732.54 398.561 732.695C371.08 735.371 324.372 734.768 326.993 728.154C328.875 723.404 330.757 704.767 332.382 685.448C320.048 682.577 309.039 679.178 307.296 678.307C303.692 676.505 296.482 669.295 298.285 658.481C299.675 650.138 334.524 615.04 357.975 605.055C358.455 604.827 358.941 604.619 359.435 604.432L359.454 604.453C359.491 604.439 359.528 604.425 359.564 604.411C359.567 604.426 359.57 604.441 359.572 604.455C361.418 603.115 362.636 602.608 362.931 602.608C365.835 606.378 371.949 611.363 378.778 610.25C381.883 609.361 384.592 607.826 386.491 606.175ZM334.655 656.861C334.874 654.069 335.081 651.452 335.276 649.074C332.93 650.984 330.236 652.93 327.122 654.877C329.488 655.215 332.023 655.912 334.655 656.861ZM413.042 658.12C412.851 655.675 412.669 653.353 412.495 651.194C414.72 652.904 417.239 654.639 420.105 656.375C417.878 656.683 415.505 657.292 413.042 658.12Z" clip-rule="evenodd" fill-rule="evenodd"></path>
|
||||
<path fill="#FB955B" d="M391.434 605.947C391.434 605.947 389.643 604.093 387.853 604.093C378.206 614.08 367.28 607.14 362.782 602.24C362.613 602.048 360.991 602.238 359.2 604.093C374.959 618.925 387.256 611.509 391.434 605.947Z"></path>
|
||||
<path fill="#FEE4C3" d="M334.332 746.796L331.538 734.637L317.4 737.47L319.526 748.074L334.332 746.796Z"></path>
|
||||
<path fill="#7B7B7B" d="M321.766 736.133C318.964 740.512 320.757 746.368 322.003 748.748C318.467 752.42 303.692 755.992 303.692 746.802C303.691 737.784 312.722 734.501 321.766 736.133Z"></path>
|
||||
<path fill="#FEE4C3" d="M415.233 746.796L418.027 734.637L432.165 737.47L430.04 748.074L415.233 746.796Z"></path>
|
||||
<path fill="#7B7B7B" d="M427.798 736.133C430.6 740.512 428.808 746.368 427.561 748.748C431.097 752.42 445.872 755.992 445.873 746.802C445.873 737.784 436.842 734.501 427.798 736.133Z"></path>
|
||||
<path fill="#DCDCDC" d="M426.623 696.181C426.623 696.181 446.29 692.531 452.543 706.678C457.11 723.22 440.502 727.377 440.502 727.377L427.51 729.924L421.852 749.064L375.903 740.046L329.917 749.064L324.251 729.908L311.397 727.387C311.397 727.387 293 720.449 299.37 706.697C307.428 689.3 325.262 696.204 325.262 696.204L375.881 710.561L426.623 696.181Z"></path>
|
||||
<path fill="url(#paint10_linear_1513_110780)" d="M330.263 637.979C330.263 637.426 330.71 636.979 331.263 636.979H415.708C416.26 636.979 416.708 637.426 416.708 637.979V698.15H330.263V637.979Z"></path>
|
||||
<rect fill="url(#paint11_linear_1513_110780)" rx="2" height="5.49441" width="94.1376" y="698.149" x="326.967"></rect>
|
||||
<path fill="url(#paint12_linear_1513_110780)" d="M774.5 291.455C776.513 291.455 778.444 292.254 779.868 293.678C781.291 295.101 782.091 297.032 782.091 299.045V329.409C782.091 331.422 781.291 333.353 779.868 334.777C778.444 336.2 776.513 337 774.5 337C772.487 337 770.556 336.2 769.132 334.777C767.709 333.353 766.909 331.422 766.909 329.409V299.045C766.909 297.032 767.709 295.101 769.132 293.678C770.556 292.254 772.487 291.455 774.5 291.455V291.455ZM747.659 280.341C749.082 281.765 749.881 283.695 749.881 285.708C749.881 287.721 749.082 289.651 747.659 291.075L726.191 312.542C725.491 313.267 724.654 313.845 723.727 314.243C722.801 314.641 721.805 314.85 720.797 314.859C719.789 314.868 718.79 314.676 717.857 314.294C716.924 313.913 716.077 313.349 715.364 312.636C714.651 311.923 714.087 311.076 713.706 310.143C713.324 309.21 713.132 308.211 713.141 307.203C713.15 306.195 713.359 305.199 713.757 304.273C714.155 303.346 714.733 302.509 715.458 301.809L736.925 280.341C738.349 278.918 740.279 278.119 742.292 278.119C744.305 278.119 746.235 278.918 747.659 280.341V280.341ZM812.075 280.341L833.542 301.809C834.925 303.24 835.69 305.158 835.673 307.148C835.655 309.138 834.857 311.042 833.45 312.45C832.042 313.857 830.138 314.655 828.148 314.673C826.158 314.69 824.24 313.925 822.809 312.542L801.341 291.075C799.959 289.643 799.194 287.726 799.211 285.736C799.228 283.745 800.027 281.841 801.434 280.434C802.841 279.027 804.745 278.228 806.736 278.211C808.726 278.194 810.643 278.959 812.075 280.341ZM728.955 245.909C730.968 245.909 732.899 246.709 734.322 248.132C735.746 249.556 736.545 251.487 736.545 253.5C736.545 255.513 735.746 257.444 734.322 258.868C732.899 260.291 730.968 261.091 728.955 261.091H698.591C696.578 261.091 694.647 260.291 693.223 258.868C691.8 257.444 691 255.513 691 253.5C691 251.487 691.8 249.556 693.223 248.132C694.647 246.709 696.578 245.909 698.591 245.909H728.955ZM850.409 245.909C852.422 245.909 854.353 246.709 855.777 248.132C857.2 249.556 858 251.487 858 253.5C858 255.513 857.2 257.444 855.777 258.868C854.353 260.291 852.422 261.091 850.409 261.091H820.045C818.032 261.091 816.101 260.291 814.678 258.868C813.254 257.444 812.455 255.513 812.455 253.5C812.455 251.487 813.254 249.556 814.678 248.132C816.101 246.709 818.032 245.909 820.045 245.909H850.409ZM833.542 194.458C834.965 195.881 835.765 197.812 835.765 199.825C835.765 201.838 834.965 203.768 833.542 205.191L812.075 226.659C810.643 228.041 808.726 228.806 806.736 228.789C804.745 228.772 802.841 227.973 801.434 226.566C800.027 225.159 799.228 223.255 799.211 221.264C799.194 219.274 799.959 217.357 801.341 215.925L822.809 194.458C824.232 193.035 826.162 192.235 828.175 192.235C830.188 192.235 832.119 193.035 833.542 194.458V194.458ZM726.191 194.458L747.659 215.925C748.384 216.625 748.962 217.463 749.36 218.389C749.758 219.315 749.967 220.311 749.976 221.319C749.984 222.327 749.792 223.327 749.411 224.259C749.029 225.192 748.465 226.04 747.753 226.753C747.04 227.465 746.192 228.029 745.259 228.411C744.327 228.792 743.327 228.984 742.319 228.976C741.311 228.967 740.315 228.758 739.389 228.36C738.463 227.962 737.625 227.384 736.925 226.659L715.458 205.191C714.075 203.76 713.31 201.842 713.327 199.852C713.345 197.862 714.143 195.958 715.55 194.55C716.958 193.143 718.862 192.345 720.852 192.327C722.842 192.31 724.76 193.075 726.191 194.458V194.458ZM774.5 170C776.513 170 778.444 170.8 779.868 172.223C781.291 173.647 782.091 175.578 782.091 177.591V207.955C782.091 209.968 781.291 211.899 779.868 213.322C778.444 214.746 776.513 215.545 774.5 215.545C772.487 215.545 770.556 214.746 769.132 213.322C767.709 211.899 766.909 209.968 766.909 207.955V177.591C766.909 175.578 767.709 173.647 769.132 172.223C770.556 170.8 772.487 170 774.5 170Z"></path>
|
||||
</g>
|
||||
<defs>
|
||||
<linearGradient gradientUnits="userSpaceOnUse" y2="890" x2="506" y1="635" x1="506" id="paint0_linear_1513_110780">
|
||||
<stop stop-color="#BDDFFF"></stop>
|
||||
<stop stop-opacity="0" stop-color="white" offset="0.95892"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient gradientUnits="userSpaceOnUse" y2="615.257" x2="229.66" y1="754.678" x1="229.66" id="paint1_linear_1513_110780">
|
||||
<stop stop-color="#5FB2FF"></stop>
|
||||
<stop stop-color="#DFF0FF" offset="0.7893"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient gradientUnits="userSpaceOnUse" y2="784.347" x2="229.661" y1="630.738" x1="229.661" id="paint2_linear_1513_110780">
|
||||
<stop stop-color="#DFF0FF"></stop>
|
||||
<stop stop-color="#A2D2FF" offset="0.818"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient gradientUnits="userSpaceOnUse" y2="802.968" x2="847.534" y1="720.042" x1="883.842" id="paint3_linear_1513_110780">
|
||||
<stop stop-color="#C4E3FF" offset="0.365159"></stop>
|
||||
<stop stop-color="#5FB2FF" offset="1"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient gradientUnits="userSpaceOnUse" y2="696.911" x2="605.494" y1="778.74" x1="649.318" id="paint4_linear_1513_110780">
|
||||
<stop stop-color="#97CDFF" offset="0.568288"></stop>
|
||||
<stop stop-color="#5FB2FF" offset="1"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient gradientUnits="userSpaceOnUse" y2="646.727" x2="206.755" y1="200" x1="686" id="paint5_linear_1513_110780">
|
||||
<stop stop-color="#6CB8FF"></stop>
|
||||
<stop stop-color="#B1D9FF" offset="0.865168"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient gradientUnits="userSpaceOnUse" y2="615.366" x2="375.5" y1="593.358" x1="375.5" id="paint6_linear_1513_110780">
|
||||
<stop stop-color="#FFCDA5"></stop>
|
||||
<stop stop-color="#FFE8D1" offset="1"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient gradientUnits="userSpaceOnUse" y2="600.131" x2="376.181" y1="543.272" x1="376.181" id="paint7_linear_1513_110780">
|
||||
<stop stop-color="#FFF2DF"></stop>
|
||||
<stop stop-color="#FEE0BC" offset="1"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient gradientUnits="userSpaceOnUse" y2="579.657" x2="358.148" y1="540.753" x1="396.189" id="paint8_linear_1513_110780">
|
||||
<stop stop-color="#777CA7"></stop>
|
||||
<stop stop-color="#636681" offset="1"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient gradientUnits="userSpaceOnUse" y2="749.353" x2="384.874" y1="591.568" x1="425.773" id="paint9_linear_1513_110780">
|
||||
<stop stop-color="#FFE194"></stop>
|
||||
<stop stop-color="#FFBF84" offset="1"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient gradientUnits="userSpaceOnUse" y2="690.962" x2="358.001" y1="640.104" x1="392.552" id="paint10_linear_1513_110780">
|
||||
<stop stop-color="#94CBFF"></stop>
|
||||
<stop stop-color="#DCEEFF" offset="1"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient gradientUnits="userSpaceOnUse" y2="703.644" x2="374.036" y1="698.149" x1="374.036" id="paint11_linear_1513_110780">
|
||||
<stop stop-color="#94CBFF"></stop>
|
||||
<stop stop-color="#DCEEFF" offset="1"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient gradientUnits="userSpaceOnUse" y2="304.871" x2="701.011" y1="178.533" x1="811.334" id="paint12_linear_1513_110780">
|
||||
<stop stop-color="#6CB8FF"></stop>
|
||||
<stop stop-color="#BDDFFF" offset="0.781833"></stop>
|
||||
</linearGradient>
|
||||
<clipPath id="clip0_1513_110780">
|
||||
<rect fill="white" height="1024" width="1024"></rect>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 18 KiB |
BIN
src/assets/images/public_security_record_icon.png
Normal file
After Width: | Height: | Size: 11 KiB |
1
src/assets/images/qyss_icon.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="1733326801081" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="29986" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M928 832 896 832 896 384c0-70.4-57.6-128-128-128L576 256l0 544C576 817.92 561.92 832 544 832S512 817.92 512 800L512 192c0-70.4-57.6-128-128-128L192 64C121.6 64 64 121.6 64 192l0 640L32 832C14.08 832 0 846.08 0 864 0 881.92 14.08 896 32 896l896 0c17.92 0 32-14.08 32-32C960 846.08 945.92 832 928 832zM352 704l-128 0C206.08 704 192 689.92 192 672S206.08 640 224 640l128 0C369.92 640 384 654.08 384 672S369.92 704 352 704zM352 512l-128 0C206.08 512 192 497.92 192 480 192 462.08 206.08 448 224 448l128 0C369.92 448 384 462.08 384 480 384 497.92 369.92 512 352 512zM352 320l-128 0C206.08 320 192 305.92 192 288 192 270.08 206.08 256 224 256l128 0C369.92 256 384 270.08 384 288 384 305.92 369.92 320 352 320zM800 704l-128 0c-17.92 0-32-14.08-32-32s14.08-32 32-32l128 0c17.92 0 32 14.08 32 32S817.92 704 800 704zM800 512l-128 0C654.08 512 640 497.92 640 480 640 462.08 654.08 448 672 448l128 0C817.92 448 832 462.08 832 480 832 497.92 817.92 512 800 512z" p-id="29987" fill="#4B64FA"></path></svg>
|
After Width: | Height: | Size: 1.3 KiB |
1
src/assets/images/rchy_icon.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 class="icon" width="48px" height="48.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#4B64FA" d="M179.2 665.6c0 46.933333 38.4 85.333333 85.333333 85.333333s85.333333-38.4 85.333334-85.333333-38.4-85.333333-85.333334-85.333333-85.333333 38.4-85.333333 85.333333z m110.933333 0c0 12.8-8.533333 21.333333-21.333333 21.333333s-21.333333-8.533333-21.333333-21.333333 8.533333-21.333333 21.333333-21.333333 21.333333 8.533333 21.333333 21.333333zM610.133333 290.133333c25.6 0 42.666667-17.066667 42.666667-42.666666s-17.066667-42.666667-42.666667-42.666667H371.2c-38.4 0-72.533333 25.6-81.066667 59.733333L256 405.333333c0 12.8 0 25.6 8.533333 38.4s21.333333 17.066667 34.133334 17.066667h221.866666c25.6 0 42.666667-17.066667 42.666667-42.666667s-17.066667-42.666667-42.666667-42.666666h-170.666666l21.333333-85.333334h238.933333zM384 810.666667c-25.6 0-42.666667 17.066667-42.666667 42.666666s-17.066667 42.666667-42.666666 42.666667-42.666667-17.066667-42.666667-42.666667-17.066667-42.666667-42.666667-42.666666H128c-21.333333 0-42.666667-17.066667-42.666667-42.666667v-268.8c0-17.066667 8.533333-29.866667 25.6-38.4l46.933334-21.333333c12.8-4.266667 21.333333-17.066667 21.333333-29.866667l46.933333-213.333333c8.533333-38.4 42.666667-68.266667 85.333334-68.266667h362.666666c38.4 0 76.8 29.866667 85.333334 68.266667 4.266667 21.333333 29.866667 38.4 51.2 34.133333 21.333333-4.266667 38.4-25.6 34.133333-51.2-17.066667-76.8-85.333333-136.533333-166.4-136.533333H311.466667C230.4 42.666667 162.133333 98.133333 145.066667 174.933333l-42.666667 192-29.866667 17.066667C25.6 405.333333 0 448 0 499.2V768c0 72.533333 55.466667 128 128 128h51.2c17.066667 51.2 64 85.333333 119.466667 85.333333 72.533333 0 128-55.466667 128-128 0-25.6-17.066667-42.666667-42.666667-42.666666zM785.066667 691.2c68.266667-12.8 119.466667-76.8 119.466666-149.333333 0-85.333333-68.266667-149.333333-149.333333-149.333334s-149.333333 68.266667-149.333333 149.333334c0 72.533333 51.2 132.266667 119.466666 149.333333-136.533333 12.8-238.933333 119.466667-238.933333 247.466667 0 25.6 17.066667 42.666667 42.666667 42.666666s42.666667-17.066667 42.666666-42.666666c0-89.6 85.333333-162.133333 187.733334-162.133334S938.666667 849.066667 938.666667 938.666667c0 25.6 17.066667 42.666667 42.666666 42.666666s42.666667-17.066667 42.666667-42.666666c0-128-106.666667-230.4-238.933333-247.466667z m-98.133334-149.333333c0-38.4 29.866667-64 64-64s64 29.866667 64 64-29.866667 64-64 64-64-25.6-64-64z" /></svg>
|
After Width: | Height: | Size: 2.6 KiB |
BIN
src/assets/images/sfss_banner.png
Normal file
After Width: | Height: | Size: 166 KiB |
1
src/assets/images/sfzeys_icon.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 class="icon" width="48px" height="29.56px" viewBox="0 0 1663 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#4B64FA" d="M1624.062335 1024H39.123025A39.265143 39.265143 0 0 1 0 984.856673V39.123025A39.265143 39.265143 0 0 1 39.123025 0h1584.93931a39.24484 39.24484 0 0 1 39.123025 39.123025v945.733648a39.24484 39.24484 0 0 1-39.123025 39.143327zM570.70484 163.049825H179.352777a32.626207 32.626207 0 0 0 0 65.232111H570.70484a32.626207 32.626207 0 0 0 0-65.232111zM635.916648 306.568591H179.352777a32.626207 32.626207 0 0 0 0 65.232111h456.563871a32.626207 32.626207 0 0 0 0-65.232111z m0 143.47816H179.352777a32.626207 32.626207 0 0 0 0 65.232112h456.563871a32.626207 32.626207 0 0 0 0-65.232112z m130.443921 143.498464H179.352777a32.626207 32.626207 0 0 0 0 65.232111h587.007792a32.626207 32.626207 0 1 0 0-65.232111z m750.077919-6.517121c0-44.361084-77.61667-87.727343-146.422032-110.547415-3.268711-0.994825-23.165216-10.151278-10.435513-47.934334h-0.324841c32.281064-33.60073 57.050181-87.422805 57.050181-140.554593 0-81.880207-54.126613-124.596784-116.739695-124.596784-62.937923 0-116.414854 42.635367-116.414854 124.596784 0 53.476932 24.363067 107.603545 57.070484 140.879434 12.7094 33.580427-10.151278 45.985289-14.678748 47.609493-65.881793 23.794595-142.848782 67.505998-142.848782 110.547415V602.985903c0 58.694688 112.841604 72.074073 217.521582 72.074073s216.222218-13.379384 216.222218-72.074073zM1483.812281 828.344271H179.352777a32.626207 32.626207 0 0 0 0 65.232111h1304.459504a32.626207 32.626207 0 1 0 0-65.232111z" /></svg>
|
After Width: | Height: | Size: 1.7 KiB |
1
src/assets/images/sjeck_icon.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 class="icon" width="48px" height="48.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#4B64FA" d="M716.096 0c32.384 0 59.136 23.936 62.784 54.784l0.448 7.232-0.128 153.28c-29.696-13.76-46.464-24.448-46.464-24.448l-14.784-7.296v-18.88h-528.64v666.24h528.64v-16.256c10.304-2.368 33.344-13.184 61.248-29.888l0.128 177.216a62.464 62.464 0 0 1-55.872 61.568l-7.36 0.448H191.232a62.784 62.784 0 0 1-62.784-54.784L128 961.92V62.016c0-31.808 24.384-58.048 55.872-61.568L191.232 0h524.8z m-262.4 873.6a51.392 51.392 0 0 0-51.84 50.88c0 28.096 23.168 50.816 51.84 50.816 28.608 0 51.84-22.72 51.84-50.816a51.392 51.392 0 0 0-51.84-50.88z m260.16-644.864l15.616 7.68s33.28 21.184 88 40.448c50.88 19.264 82.176 19.264 82.176 19.264l23.424 1.92v265.92c0 98.304-187.712 204.224-209.216 204.224-23.488 0-209.28-105.92-209.28-204.16V297.984l25.472-1.92s29.312-1.92 82.112-19.2a585.024 585.024 0 0 0 83.904-38.144l3.648-2.112 0.448-0.256 13.696-7.68z m97.792 159.872L694.272 533.12l-62.528-55.872-29.376 36.608 97.792 88.64 146.688-181.12-35.2-32.768z m-299.456-311.04h-117.12a16.576 16.576 0 0 0-16.64 16.384c0 7.744 5.44 14.272 12.8 16l3.84 0.384h117.12a16.576 16.576 0 0 0 16.768-16.384 16.576 16.576 0 0 0-16.768-16.384z" /></svg>
|
After Width: | Height: | Size: 1.4 KiB |
1
src/assets/images/sjeys_icon.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 class="icon" width="48px" height="48.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#4B64FA" d="M909.824 457.728H738.816V60.416C738.304 27.136 711.68 0 678.4 0H116.736C83.456 0 56.32 27.136 56.32 60.416v782.336c0 33.28 27.136 60.416 60.416 60.416h485.376v62.464c0 32.256 26.112 57.856 57.856 57.856h249.344c32.256 0 57.856-26.112 57.856-57.856V515.584c0.512-31.744-25.6-57.856-57.344-57.856zM397.312 866.816c-19.968 0-36.352-16.384-36.352-36.352 0-19.968 16.384-36.352 36.352-36.352 19.968 0 36.352 16.384 36.352 36.352 0.512 19.968-15.872 36.352-36.352 36.352z m204.8-351.232v241.152H143.36c-18.944 0-34.816-15.872-34.816-34.816V87.04c0-18.944 15.872-34.816 34.816-34.816h508.416c18.944 0 34.816 15.872 34.816 34.816v370.688H660.48c-32.256 0-58.368 26.112-58.368 57.856zM915.456 939.52c0 17.92-14.336 32.256-32.256 32.256H686.592c-17.92 0-32.256-14.336-32.256-32.256V541.696c0-17.92 14.336-32.256 32.256-32.256H883.2c17.92 0 32.256 14.336 32.256 32.256V939.52z" /></svg>
|
After Width: | Height: | Size: 1.1 KiB |
1
src/assets/images/sjhmfx_icon.svg
Normal file
After Width: | Height: | Size: 4.9 KiB |
1
src/assets/images/sjsys_icon.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 class="icon" width="48px" height="48.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#4B64FA" d="M1023.842304 997.558272c-3.960832-128.258048-92.628992-235.188224-212.025344-266.9056 56.522752-27.35104 95.500288-85.18656 95.500288-152.119296 0-93.298688-75.743232-168.92928-169.187328-168.92928s-169.183232 75.630592-169.183232 168.92928c0 66.934784 38.975488 124.768256 95.49824 152.119296-119.3984 31.715328-208.06656 138.647552-212.025344 266.9056h-0.1536v26.425344h151.68512v-26.425344H478.9248c5.072896-134.557696 123.65824-250.073088 259.207168-250.073088s254.134272 115.515392 259.20512 250.073088h-125.022208v26.425344h151.683072v-26.425344h-0.155648zM595.412992 578.531328c0-73.996288 68.608-142.526464 142.716928-142.526464s142.716928 68.530176 142.716928 142.526464c0 74.008576-68.608 142.528512-142.716928 142.528512s-142.716928-68.519936-142.716928-142.528512z m-173.819904 343.062528H59.74016a17.065984 17.065984 0 0 1-17.068032-17.068032V85.331968a17.055744 17.055744 0 0 1 17.068032-17.057792h494.923776c9.424896 0 17.068032 7.634944 17.068032 17.057792v358.373376a214.53824 214.53824 0 0 1 42.65984-42.653696V85.331968C614.391808 38.203392 576.188416 0 529.05984 0H85.331968C38.213632 0 0 38.203392 0 85.331968v853.32992c0 47.118336 38.213632 85.321728 85.331968 85.321728h337.69472c-3.155968-18.024448-4.888576-36.538368-4.888576-55.451648 0-15.955968 1.200128-31.614976 3.454976-46.938112zM255.995904 29.87008c0-2.3552 1.910784-4.265984 4.265984-4.265984h93.868032c2.3552 0 4.268032 1.910784 4.268032 4.265984v8.534016c0 2.3552-1.912832 4.265984-4.268032 4.265984h-93.868032a4.268032 4.268032 0 0 1-4.265984-4.265984v-8.534016z m85.331968 959.987712c0 9.422848-7.634944 17.068032-17.057792 17.068032h-34.136064a17.072128 17.072128 0 0 1-17.068032-17.068032v-34.125824a17.072128 17.072128 0 0 1 17.068032-17.07008h34.136064c9.424896 0 17.057792 7.645184 17.057792 17.07008v34.125824z m20.946944-496.023552c15.214592-7.000064 26.691584-16.42496 34.44736-28.291072 7.757824-11.86816 11.636736-25.014272 11.636736-39.460864 0-15.212544-4.077568-29.591552-12.212224-43.116544-8.136704-13.545472-19.879936-24.225792-35.237888-32.059392-15.37024-7.835648-32.169984-11.757568-50.427904-11.757568-26.458112 0-48.582656 7.5776-66.38592 22.71232-17.790976 15.12448-29.192192 36.460544-34.213888 63.985664l41.060352 7.29088c3.045376-20.068352 9.889792-35.125248 20.533248-45.160448 10.647552-10.04544 23.959552-15.058944 39.927808-15.058944 16.111616 0 29.270016 4.94592 39.460864 14.835712s15.292416 22.358016 15.292416 37.404672c0 19.023872-7.002112 33.091584-20.992 42.203136-13.991936 9.13408-29.73696 13.69088-47.21664 13.69088-1.67936 0-3.889152-0.155648-6.623232-0.444416l-4.56704 36.038656c11.558912-3.043328 21.225472-4.56704 28.981248-4.56704 19.001344 0 34.670592 6.135808 46.993408 18.356224 12.324864 12.25728 18.479104 27.8016 18.479104 46.671872 0 19.769344-6.656 36.337664-19.95776 49.727488-13.32224 13.377536-29.626368 20.08064-48.939008 20.08064-16.279552 0-30.081024-5.134336-41.404416-15.403008-11.33568-10.268672-19.359744-27.035648-24.082432-50.305024l-41.050112 5.476352c2.736128 27.826176 13.80352 50.495488 33.193984 67.987456 19.390464 17.48992 43.759616 26.22464 73.107456 26.22464 32.548864 0 59.47392-10.145792 80.766976-30.447616 21.291008-20.314112 31.936512-45.049856 31.936512-74.252288 0-21.604352-5.480448-39.583744-16.42496-53.9648-10.944512-14.372864-26.312704-23.842816-46.082048-28.397568z" /></svg>
|
After Width: | Height: | Size: 3.5 KiB |
1
src/assets/images/sjzwsc_icon.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 class="icon" width="48px" height="48.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M722.6624 108.928a86.6048 86.6048 0 0 1 86.6048 86.6048v245.76a21.6576 21.6576 0 0 1-43.3152 0v-245.76a43.2896 43.2896 0 0 0-43.2896-43.2896H246.3744a43.2896 43.2896 0 0 0-43.3152 43.2896v621.7728a43.2896 43.2896 0 0 0 43.3152 43.2896h297.0624a21.6576 21.6576 0 1 1 0 43.3152H246.3744a86.6048 86.6048 0 0 1-86.6048-86.6048V195.5328a86.6048 86.6048 0 0 1 86.6048-86.6048h476.288z m-106.24 213.3248c10.24 6.144 13.568 19.456 7.424 29.696l-158.72 274.7648a21.6576 21.6576 0 1 1-37.12-22.3232l158.72-274.7392c6.144-10.24 19.456-13.568 29.696-7.424z m-108.8512 1.9456c10.24 6.144 13.568 19.456 7.424 29.696l-102.8096 173.824a21.6576 21.6576 0 1 1-37.12-22.2976l102.8096-173.824c6.144-10.24 19.456-13.568 29.696-7.424z m-103.424-11.8528c10.24 6.144 13.568 19.456 7.3984 29.696l-66.8928 111.36a21.6576 21.6576 0 1 1-37.12-22.2976l66.8928-111.36c6.144-10.24 19.456-13.568 29.696-7.3984z" fill="#3B424C" /><path d="M489.088 809.9328a43.5712 43.5712 0 1 0 0-87.168 43.5712 43.5712 0 0 0 0 87.168zM742.4768 498.6368a194.8416 194.8416 0 0 1 194.0736 194.816 195.3024 195.3024 0 0 1-197.12 194.8416 194.8416 194.8416 0 0 1 3.0464-389.6576z m-3.072 45.824a148.992 148.992 0 1 0 4.608 297.984 148.992 148.992 0 0 0-4.608-297.984z m2.304 36.608c11.5968 0 21.0944 9.088 21.76 20.5312l0.0256 1.28v99.1744l56.1664 30.4896a21.7856 21.7856 0 0 1 9.344 28.3648l-0.5888 1.1776a21.7856 21.7856 0 0 1-28.3648 9.3696l-1.1776-0.6144-67.584-36.6592a21.7856 21.7856 0 0 1-11.3152-17.7664l-0.0512-1.3824V602.88c0-12.032 9.7536-21.7856 21.7856-21.7856z" fill="#4B7EFE" /></svg>
|
After Width: | Height: | Size: 1.8 KiB |
1
src/assets/images/srhy_icon.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 class="icon" width="48px" height="44.77px" viewBox="0 0 1098 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#4B64FA" d="M545.501953 292.942155l3.101943 3.101942 85.082433-82.423481a337.670781 337.670781 0 0 0 25.258535-24.816543l11.078796-11.520788 14.62273-14.623731a97.933196 97.933196 0 0 0 32.792396-74.003637 79.321539 79.321539 0 0 0-19.497641-60.26689 92.172302 92.172302 0 0 0-147.12229 19.054649A88.627368 88.627368 0 0 0 471.054324 0.028549a91.286319 91.286319 0 0 0-91.286319 91.286319 97.047213 97.047213 0 0 0 32.792396 70.901694z m441.363871 453.32865a35.451347 35.451347 0 0 0-22.156592-8.419845 32.349404 32.349404 0 0 0-22.599584 55.835972 300.004475 300.004475 0 0 1 88.627368 192.76445 33.67838 33.67838 0 1 0 66.913768 0 396.164703 396.164703 0 0 0-110.78496-240.180577z" /><path fill="#4B64FA" d="M761.308978 287.624253a214.921042 214.921042 0 0 0-214.035058 209.604139 217.137001 217.137001 0 0 0-214.035058-209.604139 215.365033 215.365033 0 0 0-125.40769 390.402809 272.085989 272.085989 0 0 0-97.490204 68.243743A381.097981 381.097981 0 0 0 0 988.667341a35.894339 35.894339 0 0 0 33.235388 33.679379 35.894339 35.894339 0 0 0 33.67838-33.679379 310.196287 310.196287 0 0 1 88.627367-192.76445 255.247299 255.247299 0 0 1 170.606858-73.560645h7.090869A214.921042 214.921042 0 0 0 547.27492 515.396057a215.808025 215.808025 0 0 0 88.626368 162.632005 278.732866 278.732866 0 0 0-88.627368 61.152874h-8.862836a32.349404 32.349404 0 0 0-22.599584 8.419845 33.235388 33.235388 0 0 0-10.191812 23.485567 26.58851 26.58851 0 0 0 3.101942 13.294755 363.815299 363.815299 0 0 0-78.878547 205.615213 35.894339 35.894339 0 0 0 33.235388 33.67838 36.337331 36.337331 0 0 0 33.67838-33.67838 279.61985 279.61985 0 0 1 55.834971-150.667225 274.301948 274.301948 0 0 1 53.619013 148.451266 33.67838 33.67838 0 0 0 66.914767 0 364.702283 364.702283 0 0 0-76.663588-197.63836 254.803307 254.803307 0 0 1 156.871111-67.800751h7.08987A215.365033 215.365033 0 0 0 974.902044 507.420204a218.022984 218.022984 0 0 0-213.592066-219.795951zM914.193162 502.545294a151.110217 151.110217 0 0 1-145.792314 150.223233h-11.521788a149.33725 149.33725 0 1 1 157.314102-150.666225z m-430.286075 0A151.110217 151.110217 0 0 1 338.113773 652.768527h-11.96478a149.33725 149.33725 0 1 1 157.757094-150.666225z" /></svg>
|
After Width: | Height: | Size: 2.4 KiB |
1
src/assets/images/xlhy_icon.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 class="icon" width="48px" height="48.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#4B64FA" d="M938.666667 398.506667a45.653333 45.653333 0 0 0-19.626667-35.84L539.733333 95.573333a45.226667 45.226667 0 0 0-52.693333 0L106.666667 362.666667a42.666667 42.666667 0 0 0 0 75.733333l149.333333 104.533333V682.666667a256 256 0 0 0 512 0v-137.813334l85.333333-60.16V661.333333a42.666667 42.666667 0 0 0 85.333334 0V405.333333v-6.826666zM682.666667 682.666667a170.666667 170.666667 0 0 1-341.333334 0v-79.573334l145.706667 102.613334a45.866667 45.866667 0 0 0 52.693333 0l142.933334-100.693334z m0-190.506667l-169.386667 119.253333L341.333333 490.666667l-85.333333-60.16-42.666667-29.44 44.8-31.573334L513.28 189.866667 758.826667 362.666667H512a42.666667 42.666667 0 0 0 0 85.333333h233.173333z" /></svg>
|
After Width: | Height: | Size: 983 B |
1
src/assets/images/xunihaoma_icon.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 class="icon" width="48px" height="48.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#4B64FA" d="M716.096 0c32.384 0 59.136 23.936 62.784 54.784l0.448 7.232-0.128 153.28c-29.696-13.76-46.464-24.448-46.464-24.448l-14.784-7.296v-18.88h-528.64v666.24h528.64v-16.256c10.304-2.368 33.344-13.184 61.248-29.888l0.128 177.216a62.464 62.464 0 0 1-55.872 61.568l-7.36 0.448H191.232a62.784 62.784 0 0 1-62.784-54.784L128 961.92V62.016c0-31.808 24.384-58.048 55.872-61.568L191.232 0h524.8z m-262.4 873.6a51.392 51.392 0 0 0-51.84 50.88c0 28.096 23.168 50.816 51.84 50.816 28.608 0 51.84-22.72 51.84-50.816a51.392 51.392 0 0 0-51.84-50.88z m260.16-644.864l15.616 7.68s33.28 21.184 88 40.448c50.88 19.264 82.176 19.264 82.176 19.264l23.424 1.92v265.92c0 98.304-187.712 204.224-209.216 204.224-23.488 0-209.28-105.92-209.28-204.16V297.984l25.472-1.92s29.312-1.92 82.112-19.2a585.024 585.024 0 0 0 83.904-38.144l3.648-2.112 0.448-0.256 13.696-7.68z m97.792 159.872L694.272 533.12l-62.528-55.872-29.376 36.608 97.792 88.64 146.688-181.12-35.2-32.768z m-299.456-311.04h-117.12a16.576 16.576 0 0 0-16.64 16.384c0 7.744 5.44 14.272 12.8 16l3.84 0.384h117.12a16.576 16.576 0 0 0 16.768-16.384 16.576 16.576 0 0 0-16.768-16.384z" /></svg>
|
After Width: | Height: | Size: 1.4 KiB |
1
src/assets/images/yhk4ys_icon.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 class="icon" width="48px" height="48.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#4B64FA" d="M137.2622 508.74077l38.936801 0 0 218.511689-38.936801 0L137.2622 508.74077 137.2622 508.74077zM137.2622 508.74077" /><path fill="#4B64FA" d="M215.137849 508.74077l38.939871 0 0 218.511689-38.939871 0L215.137849 508.74077 215.137849 508.74077zM215.137849 508.74077" /><path fill="#4B64FA" d="M293.016567 508.74077l38.936801 0 0 218.511689-38.936801 0L293.016567 508.74077 293.016567 508.74077zM293.016567 508.74077" /><path fill="#4B64FA" d="M124.163881 783.822872c-25.908066-2.705622-46.272883-24.810059-46.272883-51.440579L77.890998 232.474702c0-28.441772 23.233144-49.553603 51.632961-49.553603l755.787352 0c28.399817 0 53.800323 21.112853 53.800323 49.553603l0 310.202994c12.725836 9.861602 24.509207 20.857027 35.21606 32.8205L974.327694 214.801181c0-38.150902-34.065863-66.464761-72.161506-66.464761L111.927185 148.33642c-38.089503 0-69.252247 28.313859-69.252247 66.464761l0 534.608927c0 35.719526 27.316136 65.36573 62.065568 68.997444l415.806147 0c-3.078105-11.249205-5.426593-22.791076-6.978948-34.58468L124.163881 783.822872 124.163881 783.822872zM124.163881 783.822872" /><path fill="#4B64FA" d="M65.239863 325.343833l873.871771 0 0 119.525234-873.871771 0 0-119.525234Z" /><path fill="#4B64FA" d="M768.32183 691.604564c-1.24741 3.070942-3.071965 6.478552-5.470595 10.221806l-50.103118 77.17059 58.741869 0 0-73.138764c0-6.239098 0.192382-13.389962 0.576121-21.452591l-0.86367 0C770.433934 686.23016 769.474073 688.629813 768.32183 691.604564z" /><path fill="#4B64FA" d="M776.145006 551.10053c-110.596887 0-200.25386 88.847537-200.25386 198.456934s89.656973 198.452841 200.25386 198.452841 200.251813-88.842421 200.251813-198.452841S886.741893 551.10053 776.145006 551.10053zM841.029782 812.399721 813.96231 812.399721l0 48.663326-42.472324 0 0-48.663326-98.04706 0 0-29.658484 94.15952-144.694473 46.359864 0 0 140.951219 27.067472 0L841.029782 812.399721z" /></svg>
|
After Width: | Height: | Size: 2.1 KiB |
1
src/assets/images/yhkhmd_icon.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 class="icon" width="48px" height="48.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#4B64FA" d="M992 96H32a32 32 0 0 0-32 32v704a32 32 0 0 0 32 32h416v-64H64v-288h384v-64H64v-128h896v96h64V128a32 32 0 0 0-32-32zM64 256V160h896v96zM128 608h64v64H128zM256 608h64v64H256zM768 416a256 256 0 1 0 256 256 256 256 0 0 0-256-256z m0 448a192 192 0 1 1 192-192 192 192 0 0 1-192 192zM841.28 553.28L768 626.88l-73.28-73.6-45.44 45.44 73.6 73.28-73.6 73.28 45.44 45.44 73.28-73.6 73.28 73.6 45.44-45.44-73.6-73.28 73.6-73.28-45.44-45.44z" /></svg>
|
After Width: | Height: | Size: 719 B |
1
src/assets/images/yhksys_icon.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 class="icon" width="48px" height="48.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#4B64FA" d="M225.8 491h30.8v173h-30.8zM287.4 491h30.8v173h-30.8zM349.1 491h30.8v173h-30.8zM215.4 708.8c-20.5-2.1-36.6-19.6-36.6-40.7V440.4h681.9v77.4c10.1 7.8 19.4 16.5 27.9 26V258.3c0-30.2-27-52.6-57.1-52.6H205.7c-30.2 0-54.8 22.4-54.8 52.6v423.3c0 28.3 21.6 51.8 49.1 54.6h329.2c-2.4-8.9-4.3-18-5.5-27.4H215.4z m4.2-475.8h598.5c22.5 0 42.6 16.7 42.6 39.2v73.5H178.8v-73.5c0-22.5 18.4-39.2 40.8-39.2z m0 0M731.7 524.6c-87.6 0-158.6 70.4-158.6 157.1s71 157.1 158.6 157.1 158.6-70.3 158.6-157.1-71.1-157.1-158.6-157.1z m42.9 234.3c-12.3 9.4-28.6 14.1-49.1 14.1-18.2 0-32.8-3-43.9-9v-32.5c11.8 8.8 25.5 13.2 41.3 13.2 10 0 17.9-2.2 23.7-6.6 5.9-4.4 8.8-10.7 8.8-18.8 0-8.4-3.5-14.7-10.4-19.2-7-4.4-16.7-6.6-29.2-6.6H700v-28.4h14.5c23.7 0 35.6-8 35.6-23.9 0-15-9.1-22.6-27.2-22.6-11.9 0-23.4 3.9-34.5 11.6v-30.4c12.2-6.3 26.5-9.5 43-9.5 16.7 0 30.3 3.9 40.7 11.6 10.4 7.7 15.6 18.4 15.6 32.1 0 23.1-11.7 37.6-35.1 43.5v0.6c12.3 1.4 22.2 5.9 29.5 13.5 7.4 7.6 11.1 16.9 11.1 27.9-0.2 16.9-6.3 30-18.6 39.4z m0 0" /></svg>
|
After Width: | Height: | Size: 1.3 KiB |
1
src/assets/images/zrrsczt_icon.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 class="icon" width="48px" height="48.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path fill="#4B64FA" d="M800.53 643.11L662.89 505.46l-11.12-11.12-33.66-33.66-0.41-0.42h-0.01l-246.8-246.8c-2.06-2.06-4.38-3.64-6.79-5.02 0.25-0.35 0.46-0.72 0.71-1.07l-45.18-45.19c-32.72 41.63-52.42 93.95-52.42 150.89 0 65.45 25.96 124.84 67.94 168.8-102.62 91.7-167.41 259.88-167.41 442.15 0 17.49 14.18 31.67 31.67 31.67h625.17c17.49 0 31.67-14.18 31.67-31.67 0.01-101.58-20.16-198.8-55.72-280.91zM330.55 313.09c0-15.44 2.02-30.39 5.7-44.68l220.43 220.44c-14.3 3.67-29.24 5.69-44.68 5.69-100.05 0-181.45-81.4-181.45-181.45z m-98.76 579.28c6.93-157.25 65.11-297.71 153.39-370.29 37.03 22.57 80.36 35.81 126.82 35.81 33.52 0 65.36-6.98 94.44-19.27l138.61 138.62c0.72 0.72 1.54 1.25 2.3 1.88 25.58 63.07 41.45 136.08 44.85 213.26H231.79zM512 131.63c100.05 0 181.44 81.4 181.44 181.45 0 37.76-11.61 72.85-31.44 101.92l45.18 45.19c30.99-41.01 49.6-91.86 49.6-147.11 0-134.99-109.81-244.8-244.79-244.8-55.24 0-106.11 18.61-147.11 49.6l45.19 45.19c29.08-19.82 64.17-31.44 101.93-31.44z" /></svg>
|
After Width: | Height: | Size: 1.2 KiB |
29
src/assets/main.css
Normal file
@ -0,0 +1,29 @@
|
||||
@import "./base.css";
|
||||
@import "./nprogress.css";
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
#app {
|
||||
margin: 0 auto;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
a,
|
||||
.green {
|
||||
text-decoration: none;
|
||||
color: hsla(160, 100%, 37%, 1);
|
||||
transition: 0.4s;
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
@media (hover: hover) {
|
||||
a:hover {
|
||||
background-color: hsla(160, 100%, 37%, 0.2);
|
||||
}
|
||||
}
|
||||
.card {
|
||||
@apply shadow rounded-xl bg-white p-6;
|
||||
}
|
||||
.ltitle {
|
||||
@apply mx-auto mt-2 w-64 border rounded-3xl bg-gradient-to-r from-blue-400 via-green-500 to-teal-500 py-2 text-center text-white font-bold;
|
||||
}
|
10
src/assets/nprogress.css
Normal file
@ -0,0 +1,10 @@
|
||||
/* 进度条颜色 */
|
||||
#nprogress .bar {
|
||||
background: #29d; /* 修改为你想要的颜色 */
|
||||
height: 4px; /* 修改高度 */
|
||||
}
|
||||
|
||||
/* 圆圈颜色 */
|
||||
#nprogress .peg {
|
||||
box-shadow: 0 0 10px #29d, 0 0 5px #29d;
|
||||
}
|
1
src/assets/uni-webview.js
Normal file
308
src/auto-imports.d.ts
vendored
Normal file
@ -0,0 +1,308 @@
|
||||
/* eslint-disable */
|
||||
/* prettier-ignore */
|
||||
// @ts-nocheck
|
||||
// noinspection JSUnusedGlobalSymbols
|
||||
// Generated by unplugin-auto-import
|
||||
// biome-ignore lint: disable
|
||||
export {}
|
||||
declare global {
|
||||
const EffectScope: typeof import('vue')['EffectScope']
|
||||
const VanTabbar: typeof import('vant/es')['Tabbar']
|
||||
const VanTabbarItem: typeof import('vant/es')['TabbarItem']
|
||||
const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
|
||||
const autoResetRef: typeof import('@vueuse/core')['autoResetRef']
|
||||
const closeToast: typeof import('vant/es')['closeToast']
|
||||
const computed: typeof import('vue')['computed']
|
||||
const computedAsync: typeof import('@vueuse/core')['computedAsync']
|
||||
const computedEager: typeof import('@vueuse/core')['computedEager']
|
||||
const computedInject: typeof import('@vueuse/core')['computedInject']
|
||||
const computedWithControl: typeof import('@vueuse/core')['computedWithControl']
|
||||
const controlledComputed: typeof import('@vueuse/core')['controlledComputed']
|
||||
const controlledRef: typeof import('@vueuse/core')['controlledRef']
|
||||
const createApp: typeof import('vue')['createApp']
|
||||
const createEventHook: typeof import('@vueuse/core')['createEventHook']
|
||||
const createGlobalState: typeof import('@vueuse/core')['createGlobalState']
|
||||
const createInjectionState: typeof import('@vueuse/core')['createInjectionState']
|
||||
const createReactiveFn: typeof import('@vueuse/core')['createReactiveFn']
|
||||
const createReusableTemplate: typeof import('@vueuse/core')['createReusableTemplate']
|
||||
const createSharedComposable: typeof import('@vueuse/core')['createSharedComposable']
|
||||
const createTemplatePromise: typeof import('@vueuse/core')['createTemplatePromise']
|
||||
const createUnrefFn: typeof import('@vueuse/core')['createUnrefFn']
|
||||
const customRef: typeof import('vue')['customRef']
|
||||
const debouncedRef: typeof import('@vueuse/core')['debouncedRef']
|
||||
const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch']
|
||||
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
|
||||
const defineComponent: typeof import('vue')['defineComponent']
|
||||
const eagerComputed: typeof import('@vueuse/core')['eagerComputed']
|
||||
const effectScope: typeof import('vue')['effectScope']
|
||||
const extendRef: typeof import('@vueuse/core')['extendRef']
|
||||
const getCurrentInstance: typeof import('vue')['getCurrentInstance']
|
||||
const getCurrentScope: typeof import('vue')['getCurrentScope']
|
||||
const h: typeof import('vue')['h']
|
||||
const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch']
|
||||
const inject: typeof import('vue')['inject']
|
||||
const injectLocal: typeof import('@vueuse/core')['injectLocal']
|
||||
const isDefined: typeof import('@vueuse/core')['isDefined']
|
||||
const isProxy: typeof import('vue')['isProxy']
|
||||
const isReactive: typeof import('vue')['isReactive']
|
||||
const isReadonly: typeof import('vue')['isReadonly']
|
||||
const isRef: typeof import('vue')['isRef']
|
||||
const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable']
|
||||
const markRaw: typeof import('vue')['markRaw']
|
||||
const nextTick: typeof import('vue')['nextTick']
|
||||
const onActivated: typeof import('vue')['onActivated']
|
||||
const onBeforeMount: typeof import('vue')['onBeforeMount']
|
||||
const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave']
|
||||
const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate']
|
||||
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
|
||||
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
|
||||
const onClickOutside: typeof import('@vueuse/core')['onClickOutside']
|
||||
const onDeactivated: typeof import('vue')['onDeactivated']
|
||||
const onErrorCaptured: typeof import('vue')['onErrorCaptured']
|
||||
const onKeyStroke: typeof import('@vueuse/core')['onKeyStroke']
|
||||
const onLongPress: typeof import('@vueuse/core')['onLongPress']
|
||||
const onMounted: typeof import('vue')['onMounted']
|
||||
const onRenderTracked: typeof import('vue')['onRenderTracked']
|
||||
const onRenderTriggered: typeof import('vue')['onRenderTriggered']
|
||||
const onScopeDispose: typeof import('vue')['onScopeDispose']
|
||||
const onServerPrefetch: typeof import('vue')['onServerPrefetch']
|
||||
const onStartTyping: typeof import('@vueuse/core')['onStartTyping']
|
||||
const onUnmounted: typeof import('vue')['onUnmounted']
|
||||
const onUpdated: typeof import('vue')['onUpdated']
|
||||
const onWatcherCleanup: typeof import('vue')['onWatcherCleanup']
|
||||
const pausableWatch: typeof import('@vueuse/core')['pausableWatch']
|
||||
const provide: typeof import('vue')['provide']
|
||||
const provideLocal: typeof import('@vueuse/core')['provideLocal']
|
||||
const reactify: typeof import('@vueuse/core')['reactify']
|
||||
const reactifyObject: typeof import('@vueuse/core')['reactifyObject']
|
||||
const reactive: typeof import('vue')['reactive']
|
||||
const reactiveComputed: typeof import('@vueuse/core')['reactiveComputed']
|
||||
const reactiveOmit: typeof import('@vueuse/core')['reactiveOmit']
|
||||
const reactivePick: typeof import('@vueuse/core')['reactivePick']
|
||||
const readonly: typeof import('vue')['readonly']
|
||||
const ref: typeof import('vue')['ref']
|
||||
const refAutoReset: typeof import('@vueuse/core')['refAutoReset']
|
||||
const refDebounced: typeof import('@vueuse/core')['refDebounced']
|
||||
const refDefault: typeof import('@vueuse/core')['refDefault']
|
||||
const refThrottled: typeof import('@vueuse/core')['refThrottled']
|
||||
const refWithControl: typeof import('@vueuse/core')['refWithControl']
|
||||
const resolveComponent: typeof import('vue')['resolveComponent']
|
||||
const resolveRef: typeof import('@vueuse/core')['resolveRef']
|
||||
const resolveUnref: typeof import('@vueuse/core')['resolveUnref']
|
||||
const shallowReactive: typeof import('vue')['shallowReactive']
|
||||
const shallowReadonly: typeof import('vue')['shallowReadonly']
|
||||
const shallowRef: typeof import('vue')['shallowRef']
|
||||
const showLoadingToast: typeof import('vant/es')['showLoadingToast']
|
||||
const showToast: typeof import('vant/es')['showToast']
|
||||
const syncRef: typeof import('@vueuse/core')['syncRef']
|
||||
const syncRefs: typeof import('@vueuse/core')['syncRefs']
|
||||
const templateRef: typeof import('@vueuse/core')['templateRef']
|
||||
const throttledRef: typeof import('@vueuse/core')['throttledRef']
|
||||
const throttledWatch: typeof import('@vueuse/core')['throttledWatch']
|
||||
const toRaw: typeof import('vue')['toRaw']
|
||||
const toReactive: typeof import('@vueuse/core')['toReactive']
|
||||
const toRef: typeof import('vue')['toRef']
|
||||
const toRefs: typeof import('vue')['toRefs']
|
||||
const toValue: typeof import('vue')['toValue']
|
||||
const triggerRef: typeof import('vue')['triggerRef']
|
||||
const tryOnBeforeMount: typeof import('@vueuse/core')['tryOnBeforeMount']
|
||||
const tryOnBeforeUnmount: typeof import('@vueuse/core')['tryOnBeforeUnmount']
|
||||
const tryOnMounted: typeof import('@vueuse/core')['tryOnMounted']
|
||||
const tryOnScopeDispose: typeof import('@vueuse/core')['tryOnScopeDispose']
|
||||
const tryOnUnmounted: typeof import('@vueuse/core')['tryOnUnmounted']
|
||||
const unref: typeof import('vue')['unref']
|
||||
const unrefElement: typeof import('@vueuse/core')['unrefElement']
|
||||
const until: typeof import('@vueuse/core')['until']
|
||||
const useActiveElement: typeof import('@vueuse/core')['useActiveElement']
|
||||
const useAnimate: typeof import('@vueuse/core')['useAnimate']
|
||||
const useApiFetch: typeof import('./composables/useApiFetch.js')['default']
|
||||
const useArrayDifference: typeof import('@vueuse/core')['useArrayDifference']
|
||||
const useArrayEvery: typeof import('@vueuse/core')['useArrayEvery']
|
||||
const useArrayFilter: typeof import('@vueuse/core')['useArrayFilter']
|
||||
const useArrayFind: typeof import('@vueuse/core')['useArrayFind']
|
||||
const useArrayFindIndex: typeof import('@vueuse/core')['useArrayFindIndex']
|
||||
const useArrayFindLast: typeof import('@vueuse/core')['useArrayFindLast']
|
||||
const useArrayIncludes: typeof import('@vueuse/core')['useArrayIncludes']
|
||||
const useArrayJoin: typeof import('@vueuse/core')['useArrayJoin']
|
||||
const useArrayMap: typeof import('@vueuse/core')['useArrayMap']
|
||||
const useArrayReduce: typeof import('@vueuse/core')['useArrayReduce']
|
||||
const useArraySome: typeof import('@vueuse/core')['useArraySome']
|
||||
const useArrayUnique: typeof import('@vueuse/core')['useArrayUnique']
|
||||
const useAsyncQueue: typeof import('@vueuse/core')['useAsyncQueue']
|
||||
const useAsyncState: typeof import('@vueuse/core')['useAsyncState']
|
||||
const useAttrs: typeof import('vue')['useAttrs']
|
||||
const useBase64: typeof import('@vueuse/core')['useBase64']
|
||||
const useBattery: typeof import('@vueuse/core')['useBattery']
|
||||
const useBluetooth: typeof import('@vueuse/core')['useBluetooth']
|
||||
const useBreakpoints: typeof import('@vueuse/core')['useBreakpoints']
|
||||
const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel']
|
||||
const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation']
|
||||
const useCached: typeof import('@vueuse/core')['useCached']
|
||||
const useClipboard: typeof import('@vueuse/core')['useClipboard']
|
||||
const useClipboardItems: typeof import('@vueuse/core')['useClipboardItems']
|
||||
const useCloned: typeof import('@vueuse/core')['useCloned']
|
||||
const useColorMode: typeof import('@vueuse/core')['useColorMode']
|
||||
const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog']
|
||||
const useCounter: typeof import('@vueuse/core')['useCounter']
|
||||
const useCounterStore: typeof import('./stores/counter.js')['useCounterStore']
|
||||
const useCssModule: typeof import('vue')['useCssModule']
|
||||
const useCssVar: typeof import('@vueuse/core')['useCssVar']
|
||||
const useCssVars: typeof import('vue')['useCssVars']
|
||||
const useCurrentElement: typeof import('@vueuse/core')['useCurrentElement']
|
||||
const useCycleList: typeof import('@vueuse/core')['useCycleList']
|
||||
const useDark: typeof import('@vueuse/core')['useDark']
|
||||
const useDateFormat: typeof import('@vueuse/core')['useDateFormat']
|
||||
const useDebounce: typeof import('@vueuse/core')['useDebounce']
|
||||
const useDebounceFn: typeof import('@vueuse/core')['useDebounceFn']
|
||||
const useDebouncedRefHistory: typeof import('@vueuse/core')['useDebouncedRefHistory']
|
||||
const useDeviceMotion: typeof import('@vueuse/core')['useDeviceMotion']
|
||||
const useDeviceOrientation: typeof import('@vueuse/core')['useDeviceOrientation']
|
||||
const useDevicePixelRatio: typeof import('@vueuse/core')['useDevicePixelRatio']
|
||||
const useDevicesList: typeof import('@vueuse/core')['useDevicesList']
|
||||
const useDisplayMedia: typeof import('@vueuse/core')['useDisplayMedia']
|
||||
const useDocumentVisibility: typeof import('@vueuse/core')['useDocumentVisibility']
|
||||
const useDraggable: typeof import('@vueuse/core')['useDraggable']
|
||||
const useDropZone: typeof import('@vueuse/core')['useDropZone']
|
||||
const useElementBounding: typeof import('@vueuse/core')['useElementBounding']
|
||||
const useElementByPoint: typeof import('@vueuse/core')['useElementByPoint']
|
||||
const useElementHover: typeof import('@vueuse/core')['useElementHover']
|
||||
const useElementSize: typeof import('@vueuse/core')['useElementSize']
|
||||
const useElementVisibility: typeof import('@vueuse/core')['useElementVisibility']
|
||||
const useEnvironment: typeof import('./composables/useEnvironment.js')['useEnvironment']
|
||||
const useEventBus: typeof import('@vueuse/core')['useEventBus']
|
||||
const useEventListener: typeof import('@vueuse/core')['useEventListener']
|
||||
const useEventSource: typeof import('@vueuse/core')['useEventSource']
|
||||
const useEyeDropper: typeof import('@vueuse/core')['useEyeDropper']
|
||||
const useFavicon: typeof import('@vueuse/core')['useFavicon']
|
||||
const useFetch: typeof import('@vueuse/core')['useFetch']
|
||||
const useFileDialog: typeof import('@vueuse/core')['useFileDialog']
|
||||
const useFileSystemAccess: typeof import('@vueuse/core')['useFileSystemAccess']
|
||||
const useFocus: typeof import('@vueuse/core')['useFocus']
|
||||
const useFocusWithin: typeof import('@vueuse/core')['useFocusWithin']
|
||||
const useFps: typeof import('@vueuse/core')['useFps']
|
||||
const useFullscreen: typeof import('@vueuse/core')['useFullscreen']
|
||||
const useGamepad: typeof import('@vueuse/core')['useGamepad']
|
||||
const useGeolocation: typeof import('@vueuse/core')['useGeolocation']
|
||||
const useHttp: typeof import('./composables/useHttp.js')['useHttp']
|
||||
const useId: typeof import('vue')['useId']
|
||||
const useIdle: typeof import('@vueuse/core')['useIdle']
|
||||
const useImage: typeof import('@vueuse/core')['useImage']
|
||||
const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll']
|
||||
const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver']
|
||||
const useInterval: typeof import('@vueuse/core')['useInterval']
|
||||
const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn']
|
||||
const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier']
|
||||
const useLastChanged: typeof import('@vueuse/core')['useLastChanged']
|
||||
const useLink: typeof import('vue-router')['useLink']
|
||||
const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage']
|
||||
const useMagicKeys: typeof import('@vueuse/core')['useMagicKeys']
|
||||
const useManualRefHistory: typeof import('@vueuse/core')['useManualRefHistory']
|
||||
const useMediaControls: typeof import('@vueuse/core')['useMediaControls']
|
||||
const useMediaQuery: typeof import('@vueuse/core')['useMediaQuery']
|
||||
const useMemoize: typeof import('@vueuse/core')['useMemoize']
|
||||
const useMemory: typeof import('@vueuse/core')['useMemory']
|
||||
const useModel: typeof import('vue')['useModel']
|
||||
const useMounted: typeof import('@vueuse/core')['useMounted']
|
||||
const useMouse: typeof import('@vueuse/core')['useMouse']
|
||||
const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement']
|
||||
const useMousePressed: typeof import('@vueuse/core')['useMousePressed']
|
||||
const useMutationObserver: typeof import('@vueuse/core')['useMutationObserver']
|
||||
const useNavigatorLanguage: typeof import('@vueuse/core')['useNavigatorLanguage']
|
||||
const useNetwork: typeof import('@vueuse/core')['useNetwork']
|
||||
const useNow: typeof import('@vueuse/core')['useNow']
|
||||
const useObjectUrl: typeof import('@vueuse/core')['useObjectUrl']
|
||||
const useOffsetPagination: typeof import('@vueuse/core')['useOffsetPagination']
|
||||
const useOnline: typeof import('@vueuse/core')['useOnline']
|
||||
const usePageLeave: typeof import('@vueuse/core')['usePageLeave']
|
||||
const useParallax: typeof import('@vueuse/core')['useParallax']
|
||||
const useParentElement: typeof import('@vueuse/core')['useParentElement']
|
||||
const usePerformanceObserver: typeof import('@vueuse/core')['usePerformanceObserver']
|
||||
const usePermission: typeof import('@vueuse/core')['usePermission']
|
||||
const usePointer: typeof import('@vueuse/core')['usePointer']
|
||||
const usePointerLock: typeof import('@vueuse/core')['usePointerLock']
|
||||
const usePointerSwipe: typeof import('@vueuse/core')['usePointerSwipe']
|
||||
const usePreferredColorScheme: typeof import('@vueuse/core')['usePreferredColorScheme']
|
||||
const usePreferredContrast: typeof import('@vueuse/core')['usePreferredContrast']
|
||||
const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark']
|
||||
const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages']
|
||||
const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion']
|
||||
const usePrevious: typeof import('@vueuse/core')['usePrevious']
|
||||
const useRafFn: typeof import('@vueuse/core')['useRafFn']
|
||||
const useRefHistory: typeof import('@vueuse/core')['useRefHistory']
|
||||
const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver']
|
||||
const useRoute: typeof import('vue-router')['useRoute']
|
||||
const useRouter: typeof import('vue-router')['useRouter']
|
||||
const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation']
|
||||
const useScreenSafeArea: typeof import('@vueuse/core')['useScreenSafeArea']
|
||||
const useScriptTag: typeof import('@vueuse/core')['useScriptTag']
|
||||
const useScroll: typeof import('@vueuse/core')['useScroll']
|
||||
const useScrollLock: typeof import('@vueuse/core')['useScrollLock']
|
||||
const useSessionStorage: typeof import('@vueuse/core')['useSessionStorage']
|
||||
const useShare: typeof import('@vueuse/core')['useShare']
|
||||
const useSlots: typeof import('vue')['useSlots']
|
||||
const useSorted: typeof import('@vueuse/core')['useSorted']
|
||||
const useSpeechRecognition: typeof import('@vueuse/core')['useSpeechRecognition']
|
||||
const useSpeechSynthesis: typeof import('@vueuse/core')['useSpeechSynthesis']
|
||||
const useStepper: typeof import('@vueuse/core')['useStepper']
|
||||
const useStorage: typeof import('@vueuse/core')['useStorage']
|
||||
const useStorageAsync: typeof import('@vueuse/core')['useStorageAsync']
|
||||
const useStyleTag: typeof import('@vueuse/core')['useStyleTag']
|
||||
const useSupported: typeof import('@vueuse/core')['useSupported']
|
||||
const useSwipe: typeof import('@vueuse/core')['useSwipe']
|
||||
const useTemplateRef: typeof import('vue')['useTemplateRef']
|
||||
const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList']
|
||||
const useTextDirection: typeof import('@vueuse/core')['useTextDirection']
|
||||
const useTextSelection: typeof import('@vueuse/core')['useTextSelection']
|
||||
const useTextareaAutosize: typeof import('@vueuse/core')['useTextareaAutosize']
|
||||
const useThrottle: typeof import('@vueuse/core')['useThrottle']
|
||||
const useThrottleFn: typeof import('@vueuse/core')['useThrottleFn']
|
||||
const useThrottledRefHistory: typeof import('@vueuse/core')['useThrottledRefHistory']
|
||||
const useTimeAgo: typeof import('@vueuse/core')['useTimeAgo']
|
||||
const useTimeout: typeof import('@vueuse/core')['useTimeout']
|
||||
const useTimeoutFn: typeof import('@vueuse/core')['useTimeoutFn']
|
||||
const useTimeoutPoll: typeof import('@vueuse/core')['useTimeoutPoll']
|
||||
const useTimestamp: typeof import('@vueuse/core')['useTimestamp']
|
||||
const useTitle: typeof import('@vueuse/core')['useTitle']
|
||||
const useToNumber: typeof import('@vueuse/core')['useToNumber']
|
||||
const useToString: typeof import('@vueuse/core')['useToString']
|
||||
const useToggle: typeof import('@vueuse/core')['useToggle']
|
||||
const useTransition: typeof import('@vueuse/core')['useTransition']
|
||||
const useUni: typeof import('./composables/useUni.js')['useUni']
|
||||
const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams']
|
||||
const useUserMedia: typeof import('@vueuse/core')['useUserMedia']
|
||||
const useVModel: typeof import('@vueuse/core')['useVModel']
|
||||
const useVModels: typeof import('@vueuse/core')['useVModels']
|
||||
const useVibrate: typeof import('@vueuse/core')['useVibrate']
|
||||
const useVirtualList: typeof import('@vueuse/core')['useVirtualList']
|
||||
const useWakeLock: typeof import('@vueuse/core')['useWakeLock']
|
||||
const useWebNotification: typeof import('@vueuse/core')['useWebNotification']
|
||||
const useWebSocket: typeof import('@vueuse/core')['useWebSocket']
|
||||
const useWebView: typeof import('./composables/useWebView.js')['useWebView']
|
||||
const useWebWorker: typeof import('@vueuse/core')['useWebWorker']
|
||||
const useWebWorkerFn: typeof import('@vueuse/core')['useWebWorkerFn']
|
||||
const useWindowFocus: typeof import('@vueuse/core')['useWindowFocus']
|
||||
const useWindowScroll: typeof import('@vueuse/core')['useWindowScroll']
|
||||
const useWindowSize: typeof import('@vueuse/core')['useWindowSize']
|
||||
const watch: typeof import('vue')['watch']
|
||||
const watchArray: typeof import('@vueuse/core')['watchArray']
|
||||
const watchAtMost: typeof import('@vueuse/core')['watchAtMost']
|
||||
const watchDebounced: typeof import('@vueuse/core')['watchDebounced']
|
||||
const watchDeep: typeof import('@vueuse/core')['watchDeep']
|
||||
const watchEffect: typeof import('vue')['watchEffect']
|
||||
const watchIgnorable: typeof import('@vueuse/core')['watchIgnorable']
|
||||
const watchImmediate: typeof import('@vueuse/core')['watchImmediate']
|
||||
const watchOnce: typeof import('@vueuse/core')['watchOnce']
|
||||
const watchPausable: typeof import('@vueuse/core')['watchPausable']
|
||||
const watchPostEffect: typeof import('vue')['watchPostEffect']
|
||||
const watchSyncEffect: typeof import('vue')['watchSyncEffect']
|
||||
const watchThrottled: typeof import('@vueuse/core')['watchThrottled']
|
||||
const watchTriggerable: typeof import('@vueuse/core')['watchTriggerable']
|
||||
const watchWithFilter: typeof import('@vueuse/core')['watchWithFilter']
|
||||
const whenever: typeof import('@vueuse/core')['whenever']
|
||||
}
|
||||
// for type re-export
|
||||
declare global {
|
||||
// @ts-ignore
|
||||
export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
|
||||
import('vue')
|
||||
}
|
175
src/components/Authorization.vue
Normal file
@ -0,0 +1,175 @@
|
||||
<template>
|
||||
<div class=" bg-gray-100 flex flex-col p-4">
|
||||
<!-- 标题 -->
|
||||
<div class="text-center text-2xl font-bold mb-4">授权书</div>
|
||||
|
||||
<!-- 授权书滚动区域 -->
|
||||
<div class="card flex-1 overflow-y-auto" ref="agreementBox" @scroll="handleScroll">
|
||||
<p class="my-2">海南天远大数据科技有限公司:</p>
|
||||
<p class="indent-[2em]">
|
||||
本人<span class="font-bold">
|
||||
{{ signature ? props.name : "____________" }}</span>
|
||||
拟向贵司申请大数据分析报告查询业务,贵司需要了解本人相关状况,用于查询大数据分析报告,因此本人同意向贵司提供本人的姓名和手机号等个人信息,并同意贵司向第三方(包括但不限于西部数据交易有限公司)传送上述信息。第三方将使用上述信息核实信息真实情况,查询信用记录,并生成报告。
|
||||
</p>
|
||||
<p class="mt-2 font-bold">授权内容如下:</p>
|
||||
<ol class="list-decimal pl-6">
|
||||
<li>
|
||||
贵司向依法成立的第三方服务商(包括但不限于西部数据交易有限公司)根据本人提交的信息进行核实,并有权通过前述第三方服务机构查询、使用本人的身份信息、设备信息、运营商信息等,查询本人信息(包括但不限于学历、婚姻、资产状况及对信息主体产生负面影响的不良信息),出具相关报告。
|
||||
</li>
|
||||
<li>
|
||||
依法成立的第三方服务商查询或核实、搜集、保存、处理、共享、使用(含合法业务应用)本人相关数据,且不再另行告知本人,但法律、法规、监管政策禁止的除外。
|
||||
</li>
|
||||
<!-- <li>本人授权本业务推广方( )可浏览本人大数据报告。</li> -->
|
||||
<li>
|
||||
本人授权有效期为自授权之日起
|
||||
1个月。本授权为不可撤销授权,但法律法规另有规定的除外。
|
||||
</li>
|
||||
</ol>
|
||||
<p class="mt-2 font-bold">用户声明与承诺:</p>
|
||||
<ul class="list-decimal pl-6">
|
||||
<li>
|
||||
本人在授权签署前,已通过实名认证及动态验证码验证(或其他身份验证手段),确认本授权行为为本人真实意思表示,平台已履行身份验证义务。
|
||||
</li>
|
||||
<li>
|
||||
本人在此声明已充分理解上述授权条款含义,知晓并自愿承担因授权数据使用可能带来的后果,包括但不限于影响个人信用评分、生活行为等。本人确认授权范围内的相关信息由本人提供并真实有效。
|
||||
</li>
|
||||
<li>
|
||||
若用户冒名签署或提供虚假信息,由用户自行承担全部法律责任,平台不承担任何后果。
|
||||
</li>
|
||||
</ul>
|
||||
<p class="mt-2 font-bold">特别提示:</p>
|
||||
<ul class="list-decimal pl-6">
|
||||
<li>
|
||||
本产品所有数据均来自第三方。可能部分数据未公开、数据更新延迟或信息受到限制,贵司不对数据的准确性、真实性、完整性做任何承诺。用户需根据实际情况,结合报告内容自行判断与决策。
|
||||
</li>
|
||||
<li>
|
||||
本产品仅供用户本人查询或被授权查询。除非用户取得合法授权,用户不得利用本产品查询他人信息。用户因未获得合法授权而擅自查询他人信息所产生的任何后果,由用户自行承担责任。
|
||||
</li>
|
||||
<li>
|
||||
本授权书涉及对本人敏感信息(包括但不限于婚姻状况、资产状况等)的查询与使用。本人已充分知晓相关信息的敏感性,并明确同意贵司及其合作方依据授权范围使用相关信息。
|
||||
</li>
|
||||
<li>
|
||||
平台声明:本授权书涉及的信息核实及查询结果由第三方服务商提供,平台不对数据的准确性、完整性、实时性承担责任;用户根据报告所作决策的风险由用户自行承担,平台对此不承担法律责任。
|
||||
</li>
|
||||
<li>
|
||||
本授权书中涉及的数据查询和报告生成由依法成立的第三方服务商提供。若因第三方行为导致数据错误或损失,用户应向第三方主张权利,平台不承担相关责任。
|
||||
</li>
|
||||
</ul>
|
||||
<p class="mt-2 font-bold">附加说明:</p>
|
||||
<ul class="list-decimal pl-6">
|
||||
<li>
|
||||
本人在授权的相关数据将依据法律法规及贵司内部数据管理规范妥善存储,存储期限为法律要求的最短必要时间。超过存储期限或在数据使用目的达成后,贵司将对相关数据进行销毁或匿名化处理。
|
||||
</li>
|
||||
<li>
|
||||
本人有权随时撤回本授权书中的授权,但撤回前的授权行为及其法律后果仍具有法律效力。若需撤回授权,本人可通过贵司官方渠道提交书面申请,贵司将在收到申请后依法停止对本人数据的使用。
|
||||
</li>
|
||||
<li>
|
||||
你通过“天远数据”,自愿支付相应费用,用于购买海南天远大数据科技有限公司的大数据报告产品。如若对产品内容存在异议,可通过邮箱admin@iieeii.com或APP“联系客服”按钮进行反馈,贵司将在收到异议之日起20日内进行核查和处理,并将结果答复。
|
||||
</li>
|
||||
<li>
|
||||
你向海南天远大数据科技有限公司的支付方式为:海南天远大数据科技有限公司及其经官方授权的相关企业的支付宝账户。
|
||||
</li>
|
||||
</ul>
|
||||
<p class="mt-2 font-bold">争议解决机制:</p>
|
||||
<ul>
|
||||
<li>
|
||||
若因本授权书引发争议,双方应友好协商解决;协商不成的,双方同意将争议提交至授权书签署地(海南省)有管辖权的人民法院解决。
|
||||
</li>
|
||||
</ul>
|
||||
<p class="mt-2 font-bold">签署方式的法律效力声明:</p>
|
||||
<ul>
|
||||
<li>
|
||||
本授权书通过用户在线勾选、电子签名或其他网络签署方式完成,与手写签名具有同等法律效力。平台已通过技术手段保存签署过程的完整记录,作为用户真实意思表示的证据。
|
||||
</li>
|
||||
</ul>
|
||||
<p class="mt-2">本授权书于 {{ signTime }}生效。</p>
|
||||
<p class="mt-4 font-bold">
|
||||
签署人:<span class="underline">{{
|
||||
signature ? props.name : "____________"
|
||||
}}</span>
|
||||
<br />
|
||||
手机号码:<span class="underline">
|
||||
{{ signature ? props.mobile : "____________" }}
|
||||
</span>
|
||||
<br />
|
||||
签署时间:<span class="underline">{{ signTime }}</span>
|
||||
</p>
|
||||
</div>
|
||||
<!-- 操作按钮 -->
|
||||
<div class="mt-4 flex justify-between">
|
||||
<button class="flex-shrink-0 bg-red-500 text-white px-4 py-2 rounded-lg" @click="cancel">
|
||||
取消
|
||||
</button>
|
||||
<div class="mt-2 px-2 text-center text-sm text-gray-500">
|
||||
{{ scrollMessage }}
|
||||
</div>
|
||||
<button class="flex-shrink-0 bg-blue-500 text-white px-4 py-2 rounded-lg active:bg-blue-600" :class="!canAgree &&
|
||||
'bg-gray-300 cursor-not-allowed active:bg-gray-300'
|
||||
" :disabled="!canAgree" @click="agree">
|
||||
{{ signature ? "同意" : "签署" }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script setup>
|
||||
import { ref, onMounted } from "vue";
|
||||
const emit = defineEmits(['agreed', 'cancel']); // 定义事件
|
||||
const props = defineProps({
|
||||
name: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
idCard: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
mobile: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
})
|
||||
|
||||
const signature = ref(false);
|
||||
const formatDate = (date) => {
|
||||
const options = { year: "numeric", month: "long", day: "numeric" };
|
||||
return new Intl.DateTimeFormat("zh-CN", options).format(date);
|
||||
};
|
||||
const signTime = ref(formatDate(new Date()));
|
||||
|
||||
const canAgree = ref(false); // 同意按钮状态
|
||||
const scrollMessage = ref("请滑动并阅读完整授权书以继续");
|
||||
|
||||
// 滚动事件处理
|
||||
let timeout = null;
|
||||
|
||||
const handleScroll = (event) => {
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(() => {
|
||||
const element = event.target;
|
||||
if (
|
||||
Math.abs(
|
||||
element.scrollHeight - element.scrollTop - element.clientHeight
|
||||
) <= 50
|
||||
) {
|
||||
canAgree.value = true;
|
||||
scrollMessage.value = "您已阅读完整授权书,可以继续";
|
||||
}
|
||||
}, 100);
|
||||
};
|
||||
// 用户同意
|
||||
const agree = () => {
|
||||
if (signature.value) {
|
||||
emit("agreed")
|
||||
return
|
||||
}
|
||||
signature.value = true
|
||||
};
|
||||
|
||||
// 用户取消
|
||||
const cancel = () => {
|
||||
emit("cancel")
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
333
src/components/CarNumberInput.vue
Normal file
87
src/components/LButtonGroup.vue
Normal file
@ -0,0 +1,87 @@
|
||||
<script setup>
|
||||
// 接收 type 和 options props 以及 v-model
|
||||
const props = defineProps({
|
||||
type: {
|
||||
type: String,
|
||||
default: 'purple-pink', // 默认颜色渐变
|
||||
},
|
||||
options: {
|
||||
type: Array,
|
||||
required: true, // 动态传入选项
|
||||
},
|
||||
modelValue: {
|
||||
type: String,
|
||||
default: '', // v-model 绑定的值
|
||||
},
|
||||
})
|
||||
const emit = defineEmits(['update:modelValue'])
|
||||
// 选中内容绑定 v-model
|
||||
const selected = ref(props.modelValue)
|
||||
|
||||
// 监听 v-model 的变化
|
||||
watch(() => props.modelValue, (newValue) => {
|
||||
selected.value = newValue
|
||||
})
|
||||
|
||||
// 根据type动态生成分割线的类名
|
||||
const lineClass = computed(() => {
|
||||
switch (props.type) {
|
||||
case 'blue-green':
|
||||
return 'bg-gradient-to-r from-blue-400 via-green-500 to-teal-500'
|
||||
case 'orange-yellow':
|
||||
return 'bg-gradient-to-r from-orange-400 via-yellow-500 to-yellow-600'
|
||||
case 'red-purple':
|
||||
return 'bg-gradient-to-r from-red-500 via-purple-500 to-purple-600'
|
||||
default:
|
||||
return 'bg-gradient-to-r from-purple-400 via-pink-500 to-red-500'
|
||||
}
|
||||
})
|
||||
|
||||
// 计算滑动线的位置和宽度
|
||||
const slideLineStyle = computed(() => {
|
||||
const index = props.options.findIndex(option => option.value === selected.value)
|
||||
const buttonWidth = 100 / props.options.length
|
||||
return {
|
||||
width: `${buttonWidth}%`,
|
||||
transform: `translateX(${index * 100}%)`,
|
||||
}
|
||||
})
|
||||
|
||||
// 选择选项函数
|
||||
function selectOption(option) {
|
||||
selected.value = option.value
|
||||
// 触发 v-model 的更新
|
||||
emit('update:modelValue', option.value)
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="relative flex">
|
||||
<div
|
||||
v-for="(option, index) in options"
|
||||
:key="index"
|
||||
class="flex-1 shrink-0 cursor-pointer py-2 text-center text-size-sm font-bold transition-transform duration-200 ease-in-out"
|
||||
:class="{ 'text-gray-900': selected === option.value, 'text-gray-500': selected !== option.value }"
|
||||
@click="selectOption(option)"
|
||||
>
|
||||
{{ option.label }}
|
||||
</div>
|
||||
<div
|
||||
class="absolute bottom-0 h-[3px] rounded transition-all duration-300"
|
||||
:style="slideLineStyle"
|
||||
:class="lineClass"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
/* 自定义样式 */
|
||||
button {
|
||||
outline: none;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
button:focus {
|
||||
outline: none;
|
||||
}
|
||||
</style>
|
38
src/components/LEmpty.vue
Normal file
@ -0,0 +1,38 @@
|
||||
<template>
|
||||
<div class="card flex flex-col items-center justify-center text-center">
|
||||
<!-- 图片插画 -->
|
||||
<img src="@/assets/images/empty.svg" alt="空状态" class="w-64 h-64" />
|
||||
|
||||
<!-- 提示文字 -->
|
||||
<h2 class="text-xl font-semibold text-gray-700 mb-2">
|
||||
没有查询到相关结果
|
||||
</h2>
|
||||
<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>
|
||||
|
||||
<!-- 返回按钮 -->
|
||||
<button @click="goBack"
|
||||
class="mt-4 px-6 py-2 text-white bg-blue-500 rounded-lg hover:bg-blue-600 transition duration-300 ease-in-out">
|
||||
返回上一页
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
const route = useRoute();
|
||||
|
||||
|
||||
// 返回上一页逻辑
|
||||
function goBack() {
|
||||
route.goBack()
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 你可以添加一些额外的样式(如果需要) */
|
||||
</style>
|
55
src/components/LExpandCollapse.vue
Normal file
@ -0,0 +1,55 @@
|
||||
<script setup>
|
||||
import { computed, ref, useSlots } from 'vue'
|
||||
|
||||
// 接收最大长度的 prop,默认值 100
|
||||
const props = defineProps({
|
||||
maxLength: {
|
||||
type: Number,
|
||||
default: 100,
|
||||
},
|
||||
})
|
||||
|
||||
// 记录当前是否展开
|
||||
const isExpanded = ref(false)
|
||||
|
||||
// 获取 slot 内容
|
||||
const slots = useSlots()
|
||||
|
||||
// 计算截断后的内容
|
||||
const truncatedContent = computed(() => {
|
||||
const slotContent = getSlotContent()
|
||||
return slotContent.length > props.maxLength
|
||||
? `${slotContent.slice(0, props.maxLength)}...`
|
||||
: slotContent
|
||||
})
|
||||
|
||||
// 获取 slot 内容,确保返回的内容为字符串
|
||||
function getSlotContent() {
|
||||
const slotVNode = slots.default ? slots.default()[0] : null
|
||||
return slotVNode ? slotVNode.children.toString().trim() : '' // 获取并转化为字符串
|
||||
}
|
||||
|
||||
// 切换展开/收起状态
|
||||
function toggleExpand() {
|
||||
isExpanded.value = !isExpanded.value
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<!-- 展开/收起按钮 -->
|
||||
|
||||
<!-- 展开/收起的内容 -->
|
||||
<text v-if="isExpanded">
|
||||
<slot /> <!-- 使用 slot 来展示传递的内容 -->
|
||||
</text>
|
||||
<text v-else>
|
||||
<text>{{ truncatedContent }}</text>
|
||||
</text>
|
||||
<text :title="isExpanded ? '点击收起' : '点击展开'" class="cursor-pointer text-blue-500" @click="toggleExpand">
|
||||
{{ isExpanded ? '收起' : '展开' }}
|
||||
</text>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
71
src/components/LPendding.vue
Normal file
@ -0,0 +1,71 @@
|
||||
<template>
|
||||
<div class="card flex flex-col items-center justify-center text-center">
|
||||
<!-- 图片插画 -->
|
||||
<img src="@/assets/images/pendding.svg" alt="查询中" class="w-64 h-64" />
|
||||
|
||||
<!-- 提示文字 -->
|
||||
<h2 class="text-xl font-semibold text-gray-700 mb-2 floating-text">
|
||||
报告正在查询中
|
||||
</h2>
|
||||
<p class="text-gray-500 text-sm mb-2 leading-relaxed">
|
||||
请稍候,我们正在为您查询报告。查询过程可能需要一些时间。
|
||||
</p>
|
||||
<p class="text-gray-400 text-xs mb-4">
|
||||
您可以稍后刷新页面查看结果,或之后访问历史报告列表查看。
|
||||
</p>
|
||||
<p class="text-gray-400 text-xs mb-4">
|
||||
如过久未查询成功,请联系客服为您处理
|
||||
</p>
|
||||
<!-- 按钮组 -->
|
||||
<div class="flex gap-4">
|
||||
<!-- 刷新按钮 -->
|
||||
<button @click="refreshPage"
|
||||
class="px-6 py-2 text-white bg-blue-500 rounded-lg hover:bg-blue-600 transition duration-300 ease-in-out">
|
||||
刷新页面
|
||||
</button>
|
||||
<!-- 历史报告按钮 -->
|
||||
<button @click="viewHistory"
|
||||
class="px-6 py-2 text-white bg-gray-500 rounded-lg hover:bg-gray-600 transition duration-300 ease-in-out">
|
||||
查看历史报告
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
const router = useRouter();
|
||||
|
||||
// 刷新页面逻辑
|
||||
function refreshPage() {
|
||||
location.reload(); // 浏览器刷新页面
|
||||
}
|
||||
|
||||
// 查看历史报告逻辑
|
||||
function viewHistory() {
|
||||
router.push({ path: '/historyQuery' }); // 假设历史报告页面的路由名为 'historyReports'
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
@keyframes floatUpDown {
|
||||
0% {
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
50% {
|
||||
transform: translateY(-10px);
|
||||
/* 向上浮动 */
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: translateY(0);
|
||||
/* 返回原位 */
|
||||
}
|
||||
}
|
||||
|
||||
/* 给提示文字和其他需要浮动的元素添加动画 */
|
||||
.floating-text {
|
||||
animation: floatUpDown 3s ease-in-out infinite;
|
||||
/* 动画持续3秒,缓入缓出,循环播放 */
|
||||
}
|
||||
</style>
|
98
src/components/LTable.vue
Normal file
@ -0,0 +1,98 @@
|
||||
<script setup>
|
||||
import { computed, onMounted } from "vue";
|
||||
|
||||
// 接收表格数据和类型的 props
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
type: {
|
||||
type: String,
|
||||
default: "purple-pink", // 默认渐变颜色
|
||||
},
|
||||
});
|
||||
// 根据 type 设置不同的渐变颜色(偶数行)
|
||||
const evenClass = computed(() => {
|
||||
switch (props.type) {
|
||||
case "blue-green":
|
||||
return "bg-teal-100/40";
|
||||
// return 'bg-gradient-to-r from-blue-50 via-green-50 to-teal-50'
|
||||
case "orange-yellow":
|
||||
return "bg-gradient-to-r from-orange-50 via-yellow-50 to-yellow-100";
|
||||
case "red-purple":
|
||||
return "bg-gradient-to-r from-red-50 via-purple-50 to-purple-100";
|
||||
default:
|
||||
return "bg-gradient-to-r from-purple-50 via-pink-50 to-red-50";
|
||||
}
|
||||
});
|
||||
|
||||
// 动态计算表头的背景颜色和文本颜色
|
||||
const headerClass = computed(() => {
|
||||
switch (props.type) {
|
||||
case "blue-green":
|
||||
return "bg-teal-200";
|
||||
// return 'bg-gradient-to-r from-blue-200 via-green-200 to-teal-200'
|
||||
case "orange-yellow":
|
||||
return "bg-gradient-to-r from-orange-200 via-yellow-200 to-yellow-200";
|
||||
case "red-purple":
|
||||
return "bg-gradient-to-r from-red-200 via-purple-200 to-purple-200";
|
||||
default:
|
||||
return "bg-gradient-to-r from-purple-200 via-pink-200 to-red-200";
|
||||
}
|
||||
});
|
||||
// 斑马纹样式,偶数行带颜色,奇数行没有颜色,且从第二行开始
|
||||
function zebraClass(index) {
|
||||
return index % 2 === 1 ? evenClass.value : "";
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="l-table overflow-x-auto">
|
||||
<table
|
||||
class="min-w-full border-collapse table-auto text-center text-size-xs"
|
||||
>
|
||||
<thead :class="headerClass">
|
||||
<tr>
|
||||
<!-- 插槽渲染表头 -->
|
||||
<slot name="header" />
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr
|
||||
v-for="(row, index) in props.data"
|
||||
:key="index"
|
||||
:class="zebraClass(index)"
|
||||
class="border-t"
|
||||
>
|
||||
<slot :row="row" />
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
/* 基础表格样式 */
|
||||
th {
|
||||
font-weight: bold;
|
||||
padding: 12px;
|
||||
text-align: left;
|
||||
border: 1px solid #e5e7eb;
|
||||
}
|
||||
|
||||
/* 表格行样式 */
|
||||
td {
|
||||
padding: 12px;
|
||||
border: 1px solid #e5e7eb;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border-spacing: 0;
|
||||
}
|
||||
.l-table {
|
||||
@apply rounded-xl;
|
||||
overflow: hidden;
|
||||
}
|
||||
</style>
|
58
src/components/LTitle.vue
Normal file
@ -0,0 +1,58 @@
|
||||
<script setup>
|
||||
// 接收 props
|
||||
const props = defineProps({
|
||||
title: String,
|
||||
type: {
|
||||
type: String,
|
||||
default: 'purple-pink', // 默认渐变
|
||||
},
|
||||
})
|
||||
|
||||
// 根据type返回不同的背景类名
|
||||
const titleClass = computed(() => {
|
||||
switch (props.type) {
|
||||
case 'blue-green':
|
||||
return 'bg-gradient-to-r from-blue-400 via-green-500 to-teal-500'
|
||||
case 'orange-yellow':
|
||||
return 'bg-gradient-to-r from-orange-400 via-yellow-500 to-yellow-600'
|
||||
case 'red-purple':
|
||||
return 'bg-gradient-to-r from-red-500 via-purple-500 to-purple-600'
|
||||
default:
|
||||
return 'bg-gradient-to-r from-purple-400 via-pink-500 to-red-500'
|
||||
}
|
||||
})
|
||||
|
||||
// 分割线颜色与背景对应
|
||||
const lineClass = computed(() => {
|
||||
switch (props.type) {
|
||||
case 'blue-green':
|
||||
return 'bg-gradient-to-r from-blue-400 via-green-500 to-teal-500'
|
||||
case 'orange-yellow':
|
||||
return 'bg-gradient-to-r from-orange-400 via-yellow-500 to-yellow-600'
|
||||
case 'red-purple':
|
||||
return 'bg-gradient-to-r from-red-500 via-purple-500 to-purple-600'
|
||||
default:
|
||||
return 'bg-gradient-to-r from-purple-400 via-pink-500 to-red-500'
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="relative">
|
||||
<!-- 标题部分 -->
|
||||
<div :class="titleClass" class="inline-block rounded-lg px-2 py-1 text-white font-bold shadow-md">
|
||||
{{ title }}
|
||||
</div>
|
||||
|
||||
<!-- 左上角修饰 -->
|
||||
<div
|
||||
class="absolute left-0 top-0 h-4 w-4 transform rounded-full bg-white shadow-md -translate-x-2 -translate-y-2" />
|
||||
|
||||
<!-- 分割线 -->
|
||||
<div class="relative mt-1.5">
|
||||
<div :class="lineClass" class="h-[2px] w-full rounded" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
100
src/components/Payment.vue
Normal file
@ -0,0 +1,100 @@
|
||||
<template>
|
||||
<van-popup v-model:show="show" position="bottom" class="flex flex-col justify-between p-6"
|
||||
:style="{ height: '50%' }">
|
||||
<div class=" text-center">
|
||||
<h3 class="text-lg font-bold">支付</h3>
|
||||
</div>
|
||||
<div class="text-center">
|
||||
<div class="font-bold text-xl">{{ data.product_name }}</div>
|
||||
<div class="text-3xl text-red-500 font-bold">
|
||||
<!-- 显示原价和折扣价格 -->
|
||||
<div v-if="discountPrice" class="line-through text-gray-500 mt-4"
|
||||
:class="{ 'text-2xl': discountPrice }">
|
||||
¥ {{ data.sell_price }}
|
||||
</div>
|
||||
<div>
|
||||
¥ {{ discountPrice ? (data.sell_price * 0.2).toFixed(2) : data.sell_price }}
|
||||
</div>
|
||||
</div>
|
||||
<!-- 仅在折扣时显示活动说明 -->
|
||||
<div v-if="discountPrice" class="text-sm text-red-500 mt-1">
|
||||
活动价:2折优惠
|
||||
</div>
|
||||
</div>
|
||||
<!-- 支付方式选择 -->
|
||||
<div class="">
|
||||
<van-cell-group inset>
|
||||
<!-- 支付宝支付 -->
|
||||
<van-cell title="支付宝支付" clickable @click="selectedPaymentMethod = 'alipay'">
|
||||
<template #icon>
|
||||
<van-icon size="24" name="alipay" color="#00A1E9" class="mr-2" />
|
||||
</template>
|
||||
<template #right-icon>
|
||||
<van-radio v-model="selectedPaymentMethod" name="alipay" />
|
||||
</template>
|
||||
</van-cell>
|
||||
</van-cell-group>
|
||||
</div>
|
||||
<!-- 确认按钮 -->
|
||||
<div class="">
|
||||
<van-button class="w-full" round type="primary" @click="getPayment">确认支付</van-button>
|
||||
</div>
|
||||
</van-popup>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, defineProps } from 'vue'
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
id: {
|
||||
type: String,
|
||||
required: true,
|
||||
}
|
||||
})
|
||||
const show = defineModel()
|
||||
const orderId = ref("")
|
||||
const selectedPaymentMethod = ref('alipay')
|
||||
const discountPrice = ref(false) // 是否应用折扣
|
||||
onMounted(() => {
|
||||
// let m = localStorage.getItem("m")
|
||||
// let hour = "12"
|
||||
// if (m === "shifenliangzai") {
|
||||
// hour = "00"
|
||||
// }
|
||||
// const currentDate = new Date()
|
||||
// const startDate = new Date(`2025-01-01T${hour}:00:00+08:00`) // 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 // 否则不启用折扣
|
||||
// }
|
||||
})
|
||||
|
||||
async function getPayment() {
|
||||
const { data, error } = await useApiFetch('/pay/payment')
|
||||
.post({
|
||||
id: props.id,
|
||||
pay_method: selectedPaymentMethod.value
|
||||
})
|
||||
.json()
|
||||
|
||||
if (data.value && !error.value) {
|
||||
orderId.value = data.value.data.order_id
|
||||
const prepayUrl = data.value.data.prepay_id;
|
||||
const paymentForm = document.createElement('form');
|
||||
paymentForm.method = 'POST';
|
||||
paymentForm.action = prepayUrl;
|
||||
paymentForm.style.display = 'none';
|
||||
document.body.appendChild(paymentForm);
|
||||
paymentForm.submit();
|
||||
}
|
||||
show.value = false
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
72
src/components/WechatOverlay.vue
Normal file
@ -0,0 +1,72 @@
|
||||
<template>
|
||||
<div v-if="isWeChat" class="wechat-overlay">
|
||||
<div class="wechat-content">
|
||||
<p class="wechat-message">
|
||||
点击右上角的<van-icon class="ml-2" name="weapp-nav" /><br />然后点击在浏览器中打开
|
||||
</p>
|
||||
<img src="@/assets/images/llqdk.jpg" alt="In WeChat" class="wechat-image" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted } from 'vue';
|
||||
|
||||
// 定义一个响应式变量,表示是否在微信环境
|
||||
const isWeChat = ref(false);
|
||||
|
||||
// 检查是否为微信环境
|
||||
const checkIfWeChat = () => {
|
||||
const userAgent = navigator.userAgent.toLowerCase();
|
||||
isWeChat.value = /micromessenger/.test(userAgent);
|
||||
};
|
||||
|
||||
// 在组件挂载后检查环境
|
||||
onMounted(() => {
|
||||
checkIfWeChat();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 遮罩层样式 */
|
||||
.wechat-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: rgba(0, 0, 0, 0.7);
|
||||
z-index: 9999;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
/* 遮罩中的内容 */
|
||||
.wechat-content {
|
||||
text-align: center;
|
||||
color: white;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
/* 图片样式 */
|
||||
.wechat-image {
|
||||
/* position: absolute;
|
||||
bottom: 0;
|
||||
left: 0; */
|
||||
margin-top: 20px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/* 提示信息的样式 */
|
||||
.wechat-message {
|
||||
font-size: 24px;
|
||||
}
|
||||
|
||||
/* 图标样式 */
|
||||
.icon-more-vert {
|
||||
font-size: 20px;
|
||||
margin-left: 5px;
|
||||
}
|
||||
</style>
|
70
src/composables/useApiFetch.js
Normal file
@ -0,0 +1,70 @@
|
||||
// src/plugins/fetch.js
|
||||
import { createFetch } from '@vueuse/core'
|
||||
import router from '@/router' // 假设你使用 Vue Router
|
||||
|
||||
// 创建全局的 fetch 实例
|
||||
const useApiFetch = createFetch({
|
||||
baseUrl: '/api/v1', // 你的 API 基础路径
|
||||
options: {
|
||||
async beforeFetch({ options }) {
|
||||
|
||||
showLoadingToast({
|
||||
message: '加载中...',
|
||||
forbidClick: true,
|
||||
duration: 0, // 设置为 0 表示不会自动关闭
|
||||
loadingType: 'spinner',
|
||||
})
|
||||
// 获取平台信息
|
||||
|
||||
const brand = "qnc"; // 固定的品牌信息
|
||||
|
||||
// 在请求前添加通用的 Header,例如 Authorization
|
||||
const token = localStorage.getItem('token')
|
||||
if (token) {
|
||||
options.headers = {
|
||||
...options.headers,
|
||||
'X-Platform': 'h5', // 添加平台信息
|
||||
'X-Brand': brand, // 添加品牌信息
|
||||
Authorization: `${token}`,
|
||||
}
|
||||
}
|
||||
return { options }
|
||||
},
|
||||
async afterFetch({ data, response }) {
|
||||
closeToast();
|
||||
// 全局处理响应
|
||||
if (response.status === 401) {
|
||||
// 清除本地存储的 token
|
||||
localStorage.removeItem('token')
|
||||
|
||||
// 跳转到登录页
|
||||
router.replace('/login')
|
||||
}
|
||||
|
||||
if (data.code !== 200) {
|
||||
if (data.code !== 200002 && data.code !== 200003) {
|
||||
showToast({ message: data.msg });
|
||||
}
|
||||
}
|
||||
return { data, response }
|
||||
},
|
||||
async onFetchError({ error, response }) {
|
||||
console.log("error", error)
|
||||
closeToast();
|
||||
if (response.status === 401) {
|
||||
// 清除本地存储的 token
|
||||
localStorage.removeItem('token')
|
||||
|
||||
// 跳转到登录页
|
||||
router.replace('/login')
|
||||
} else {
|
||||
if (typeof error === 'string') {
|
||||
showToast({ message: error });
|
||||
}
|
||||
}
|
||||
return { error }
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
export default useApiFetch
|
27
src/composables/useHttp.js
Normal file
@ -0,0 +1,27 @@
|
||||
import { useFetch, createFetch } from '@vueuse/core';
|
||||
|
||||
export function useHttp(url, options = {}, token) {
|
||||
const fetch = createFetch(url, {
|
||||
baseUrl: '/api/v1',
|
||||
options: {
|
||||
async beforeFetch({ url, options, cancel }) {
|
||||
console.log("asdasd", options)
|
||||
options.headers = {
|
||||
...options.headers,
|
||||
Authorization: `${token}`,
|
||||
}
|
||||
return {
|
||||
options,
|
||||
}
|
||||
},
|
||||
async afterFetch(ctx) {
|
||||
console.log("ctx", ctx)
|
||||
// if (ctx.data.code !== 200) {
|
||||
// throw new Error(ctx.data.message || '请求失败');
|
||||
// }
|
||||
return ctx;
|
||||
},
|
||||
}
|
||||
})
|
||||
return fetch(url)
|
||||
}
|
130
src/composables/useWebView.js
Normal file
@ -0,0 +1,130 @@
|
||||
import { ref, onMounted } from "vue";
|
||||
import "@/assets/uni-webview"
|
||||
|
||||
export function useWebView() {
|
||||
const platform = ref("");
|
||||
const token = ref("");
|
||||
// 检测环境并通知父窗口加载完毕
|
||||
const handleBridgeReady = () => {
|
||||
if (platform.value) {
|
||||
h5PostMessage("loaded", true);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// 获取 Token(从 URL 中解析)
|
||||
const getTokenFromUrl = () => {
|
||||
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;
|
||||
};
|
||||
|
||||
// 封装 postMessage 方法
|
||||
const postMessage = (data) => {
|
||||
if (platform.value === "h5") {
|
||||
h5PostMessage("postMessage", data);
|
||||
} else if (uni && uni.webView.postMessage) {
|
||||
uni.webView.postMessage(data);
|
||||
} else {
|
||||
console.error("uni.webView.postMessage is not available.");
|
||||
}
|
||||
};
|
||||
|
||||
const redirectTo = (data) => {
|
||||
if (platform.value === "h5") {
|
||||
h5PostMessage("redirectTo", data)
|
||||
} else if (uni && uni.webView.redirectTo) {
|
||||
// 非 H5 环境,调用 uni.webView.redirectTo
|
||||
uni.webView.redirectTo(data);
|
||||
} else {
|
||||
console.error("uni.webView.redirectTo is not available.");
|
||||
}
|
||||
};
|
||||
|
||||
// 封装 navigateBack 方法
|
||||
const navigateBack = (data) => {
|
||||
if (platform.value === "h5") {
|
||||
window.top.history.back();
|
||||
// h5PostMessage("navigateBack", data)
|
||||
} else if (uni && uni.webView.navigateBack) {
|
||||
// 非 H5 环境,调用 uni.webView.navigateBack
|
||||
uni.webView.navigateBack(data);
|
||||
} else {
|
||||
console.error("uni.webView.navigateBack is not available.");
|
||||
}
|
||||
};
|
||||
|
||||
// 封装 navigateTo 方法
|
||||
const navigateTo = (data) => {
|
||||
if (platform.value === "h5") {
|
||||
// h5PostMessage("navigateTo", data)
|
||||
window.top.location.href = "/app" + data.url
|
||||
} else if (uni && uni.webView.navigateTo) {
|
||||
uni.webView.navigateTo(data);
|
||||
} else {
|
||||
console.error("uni.webView.navigateTo is not available.");
|
||||
}
|
||||
};
|
||||
const payment = (data) => {
|
||||
if (platform.value === "h5") {
|
||||
h5PostMessage("payment", data)
|
||||
} else if (uni && uni.webView.navigateTo) {
|
||||
// 非 H5 环境,调用 uni.webView.navigateTo
|
||||
uni.webView.navigateTo(data);
|
||||
} else {
|
||||
console.error("uni.webView.navigateTo is not available.");
|
||||
}
|
||||
}
|
||||
const getEnv = () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
let env = localStorage.getItem(platform)
|
||||
if (env) {
|
||||
platform.value = env
|
||||
resolve(env);
|
||||
} else {
|
||||
uni.webView.getEnv((env) => {
|
||||
// 遍历 env 对象,找到值为 true 的键
|
||||
const platformKey = Object.keys(env).find(key => env[key] === true);
|
||||
platform.value = platformKey;
|
||||
if (platformKey) {
|
||||
resolve(platformKey); // 返回键名(如 'h5', 'mp-weixin' 等)
|
||||
} else {
|
||||
reject('未知平台');
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
onMounted(async () => {
|
||||
try {
|
||||
const envValue = await getEnv();
|
||||
console.log("当前环境", envValue)
|
||||
// 将返回的键名(如 'h5', 'mp-weixin')存储到 platform
|
||||
handleBridgeReady();
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
// 获取 Token
|
||||
getTokenFromUrl();
|
||||
});
|
||||
|
||||
return {
|
||||
platform,
|
||||
token,
|
||||
getEnv,
|
||||
redirectTo,
|
||||
postMessage,
|
||||
navigateTo,
|
||||
navigateBack,
|
||||
payment
|
||||
};
|
||||
}
|
||||
const h5PostMessage = (action, data) => {
|
||||
window.parent.postMessage({ action, data, messageId: generateUniqueId(action) }, "*");
|
||||
}
|
||||
const generateUniqueId = (action) => `msg_${action}_${new Date().getTime()}`;
|
93
src/layouts/GlobalLayout.vue
Normal file
@ -0,0 +1,93 @@
|
||||
<template>
|
||||
<router-view />
|
||||
<van-popup v-model:show="showPopup" round @click-overlay="onClickOverlay">
|
||||
<div class="popup-content text-center p-8">
|
||||
<div v-html="currentNotify?.content"></div>
|
||||
<div class="flex justify-center">
|
||||
<van-button type="primary" @click="showPopup = false" class="w-24">关闭</van-button>
|
||||
</div>
|
||||
</div>
|
||||
</van-popup>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted, watch } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
|
||||
// 响应式变量
|
||||
const showPopup = ref(false)
|
||||
const notify = ref([])
|
||||
const currentNotify = ref(null)
|
||||
|
||||
// 获取当前页面路径
|
||||
const route = useRoute()
|
||||
|
||||
// 获取通知数据
|
||||
onMounted(() => {
|
||||
getGlobalNotify()
|
||||
})
|
||||
|
||||
// 获取通知数据
|
||||
const getGlobalNotify = async () => {
|
||||
const { data, error } = await useApiFetch("/notification/list")
|
||||
.get()
|
||||
.json()
|
||||
|
||||
if (data.value && !error.value) {
|
||||
if (data.value !== 200) {
|
||||
notify.value = data.value.data.notifications
|
||||
checkNotification() // 在获取数据后检查通知
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 判断当前时间是否在通知的时间范围内
|
||||
const isWithinTimeRange = (startTime, endTime) => {
|
||||
const now = new Date()
|
||||
|
||||
// 获取当前时间的小时和分钟
|
||||
const currentMinutes = now.getHours() * 60 + now.getMinutes()
|
||||
|
||||
// 将 startTime 和 endTime 转换为分钟数
|
||||
const startParts = startTime.split(':').map(Number)
|
||||
const endParts = endTime.split(':').map(Number)
|
||||
const startMinutes = startParts[0] * 60 + startParts[1]
|
||||
const endMinutes = endParts[0] * 60 + endParts[1]
|
||||
|
||||
// 如果 endTime 小于 startTime,表示跨越了午夜
|
||||
if (endMinutes < startMinutes) {
|
||||
// 判断当前时间是否在 [startTime, 23:59:59] 或 [00:00:00, endTime] 之间
|
||||
return currentMinutes >= startMinutes || currentMinutes < endMinutes
|
||||
}
|
||||
|
||||
// 普通情况,直接判断时间是否在范围内
|
||||
return currentMinutes >= startMinutes && currentMinutes <= endMinutes
|
||||
}
|
||||
// 检查通知并更新showPopup
|
||||
const checkNotification = () => {
|
||||
// 遍历通知数组,找到第一个符合条件的通知
|
||||
for (let notification of notify.value) {
|
||||
// 判断时间是否符合当前时间
|
||||
const isTimeValid = isWithinTimeRange(notification.startTime, notification.endTime)
|
||||
// 判断页面是否符合
|
||||
|
||||
if (isTimeValid && notification.notificationPage === route.path) {
|
||||
currentNotify.value = notification
|
||||
showPopup.value = true
|
||||
break // 只显示第一个符合的通知
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 监听路由变化
|
||||
watch(() => route.path, () => {
|
||||
checkNotification() // 每次路由变化时重新判断通知
|
||||
})
|
||||
|
||||
// 关闭弹窗
|
||||
const onClickOverlay = () => {
|
||||
showPopup.value = false
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
139
src/layouts/HomeLayout.vue
Normal file
@ -0,0 +1,139 @@
|
||||
<template>
|
||||
<div class="home-layout min-h-screen flex flex-col">
|
||||
<!-- Header -->
|
||||
<div class="header">
|
||||
<img class="logo rounded-full overflow-hidden" src="@/assets/images/logo.png" alt="Logo" />
|
||||
<div class="title">天远数据</div>
|
||||
</div>
|
||||
|
||||
<!-- Content Area -->
|
||||
<div class="content flex flex-col flex-1">
|
||||
<router-view />
|
||||
</div>
|
||||
|
||||
<!-- Vant Tabbar -->
|
||||
|
||||
<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备2024048057号-2
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
海南天远大数据科技有限公司版权所有
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import { useRoute, useRouter } from 'vue-router'; // 引入 Vue Router
|
||||
|
||||
|
||||
const router = useRouter();
|
||||
const route = useRoute();
|
||||
const tabbar = ref('index');
|
||||
const menu = reactive([
|
||||
{ title: '首页', icon: 'home-o', name: 'index' },
|
||||
{ title: 'AI律师', icon: 'chat-o', name: 'ai' },
|
||||
{ title: '我的', icon: 'user-o', name: 'me' },
|
||||
]);
|
||||
|
||||
// 根据当前路由设置 Tabbar 的高亮项
|
||||
onMounted(() => {
|
||||
const currentPage = route.name; // 获取当前路由的名称
|
||||
tabbar.value = currentPage;
|
||||
});
|
||||
|
||||
const onClickOverlay = () => { }
|
||||
// 跳转到相应页面
|
||||
const tabChange = (name) => {
|
||||
router.push({ name }); // 使用 Vue Router 进行跳转
|
||||
};
|
||||
|
||||
// 跳转到投诉页面
|
||||
const toComplaint = () => {
|
||||
router.push({ name: 'complaint' }); // 使用 Vue Router 进行跳转
|
||||
};
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.home-layout {
|
||||
background: linear-gradient(to bottom, #cfe0fa, #f4f8ff);
|
||||
}
|
||||
|
||||
.header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background-color: white;
|
||||
padding-left: 1rem;
|
||||
padding-right: 1rem;
|
||||
height: 3rem;
|
||||
}
|
||||
|
||||
.logo {
|
||||
width: 2rem;
|
||||
height: 2rem;
|
||||
margin-right: 0.75rem;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 1.25rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.content {
|
||||
/* min-height: calc(100vh - 3rem); */
|
||||
}
|
||||
|
||||
.complaint-button {
|
||||
position: fixed;
|
||||
bottom: 6rem;
|
||||
right: 1rem;
|
||||
background: linear-gradient(to bottom, #e24949, #e4827b);
|
||||
border-radius: 1.5rem;
|
||||
padding: 0.25rem 1rem;
|
||||
color: white;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.complaint-button i {
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
|
||||
.disclaimer {
|
||||
/* margin-top: 24px; */
|
||||
padding: 10px;
|
||||
font-size: 12px;
|
||||
color: #999;
|
||||
text-align: center;
|
||||
border-top: 1px solid #e0e0e0;
|
||||
padding-bottom: 60px;
|
||||
background: #ffffff;
|
||||
}
|
||||
</style>
|
35
src/layouts/PageLayout.vue
Normal file
@ -0,0 +1,35 @@
|
||||
<template>
|
||||
<van-nav-bar fixed :border="false" placeholder :title="pageTitle" left-text="返回" left-arrow
|
||||
@click-left="onClickLeft" />
|
||||
<router-view />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, watch } from 'vue'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
const pageTitle = ref('') // 用来保存页面标题
|
||||
const onClickLeft = () => {
|
||||
if (route.name === 'report') {
|
||||
router.replace('/historyQuery')
|
||||
} else if (route.name === 'history') {
|
||||
router.replace('/')
|
||||
} else {
|
||||
router.back()
|
||||
}
|
||||
}
|
||||
onMounted(() => {
|
||||
})
|
||||
// 监听路由变化并更新标题
|
||||
watch(
|
||||
() => route.meta.title,
|
||||
(newTitle) => {
|
||||
pageTitle.value = newTitle || '默认标题'
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
21
src/main.js
Normal file
@ -0,0 +1,21 @@
|
||||
import 'nprogress/nprogress.css'; // 默认样式,可根据需要自定义样式
|
||||
import './assets/main.css'
|
||||
import { createApp } from 'vue'
|
||||
import { createPinia } from 'pinia'
|
||||
import App from './App.vue'
|
||||
import router from './router'
|
||||
import 'vant/lib/index.css';
|
||||
const app = createApp(App)
|
||||
app.use(createPinia())
|
||||
app.use(router)
|
||||
|
||||
app.mount('#app')
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const loadingElement = document.getElementById('app-loading');
|
||||
if (loadingElement) {
|
||||
loadingElement.style.opacity = '0';
|
||||
setTimeout(() => {
|
||||
loadingElement.parentNode.removeChild(loadingElement);
|
||||
}, 500); // 动画过渡时间
|
||||
}
|
||||
});
|
158
src/router/index.js
Normal file
@ -0,0 +1,158 @@
|
||||
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: [
|
||||
{
|
||||
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: '/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: "/:pathMatch(.*)*",
|
||||
name: "NotFound",
|
||||
component: () => import('@/views/NotFound.vue')
|
||||
},
|
||||
],
|
||||
})
|
||||
NProgress.configure({
|
||||
easing: 'ease', // 动画方式
|
||||
speed: 500, // 递增进度条的速度(毫秒)
|
||||
showSpinner: false, // 是否显示加载的圆圈
|
||||
trickleSpeed: 200, // 自动递增间隔
|
||||
minimum: 0.3, // 初始化最小百分比
|
||||
});
|
||||
|
||||
// 路由导航守卫
|
||||
router.beforeEach((to, from, next) => {
|
||||
NProgress.start(); // 启动进度条
|
||||
next();
|
||||
});
|
||||
|
||||
router.afterEach(() => {
|
||||
NProgress.done(); // 结束进度条
|
||||
});
|
||||
export default router
|
12
src/stores/counter.js
Normal file
@ -0,0 +1,12 @@
|
||||
import { ref, computed } from 'vue'
|
||||
import { defineStore } from 'pinia'
|
||||
|
||||
export const useCounterStore = defineStore('counter', () => {
|
||||
const count = ref(0)
|
||||
const doubleCount = computed(() => count.value * 2)
|
||||
function increment() {
|
||||
count.value++
|
||||
}
|
||||
|
||||
return { count, doubleCount, increment }
|
||||
})
|
265
src/ui/CBad.vue
Normal file
@ -0,0 +1,265 @@
|
||||
<script setup>
|
||||
import { defineProps, onMounted, ref, watch } from "vue";
|
||||
import * as echarts from "echarts"; // 引入 ECharts
|
||||
import LTitle from "@/components/LTitle.vue";
|
||||
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
});
|
||||
|
||||
const chartInstance = ref(null); // ECharts 实例
|
||||
const chartRef = ref(null); // 图表容器 DOM
|
||||
const riskLevel = ref("");
|
||||
const riskLevelText = ref("");
|
||||
const riskLevelClass = ref("");
|
||||
const riskInfoList = ref([
|
||||
{
|
||||
level: "无风险",
|
||||
description: "无任何不良风险记录",
|
||||
class: "text-green-600",
|
||||
},
|
||||
{ level: "低风险", description: "涉稳、寻衅滋事", class: "text-yellow-500" },
|
||||
{
|
||||
level: "中风险",
|
||||
description: "吸毒、涉毒、犯罪前科",
|
||||
class: "text-orange-500",
|
||||
},
|
||||
{
|
||||
level: "高风险",
|
||||
description: "涉案人员、在逃、犯罪嫌疑人",
|
||||
class: "text-red-500",
|
||||
},
|
||||
|
||||
]);
|
||||
|
||||
// 根据风险等级动态设置图表配置
|
||||
function getChartOption(level) {
|
||||
const valueMap = {
|
||||
A: 10, // 无风险
|
||||
F: 30, // 低风险
|
||||
C: 60, // 中风险
|
||||
D: 60, // 中风险
|
||||
B: 90, // 高风险
|
||||
E: 90, // 高风险
|
||||
default: 0, // 未知风险
|
||||
};
|
||||
const labelNameMap = {
|
||||
A: "无风险", // 无风险
|
||||
F: "低风险", // 低风险
|
||||
C: "中风险", // 中风险
|
||||
D: "中风险", // 中风险
|
||||
B: "高风险", // 高风险
|
||||
E: "高风险", // 高风险
|
||||
default: "未知风险", // 未知风险
|
||||
};
|
||||
const value = valueMap[level] || valueMap.default;
|
||||
const labelName = labelNameMap[level] || valueMap.default;
|
||||
return {
|
||||
tooltip: {
|
||||
formatter: "{a} <br/>{b} : {c}",
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: "风险分值",
|
||||
type: "gauge",
|
||||
min: 0,
|
||||
max: 100,
|
||||
splitNumber: 5, // 分成 5 个区间
|
||||
radius: "90%",
|
||||
detail: {
|
||||
formatter: "{value}", // 显示分值
|
||||
fontSize: 18,
|
||||
fontWeight: "bold",
|
||||
color: "#333",
|
||||
},
|
||||
data: [{ value, name: labelName }],
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
width: 15,
|
||||
shadowBlur: 15, // 添加阴影
|
||||
shadowColor: "rgba(0, 0, 0, 0.3)", // 阴影颜色
|
||||
color: [
|
||||
[
|
||||
0.25,
|
||||
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{ offset: 0, color: "#10B981" },
|
||||
{ offset: 1, color: "#34D399" },
|
||||
]),
|
||||
], // 无风险渐变
|
||||
[
|
||||
0.5,
|
||||
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{ offset: 0, color: "#FFC300" },
|
||||
{ offset: 1, color: "#EAB308" },
|
||||
]),
|
||||
], // 低风险渐变
|
||||
[
|
||||
0.75,
|
||||
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{ offset: 0, color: "#F97316" },
|
||||
{ offset: 1, color: "#E68416" },
|
||||
]),
|
||||
], // 中风险渐变
|
||||
[
|
||||
1,
|
||||
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{ offset: 0, color: "#EF4444" },
|
||||
{ offset: 1, color: "#FF6347" },
|
||||
]),
|
||||
], // 高风险渐变
|
||||
],
|
||||
},
|
||||
},
|
||||
pointer: {
|
||||
icon: "path://M512 0L560 200H464L512 0Z", // 自定义指针形状
|
||||
length: "70%", // 指针长度
|
||||
width: 8,
|
||||
itemStyle: {
|
||||
color: "#FF6347", // 指针颜色
|
||||
borderWidth: 2,
|
||||
borderColor: "#FF4500",
|
||||
shadowBlur: 8, // 添加阴影
|
||||
shadowColor: "rgba(255, 99, 71, 0.5)", // 阴影颜色
|
||||
},
|
||||
},
|
||||
title: {
|
||||
offsetCenter: [0, "75%"], // 标题位置
|
||||
fontSize: 20,
|
||||
fontWeight: "bold",
|
||||
},
|
||||
detail: {
|
||||
formatter: "{value}", // 显示分值
|
||||
fontSize: 18,
|
||||
fontWeight: "bold",
|
||||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||
{ offset: 0, color: "#FF7F50" },
|
||||
{ offset: 1, color: "#FF4500" },
|
||||
]), // 渐变文本颜色
|
||||
},
|
||||
anchor: {
|
||||
show: true, // 显示圆心锚点
|
||||
size: 14,
|
||||
itemStyle: {
|
||||
color: "#FF6347", // 圆心颜色
|
||||
borderWidth: 2,
|
||||
borderColor: "#FF4500",
|
||||
shadowBlur: 8, // 添加阴影
|
||||
shadowColor: "rgba(255, 69, 0, 0.5)", // 阴影颜色
|
||||
},
|
||||
},
|
||||
splitLine: {
|
||||
length: 20, // 刻度线长度
|
||||
lineStyle: {
|
||||
width: 2,
|
||||
color: "#999",
|
||||
shadowBlur: 5, // 刻度阴影
|
||||
shadowColor: "rgba(0, 0, 0, 0.2)",
|
||||
},
|
||||
},
|
||||
axisTick: {
|
||||
length: 10, // 刻度线长度
|
||||
lineStyle: {
|
||||
width: 1,
|
||||
color: "#999",
|
||||
shadowBlur: 5, // 刻度阴影
|
||||
shadowColor: "rgba(0, 0, 0, 0.2)",
|
||||
},
|
||||
},
|
||||
axisLabel: {
|
||||
color: "#666", // 标签颜色
|
||||
fontSize: 12,
|
||||
shadowBlur: 5,
|
||||
shadowColor: "rgba(0, 0, 0, 0.2)", // 标签阴影
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
// 根据风险等级动态设置文本和样式
|
||||
function setRiskProperties(level) {
|
||||
switch (level) {
|
||||
case "A":
|
||||
riskLevelText.value = "无风险";
|
||||
riskLevelClass.value = "text-green-600";
|
||||
break;
|
||||
case "F":
|
||||
riskLevelText.value = "低风险";
|
||||
riskLevelClass.value = "text-lime-600";
|
||||
break;
|
||||
case "C":
|
||||
case "D":
|
||||
riskLevelText.value = "中风险";
|
||||
riskLevelClass.value = "text-orange-400";
|
||||
break;
|
||||
case "B":
|
||||
case "E":
|
||||
riskLevelText.value = "高风险";
|
||||
riskLevelClass.value = "text-red-500";
|
||||
break;
|
||||
default:
|
||||
riskLevelText.value = "未知风险";
|
||||
riskLevelClass.value = "text-gray-500";
|
||||
}
|
||||
}
|
||||
|
||||
// 初始化图表
|
||||
function initChart() {
|
||||
if (!chartRef.value) return;
|
||||
|
||||
if (!chartInstance.value) {
|
||||
chartInstance.value = echarts.init(chartRef.value);
|
||||
}
|
||||
|
||||
const option = getChartOption(riskLevel.value);
|
||||
chartInstance.value.setOption(option);
|
||||
}
|
||||
|
||||
// 更新图表
|
||||
function updateChart(level) {
|
||||
const option = getChartOption(level);
|
||||
chartInstance.value.setOption(option, true);
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
riskLevel.value = props.data.risk_level;
|
||||
setRiskProperties(riskLevel.value);
|
||||
initChart();
|
||||
});
|
||||
|
||||
watch(riskLevel, (newLevel) => {
|
||||
setRiskProperties(newLevel);
|
||||
updateChart(newLevel);
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="card">
|
||||
<div class="span-2xl font-bold" :class="riskLevelClass">
|
||||
<div ref="chartRef" class="chart-container"></div>
|
||||
</div>
|
||||
<div class="mt-6">
|
||||
<LTitle title="信息解读" type="blue-green" />
|
||||
<div class="mt-4 rounded-lg bg-slate-100/80 px-4 py-2 space-y-4">
|
||||
<div v-for="(item, index) in riskInfoList" :key="index" class="flex items-center justify-between">
|
||||
<span class="font-bold" :class="[item.class]">
|
||||
{{ item.level }}
|
||||
</span>
|
||||
<span class="span-gray-700">
|
||||
{{ item.description }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.chart-container {
|
||||
width: 100%;
|
||||
height: 300px;
|
||||
}
|
||||
</style>
|
367
src/ui/CBankLoanApplication.vue
Normal file
@ -0,0 +1,367 @@
|
||||
<script setup>
|
||||
import { ref, onMounted, watch } from "vue";
|
||||
import * as echarts from "echarts"; // 引入 ECharts
|
||||
import LTable from "@/components/LTable.vue";
|
||||
import LTitle from "@/components/LTitle.vue";
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
});
|
||||
const { data } = props;
|
||||
|
||||
// 图表相关
|
||||
const chartInstance = ref(null); // ECharts 实例
|
||||
const chartRef = ref(null); // 图表容器 DOM
|
||||
const chartData = ref({});
|
||||
const opts = ref({
|
||||
color: ["#FAC858", "#EE6666", "#73C0DE", "#3CA272"],
|
||||
});
|
||||
|
||||
// 表格数据
|
||||
const tableData = ref([]);
|
||||
const dateTableData = ref([]);
|
||||
|
||||
// 按钮选项
|
||||
const options = ref([
|
||||
{ label: "近7日", value: 0 },
|
||||
{ label: "近1月", value: 1 },
|
||||
{ label: "近3月", value: 2 },
|
||||
{ label: "近6月", value: 3 },
|
||||
{ label: "近1年", value: 4 },
|
||||
]);
|
||||
|
||||
const dateOptions = ref([
|
||||
{ label: "近7日", value: 0 },
|
||||
{ label: "近1月", value: 1 },
|
||||
{ label: "近3月", value: 2 },
|
||||
{ label: "近6月", value: 3 },
|
||||
{ label: "近1年", value: 4 },
|
||||
]);
|
||||
|
||||
const selectedOption = ref(0);
|
||||
const dateSelectedOption = ref(0);
|
||||
|
||||
// 初始化图表
|
||||
function initChart() {
|
||||
if (!chartRef.value) return;
|
||||
|
||||
if (!chartInstance.value) {
|
||||
chartInstance.value = echarts.init(chartRef.value);
|
||||
}
|
||||
|
||||
const option = {
|
||||
color: opts.value.color,
|
||||
tooltip: {
|
||||
trigger: "axis",
|
||||
axisPointer: {
|
||||
type: "shadow",
|
||||
},
|
||||
},
|
||||
legend: {},
|
||||
xAxis: {
|
||||
type: "category",
|
||||
data: chartData.value.categories,
|
||||
},
|
||||
yAxis: {
|
||||
type: "value",
|
||||
},
|
||||
series: chartData.value.series.map((item) => ({
|
||||
name: item.name,
|
||||
type: "bar",
|
||||
data: item.data,
|
||||
})),
|
||||
};
|
||||
|
||||
chartInstance.value.setOption(option);
|
||||
}
|
||||
|
||||
// 更新图表
|
||||
function updateChart() {
|
||||
if (chartInstance.value) {
|
||||
const option = {
|
||||
xAxis: {
|
||||
data: chartData.value.categories,
|
||||
},
|
||||
series: chartData.value.series.map((item) => ({
|
||||
name: item.name,
|
||||
data: item.data,
|
||||
})),
|
||||
};
|
||||
chartInstance.value.setOption(option);
|
||||
}
|
||||
}
|
||||
|
||||
function calculateTotalStats(data) {
|
||||
// 时间维度映射
|
||||
const timeDimensions = {
|
||||
d7: "近7日",
|
||||
m1: "近1月",
|
||||
m3: "近3月",
|
||||
m6: "近6月",
|
||||
m12: "近1年",
|
||||
};
|
||||
|
||||
// 机构类型
|
||||
const orgTypes = ["bank", "nbank"];
|
||||
|
||||
// 初始化结果数组
|
||||
const result = {
|
||||
totalApplyCount: [],
|
||||
totalOrgCount: [],
|
||||
};
|
||||
|
||||
// 遍历每个时间维度
|
||||
for (const timeKey of Object.keys(timeDimensions)) {
|
||||
let totalApplyCount = 0; // 每个时间维度的总申请次数
|
||||
let totalOrgCount = 0; // 每个时间维度的总机构数
|
||||
|
||||
// 遍历每种机构类型并累加
|
||||
orgTypes.forEach((orgType) => {
|
||||
// 构造参数名
|
||||
const applyCountKey = `als_${timeKey}_id_${orgType}_allnum`;
|
||||
const orgCountKey = `als_${timeKey}_id_${orgType}_orgnum`;
|
||||
// 检查 data 中是否存在此参数,如果不存在则跳过
|
||||
if (
|
||||
data[applyCountKey] !== undefined &&
|
||||
data[orgCountKey] !== undefined
|
||||
) {
|
||||
// 累加数值(如果值为 undefined 或 null 则转换为 0)
|
||||
totalApplyCount += Number(data[applyCountKey] || 0);
|
||||
totalOrgCount += Number(data[orgCountKey] || 0);
|
||||
}
|
||||
});
|
||||
|
||||
// 将每个时间维度的总申请次数和总机构数添加到结果数组中
|
||||
result.totalApplyCount.push(totalApplyCount);
|
||||
result.totalOrgCount.push(totalOrgCount);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
function typeTotalStats(data) {
|
||||
// 时间维度映射
|
||||
const timeDimensions = {
|
||||
d7: "近7日",
|
||||
m1: "近1月",
|
||||
m3: "近3月",
|
||||
m6: "近6月",
|
||||
m12: "近1年",
|
||||
};
|
||||
|
||||
// 定义机构类型和对应的映射表
|
||||
const orgMappings = {
|
||||
bank: "银行借贷",
|
||||
mc: "小额贷款",
|
||||
cf: "消费分期",
|
||||
ca: "借款分期",
|
||||
rel: "信用卡",
|
||||
af: "汽车金融",
|
||||
other: "其他",
|
||||
};
|
||||
const tableGroup = {
|
||||
bank: [{ code: "bank", name: "银行机构" }],
|
||||
mc: [
|
||||
{ code: "nbank_mc", name: "小贷机构" },
|
||||
// { code: 'nbank_nsloan', name: '持牌网络小贷' },
|
||||
// { code: 'nbank_sloan', name: '持牌小贷机构' },
|
||||
// { code: 'pdl', name: '线上小额现金贷' },
|
||||
],
|
||||
cf: [
|
||||
{ code: "nbank_cf", name: "消费类分期机构" },
|
||||
// { code: 'coon', name: '线上消费分期' },
|
||||
// { code: 'cooff', name: '线下消费分期' },
|
||||
],
|
||||
ca: [
|
||||
{ code: "nbank_ca", name: "现金类分期机构" },
|
||||
// { code: 'caon', name: '线上现金分期' },
|
||||
// { code: 'caoff', name: '线下现金分期' },
|
||||
{ code: "nbank_com", name: "代偿类分期机构" },
|
||||
],
|
||||
rel: [{ code: "rel", name: "信用卡(类信用卡)" }],
|
||||
af: [
|
||||
{ code: "af", name: "汽车金融" },
|
||||
// { code: 'nbank_autofin', name: '持牌汽车金融机构' },
|
||||
],
|
||||
other: [
|
||||
{ code: "nbank_p2p", name: "改制机构" },
|
||||
{ code: "nbank_cons", name: "持牌消费金融机构" },
|
||||
{ code: "nbank_finlea", name: "持牌融资租赁机构" },
|
||||
{ code: "nbank_oth", name: "申请其他" },
|
||||
{ code: "nbank_else", name: "其他申请" },
|
||||
// { code: 'oth', name: '申请其他' },
|
||||
// { code: 'else', name: '其他申请' },
|
||||
],
|
||||
};
|
||||
|
||||
// 初始化结果数组
|
||||
const result = [];
|
||||
|
||||
// 遍历每个时间维度
|
||||
for (const timeKey of Object.keys(timeDimensions)) {
|
||||
const tableDataEntry = [];
|
||||
|
||||
// 遍历每种机构类型并累加
|
||||
Object.keys(orgMappings).forEach((groupOrgType) => {
|
||||
const orgTypeArray = tableGroup[groupOrgType];
|
||||
|
||||
let totalApplyCount = 0;
|
||||
let totalOrgCount = 0;
|
||||
for (const i of orgTypeArray) {
|
||||
const applyCountKey = `als_${timeKey}_id_${i.code}_allnum`;
|
||||
const orgCountKey = `als_${timeKey}_id_${i.code}_orgnum`;
|
||||
totalApplyCount =
|
||||
totalApplyCount + Number(data[applyCountKey] || 0);
|
||||
totalOrgCount = totalOrgCount + Number(data[orgCountKey] || 0);
|
||||
}
|
||||
// 添加到 tableData
|
||||
tableDataEntry.push({
|
||||
label: orgMappings[groupOrgType],
|
||||
name: groupOrgType,
|
||||
totalApplyCount,
|
||||
totalOrgCount,
|
||||
});
|
||||
});
|
||||
|
||||
result.push(tableDataEntry);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
function dateTotalStats(data) {
|
||||
// 时间维度映射
|
||||
const timeDimensions = {
|
||||
d7: "近7日",
|
||||
m1: "近1月",
|
||||
m3: "近3月",
|
||||
m6: "近6月",
|
||||
m12: "近1年",
|
||||
};
|
||||
|
||||
// 定义机构类型和对应的映射表
|
||||
const orgMappings = {
|
||||
week: "周末",
|
||||
night: "夜间",
|
||||
};
|
||||
const tableGroup = {
|
||||
week: [
|
||||
{ code: "bank_week", name: "周末银行" },
|
||||
{ code: "nbank_week", name: "周末非银" },
|
||||
],
|
||||
night: [
|
||||
{ code: "bank_night", name: "夜间银行" },
|
||||
{ code: "nbank_night", name: "夜间非银" },
|
||||
],
|
||||
};
|
||||
|
||||
// 初始化结果数组
|
||||
const result = [];
|
||||
|
||||
// 遍历每个时间维度
|
||||
for (const timeKey of Object.keys(timeDimensions)) {
|
||||
const tableDataEntry = [];
|
||||
|
||||
// 遍历每种机构类型并累加
|
||||
Object.keys(orgMappings).forEach((groupOrgType) => {
|
||||
const orgTypeArray = tableGroup[groupOrgType];
|
||||
|
||||
let totalApplyCount = 0;
|
||||
let totalOrgCount = 0;
|
||||
for (const i of orgTypeArray) {
|
||||
const applyCountKey = `als_${timeKey}_id_${i.code}_allnum`;
|
||||
const orgCountKey = `als_${timeKey}_id_${i.code}_orgnum`;
|
||||
totalApplyCount =
|
||||
totalApplyCount + Number(data[applyCountKey] || 0);
|
||||
totalOrgCount = totalOrgCount + Number(data[orgCountKey] || 0);
|
||||
}
|
||||
// 添加到 tableData
|
||||
tableDataEntry.push({
|
||||
label: orgMappings[groupOrgType],
|
||||
name: groupOrgType,
|
||||
totalApplyCount,
|
||||
totalOrgCount,
|
||||
});
|
||||
});
|
||||
|
||||
result.push(tableDataEntry);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// 初始化组件
|
||||
onMounted(() => {
|
||||
const seriesData = calculateTotalStats(data);
|
||||
tableData.value = typeTotalStats(data);
|
||||
dateTableData.value = dateTotalStats(data);
|
||||
|
||||
chartData.value = {
|
||||
categories: ["近7日", "近1月", "近3月", "近6月", "近1年"],
|
||||
series: [
|
||||
{
|
||||
name: "申请次数",
|
||||
data: seriesData.totalApplyCount,
|
||||
},
|
||||
{
|
||||
name: "申请的机构数",
|
||||
data: seriesData.totalOrgCount,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
initChart();
|
||||
});
|
||||
|
||||
// 监听选项变化
|
||||
watch(selectedOption, updateChart);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="card">
|
||||
<div class="flex flex-col gap-y-4">
|
||||
<!-- 申请次数 -->
|
||||
<LTitle title="申请次数" type="blue-green" />
|
||||
<div ref="chartRef" class="chart-container"></div>
|
||||
|
||||
<!-- 银行类别申请记录 -->
|
||||
<LTitle title="申请类别" type="blue-green" />
|
||||
<LButtonGroup v-model="selectedOption" :options="options" />
|
||||
<LTable :data="tableData[selectedOption]" type="blue-green">
|
||||
<template #header>
|
||||
<th class="border px-4 py-2">借贷类别</th>
|
||||
<th class="border px-4 py-2">申请次数</th>
|
||||
<th class="border px-4 py-2">申请的机构数</th>
|
||||
</template>
|
||||
<template #default="{ row }">
|
||||
<td class="border px-4 py-2">{{ row.label }}</td>
|
||||
<td class="border px-4 py-2">{{ row.totalApplyCount }}</td>
|
||||
<td class="border px-4 py-2">{{ row.totalOrgCount }}</td>
|
||||
</template>
|
||||
</LTable>
|
||||
|
||||
<!-- 特殊时段申请记录 -->
|
||||
<LTitle title="特殊时段申请记录" type="blue-green" />
|
||||
<LButtonGroup v-model="dateSelectedOption" :options="dateOptions" />
|
||||
<LTable :data="dateTableData[dateSelectedOption]" type="blue-green">
|
||||
<template #header>
|
||||
<th class="border px-4 py-2">时段</th>
|
||||
<th class="border px-4 py-2">申请次数</th>
|
||||
<th class="border px-4 py-2">申请的机构数</th>
|
||||
</template>
|
||||
|
||||
<template #default="{ row }">
|
||||
<td class="border px-4 py-2">{{ row.label }}</td>
|
||||
<td class="border px-4 py-2">{{ row.totalApplyCount }}</td>
|
||||
<td class="border px-4 py-2">{{ row.totalOrgCount }}</td>
|
||||
</template>
|
||||
</LTable>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.chart-container {
|
||||
width: 100%;
|
||||
height: 400px;
|
||||
}
|
||||
</style>
|
190
src/ui/CBankLoanBehavior.vue
Normal file
@ -0,0 +1,190 @@
|
||||
<script setup>
|
||||
import { ref, onMounted } from "vue";
|
||||
import * as echarts from "echarts"; // 引入 ECharts
|
||||
import LTable from "@/components/LTable.vue";
|
||||
import LTitle from "@/components/LTitle.vue";
|
||||
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
});
|
||||
|
||||
const { data } = props;
|
||||
|
||||
// 图表相关
|
||||
const chartInstance = ref(null); // ECharts 实例
|
||||
const chartRef = ref(null); // 图表容器 DOM
|
||||
const chartData = ref({});
|
||||
|
||||
const tableData = ref([]);
|
||||
|
||||
const opts = ref({
|
||||
color: ["#FAC858", "#EE6666", "#73C0DE", "#3CA272"],
|
||||
});
|
||||
|
||||
function calculateTotalStats(data) {
|
||||
const timeDimensions = {
|
||||
m3: "近3月",
|
||||
m6: "近6月",
|
||||
m9: "近9月",
|
||||
m12: "近1年",
|
||||
};
|
||||
|
||||
const result = [];
|
||||
for (const timeKey of Object.keys(timeDimensions)) {
|
||||
const countKey = `tl_id_${timeKey}_nbank_passlendamt`;
|
||||
let money = 1;
|
||||
if (data[countKey] !== undefined) {
|
||||
money = getLevelRange(Number(data[countKey] || 1), 3000);
|
||||
}
|
||||
result.push({
|
||||
date: timeDimensions[timeKey],
|
||||
money,
|
||||
});
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
function totalStats(data) {
|
||||
const timeDimensions = {
|
||||
m3: "近3月",
|
||||
m6: "近6月",
|
||||
m9: "近9月",
|
||||
m12: "近1年",
|
||||
};
|
||||
|
||||
const result = {
|
||||
totalApplyCount: [],
|
||||
totalOrgCount: [],
|
||||
};
|
||||
|
||||
for (const timeKey of Object.keys(timeDimensions)) {
|
||||
let totalApplyCount = 0;
|
||||
let totalOrgCount = 0;
|
||||
|
||||
const applyCountKey = `tl_id_${timeKey}_nbank_passnum`;
|
||||
const orgCountKey = `tl_id_${timeKey}_nbank_passorg`;
|
||||
|
||||
if (
|
||||
data[applyCountKey] !== undefined &&
|
||||
data[orgCountKey] !== undefined
|
||||
) {
|
||||
totalApplyCount += Number(data[applyCountKey] || 0);
|
||||
totalOrgCount += Number(data[orgCountKey] || 0);
|
||||
}
|
||||
|
||||
result.totalApplyCount.push(totalApplyCount);
|
||||
result.totalOrgCount.push(totalOrgCount);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
function getLevelRange(level, threshold) {
|
||||
const upperLimit = level * threshold;
|
||||
const lowerLimit = (level - 1) * threshold;
|
||||
return `${lowerLimit}元 - ${upperLimit}元`;
|
||||
}
|
||||
|
||||
// 初始化图表
|
||||
function initChart() {
|
||||
if (!chartRef.value) return;
|
||||
|
||||
if (!chartInstance.value) {
|
||||
chartInstance.value = echarts.init(chartRef.value);
|
||||
}
|
||||
|
||||
const option = {
|
||||
color: opts.value.color,
|
||||
tooltip: {
|
||||
trigger: "axis",
|
||||
axisPointer: {
|
||||
type: "shadow",
|
||||
},
|
||||
},
|
||||
legend: {},
|
||||
xAxis: {
|
||||
type: "category",
|
||||
data: chartData.value.categories,
|
||||
},
|
||||
yAxis: {
|
||||
type: "value",
|
||||
},
|
||||
series: chartData.value.series.map((item) => ({
|
||||
name: item.name,
|
||||
type: "bar",
|
||||
data: item.data,
|
||||
})),
|
||||
};
|
||||
|
||||
chartInstance.value.setOption(option);
|
||||
}
|
||||
|
||||
// 更新图表
|
||||
function updateChart() {
|
||||
if (chartInstance.value) {
|
||||
const option = {
|
||||
xAxis: {
|
||||
data: chartData.value.categories,
|
||||
},
|
||||
series: chartData.value.series.map((item) => ({
|
||||
name: item.name,
|
||||
data: item.data,
|
||||
})),
|
||||
};
|
||||
chartInstance.value.setOption(option);
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
tableData.value = calculateTotalStats(data);
|
||||
console.log("tableData", tableData);
|
||||
const chatData = totalStats(data);
|
||||
|
||||
chartData.value = {
|
||||
categories: ["近3月", "近6月", "近9月", "近1年"],
|
||||
series: [
|
||||
{
|
||||
name: "借贷次数",
|
||||
data: chatData.totalApplyCount,
|
||||
},
|
||||
{
|
||||
name: "借贷机构数",
|
||||
data: chatData.totalOrgCount,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
initChart();
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="card">
|
||||
<div class="flex flex-col gap-y-4">
|
||||
<LTitle title="借贷次数" type="blue-green" />
|
||||
<div ref="chartRef" class="chart-container"></div>
|
||||
<LTitle title="借贷额度" type="blue-green" />
|
||||
<LTable :data="tableData" type="blue-green">
|
||||
<template #header>
|
||||
<th class="border px-4 py-2">时间段</th>
|
||||
<th class="border px-4 py-2">借贷数额</th>
|
||||
</template>
|
||||
<template #default="{ row }">
|
||||
<td class="border px-4 py-2">{{ row.date }}</td>
|
||||
<td class="border px-4 py-2">{{ row.money }}</td>
|
||||
</template>
|
||||
</LTable>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.chart-container {
|
||||
width: 100%;
|
||||
height: 400px;
|
||||
}
|
||||
</style>
|
38
src/ui/CCAR061.vue
Normal file
@ -0,0 +1,38 @@
|
||||
<template>
|
||||
<div class="card">
|
||||
<!-- 名下车辆信息展示 -->
|
||||
<div class="bg-yellow-100 text-yellow-700 p-4 rounded-lg">
|
||||
<h3 class="text-xl font-semibold">名下车辆</h3>
|
||||
<p class="text-sm">此人名下拥有车辆:{{ data?.carNum }} 辆</p>
|
||||
</div>
|
||||
|
||||
<!-- 校验对象展示 -->
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { defineProps } from 'vue';
|
||||
|
||||
// 接收父组件传入的 props
|
||||
const props = defineProps({
|
||||
data: Object,
|
||||
params: Object,
|
||||
});
|
||||
|
||||
// 脱敏函数:姓名脱敏(保留首位)
|
||||
const maskName = (name) => {
|
||||
if (!name) return '';
|
||||
return name.length > 1 ? name[0] + "*".repeat(name.length - 1) : "*";
|
||||
};
|
||||
|
||||
// 脱敏函数:身份证号脱敏(保留前6位和最后4位)
|
||||
const maskIdCard = (idCard) => {
|
||||
if (!idCard) return '';
|
||||
return idCard.replace(/^(.{6})(?:\d+)(.{4})$/, "$1****$2");
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 自定义样式 */
|
||||
</style>
|
81
src/ui/CDualMarriage.vue
Normal file
@ -0,0 +1,81 @@
|
||||
<template>
|
||||
<div class="flex items-center justify-center card">
|
||||
<div class="max-w-md w-full p-4">
|
||||
<!-- 核验结果 -->
|
||||
<h3 class="text-xl font-semibold text-gray-700 mb-4">婚姻核验结果</h3>
|
||||
<div
|
||||
:class="['mb-6 p-2 rounded-3xl text-lg font-medium text-center text-white shadow-lg', getStatusClass(data.status)]">
|
||||
{{ getStatusText(data.status) }}
|
||||
</div>
|
||||
<div class="text-sm text-gray-600">
|
||||
<p>{{ statusDescription(data.status) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
params: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
});
|
||||
// 状态背景色和图标
|
||||
const getStatusClass = (status) => {
|
||||
const statusClassMapping = {
|
||||
"0": "bg-yellow-500",
|
||||
"1": "bg-green-600",
|
||||
"2": "bg-red-500",
|
||||
"3": "bg-blue-400",
|
||||
};
|
||||
return statusClassMapping[status] || "bg-gray-500";
|
||||
};
|
||||
|
||||
|
||||
// 核验状态描述
|
||||
const getStatusText = (status) => {
|
||||
const statusMapping = {
|
||||
"0": "无婚姻关系",
|
||||
"1": "已婚",
|
||||
"2": "已离婚",
|
||||
"3": "离婚冷静期",
|
||||
};
|
||||
return statusMapping[status] || "未知状态";
|
||||
};
|
||||
|
||||
const statusDescription = (status) => {
|
||||
const descriptionMapping = {
|
||||
"1": "双方是夫妻关系,目前处于已婚状态。",
|
||||
"2": "双方存在过婚姻关系,目前已离婚。",
|
||||
"3": "双方目前处于离婚冷静期。",
|
||||
"0": "双方不存在婚姻关系。",
|
||||
};
|
||||
return descriptionMapping[status] || "无详细描述。";
|
||||
};
|
||||
|
||||
// 对请求参数进行脱敏处理
|
||||
const maskValue = (value, type) => {
|
||||
if (type === "name") {
|
||||
// 姓名脱敏(保留首位)
|
||||
return value.length > 1 ? value[0] + "*".repeat(value.length - 1) : "*";
|
||||
} else if (type === "id_card") {
|
||||
// 身份证号脱敏(保留前6位和最后4位)
|
||||
return value.replace(/^(.{6})(?:\d+)(.{4})$/, "$1****$2");
|
||||
}
|
||||
return value;
|
||||
};
|
||||
|
||||
const maskedParams = {
|
||||
nameMan: maskValue(props.params.nameMan, "name"),
|
||||
idCardMan: maskValue(props.params.idCardMan, "id_card"),
|
||||
nameWoman: maskValue(props.params.nameWoman, "name"),
|
||||
idCardWoman: maskValue(props.params.idCardWoman, "id_card"),
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
49
src/ui/CFIN019.vue
Normal file
@ -0,0 +1,49 @@
|
||||
<template>
|
||||
<div class="p-4 card space-y-4">
|
||||
<!-- 黑名单信息 -->
|
||||
<div class="">
|
||||
<!-- <LTitle title="银行卡黑名单" type="blue-green" class="mb-4"></LTitle> -->
|
||||
|
||||
<div class="space-y-4">
|
||||
<div v-for="(value, key) in data" :key="key" class="flex justify-between items-center">
|
||||
<div class="font-medium">{{ labelMap[key] }}</div>
|
||||
<div
|
||||
:class="['text-white rounded-lg font-bold py-1 px-2', { 'bg-red-500': value === '1', 'bg-green-500': value === '0' }]">
|
||||
{{ value === '0' ? '未存在' : '被列入该黑名单' }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { defineProps } from 'vue'
|
||||
|
||||
// 接收 props
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
params: {
|
||||
type: Object,
|
||||
required: true,
|
||||
}
|
||||
})
|
||||
// 映射黑名单标签
|
||||
const labelMap = {
|
||||
onlineBlack: "线上卡号黑名单",
|
||||
offlineBlack: "线下卡号黑名单",
|
||||
badCardHolder: "不良持卡人名单",
|
||||
fraudTrans: "交易欺诈名单",
|
||||
otherBlack: "其他卡号黑名单",
|
||||
caseRelated: "涉案卡片"
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 添加需要的样式 */
|
||||
</style>
|
65
src/ui/CG02BJ02.vue
Normal file
@ -0,0 +1,65 @@
|
||||
<template>
|
||||
<div class="card">
|
||||
<!-- 手机在网时长状态展示 -->
|
||||
<div class=" bg-blue-100 text-blue-700 p-4 rounded-lg ">
|
||||
<h3 class="text-xl font-semibold">手机在网时长</h3>
|
||||
<p class="text-lg font-medium">{{ getTimeDuration(data?.code) }}</p>
|
||||
<p class="text-sm mt-2">运营商:{{ getPhoneType(data?.phoneType) }}</p>
|
||||
</div>
|
||||
|
||||
<!-- 手机号码展示 -->
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { defineProps } from 'vue';
|
||||
|
||||
// 接收父组件传入的 props
|
||||
const props = defineProps({
|
||||
data: Object,
|
||||
params: Object,
|
||||
});
|
||||
|
||||
// 脱敏函数:手机号码脱敏(保留前三位和后四位)
|
||||
const maskMobile = (mobile) => {
|
||||
if (!mobile) return '';
|
||||
return mobile.replace(/^(\d{3})(?:\d+)(\d{4})$/, "$1****$2");
|
||||
};
|
||||
|
||||
// 根据 code 获取手机在网时长描述
|
||||
const getTimeDuration = (code) => {
|
||||
switch (code) {
|
||||
case 1006:
|
||||
return "0 - 3 个月";
|
||||
case 1007:
|
||||
return "3 - 6 个月";
|
||||
case 1008:
|
||||
return "6 - 12 个月";
|
||||
case 1009:
|
||||
return "12 - 24 个月";
|
||||
case 1010:
|
||||
return "24 个月以上";
|
||||
default:
|
||||
return "未知时长";
|
||||
}
|
||||
};
|
||||
|
||||
// 根据 phoneType 获取运营商名称
|
||||
const getPhoneType = (phoneType) => {
|
||||
switch (phoneType) {
|
||||
case "CMCC":
|
||||
return "中国移动";
|
||||
case "CUCC":
|
||||
return "中国联通";
|
||||
case "CTCC":
|
||||
return "中国电信";
|
||||
default:
|
||||
return "未知运营商";
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 自定义样式 */
|
||||
</style>
|
50
src/ui/CG03HZ01.vue
Normal file
@ -0,0 +1,50 @@
|
||||
<template>
|
||||
<div class="card">
|
||||
<!-- 手机号码展示 -->
|
||||
<!-- 风险等级展示 -->
|
||||
<div v-if="data?.filterType === '0'" class="bg-green-100 text-green-700 p-4 rounded-lg">
|
||||
<h3 class="text-xl font-semibold">安全号码</h3>
|
||||
<p class="text-sm">该手机号码为安全号码,没有发现任何风险。</p>
|
||||
</div>
|
||||
|
||||
<div v-if="data?.filterType === '1'" class="bg-red-100 text-red-700 p-4 rounded-lg">
|
||||
<h3 class="text-xl font-semibold">高危</h3>
|
||||
<p class="text-sm">该手机号码存在较高风险,请谨慎处理。</p>
|
||||
</div>
|
||||
|
||||
<div v-if="data?.filterType === '2'" class="bg-yellow-100 text-yellow-700 p-4 rounded-lg">
|
||||
<h3 class="text-xl font-semibold">中危</h3>
|
||||
<p class="text-sm">该手机号码存在一定风险,请留意相关信息。</p>
|
||||
</div>
|
||||
|
||||
<div v-if="data?.filterType === '3'" class="bg-blue-100 text-blue-700 p-4 rounded-lg">
|
||||
<h3 class="text-xl font-semibold">低危</h3>
|
||||
<p class="text-sm">该手机号码风险较低,但仍需关注。</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { defineProps } from 'vue';
|
||||
|
||||
// 接收父组件传入的 props
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
params: {
|
||||
type: Object,
|
||||
required: true,
|
||||
}
|
||||
});
|
||||
// 脱敏函数:手机号码脱敏(保留前三位和后四位)
|
||||
const maskMobile = (mobile) => {
|
||||
if (!mobile) return '';
|
||||
return mobile.replace(/^(\d{3})(?:\d+)(\d{4})$/, "$1****$2");
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 自定义样式 */
|
||||
</style>
|
60
src/ui/CG19BJ02.vue
Normal file
@ -0,0 +1,60 @@
|
||||
<template>
|
||||
<div class="card">
|
||||
<!-- 手机号码展示 -->
|
||||
<div class="pb-4">
|
||||
<ul>
|
||||
<li class="flex justify-between py-2 border-b">
|
||||
<span class="font-medium">手机号码</span>
|
||||
<span>{{ maskMobile(params?.mobile) }}</span>
|
||||
</li>
|
||||
<li class="flex justify-between py-2 border-b">
|
||||
<span class="font-medium">业务日期</span>
|
||||
<span>{{ formatDate(params?.startDate) }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- 二次卡状态展示 -->
|
||||
<div v-if="data?.code === 1026" class="bg-green-100 text-gray-700 p-4 rounded-lg mb-6">
|
||||
<h3 class="text-xl font-semibold">非二次卡</h3>
|
||||
<p class="text-sm">该手机号码不是二次卡,请注意核对。</p>
|
||||
</div>
|
||||
|
||||
<div v-if="data?.code === 1025" class="bg-red-500 text-white p-4 rounded-lg mb-6">
|
||||
<h3 class="text-xl font-semibold">二次卡</h3>
|
||||
<p class="text-sm">该手机号码是二次卡,请注意核对。</p>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { defineProps } from 'vue';
|
||||
|
||||
// 接收父组件传入的 props
|
||||
const props = defineProps({
|
||||
data: Object,
|
||||
params: Object,
|
||||
});
|
||||
props.data.code = 1025
|
||||
// 脱敏函数:手机号码脱敏(保留前三位和后四位)
|
||||
const maskMobile = (mobile) => {
|
||||
if (!mobile) return '';
|
||||
return mobile.replace(/^(\d{3})(?:\d+)(\d{4})$/, "$1****$2");
|
||||
};
|
||||
// 格式化日期函数:将日期格式化为 YYYY-MM-DD
|
||||
const formatDate = (dateString) => {
|
||||
if (!dateString) return '';
|
||||
// 确保输入是一个8位数字字符串,格式为 YYYYMMDD
|
||||
const year = dateString.slice(0, 4);
|
||||
const month = dateString.slice(4, 6);
|
||||
const day = dateString.slice(6, 8);
|
||||
|
||||
// 返回格式化后的日期
|
||||
return `${year}-${month}-${day}`;
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 自定义样式 */
|
||||
</style>
|
101
src/ui/CG20GZ01.vue
Normal file
@ -0,0 +1,101 @@
|
||||
<template>
|
||||
<div class="card">
|
||||
<!-- 状态展示 -->
|
||||
<div :class="stateClass" class="text-center rounded-lg py-2">
|
||||
<h2 class="text-xl font-semibold mb-2">银行卡四要素校验</h2>
|
||||
<p class="text-sm">{{ stateMessage }}</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { defineProps, computed } from 'vue'
|
||||
|
||||
// 接收 props 参数
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
params: {
|
||||
type: Object,
|
||||
required: true,
|
||||
}
|
||||
})
|
||||
// 校验状态对应的消息和样式
|
||||
const stateMessage = computed(() => {
|
||||
const state = props.data.data.state
|
||||
switch (state) {
|
||||
case '1':
|
||||
return '验证一致';
|
||||
case '2':
|
||||
return '验证不一致';
|
||||
case '3':
|
||||
return '异常情况';
|
||||
default:
|
||||
return '未知状态';
|
||||
}
|
||||
})
|
||||
|
||||
const stateClass = computed(() => {
|
||||
const state = props.data.data.state
|
||||
switch (state) {
|
||||
case '1':
|
||||
return 'bg-green-100 text-green-600';
|
||||
case '2':
|
||||
return 'bg-red-100 text-red-600';
|
||||
case '3':
|
||||
return 'bg-yellow-100 text-yellow-600';
|
||||
default:
|
||||
return 'bg-gray-100 text-gray-600';
|
||||
}
|
||||
})
|
||||
// 脱敏函数,根据类型判断如何脱敏
|
||||
const maskValue = (value, type) => {
|
||||
if (!value) return ''; // 处理空值
|
||||
|
||||
if (type === "name") {
|
||||
// 姓名脱敏(保留首位)
|
||||
return value.length > 1 ? value[0] + "*".repeat(value.length - 1) : "*";
|
||||
} else if (type === "id_card") {
|
||||
// 身份证号脱敏(保留前6位和最后4位)
|
||||
return value.replace(/^(.{6})(?:\d+)(.{4})$/, "$1****$2");
|
||||
} else if (type === "mobile") {
|
||||
// 手机号脱敏(保留前三位和后四位)
|
||||
return value.replace(/^(\d{3})(?:\d+)(\d{4})$/, "$1****$2");
|
||||
} else if (type === "bank_card") {
|
||||
// 银行卡号脱敏(保留前四位和后四位)
|
||||
return value.replace(/^(\d{4})(?:\d+)(\d{4})$/, "$1 **** **** $2");
|
||||
}
|
||||
return value; // 如果没有匹配的类型,返回原值
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 使按钮和状态信息的显示更为美观 */
|
||||
.bg-green-100 {
|
||||
background-color: #d1fad6;
|
||||
}
|
||||
|
||||
.bg-red-100 {
|
||||
background-color: #fcd0d0;
|
||||
}
|
||||
|
||||
.bg-yellow-100 {
|
||||
background-color: #fdf2b8;
|
||||
}
|
||||
|
||||
.text-green-600 {
|
||||
color: #16a34a;
|
||||
}
|
||||
|
||||
.text-red-600 {
|
||||
color: #dc2626;
|
||||
}
|
||||
|
||||
.text-yellow-600 {
|
||||
color: #e4b200;
|
||||
}
|
||||
</style>
|
86
src/ui/CIDCardTwoElements.vue
Normal file
@ -0,0 +1,86 @@
|
||||
<template>
|
||||
<div class="flex items-center justify-center card">
|
||||
<div class="max-w-md w-full p-4">
|
||||
|
||||
<!-- 核验结果 -->
|
||||
<h3 class="text-xl font-semibold text-gray-700 mb-2">二要素验证结果</h3>
|
||||
<div v-if="data.result === 0" class="flex items-center space-x-4 mb-6">
|
||||
<div class="h-12 w-12 rounded-full flex flex-shrink-0 items-center justify-center bg-green-500">
|
||||
<span class="text-white text-lg font-bold">✔</span>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-lg font-medium text-gray-800">一致</p>
|
||||
<p class="text-sm text-gray-500">姓名和身份证号匹配成功。</p>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else class="flex items-center space-x-4 mb-6">
|
||||
<div class="h-12 w-12 rounded-full flex items-center justify-center bg-red-500">
|
||||
<span class="text-white text-lg font-bold">✘</span>
|
||||
</div>
|
||||
<div>
|
||||
<p class="text-lg font-medium text-gray-800">不一致</p>
|
||||
<p class="text-sm text-gray-500">姓名和身份证号不匹配。</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 核验详情 -->
|
||||
<!-- <h3 class="text-lg font-semibold text-gray-700 mb-2">附加信息</h3> -->
|
||||
<div class="text-sm text-gray-600 space-y-2 ">
|
||||
<p>
|
||||
<span class="font-medium text-gray-800">地址:</span>
|
||||
{{ data.address }}
|
||||
</p>
|
||||
<p>
|
||||
<span class="font-medium text-gray-800">生日:</span>
|
||||
{{ formatBirthday(data.birthday) }}
|
||||
</p>
|
||||
<p>
|
||||
<span class="font-medium text-gray-800">性别:</span>
|
||||
{{ data.sex }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
params: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
});
|
||||
|
||||
// 对生日进行格式化显示
|
||||
const formatBirthday = (birthday) => {
|
||||
if (!birthday) return "未知";
|
||||
const year = birthday.slice(0, 4);
|
||||
const month = birthday.slice(4, 6);
|
||||
const day = birthday.slice(6, 8);
|
||||
return `${year}年${month}月${day}日`;
|
||||
};
|
||||
|
||||
// 对请求参数进行脱敏处理
|
||||
const maskValue = (value, type) => {
|
||||
if (type === "name") {
|
||||
// 姓名脱敏(保留首位)
|
||||
return value.length > 1 ? value[0] + "*".repeat(value.length - 1) : "*";
|
||||
} else if (type === "id_card") {
|
||||
// 身份证号脱敏(保留前6位和最后4位)
|
||||
return value.replace(/^(.{6})(?:\d+)(.{4})$/, "$1****$2");
|
||||
}
|
||||
return value;
|
||||
};
|
||||
|
||||
const maskedParams = {
|
||||
name: maskValue(props.params.name, "name"),
|
||||
id_card: maskValue(props.params.id_card, "id_card"),
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
280
src/ui/CLawsuit.vue
Normal file
@ -0,0 +1,280 @@
|
||||
<script setup>
|
||||
import LTitle from "@/components/LTitle.vue";
|
||||
import { defineProps, onMounted, ref, computed } from "vue";
|
||||
import * as echarts from "echarts";
|
||||
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
});
|
||||
const fieldLabel = [
|
||||
{ "field": "n_jbfy_cj", "label": "法院层级" },
|
||||
{ "field": "n_ajjzjd", "label": "案件进展阶段" },
|
||||
{ "field": "n_slcx", "label": "审理程序" },
|
||||
{ "field": "c_ssdy", "label": "所属地域" },
|
||||
{ "field": "n_ssdw", "label": "诉讼地位" },
|
||||
{ "field": "larq_stat", "label": "涉案时间分布" },
|
||||
{ "field": "n_laay", "label": "立案案由" },
|
||||
{ "field": "n_laay_tree", "label": "立案案由详细" },
|
||||
{ "field": "n_sqzxbdje", "label": "申请执行标的金额" },
|
||||
{ "field": "n_wzxje", "label": "未执行金额" },
|
||||
{ "field": "n_sjdwje", "label": "实际到位金额" },
|
||||
{ "field": "n_jabdje", "label": "结案标的金额" },
|
||||
{ "field": "n_dzzm", "label": "定罪罪名" },
|
||||
{ "field": "n_dzzm_tree", "label": "定罪罪名详细" },
|
||||
{ "field": "n_pcjg", "label": "判处结果" },
|
||||
{ "field": "d_jarq", "label": "结案时间" },
|
||||
{ "field": "n_jaay", "label": "结案案由" },
|
||||
{ "field": "n_jaay_tree", "label": "结案案由详细" },
|
||||
{ "field": "c_gkwsdsr", "label": "当事人说明" },
|
||||
{ "field": "c_gkws_pj", "label": "判决结果" },
|
||||
{ "field": "n_fzje", "label": "犯罪金额" },
|
||||
{ "field": "n_pcpcje", "label": "判处赔偿金额" }
|
||||
]
|
||||
const collapse = ref([]);
|
||||
const jsonData = ref({});
|
||||
const chartOptions = ref({});
|
||||
const chartDom = ref(null); // 用于绑定 DOM 容器
|
||||
const totalCases = ref(0);
|
||||
onMounted(() => {
|
||||
jsonData.value = props.data;
|
||||
// 计算每种案件的数量
|
||||
const caseCounts = {
|
||||
criminal: jsonData.value.criminal?.cases?.length || 0,
|
||||
civil: jsonData.value.civil?.cases?.length || 0,
|
||||
administrative: jsonData.value.administrative?.cases?.length || 0,
|
||||
preservation: jsonData.value.preservation?.cases?.length || 0,
|
||||
implement: jsonData.value.implement?.cases?.length || 0,
|
||||
bankrupt: jsonData.value.bankrupt?.cases?.length || 0,
|
||||
};
|
||||
|
||||
// 计算涉诉总案件数
|
||||
totalCases.value = Object.values(caseCounts).reduce(
|
||||
(sum, count) => sum + count,
|
||||
0
|
||||
);
|
||||
|
||||
chartOptions.value = {
|
||||
title: {
|
||||
// text: "涉诉案件数",
|
||||
// subtext: totalCases.toString(),
|
||||
// left: "35%", // 与 series.center 的第一个值保持一致
|
||||
// top: "50%", // 与 series.center 的第二个值保持一致
|
||||
// textAlign: "center", // 确保文本居中
|
||||
// textStyle: {
|
||||
// fontSize: 16,
|
||||
// fontWeight: "bold",
|
||||
// color: "#333",
|
||||
// },
|
||||
// subtextStyle: {
|
||||
// fontSize: 24,
|
||||
// fontWeight: "bold",
|
||||
// color: "#EE6666",
|
||||
// },
|
||||
},
|
||||
tooltip: {
|
||||
trigger: "item",
|
||||
formatter: "{b}: {c}件 ({d}%)",
|
||||
},
|
||||
legend: {
|
||||
orient: "vertical",
|
||||
right: "0", // 调整到右边
|
||||
top: "middle", // 垂直居中
|
||||
itemGap: 10, // 图例项间距
|
||||
textStyle: {
|
||||
fontSize: 12,
|
||||
color: "#666",
|
||||
},
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: "案件类型",
|
||||
type: "pie",
|
||||
radius: ["30%", "60%"], // 调整环形图半径
|
||||
center: ["30%", "50%"], // 调整环形图的位置
|
||||
avoidLabelOverlap: false,
|
||||
itemStyle: {
|
||||
borderRadius: 8, // 添加圆角效果
|
||||
borderColor: "#fff",
|
||||
borderWidth: 2,
|
||||
},
|
||||
label: {
|
||||
show: false, // 隐藏标签
|
||||
position: "center",
|
||||
},
|
||||
emphasis: {
|
||||
label: {
|
||||
show: true,
|
||||
fontSize: "18",
|
||||
fontWeight: "bold",
|
||||
formatter: "{b}\n{c}件",
|
||||
},
|
||||
},
|
||||
labelLine: {
|
||||
show: false,
|
||||
},
|
||||
data: [
|
||||
{
|
||||
value: caseCounts.criminal,
|
||||
name: `刑事案件${caseCounts.criminal}件`,
|
||||
},
|
||||
{
|
||||
value: caseCounts.civil,
|
||||
name: `民事案件${caseCounts.civil}件`,
|
||||
},
|
||||
{
|
||||
value: caseCounts.administrative,
|
||||
name: `行政案件${caseCounts.administrative}件`,
|
||||
},
|
||||
{
|
||||
value: caseCounts.preservation,
|
||||
name: `非诉保全审查${caseCounts.preservation}件`,
|
||||
},
|
||||
{
|
||||
value: caseCounts.implement,
|
||||
name: `执行案件${caseCounts.implement}件`,
|
||||
},
|
||||
{
|
||||
value: caseCounts.bankrupt,
|
||||
name: `强制清算与破产${caseCounts.bankrupt}件`,
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
// 初始化 ECharts 实例
|
||||
const chartInstance = echarts.init(chartDom.value);
|
||||
chartInstance.setOption(chartOptions.value);
|
||||
|
||||
// 监听窗口大小变化,动态调整图表
|
||||
window.addEventListener("resize", () => {
|
||||
chartInstance.resize();
|
||||
});
|
||||
});
|
||||
|
||||
const caseTypes = computed(() => {
|
||||
const data = jsonData.value;
|
||||
return {
|
||||
civil: data.civil?.cases || [],
|
||||
criminal: data.criminal?.cases || [],
|
||||
administrative: data.administrative?.cases || [],
|
||||
preservation: data.preservation?.cases || [],
|
||||
implement: data.implement?.cases || [],
|
||||
bankrupt: data.bankrupt?.cases || [],
|
||||
};
|
||||
});
|
||||
|
||||
function getCaseTypeName(caseType) {
|
||||
const caseTypeNames = {
|
||||
civil: "民事",
|
||||
criminal: "刑事",
|
||||
administrative: "行政",
|
||||
preservation: "非诉保全审查",
|
||||
implement: "执行",
|
||||
bankrupt: "强制清算与破产",
|
||||
};
|
||||
return caseTypeNames[caseType] || caseType;
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="card">
|
||||
<div class="flex flex-col gap-y-4">
|
||||
<!-- 涉诉案件统计 -->
|
||||
<LTitle title="涉诉案件统计" type="blue-green" />
|
||||
<div class="font-bold ml-4 text-lg">
|
||||
涉诉案件数共
|
||||
<span class="text-red-500 text-2xl font-bold">{{
|
||||
totalCases
|
||||
}}</span>件
|
||||
</div>
|
||||
<div ref="chartDom" style="
|
||||
width: 100%;
|
||||
height: 300px;
|
||||
margin-top: -40px;
|
||||
margin-bottom: -40px;
|
||||
"></div>
|
||||
<template v-for="(caseType, typeName) in caseTypes" :key="typeName">
|
||||
<LTitle :title="` ${getCaseTypeName(typeName)}案件`" type="blue-green" />
|
||||
<div v-if="!caseType || caseType.length === 0">
|
||||
无记录,或数据未被公开
|
||||
</div>
|
||||
<template v-else>
|
||||
<van-collapse v-model="collapse">
|
||||
<van-collapse-item v-for="(caseData, index) in caseType" :key="index" custom-class="collapse"
|
||||
:name="index" :title="`案件: ${caseData.c_ah}`">
|
||||
<div class="case-row">
|
||||
<div class="case-label">案号:</div>
|
||||
<div class="case-value">
|
||||
{{ caseData.c_ah || "-" }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="case-row">
|
||||
<div class="case-label">案件类型:</div>
|
||||
<div class="case-value">
|
||||
{{ caseData.n_ajlx || "-" }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="case-row">
|
||||
<div class="case-label">经办法院:</div>
|
||||
<div class="case-value">
|
||||
{{ caseData.n_jbfy || "-" }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="case-row">
|
||||
<div class="case-label">立案日期:</div>
|
||||
<div class="case-value">
|
||||
{{ caseData.d_larq || "-" }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="case-row">
|
||||
<div class="case-label">结案方式:</div>
|
||||
<div class="case-value">
|
||||
{{ caseData.n_jafs || "-" }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="case-row">
|
||||
<div class="case-label">当事人信息:</div>
|
||||
<div class="case-value">
|
||||
<div v-for="dsr in caseData.c_dsrxx" :key="dsr.c_mc">
|
||||
{{ dsr.c_mc }} -
|
||||
{{
|
||||
dsr.n_ssdw === "申请执行人"
|
||||
? "申请执行人"
|
||||
: "被执行人"
|
||||
}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<template v-for="(item, index) in fieldLabel" :key="index">
|
||||
<div class="case-row" v-if="caseData[item.field]">
|
||||
<div class="case-label">{{ item.label }}:</div>
|
||||
<div class="case-value">{{ caseData[item.field] || '无' }}</div>
|
||||
</div>
|
||||
</template>
|
||||
</van-collapse-item>
|
||||
</van-collapse>
|
||||
</template>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.case-row {
|
||||
@apply flex items-start justify-between my-2;
|
||||
}
|
||||
|
||||
.case-label {
|
||||
@apply flex-shrink-0 font-bold text-gray-700;
|
||||
}
|
||||
|
||||
.case-value {
|
||||
@apply text-right text-gray-500;
|
||||
}
|
||||
|
||||
:deep(.van-cell) {}
|
||||
</style>
|
87
src/ui/CMarriage.vue
Normal file
@ -0,0 +1,87 @@
|
||||
<script setup>
|
||||
import LTitle from "@/components/LTitle.vue";
|
||||
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
});
|
||||
const { data } = props;
|
||||
|
||||
// 状态映射,包括显示的文字和样式
|
||||
const statusMap = {
|
||||
0: {
|
||||
text: "未婚或尚未登记结婚",
|
||||
bgClass: "bg-yellow-100",
|
||||
textClass: "text-yellow-700",
|
||||
description: "未进行民政登记婚姻",
|
||||
},
|
||||
1: {
|
||||
text: "已婚",
|
||||
bgClass: "bg-green-100",
|
||||
textClass: "text-green-700",
|
||||
description: "已登记婚姻,家庭幸福美满",
|
||||
},
|
||||
2: {
|
||||
text: "离异",
|
||||
bgClass: "bg-red-100",
|
||||
textClass: "text-red-700",
|
||||
description: "离异状态,未来生活可期",
|
||||
},
|
||||
3: {
|
||||
text: "离婚冷静期",
|
||||
bgClass: "bg-blue-100",
|
||||
textClass: "text-blue-700",
|
||||
description: "目前处于离婚冷静期,请谨慎决策",
|
||||
},
|
||||
};
|
||||
|
||||
// 根据 `data.status` 确定当前状态,默认值为 “无相关记录”
|
||||
const currentStatus =
|
||||
data.status !== undefined
|
||||
? statusMap[data.status] || statusMap["0"]
|
||||
: {
|
||||
text: "无相关记录",
|
||||
bgClass: "bg-gray-200",
|
||||
textClass: "text-gray-500",
|
||||
description: "暂无婚姻相关记录",
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="card">
|
||||
<div class="status-info flex flex-col items-center ">
|
||||
<div
|
||||
:class="`status-label rounded-full px-6 py-3 text-center font-bold shadow-md ${currentStatus.bgClass} ${currentStatus.textClass}`">
|
||||
{{ currentStatus.text }}
|
||||
</div>
|
||||
<p class="status-description mt-3 text-sm text-gray-600">
|
||||
{{ currentStatus.description }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.status-info {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.status-label {
|
||||
font-size: 1.25rem;
|
||||
padding: 0.75rem 1.5rem;
|
||||
border-radius: 9999px;
|
||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.status-description {
|
||||
color: #4a5568;
|
||||
margin-top: 0.5rem;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.additional-info p {
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
</style>
|
222
src/ui/CP_C_B332.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>
|