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
|
||||
```
|
||||
66
index.html
Normal file
@@ -0,0 +1,66 @@
|
||||
<!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.0">
|
||||
<title>全能查-专业防风险</title>
|
||||
<script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>
|
||||
<style>
|
||||
#app-loading {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: #fff;
|
||||
z-index: 9999;
|
||||
font-family: Arial, sans-serif;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
/* 加载动画 */
|
||||
.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
generated
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 |
11
src/App.vue
Normal file
@@ -0,0 +1,11 @@
|
||||
<script setup>
|
||||
import { RouterLink, RouterView } from 'vue-router'
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
||||
<RouterView />
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
||||
20
src/assets/base.css
Normal file
@@ -0,0 +1,20 @@
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
body {
|
||||
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;
|
||||
}
|
||||
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/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 |
1
src/assets/images/mxcl_icon.svg
Normal file
|
After Width: | Height: | Size: 6.3 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 |
26
src/assets/main.css
Normal file
@@ -0,0 +1,26 @@
|
||||
@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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
306
src/auto-imports.d.ts
vendored
Normal file
@@ -0,0 +1,306 @@
|
||||
/* 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 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>
|
||||
你通过“全能查”APP或推广方推广查询模式,自愿支付相应费用,用于购买海南省学宇思网络科技有限公司的大数据报告产品。如若对产品内容存在异议,可通过邮箱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>
|
||||
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>
|
||||
// 导入 Vue 3 的响应式和路由方法
|
||||
|
||||
|
||||
// 返回上一页逻辑
|
||||
function goBack() {
|
||||
unionuni.navigateBack({ delta: 1 })
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 你可以添加一些额外的样式(如果需要) */
|
||||
</style>
|
||||
61
src/components/LExpandCollapse.vue
Normal file
@@ -0,0 +1,61 @@
|
||||
<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>
|
||||
<view>
|
||||
<!-- 展开/收起按钮 -->
|
||||
|
||||
<!-- 展开/收起的内容 -->
|
||||
<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>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</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>
|
||||
77
src/components/Payment.vue
Normal file
@@ -0,0 +1,77 @@
|
||||
<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">
|
||||
<p class="text-base">{{ data.product_name }}</p>
|
||||
<p class="text-3xl text-red-500 font-bold">¥ {{ data.sell_price }}</p>
|
||||
</div>
|
||||
<!-- 支付方式选择 -->
|
||||
<div class="">
|
||||
<van-cell-group inset>
|
||||
<!-- 支付宝支付 -->
|
||||
<van-cell v-if="platform === 'h5'" 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 v-if="platform !== 'h5'" title="微信支付" clickable @click="selectedPaymentMethod = 'wechat'">
|
||||
<template #icon>
|
||||
<van-icon size="24" name="wechatpay" color="#1AAD19" class="mr-2" />
|
||||
</template>
|
||||
<template #right-icon>
|
||||
<van-radio v-model="selectedPaymentMethod" name="wechat" />
|
||||
</template>
|
||||
</van-cell>
|
||||
</van-cell-group>
|
||||
</div>
|
||||
<!-- 确认按钮 -->
|
||||
<div class="">
|
||||
<van-button class="w-full" round type="primary" @click="payment">确认支付</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 { platform } = useUni()
|
||||
function onConfirmPayment(data) {
|
||||
window.parent.postMessage({ type: "payment", data: data }, "*");
|
||||
show.value = false
|
||||
}
|
||||
|
||||
async function payment() {
|
||||
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
|
||||
onConfirmPayment(data.value.data.prepay_id)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
||||
73
src/composables/useApiFetch.js
Normal file
@@ -0,0 +1,73 @@
|
||||
// src/plugins/fetch.js
|
||||
import { createFetch } from '@vueuse/core'
|
||||
import router from '@/router' // 假设你使用 Vue Router
|
||||
const { getCurrentPlatform, platform } = useUni() // 获取平台信息(如 "app", "h5" 等)
|
||||
getCurrentPlatform()
|
||||
// 创建全局的 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': platform.value, // 添加平台信息
|
||||
'X-Brand': brand, // 添加品牌信息
|
||||
Authorization: `${token}`,
|
||||
}
|
||||
}
|
||||
return { options }
|
||||
},
|
||||
async afterFetch({ data, response }) {
|
||||
closeToast();
|
||||
// 全局处理响应
|
||||
if (response.status === 401) {
|
||||
// 清除本地存储的 token
|
||||
localStorage.removeItem('token')
|
||||
|
||||
// 跳转到登录页
|
||||
router.push('/login')
|
||||
uni.redirectTo({
|
||||
url: '/pages/login',
|
||||
})
|
||||
}
|
||||
|
||||
if (data.code !== 200) {
|
||||
if (data.code !== 200002 && data.code !== 200003) {
|
||||
showToast({ message: data.msg });
|
||||
}
|
||||
}
|
||||
return { data, response }
|
||||
},
|
||||
async onFetchError({ error, response }) {
|
||||
closeToast();
|
||||
if (response.status === 401) {
|
||||
// 清除本地存储的 token
|
||||
localStorage.removeItem('token')
|
||||
|
||||
// 跳转到登录页
|
||||
router.push('/login')
|
||||
uni.redirectTo({
|
||||
url: '/pages/login',
|
||||
})
|
||||
}
|
||||
// 全局错误处理
|
||||
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)
|
||||
}
|
||||
49
src/composables/useUni.js
Normal file
@@ -0,0 +1,49 @@
|
||||
import { ref, onMounted } from 'vue'
|
||||
|
||||
export function useUni() {
|
||||
const platform = ref('') // 存储当前的平台
|
||||
|
||||
// 判断是否在微信浏览器中
|
||||
const checkWeixinBrowser = () => {
|
||||
return /MicroMessenger/i.test(navigator.userAgent)
|
||||
}
|
||||
|
||||
// 获取当前平台并判断环境
|
||||
const getCurrentPlatform = async () => {
|
||||
try {
|
||||
uni.getEnv(env => {
|
||||
if (env.h5) {
|
||||
// 如果是 H5 环境,检查是否在微信浏览器中
|
||||
if (checkWeixinBrowser()) {
|
||||
platform.value = 'h5-weixin'
|
||||
} else {
|
||||
platform.value = 'h5' // 当前是 Web 平台
|
||||
}
|
||||
} else if (env['mp-weixin']) {
|
||||
platform.value = 'mp-weixin' // 当前是 微信小程序平台
|
||||
} else if (env.app) {
|
||||
platform.value = 'app' // 当前是 App 平台
|
||||
} else if (env['mp-qq']) {
|
||||
platform.value = 'mp-qq' // 当前是 QQ 小程序平台
|
||||
} else if (env['mp-alipay']) {
|
||||
platform.value = 'mp-alipay' // 当前是 支付宝小程序平台
|
||||
} else {
|
||||
platform.value = 'unknown' // 未知平台
|
||||
}
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取平台信息失败:', error)
|
||||
platform.value = 'unknown'
|
||||
}
|
||||
}
|
||||
|
||||
// 在组件挂载时执行环境判断
|
||||
onMounted(() => {
|
||||
getCurrentPlatform()
|
||||
})
|
||||
|
||||
return {
|
||||
platform,
|
||||
getCurrentPlatform,
|
||||
}
|
||||
}
|
||||
49
src/composables/useWebView.js
Normal file
@@ -0,0 +1,49 @@
|
||||
import { ref, onMounted } from "vue";
|
||||
|
||||
export function useWebView() {
|
||||
const platform = ref("");
|
||||
const token = ref("");
|
||||
|
||||
// 检测环境并通知父窗口加载完毕
|
||||
const handleBridgeReady = (platformName) => {
|
||||
console.log("handleBridgeReady", platformName)
|
||||
if (platformName.h5) {
|
||||
window.parent.postMessage({ loaded: true }, "*");
|
||||
}
|
||||
};
|
||||
|
||||
const handlePaymentMessage = () => {
|
||||
if (platformName.h5) {
|
||||
window.parent.postMessage({ 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;
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
console.log(" /MicroMessenger/i.test(navigator.userAgent)", /MicroMessenger/i.test(navigator.userAgent))
|
||||
// 检测平台环境
|
||||
uni.getEnv((env) => {
|
||||
platform.value = env;
|
||||
handleBridgeReady(platform.value);
|
||||
});
|
||||
|
||||
// 获取 Token
|
||||
getTokenFromUrl();
|
||||
});
|
||||
|
||||
return {
|
||||
platform,
|
||||
token,
|
||||
handlePaymentMessage
|
||||
};
|
||||
}
|
||||
23
src/main.js
Normal file
@@ -0,0 +1,23 @@
|
||||
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); // 动画过渡时间
|
||||
}
|
||||
});
|
||||
96
src/router/index.js
Normal file
@@ -0,0 +1,96 @@
|
||||
import { createRouter, createWebHistory } from 'vue-router'
|
||||
import NProgress from 'nprogress';
|
||||
|
||||
const router = createRouter({
|
||||
history: createWebHistory(import.meta.env.BASE_URL),
|
||||
routes: [
|
||||
{
|
||||
path: '/',
|
||||
name: 'home',
|
||||
component: () => import('@/views/Home.vue'),
|
||||
},
|
||||
{
|
||||
path: '/service',
|
||||
name: 'service',
|
||||
component: () => import('@/views/Service.vue'),
|
||||
},
|
||||
{
|
||||
path: '/complaint',
|
||||
name: 'complaint',
|
||||
component: () => import('@/views/Complaint.vue'),
|
||||
},
|
||||
{
|
||||
path: '/report',
|
||||
name: 'report',
|
||||
component: () => import('@/views/Report.vue'),
|
||||
},
|
||||
{
|
||||
path: '/example',
|
||||
name: 'example',
|
||||
component: () => import('@/views/Example.vue'),
|
||||
},
|
||||
{
|
||||
path: '/authorization',
|
||||
name: 'authorization',
|
||||
component: () => import('@/views/Authorization.vue'),
|
||||
},
|
||||
{
|
||||
path: '/privacyPolicy',
|
||||
name: 'privacyPolicy',
|
||||
component: () => import('@/views/PrivacyPolicy.vue'),
|
||||
},
|
||||
{
|
||||
path: '/userAgreement',
|
||||
name: 'userAgreement',
|
||||
component: () => import('@/views/UserAgreement.vue'),
|
||||
},
|
||||
{
|
||||
path: '/listMarriage',
|
||||
name: 'listMarriage',
|
||||
component: () => import('@/views/list_marriage.vue'),
|
||||
},
|
||||
{
|
||||
path: '/listRisk',
|
||||
name: 'listRisk',
|
||||
component: () => import('@/views/list_risk.vue'),
|
||||
},
|
||||
{
|
||||
path: '/listLawsuit',
|
||||
name: 'listLawsuit',
|
||||
component: () => import('@/views/list_lawsuit.vue'),
|
||||
},
|
||||
{
|
||||
path: '/listVerify',
|
||||
name: 'listVerify',
|
||||
component: () => import('@/views/list_verify.vue'),
|
||||
},
|
||||
{
|
||||
path: '/inquire/:feature',
|
||||
name: 'inquire',
|
||||
component: () => import('@/views/Inquire.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 }
|
||||
})
|
||||
263
src/ui/CBad.vue
Normal file
@@ -0,0 +1,263 @@
|
||||
<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: "span-lime-600" },
|
||||
{
|
||||
level: "中风险",
|
||||
description: "吸毒、涉毒、犯罪前科",
|
||||
class: "text-orange-400",
|
||||
},
|
||||
{
|
||||
level: "高风险",
|
||||
description: "涉案人员、在逃、犯罪嫌疑人",
|
||||
class: "text-red-500",
|
||||
},
|
||||
{
|
||||
level: "无风险",
|
||||
description: "无任何不良风险记录",
|
||||
class: "text-green-600",
|
||||
},
|
||||
]);
|
||||
|
||||
// 根据风险等级动态设置图表配置
|
||||
function getChartOption(level) {
|
||||
const valueMap = {
|
||||
A: 10, // 无风险
|
||||
F: 30, // 低风险
|
||||
C: 60, // 中风险
|
||||
D: 60, // 中风险
|
||||
B: 90, // 高风险
|
||||
E: 90, // 高风险
|
||||
default: 0, // 未知风险
|
||||
};
|
||||
|
||||
const value = valueMap[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: "风险等级" }],
|
||||
axisLine: {
|
||||
lineStyle: {
|
||||
width: 15,
|
||||
shadowBlur: 15, // 添加阴影
|
||||
shadowColor: "rgba(0, 0, 0, 0.3)", // 阴影颜色
|
||||
color: [
|
||||
[
|
||||
0.2,
|
||||
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{ offset: 0, color: "#10B981" },
|
||||
{ offset: 1, color: "#34D399" },
|
||||
]),
|
||||
], // 无风险渐变
|
||||
[
|
||||
0.4,
|
||||
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{ offset: 0, color: "#A3E635" },
|
||||
{ offset: 1, color: "#D9F99D" },
|
||||
]),
|
||||
], // 低风险渐变
|
||||
[
|
||||
0.6,
|
||||
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{ offset: 0, color: "#F97316" },
|
||||
{ offset: 1, color: "#FDBA74" },
|
||||
]),
|
||||
], // 中风险渐变
|
||||
[
|
||||
0.8,
|
||||
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{ offset: 0, color: "#EF4444" },
|
||||
{ offset: 1, color: "#FCA5A5" },
|
||||
]),
|
||||
], // 高风险渐变
|
||||
[
|
||||
1,
|
||||
new echarts.graphic.LinearGradient(0, 0, 1, 0, [
|
||||
{ offset: 0, color: "#9CA3AF" },
|
||||
{ offset: 1, color: "#E5E7EB" },
|
||||
]),
|
||||
], // 未知风险渐变
|
||||
],
|
||||
},
|
||||
},
|
||||
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: 14,
|
||||
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>
|
||||
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>
|
||||
97
src/ui/CMarriage.vue
Normal file
@@ -0,0 +1,97 @@
|
||||
<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 mb-4 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 class="additional-info mt-6 text-center">
|
||||
<p class="text-xs text-gray-500">
|
||||
<strong>数据更新时间:</strong> {{ lastUpdated }}
|
||||
</p>
|
||||
<p class="text-xs text-gray-500">
|
||||
本数据仅供参考,如有疑问请联系相关部门。
|
||||
</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>
|
||||
542
src/ui/CRelatedEnterprises.vue
Normal file
@@ -0,0 +1,542 @@
|
||||
<script setup>
|
||||
import LTitle from "@/components/LTitle.vue";
|
||||
|
||||
const props = defineProps({
|
||||
data: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
});
|
||||
const { data } = props;
|
||||
const entCollapse = ref([]);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<view class="">
|
||||
<template v-if="data && data.datalist.length === 0">
|
||||
<!-- 显示“暂无关联企业信息”的提示 -->
|
||||
<view class="card py-10 text-center text-gray-500">
|
||||
暂无关联企业信息
|
||||
</view>
|
||||
</template>
|
||||
<template v-else>
|
||||
<wd-collapse
|
||||
v-model="entCollapse"
|
||||
custom-class="space-y-5"
|
||||
custom-style="background: transparent; !important"
|
||||
>
|
||||
<wd-collapse-item
|
||||
v-for="(item, index) in data.datalist"
|
||||
:key="index"
|
||||
:name="index"
|
||||
class="card"
|
||||
>
|
||||
<template #title="{ expanded }">
|
||||
<view class="w-full space-y-3">
|
||||
<view class="text-lg text-gray-800 font-bold">
|
||||
{{ item.orgName }}
|
||||
</view>
|
||||
<view class="text-sm text-gray-700">
|
||||
查询人:{{ item.pName }}
|
||||
</view>
|
||||
<!-- 关联关系 -->
|
||||
<view class="flex items-center gap-3">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
与企业关联关系:
|
||||
</text>
|
||||
<text
|
||||
v-for="(relation, idx) in item.relationship"
|
||||
:key="idx"
|
||||
class="flex-shrink-0 rounded-full bg-blue-100 px-3 py-1 text-xs text-blue-800"
|
||||
>
|
||||
{{
|
||||
relation === "lp"
|
||||
? "法人"
|
||||
: relation === "sh"
|
||||
? "股东"
|
||||
: "高管"
|
||||
}}
|
||||
</text>
|
||||
</view>
|
||||
<view class="text-center text-blue-500">
|
||||
{{ expanded ? "收起" : "点击查看更多" }}
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<LTitle title="关联企业信息" type="blue-green" />
|
||||
<!-- 基本信息 -->
|
||||
<view class="pt-4 space-y-3">
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
企业状态:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ item.basicInfo.regStatus }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
注册资本:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ item.basicInfo.regCapital }}
|
||||
{{ item.basicInfo.regCapitalCurrency }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
法人:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ item.basicInfo.legalPersonName }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
统一社会信用代码:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ item.basicInfo.creditCode }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
成立日期:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ item.basicInfo.estiblishTime }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
经营范围:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
<LExpandCollapse :max-length="50">
|
||||
{{ item.basicInfo.opscope }}
|
||||
</LExpandCollapse>
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
地址:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ item.basicInfo.province }}
|
||||
{{ item.basicInfo.city }}
|
||||
{{ item.basicInfo.district }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
行业:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ item.basicInfo.industry }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
行业代码:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ item.basicInfo.nic_code }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
公司类型:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ item.basicInfo.companyOrgType }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
注册机关:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ item.basicInfo.regorg }}
|
||||
</text>
|
||||
</view>
|
||||
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
行业名称:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ item.basicInfo.nic_name }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
注册资本币种:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ item.basicInfo.reccapcur }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
审核日期:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ item.basicInfo.apprdate }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 高管信息 -->
|
||||
<view
|
||||
v-if="item.basicInfo.staffList?.result?.length > 0"
|
||||
class="pt-4 space-y-3"
|
||||
>
|
||||
<LTitle title="高管信息" type="blue-green" />
|
||||
<view
|
||||
v-for="(staff, idx) in item.basicInfo.staffList
|
||||
.result"
|
||||
:key="idx"
|
||||
class="space-y-3"
|
||||
>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
姓名:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ staff.name }}
|
||||
</text>
|
||||
</view>
|
||||
<view
|
||||
v-for="(type, typeIdx) in staff.typeJoin"
|
||||
:key="typeIdx"
|
||||
class="flex justify-between"
|
||||
>
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
职位:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ type }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 股东信息 -->
|
||||
<view v-if="item.stockHolderItem" class="pt-4 space-y-3">
|
||||
<LTitle title="股东信息" type="blue-green" />
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
股东类型:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ item.stockHolderItem.orgHolderType }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
占比:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ item.stockHolderItem.investRate }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
股东名称:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ item.stockHolderItem.orgHolderName }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 被执行人信息 -->
|
||||
<!-- <view v-if="item.executedPerson?.length > 0" class="pt-4">
|
||||
<LTitle title="被执行人信息" type="blue-green" />
|
||||
<view v-for="(person, pidx) in item.executedPerson" :key="pidx" class="border-b border-gray-400 border-b-dashed pb-4 pt-4 space-y-3">
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
案号:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.caseCode }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
身份证号:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.partyCardNum }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
被执行人:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.pname }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
立案日期:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.caseCreateTime }}
|
||||
</text>
|
||||
</view>
|
||||
<view v-if="person.execCourtName" class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
执行法院:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.execCourtName }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
执行标的:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.execMoney }} 元
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view v-if="item.dishonestExecutedPerson?.length > 0" class="pt-4">
|
||||
<LTitle title="失信被执行人信息" type="blue-green" />
|
||||
<view v-for="(person, didx) in item.dishonestExecutedPerson" :key="didx" class="border-b border-gray-400 border-b-dashed pb-4 pt-4 space-y-3">
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
失信人姓名:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.iname }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
失信行为:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.disrupttypename }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
案号:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.casecode }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
身份证号:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.cardnum }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
未履行部分:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.unperformPart || '无' }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
已履行部分:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.performedPart || '无' }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
履行情况:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.performance }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
立案时间:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.regdate }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
生效法律文书确定义务:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.duty }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
执行依据文号:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.gistid }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
执行法院:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.courtname }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text class="flex-shrink-0 text-gray-700 font-medium">
|
||||
发布时间:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ person.publishdate }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
</view> -->
|
||||
|
||||
<view v-if="item.adminPenalty?.length > 0" class="pt-4">
|
||||
<LTitle title="行政处罚信息" type="blue-green" />
|
||||
<view
|
||||
v-for="(penalty, aidx) in item.adminPenalty"
|
||||
:key="aidx"
|
||||
class="border-b border-gray-400 border-b-dashed pb-4 pt-4 space-y-3"
|
||||
>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
处罚单位:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ penalty.departmentName }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
处罚原因:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ penalty.reason || "无" }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
处罚决定书文号:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ penalty.punishNumber }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
处罚类别:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ penalty.type }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
处罚结果:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ penalty.content || "无" }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
处罚日期:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ penalty.decisionDate }}
|
||||
</text>
|
||||
</view>
|
||||
<view class="flex justify-between">
|
||||
<text
|
||||
class="flex-shrink-0 text-gray-700 font-medium"
|
||||
>
|
||||
法人姓名:
|
||||
</text>
|
||||
<text class="text-gray-600">
|
||||
{{ penalty.legalPersonName }}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</wd-collapse-item>
|
||||
</wd-collapse>
|
||||
</template>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<style scoped lang="scss">
|
||||
:deep(.wd-collapse-item__header) {
|
||||
padding: 0;
|
||||
}
|
||||
:deep(.wd-collapse-item__body) {
|
||||
padding: 0;
|
||||
@apply text-sm;
|
||||
}
|
||||
</style>
|
||||
297
src/ui/CSpecialList.vue
Normal file
@@ -0,0 +1,297 @@
|
||||
<script setup>
|
||||
import LTitle from "@/components/LTitle.vue";
|
||||
|
||||
// const props = defineProps({
|
||||
// data: {
|
||||
// type: Object,
|
||||
// required: true,
|
||||
// },
|
||||
// })
|
||||
// const { data } = props
|
||||
const data = ref({
|
||||
swift_number: "999333_20181029143459_23453A4E0",
|
||||
code: "00",
|
||||
flag_specialList_c: "1",
|
||||
sl_id_court_bad: "0",
|
||||
sl_id_court_executed: "0",
|
||||
sl_id_bank_bad: "0",
|
||||
sl_id_bank_overdue: "0",
|
||||
sl_id_bank_lost: "0",
|
||||
sl_id_nbank_bad: "0",
|
||||
sl_id_nbank_overdue: "0",
|
||||
sl_id_nbank_lost: "0",
|
||||
sl_id_nbank_nsloan_bad: "0",
|
||||
sl_id_nbank_nsloan_overdue: "0",
|
||||
sl_id_nbank_nsloan_lost: "0",
|
||||
sl_id_nbank_sloan_bad: "0",
|
||||
sl_id_nbank_sloan_overdue: "0",
|
||||
sl_id_nbank_sloan_lost: "0",
|
||||
sl_id_nbank_cons_bad: "0",
|
||||
sl_id_nbank_cons_overdue: "0",
|
||||
sl_id_nbank_cons_lost: "0",
|
||||
sl_id_nbank_finlea_bad: "0",
|
||||
sl_id_nbank_finlea_overdue: "0",
|
||||
sl_id_nbank_finlea_lost: "0",
|
||||
sl_id_nbank_autofin_bad: "0",
|
||||
sl_id_nbank_autofin_overdue: "0",
|
||||
sl_id_nbank_autofin_lost: "0",
|
||||
sl_id_nbank_other_bad: "0",
|
||||
sl_id_nbank_other_overdue: "0",
|
||||
sl_id_nbank_other_lost: "0",
|
||||
sl_id_court_bad_time: "0",
|
||||
sl_id_court_executed_time: "1",
|
||||
sl_id_bank_bad_time: "1",
|
||||
sl_id_bank_overdue_time: "2",
|
||||
sl_id_bank_lost_time: "0",
|
||||
sl_id_nbank_bad_time: "0",
|
||||
sl_id_nbank_overdue_time: "1",
|
||||
sl_id_nbank_lost_time: "1",
|
||||
sl_id_nbank_nsloan_bad_time: "0",
|
||||
sl_id_nbank_nsloan_overdue_time: "1",
|
||||
sl_id_nbank_nsloan_lost_time: "1",
|
||||
sl_id_nbank_sloan_bad_time: "0",
|
||||
sl_id_nbank_sloan_overdue_time: "1",
|
||||
sl_id_nbank_sloan_lost_time: "1",
|
||||
sl_id_nbank_cons_bad_time: "1",
|
||||
sl_id_nbank_cons_overdue_time: "0",
|
||||
sl_id_nbank_cons_lost_time: "1",
|
||||
sl_id_nbank_finlea_bad_time: "1",
|
||||
sl_id_nbank_finlea_overdue_time: "2",
|
||||
sl_id_nbank_finlea_lost_time: "0",
|
||||
sl_id_nbank_autofin_bad_time: "1",
|
||||
sl_id_nbank_autofin_overdue_time: "0",
|
||||
sl_id_nbank_autofin_lost_time: "2",
|
||||
sl_id_nbank_other_bad_time: "0",
|
||||
sl_id_nbank_other_overdue_time: "0",
|
||||
sl_id_nbank_other_lost_time: "0",
|
||||
sl_id_court_bad_allnum: "1",
|
||||
sl_id_court_executed_allnum: "1",
|
||||
sl_id_bank_bad_allnum: "1",
|
||||
sl_id_bank_overdue_allnum: "2",
|
||||
sl_id_bank_lost_allnum: "5",
|
||||
sl_id_nbank_bad_allnum: "6",
|
||||
sl_id_nbank_overdue_allnum: "1",
|
||||
sl_id_nbank_lost_allnum: "1",
|
||||
sl_id_nbank_nsloan_bad_allnum: "7",
|
||||
sl_id_nbank_nsloan_overdue_allnum: "1",
|
||||
sl_id_nbank_nsloan_lost_allnum: "1",
|
||||
sl_id_nbank_sloan_bad_allnum: "1",
|
||||
sl_id_nbank_sloan_overdue_allnum: "1",
|
||||
sl_id_nbank_sloan_lost_allnum: "1",
|
||||
sl_id_nbank_cons_bad_allnum: "1",
|
||||
sl_id_nbank_cons_overdue_allnum: "9",
|
||||
sl_id_nbank_cons_lost_allnum: "1",
|
||||
sl_id_nbank_finlea_bad_allnum: "1",
|
||||
sl_id_nbank_finlea_overdue_allnum: "2",
|
||||
sl_id_nbank_finlea_lost_allnum: "4",
|
||||
sl_id_nbank_autofin_bad_allnum: "1",
|
||||
sl_id_nbank_autofin_overdue_allnum: "8",
|
||||
sl_id_nbank_autofin_lost_allnum: "2",
|
||||
sl_id_nbank_other_bad_allnum: "5",
|
||||
sl_id_nbank_other_overdue_allnum: "7",
|
||||
sl_id_nbank_other_lost_allnum: "2",
|
||||
sl_cell_bank_bad: "0",
|
||||
sl_cell_bank_overdue: "0",
|
||||
sl_cell_bank_lost: "0",
|
||||
sl_cell_nbank_bad: "0",
|
||||
sl_cell_nbank_overdue: "0",
|
||||
sl_cell_nbank_lost: "0",
|
||||
sl_cell_nbank_nsloan_bad: "0",
|
||||
sl_cell_nbank_nsloan_overdue: "0",
|
||||
sl_cell_nbank_nsloan_lost: "0",
|
||||
sl_cell_nbank_sloan_bad: "0",
|
||||
sl_cell_nbank_sloan_overdue: "0",
|
||||
sl_cell_nbank_sloan_lost: "0",
|
||||
sl_cell_nbank_cons_bad: "0",
|
||||
sl_cell_nbank_cons_overdue: "0",
|
||||
sl_cell_nbank_cons_lost: "0",
|
||||
sl_cell_nbank_finlea_bad: "0",
|
||||
sl_cell_nbank_finlea_overdue: "0",
|
||||
sl_cell_nbank_finlea_lost: "0",
|
||||
sl_cell_nbank_autofin_bad: "0",
|
||||
sl_cell_nbank_autofin_overdue: "0",
|
||||
sl_cell_nbank_autofin_lost: "0",
|
||||
sl_cell_nbank_other_bad: "0",
|
||||
sl_cell_nbank_other_overdue: "0",
|
||||
sl_cell_nbank_other_lost: "0",
|
||||
sl_cell_bank_bad_time: "1",
|
||||
sl_cell_bank_overdue_time: "2",
|
||||
sl_cell_bank_lost_time: "0",
|
||||
sl_cell_nbank_bad_time: "0",
|
||||
sl_cell_nbank_overdue_time: "1",
|
||||
sl_cell_nbank_lost_time: "1",
|
||||
sl_cell_nbank_nsloan_bad_time: "0",
|
||||
sl_cell_nbank_nsloan_overdue_time: "1",
|
||||
sl_cell_nbank_nsloan_lost_time: "1",
|
||||
sl_cell_nbank_sloan_bad_time: "0",
|
||||
sl_cell_nbank_sloan_overdue_time: "1",
|
||||
sl_cell_nbank_sloan_lost_time: "1",
|
||||
sl_cell_nbank_cons_bad_time: "1",
|
||||
sl_cell_nbank_cons_overdue_time: "0",
|
||||
sl_cell_nbank_cons_lost_time: "1",
|
||||
sl_cell_nbank_finlea_bad_time: "1",
|
||||
sl_cell_nbank_finlea_overdue_time: "2",
|
||||
sl_cell_nbank_finlea_lost_time: "0",
|
||||
sl_cell_nbank_autofin_bad_time: "1",
|
||||
sl_cell_nbank_autofin_overdue_time: "0",
|
||||
sl_cell_nbank_autofin_lost_time: "2",
|
||||
sl_cell_nbank_other_bad_time: "0",
|
||||
sl_cell_nbank_other_overdue_time: "0",
|
||||
sl_cell_nbank_other_lost_time: "0",
|
||||
sl_cell_bank_bad_allnum: "1",
|
||||
sl_cell_bank_overdue_allnum: "2",
|
||||
sl_cell_bank_lost_allnum: "3",
|
||||
sl_cell_nbank_bad_allnum: "5",
|
||||
sl_cell_nbank_overdue_allnum: "1",
|
||||
sl_cell_nbank_lost_allnum: "1",
|
||||
sl_cell_nbank_nsloan_bad_allnum: "3",
|
||||
sl_cell_nbank_nsloan_overdue_allnum: "1",
|
||||
sl_cell_nbank_nsloan_lost_allnum: "1",
|
||||
sl_cell_nbank_sloan_bad_allnum: "7",
|
||||
sl_cell_nbank_sloan_overdue_allnum: "1",
|
||||
sl_cell_nbank_sloan_lost_allnum: "1",
|
||||
sl_cell_nbank_cons_bad_allnum: "1",
|
||||
sl_cell_nbank_cons_overdue_allnum: "8",
|
||||
sl_cell_nbank_cons_lost_allnum: "1",
|
||||
sl_cell_nbank_finlea_bad_allnum: "1",
|
||||
sl_cell_nbank_finlea_overdue_allnum: "2",
|
||||
sl_cell_nbank_finlea_lost_allnum: "4",
|
||||
sl_cell_nbank_autofin_bad_allnum: "1",
|
||||
sl_cell_nbank_autofin_overdue_allnum: "6",
|
||||
sl_cell_nbank_autofin_lost_allnum: "2",
|
||||
sl_cell_nbank_other_bad_allnum: "7",
|
||||
sl_cell_nbank_other_overdue_allnum: "6",
|
||||
sl_cell_nbank_other_lost_allnum: "9",
|
||||
});
|
||||
console.log("spp data", data);
|
||||
const bankLost = ref([]);
|
||||
const lost = ref([]);
|
||||
function totalStats(data) {
|
||||
const result = {};
|
||||
|
||||
const keys = {
|
||||
bank: "银行失联异常",
|
||||
nbank_nsloan: "网络小额贷款",
|
||||
nbank_autofin: "汽车金融",
|
||||
nbank_sloan: "地方小戴",
|
||||
nbank_finlea: "融资租赁",
|
||||
nbank_cons: "消费金融",
|
||||
nbank_other: "其他风险",
|
||||
};
|
||||
const levels = ["bad", "overdue"];
|
||||
// 遍历每个时间维度
|
||||
for (const key of Object.keys(keys)) {
|
||||
result[key] = {
|
||||
label: keys[key],
|
||||
num: 0,
|
||||
date: null,
|
||||
};
|
||||
let time = null;
|
||||
for (const i of levels) {
|
||||
const numfield = `sl_id_${key}_${i}`;
|
||||
if (data[numfield] !== undefined) {
|
||||
result[key].num += Number(data[numfield] || 0);
|
||||
}
|
||||
const timefield = `sl_id_${key}_${i}_time`;
|
||||
const timeData = data[timefield];
|
||||
if (timeData !== 0 || time === null || timeData < time) {
|
||||
time = timeData;
|
||||
}
|
||||
}
|
||||
result[key].date = time;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
function lostSotalStats(data) {
|
||||
const result = {};
|
||||
|
||||
const keys = {
|
||||
bank: "银行失联异常",
|
||||
nbank_nsloan: "网络小额贷款",
|
||||
nbank_autofin: "汽车金融",
|
||||
nbank_sloan: "地方小戴",
|
||||
nbank_finlea: "融资租赁",
|
||||
nbank_cons: "消费金融",
|
||||
nbank_other: "其他风险",
|
||||
};
|
||||
const levels = ["lost"];
|
||||
for (const key of Object.keys(keys)) {
|
||||
result[key] = {
|
||||
label: keys[key],
|
||||
num: 0,
|
||||
date: null,
|
||||
};
|
||||
let time = null;
|
||||
for (const i of levels) {
|
||||
const numfield = `sl_id_${key}_${i}`;
|
||||
if (data[numfield] !== undefined) {
|
||||
result[key].num += Number(data[numfield] || 0);
|
||||
}
|
||||
const timefield = `sl_id_${key}_${i}_time`;
|
||||
const timeData = data[timefield];
|
||||
if (timeData !== 0 || time === null || timeData < time) {
|
||||
time = timeData;
|
||||
}
|
||||
}
|
||||
result[key].date = time;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
onMounted(() => {
|
||||
const result = totalStats(data.value);
|
||||
const lostResult = lostSotalStats(data.value);
|
||||
bankLost.value = result;
|
||||
lost.value = lostResult;
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="card">
|
||||
<div class="flex flex-col gap-y-4">
|
||||
<LTitle title="一般异常行为" type="blue-green" />
|
||||
<LTable :data="bankLost" 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.num }}
|
||||
</td>
|
||||
<td class="border px-4 py-2">
|
||||
{{ row.date !== "0" ? `近${row.date}年内` : "-" }}
|
||||
</td>
|
||||
</template>
|
||||
</LTable>
|
||||
<LTitle title="高风险异常行为" type="blue-green" />
|
||||
<LTable :data="lost" 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.num }}
|
||||
</td>
|
||||
<td class="border px-4 py-2">
|
||||
{{ row.date !== "0" ? `近${row.date}年内` : "-" }}
|
||||
</td>
|
||||
</template>
|
||||
</LTable>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
267
src/ui/CTabs.vue
Normal file
@@ -0,0 +1,267 @@
|
||||
<script setup>
|
||||
import LTitle from "@/components/LTitle.vue";
|
||||
|
||||
import throttle from "lodash/throttle";
|
||||
|
||||
// 接收 props
|
||||
const props = defineProps({
|
||||
type: {
|
||||
type: String,
|
||||
default: "purple-pink", // 默认颜色渐变
|
||||
},
|
||||
tabs: {
|
||||
type: Array,
|
||||
required: true, // tabs 的选项数组
|
||||
},
|
||||
});
|
||||
|
||||
// 当前选中的 tab
|
||||
const selected = ref(props.tabs[0].value);
|
||||
const showPopup = ref(false); // 控制弹出层的显示状态
|
||||
const onSelect = ref(false);
|
||||
// 根据 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 tabWidths = ref([]);
|
||||
// 计算滑动线的位置和宽度
|
||||
const slideLineStyle = computed(() => {
|
||||
const index = props.tabs.findIndex((tab) => tab.value === selected.value);
|
||||
const width = tabWidths.value[index] || 0;
|
||||
const offsetLeft = tabWidths.value
|
||||
.slice(0, index)
|
||||
.reduce((acc, w) => acc + w, 0);
|
||||
return {
|
||||
width: `${width}px`,
|
||||
transform: `translateX(${offsetLeft}px)`,
|
||||
};
|
||||
});
|
||||
|
||||
// 获取每个 tab 的宽度
|
||||
function updateTabWidths() {
|
||||
const query = uni.createSelectorQuery();
|
||||
|
||||
props.tabs.forEach((tab) => {
|
||||
query.select(`#tab-${tab.value}`).boundingClientRect();
|
||||
});
|
||||
|
||||
query.exec((res) => {
|
||||
tabWidths.value = res.map((rect) => (rect ? rect.width : 0));
|
||||
});
|
||||
}
|
||||
|
||||
function onSelectChange() {
|
||||
onSelect.value = true;
|
||||
setTimeout(() => {
|
||||
onSelect.value = false;
|
||||
}, 300);
|
||||
}
|
||||
|
||||
// 获取视口滚动位置的异步函数
|
||||
function getViewportScrollOffset() {
|
||||
return new Promise((resolve) => {
|
||||
const query = uni.createSelectorQuery();
|
||||
query
|
||||
.selectViewport()
|
||||
.scrollOffset((viewport) => {
|
||||
resolve(viewport);
|
||||
})
|
||||
.exec();
|
||||
});
|
||||
}
|
||||
|
||||
// 获取元素相对视口的位置信息的异步函数
|
||||
function getElementRect(selector) {
|
||||
return new Promise((resolve) => {
|
||||
const query = uni.createSelectorQuery();
|
||||
query
|
||||
.select(selector)
|
||||
.boundingClientRect((rect) => {
|
||||
resolve(rect);
|
||||
})
|
||||
.exec();
|
||||
});
|
||||
}
|
||||
|
||||
// 主函数:按顺序执行两个查询
|
||||
async function selectTab(tab) {
|
||||
console.log("one selectTab");
|
||||
selected.value = tab.value;
|
||||
updateTabWidths();
|
||||
onSelectChange();
|
||||
|
||||
const offset = 100; // 自定义偏移量
|
||||
|
||||
try {
|
||||
// 第一步:获取视口的滚动位置
|
||||
const viewport = await getViewportScrollOffset();
|
||||
console.log("viewport", viewport);
|
||||
|
||||
// 第二步:获取目标元素的布局信息
|
||||
const rect = await getElementRect(`#${tab.value}`);
|
||||
console.log("rect", rect);
|
||||
|
||||
const systemInfo = uni.getSystemInfoSync();
|
||||
let scrollTop = viewport.scrollTop + rect.top - offset;
|
||||
|
||||
if (process.env.UNI_PLATFORM === "mp-weixin") {
|
||||
scrollTop += systemInfo.statusBarHeight || 20; // 微信小程序增加状态栏高度
|
||||
} else if (process.env.UNI_PLATFORM === "app-plus") {
|
||||
scrollTop += systemInfo.statusBarHeight || 20; // App 端增加状态栏高度
|
||||
}
|
||||
|
||||
console.log("目标滚动位置 scrollTop:", scrollTop);
|
||||
|
||||
// 执行滚动到目标位置
|
||||
uni.pageScrollTo({
|
||||
scrollTop,
|
||||
duration: 300,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("滚动过程中出现错误:", error);
|
||||
}
|
||||
}
|
||||
// 控制右侧图标按钮点击弹出所有选项的 Popup
|
||||
function openPopup() {
|
||||
showPopup.value = true;
|
||||
}
|
||||
|
||||
function selectFromPopup(tab) {
|
||||
selectTab(tab);
|
||||
showPopup.value = false;
|
||||
}
|
||||
|
||||
const windowHeight = uni.getSystemInfoSync().windowHeight / 2; // 缓存窗口高度
|
||||
|
||||
function onScroll() {
|
||||
if (onSelect.value) return;
|
||||
|
||||
const offset = 0;
|
||||
const query = uni.createSelectorQuery();
|
||||
|
||||
// 为每个 tab 设置查询请求
|
||||
props.tabs.forEach((tab) => {
|
||||
query.select(`#${tab.value}`).boundingClientRect();
|
||||
});
|
||||
|
||||
query.exec((res) => {
|
||||
for (let index = 0; index < res.length; index++) {
|
||||
const rect = res[index];
|
||||
if (rect && rect.top >= offset && rect.top < windowHeight) {
|
||||
if (selected.value !== props.tabs[index].value) {
|
||||
selected.value = props.tabs[index].value;
|
||||
updateTabWidths();
|
||||
}
|
||||
break; // 找到匹配的 tab 后立即退出循环
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 使用节流来减少 onScroll 调用频率
|
||||
const throttledOnScroll = throttle(onScroll, 100); // 每 100ms 触发一次
|
||||
|
||||
onMounted(() => {
|
||||
updateTabWidths();
|
||||
|
||||
// #ifdef H5
|
||||
window.addEventListener("scroll", onScroll);
|
||||
// #endif
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
// #ifdef H5
|
||||
window.removeEventListener("scroll", onScroll);
|
||||
// #endif
|
||||
});
|
||||
|
||||
// #ifdef MP-WEIXIN || APP-PLUS
|
||||
onPageScroll(() => {
|
||||
throttledOnScroll();
|
||||
});
|
||||
// #endif
|
||||
|
||||
const scrollTab = computed(() => {
|
||||
let index = 0;
|
||||
let selectedTab = "";
|
||||
for (const i in props.tabs) {
|
||||
if (props.tabs[i].value === selected.value) {
|
||||
index = Number.parseInt(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (index === 1) {
|
||||
selectedTab = props.tabs[index - 1].value;
|
||||
} else if (index < 2 || index === props.tabs.length) {
|
||||
selectedTab = selected.value;
|
||||
} else {
|
||||
selectedTab = props.tabs[index - 1].value;
|
||||
}
|
||||
return `tab-${selectedTab}`;
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="fixed z-1000 bg-white px-8">
|
||||
<scroll-view
|
||||
:scroll-into-view="scrollTab"
|
||||
scroll-x
|
||||
:show-scrollbar="false"
|
||||
>
|
||||
<div class="relative flex">
|
||||
<div
|
||||
v-for="(tab, index) in tabs"
|
||||
:id="`tab-${tab.value}`"
|
||||
:key="index"
|
||||
class="h-8 min-w-1/5 shrink-0 cursor-pointer py-1 text-center text-xs font-bold line-height-6 line-height-8 transition-transform duration-200 ease-in-out"
|
||||
:class="{
|
||||
'text-gray-900 ': selected === tab.value,
|
||||
'text-gray-500': selected !== tab.value,
|
||||
}"
|
||||
@click="selectTab(tab)"
|
||||
>
|
||||
{{ tab.label }}
|
||||
</div>
|
||||
<div
|
||||
class="absolute bottom-0 h-1 rounded transition-all duration-300"
|
||||
:style="slideLineStyle"
|
||||
:class="lineClass"
|
||||
/>
|
||||
</div>
|
||||
</scroll-view>
|
||||
<div
|
||||
class="absolute right-0 top-0 h-6 w-8 cursor-pointer bg-white py-2 text-center line-height-6"
|
||||
@click="openPopup"
|
||||
>
|
||||
<wd-icon name="view-list" size="22px" />
|
||||
</div>
|
||||
<WdPopup v-model="showPopup" position="right" class="w-3/4">
|
||||
<view class="pt-20">
|
||||
<view
|
||||
v-for="tab in tabs"
|
||||
:key="tab.value"
|
||||
class="p-2 text-xs font-bold"
|
||||
:class="{ 'bg-gray-200 ': selected === tab.value }"
|
||||
@click="selectFromPopup(tab)"
|
||||
>
|
||||
{{ tab.label }}
|
||||
</view>
|
||||
</view>
|
||||
</WdPopup>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.iconfont {
|
||||
font-size: 20px;
|
||||
}
|
||||
</style>
|
||||
53
src/utils/crypto.js
Normal file
@@ -0,0 +1,53 @@
|
||||
import CryptoJS from 'crypto-js'
|
||||
|
||||
// AES CBC 加密,IV 拼接在密文前面,并进行 Base64 编码// AES CBC 加密,IV 拼接在密文前面,并进行 Base64 编码
|
||||
export function aesEncrypt(plainText, hexKey) {
|
||||
// 转换密钥为WordArray
|
||||
const key = CryptoJS.enc.Hex.parse(hexKey)
|
||||
|
||||
// 生成一个随机的IV
|
||||
const iv = generateRandomIV() // 生成 16 字节的随机 IV
|
||||
|
||||
// 加密
|
||||
const encrypted = CryptoJS.AES.encrypt(plainText, key, {
|
||||
iv,
|
||||
padding: CryptoJS.pad.Pkcs7,
|
||||
mode: CryptoJS.mode.CBC,
|
||||
})
|
||||
|
||||
// 拼接IV和密文,IV在前,密文在后,最后Base64编码
|
||||
const ivAndCipherText = iv.concat(encrypted.ciphertext)
|
||||
return CryptoJS.enc.Base64.stringify(ivAndCipherText)
|
||||
}
|
||||
|
||||
// AES CBC 解密,IV 在密文前面,并且 Base64 解码
|
||||
export function aesDecrypt(base64CipherText, hexKey) {
|
||||
// 转换密钥为WordArray
|
||||
const key = CryptoJS.enc.Hex.parse(hexKey)
|
||||
|
||||
// Base64解码并转换为WordArray
|
||||
const cipherParams = CryptoJS.enc.Base64.parse(base64CipherText)
|
||||
|
||||
// 提取 IV(前 16 字节)
|
||||
const iv = cipherParams.clone().words.slice(0, 4) // 16 字节的 IV 对应 4 个字(每个字 4 字节)
|
||||
|
||||
// 提取密文
|
||||
const cipherText = cipherParams.clone().words.slice(4) // 从第 4 个字开始到最后的密文
|
||||
|
||||
// 解密
|
||||
const decrypted = CryptoJS.AES.decrypt({ ciphertext: CryptoJS.lib.WordArray.create(cipherText) }, key, {
|
||||
iv: CryptoJS.lib.WordArray.create(iv),
|
||||
padding: CryptoJS.pad.Pkcs7,
|
||||
mode: CryptoJS.mode.CBC,
|
||||
})
|
||||
|
||||
// 返回解密后的明文
|
||||
return decrypted.toString(CryptoJS.enc.Utf8)
|
||||
}
|
||||
function generateRandomIV() {
|
||||
const iv = []
|
||||
for (let i = 0; i < 16; i++) { // 16 字节的 IV
|
||||
iv.push(Math.floor(Math.random() * 256)) // 0-255 的随机数
|
||||
}
|
||||
return CryptoJS.enc.Hex.parse(iv.map(b => b.toString(16).padStart(2, '0')).join(''))
|
||||
}
|
||||
246
src/views/Authorization.vue
Normal file
@@ -0,0 +1,246 @@
|
||||
<template>
|
||||
<div class="min-h-screen bg-gray-100 flex flex-col p-4">
|
||||
<!-- 标题 -->
|
||||
<div class="text-center text-2xl font-bold mb-4">授权书</div>
|
||||
|
||||
<!-- 授权书滚动区域 -->
|
||||
<div
|
||||
class="authrization-card card flex-1 overflow-y-auto"
|
||||
ref="agreementBox"
|
||||
@scroll="handleScroll"
|
||||
>
|
||||
<p class="my-2">海南省学宇思网络科技有限公司:</p>
|
||||
<p class="indent-[2em]">
|
||||
本人<span class="font-bold">
|
||||
{{ signature ? userData.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>
|
||||
你通过“全能查”APP或推广方推广查询模式,自愿支付相应费用,用于购买海南省学宇思网络科技有限公司的大数据报告产品。如若对产品内容存在异议,可通过邮箱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 ? userData.name : "____________"
|
||||
}}</span>
|
||||
<br />
|
||||
手机号码:<span class="underline">
|
||||
{{ signature ? userData.phone : "____________" }}
|
||||
</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";
|
||||
import { useFetch } from "@vueuse/core";
|
||||
|
||||
const userData = ref({
|
||||
name: "",
|
||||
idCard: "",
|
||||
phone: "",
|
||||
});
|
||||
const signature = ref(false);
|
||||
const agreed = ref(false);
|
||||
const id = ref(null);
|
||||
const token = ref(null);
|
||||
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);
|
||||
};
|
||||
// 接收来自 App 的参数
|
||||
onMounted(() => {
|
||||
// 如果是通过 query 参数传递数据
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
id.value = urlParams.get("id") || "";
|
||||
token.value = urlParams.get("token") || "";
|
||||
if (id.value && token.value) {
|
||||
const { data, isFetching, error, onFetchResponse } = useFetch(
|
||||
"/api/v1/query/provisional_order/" + id.value,
|
||||
{
|
||||
async beforeFetch({ url, options, cancel }) {
|
||||
options.headers = {
|
||||
...options.headers,
|
||||
Authorization: token.value,
|
||||
};
|
||||
|
||||
return {
|
||||
options,
|
||||
};
|
||||
},
|
||||
}
|
||||
)
|
||||
.get()
|
||||
.json();
|
||||
|
||||
onFetchResponse(() => {
|
||||
console.log("data", data.value);
|
||||
if (data.value.code === 200) {
|
||||
userData.value = {
|
||||
name: data.value.data.name,
|
||||
phone: data.value.data.mobile,
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 用户同意
|
||||
const agree = () => {
|
||||
if (!signature.value) {
|
||||
signature.value = true;
|
||||
return;
|
||||
}
|
||||
uni.postMessage({
|
||||
data: {
|
||||
action: "agreed",
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
// 用户取消
|
||||
const cancel = () => {
|
||||
uni.postMessage({
|
||||
data: {
|
||||
action: "cancelled",
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
document.addEventListener("UniAppJSBridgeReady", handleBridgeReady);
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
document.removeEventListener("UniAppJSBridgeReady", handleBridgeReady);
|
||||
});
|
||||
const handleBridgeReady = () => {
|
||||
uni.postMessage({
|
||||
data: {
|
||||
loaded: true,
|
||||
},
|
||||
});
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.authrization-card {
|
||||
max-height: calc(100vh - 200px);
|
||||
}
|
||||
</style>
|
||||
47
src/views/Complaint.vue
Normal file
@@ -0,0 +1,47 @@
|
||||
<template>
|
||||
<div class="support-chat">
|
||||
<h1>投诉中心</h1>
|
||||
<p>如果您有任何问题,请联系我们。</p>
|
||||
<p>请点击右下角按钮联系相关人员</p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
onMounted(() => {
|
||||
// 插入客服脚本
|
||||
(function (d, t) {
|
||||
var BASE_URL = "https://service.quannengcha.com";
|
||||
var g = d.createElement(t),
|
||||
s = d.getElementsByTagName(t)[0];
|
||||
g.src = BASE_URL + "/packs/js/sdk.js";
|
||||
g.defer = true;
|
||||
g.async = true;
|
||||
s.parentNode.insertBefore(g, s);
|
||||
g.onload = function () {
|
||||
window.chatwootSDK.run({
|
||||
websiteToken: "qfNrdMVTU8kTeXK5he1oCs1Q",
|
||||
baseUrl: BASE_URL,
|
||||
});
|
||||
};
|
||||
})(document, "script");
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.support-chat {
|
||||
text-align: center;
|
||||
padding: 20px;
|
||||
padding-top: 100px;
|
||||
}
|
||||
|
||||
.support-chat h1 {
|
||||
font-size: 28px;
|
||||
color: #005a9e;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.support-chat p {
|
||||
font-size: 16px;
|
||||
color: #333;
|
||||
}
|
||||
</style>
|
||||
261
src/views/Example.vue
Normal file
@@ -0,0 +1,261 @@
|
||||
<script setup>
|
||||
import CBad from "@/ui/CBad.vue";
|
||||
import CBankLoanApplication from "@/ui/CBankLoanApplication.vue";
|
||||
import CBankLoanBehavior from "@/ui/CBankLoanBehavior.vue";
|
||||
import CLawsuit from "@/ui/CLawsuit.vue";
|
||||
import CRelatedEnterprises from "@/ui/CRelatedEnterprises.vue";
|
||||
import CSpecialList from "@/ui/CSpecialList.vue";
|
||||
import { useHttp } from "@/composables/useHttp";
|
||||
|
||||
// import CTabs from "@/ui/CTabs.vue";
|
||||
// import { queryResultByOrder } from "@/api/apis";
|
||||
import CMarriage from "@/ui/CMarriage.vue";
|
||||
import { useFetch } from "@vueuse/core";
|
||||
|
||||
const productMap = {
|
||||
1: "背景调查",
|
||||
2: "企业报告",
|
||||
3: "家政服务",
|
||||
4: "婚姻状态",
|
||||
5: "贷前背景调查",
|
||||
6: "租赁服务",
|
||||
7: "个人风险评估",
|
||||
};
|
||||
|
||||
// 根据 product_id 获取产品名称
|
||||
function getProductName(productId) {
|
||||
return productMap[productId] || "未知类型";
|
||||
}
|
||||
const productId = ref(null);
|
||||
const isDone = ref(true);
|
||||
const entData = ref(null);
|
||||
const lawsuitData = ref(null);
|
||||
const badData = ref(null);
|
||||
const specialData = ref(null);
|
||||
const bankLoanApplicationData = ref(null);
|
||||
const marriageData = ref(null);
|
||||
const bankLoanBehavior = ref(null);
|
||||
const feature = ref(null);
|
||||
const token = ref(null);
|
||||
const tabs = ref([{ label: "报告概述", value: "overdiv" }]);
|
||||
const reportItems = ref([]);
|
||||
const sortedReportItems = computed(() => {
|
||||
return reportItems.value.slice().sort((a, b) => a.sort - b.sort);
|
||||
});
|
||||
const sortedTabs = computed(() => {
|
||||
return tabs.value.slice().sort((a, b) => a.sort - b.sort);
|
||||
});
|
||||
|
||||
onMounted(() => {
|
||||
const query = new URLSearchParams(window.location.search);
|
||||
feature.value = query.get("feature");
|
||||
token.value = query.get("token") || "";
|
||||
if (!feature.value) return;
|
||||
|
||||
const { data, isFetching, error, onFetchResponse } = useFetch(
|
||||
`/api/v1/query/example?feature=${feature.value}`,
|
||||
{
|
||||
async beforeFetch({ url, options, cancel }) {
|
||||
options.headers = {
|
||||
...options.headers,
|
||||
Authorization: token.value,
|
||||
};
|
||||
|
||||
return {
|
||||
options,
|
||||
};
|
||||
},
|
||||
}
|
||||
)
|
||||
.get()
|
||||
.json();
|
||||
|
||||
onFetchResponse(() => {
|
||||
console.log("data", data.value);
|
||||
if (data.value.code === 200) {
|
||||
productId.value = data.value.data.product_id;
|
||||
data.value.data.query_data.forEach((item) => {
|
||||
if (item.success) {
|
||||
switch (item.apiID) {
|
||||
case "G09SC02":
|
||||
marriageData.value = item.data;
|
||||
tabs.value.push({
|
||||
label: "婚姻状态",
|
||||
value: "marriage",
|
||||
sort: 1,
|
||||
});
|
||||
reportItems.value.push({
|
||||
label: "婚姻状态",
|
||||
value: "marriage",
|
||||
sort: 1,
|
||||
});
|
||||
break;
|
||||
case "G27BJ05":
|
||||
bankLoanApplicationData.value = item.data;
|
||||
tabs.value.push({
|
||||
label: "借贷申请记录",
|
||||
value: "netloan",
|
||||
sort: 7,
|
||||
});
|
||||
reportItems.value.push({
|
||||
label: "借贷申请记录",
|
||||
value: "netloan",
|
||||
sort: 7,
|
||||
});
|
||||
break;
|
||||
case "G28BJ05":
|
||||
bankLoanBehavior.value = item.data;
|
||||
tabs.value.push({
|
||||
label: "借贷记录",
|
||||
value: "loan",
|
||||
sort: 6,
|
||||
});
|
||||
reportItems.value.push({
|
||||
label: "借贷记录",
|
||||
value: "loan",
|
||||
sort: 6,
|
||||
});
|
||||
break;
|
||||
case "G26BJ05":
|
||||
specialData.value = item.data;
|
||||
tabs.value.push({
|
||||
label: "异常名单",
|
||||
value: "special",
|
||||
sort: 5,
|
||||
});
|
||||
reportItems.value.push({
|
||||
label: "异常名单",
|
||||
value: "special",
|
||||
sort: 5,
|
||||
});
|
||||
break;
|
||||
case "G05HZ01":
|
||||
entData.value = item.data;
|
||||
tabs.value.push({
|
||||
label: "关联企业",
|
||||
value: "ent",
|
||||
sort: 4,
|
||||
});
|
||||
reportItems.value.push({
|
||||
label: "关联企业",
|
||||
value: "ent",
|
||||
sort: 4,
|
||||
});
|
||||
break;
|
||||
case "G34BJ03":
|
||||
badData.value = item.data;
|
||||
tabs.value.push({
|
||||
label: "不良风险评估",
|
||||
value: "bad",
|
||||
sort: 3,
|
||||
});
|
||||
reportItems.value.push({
|
||||
label: "不良风险评估",
|
||||
value: "bad",
|
||||
sort: 3,
|
||||
});
|
||||
break;
|
||||
case "G35SC01":
|
||||
lawsuitData.value = item.data;
|
||||
tabs.value.push({
|
||||
label: "涉诉案件",
|
||||
value: "lawsuit",
|
||||
sort: 2,
|
||||
});
|
||||
reportItems.value.push({
|
||||
label: "涉诉案件",
|
||||
value: "lawsuit",
|
||||
sort: 2,
|
||||
});
|
||||
break;
|
||||
default:
|
||||
console.log(`未知的apiID: ${item.apiID}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="min-h-full from-blue-100 to-white bg-gradient-to-b">
|
||||
<template v-if="isDone">
|
||||
<div class="flex flex-col gap-y-4 p-4 pt-12">
|
||||
<div id="overdiv" class="title">报告概述</div>
|
||||
<div class="card">
|
||||
<div class="flex flex-col gap-y-2">
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-700 font-bold">报告时间:</span>
|
||||
<span class="text-gray-600">2024年11月18日 23:11:23</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-700 font-bold">报告项目:</span>
|
||||
<span class="text-gray-600">{{
|
||||
getProductName(productId)
|
||||
}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<LTitle class="my-4" title="报告内容" type="blue-green" />
|
||||
<div class="flex flex-col gap-y-2">
|
||||
<div v-for="item in sortedReportItems" :key="item.value" class="flex justify-between">
|
||||
<span class="text-gray-700 font-bold">{{ item.label }}:</span>
|
||||
<span class="text-green-500 font-bold">已解锁</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<template v-if="marriageData">
|
||||
<div id="marriage" class="title">婚姻状态</div>
|
||||
<CMarriage :data="marriageData" />
|
||||
</template>
|
||||
<template v-if="lawsuitData">
|
||||
<div id="lawsuit" class="title">涉诉案件</div>
|
||||
<CLawsuit :data="lawsuitData" />
|
||||
</template>
|
||||
<template v-if="badData">
|
||||
<div id="bad" class="title">不良风险评估</div>
|
||||
<CBad :data="badData" />
|
||||
</template>
|
||||
<template v-if="entData">
|
||||
<div id="ent" class="title">关联企业</div>
|
||||
<CRelatedEnterprises :data="entData" />
|
||||
</template>
|
||||
<template v-if="specialData">
|
||||
<div id="special" class="title">异常名单</div>
|
||||
<CSpecialList :data="specialData" />
|
||||
</template>
|
||||
<template v-if="bankLoanBehavior">
|
||||
<div id="loan" class="title">借贷记录</div>
|
||||
<CBankLoanBehavior :data="bankLoanBehavior" />
|
||||
</template>
|
||||
<template v-if="bankLoanApplicationData">
|
||||
<div id="netloan" class="title">贷款申请记录</div>
|
||||
<CBankLoanApplication :data="bankLoanApplicationData" />
|
||||
</template>
|
||||
<div class="card">
|
||||
<div>
|
||||
<div class="text-bold text-blue-500 mb-2">报告说明</div>
|
||||
<div>
|
||||
本报告的数据由用户本人明确授权后,我们才向相关合法存有用户个人数据的机构调取本报告相关内容,本平台只做大数据的获取与分析,仅向用户个人展示参考。
|
||||
</div>
|
||||
<p>
|
||||
报告有效期<strong class="text-red-500">30天</strong>,过期自动删除。
|
||||
</p>
|
||||
<p>
|
||||
|
||||
若您的数据不全面,可能是数据具有延迟性或者合作信息机构未获取到您的数据。若数据有错误请联系客服
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.title {
|
||||
@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;
|
||||
}
|
||||
</style>
|
||||
124
src/views/Home.vue
Normal file
@@ -0,0 +1,124 @@
|
||||
<template>
|
||||
<div class="font-sans text-gray-800">
|
||||
<!-- 头部导航 -->
|
||||
<header
|
||||
class="flex justify-between items-center bg-blue-100 p-4 border-b border-blue-200"
|
||||
>
|
||||
<div class="text-2xl font-bold text-blue-700">全能查 APP</div>
|
||||
<button
|
||||
class="lg:hidden text-blue-700 text-2xl focus:outline-none transition-transform transform hover:scale-110"
|
||||
@click="toggleMenu"
|
||||
>
|
||||
<span v-if="!isMenuOpen">☰</span>
|
||||
<span v-else>✕</span>
|
||||
</button>
|
||||
<nav
|
||||
:class="`lg:flex lg:items-center lg:gap-6 ${
|
||||
isMenuOpen
|
||||
? 'flex flex-col items-end absolute top-16 right-0 bg-blue-100 w-full shadow-md py-4 px-6'
|
||||
: 'hidden'
|
||||
}`"
|
||||
>
|
||||
<a
|
||||
href="#support"
|
||||
class="text-blue-700 hover:text-blue-500 transition-colors"
|
||||
@click="toggleMenu"
|
||||
>联系我们</a
|
||||
>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<!-- 横幅 -->
|
||||
<section
|
||||
class="text-center py-16 bg-gradient-to-r from-blue-100 to-blue-200 text-blue-800"
|
||||
>
|
||||
<h1 class="text-4xl lg:text-5xl font-bold mb-4 animate-fade-in">
|
||||
防范风险,从全能查开始
|
||||
</h1>
|
||||
<p class="text-lg lg:text-xl mb-6 animate-fade-in delay-200">
|
||||
全能查 APP,为您的安全保驾护航
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<!-- APP 预览 -->
|
||||
<section id="features" class="py-16 bg-blue-50 text-center">
|
||||
<h2 class="text-3xl font-bold text-blue-700 mb-6">APP 预览</h2>
|
||||
<div class="flex flex-wrap justify-center gap-6">
|
||||
<img
|
||||
class="shadow-lg rounded-lg transition-transform transform hover:scale-105 h-96 object-contain"
|
||||
src="/image/app_1.jpg"
|
||||
alt="APP preview"
|
||||
/>
|
||||
<img
|
||||
class="shadow-lg rounded-lg transition-transform transform hover:scale-105 h-96 object-contain"
|
||||
src="/image/app_2.jpg"
|
||||
alt="APP preview"
|
||||
/>
|
||||
<img
|
||||
class="shadow-lg rounded-lg transition-transform transform hover:scale-105 h-96 object-contain"
|
||||
src="/image/app_3.jpg"
|
||||
alt="APP preview"
|
||||
/>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 技术支持 -->
|
||||
<section id="support" class="py-16 bg-blue-100 text-center">
|
||||
<h2 class="text-3xl font-bold text-blue-700 mb-4">技术支持</h2>
|
||||
<p class="text-lg text-blue-800 mb-2">
|
||||
如需帮助,请通过以下邮箱联系我们:
|
||||
</p>
|
||||
<p
|
||||
class="text-blue-700 underline hover:text-blue-500 transition-colors"
|
||||
>
|
||||
<a href="mailto:admin@iieeii.com">admin@iieeii.com</a>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<!-- 页脚 -->
|
||||
<footer class="bg-blue-200 text-gray-700 text-center py-4">
|
||||
<div class="flex items-center justify-center gap-2">
|
||||
<img
|
||||
src="https://qcloudimg.tencent-cloud.cn/raw/eed02831a0e201b8d794c8282c40cf2e.png"
|
||||
alt="网安 icon"
|
||||
class="w-6 h-6"
|
||||
/>
|
||||
<p class="text-sm">
|
||||
琼公网安备 46010002000443 号 | 琼ICP备 2024038584 号-2
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from "vue";
|
||||
|
||||
const isMenuOpen = ref(false);
|
||||
|
||||
function toggleMenu() {
|
||||
isMenuOpen.value = !isMenuOpen.value;
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
@keyframes fade-in {
|
||||
0% {
|
||||
opacity: 0;
|
||||
transform: translateY(10px);
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
.animate-fade-in {
|
||||
animation: fade-in 1s ease-out;
|
||||
}
|
||||
.animate-fade-in.delay-200 {
|
||||
animation-delay: 0.2s;
|
||||
}
|
||||
.animate-fade-in.delay-400 {
|
||||
animation-delay: 0.4s;
|
||||
}
|
||||
</style>
|
||||
304
src/views/Inquire.vue
Normal file
@@ -0,0 +1,304 @@
|
||||
<script setup>
|
||||
import { ref, reactive, computed, onMounted, onUnmounted } from "vue";
|
||||
import { aesEncrypt } from '@/utils/crypto'
|
||||
import { useRoute } from "vue-router";
|
||||
import { useWebView } from "@/composables/useWebView";
|
||||
import Authorization from "@/components/Authorization.vue";
|
||||
import Payment from "@/components/Payment.vue";
|
||||
|
||||
const route = useRoute();
|
||||
useWebView()
|
||||
|
||||
const showAuthorizationPopup = ref(false)
|
||||
const authorization = ref(false)
|
||||
const showPayment = ref(false)
|
||||
const queryId = ref(null)
|
||||
const name = ref("");
|
||||
const idCard = ref("");
|
||||
const mobile = ref("");
|
||||
const entName = ref("");
|
||||
const entCode = ref("");
|
||||
const verificationCode = ref("");
|
||||
const agreeToTerms = ref(false);
|
||||
const isCountingDown = ref(false);
|
||||
const countdown = ref(60);
|
||||
const feature = ref(route.params.feature);
|
||||
const featureData = ref({});
|
||||
|
||||
onMounted(() => {
|
||||
getProduct()
|
||||
initAuthorization()
|
||||
});
|
||||
async function getProduct() {
|
||||
const { data, error } = await useApiFetch(`/product/en/${feature.value}`)
|
||||
.get()
|
||||
.json();
|
||||
|
||||
if (data.value) {
|
||||
featureData.value = data.value.data;
|
||||
}
|
||||
}
|
||||
function initAuthorization() {
|
||||
if (noAuthorization.includes(feature.value)) {
|
||||
authorization.value = true
|
||||
}
|
||||
}
|
||||
const isPhoneNumberValid = computed(() => {
|
||||
return /^1[3-9]\d{9}$/.test(mobile.value);
|
||||
});
|
||||
const isIdCardValid = computed(() => /^\d{17}[\dX]$/i.test(idCard.value));
|
||||
const isCreditCodeValid = computed(() => /^.{18}$/.test(entCode.value));
|
||||
|
||||
|
||||
function handleSubmit() {
|
||||
if (!agreeToTerms.value) {
|
||||
showToast({ message: "请阅读并同意用户协议和隐私政策" });
|
||||
return;
|
||||
}
|
||||
if (
|
||||
!validateField('name', name.value, v => v, '请输入姓名') ||
|
||||
!validateField('mobile', mobile.value, v => isPhoneNumberValid.value, '请输入有效的手机号') ||
|
||||
!validateField('idCard', idCard.value, v => isIdCardValid.value, '请输入有效的身份证号码') ||
|
||||
!validateField('verificationCode', verificationCode.value, v => v, '请输入验证码') ||
|
||||
!validateField('entName', entName.value, v => v, '请输入企业名称') ||
|
||||
!validateField('entCode', entCode.value, v => isCreditCodeValid.value, '请输入统一社会信用代码')
|
||||
) {
|
||||
return;
|
||||
}
|
||||
submitRequest()
|
||||
}
|
||||
const validateField = (field, value, validationFn, errorMessage) => {
|
||||
if (isHasInput(field) && !validationFn(value)) {
|
||||
showToast({ message: errorMessage });
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
const defaultInput = ["name", "mobile", "idCard", "verificationCode"]
|
||||
const specialProduct = {
|
||||
"toc_EnterpriseLawsuit": ["entName", "entCode", "mobile", "verificationCode"]
|
||||
}
|
||||
const noAuthorization = ["toc_EnterpriseLawsuit"]
|
||||
const isHasInput = (input) => {
|
||||
if (specialProduct[feature.value]) {
|
||||
return specialProduct[feature.value].includes(input)
|
||||
} else {
|
||||
return defaultInput.includes(input)
|
||||
}
|
||||
}
|
||||
async function submitRequest() {
|
||||
const req = {}
|
||||
if (isHasInput('name')) {
|
||||
req.name = name.value
|
||||
}
|
||||
if (isHasInput('id_card')) {
|
||||
req.id_card = idCard.value
|
||||
}
|
||||
if (isHasInput('mobile')) {
|
||||
req.mobile = mobile.value
|
||||
}
|
||||
if (isHasInput('verificationCode')) {
|
||||
req.code = verificationCode.value
|
||||
}
|
||||
if (isHasInput('entName')) {
|
||||
req.ent_name = entName.value
|
||||
}
|
||||
if (isHasInput('entCode')) {
|
||||
req.ent_code = entCode.value
|
||||
}
|
||||
const reqStr = JSON.stringify(req)
|
||||
const encodeData = aesEncrypt(reqStr, 'ff83609b2b24fc73196aac3d3dfb874f')
|
||||
const { data, error } = await useApiFetch(`/query/service/${feature.value}`)
|
||||
.post({ data: encodeData })
|
||||
.json();
|
||||
if (data.value.code === 200) {
|
||||
queryId.value = data.value.data.id
|
||||
if (authorization.value) {
|
||||
showPayment.value = true
|
||||
} else {
|
||||
showAuthorizationPopup.value = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async function sendVerificationCode() {
|
||||
if (isCountingDown.value || !isPhoneNumberValid.value)
|
||||
return
|
||||
if (!isPhoneNumberValid.value) {
|
||||
showToast({ message: "请输入有效的手机号" });
|
||||
return;
|
||||
}
|
||||
|
||||
const { data, error } = await useApiFetch("/auth/sendSms")
|
||||
.post({ mobile: mobile.value, actionType: "query" })
|
||||
.json();
|
||||
|
||||
if (!error.value && data.value.code === 200) {
|
||||
showToast({ message: "验证码发送成功", type: "success" });
|
||||
startCountdown();
|
||||
} else {
|
||||
showToast({ message: "验证码发送失败,请重试" });
|
||||
}
|
||||
}
|
||||
let timer = null;
|
||||
|
||||
function startCountdown() {
|
||||
isCountingDown.value = true;
|
||||
countdown.value = 60;
|
||||
timer = setInterval(() => {
|
||||
if (countdown.value > 0) {
|
||||
countdown.value--;
|
||||
} else {
|
||||
clearInterval(timer);
|
||||
isCountingDown.value = false;
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
function toUserAgreement() {
|
||||
uni.navigateTo({
|
||||
url: '/pages/userAgreement'
|
||||
})
|
||||
}
|
||||
function toPrivacyPolicy() {
|
||||
uni.navigateTo({
|
||||
url: '/pages/privacyPolicy'
|
||||
})
|
||||
}
|
||||
// 用户同意
|
||||
const agreed = () => {
|
||||
showAuthorizationPopup.value = false
|
||||
authorization.value = true
|
||||
showPayment.value = true
|
||||
};
|
||||
|
||||
// 用户取消
|
||||
const cancel = () => {
|
||||
showAuthorizationPopup.value = false
|
||||
};
|
||||
const toExample = () => {
|
||||
uni.navigateTo({
|
||||
url: '/pages/example'
|
||||
})
|
||||
};
|
||||
onUnmounted(() => {
|
||||
if (timer) {
|
||||
clearInterval(timer);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="inquire-bg min-h-screen p-6">
|
||||
<div class="mb-6 text-center text-3xl font-bold text-blue-700">
|
||||
{{ featureData.product_name }}
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="mb-4 text-lg font-semibold text-gray-800">基本信息</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('name')">
|
||||
<label for="name" class="form-label">姓名</label>
|
||||
<input v-model="name" id="name" type="text" placeholder="请输入姓名" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('idCard')">
|
||||
<label for="idCard" class="form-label">身份证号</label>
|
||||
<input v-model="idCard" id="idCard" type="text" placeholder="请输入身份证号" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('entName')">
|
||||
<label for="entName" class="form-label">企业名称</label>
|
||||
<input v-model="entName" id="entName" type="text" placeholder="请输入企业名称" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('entCode')">
|
||||
<label for="entCode" class="form-label">统一社会信用代码</label>
|
||||
<input v-model="entCode" id="entCode" type="text" placeholder="请输入统一社会信用代码" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('mobile')">
|
||||
<label for="mobile" class="form-label">手机号</label>
|
||||
<input v-model="mobile" id="mobile" type="tel" placeholder="请输入手机号" class="form-input" />
|
||||
</div>
|
||||
<div class="mb-4 flex items-center" v-if="isHasInput('verificationCode')">
|
||||
<label for="verificationCode" class="form-label">验证码</label>
|
||||
<div class="flex-1 flex items-center">
|
||||
<input v-model="verificationCode" id="verificationCode" type="text" placeholder="请输入验证码"
|
||||
class="form-input flex-1" />
|
||||
<button class="ml-2 px-4 py-2 text-sm text-blue-500 disabled:text-gray-400"
|
||||
:disabled="isCountingDown || !isPhoneNumberValid" @click="sendVerificationCode">
|
||||
{{ isCountingDown ? `${countdown}s重新获取` : '获取验证码' }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4 flex items-center">
|
||||
<input type="checkbox" v-model="agreeToTerms" />
|
||||
<span class="ml-2 text-xs text-gray-400">
|
||||
我已阅读并同意
|
||||
<span @click="toUserAgreement" class="text-blue-500 underline">用户协议</span>和
|
||||
<span @click="toPrivacyPolicy" class="text-blue-500 underline">隐私政策</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="flex items-center">
|
||||
<button class="w-24 rounded-l-xl bg-blue-400 py-2 text-white" @click="toExample">
|
||||
示例报告
|
||||
</button>
|
||||
<button class="flex-1 rounded-r-xl bg-blue-500 py-2 text-white" @click="handleSubmit">
|
||||
立即查询
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mt-4">
|
||||
<div class="mb-6 text-xl text-gray-800 font-bold">
|
||||
{{ featureData.product_name }}
|
||||
</div>
|
||||
|
||||
<div class="mb-4 text-gray-600 leading-relaxed">
|
||||
{{ featureData.description }}
|
||||
</div>
|
||||
|
||||
<div class="mb-6 flex items-center justify-between">
|
||||
<div class="text-lg text-gray-500">
|
||||
价格:
|
||||
</div>
|
||||
<div class="text-lg text-blue-600 font-semibold">
|
||||
¥{{ featureData.sell_price }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4 text-lg text-gray-800 font-semibold">
|
||||
报告主要内容
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div v-for="(feature, index) in featureData.features" :key="feature.id"
|
||||
class="rounded-lg py-2 text-center text-sm text-gray-700 font-medium" :class="[
|
||||
(Math.floor(index / 2) + (index % 2)) % 2 === 0
|
||||
? 'bg-gradient-to-r from-blue-200 via-blue-200 to-blue-100'
|
||||
: 'bg-gradient-to-r from-sky-200 via-sky-200 to-sky-100',
|
||||
]">
|
||||
{{ feature.name }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 底部弹出 -->
|
||||
<van-popup v-model:show="showAuthorizationPopup" position="bottom" :style="{ height: '80%' }">
|
||||
<Authorization :style="{ height: '100%' }" :name="name" :id-card="idCard" :mobile="mobile" @agreed="agreed"
|
||||
@cancel="cancel" />
|
||||
</van-popup>
|
||||
<Payment v-model="showPayment" :data="featureData" :id="queryId" @close="showPayment = false" />
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.form-label {
|
||||
@apply w-20 text-sm font-medium text-gray-700 flex-shrink-0;
|
||||
}
|
||||
|
||||
.form-input {
|
||||
@apply w-full border-b border-gray-200 px-2 py-2 focus:outline-none;
|
||||
}
|
||||
|
||||
.inquire-bg {
|
||||
background: url("@/assets/images/inquire_banner_2.png") no-repeat;
|
||||
background-position: center;
|
||||
background-size: cover;
|
||||
}
|
||||
</style>
|
||||
47
src/views/NotFound.vue
Normal file
@@ -0,0 +1,47 @@
|
||||
<template>
|
||||
<div class="not-found">
|
||||
<h1>404</h1>
|
||||
<p>抱歉,您访问的页面不存在。</p>
|
||||
<router-link to="/" class="home-link">返回首页</router-link>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "NotFound",
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.not-found {
|
||||
text-align: center;
|
||||
padding: 50px 20px;
|
||||
}
|
||||
|
||||
.not-found h1 {
|
||||
font-size: 100px;
|
||||
color: #005a9e;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.not-found p {
|
||||
font-size: 18px;
|
||||
color: #333;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.home-link {
|
||||
display: inline-block;
|
||||
padding: 10px 20px;
|
||||
font-size: 16px;
|
||||
color: #fff;
|
||||
background-color: #005a9e;
|
||||
text-decoration: none;
|
||||
border-radius: 4px;
|
||||
transition: background-color 0.3s;
|
||||
}
|
||||
|
||||
.home-link:hover {
|
||||
background-color: #003f73;
|
||||
}
|
||||
</style>
|
||||
633
src/views/PrivacyPolicy.vue
Normal file
@@ -0,0 +1,633 @@
|
||||
<script setup>
|
||||
import { useWebView } from "@/composables/useWebView";
|
||||
useWebView()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="p-4">
|
||||
<!-- 页面标题 -->
|
||||
<div class="mb-4 text-center text-lg font-bold">隐私政策</div>
|
||||
|
||||
<!-- 内容主体 -->
|
||||
<div class="indent-[2em]">
|
||||
<div class="mb-4">
|
||||
<!-- 开篇说明 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
您的信任对我们非常重要
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
我们深知个人信息对您的重要性,我们将按法律法规要求,采取相应安全保护措施,尽力保护您的个人信息安全可控。
|
||||
有鉴于此,海南省学宇思网络科技有限公司(以下简称“我们”或“全能查”)作为全能查产品及服务的提供者制定本《隐私政策》(下称“本政策”)并提醒您:
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
本政策适用于全部全能查产品及服务,如我们关联公司的产品或服务中使用了全能查提供的产品或服务但未设独立的隐私政策的,
|
||||
该部分全能查提供的产品或服务同样适用于本政策。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
需要特别说明的是,本政策不适用于其他第三方通过网页或全能查客户端直接向您提供的服务(统称“第三方服务”),
|
||||
您向该第三方服务提供者提供的信息不适用于本政策,您在选择使用第三方服务前应充分了解第三方服务的产品功能及隐私保护政策,再选择是否开通功能。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
在使用全能查产品或服务前,请您务必仔细阅读并透彻理解本政策,在确认充分理解使用相关产品或服务。
|
||||
一旦您开始使用全能查产品或服务,即表示您已充分理解并同意本政策。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-2 font-bold leading-relaxed">第一部分 定义</div>
|
||||
<div class="mb-4">
|
||||
<!-- 第一部分 -->
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
1、全能查服务提供者:是指研发并提供全能查产品和服务法律主体,海南省学宇思网络科技有限公司(下称“我们”或“全能查”)
|
||||
</div>
|
||||
<div>
|
||||
2、全能查用户:是指注册全能查账户的用户,以下称“您”。
|
||||
</div>
|
||||
<div>
|
||||
3、个人信息:指以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息。
|
||||
</div>
|
||||
<div>
|
||||
4、个人信息删除:指在实现日常业务功能所涉及的系统中去除个人信息的行为,使其保持不可被检索、访问的状态,具体指产品内的账号注销功能。
|
||||
</div>
|
||||
<div>
|
||||
5、个人信息匿名化:通过对个人信息的加密技术处理,使得个人信息主体无法被识别,且处理后的信息不能被复原的过程。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-2 font-bold leading-relaxed">第二部分 隐私政策</div>
|
||||
<div class="mb-4">
|
||||
<!-- 第一部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
一、我们如何收集您的个人信息
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
为了向您及全能查企业用户提供全能查服务,维护全能查服务的正常运行,改进及优化我们的服务体验并保障您的账号安全,
|
||||
我们会出于本政策下述目的及方式收集您在注册、使用全能查服务时主动提供、授权提供或基于您使用全能查服务时产生的信息:
|
||||
</div>
|
||||
|
||||
<!-- 注册全能查用户信息 -->
|
||||
<div class="mb-4">
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
(一)注册全能查用户信息
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
为注册成为全能查用户,以便我们为您提供全能查服务,诸如数据查询、视频查看等功能,
|
||||
您需要提供您的手机号码及短信验证码以注册并创建全能查账号,否则您将不能使用全能查服务。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
如果您仅需使用浏览、搜索全能查网页展示的产品、功能及服务介绍,您不需要注册成为全能查用户并提供上述信息。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
如您的账号是注册在企业下的关联账号,当您所在企业用户注销全能查账户时,我们将会匿名化处理或删除您在该组织的相关个人信息,
|
||||
但您作为全能查个人用户的个人信息仍将保留,除非您主动注销全能查账户。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
在经过用户授权同意的情况下,我司需要获取用户的手机号码以便开展相应业务。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 使用全能查服务过程中收集信息 -->
|
||||
<div class="mb-4">
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
(二)使用全能查服务过程中收集信息
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
当您在使用全能查服务过程中,为向您提供您需求的全能查软件服务、交互展示、搜索结果、识别账号异常状态,维护全能查服务的正常运行,改进及优化您对全能查服务的体验并保障您的账号安全,包括您使用全能查服务以及使用方式的信息,并将这些信息进行关联:
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>1、使用信息:</div>
|
||||
<div>
|
||||
在提供服务过程中,为了保证您能正常使用产品功能,我们可能会向系统申请您的设备权限,可能包括但不限于IMEI、IMSI、设备MAC地址、软件列表、设备序列号、android
|
||||
ID等。申请前我们会通过弹窗或页面说明的方式征询您的同意,你可以选择“允许”或“禁止”权限申请。因少量设备厂商在应用安装时就默认您给予了部分基础权限,不支持弹窗确认功能,具体我们建议您关注您的设备功能说明及权限列表,如您不同意给我们这些权限的,您可以及时通过设备中设置的路径取消对我们的授权;支持弹窗功能的设备权限申请成功后,您可以随时进入设备“设置-权限管理”中关闭相应权限,权限关闭后相关产品功能可能无法正常使用。在不同设备中,权限显示方式及关闭方式可能有所不同,具体请您参考设备及系统开发方说明或指引。
|
||||
</div>
|
||||
<div>
|
||||
提供服务过程中主要涉及的访问权限如下:
|
||||
基于设备相机及相册权限的附加功能:出于您的使用需求,当您需要在使用在线客服的相机、相册时,我们需要取得您的设备相机或相册权限,并收集您提供的图文和/或视频信息。如您拒绝提供仅会使您无法在相关功能中添加图片和/或视频,但并不影响您正常使用其他功能。
|
||||
</div>
|
||||
<div>
|
||||
基于设备麦克风权限的附加功能:若您需要在使用客服电话服务时,我们需要取得您的设备麦克风权限,并收集您的语音信息。如您拒绝提供仅会使您无法使用相关语音功能,但并不影响您正常使用其他功能。
|
||||
</div>
|
||||
<div>
|
||||
您理解并同意,前述涉及设备权限(相机(摄像头)、相册、麦克风、通讯录、)的授权需要您在您的设备中打开相关访问权限,以实现这些权限所涉及信息的收集与使用。您亦可以在您的设备中查看或调整前述权限状态。您了解并知悉,一旦您开启权限则表示您授权我们可以收集和使用相关个人信息来为您提供相关服务;一旦您关闭该权限则表示您取消了授权,我们将不再基于该权限继续收集和使用相关个人信息,也无法为您提供对应的服务与功能。但是,您的关闭行为并不会影响此前基于您的授权行为所进行的信息收集与使用。
|
||||
</div>
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>2、设备信息:</div>
|
||||
<div>
|
||||
我们会根据您在软件安装及使用中授予的具体权限,接收并记录您所使用的设备相关信息(例如设备型号、操作系统版本、设备设置、唯一设备标识符等软硬件特征信息)、设备所在位置相关信息(例如IP地址、GPS/北斗位置信息以及能够提供相关信息的Wi-Fi接入点、蓝牙和基站等传感器信息)。
|
||||
</div>
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>3、日志信息:</div>
|
||||
<div>
|
||||
当您使用我们的网站或客户端提供的产品或服务时,我们会自动收集您对我们服务的详细使用情况,作为有关网络日志保存。例如您的搜索查询内容、IP地址、使用的语言、访问日期和时间、您访问的网页记录、日志信息。
|
||||
</div>
|
||||
<div>
|
||||
请注意,单独的设备信息、日志信息是无法识别特定自然人身份的信息。如果我们将这类非个人信息与其他信息结合用于识别特定自然人身份,或者将其与个人信息结合使用,则在结合使用期间,这类非个人信息将有可能被视为个人信息,除取得您授权或法律法规另有规定外,我们会将该类个人信息做匿名化、去标识化处理。
|
||||
</div>
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>4、您向我们提供的信息:</div>
|
||||
<div>
|
||||
在服务使用过程中,您可以对全能查产品及服务的体验问题反馈,帮助我们更好地了解您使用我们产品或服务的体验和需求,改善我们产品或服务,为此我们会记录您的联系信息、反馈的问题或建议,以便我们进一步联系您反馈您我们的处理意见。
|
||||
为向您提供更好的服务,例如在不同的服务端或设备上提供体验一致的服务和您需求的客服接待,了解产品适配性,识别账号异常状态。
|
||||
</div>
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>5、第三方软件开发包(SDK):</div>
|
||||
<div>
|
||||
我们产品中可能会包含第三方SDK或其他类似的应用程序,如您在我们平台上使用这类由第三方提供的服务时,您同意将由其直接收集和处理您的信息(如以嵌入代码、插件等形式),例如:当您使用支付宝账号授权我们的产品时,支付宝SDK需要收集您的账号信息。前述服务商收集和处理信息等行为遵守其自身的隐私条款,而不适用于本政策。但我们也会努力审查该第三方的业务准入资质并努力要求该服务商的合法合规性与安全性。为了最大程度保障您的信息安全,我们强烈建议您在使用任何第三方SDK类服务前先行查看其隐私条款。为保障您的合法权益,如您发现这等SDK或其他类似的应用程序存在风险时,建议您立即终止相关操作并及时与我们取得联系;
|
||||
</div>
|
||||
<div>以下是我们目前接入的第三方SDK类服务商的信息:</div>
|
||||
<div class="mb-4">
|
||||
<div class="mb-2 text-center text-xl font-bold leading-relaxed">
|
||||
权限清单
|
||||
</div>
|
||||
<div class="w-full table border-collapse border border-gray-300">
|
||||
<div class="table-row bg-gray-100">
|
||||
<div class="table-cell border border-gray-300 p-2 font-bold">
|
||||
权限名称
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2 font-bold">
|
||||
权限功能说明
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2 font-bold">
|
||||
使用场景或目的
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2 font-bold">
|
||||
使用平台
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-row">
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
读取/写入外置存储
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
读取和写入设备储存空间内的数据
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
用于保障全能查的稳定运行,以便用户在使用功能时可读取、写入/下载/保存/修改图片、文件、崩溃日志等信息
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
Android、iOS
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-row">
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
位置
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
通过GPS或网络位置信息获取设备所在的地理位置信息
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
用于安全保障、提供精准服务和内容
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
Android、iOS
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-row">
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
摄像头
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
使用摄像头拍摄图片
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
用于完成照片的拍摄和发布
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
Android、iOS
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-row">
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
读取/写入相册
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
读取和写入设备相册中的内容
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
用于设置头像图片,以及完成照片的发布
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
Android、iOS
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<div class="mb-2 text-center text-xl font-bold leading-relaxed">
|
||||
Android操作系统第三方SDK列表
|
||||
</div>
|
||||
<div class="w-full table border-collapse border border-gray-300">
|
||||
<div class="table-row bg-gray-100">
|
||||
<div class="table-cell border border-gray-300 p-2 font-bold">
|
||||
第三方SDK名称
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2 font-bold">
|
||||
应用场景
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2 font-bold">
|
||||
收集个人信息的类型
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2 font-bold">
|
||||
第三方SDK提供方
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2 font-bold">
|
||||
隐私政策链接
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-row">
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
支付宝SDK
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
提供支付宝支付、提现能力
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
网络状态信息、设备信息、本机号码
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
支付宝
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2 text-blue-500">
|
||||
<a href="https://render.alipay.com/p/c/k2cx0tg8" target="_blank">查看隐私政策</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<div class="mb-2 text-center text-xl font-bold leading-relaxed">
|
||||
IOS操作系统第三方SDK列表
|
||||
</div>
|
||||
<div class="w-full table border-collapse border border-gray-300">
|
||||
<div class="table-row bg-gray-100">
|
||||
<div class="table-cell border border-gray-300 p-2 font-bold">
|
||||
第三方SDK名称
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2 font-bold">
|
||||
应用场景
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2 font-bold">
|
||||
收集个人信息的类型
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2 font-bold">
|
||||
第三方SDK提供方
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2 font-bold">
|
||||
隐私政策链接
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-row">
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
支付宝SDK
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
提供支付宝支付、提现能力
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
网络状态信息、设备信息、本机号码
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2">
|
||||
支付宝
|
||||
</div>
|
||||
<div class="table-cell border border-gray-300 p-2 text-blue-500">
|
||||
<a href="https://render.alipay.com/p/c/k2cx0tg8" target="_blank">查看隐私政策</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>6、为您提供安全保障收集信息:</div>
|
||||
<div>
|
||||
为预防、发现、调查欺诈、侵权、危害安全、非法或违反与我们或与我们关联公司的协议、政策或规则的行为,我们可能收集或整合您的用户个人信息、服务使用信息、设备信息、日志信息以及我们关联公司、合作伙伴取得您授权或依据法律共享的信息。
|
||||
您理解并同意,我们向您提供的功能和服务场景是不断迭代升级的,如我们未在上述场景中明示您需要收集的个人信息,我们将会通过页面提示、交互设计等方式另行向您明示信息收集的内容、范围和目的并征得您同意。
|
||||
</div>
|
||||
<div>
|
||||
如我们停止运营全能查产品或服务,我们将及时停止继续收集您个人信息的活动,将停止运营的通知以公告或短信的形式通知您,并依照所适用的法律对所持有的您的个人信息进行删除或匿名化处理。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<!-- 第二部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
二、我们如何使用信息
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
收集您的信息是为了向您提供服务及提升服务质量,为了实现这一目的,我们会把您的信息用于下列用途:
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(1)向您提供您使用的全能查产品或服务,并维护、改进、优化这些服务及服务体验;
|
||||
</div>
|
||||
<div>
|
||||
(2)为预防、发现、调查欺诈、侵权、危害安全、非法或违反与我们或与我们关联公司的协议、政策或规则的行为,保护您、其他用户或公众以及我们或我们关联公司的合法权益,我们会使用或整合您的个人信息、服务使用信息、设备信息、日志信息以及我们关联公司、合作伙伴取得您授权或依据法律共享的信息,来综合判断您的操作风险、检测及防范安全事件,并依法采取必要的记录、审计、分析、处置措施;
|
||||
</div>
|
||||
<div>(3)经您许可的其他用途。</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第三部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
三、我们如何使用Cookie 和同类技术
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
为使您获得更轻松的访问体验,您使用全能查产品或服务时,我们可能会通过采用各种技术收集和存储您访问全能查服务的相关数据,
|
||||
在您访问或再次访问全能查服务时,我们能识别您的身份,并通过分析数据为您提供更好更多的服务。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
包括使用小型数据文件识别您的身份,这么做是为了解您的使用习惯,帮您省去重复输入账户信息的步骤,或者帮助判断您的账户安全。
|
||||
这些数据文件可能是Cookie、Flash
|
||||
Cookie,或您的浏览器或关联应用程序提供的其他本地存储(统称“Cookie”)。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
请您理解,我们的某些服务只能通过使用Cookie才可得到实现。如果您的浏览器或浏览器附加服务允许,
|
||||
您可以修改对Cookie的接受程度或者拒绝全能查的Cookie,但拒绝全能查的Cookie在某些情况下您可能无法使用依赖于cookies的全能查服务的部分功能。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第四部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
四、我们如何共享、转让、公开披露您的信息
|
||||
</div>
|
||||
|
||||
<!-- 共享 -->
|
||||
<div class="mb-2 font-semibold">(一) 共享</div>
|
||||
<div class="leading-relaxed">
|
||||
我们不会和其他公司、组织和个人共享您的个人信息,但以下情况除外:
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(1)在获取您同意的情况下共享:获得您的明确同意后,我们会与其他方共享您的个人信息。
|
||||
</div>
|
||||
<div>
|
||||
(2)在法定情形下的共享:我们可能会根据法律法规规定、诉讼争议解决需要,或按行政、司法机关依法提出的要求,对外共享您的个人信息。
|
||||
</div>
|
||||
<div>
|
||||
(3)只有透露您的资料,才能提供您所要求的第三方产品和服务,在您通过全能查客户端购买查询服务的,您同意全能查向实际产品提供者提供您的身份信息,包括真实姓名和身份证号等。为了提升实人认证的准确性,您同意第三方公司仅限于个人信息进行验证相关服务,将您提供的个人信息与法律法规允许的机构或政府机关授权的机构的数据进行校验。
|
||||
</div>
|
||||
<div>
|
||||
(4)在您被他人投诉侵犯知识产权或其他合法权利时,需要向投诉人披露您的必要资料,以便进行投诉处理的;
|
||||
</div>
|
||||
<div>
|
||||
(5)全能查服务可能含有其他网站的链接。除法律另有规定外,全能查对其他网站的隐私保护措施不负相应法律责任。我们可能在需要的时候增加商业伙伴,但是提供给他们的将仅是综合信息,我们将不会公开您的个人信息。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 转让 -->
|
||||
<div class="mb-2 font-semibold">(二) 转让</div>
|
||||
<div class="leading-relaxed">
|
||||
我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(1)在获取明确同意的情况下转让:获得您的明确同意后,我们会向其他方转让您的个人信息。
|
||||
</div>
|
||||
<div>
|
||||
(2)在全能查发生合并、收购或破产清算情形,或其他涉及合并、收购或破产清算情形时,如涉及到个人信息转让,我们会要求新的持有您个人信息的公司、组织继续受本政策的约束,否则我们将要求该公司、组织和个人重新向您征求授权同意。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 公开披露 -->
|
||||
<div class="mb-2 font-semibold">(三) 公开披露</div>
|
||||
<div class="leading-relaxed">
|
||||
我们仅会在以下情况下,公开披露您的个人信息:
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(1)获得您明确同意或基于您的主动选择,我们可能会公开披露您的个人信息;
|
||||
</div>
|
||||
<div>
|
||||
(2)如果我们确定您出现违反法律法规或严重违反全能查相关协议规则的情况,或为保护全能查及其关联公司用户或公众的人身财产安全免遭侵害,我们可能依据法律法规或全能查相关协议规则征得您同意的情况下披露关于您的个人信息,包括相关违规行为以及全能查已对您采取的措施。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 特殊情况 -->
|
||||
<div class="mb-2 font-semibold">
|
||||
(四)
|
||||
共享、转让、公开披露个人信息时事先征得授权同意的例外
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
以下情形中,共享、转让、公开披露您的个人信息无需事先征得您的授权同意:
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>(1)与国家安全、国防安全有关的;</div>
|
||||
<div>
|
||||
(2)与公共安全、公共卫生、重大公共利益有关的;
|
||||
</div>
|
||||
<div>
|
||||
(3)与犯罪侦查、起诉、审判和判决执行等有关的;
|
||||
</div>
|
||||
<div>
|
||||
(4)出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;
|
||||
</div>
|
||||
<div>(5)您自行向社会公众公开的个人信息;</div>
|
||||
<div>
|
||||
(6)从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道。
|
||||
请您注意,根据法律规定,共享、转让经匿名化处理的个人信息,且确保数据接收方无法复原并重新识别个人信息主体的,不属于个人信息的对外共享、转让及公开披露行为,对此类数据的保存及处理将无需另行向您通知并征得您的同意。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<!-- 第五部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
五、我们如何保护您的信息
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
我们会采取各种预防措施来保护您的个人信息,以保障您的个人信息免遭丢失、盗用和误用,以及被擅自取阅、披露、更改或销毁。
|
||||
为确保您个人信息的安全,我们有严格的信息安全规定和流程并严格执行上述措施。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
全能查建立了全方位、多维度的数据安全管理体系,保证整个全能查各个平台的安全性。
|
||||
我们会采取合理可行的措施,尽力避免收集无关的个人信息,
|
||||
并在限于达成本政策所述目的所需的期限以及所适用法律法规所要求的期限内对您的个人信息进行脱敏处理。
|
||||
在您使用查询过程中所涉及的用户姓名、身份证号、手机号/账号密码信息均采用的是AES加密方式,
|
||||
所有二次输出信息均经过脱敏处理,数据库文件不存储用户明文数据。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
在不幸发生个人信息安全事件后,我们将按照法律法规的要求(最迟不迟于30个自然日内)向您告知:
|
||||
安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。
|
||||
事件相关情况我们将以邮件、信函、电话通知等方式告知您,
|
||||
难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。
|
||||
同时,我们还将按照监管部门要求,上报个人信息安全事件的处置情况。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
互联网环境并非百分之百安全,尽管我们有这些安全措施,但仍然无法完全避免互联网中存在的各种风险,我们将尽力确保您的信息的安全性。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第六部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
六、未成年人保护
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
我们重视未成年人的信息保护,如您为未成年人的,建议您请您的父母或监护人仔细阅读本隐私权政策,
|
||||
并在征得您的父母或监护人同意的前提下使用我们的服务或向我们提供信息。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
对于经父母或监护人同意使用我们的产品或服务而收集未成年人个人信息的情况,
|
||||
我们只会在法律法规允许,父母或监护人明确同意或者保护未成年人所必要的情况下使用、共享、转让或披露此信息。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
我们将根据国家相关法律法规及本政策的规定保护未成年人的个人信息。
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<!-- 第七部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
七、您的个人信息存储
|
||||
</div>
|
||||
<!-- 存储地区 -->
|
||||
<div class="mb-2 font-semibold">(一) 存储地区</div>
|
||||
<div class="leading-relaxed">
|
||||
我们将在中华人民共和国境内运营全能查服务中收集和产生的个人信息存储在中华人民共和国境内。
|
||||
目前,我们不会将上述信息传输至境外,如果我们向境外传输,我们将会遵循相关国家规定或者征求您的同意。
|
||||
</div>
|
||||
<!-- 存储期限 -->
|
||||
<div class="mb-2 font-semibold">(二) 存储期限</div>
|
||||
<div class="leading-relaxed">
|
||||
您在使用本平台期间,我们将保存您的个人脱敏加密信息,保存期限将以不超过为您提供服务所必须的期间为原则。
|
||||
在您终止使用本平台后,除法律法规对于特定信息保留期限另有规定外,我们会对您的信息进行删除或做匿名化处理。
|
||||
如我们停止运营本平台服务,我们将在合理期限内依照所适用的法律对所持有的您的个人信息进行删除或匿名化处理。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第八部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
八、您享有的权利及权利行使路径
|
||||
</div>
|
||||
<!-- 访问查询权 -->
|
||||
<div class="mb-2 font-semibold">(一) 访问查询权</div>
|
||||
<div class="leading-relaxed">
|
||||
您对您的全能查账号内的信息(含个人信息)依法享有访问查询权,包括:
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
<span class="font-semibold">账户信息:</span>
|
||||
您可以登录手机客户端,通过【我的-点击名字或头像】可以访问您的头像信息、姓名、绑定手机号。
|
||||
</div>
|
||||
<div>
|
||||
<span class="font-semibold">使用信息:</span>
|
||||
您可以在全能查手机客户端相关页面访问、查询您的使用信息,包括订单信息,
|
||||
可以通过【报告列表-查看详情】进行访问、查看。
|
||||
</div>
|
||||
<div>
|
||||
<span class="font-semibold">其他信息:</span>
|
||||
如您在此前述过程中遇到操作问题的或如需获取其他前述无法获知的个人信息内容,
|
||||
您可通过在线客服或邮箱联系我们,我们将在核实您的身份后在合理期限内向您提供,
|
||||
但法律法规另有规定的或本政策另有约定的除外。
|
||||
</div>
|
||||
</div>
|
||||
<!-- 同意的撤回与变更 -->
|
||||
<div class="mb-2 font-semibold">(二) 同意的撤回与变更</div>
|
||||
<div class="leading-relaxed">
|
||||
若您需要更改相关权限的授权(例如:相机、相册、麦克风),您可以通过您的硬件设备进行修改。
|
||||
您也可以通过注销全能查账户的方式永久撤回我们继续收集您个人信息的全部授权。
|
||||
如您在此过程中遇到操作问题的,可以通过本政策“帮助中心”方式联系我们。
|
||||
</div>
|
||||
<!-- 帮助反馈权 -->
|
||||
<div class="mb-2 font-semibold">(三) 帮助反馈权</div>
|
||||
<div class="leading-relaxed">
|
||||
我们为您提供了多种反馈渠道,具体请见设置—帮助中心。
|
||||
</div>
|
||||
<!-- 提前获知产品与/或服务停止运营权 -->
|
||||
<div class="mb-2 font-semibold">
|
||||
(四) 提前获知产品与/或服务停止运营权
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
我们将持续为您提供优质服务,若因特殊原因导致我们的部分或全部产品与/或服务被迫停止运营,
|
||||
我们将提前在显著位置或通知您,并将停止对您个人信息的收集,
|
||||
同时在超出法律法规规定的必需且最短期限后,我们将会对所持有的您的个人信息进行删除或匿名化处理。
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<!-- 第九部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
九、本政策如何更新
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
我们的隐私政策可能变更。
|
||||
未经您明确同意我们不会限制您按照本隐私政策所应享有的权利。
|
||||
我们会在全能查各个平台,包括客户端、相关网页上以首页弹窗形式发布对本隐私政策所做的任何变更,并以交互设计提醒您阅读并完整理解。
|
||||
对于重大变更,我们还会提供更为显著的通知(可能包括公告通知甚至向您提供弹窗提示)。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
本政策所指的重大变更包括但不限于:
|
||||
<div>
|
||||
(1)我们的服务模式发生重大变化。如处理用户信息的目的、用户信息的使用方式等;
|
||||
</div>
|
||||
<div>
|
||||
(2)我们在控制权、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等;
|
||||
</div>
|
||||
<div>
|
||||
(3)用户信息共享、转让或公开披露的主要对象发生变化;
|
||||
</div>
|
||||
<div>
|
||||
(4)我们负责处理用户信息安全的责任部门、联络方式及投诉渠道发生变化时;
|
||||
</div>
|
||||
<div>
|
||||
(5)用户信息安全影响评估报告表明存在高风险时。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第十部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
十、如何联系我们
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
如果您对本政策或数据处理有任何疑问、意见或建议,可以通过全能查产品内的“联系客服”或邮箱
|
||||
<text class="text-blue-500"> admin@iieeii.com </text>
|
||||
与我们联系。我们将在收到您发送的响应请求或相关信息之日起十五(15)天内回复您。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
您理解并同意,当涉及以下任一情形时,我们无法响应您的请求:
|
||||
<div>(1)与国家安全、国防安全有关的;</div>
|
||||
<div>
|
||||
(2)与公共安全、公共卫生、重大公共利益有关的;
|
||||
</div>
|
||||
<div>(3)与犯罪侦查、起诉和审判等有关的;</div>
|
||||
<div>
|
||||
(4)有充分证据表明您存在主观恶意或滥用权利的;
|
||||
</div>
|
||||
<div>
|
||||
(5)响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的;
|
||||
</div>
|
||||
<div>(6)涉及全能查或任何第三方主体商业秘密的;</div>
|
||||
<div>(7)法律法规规定的其他情形。</div>
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
如果您对我们的回复不满意,特别是您认为我们的个人信息处理行为损害了您的合法权益,
|
||||
您还可以通过向有管辖权的法院提起诉讼来寻求解决方案。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第十一部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">十一、其他</div>
|
||||
<div class="leading-relaxed">
|
||||
(一)本《隐私政策》的解释及争议解决均应适用中华人民共和国大陆地区法律。
|
||||
与本《隐私政策》相关的任何纠纷,双方应协商友好解决;若不能协商解决,
|
||||
应将争议提交至海南省学宇思网络科技有限公司注册地有管辖权的人民法院解决。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
(二)本《隐私政策》的标题仅为方便及阅读而设,并不影响正文其中任何规定的含义或解释。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-4 text-right text-sm text-gray-600">
|
||||
<text>2024年11月19日</text>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped></style>
|
||||
154
src/views/Report.vue
Normal file
@@ -0,0 +1,154 @@
|
||||
<script setup>
|
||||
const featureMap = {
|
||||
G09SC02: {
|
||||
name: '单人婚姻',
|
||||
component: defineAsyncComponent(() => import('@/ui/CBad.vue')),
|
||||
},
|
||||
G27BJ05: {
|
||||
name: '借贷意向',
|
||||
component: defineAsyncComponent(() =>
|
||||
import('@/ui/CBankLoanApplication.vue')
|
||||
),
|
||||
},
|
||||
G28BJ05: {
|
||||
name: '借贷行为',
|
||||
component: defineAsyncComponent(() =>
|
||||
import('@/ui/CBankLoanBehavior.vue')
|
||||
),
|
||||
},
|
||||
G26BJ05: {
|
||||
name: '特殊名单',
|
||||
component: defineAsyncComponent(() =>
|
||||
import('@/ui/CSpecialList.vue')
|
||||
),
|
||||
},
|
||||
G34BJ03: {
|
||||
name: '个人不良',
|
||||
component: defineAsyncComponent(() => import('@/ui/CBad.vue')),
|
||||
},
|
||||
G35SC01: {
|
||||
name: '个人诉讼',
|
||||
component: defineAsyncComponent(() => import('@/ui/CLawsuit.vue')),
|
||||
},
|
||||
G05HZ01: {
|
||||
name: '股东人企关系',
|
||||
component: defineAsyncComponent(() =>
|
||||
import('@/ui/CRelatedEnterprises.vue')
|
||||
),
|
||||
},
|
||||
Q23SC01: {
|
||||
name: '企业涉诉',
|
||||
component: defineAsyncComponent(() => import('@/ui/CLawsuit.vue')),
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
import LEmpty from "@/components/LEmpty.vue";
|
||||
import { useWebView } from "@/composables/useWebView";
|
||||
useWebView()
|
||||
|
||||
const productId = ref(null);
|
||||
const isDone = ref(true);
|
||||
|
||||
const reportData = ref([])
|
||||
const reportName = ref("")
|
||||
const orderId = ref(null);
|
||||
const orderNo = ref("")
|
||||
const isEmpty = ref(false)
|
||||
onMounted(() => {
|
||||
const query = new URLSearchParams(window.location.search);
|
||||
orderId.value = query.get("order_id");
|
||||
orderNo.value = query.get("order_no");
|
||||
|
||||
if (!orderId.value && !orderNo.value) return;
|
||||
|
||||
getReport()
|
||||
});
|
||||
|
||||
const getReport = async () => {
|
||||
let queryUrl = ""
|
||||
if (orderNo.value) {
|
||||
queryUrl = `/query/orderNo/${orderNo.value}`
|
||||
} else if (orderId.value) {
|
||||
queryUrl = `/query/orderId/${orderId.value}`
|
||||
} else {
|
||||
return
|
||||
}
|
||||
const { data, error } = await useApiFetch(queryUrl)
|
||||
.get()
|
||||
.json()
|
||||
|
||||
if (data.value && !error.value) {
|
||||
if (data.value.code === 200) {
|
||||
productId.value = data.value.data.product_id;
|
||||
reportData.value = data.value.data.query_data
|
||||
reportName.value = data.value.data.product_name
|
||||
} else if (data.value.code === 200003) {
|
||||
isEmpty.value = true
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="min-h-full from-blue-100 to-white bg-gradient-to-b">
|
||||
<!-- <CTabs :tabs="sortedTabs" type="blue-green" /> -->
|
||||
<template v-if="isDone">
|
||||
<div class="flex flex-col gap-y-4 p-4 pt-12">
|
||||
<div id="overdiv" class="title">报告概述</div>
|
||||
<div class="card">
|
||||
<div class="flex flex-col gap-y-2">
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-700 font-bold">报告时间:</span>
|
||||
<span class="text-gray-600">2024年11月18日 23:11:23</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-700 font-bold">报告项目:</span>
|
||||
<span class="text-gray-600">
|
||||
{{ reportName }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-2" v-if="reportData.length > 1">
|
||||
<LTitle class="my-4" title="报告内容" type="blue-green" />
|
||||
<div class="flex flex-col gap-y-2">
|
||||
<div v-for="item in sortedReportItems" :key="item.value" class="flex justify-between">
|
||||
<span class="text-gray-700 font-bold">{{ item.label }}:</span>
|
||||
<span class="text-green-500 font-bold">已解锁</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<LEmpty v-if="isEmpty" />
|
||||
<template v-for="(item, index) in reportData" :key="index">
|
||||
<div id="lawsuit" class="title">{{ featureMap[item.apiID].name }}</div>
|
||||
<component :is="featureMap[item.apiID].component" :data="item.data"></component>
|
||||
</template>
|
||||
<div class="card">
|
||||
<div>
|
||||
<div class="text-bold text-blue-500 mb-2">报告说明</div>
|
||||
<div>
|
||||
本报告的数据由用户本人明确授权后,我们才向相关合法存有用户个人数据的机构调取本报告相关内容,本平台只做大数据的获取与分析,仅向用户个人展示参考。
|
||||
</div>
|
||||
<p>
|
||||
报告有效期<strong class="text-red-500">30天</strong>,过期自动删除。
|
||||
</p>
|
||||
<p>
|
||||
|
||||
若您的数据不全面,可能是数据具有延迟性或者合作信息机构未获取到您的数据。若数据有错误请联系客服
|
||||
</p>
|
||||
<p>
|
||||
本产品所有数据均来自第三方。可能部分数据未公开、数据更新延迟或信息受到限制,贵司不对数据的准确性、真实性、完整性做任何承诺。用户需根据实际情况,结合报告内容自行判断与决策。
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.title {
|
||||
@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;
|
||||
}
|
||||
</style>
|
||||
56
src/views/Service.vue
Normal file
@@ -0,0 +1,56 @@
|
||||
<template>
|
||||
<div class="support-chat">
|
||||
<h1>在线客服</h1>
|
||||
<p>如果您有任何问题,请通过在线客服联系我们。</p>
|
||||
<p>请点击右下角按钮联系客服</p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
onMounted(() => {
|
||||
// 插入客服脚本
|
||||
(function (d, t) {
|
||||
const BASE_URL = "https://service.quannengcha.com";
|
||||
const g = d.createElement(t),
|
||||
s = d.getElementsByTagName(t)[0];
|
||||
g.src = BASE_URL + "/packs/js/sdk.js";
|
||||
g.defer = true;
|
||||
g.async = true;
|
||||
|
||||
s.parentNode.insertBefore(g, s);
|
||||
g.onload = function () {
|
||||
window.chatwootSDK.run({
|
||||
websiteToken: "qfNrdMVTU8kTeXK5he1oCs1Q",
|
||||
baseUrl: BASE_URL,
|
||||
type: "expanded_bubble", // 使用自动展开模式
|
||||
});
|
||||
|
||||
console.log("Chatwoot script initialized", g);
|
||||
};
|
||||
})(document, "script");
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.support-chat {
|
||||
text-align: center;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.support-chat h1 {
|
||||
font-size: 28px;
|
||||
color: #005a9e;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.support-chat p {
|
||||
font-size: 16px;
|
||||
color: #333;
|
||||
}
|
||||
iframe {
|
||||
background: #000000;
|
||||
}
|
||||
iframe::content .file-uploads.file-uploads-html5.text-black-900 {
|
||||
display: none !important;
|
||||
}
|
||||
</style>
|
||||
269
src/views/UserAgreement.vue
Normal file
@@ -0,0 +1,269 @@
|
||||
<script setup>
|
||||
import { useWebView } from "@/composables/useWebView";
|
||||
useWebView()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="p-4">
|
||||
<!-- 页面标题 -->
|
||||
<div class="mb-4 text-center text-lg font-bold">用户协议</div>
|
||||
|
||||
<!-- 内容主体 -->
|
||||
<div class="indent-[2em]">
|
||||
<div class="mb-4 leading-relaxed">
|
||||
本协议是您(以下又称“用户”)在使用本服务时,约定您和海南省学宇思网络科技有限公司之间权利义务关系的有效协议。
|
||||
</div>
|
||||
|
||||
<div class="mb-4 leading-relaxed">
|
||||
在您使用本服务前,请您务必仔细阅读本协议,特别是隐私权保护及授权条款、免除或者限制海南省学宇思网络科技有限公司责任的条款、争议解决和法律适用条款。一旦您有对本服务的任何部分或全部的注册、查看、定制、使用等任何使用行为,即视为您已充分阅读、理解并接受本协议的全部内容,并与海南省学宇思网络科技有限公司达成本协议。如您对本协议有任何疑问,应向海南省学宇思网络科技有限公司客服咨询。如果您不同意本协议的部分或全部约定,您应立即停止使用本服务。
|
||||
</div>
|
||||
<div class="mb-4 leading-relaxed">
|
||||
您与海南省学宇思网络科技有限公司达成本协议后,您承诺接受并遵守本协议的约定,并不得以未阅读本协议的内容或者未获得海南省学宇思网络科技有限公司对您问询的解答等理由,主张本协议无效,或要求撤销本协议。在本协议履行过程中,海南省学宇思网络科技有限公司可以依其单独判断暂时停止提供、限制或改变本服务,并有权根据自身业务需要修订本协议。一旦本协议的内容发生变动,海南省学宇思网络科技有限公司将通过平台公布最新的服务协议,不再向您作个别通知。如果您不同意海南省学宇思网络科技有限公司对本服务协议所做的修改,您应立即停止使用本服务或通过海南省学宇思网络科技有限公司客服与海南省学宇思网络科技有限公司联系。如果您继续使用本服务,则视为您接受海南省学宇思网络科技有限公司对本协议所做的修改,并应遵照修改后的协议执行。
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<div class="mb-2 font-bold leading-relaxed">一、服务内容</div>
|
||||
<div class="leading-relaxed">
|
||||
本服务向您提供多项个人信息整理服务。您知悉并认可,如您需使用该类服务,必须满足如下所述条件;且您承诺,您向海南省学宇思网络科技有限公司提请服务申请时,已经满足如下所述条件。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>A.您已注册成为本服务的会员;</div>
|
||||
<div>
|
||||
B.您已在服务页面对应框中填写被查询主体的姓名、身份证号、手机号、银行卡号和被查询主体的手机号收到的动态验证码(以下称“被查询主体信息”);
|
||||
</div>
|
||||
<div>
|
||||
C.您确保被查询主体信息是您本人的信息或者被查询主体已授权您本人使用被查询主体信息进行查询(授权内容应包括本条D项所述内容),并且被查询主体已知悉该授权的风险。
|
||||
</div>
|
||||
<div>
|
||||
D.被查询主体不可撤销地授权海南省学宇思网络科技有限公司为查询、评估被查询主体的信息状况:a.可以委托合法存续的第三方机构收集、查询、验证、使用并提供您或被查询主体的个人信息;b.可以向数据源机构采集您或被查询主体的个人信息;c.可以整理、保存、加工、使用您或被查询主体的个人信息,并向您提供数据报告;d.可以向为您提供服务的第三方商户提供脱敏后的个人信息或数据报告。本条所述的个人信息包括但不限于身份信息、联系方式、职业和居住地址等个人基本信息,个人社保、公积金、收入及在商业活动中形成的各类交易记录,个人公共费用缴纳、违法违规信息、财产状况等;
|
||||
</div>
|
||||
<div>
|
||||
E.被查询主体已被明确告知提供被查询主体信息并作出D项授权可能给被查询主体带来的各类损失以及其他可能的不利后果,包括采集上述个人信息对被查询主体信用方面可能产生不良影响以及上述信息被信息使用者依法提供给第三方后被他人不当利用的风险。
|
||||
</div>
|
||||
<div>F.您已全额支付相应的查询服务费用;</div>
|
||||
<div>
|
||||
G.验证码请不要轻易提供给他人,一旦填入手机号对应验证码,视为手机号机主本人操作。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
二、服务中断或故障
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
您同意,因下列原因导致海南省学宇思网络科技有限公司无法正常提供本服务的,海南省学宇思网络科技有限公司不承担责任:
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>(1)承载本服务的系统停机维护期间;</div>
|
||||
<div>
|
||||
(2)您的电脑、手机软硬件和通信线路、供电线路出现故障的;
|
||||
</div>
|
||||
<div>
|
||||
(3)您操作不当或通过非海南省学宇思网络科技有限公司授权或认可的方式使用本服务的;
|
||||
</div>
|
||||
<div>
|
||||
(4)因病毒、木马、恶意程序攻击、网络拥堵、系统不稳定、系统或设备故障、通讯故障、电力故障或政府行为等原因;
|
||||
</div>
|
||||
<div>
|
||||
(5)由于黑客攻击、网络供应商技术调整或故障、网站升级、手机运营商系统方面的问题等原因而造成的本服务中断或延迟;
|
||||
</div>
|
||||
<div>
|
||||
(6)因台风、地震、海啸、洪水、停电、战争、恐怖袭击等不可抗力之因素,造成本服务系统障碍不能执行业务的。
|
||||
</div>
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
海南省学宇思网络科技有限公司不对因使用本服务而对用户造成的间接的、附带的、特殊的、后果性的损失承担任何法律责任;尽管有前款约定海南省学宇思网络科技有限公司将采取合理行动积极促使本服务恢复正常。
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
三、信息的使用和保护
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
海南省学宇思网络科技有限公司深知您注重个人信息安全和保护,并理解保护被查询主体个人信息的重要性。
|
||||
海南省学宇思网络科技有限公司会严格遵守中国关于收集、使用、保存用户个人信息的相关法律法规,
|
||||
尽最大努力采用相应安全技术和管理手段保护您或被查询主体的个人信息,
|
||||
防止您或被查询主体个人信息遭受未经授权的访问、适用或泄露、毁损、篡改或者丢失。
|
||||
未经您或被查询主体的授权不会向任何第三方提供。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
您使用本服务,即表示您已授权海南省学宇思网络科技有限公司将您相关信息披露给海南省学宇思网络科技有限公司关联公司
|
||||
(关联公司是指直接或间接控制于本协议一方的任何法律实体,或者与本协议一方共同于另一法律实体的任何法律实体)使用,
|
||||
且海南省学宇思网络科技有限公司关联公司仅为了向您提供服务而使用您的相关信息。
|
||||
如海南省学宇思网络科技有限公司关联公司使用您的相关信息,则受本协议约束且会按照与海南省学宇思网络科技有限公司同等谨慎程度保护您的相关信息。
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
海南省学宇思网络科技有限公司就下列原因导致的您或被查询主体个人信息的泄露,不承担任何法律责任:
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(1)由于您个人原因将本服务的会员账号和密码告知他人或与他人共享海南省学宇思网络科技有限公司服务账户,由此导致的与您相关的信息的泄露。
|
||||
</div>
|
||||
<div>
|
||||
(2)您使用第三方提供的服务(包括您向第三方提供的任何个人信息),须受第三方自己的服务条款及个人信息保护协议(而非本协议)约束,您需要仔细阅读其条款。本协议仅适用于海南省学宇思网络科技有限公司所提供的服务,并不适用于任何第三方提供的服务或第三方的信息使用规则,海南省学宇思网络科技有限公司对任何第三方使用由您提供的信息不承担任何责任。
|
||||
</div>
|
||||
<div>
|
||||
(3)根据相关的法律法规、相关政府主管部门或相关证券交易所的要求提供、公布与您相关的信息。
|
||||
</div>
|
||||
<div>
|
||||
(4)或其他非因海南省学宇思网络科技有限公司原因导致的与您相关的信息的泄露。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<!-- 第四部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
四、用户声明与保证
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(1)您使用本服务的前提是您依照适用的法律,是具有完全民事权利和民事行为能力,能够独立承担民事责任的自然人。
|
||||
</div>
|
||||
<div>
|
||||
(2)您如违反本协议第一条款中的承诺,您可能会对他人造成侵权。如由此给海南省学宇思网络科技有限公司或他人造成损失的,您需依照法律法规规定承担相应的法律责任。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第五部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
五、知识产权保护
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
本服务涉及的文档资料、软件、商标、图案、排版设计等(以下简称“海南省学宇思网络科技有限公司产品”)的著作权、商标以及其他知识产权或权益均为海南省学宇思网络科技有限公司享有或海南省学宇思网络科技有限公司获得授权使用。
|
||||
用户不得出租、出借、拷贝、仿冒、复制或修改海南省学宇思网络科技有限公司产品任何部分或用于其他任何商业目的,
|
||||
也不得将海南省学宇思网络科技有限公司产品做反向工程、反编译或反汇编,或以其他方式或工具取得海南省学宇思网络科技有限公司产品之目标程序或源代码。
|
||||
如果用户违反此约定,造成海南省学宇思网络科技有限公司及其他任何第三方任何损失的,甲方应予以全额赔偿。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第六部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">六、隐私保护</div>
|
||||
<div class="leading-relaxed">
|
||||
全能查保证不对外公开或向第三方提供单个用户的注册资料及存储在全能查的非公开内容,但下列情况下除外:
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>1. 事先获得用户的明确授权;</div>
|
||||
<div>2. 根据有关的法律法规要求;</div>
|
||||
<div>3. 按照有关政府部门的要求;</div>
|
||||
<div>4. 为维护社会公众的利益;</div>
|
||||
<div>5. 为维护全能查的合法利益。</div>
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
在不透露单个用户隐私资料的前提下,全能查有权利对整个用户数据库进行分析并对用户数据库进行商业上的利用。
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<!-- 第七部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">七、免责条款</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(一)不管基于任何直接的、间接的、特殊的、惩罚性的、惩戒性的、附带的、或结果性的损害、损失或费用,我们均不对其承担责任。即使有人告知我们或我们的员工存在出现这些损害、损失或费用的可能性。这些损害、损失或费用由以下这些情况引起或与这些情况有关:
|
||||
</div>
|
||||
<div>1. 使用我们网站上或其他链接网站上的信息;</div>
|
||||
<div>2. 无法使用这些信息;</div>
|
||||
<div>
|
||||
3.
|
||||
任何在操作或传输中出现的操作失败、错误、遗漏、中断、缺陷、延迟,计算机病毒,断线或系统运行失败。
|
||||
</div>
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(二)我们可以在不事先通知的情况下更改信息,并且不承担更新这些信息的义务。不经任何种类的授权,不做任何专门或暗指或法定的不侵犯第三方权利、名称、可出售性、出于某种特殊目的适当措施或不携带计算机病毒的保证。
|
||||
</div>
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(三)我们不对您查询信息内容的正确性、适当性、完整性、准确性、可靠性或适时性做出任何证明、声明和保证。我们不对任何因个人平台产生的错误、遗漏及失准承担任何责任。
|
||||
</div>
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(四)对于由于您违反本协议导致任何第三方针对我们及或我们的员工提出的任何申诉、起诉、要求或者诉讼或者其他法律程序,您同意自费作出赔偿并令其免受上述损害。
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第八部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">八、违约</div>
|
||||
<div class="leading-relaxed">
|
||||
用户不得利用本服务进行任何损害海南省学宇思网络科技有限公司及其他第三方权益的行为,否则海南省学宇思网络科技有限公司有权立即终止为该用户提供本服务,并要求用户赔偿损失。由此产生的任何后果由用户自行承担,与海南省学宇思网络科技有限公司无关。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第九部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
九、数据来源及准确性说明
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
本产品数据来源于第三方,可能因数据未公开、更新延迟或信息受到限制,因此不一定能完全返回。不同数据格式及记录详细程度会有所差异,这是行业正常现象。本报告仅供参考,请结合实际情况做出决策。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第十部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">十、退款协议</div>
|
||||
<div class="leading-relaxed">
|
||||
除非由于本程序的技术性问题导致用户无法正常使用本产品,否则我们不提供任何退款服务。
|
||||
用户在购买前应仔细阅读本用户协议及相关使用条款,确保对本产品有充分了解。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第十一部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">
|
||||
十一、协议的变更和终止
|
||||
</div>
|
||||
<div class="leading-relaxed">
|
||||
鉴于网络服务的特殊性,我们变更本协议及其附件的若干条款时,将提前通过我们平台公告有关变更事项。
|
||||
修订后的条款或将来可能发布或更新的各类规则-经在我们平台公布后,立即自动生效。
|
||||
如您不同意相关修订,应当立即停止使用该项服务。
|
||||
如您在发布上述协议变更的有关公告后继续使用互联网查询的,视为您已接受协议的有关变更,并受其约束。
|
||||
本协议中的相关条款根据该变更而自动做相应修改,双方无须另行签订书面协议。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第十二部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">十二、适用法律</div>
|
||||
<div class="leading-relaxed">
|
||||
本协议条款的解释、效力及纠纷的解决,适用中华人民共和国大陆地区法律法规。
|
||||
如用户和海南省学宇思网络科技有限公司之间发生任何争议,首先应友好协商解决,协商不成的,应将争议提交至海南省学宇思网络科技有限公司注册地有管辖权的人民法院解决。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第十三部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">十三、问题咨询</div>
|
||||
<div class="leading-relaxed">
|
||||
如您对本协议及本服务有任何问题,请通过邮箱
|
||||
<text class="text-blue-500"> admin@iieeii.com </text> 或
|
||||
APP“联系客服”联系海南省学宇思网络科技有限公司进行咨询。
|
||||
海南省学宇思网络科技有限公司会尽最大努力解决您的问题。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<!-- 第十四部分 -->
|
||||
<div class="mb-2 font-bold leading-relaxed">十四、附则</div>
|
||||
<div class="leading-relaxed">
|
||||
<div>
|
||||
(一)本协议的某一条款被确认无效,均不影响本协议其他条款的效力。
|
||||
</div>
|
||||
<div>
|
||||
(二)本协议未尽事宜,根据我国相关法律、法规及我们相关业务规定办理。如需制定补充协议,其法律效力同本协议。
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-2 leading-relaxed">
|
||||
本协议通过点击同意/勾选的方式签署,自签署之日生效。
|
||||
</div>
|
||||
<div class="text-right text-sm">
|
||||
<text>本协议于 2024 年 11 月 17 日生效。</text>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
51
src/views/list_lawsuit.vue
Normal file
@@ -0,0 +1,51 @@
|
||||
<template>
|
||||
<div class="bg-gradient-to-b from-[#aeceff] to-white min-h-screen relative">
|
||||
<!-- banner -->
|
||||
<div class="w-full flex justify-center " style="clip-path: ellipse(100% 95% at 50% 0%);">
|
||||
<img src="@/assets/images/sfss_banner.png" alt="司法涉诉" class="w-full h-auto">
|
||||
</div>
|
||||
<div class="p-6 -my-24 z-1000 absolute">
|
||||
<div class="card">
|
||||
<div class="grid grid-cols-3 gap-6">
|
||||
<div v-for="(item, index) in menuItems" :key="index" class="flex flex-col items-center"
|
||||
@click="toInquire(item.product)">
|
||||
<div class="bg-slate-100 rounded-full p-4">
|
||||
<img :src="item.icon" :alt="item.title" class="w-10 h-10">
|
||||
</div>
|
||||
<p class="mt-2 text-sm font-semibold">{{ item.title }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card mt-4">
|
||||
<h2 class="text-lg font-bold text-blue-500 mb-4">司法涉诉查询服务</h2>
|
||||
<p class="text-gray-700 leading-6">
|
||||
本平台提供全方位司法涉诉查询服务,助您全面防范。功能包括:
|
||||
</p>
|
||||
<ul class="list-disc list-inside mt-4 space-y-2 text-gray-600">
|
||||
<li>个人涉诉:查看XXXXXXXXXXXXXXXXXXX</li>
|
||||
<li>企业涉诉:查看XXXXXXXXXXXXXXXXXXX</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useWebView } from "@/composables/useWebView";
|
||||
useWebView()
|
||||
|
||||
import grssIcon from '@/assets/images/grss_icon.svg';
|
||||
import qyssIcon from '@/assets/images/qyss_icon.svg';
|
||||
const menuItems = [
|
||||
{ title: "个人涉诉", icon: grssIcon, product: "toc_PersonalLawsuit" },
|
||||
{ title: "企业涉诉", icon: qyssIcon, product: "toc_EnterpriseLawsuit" },
|
||||
];
|
||||
|
||||
const toInquire = (product) => {
|
||||
if (!product) return
|
||||
uni.navigateTo({ url: '/pages/inquire?p=' + product })
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
||||
51
src/views/list_marriage.vue
Normal file
@@ -0,0 +1,51 @@
|
||||
<template>
|
||||
<div class="bg-gradient-to-b from-blue-100 to-white min-h-screen p-6">
|
||||
<!-- 顶部标题 -->
|
||||
<div class="text-center my-4">
|
||||
<h1 class="text-2xl font-bold text-blue-500">真实车况查询</h1>
|
||||
<p class="text-lg text-orange-400">二手车知根知底</p>
|
||||
</div>
|
||||
|
||||
<!-- 车图 -->
|
||||
<div class="flex justify-center my-4">
|
||||
<!-- <img src="/static/car-image.png" alt="Car" class="w-3/4 h-auto"> -->
|
||||
</div>
|
||||
|
||||
<!-- 功能菜单 -->
|
||||
<div class="grid grid-cols-3 gap-6 my-8">
|
||||
<div v-for="(item, index) in menuItems" :key="index" class="flex flex-col items-center">
|
||||
<!-- <img :src="item.icon" :alt="item.title" class="w-14 h-14"> -->
|
||||
<p :class="item.textColor + ' mt-2 text-sm'">{{ item.title }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 详情文本 -->
|
||||
<div class="bg-white shadow-md p-6 rounded-lg">
|
||||
<h2 class="text-lg font-bold text-blue-500 mb-4">车辆信息查询服务</h2>
|
||||
<p class="text-gray-700 leading-6">
|
||||
本平台提供全方位车辆信息查询服务,助您全面掌握车况。功能包括:
|
||||
</p>
|
||||
<ul class="list-disc list-inside mt-4 space-y-2 text-gray-600">
|
||||
<li>车辆维修记录:查询车辆历次维修保养的详细记录。</li>
|
||||
<li>出险信息:查看车辆过往的出险信息,助您评估车辆状况。</li>
|
||||
<li>上险信息:获取车辆的保险状态,确保车辆保险有效。</li>
|
||||
<li>车辆信息查询:通过车架号获取车辆的详细信息,包括排量、配置等。</li>
|
||||
<li>各下车主数统计:列出各下的所有持有车辆数量及统计。</li>
|
||||
<li>人车关系验证:校对车辆与车主之间的详细关系。</li>
|
||||
<li>车辆估值:提供车辆市场估值,帮助您了解车辆的当前市场价值。</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
const menuItems = [
|
||||
{ title: "出险信息", icon: "/static/icon-accident.png", textColor: "text-red-500" },
|
||||
{ title: "维修记录", icon: "/static/icon-maintain.png", textColor: "text-blue-500" },
|
||||
];
|
||||
// console.log("uni", uni.navigateTo({ url: "/pages/index" }))
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 需要添加任何自定义样式时可在这里补充 */
|
||||
</style>
|
||||
52
src/views/list_risk.vue
Normal file
@@ -0,0 +1,52 @@
|
||||
<template>
|
||||
<div class="bg-gradient-to-b from-[#aeceff] to-white min-h-screen relative">
|
||||
<!-- banner -->
|
||||
<div class="w-full flex justify-center " style="clip-path: ellipse(100% 95% at 50% 0%);">
|
||||
<img src="@/assets/images/fxpg_banner.png" alt="风险评估" class="w-full h-auto">
|
||||
</div>
|
||||
<div class="p-6 -my-24 z-1000 absolute">
|
||||
<!-- 功能菜单 -->
|
||||
<div class="card">
|
||||
<div class="grid grid-cols-3 gap-6">
|
||||
<div v-for="(item, index) in menuItems" :key="index" class="flex flex-col items-center"
|
||||
@click="toInquire(item.product)">
|
||||
<div class="bg-slate-100 rounded-full p-4">
|
||||
<img :src="item.icon" :alt="item.title" class="w-10 h-10">
|
||||
</div>
|
||||
<p class="mt-2 text-sm font-semibold">{{ item.title }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 详情文本 -->
|
||||
<div class="card mt-4">
|
||||
<h2 class="text-lg font-bold text-blue-500 mb-4">风险评估查询服务</h2>
|
||||
<p class="text-gray-700 leading-6">
|
||||
本平台提供全方位风险评估查询服务,助您全面防范。功能包括:
|
||||
</p>
|
||||
<ul class="list-disc list-inside mt-4 space-y-2 text-gray-600">
|
||||
<li>个人不良:查看XXXXXXXXXXXXXXXXXXX</li>
|
||||
<li>股东人企关系:查看XXXXXXXXXXXXXXXXXXX</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useWebView } from "@/composables/useWebView";
|
||||
useWebView()
|
||||
|
||||
import grblIcon from '@/assets/images/grbl_icon.svg';
|
||||
import gdrqgxIcon from '@/assets/images/gdrqgx_icon.svg';
|
||||
const menuItems = [
|
||||
{ title: "个人不良", icon: grblIcon, product: "toc_PersonalBadRecord" },
|
||||
{ title: "股东人企关系", icon: gdrqgxIcon, product: "toc_ShareholderBusinessRelation" },
|
||||
];
|
||||
|
||||
const toInquire = (product) => {
|
||||
uni.navigateTo({ url: '/pages/inquire?p=' + product })
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
||||
88
src/views/list_verify.vue
Normal file
@@ -0,0 +1,88 @@
|
||||
<template>
|
||||
<div class="bg-gradient-to-b from-[#aeceff] to-white min-h-screen relative">
|
||||
<!-- banner -->
|
||||
<div class="w-full flex justify-center " style="clip-path: ellipse(100% 95% at 50% 0%);">
|
||||
<img src="@/assets/images/hygj_banner.png" alt="核验工具" class="w-full h-auto">
|
||||
</div>
|
||||
<div class="p-6 -my-24 z-1000 absolute">
|
||||
<!-- 功能菜单 -->
|
||||
<div class="card">
|
||||
<div class="grid grid-cols-3 gap-6">
|
||||
<div v-for="(item, index) in menuItems" :key="index" class="flex flex-col items-center">
|
||||
<div class="bg-slate-100 rounded-full p-4">
|
||||
<img :src="item.icon" :alt="item.title" class="w-10 h-10">
|
||||
</div>
|
||||
<p class="mt-2 text-sm font-semibold">{{ item.title }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 详情文本 -->
|
||||
<div class="card mt-4">
|
||||
<h2 class="text-lg font-bold text-blue-500 mb-4">核验工具服务</h2>
|
||||
<p class="text-gray-700 leading-6">
|
||||
本平台提供全方位核验工具服务,助您全面防范。功能包括:
|
||||
</p>
|
||||
<ul class="list-disc list-inside mt-4 space-y-2 text-gray-600">
|
||||
<li>手机三要素核验:查看XXXXXXXXXXXXXXXXXXX</li>
|
||||
<li>银行卡黑名单:查看XXXXXXXXXXXXXXXXXXX</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import yhkhmdIcon from '@/assets/images/yhkhmd_icon.svg';
|
||||
import sjsysIcon from '@/assets/images/sjsys_icon.svg'; // 手机三要素
|
||||
import sfzeysIcon from '@/assets/images/sfzeys_icon.svg'; // 身份证二要素
|
||||
import sjeysIcon from '@/assets/images/sjeys_icon.svg'; // 手机二要素
|
||||
import sjzwscIcon from '@/assets/images/sjzwsc_icon.svg'; // 在网时长
|
||||
import sjeckIcon from '@/assets/images/sjeck_icon.svg'; // 手机二次卡
|
||||
import sjhmfxIcon from '@/assets/images/sjhmfx_icon.svg'; // 手机号码风险
|
||||
import yhk4ysIcon from '@/assets/images/yhk4ys_icon.svg'; // 银行卡四要素
|
||||
import yhksysIcon from '@/assets/images/yhksys_icon.svg'; // 银行卡三要素
|
||||
import zrrscztIcon from '@/assets/images/zrrsczt_icon.svg'; // 自然人生存状态
|
||||
import xlhyIcon from '@/assets/images/xlhy_icon.svg'; // 学历核验
|
||||
import rchyIcon from '@/assets/images/rchy_icon.svg'; // 人车核验
|
||||
import mxclIcon from '@/assets/images/mxcl_icon.svg'; // 名下车辆
|
||||
import srhyIcon from '@/assets/images/srhy_icon.svg'; // 双人婚姻
|
||||
|
||||
const menuItems = [
|
||||
{ title: "手机三要素", icon: sjsysIcon },
|
||||
{ title: "银行卡黑名单", icon: yhkhmdIcon },
|
||||
{ title: "身份证二要素", icon: sfzeysIcon },
|
||||
{ title: "手机二要素", icon: sjeysIcon },
|
||||
{ title: "在网时长", icon: sjzwscIcon },
|
||||
{ title: "手机二次卡", icon: sjeckIcon },
|
||||
{ title: "手机号码风险", icon: sjhmfxIcon },
|
||||
{ title: "银行卡四要素", icon: yhk4ysIcon },
|
||||
{ title: "银行卡三要素", icon: yhksysIcon },
|
||||
{ title: "自然人生存状态", icon: zrrscztIcon },
|
||||
{ title: "学历核验", icon: xlhyIcon },
|
||||
{ title: "人车核验", icon: rchyIcon },
|
||||
{ title: "名下车辆", icon: mxclIcon },
|
||||
{ title: "双人婚姻", icon: srhyIcon },
|
||||
];
|
||||
|
||||
onMounted(() => {
|
||||
uni.getEnv((platform) => {
|
||||
console.log("当前运行环境", platform)
|
||||
handleBridgeReady(platform)
|
||||
});
|
||||
})
|
||||
const handleBridgeReady = (platform) => {
|
||||
if (platform.h5) {
|
||||
window.parent.postMessage({ loaded: true }, '*');
|
||||
}
|
||||
// else {
|
||||
// uni.postMessage({
|
||||
// data: {
|
||||
// loaded: true,
|
||||
// },
|
||||
// });
|
||||
// }
|
||||
};
|
||||
// console.log("uni", uni.navigateTo({ url: "/pages/index" }))
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
||||
11
tailwind.config.js
Normal file
@@ -0,0 +1,11 @@
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
export default {
|
||||
content: [
|
||||
"./index.html", // 如果是 Vite 项目
|
||||
"./src/**/*.{vue,js,ts,jsx,tsx}",
|
||||
],
|
||||
theme: {
|
||||
extend: {},
|
||||
},
|
||||
plugins: [],
|
||||
};
|
||||
50
vite.config.js
Normal file
@@ -0,0 +1,50 @@
|
||||
import { fileURLToPath, URL } from 'node:url'
|
||||
import AutoImport from 'unplugin-auto-import/vite';
|
||||
import Components from 'unplugin-vue-components/vite';
|
||||
import { VantResolver } from '@vant/auto-import-resolver';
|
||||
import { defineConfig } from 'vite'
|
||||
import vue from '@vitejs/plugin-vue'
|
||||
import vueJsx from '@vitejs/plugin-vue-jsx'
|
||||
import vueDevTools from 'vite-plugin-vue-devtools'
|
||||
|
||||
// https://vite.dev/config/
|
||||
export default defineConfig({
|
||||
server: {
|
||||
host: '0.0.0.0', // 设置为 0.0.0.0 允许局域网访问
|
||||
port: 5678, // 自定义端口号,可选
|
||||
strictPort: true, // 如果端口被占用则抛出错误而不是使用下一个可用端口
|
||||
proxy: {
|
||||
// '/api/v1': {
|
||||
// target: 'https://app.quannengcha.com', // 本地接口地址
|
||||
// changeOrigin: true,
|
||||
// },
|
||||
'/api/v1': {
|
||||
target: 'http://127.0.0.1:8888', // 本地接口地址
|
||||
changeOrigin: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
plugins: [
|
||||
vue(),
|
||||
AutoImport({
|
||||
imports: [
|
||||
'vue', // 自动引入 Vue Composition API,如 ref、computed、onMounted 等
|
||||
'vue-router', // 自动引入 vue-router 中的方法,如 useRoute、useRouter 等(可选)
|
||||
'@vueuse/core', // 自动引入 VueUse 中的工具函数(可选)
|
||||
],
|
||||
dts: 'src/auto-imports.d.ts', // 生成类型定义文件(可选)
|
||||
dirs: ['src/composables', 'src/stores', 'src/components'],
|
||||
resolvers: [VantResolver()],
|
||||
}),
|
||||
Components({
|
||||
resolvers: [VantResolver()],
|
||||
}),
|
||||
vueJsx(),
|
||||
// vueDevTools(),
|
||||
],
|
||||
resolve: {
|
||||
alias: {
|
||||
'@': fileURLToPath(new URL('./src', import.meta.url))
|
||||
},
|
||||
},
|
||||
})
|
||||