Compare commits
2 Commits
my-new-ver
...
main
Author | SHA1 | Date | |
---|---|---|---|
![]() |
ee1d28abdb | ||
f9b5952525 |
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@ -12,7 +12,7 @@
|
||||
// Silent the stylistic rules in you IDE, but still auto fix them
|
||||
"eslint.rules.customizations": [
|
||||
{ "rule": "style/*", "severity": "off", "fixable": true },
|
||||
{ "rule": "format/*", "severity": "off", "fixable": true },
|
||||
// { "rule": "format/*", "severity": "off", "fixable": true },
|
||||
{ "rule": "*-indent", "severity": "off", "fixable": true },
|
||||
{ "rule": "*-spacing", "severity": "off", "fixable": true },
|
||||
{ "rule": "*-spaces", "severity": "off", "fixable": true },
|
||||
|
50
src/App.vue
50
src/App.vue
@ -1,4 +1,54 @@
|
||||
<script setup>
|
||||
import { getToken } from '@/api/apis.js'
|
||||
|
||||
onLaunch(() => {
|
||||
initGetPlatform()
|
||||
RefreshToken()
|
||||
})
|
||||
function initGetPlatform() {
|
||||
uni.getSystemInfo().then((res) => {
|
||||
console.log('res', res)
|
||||
const platform = res.uniPlatform
|
||||
uni.setStorageSync('platform', platform)
|
||||
})
|
||||
}
|
||||
function RefreshToken() {
|
||||
const token = uni.getStorageSync('token')
|
||||
const refreshAfter = uni.getStorageSync('refreshAfter')
|
||||
const accessExpire = uni.getStorageSync('accessExpire')
|
||||
const currentTime = new Date().getTime()
|
||||
|
||||
if (accessExpire) {
|
||||
const accessExpireInMilliseconds = Number.parseInt(accessExpire) * 1000 // 转换为毫秒级
|
||||
if (currentTime > accessExpireInMilliseconds) {
|
||||
uni.removeStorageSync('token')
|
||||
uni.removeStorageSync('refreshAfter')
|
||||
uni.removeStorageSync('accessExpire')
|
||||
return
|
||||
}
|
||||
}
|
||||
// 1. 如果没有 token,直接返回
|
||||
if (!token) {
|
||||
return
|
||||
}
|
||||
|
||||
// 2. 如果有 refreshAfter,检查当前时间是否超过 refreshAfter(refreshAfter 是秒级,需要转换为毫秒级)
|
||||
if (refreshAfter) {
|
||||
const refreshAfterInMilliseconds = Number.parseInt(refreshAfter) * 1000 // 转换为毫秒级
|
||||
if (currentTime < refreshAfterInMilliseconds) {
|
||||
return
|
||||
}
|
||||
}
|
||||
// 3. 如果没有 refreshAfter 或者时间超过 refreshAfter,执行刷新 token 的请求
|
||||
refreshToken()
|
||||
}
|
||||
async function refreshToken() {
|
||||
getToken().then((res) => {
|
||||
if (res.code === 200) {
|
||||
uni.setStorageSync('token', res.data.accessToken)
|
||||
uni.setStorageSync('refreshAfter', res.data.refreshAfter)
|
||||
uni.setStorageSync('accessExpire', res.data.accessExpire)
|
||||
}
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
@ -16,6 +16,13 @@ export function login(data) {
|
||||
data,
|
||||
})
|
||||
}
|
||||
export function getToken(data) {
|
||||
return request({
|
||||
url: '/user/getToken',
|
||||
method: 'POST',
|
||||
data,
|
||||
})
|
||||
}
|
||||
export function getCode(data) {
|
||||
return request({
|
||||
url: '/auth/sendSms',
|
||||
|
4
src/auto-imports.d.ts
vendored
4
src/auto-imports.d.ts
vendored
@ -11,6 +11,8 @@ declare global {
|
||||
const aesEncrypt: typeof import('./utils/crypto.js')['aesEncrypt']
|
||||
const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
|
||||
const autoResetRef: typeof import('@vueuse/core')['autoResetRef']
|
||||
const chatCrypto: typeof import('./utils/chatCrypto.js')['default']
|
||||
const chatEncrypt: typeof import('./utils/chatEncrypt.js')['default']
|
||||
const computed: typeof import('vue')['computed']
|
||||
const computedAsync: typeof import('@vueuse/core')['computedAsync']
|
||||
const computedEager: typeof import('@vueuse/core')['computedEager']
|
||||
@ -329,6 +331,8 @@ declare module 'vue' {
|
||||
readonly aesEncrypt: UnwrapRef<typeof import('./utils/crypto.js')['aesEncrypt']>
|
||||
readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']>
|
||||
readonly autoResetRef: UnwrapRef<typeof import('@vueuse/core')['autoResetRef']>
|
||||
readonly chatCrypto: UnwrapRef<typeof import('./utils/chatCrypto.js')['default']>
|
||||
readonly chatEncrypt: UnwrapRef<typeof import('./utils/chatEncrypt.js')['default']>
|
||||
readonly computed: UnwrapRef<typeof import('vue')['computed']>
|
||||
readonly computedAsync: UnwrapRef<typeof import('@vueuse/core')['computedAsync']>
|
||||
readonly computedEager: UnwrapRef<typeof import('@vueuse/core')['computedEager']>
|
||||
|
3
src/components.d.ts
vendored
3
src/components.d.ts
vendored
@ -35,9 +35,8 @@ declare module 'vue' {
|
||||
WdLoadmore: typeof import('wot-design-uni/components/wd-loadmore/wd-loadmore.vue')['default']
|
||||
WdNavbar: typeof import('wot-design-uni/components/wd-navbar/wd-navbar.vue')['default']
|
||||
WdNoticeBar: typeof import('wot-design-uni/components/wd-notice-bar/wd-notice-bar.vue')['default']
|
||||
WdRadio: typeof import('wot-design-uni/components/wd-radio/wd-radio.vue')['default']
|
||||
WdRadioGroup: typeof import('wot-design-uni/components/wd-radio-group/wd-radio-group.vue')['default']
|
||||
WdTabbar: typeof import('wot-design-uni/components/wd-tabbar/wd-tabbar.vue')['default']
|
||||
WdTabbarItem: typeof import('wot-design-uni/components/wd-tabbar-item/wd-tabbar-item.vue')['default']
|
||||
WebviewPage: typeof import('./components/WebviewPage.vue')['default']
|
||||
}
|
||||
}
|
||||
|
147
src/components/WebviewPage.vue
Normal file
147
src/components/WebviewPage.vue
Normal file
@ -0,0 +1,147 @@
|
||||
<script setup>
|
||||
// 接受父组件传递的 props 参数
|
||||
const props = defineProps({
|
||||
webviewSrc: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
})
|
||||
onMounted(() => {
|
||||
|
||||
})
|
||||
const webviewStyles = ref({
|
||||
top: `${uni.getSystemInfoSync().statusBarHeight + 44}px`, // 距离顶部的距离
|
||||
height: `${uni.getSystemInfoSync().windowHeight - uni.getSystemInfoSync().statusBarHeight - 44}px`, // 高度
|
||||
position: 'absolute', // 绝对定位
|
||||
dock: 'bottom', // 停靠在底部
|
||||
bounce: 'vertical', // 垂直方向的回弹效果
|
||||
})
|
||||
const token = uni.getStorageSync('token') // 从本地缓存中获取 token
|
||||
const env = uni.getStorageSync('platform')
|
||||
// const baseUrl = `${window.location.origin}/app`
|
||||
const baseUrl = 'https://www.quannengcha.com'
|
||||
// const baseUrl = 'http://192.168.1.124:5678'
|
||||
const webviewUrl = computed(() => {
|
||||
let urlStr = baseUrl + props.webviewSrc
|
||||
if (token) {
|
||||
// 判断原本 url 中是否已经含有问号
|
||||
urlStr += `${urlStr.includes('?') ? '&' : '?'}token=${token}`
|
||||
}
|
||||
urlStr += `${urlStr.includes('?') ? '&' : '?'}env=${env}#wechat_redirect`
|
||||
|
||||
return urlStr
|
||||
})
|
||||
|
||||
const isLoading = ref(true) // 控制加载动画显示状态
|
||||
// const processedMessages = new Set() // 存储已处理的消息ID
|
||||
|
||||
// 页面加载完成时,隐藏加载动画
|
||||
function handleLoaded() {
|
||||
isLoading.value = false
|
||||
}
|
||||
// 监听消息事件,隐藏加载动画
|
||||
// window.addEventListener('message', (event) => {
|
||||
// const message = event.data
|
||||
// const action = message?.action
|
||||
// const messageId = message?.messageId
|
||||
// const data = message?.data
|
||||
// if (message.hello || message.wappalyzer)
|
||||
// return
|
||||
// if (!action)
|
||||
// return
|
||||
// if (processedMessages.has(messageId)) {
|
||||
// return
|
||||
// }
|
||||
// processedMessages.add(messageId)
|
||||
// if (action === 'loaded') {
|
||||
// if (data)
|
||||
// isLoading.value = false
|
||||
// }
|
||||
// else if (action === 'navigateTo') {
|
||||
// uni.navigateTo(data)
|
||||
// }
|
||||
// else if (action === 'redirectTo') {
|
||||
// uni.redirectTo(data)
|
||||
// }
|
||||
// else if (action === 'navigateBack') {
|
||||
// uni.navigateBack(data)
|
||||
// }
|
||||
// else if (action === 'payment') {
|
||||
// payment(data)
|
||||
// }
|
||||
// })
|
||||
|
||||
function onMessage(e) {
|
||||
const data = e.detail.data
|
||||
const message = data[data.length - 1]
|
||||
console.log('message', message)
|
||||
if (message.action === 'payment') {
|
||||
console.log('data', message.data)
|
||||
payment(message.data)
|
||||
}
|
||||
}
|
||||
|
||||
function payment(data) {
|
||||
uni.navigateTo({
|
||||
url: `/pages/me?paymentID${data}`,
|
||||
})
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<view v-if="isLoading" class="loading">
|
||||
<view class="spinner" />
|
||||
<view class="loading-text">
|
||||
加载中,请稍候...
|
||||
</view>
|
||||
</view>
|
||||
<web-view :webview-styles="webviewStyles" :src="webviewUrl" @load="handleLoaded" @message="onMessage" />
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.loading {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: rgba(255, 255, 255, 0.9);
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.spinner {
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
border: 5px solid rgba(0, 106, 255, 0.2);
|
||||
/* 背景圆环颜色 */
|
||||
border-top-color: rgba(0, 106, 255, 0.8);
|
||||
/* 高亮部分颜色 */
|
||||
border-radius: 50%;
|
||||
animation: spin 1s linear infinite;
|
||||
}
|
||||
|
||||
.loading-text {
|
||||
margin-top: 16px;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
background: linear-gradient(to right, #167ff6, #4a90e2);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
</style>
|
@ -22,18 +22,6 @@
|
||||
"layout": "page",
|
||||
"title": "投诉服务"
|
||||
},
|
||||
{
|
||||
"path": "pages/example copy",
|
||||
"type": "page",
|
||||
"layout": "page",
|
||||
"title": "报告示例"
|
||||
},
|
||||
{
|
||||
"path": "pages/example",
|
||||
"type": "page",
|
||||
"layout": "page",
|
||||
"title": "示例报告"
|
||||
},
|
||||
{
|
||||
"path": "pages/inquire",
|
||||
"type": "page",
|
||||
@ -51,42 +39,12 @@
|
||||
"type": "page",
|
||||
"layout": "home"
|
||||
},
|
||||
{
|
||||
"path": "pages/pay",
|
||||
"type": "page",
|
||||
"layout": "page",
|
||||
"title": "全能查收款"
|
||||
},
|
||||
{
|
||||
"path": "pages/payb",
|
||||
"type": "page",
|
||||
"layout": "page",
|
||||
"title": "全能查收款"
|
||||
},
|
||||
{
|
||||
"path": "pages/privacyPolicy",
|
||||
"type": "page",
|
||||
"layout": "page",
|
||||
"title": "隐私政策"
|
||||
},
|
||||
{
|
||||
"path": "pages/queryHistory",
|
||||
"type": "page",
|
||||
"layout": "page",
|
||||
"title": "历史报告"
|
||||
},
|
||||
{
|
||||
"path": "pages/result copy",
|
||||
"type": "page",
|
||||
"layout": "page",
|
||||
"title": "报告结果"
|
||||
},
|
||||
{
|
||||
"path": "pages/result",
|
||||
"type": "page",
|
||||
"layout": "page",
|
||||
"title": "报告结果"
|
||||
},
|
||||
{
|
||||
"path": "pages/service",
|
||||
"type": "page",
|
||||
|
@ -1,70 +1,14 @@
|
||||
<script setup>
|
||||
import { onMounted, ref } from 'vue'
|
||||
import WebviewPage from '@/components/WebviewPage.vue'
|
||||
|
||||
const userMessage = ref('')
|
||||
const messages = ref([
|
||||
{ sender: 'ai', text: '欢迎!请问有什么可以帮助您的吗?' },
|
||||
])
|
||||
|
||||
function sendMessage() {
|
||||
if (userMessage.value.trim() === '')
|
||||
return
|
||||
|
||||
messages.value.push({ sender: 'user', text: userMessage.value })
|
||||
|
||||
// AI 统一回复(中文套话)
|
||||
setTimeout(() => {
|
||||
messages.value.push({
|
||||
sender: 'ai',
|
||||
text: '感谢您的提问!我们会尽力为您提供帮助。',
|
||||
})
|
||||
}, 1000)
|
||||
|
||||
userMessage.value = ''
|
||||
}
|
||||
const safeAreaTop = ref(44)
|
||||
onShow(() => {
|
||||
uni.getSystemInfo({
|
||||
success: (res) => {
|
||||
if (res.safeArea && res.safeArea.top) {
|
||||
safeAreaTop.value = res.safeArea.top // 设置安全区顶部距离
|
||||
}
|
||||
},
|
||||
})
|
||||
})
|
||||
const webviewSrc = '/ai' // 可以根据不同页面设置不同的值
|
||||
const navigationBarTitleText = 'AI律师' // 同样可以根据需要修改
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<view
|
||||
class="box-border min-h-screen from-blue-100 to-white bg-gradient-to-b" style="paddingTop:44px"
|
||||
>
|
||||
<view class="chat-page mx-4 flex flex-col rounded-xl shadow-lg">
|
||||
<view class="chat-window flex-1 overflow-auto border p-4">
|
||||
<view v-for="(message, index) in messages" :key="index" class="mb-2">
|
||||
<view v-if="message.sender === 'ai'" class="inline-block max-w-max rounded-xl bg-white p-2 text-left text-green-600 font-medium shadow-md">
|
||||
{{ message.text }}
|
||||
</view>
|
||||
<view v-else class="ml-auto inline-block max-w-max rounded-xl from-sky-300 via-sky-300 to-sky-300 bg-gradient-to-r p-2 text-right text-white font-medium shadow-md">
|
||||
{{ message.text }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="input-area mx-2 flex items-center gap-2 p-4">
|
||||
<wd-input v-model="userMessage" placeholder="请输入您的问题..." class="flex-1" size="large" />
|
||||
<wd-button custom-class="shadow" type="primary" @click="sendMessage">
|
||||
发送
|
||||
</wd-button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<WebviewPage :webview-src="webviewSrc" :navigation-bar-title-text="navigationBarTitleText" />
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.chat-page {
|
||||
height: calc(100vh - 108px);
|
||||
}
|
||||
</style>
|
||||
|
||||
<route lang="json">
|
||||
{
|
||||
"layout": "home"
|
||||
|
@ -1,204 +0,0 @@
|
||||
<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 CTabs from '@/ui/CTabs.vue'
|
||||
import { queryExample } from '@/api/apis'
|
||||
import CMarriage from '@/ui/CMarriage.vue'
|
||||
|
||||
const productMap = {
|
||||
1: '背景调查',
|
||||
2: '企业报告',
|
||||
3: '家政服务',
|
||||
4: '婚姻状态',
|
||||
5: '贷前背景调查',
|
||||
6: '租赁服务',
|
||||
7: '个人风险评估',
|
||||
}
|
||||
|
||||
// 根据 product_id 获取产品名称
|
||||
function getProductName(productId) {
|
||||
return productMap[productId] || '未知类型'
|
||||
}
|
||||
const productId = ref(null)
|
||||
const isDone = ref(false)
|
||||
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 tabs = ref([
|
||||
{ label: '报告概述', value: 'overview' },
|
||||
])
|
||||
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)
|
||||
})
|
||||
onLoad((option) => {
|
||||
console.log('option', option)
|
||||
const { feature } = option
|
||||
if (feature) {
|
||||
queryExample({ feature }).then((res) => {
|
||||
console.log('res', res)
|
||||
if (res.code === 200) {
|
||||
productId.value = res.data.product_id
|
||||
res.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}`)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}).finally(() => {
|
||||
isDone.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="overview" 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>
|
||||
<view class="card">
|
||||
<view>
|
||||
<view class="text-blue-500 font-bold">
|
||||
报告说明
|
||||
</view>
|
||||
<view>本报告的数据由用户本人明确授权后,我们才向相关合法存有用户个人数据的机构调取本报告相关内容,本平台只做大数据的获取与分析,仅向用户个人展示参考。</view><p> 报告有效期<strong>30天</strong>,过期自动删除。 </p><p> 若您的数据不全面,可能是数据具有延迟性或者合作信息机构未获取到您的数据。若数据有错误请联系客服</p>
|
||||
</view>
|
||||
</view>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
</style>
|
||||
|
||||
<route lang="json">
|
||||
{
|
||||
"layout": "page",
|
||||
"title": "报告示例"
|
||||
}
|
||||
</route>
|
@ -1,41 +0,0 @@
|
||||
<script setup>
|
||||
const webviewStyles = ref({
|
||||
top: `${uni.getSystemInfoSync().statusBarHeight + 44}px`, // 距离顶部的距离
|
||||
height: `${uni.getSystemInfoSync().windowHeight - uni.getSystemInfoSync().statusBarHeight - 44}px`, // 高度
|
||||
position: 'absolute', // 绝对定位
|
||||
dock: 'bottom', // 停靠在底部
|
||||
bounce: 'vertical', // 垂直方向的回弹效果
|
||||
})
|
||||
const feature = ref(null)
|
||||
const token = ref(null)
|
||||
const webviewSrc = ref('')
|
||||
|
||||
onLoad((option) => {
|
||||
if (option.feature) {
|
||||
feature.value = option.feature
|
||||
}
|
||||
|
||||
token.value = uni.getStorageSync('token') || ''
|
||||
|
||||
const baseUrl = 'https://app.quannengcha.com/example'
|
||||
webviewSrc.value = `${baseUrl}?feature=${encodeURIComponent(feature.value)}&token=${encodeURIComponent(token.value)}`
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<view>
|
||||
<!-- 使用动态构造的 WebView src -->
|
||||
<web-view :webview-styles="webviewStyles" :src="webviewSrc" />
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
</style>
|
||||
|
||||
<route lang="json">
|
||||
{
|
||||
"layout": "page",
|
||||
"title": "示例报告"
|
||||
}
|
||||
</route>
|
@ -11,10 +11,11 @@ const services = ref([
|
||||
{ title: '家政服务', name: 'homeservice', subtitle: '用人有保障', bg: '/static/image/index_icon_3.png', bgColor: ' bg-teal-500 ', position: 'rounded-tl-[35px] rounded-bl-[35px] rounded-tr-lg rounded-br-lg' },
|
||||
{ title: '租赁风险', name: 'rentalinfo', subtitle: '一查明了', bg: '/static/image/index_icon_4.png', bgColor: ' bg-sky-500 ', position: 'rounded-tl-[35px] rounded-bl-[35px] rounded-tr-lg rounded-br-lg' },
|
||||
{ title: '企业报告', name: 'companyinfo', subtitle: '合作更安心', bg: '/static/image/index_icon_5.png', bgColor: ' bg-blue-400 ', position: 'rounded-tr-[35px] rounded-br-[35px] rounded-tl-lg rounded-bl-lg' },
|
||||
{ title: '人事背调', name: 'backgroundcheck', subtitle: '招聘有保障,选人更放心', bg: '/static/image/index_icon_6.png', bgColor: ' bg-orange-400 ', position: 'rounded-[35px] col-span-2' },
|
||||
{ title: '人事背调', name: 'backgroundcheck', subtitle: '选人更放心', bg: '/static/image/index_icon_6.png', bgColor: ' bg-orange-400 ', position: 'rounded-tl-[35px] rounded-bl-[35px] rounded-tr-lg rounded-br-lg' },
|
||||
{ title: '贷前背调', name: 'preloanbackgroundcheck', subtitle: '放心借贷', bg: '/static/image/index_icon_7.png', bgColor: ' bg-red-400 ', position: 'rounded-tr-[35px] rounded-br-[35px] rounded-tl-lg rounded-bl-lg' },
|
||||
])
|
||||
|
||||
const noticeText = ref([])
|
||||
// const noticeText = ref([])
|
||||
|
||||
function toHistory() {
|
||||
uni.navigateTo({
|
||||
@ -33,8 +34,8 @@ function toHistory() {
|
||||
mode="aspectFit"
|
||||
/>
|
||||
</view>
|
||||
<view class="relative p-4 pb-4 pt-2">
|
||||
<view class="mb-1 flex items-center">
|
||||
<view class="relative p-4 pb-4 pt-8">
|
||||
<!-- <view class="mb-1 flex items-center">
|
||||
<view class="flex-shrink-0 pl-2 font-bold">
|
||||
在线信息
|
||||
</view>
|
||||
@ -42,7 +43,7 @@ function toHistory() {
|
||||
:text="noticeText" direction="vertical" :delay="5" color="#4c4c4c"
|
||||
background-color="#00000000"
|
||||
/>
|
||||
</view>
|
||||
</view> -->
|
||||
<view class="grid grid-cols-2 gap-3">
|
||||
<template v-for="(service, index) in services" :key="index">
|
||||
<view
|
||||
@ -67,7 +68,7 @@ function toHistory() {
|
||||
</view>
|
||||
</template>
|
||||
</view>
|
||||
<view
|
||||
<!-- <view
|
||||
class="mt-4 box-border h-14 w-full flex items-center rounded-xl bg-white px-4 text-gray-700 shadow-xl"
|
||||
@click="toHistory"
|
||||
>
|
||||
@ -84,7 +85,7 @@ function toHistory() {
|
||||
查询记录有效期为30天
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view> -->
|
||||
<view
|
||||
class="mb-16 mt-6 h-12 w-full flex items-center justify-center rounded-3xl from-blue-500 to-sky-400 bg-gradient-to-b text-center text-lg text-white line-height-12 shadow-xl"
|
||||
>
|
||||
|
@ -42,7 +42,6 @@ function sendVerificationCode() {
|
||||
}).then((res) => {
|
||||
if (res.code === 200) {
|
||||
uni.showToast({ title: '获取成功', icon: 'none' })
|
||||
|
||||
startCountdown()
|
||||
}
|
||||
})
|
||||
@ -72,9 +71,10 @@ function handleLogin() {
|
||||
return
|
||||
}
|
||||
login({ mobile: phoneNumber.value, code: verificationCode.value }).then((res) => {
|
||||
console.log('res.data.AccessToken', res.data.accessToken)
|
||||
if (res.code === 200) {
|
||||
uni.setStorageSync('token', res.data.accessToken)
|
||||
uni.setStorageSync('refreshAfter', res.data.refreshAfter)
|
||||
uni.setStorageSync('accessExpire', res.data.accessExpire)
|
||||
uni.showToast({ title: '登录成功', icon: 'none' })
|
||||
uni.reLaunch({
|
||||
url: '/pages/index',
|
||||
|
@ -5,16 +5,11 @@ const userName = ref('点击登录')
|
||||
const userAvatar = ref('https://img0.baidu.com/it/u=1240274933,2284862568&fm=253&fmt=auto&app=138&f=PNG?w=180&h=180')
|
||||
const isLoggedIn = ref(false)
|
||||
const features = ref([
|
||||
{ title: '我的报告', icon: 'list', action: () => toHistory() },
|
||||
{ title: '联系客服', icon: 'service', action: () => toService() },
|
||||
{ title: '用户协议', icon: 'file', action: () => toUserAgreement() },
|
||||
{ title: '退出登录', icon: 'logout', action: () => handleLogout() },
|
||||
])
|
||||
function toHistory() {
|
||||
uni.navigateTo({
|
||||
url: '/pages/queryHistory',
|
||||
})
|
||||
}
|
||||
|
||||
function toUserAgreement() {
|
||||
uni.navigateTo({
|
||||
url: '/pages/userAgreement',
|
||||
|
@ -1,98 +0,0 @@
|
||||
<script setup>
|
||||
import { payment, queryProvisionalOrder } from '@/api/apis'
|
||||
|
||||
const selectedPaymentMethod = ref('alipay')
|
||||
const id = ref(null)
|
||||
const order = ref({
|
||||
productName: '',
|
||||
price: null,
|
||||
})
|
||||
function handlePayment() {
|
||||
if (selectedPaymentMethod.value === 'alipay') {
|
||||
payment({ id: id.value, pay_method: selectedPaymentMethod.value }).then((res) => {
|
||||
if (res.code === 200) {
|
||||
uni.requestPayment({
|
||||
provider: 'alipay', // 支付宝
|
||||
orderInfo: res.data.prepay_id, // 后台返回的orderInfo
|
||||
success: () => {
|
||||
handlePaySuccess(res.data.order_id)
|
||||
},
|
||||
fail: (err) => {
|
||||
console.log('支付失败:', err)
|
||||
},
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
function handlePaySuccess(orderID) {
|
||||
uni.redirectTo({
|
||||
url: `/pages/result?id=${orderID}`,
|
||||
})
|
||||
}
|
||||
onLoad((option) => {
|
||||
if (option.id) {
|
||||
id.value = option.id
|
||||
queryProvisionalOrder(option.id).then((res) => {
|
||||
console.log('res', res)
|
||||
if (res.code === 200) {
|
||||
order.value.productName = res.data.product.product_name
|
||||
order.value.price = res.data.product.sell_price
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<view class="min-h-screen from-blue-200 via-sky-200 to-sky-100 bg-gradient-to-b p-6">
|
||||
<view class="card">
|
||||
<h1 class="mb-4 text-xl font-bold">
|
||||
订单支付
|
||||
</h1>
|
||||
<view class="my-10 text-center">
|
||||
<view class="text-2xl font-bold">
|
||||
¥{{ order.price }}
|
||||
</view>
|
||||
<view class="text-gray-600">
|
||||
{{ order.productName }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="mb-4">
|
||||
<label class="mb-2 block text-sm text-gray-600">支付方式</label>
|
||||
<wd-radio-group v-model="selectedPaymentMethod" shape="dot" size="large">
|
||||
<view class="border-3 border-blue-500 rounded-lg border-solid px-4 py-2">
|
||||
<wd-radio value="alipay">
|
||||
<view class="flex" items-center>
|
||||
<image
|
||||
src="/static/image/alipay_icon.svg"
|
||||
mode="aspectFit"
|
||||
class="mr-1 h-5 w-5"
|
||||
/> 支付宝
|
||||
</view>
|
||||
</wd-radio>
|
||||
</view>
|
||||
</wd-radio-group>
|
||||
</view>
|
||||
<button
|
||||
class="w-full rounded-xl from-blue-500 via-blue-500 to-blue-400 bg-gradient-to-b px-4 py-2 text-white"
|
||||
@click="handlePayment"
|
||||
>
|
||||
立即支付
|
||||
</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
:deep(.wd-radio){
|
||||
margin-top: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<route lang="json">
|
||||
{
|
||||
"layout": "page",
|
||||
"title": "全能查收款"
|
||||
}
|
||||
</route>
|
@ -1,164 +0,0 @@
|
||||
<script setup>
|
||||
import { iapPaymentCallback, payment, queryProvisionalOrder } from '@/api/apis'
|
||||
|
||||
const selectedPaymentMethod = ref('appleiap')
|
||||
const id = ref(null)
|
||||
const order = ref({
|
||||
productName: '',
|
||||
price: null,
|
||||
})
|
||||
|
||||
async function handlePayment() {
|
||||
try {
|
||||
if (selectedPaymentMethod.value === 'appleiap') {
|
||||
const paymentResponse = await payment({ id: id.value, pay_method: selectedPaymentMethod.value })
|
||||
if (paymentResponse.code === 200) {
|
||||
uni.showLoading({ title: '加载中' })
|
||||
const productID = paymentResponse.data.prepay_id
|
||||
const orderID = paymentResponse.data.order_id
|
||||
const iapChannel = await getIapChannel()
|
||||
const products = await requestProduct(iapChannel, [productID])
|
||||
|
||||
if (products.length > 0) {
|
||||
const product = products[0]
|
||||
uni.requestPayment({
|
||||
provider: 'appleiap',
|
||||
orderInfo: { productid: product.productid },
|
||||
success: async (iapRes) => {
|
||||
const callbackResponse = await iapPaymentCallback({
|
||||
order_id: orderID,
|
||||
transaction_receipt: iapRes.transactionReceipt,
|
||||
})
|
||||
if (callbackResponse.code === 200) {
|
||||
handlePaySuccess(orderID)
|
||||
}
|
||||
else {
|
||||
console.error('支付回调处理失败:', callbackResponse)
|
||||
}
|
||||
},
|
||||
fail: (err) => {
|
||||
console.error('支付失败:', err)
|
||||
},
|
||||
})
|
||||
}
|
||||
else {
|
||||
console.error('未找到对应的产品信息')
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.error('支付请求失败:', paymentResponse)
|
||||
}
|
||||
}
|
||||
else {
|
||||
console.error('未选择 Apple IAP 支付方式')
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
console.error('支付流程中发生错误:', error)
|
||||
}
|
||||
finally {
|
||||
uni.hideLoading()
|
||||
}
|
||||
}
|
||||
|
||||
async function getIapChannel() {
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.showLoading({ title: '加载中' })
|
||||
plus.payment.getChannels((channels) => {
|
||||
const iapChannel = channels.find(channel => channel.id === 'appleiap')
|
||||
if (iapChannel) {
|
||||
resolve(iapChannel)
|
||||
}
|
||||
else {
|
||||
reject(new Error('未找到 Apple IAP 支付通道'))
|
||||
}
|
||||
}, (error) => {
|
||||
reject(new Error(`获取支付通道失败:${error.message}`))
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
async function requestProduct(iapChannel, productIds) {
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.showLoading({ title: '加载中' })
|
||||
console.log('请求的产品 ID 列表:', productIds)
|
||||
iapChannel.requestOrder(productIds, (products) => {
|
||||
resolve(products)
|
||||
}, (error) => {
|
||||
reject(new Error(`请求产品信息失败:${error.message}`))
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function handlePaySuccess(orderID) {
|
||||
uni.redirectTo({
|
||||
url: `/pages/result?id=${orderID}`,
|
||||
})
|
||||
}
|
||||
|
||||
onLoad((option) => {
|
||||
if (option.id) {
|
||||
id.value = option.id
|
||||
queryProvisionalOrder(option.id).then((res) => {
|
||||
console.log('res', res)
|
||||
if (res.code === 200) {
|
||||
order.value.productName = res.data.product.product_name
|
||||
order.value.price = res.data.product.sell_price
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<view class="min-h-screen from-blue-200 via-sky-200 to-sky-100 bg-gradient-to-b p-6">
|
||||
<view class="card">
|
||||
<h1 class="mb-4 text-xl font-bold">
|
||||
订单支付
|
||||
</h1>
|
||||
<view class="my-10 text-center">
|
||||
<view class="text-2xl font-bold">
|
||||
¥{{ order.price }}
|
||||
</view>
|
||||
<view class="text-gray-600">
|
||||
{{ order.productName }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="mb-4">
|
||||
<label class="mb-2 block text-sm text-gray-600">支付方式</label>
|
||||
<wd-radio-group v-model="selectedPaymentMethod" shape="dot" size="large">
|
||||
<view class="border-3 border-blue-500 rounded-lg border-solid px-4 py-2">
|
||||
<wd-radio value="appleiap">
|
||||
<view class="flex items-center">
|
||||
<image
|
||||
src="/static/image/apple.svg"
|
||||
mode="aspectFit"
|
||||
class="mr-1 h-5 w-5"
|
||||
/> Apple Pay
|
||||
</view>
|
||||
</wd-radio>
|
||||
</view>
|
||||
</wd-radio-group>
|
||||
</view>
|
||||
<button
|
||||
class="w-full rounded-xl from-blue-500 via-blue-500 to-blue-400 bg-gradient-to-b px-4 py-2 text-white"
|
||||
@click="handlePayment"
|
||||
>
|
||||
立即支付
|
||||
</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
:deep(.wd-radio) {
|
||||
margin-top: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<route lang="json">
|
||||
{
|
||||
"layout": "page",
|
||||
"title": "全能查收款"
|
||||
}
|
||||
</route>
|
@ -1,156 +0,0 @@
|
||||
<script setup>
|
||||
import { onLoad, onReachBottom } from '@dcloudio/uni-app'
|
||||
import { queryList } from '@/api/apis'
|
||||
|
||||
// 定义字典映射 id 和 product_name
|
||||
const productMap = {
|
||||
1: '背景调查',
|
||||
2: '企业报告',
|
||||
3: '家政服务',
|
||||
4: '婚姻状态',
|
||||
5: '贷前背景调查',
|
||||
6: '租赁服务',
|
||||
7: '个人风险评估',
|
||||
}
|
||||
|
||||
const page = ref(1)
|
||||
const pageSize = ref(10)
|
||||
const total = ref(0)
|
||||
const reportList = ref([])
|
||||
const loadingState = ref('loading')
|
||||
const num = ref(0)
|
||||
const max = ref(60)
|
||||
|
||||
// 初始加载数据
|
||||
function fetchData() {
|
||||
queryList({ page: page.value, page_size: pageSize.value }).then((res) => {
|
||||
if (res.code === 200) {
|
||||
total.value = res.data.total
|
||||
if (res.data.list && res.data.list.length > 0) {
|
||||
reportList.value.push(...res.data.list)
|
||||
page.value += 1
|
||||
}
|
||||
if (reportList.value.length >= total.value) {
|
||||
loadingState.value = 'finished'
|
||||
}
|
||||
else {
|
||||
loadingState.value = 'loading'
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 根据 product_id 获取产品名称
|
||||
function getProductName(productId) {
|
||||
return productMap[productId] || '未知类型'
|
||||
}
|
||||
|
||||
// 初始加载
|
||||
onLoad(() => {
|
||||
fetchData()
|
||||
})
|
||||
|
||||
// 下拉触底加载更多
|
||||
onReachBottom(() => {
|
||||
if (loadingState.value !== 'finished') {
|
||||
if (num.value >= max.value) {
|
||||
loadingState.value = 'finished'
|
||||
}
|
||||
else {
|
||||
fetchData()
|
||||
}
|
||||
}
|
||||
})
|
||||
function toDetail(item) {
|
||||
if (item.query_state !== 'success')
|
||||
return
|
||||
uni.navigateTo({
|
||||
url: `/pages/result?id=${item.order_id}`,
|
||||
})
|
||||
}
|
||||
// 状态文字映射
|
||||
function stateText(state) {
|
||||
switch (state) {
|
||||
case 'pending':
|
||||
return '查询中'
|
||||
case 'success':
|
||||
return '查询成功'
|
||||
case 'failed':
|
||||
return '查询失败'
|
||||
default:
|
||||
return '未知状态'
|
||||
}
|
||||
}
|
||||
|
||||
// 状态颜色映射
|
||||
function statusClass(state) {
|
||||
switch (state) {
|
||||
case 'pending':
|
||||
return 'status-pending'
|
||||
case 'success':
|
||||
return 'status-success'
|
||||
case 'failed':
|
||||
return 'status-failed'
|
||||
default:
|
||||
return ''
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<wd-notice-bar
|
||||
text="为保证用户的隐私以及数据安全,您的报告生成30天之后将自动清除,请及时保存您的报告。" prefix="warn-bold" color="#007aff"
|
||||
background-color="#f8f8f8"
|
||||
/>
|
||||
<view class="flex flex-col gap-4 p-4">
|
||||
<view v-for="item in reportList" :key="item.id" class="card flex flex-col gap-2" @click="toDetail(item)">
|
||||
<view class="flex items-center justify-between">
|
||||
<view class="">
|
||||
状态:
|
||||
</view>
|
||||
<view class="rounded-xl px-2 py-1" :class="[statusClass(item.query_state)]">
|
||||
{{ stateText(item.query_state) }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex items-center justify-between">
|
||||
<view class="">
|
||||
报告类型
|
||||
</view>
|
||||
<view>
|
||||
{{ getProductName(item.product_id) }}
|
||||
</view>
|
||||
</view>
|
||||
<view class="flex items-center justify-between">
|
||||
<view class="">
|
||||
查询时间:
|
||||
</view>
|
||||
<view>
|
||||
{{ item.create_time }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 加载更多 -->
|
||||
<wd-loadmore :state="loadingState" @reload="fetchData" />
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.status-pending {
|
||||
@apply bg-yellow-100 text-yellow-600;
|
||||
}
|
||||
|
||||
.status-success {
|
||||
@apply bg-green-100 text-green-600;
|
||||
}
|
||||
|
||||
.status-failed {
|
||||
@apply bg-red-100 text-red-600;
|
||||
}
|
||||
</style>
|
||||
|
||||
<route lang="json">
|
||||
{
|
||||
"layout": "page",
|
||||
"title": "历史报告"
|
||||
}
|
||||
</route>
|
@ -1,204 +0,0 @@
|
||||
<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 CTabs from '@/ui/CTabs.vue'
|
||||
import { queryResultByOrder } from '@/api/apis'
|
||||
import CMarriage from '@/ui/CMarriage.vue'
|
||||
|
||||
const productMap = {
|
||||
1: '背景调查',
|
||||
2: '企业报告',
|
||||
3: '家政服务',
|
||||
4: '婚姻状态',
|
||||
5: '贷前背景调查',
|
||||
6: '租赁服务',
|
||||
7: '个人风险评估',
|
||||
}
|
||||
|
||||
// 根据 product_id 获取产品名称
|
||||
function getProductName(productId) {
|
||||
return productMap[productId] || '未知类型'
|
||||
}
|
||||
const productId = ref(null)
|
||||
const isDone = ref(false)
|
||||
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 tabs = ref([
|
||||
{ label: '报告概述', value: 'overview' },
|
||||
])
|
||||
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)
|
||||
})
|
||||
onLoad((option) => {
|
||||
console.log('option', option)
|
||||
const { id } = option
|
||||
if (id) {
|
||||
queryResultByOrder(id).then((res) => {
|
||||
console.log('res', res)
|
||||
if (res.code === 200) {
|
||||
productId.value = res.data.product_id
|
||||
res.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}`)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}).finally(() => {
|
||||
isDone.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="overview" 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>
|
||||
<view class="card">
|
||||
<view>
|
||||
<view>
|
||||
报告说明
|
||||
</view>
|
||||
<view>本报告的数据由用户本人明确授权后,我们才向相关合法存有用户个人数据的机构调取本报告相关内容,本平台只做大数据的获取与分析,仅向用户个人展示参考。</view><p> 报告有效期<strong>30天</strong>,过期自动删除。 </p><p> 若您的数据不全面,可能是数据具有延迟性或者合作信息机构未获取到您的数据。若数据有错误请联系客服</p>
|
||||
</view>
|
||||
</view>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
</style>
|
||||
|
||||
<route lang="json">
|
||||
{
|
||||
"layout": "page",
|
||||
"title": "报告结果"
|
||||
}
|
||||
</route>
|
@ -1,40 +0,0 @@
|
||||
<script setup>
|
||||
const webviewStyles = ref({
|
||||
top: `${uni.getSystemInfoSync().statusBarHeight + 44}px`, // 距离顶部的距离
|
||||
height: `${uni.getSystemInfoSync().windowHeight - uni.getSystemInfoSync().statusBarHeight - 44}px`, // 高度
|
||||
position: 'absolute', // 绝对定位
|
||||
dock: 'bottom', // 停靠在底部
|
||||
bounce: 'vertical', // 垂直方向的回弹效果
|
||||
})
|
||||
const orderId = ref(null)
|
||||
const token = ref(null)
|
||||
const webviewSrc = ref('')
|
||||
|
||||
onLoad((option) => {
|
||||
if (option.id) {
|
||||
orderId.value = option.id
|
||||
}
|
||||
|
||||
token.value = uni.getStorageSync('token') || ''
|
||||
|
||||
const baseUrl = 'https://app.quannengcha.com/report'
|
||||
webviewSrc.value = `${baseUrl}?order_id=${encodeURIComponent(orderId.value)}&token=${encodeURIComponent(token.value)}`
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<view>
|
||||
<web-view :webview-styles="webviewStyles" :src="webviewSrc" />
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
</style>
|
||||
|
||||
<route lang="json">
|
||||
{
|
||||
"layout": "page",
|
||||
"title": "报告结果"
|
||||
}
|
||||
</route>
|
7
src/uni-pages.d.ts
vendored
7
src/uni-pages.d.ts
vendored
@ -8,17 +8,10 @@ interface NavigateToOptions {
|
||||
"/pages/ai" |
|
||||
"/pages/authorization" |
|
||||
"/pages/complaint" |
|
||||
"/pages/example copy" |
|
||||
"/pages/example" |
|
||||
"/pages/inquire" |
|
||||
"/pages/login" |
|
||||
"/pages/me" |
|
||||
"/pages/pay" |
|
||||
"/pages/payb" |
|
||||
"/pages/privacyPolicy" |
|
||||
"/pages/queryHistory" |
|
||||
"/pages/result copy" |
|
||||
"/pages/result" |
|
||||
"/pages/service" |
|
||||
"/pages/userAgreement";
|
||||
}
|
||||
|
0
src/uni_modules/lz-url_launch/changelog.md
Normal file
0
src/uni_modules/lz-url_launch/changelog.md
Normal file
83
src/uni_modules/lz-url_launch/package.json
Normal file
83
src/uni_modules/lz-url_launch/package.json
Normal file
@ -0,0 +1,83 @@
|
||||
{
|
||||
"id": "lz-url_launch",
|
||||
"displayName": "lz-url_launch",
|
||||
"version": "1.0.0",
|
||||
"description": "lz-url_launch",
|
||||
"keywords": [
|
||||
"lz-url_launch"
|
||||
],
|
||||
"repository": "",
|
||||
"engines": {
|
||||
"HBuilderX": "^3.6.8"
|
||||
},
|
||||
"dcloudext": {
|
||||
"type": "uts",
|
||||
"sale": {
|
||||
"regular": {
|
||||
"price": "0.00"
|
||||
},
|
||||
"sourcecode": {
|
||||
"price": "0.00"
|
||||
}
|
||||
},
|
||||
"contact": {
|
||||
"qq": ""
|
||||
},
|
||||
"declaration": {
|
||||
"ads": "",
|
||||
"data": "",
|
||||
"permissions": ""
|
||||
},
|
||||
"npmurl": ""
|
||||
},
|
||||
"uni_modules": {
|
||||
"dependencies": [],
|
||||
"encrypt": [],
|
||||
"platforms": {
|
||||
"cloud": {
|
||||
"tcb": "u",
|
||||
"aliyun": "u",
|
||||
"alipay": "u"
|
||||
},
|
||||
"client": {
|
||||
"Vue": {
|
||||
"vue2": "y",
|
||||
"vue3": "y"
|
||||
},
|
||||
"App": {
|
||||
"app-android": "u",
|
||||
"app-ios": "y",
|
||||
"app-harmony": "u"
|
||||
},
|
||||
"H5-mobile": {
|
||||
"Safari": "u",
|
||||
"Android Browser": "u",
|
||||
"微信浏览器(Android)": "u",
|
||||
"QQ浏览器(Android)": "u"
|
||||
},
|
||||
"H5-pc": {
|
||||
"Chrome": "u",
|
||||
"IE": "u",
|
||||
"Edge": "u",
|
||||
"Firefox": "u",
|
||||
"Safari": "u"
|
||||
},
|
||||
"小程序": {
|
||||
"微信": "u",
|
||||
"阿里": "u",
|
||||
"百度": "u",
|
||||
"字节跳动": "u",
|
||||
"QQ": "u",
|
||||
"钉钉": "u",
|
||||
"快手": "u",
|
||||
"飞书": "u",
|
||||
"京东": "u"
|
||||
},
|
||||
"快应用": {
|
||||
"华为": "u",
|
||||
"联盟": "u"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
7
src/uni_modules/lz-url_launch/readme.md
Normal file
7
src/uni_modules/lz-url_launch/readme.md
Normal file
@ -0,0 +1,7 @@
|
||||
# lz-url_launch
|
||||
### 开发文档
|
||||
[UTS 语法](https://uniapp.dcloud.net.cn/tutorial/syntax-uts.html)
|
||||
[UTS API插件](https://uniapp.dcloud.net.cn/plugin/uts-plugin.html)
|
||||
[UTS uni-app兼容模式组件](https://uniapp.dcloud.net.cn/plugin/uts-component.html)
|
||||
[UTS 标准模式组件](https://doc.dcloud.net.cn/uni-app-x/plugin/uts-vue-component.html)
|
||||
[Hello UTS](https://gitcode.net/dcloud/hello-uts)
|
3
src/uni_modules/lz-url_launch/utssdk/app-ios/config.json
Normal file
3
src/uni_modules/lz-url_launch/utssdk/app-ios/config.json
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"deploymentTarget": "12"
|
||||
}
|
10
src/uni_modules/lz-url_launch/utssdk/app-ios/index.uts
Normal file
10
src/uni_modules/lz-url_launch/utssdk/app-ios/index.uts
Normal file
@ -0,0 +1,10 @@
|
||||
import { DispatchQueue } from "UIKit";
|
||||
import { SFSafariViewController } from "SafariServices";
|
||||
|
||||
export const urlLaunch : UrlLaunch = function (url : string) : void {
|
||||
let urlObject = URL(string = url);
|
||||
let vc = SFSafariViewController(url = urlObject!)
|
||||
DispatchQueue.main.async(execute = () : void => {
|
||||
UTSiOS.getCurrentViewController().present(vc, animated = true);
|
||||
});
|
||||
}
|
6
src/uni_modules/lz-url_launch/utssdk/interface.uts
Normal file
6
src/uni_modules/lz-url_launch/utssdk/interface.uts
Normal file
@ -0,0 +1,6 @@
|
||||
/**
|
||||
* interface.uts
|
||||
* uts插件接口定义文件,按规范定义接口文件可以在HBuilderX中更好的做到语法提示
|
||||
*/
|
||||
|
||||
export type UrlLaunch = (url : string) => void
|
39
src/uni_modules/lz-url_launch/utssdk/unierror.uts
Normal file
39
src/uni_modules/lz-url_launch/utssdk/unierror.uts
Normal file
@ -0,0 +1,39 @@
|
||||
/* 此规范为 uni 规范,可以按照自己的需要选择是否实现 */
|
||||
import { MyApiErrorCode, MyApiFail } from "./interface.uts"
|
||||
/**
|
||||
* 错误主题
|
||||
* 注意:错误主题一般为插件名称,每个组件不同,需要使用时请更改。
|
||||
* [可选实现]
|
||||
*/
|
||||
export const UniErrorSubject = 'uts-api';
|
||||
|
||||
|
||||
/**
|
||||
* 错误信息
|
||||
* @UniError
|
||||
* [可选实现]
|
||||
*/
|
||||
export const MyAPIErrors : Map<MyApiErrorCode, string> = new Map([
|
||||
/**
|
||||
* 错误码及对应的错误信息
|
||||
*/
|
||||
[9010001, 'custom error mseeage1'],
|
||||
[9010002, 'custom error mseeage2'],
|
||||
]);
|
||||
|
||||
|
||||
/**
|
||||
* 错误对象实现
|
||||
*/
|
||||
export class MyApiFailImpl extends UniError implements MyApiFail {
|
||||
|
||||
/**
|
||||
* 错误对象构造函数
|
||||
*/
|
||||
constructor(errCode : MyApiErrorCode) {
|
||||
super();
|
||||
this.errSubject = UniErrorSubject;
|
||||
this.errCode = errCode;
|
||||
this.errMsg = MyAPIErrors.get(errCode) ?? "";
|
||||
}
|
||||
}
|
174
src/utils/chatCrypto.js
Normal file
174
src/utils/chatCrypto.js
Normal file
@ -0,0 +1,174 @@
|
||||
/*
|
||||
CryptoJS v3.1.2
|
||||
code.google.com/p/crypto-js
|
||||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||||
code.google.com/p/crypto-js/wiki/License
|
||||
*/
|
||||
var CryptoJS = CryptoJS || function (u, p) {
|
||||
var d = {}, l = d.lib = {}, s = function () { }, t = l.Base = { extend: function (a) { s.prototype = this; var c = new s; a && c.mixIn(a); c.hasOwnProperty("init") || (c.init = function () { c.$super.init.apply(this, arguments) }); c.init.prototype = c; c.$super = this; return c }, create: function () { var a = this.extend(); a.init.apply(a, arguments); return a }, init: function () { }, mixIn: function (a) { for (var c in a) a.hasOwnProperty(c) && (this[c] = a[c]); a.hasOwnProperty("toString") && (this.toString = a.toString) }, clone: function () { return this.init.prototype.extend(this) } },
|
||||
r = l.WordArray = t.extend({
|
||||
init: function (a, c) { a = this.words = a || []; this.sigBytes = c != p ? c : 4 * a.length }, toString: function (a) { return (a || v).stringify(this) }, concat: function (a) { var c = this.words, e = a.words, j = this.sigBytes; a = a.sigBytes; this.clamp(); if (j % 4) for (var k = 0; k < a; k++)c[j + k >>> 2] |= (e[k >>> 2] >>> 24 - 8 * (k % 4) & 255) << 24 - 8 * ((j + k) % 4); else if (65535 < e.length) for (k = 0; k < a; k += 4)c[j + k >>> 2] = e[k >>> 2]; else c.push.apply(c, e); this.sigBytes += a; return this }, clamp: function () {
|
||||
var a = this.words, c = this.sigBytes; a[c >>> 2] &= 4294967295 <<
|
||||
32 - 8 * (c % 4); a.length = u.ceil(c / 4)
|
||||
}, clone: function () { var a = t.clone.call(this); a.words = this.words.slice(0); return a }, random: function (a) { for (var c = [], e = 0; e < a; e += 4)c.push(4294967296 * u.random() | 0); return new r.init(c, a) }
|
||||
}), w = d.enc = {}, v = w.Hex = {
|
||||
stringify: function (a) { var c = a.words; a = a.sigBytes; for (var e = [], j = 0; j < a; j++) { var k = c[j >>> 2] >>> 24 - 8 * (j % 4) & 255; e.push((k >>> 4).toString(16)); e.push((k & 15).toString(16)) } return e.join("") }, parse: function (a) {
|
||||
for (var c = a.length, e = [], j = 0; j < c; j += 2)e[j >>> 3] |= parseInt(a.substr(j,
|
||||
2), 16) << 24 - 4 * (j % 8); return new r.init(e, c / 2)
|
||||
}
|
||||
}, b = w.Latin1 = { stringify: function (a) { var c = a.words; a = a.sigBytes; for (var e = [], j = 0; j < a; j++)e.push(String.fromCharCode(c[j >>> 2] >>> 24 - 8 * (j % 4) & 255)); return e.join("") }, parse: function (a) { for (var c = a.length, e = [], j = 0; j < c; j++)e[j >>> 2] |= (a.charCodeAt(j) & 255) << 24 - 8 * (j % 4); return new r.init(e, c) } }, x = w.Utf8 = { stringify: function (a) { try { return decodeURIComponent(escape(b.stringify(a))) } catch (c) { throw Error("Malformed UTF-8 data"); } }, parse: function (a) { return b.parse(unescape(encodeURIComponent(a))) } },
|
||||
q = l.BufferedBlockAlgorithm = t.extend({
|
||||
reset: function () { this._data = new r.init; this._nDataBytes = 0 }, _append: function (a) { "string" == typeof a && (a = x.parse(a)); this._data.concat(a); this._nDataBytes += a.sigBytes }, _process: function (a) { var c = this._data, e = c.words, j = c.sigBytes, k = this.blockSize, b = j / (4 * k), b = a ? u.ceil(b) : u.max((b | 0) - this._minBufferSize, 0); a = b * k; j = u.min(4 * a, j); if (a) { for (var q = 0; q < a; q += k)this._doProcessBlock(e, q); q = e.splice(0, a); c.sigBytes -= j } return new r.init(q, j) }, clone: function () {
|
||||
var a = t.clone.call(this);
|
||||
a._data = this._data.clone(); return a
|
||||
}, _minBufferSize: 0
|
||||
}); l.Hasher = q.extend({
|
||||
cfg: t.extend(), init: function (a) { this.cfg = this.cfg.extend(a); this.reset() }, reset: function () { q.reset.call(this); this._doReset() }, update: function (a) { this._append(a); this._process(); return this }, finalize: function (a) { a && this._append(a); return this._doFinalize() }, blockSize: 16, _createHelper: function (a) { return function (b, e) { return (new a.init(e)).finalize(b) } }, _createHmacHelper: function (a) {
|
||||
return function (b, e) {
|
||||
return (new n.HMAC.init(a,
|
||||
e)).finalize(b)
|
||||
}
|
||||
}
|
||||
}); var n = d.algo = {}; return d
|
||||
}(Math);
|
||||
(function () {
|
||||
var u = CryptoJS, p = u.lib.WordArray; u.enc.Base64 = {
|
||||
stringify: function (d) { var l = d.words, p = d.sigBytes, t = this._map; d.clamp(); d = []; for (var r = 0; r < p; r += 3)for (var w = (l[r >>> 2] >>> 24 - 8 * (r % 4) & 255) << 16 | (l[r + 1 >>> 2] >>> 24 - 8 * ((r + 1) % 4) & 255) << 8 | l[r + 2 >>> 2] >>> 24 - 8 * ((r + 2) % 4) & 255, v = 0; 4 > v && r + 0.75 * v < p; v++)d.push(t.charAt(w >>> 6 * (3 - v) & 63)); if (l = t.charAt(64)) for (; d.length % 4;)d.push(l); return d.join("") }, parse: function (d) {
|
||||
var l = d.length, s = this._map, t = s.charAt(64); t && (t = d.indexOf(t), -1 != t && (l = t)); for (var t = [], r = 0, w = 0; w <
|
||||
l; w++)if (w % 4) { var v = s.indexOf(d.charAt(w - 1)) << 2 * (w % 4), b = s.indexOf(d.charAt(w)) >>> 6 - 2 * (w % 4); t[r >>> 2] |= (v | b) << 24 - 8 * (r % 4); r++ } return p.create(t, r)
|
||||
}, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
|
||||
}
|
||||
})();
|
||||
(function (u) {
|
||||
function p (b, n, a, c, e, j, k) { b = b + (n & a | ~n & c) + e + k; return (b << j | b >>> 32 - j) + n } function d (b, n, a, c, e, j, k) { b = b + (n & c | a & ~c) + e + k; return (b << j | b >>> 32 - j) + n } function l (b, n, a, c, e, j, k) { b = b + (n ^ a ^ c) + e + k; return (b << j | b >>> 32 - j) + n } function s (b, n, a, c, e, j, k) { b = b + (a ^ (n | ~c)) + e + k; return (b << j | b >>> 32 - j) + n } for (var t = CryptoJS, r = t.lib, w = r.WordArray, v = r.Hasher, r = t.algo, b = [], x = 0; 64 > x; x++)b[x] = 4294967296 * u.abs(u.sin(x + 1)) | 0; r = r.MD5 = v.extend({
|
||||
_doReset: function () { this._hash = new w.init([1732584193, 4023233417, 2562383102, 271733878]) },
|
||||
_doProcessBlock: function (q, n) {
|
||||
for (var a = 0; 16 > a; a++) { var c = n + a, e = q[c]; q[c] = (e << 8 | e >>> 24) & 16711935 | (e << 24 | e >>> 8) & 4278255360 } var a = this._hash.words, c = q[n + 0], e = q[n + 1], j = q[n + 2], k = q[n + 3], z = q[n + 4], r = q[n + 5], t = q[n + 6], w = q[n + 7], v = q[n + 8], A = q[n + 9], B = q[n + 10], C = q[n + 11], u = q[n + 12], D = q[n + 13], E = q[n + 14], x = q[n + 15], f = a[0], m = a[1], g = a[2], h = a[3], f = p(f, m, g, h, c, 7, b[0]), h = p(h, f, m, g, e, 12, b[1]), g = p(g, h, f, m, j, 17, b[2]), m = p(m, g, h, f, k, 22, b[3]), f = p(f, m, g, h, z, 7, b[4]), h = p(h, f, m, g, r, 12, b[5]), g = p(g, h, f, m, t, 17, b[6]), m = p(m, g, h, f, w, 22, b[7]),
|
||||
f = p(f, m, g, h, v, 7, b[8]), h = p(h, f, m, g, A, 12, b[9]), g = p(g, h, f, m, B, 17, b[10]), m = p(m, g, h, f, C, 22, b[11]), f = p(f, m, g, h, u, 7, b[12]), h = p(h, f, m, g, D, 12, b[13]), g = p(g, h, f, m, E, 17, b[14]), m = p(m, g, h, f, x, 22, b[15]), f = d(f, m, g, h, e, 5, b[16]), h = d(h, f, m, g, t, 9, b[17]), g = d(g, h, f, m, C, 14, b[18]), m = d(m, g, h, f, c, 20, b[19]), f = d(f, m, g, h, r, 5, b[20]), h = d(h, f, m, g, B, 9, b[21]), g = d(g, h, f, m, x, 14, b[22]), m = d(m, g, h, f, z, 20, b[23]), f = d(f, m, g, h, A, 5, b[24]), h = d(h, f, m, g, E, 9, b[25]), g = d(g, h, f, m, k, 14, b[26]), m = d(m, g, h, f, v, 20, b[27]), f = d(f, m, g, h, D, 5, b[28]), h = d(h, f,
|
||||
m, g, j, 9, b[29]), g = d(g, h, f, m, w, 14, b[30]), m = d(m, g, h, f, u, 20, b[31]), f = l(f, m, g, h, r, 4, b[32]), h = l(h, f, m, g, v, 11, b[33]), g = l(g, h, f, m, C, 16, b[34]), m = l(m, g, h, f, E, 23, b[35]), f = l(f, m, g, h, e, 4, b[36]), h = l(h, f, m, g, z, 11, b[37]), g = l(g, h, f, m, w, 16, b[38]), m = l(m, g, h, f, B, 23, b[39]), f = l(f, m, g, h, D, 4, b[40]), h = l(h, f, m, g, c, 11, b[41]), g = l(g, h, f, m, k, 16, b[42]), m = l(m, g, h, f, t, 23, b[43]), f = l(f, m, g, h, A, 4, b[44]), h = l(h, f, m, g, u, 11, b[45]), g = l(g, h, f, m, x, 16, b[46]), m = l(m, g, h, f, j, 23, b[47]), f = s(f, m, g, h, c, 6, b[48]), h = s(h, f, m, g, w, 10, b[49]), g = s(g, h, f, m,
|
||||
E, 15, b[50]), m = s(m, g, h, f, r, 21, b[51]), f = s(f, m, g, h, u, 6, b[52]), h = s(h, f, m, g, k, 10, b[53]), g = s(g, h, f, m, B, 15, b[54]), m = s(m, g, h, f, e, 21, b[55]), f = s(f, m, g, h, v, 6, b[56]), h = s(h, f, m, g, x, 10, b[57]), g = s(g, h, f, m, t, 15, b[58]), m = s(m, g, h, f, D, 21, b[59]), f = s(f, m, g, h, z, 6, b[60]), h = s(h, f, m, g, C, 10, b[61]), g = s(g, h, f, m, j, 15, b[62]), m = s(m, g, h, f, A, 21, b[63]); a[0] = a[0] + f | 0; a[1] = a[1] + m | 0; a[2] = a[2] + g | 0; a[3] = a[3] + h | 0
|
||||
}, _doFinalize: function () {
|
||||
var b = this._data, n = b.words, a = 8 * this._nDataBytes, c = 8 * b.sigBytes; n[c >>> 5] |= 128 << 24 - c % 32; var e = u.floor(a /
|
||||
4294967296); n[(c + 64 >>> 9 << 4) + 15] = (e << 8 | e >>> 24) & 16711935 | (e << 24 | e >>> 8) & 4278255360; n[(c + 64 >>> 9 << 4) + 14] = (a << 8 | a >>> 24) & 16711935 | (a << 24 | a >>> 8) & 4278255360; b.sigBytes = 4 * (n.length + 1); this._process(); b = this._hash; n = b.words; for (a = 0; 4 > a; a++)c = n[a], n[a] = (c << 8 | c >>> 24) & 16711935 | (c << 24 | c >>> 8) & 4278255360; return b
|
||||
}, clone: function () { var b = v.clone.call(this); b._hash = this._hash.clone(); return b }
|
||||
}); t.MD5 = v._createHelper(r); t.HmacMD5 = v._createHmacHelper(r)
|
||||
})(Math);
|
||||
(function () {
|
||||
var u = CryptoJS, p = u.lib, d = p.Base, l = p.WordArray, p = u.algo, s = p.EvpKDF = d.extend({ cfg: d.extend({ keySize: 4, hasher: p.MD5, iterations: 1 }), init: function (d) { this.cfg = this.cfg.extend(d) }, compute: function (d, r) { for (var p = this.cfg, s = p.hasher.create(), b = l.create(), u = b.words, q = p.keySize, p = p.iterations; u.length < q;) { n && s.update(n); var n = s.update(d).finalize(r); s.reset(); for (var a = 1; a < p; a++)n = s.finalize(n), s.reset(); b.concat(n) } b.sigBytes = 4 * q; return b } }); u.EvpKDF = function (d, l, p) {
|
||||
return s.create(p).compute(d,
|
||||
l)
|
||||
}
|
||||
})();
|
||||
CryptoJS.lib.Cipher || function (u) {
|
||||
var p = CryptoJS, d = p.lib, l = d.Base, s = d.WordArray, t = d.BufferedBlockAlgorithm, r = p.enc.Base64, w = p.algo.EvpKDF, v = d.Cipher = t.extend({
|
||||
cfg: l.extend(), createEncryptor: function (e, a) { return this.create(this._ENC_XFORM_MODE, e, a) }, createDecryptor: function (e, a) { return this.create(this._DEC_XFORM_MODE, e, a) }, init: function (e, a, b) { this.cfg = this.cfg.extend(b); this._xformMode = e; this._key = a; this.reset() }, reset: function () { t.reset.call(this); this._doReset() }, process: function (e) { this._append(e); return this._process() },
|
||||
finalize: function (e) { e && this._append(e); return this._doFinalize() }, keySize: 4, ivSize: 4, _ENC_XFORM_MODE: 1, _DEC_XFORM_MODE: 2, _createHelper: function (e) { return { encrypt: function (b, k, d) { return ("string" == typeof k ? c : a).encrypt(e, b, k, d) }, decrypt: function (b, k, d) { return ("string" == typeof k ? c : a).decrypt(e, b, k, d) } } }
|
||||
}); d.StreamCipher = v.extend({ _doFinalize: function () { return this._process(!0) }, blockSize: 1 }); var b = p.mode = {}, x = function (e, a, b) {
|
||||
var c = this._iv; c ? this._iv = u : c = this._prevBlock; for (var d = 0; d < b; d++)e[a + d] ^=
|
||||
c[d]
|
||||
}, q = (d.BlockCipherMode = l.extend({ createEncryptor: function (e, a) { return this.Encryptor.create(e, a) }, createDecryptor: function (e, a) { return this.Decryptor.create(e, a) }, init: function (e, a) { this._cipher = e; this._iv = a } })).extend(); q.Encryptor = q.extend({ processBlock: function (e, a) { var b = this._cipher, c = b.blockSize; x.call(this, e, a, c); b.encryptBlock(e, a); this._prevBlock = e.slice(a, a + c) } }); q.Decryptor = q.extend({
|
||||
processBlock: function (e, a) {
|
||||
var b = this._cipher, c = b.blockSize, d = e.slice(a, a + c); b.decryptBlock(e, a); x.call(this,
|
||||
e, a, c); this._prevBlock = d
|
||||
}
|
||||
}); b = b.CBC = q; q = (p.pad = {}).Pkcs7 = { pad: function (a, b) { for (var c = 4 * b, c = c - a.sigBytes % c, d = c << 24 | c << 16 | c << 8 | c, l = [], n = 0; n < c; n += 4)l.push(d); c = s.create(l, c); a.concat(c) }, unpad: function (a) { a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255 } }; d.BlockCipher = v.extend({
|
||||
cfg: v.cfg.extend({ mode: b, padding: q }), reset: function () {
|
||||
v.reset.call(this); var a = this.cfg, b = a.iv, a = a.mode; if (this._xformMode == this._ENC_XFORM_MODE) var c = a.createEncryptor; else c = a.createDecryptor, this._minBufferSize = 1; this._mode = c.call(a,
|
||||
this, b && b.words)
|
||||
}, _doProcessBlock: function (a, b) { this._mode.processBlock(a, b) }, _doFinalize: function () { var a = this.cfg.padding; if (this._xformMode == this._ENC_XFORM_MODE) { a.pad(this._data, this.blockSize); var b = this._process(!0) } else b = this._process(!0), a.unpad(b); return b }, blockSize: 4
|
||||
}); var n = d.CipherParams = l.extend({ init: function (a) { this.mixIn(a) }, toString: function (a) { return (a || this.formatter).stringify(this) } }), b = (p.format = {}).OpenSSL = {
|
||||
stringify: function (a) {
|
||||
var b = a.ciphertext; a = a.salt; return (a ? s.create([1398893684,
|
||||
1701076831]).concat(a).concat(b) : b).toString(r)
|
||||
}, parse: function (a) { a = r.parse(a); var b = a.words; if (1398893684 == b[0] && 1701076831 == b[1]) { var c = s.create(b.slice(2, 4)); b.splice(0, 4); a.sigBytes -= 16 } return n.create({ ciphertext: a, salt: c }) }
|
||||
}, a = d.SerializableCipher = l.extend({
|
||||
cfg: l.extend({ format: b }), encrypt: function (a, b, c, d) { d = this.cfg.extend(d); var l = a.createEncryptor(c, d); b = l.finalize(b); l = l.cfg; return n.create({ ciphertext: b, key: c, iv: l.iv, algorithm: a, mode: l.mode, padding: l.padding, blockSize: a.blockSize, formatter: d.format }) },
|
||||
decrypt: function (a, b, c, d) { d = this.cfg.extend(d); b = this._parse(b, d.format); return a.createDecryptor(c, d).finalize(b.ciphertext) }, _parse: function (a, b) { return "string" == typeof a ? b.parse(a, this) : a }
|
||||
}), p = (p.kdf = {}).OpenSSL = { execute: function (a, b, c, d) { d || (d = s.random(8)); a = w.create({ keySize: b + c }).compute(a, d); c = s.create(a.words.slice(b), 4 * c); a.sigBytes = 4 * b; return n.create({ key: a, iv: c, salt: d }) } }, c = d.PasswordBasedCipher = a.extend({
|
||||
cfg: a.cfg.extend({ kdf: p }), encrypt: function (b, c, d, l) {
|
||||
l = this.cfg.extend(l); d = l.kdf.execute(d,
|
||||
b.keySize, b.ivSize); l.iv = d.iv; b = a.encrypt.call(this, b, c, d.key, l); b.mixIn(d); return b
|
||||
}, decrypt: function (b, c, d, l) { l = this.cfg.extend(l); c = this._parse(c, l.format); d = l.kdf.execute(d, b.keySize, b.ivSize, c.salt); l.iv = d.iv; return a.decrypt.call(this, b, c, d.key, l) }
|
||||
})
|
||||
}();
|
||||
(function () {
|
||||
for (var u = CryptoJS, p = u.lib.BlockCipher, d = u.algo, l = [], s = [], t = [], r = [], w = [], v = [], b = [], x = [], q = [], n = [], a = [], c = 0; 256 > c; c++)a[c] = 128 > c ? c << 1 : c << 1 ^ 283; for (var e = 0, j = 0, c = 0; 256 > c; c++) { var k = j ^ j << 1 ^ j << 2 ^ j << 3 ^ j << 4, k = k >>> 8 ^ k & 255 ^ 99; l[e] = k; s[k] = e; var z = a[e], F = a[z], G = a[F], y = 257 * a[k] ^ 16843008 * k; t[e] = y << 24 | y >>> 8; r[e] = y << 16 | y >>> 16; w[e] = y << 8 | y >>> 24; v[e] = y; y = 16843009 * G ^ 65537 * F ^ 257 * z ^ 16843008 * e; b[k] = y << 24 | y >>> 8; x[k] = y << 16 | y >>> 16; q[k] = y << 8 | y >>> 24; n[k] = y; e ? (e = z ^ a[a[a[G ^ z]]], j ^= a[a[j]]) : e = j = 1 } var H = [0, 1, 2, 4, 8,
|
||||
16, 32, 64, 128, 27, 54], d = d.AES = p.extend({
|
||||
_doReset: function () {
|
||||
for (var a = this._key, c = a.words, d = a.sigBytes / 4, a = 4 * ((this._nRounds = d + 6) + 1), e = this._keySchedule = [], j = 0; j < a; j++)if (j < d) e[j] = c[j]; else { var k = e[j - 1]; j % d ? 6 < d && 4 == j % d && (k = l[k >>> 24] << 24 | l[k >>> 16 & 255] << 16 | l[k >>> 8 & 255] << 8 | l[k & 255]) : (k = k << 8 | k >>> 24, k = l[k >>> 24] << 24 | l[k >>> 16 & 255] << 16 | l[k >>> 8 & 255] << 8 | l[k & 255], k ^= H[j / d | 0] << 24); e[j] = e[j - d] ^ k } c = this._invKeySchedule = []; for (d = 0; d < a; d++)j = a - d, k = d % 4 ? e[j] : e[j - 4], c[d] = 4 > d || 4 >= j ? k : b[l[k >>> 24]] ^ x[l[k >>> 16 & 255]] ^ q[l[k >>>
|
||||
8 & 255]] ^ n[l[k & 255]]
|
||||
}, encryptBlock: function (a, b) { this._doCryptBlock(a, b, this._keySchedule, t, r, w, v, l) }, decryptBlock: function (a, c) { var d = a[c + 1]; a[c + 1] = a[c + 3]; a[c + 3] = d; this._doCryptBlock(a, c, this._invKeySchedule, b, x, q, n, s); d = a[c + 1]; a[c + 1] = a[c + 3]; a[c + 3] = d }, _doCryptBlock: function (a, b, c, d, e, j, l, f) {
|
||||
for (var m = this._nRounds, g = a[b] ^ c[0], h = a[b + 1] ^ c[1], k = a[b + 2] ^ c[2], n = a[b + 3] ^ c[3], p = 4, r = 1; r < m; r++)var q = d[g >>> 24] ^ e[h >>> 16 & 255] ^ j[k >>> 8 & 255] ^ l[n & 255] ^ c[p++], s = d[h >>> 24] ^ e[k >>> 16 & 255] ^ j[n >>> 8 & 255] ^ l[g & 255] ^ c[p++], t =
|
||||
d[k >>> 24] ^ e[n >>> 16 & 255] ^ j[g >>> 8 & 255] ^ l[h & 255] ^ c[p++], n = d[n >>> 24] ^ e[g >>> 16 & 255] ^ j[h >>> 8 & 255] ^ l[k & 255] ^ c[p++], g = q, h = s, k = t; q = (f[g >>> 24] << 24 | f[h >>> 16 & 255] << 16 | f[k >>> 8 & 255] << 8 | f[n & 255]) ^ c[p++]; s = (f[h >>> 24] << 24 | f[k >>> 16 & 255] << 16 | f[n >>> 8 & 255] << 8 | f[g & 255]) ^ c[p++]; t = (f[k >>> 24] << 24 | f[n >>> 16 & 255] << 16 | f[g >>> 8 & 255] << 8 | f[h & 255]) ^ c[p++]; n = (f[n >>> 24] << 24 | f[g >>> 16 & 255] << 16 | f[h >>> 8 & 255] << 8 | f[k & 255]) ^ c[p++]; a[b] = q; a[b + 1] = s; a[b + 2] = t; a[b + 3] = n
|
||||
}, keySize: 8
|
||||
}); u.AES = p._createHelper(d)
|
||||
})();
|
||||
|
||||
CryptoJS.encrypt = function (word, key, iv) {
|
||||
return encrypt(word, key, iv)
|
||||
}
|
||||
|
||||
CryptoJS.decrypt = function (word, key, iv) {
|
||||
return decrypt(word, key, iv)
|
||||
}
|
||||
|
||||
/**
|
||||
* 加密
|
||||
* word:原密码
|
||||
* key :key
|
||||
* iv : iv
|
||||
*/
|
||||
function encrypt (word, key, iv) {
|
||||
key = CryptoJS.enc.Utf8.parse(key);
|
||||
iv = CryptoJS.enc.Utf8.parse(iv);
|
||||
var encrypted = CryptoJS.AES.encrypt(word, key, {
|
||||
iv: iv,
|
||||
mode: CryptoJS.mode.CBC,
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
});
|
||||
return encrypted.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 解密
|
||||
* word:加密后的密码
|
||||
* key :key
|
||||
* iv : iv
|
||||
*/
|
||||
function decrypt (word, key, iv) {
|
||||
key = CryptoJS.enc.Utf8.parse(key);
|
||||
iv = CryptoJS.enc.Utf8.parse(iv);
|
||||
var decrypted = CryptoJS.AES.decrypt(word, key, {
|
||||
iv: iv,
|
||||
mode: CryptoJS.mode.CBC,
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
});
|
||||
decrypted = CryptoJS.enc.Utf8.stringify(decrypted);
|
||||
return decrypted;
|
||||
}
|
||||
/**
|
||||
* Electronic Codebook block mode.
|
||||
*/
|
||||
CryptoJS.mode.ECB = (function () {
|
||||
var ECB = CryptoJS.lib.BlockCipherMode.extend();
|
||||
ECB.Encryptor = ECB.extend({
|
||||
processBlock: function (words, offset) {
|
||||
this._cipher.encryptBlock(words, offset);
|
||||
}
|
||||
});
|
||||
ECB.Decryptor = ECB.extend({
|
||||
processBlock: function (words, offset) {
|
||||
this._cipher.decryptBlock(words, offset);
|
||||
}
|
||||
});
|
||||
return ECB;
|
||||
}());
|
||||
/**
|
||||
* @example
|
||||
* var CryptoJS = require('./util/aes.js')
|
||||
* var key = CryptoJS.enc.Utf8.parse("key");
|
||||
* var iv = CryptoJS.enc.Utf8.parse("iv");
|
||||
* var pwd = CryptoJS.encrypt(this.data.pwdVal, key, iv)
|
||||
* var original = CryptoJS.encrypt(pwd, key, iv)
|
||||
*/
|
||||
export default CryptoJS;
|
19
src/utils/chatEncrypt.js
Normal file
19
src/utils/chatEncrypt.js
Normal file
@ -0,0 +1,19 @@
|
||||
import Crypto from '@/utils/chatCrypto'
|
||||
|
||||
// 秘钥,转换成utf8格式字符串,用于加密解密,一般长度是16位(由后端提供)
|
||||
const key = Crypto.enc.Utf8.parse('qw5w6SFE2D1jmxyd')
|
||||
// 偏移量,转换成utf8格式字符串,一般长度是16位(由后端提供)
|
||||
const iv = Crypto.enc.Utf8.parse('345GDFED433223DF')
|
||||
|
||||
// 加密(使用CBC模式)
|
||||
export default function Encrypt(value) {
|
||||
// 使用外部包中的AES的加密方法
|
||||
// value(加密内容)、key(密钥)
|
||||
let encrypt = Crypto.AES.encrypt(value, key, {
|
||||
iv, // 偏移量
|
||||
mode: Crypto.mode.CBC, // 模式(五种加密模式)
|
||||
padding: Crypto.pad.Pkcs7 // 填充
|
||||
})
|
||||
// 将加密的内容转成字符串返回出去
|
||||
return encrypt.toString()
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
// utils/request.js
|
||||
// #ifdef APP
|
||||
const BASE_URL = 'https://app.quannengcha.com/api/v1'
|
||||
const BASE_URL = 'https://www.quannengcha.com/api/v1'
|
||||
// const BASE_URL = 'https://6m4685017o.goho.co/api/v1'
|
||||
|
||||
// #endif
|
||||
@ -21,6 +21,8 @@ function request(options) {
|
||||
options.header = {
|
||||
...options.header,
|
||||
Authorization: `${token}`,
|
||||
'X-Platform': 'app', // 添加平台信息
|
||||
'X-Brand': 'qnc', // 添加品牌信息
|
||||
}
|
||||
// 如果是 GET 请求,并且有参数,将参数拼接到 URL
|
||||
let url = BASE_URL + options.url
|
||||
|
Loading…
Reference in New Issue
Block a user