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
|
// Silent the stylistic rules in you IDE, but still auto fix them
|
||||||
"eslint.rules.customizations": [
|
"eslint.rules.customizations": [
|
||||||
{ "rule": "style/*", "severity": "off", "fixable": true },
|
{ "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": "*-indent", "severity": "off", "fixable": true },
|
||||||
{ "rule": "*-spacing", "severity": "off", "fixable": true },
|
{ "rule": "*-spacing", "severity": "off", "fixable": true },
|
||||||
{ "rule": "*-spaces", "severity": "off", "fixable": true },
|
{ "rule": "*-spaces", "severity": "off", "fixable": true },
|
||||||
|
50
src/App.vue
50
src/App.vue
@ -1,4 +1,54 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
|
import { getToken } from '@/api/apis.js'
|
||||||
|
|
||||||
onLaunch(() => {
|
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>
|
</script>
|
||||||
|
@ -16,6 +16,13 @@ export function login(data) {
|
|||||||
data,
|
data,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
export function getToken(data) {
|
||||||
|
return request({
|
||||||
|
url: '/user/getToken',
|
||||||
|
method: 'POST',
|
||||||
|
data,
|
||||||
|
})
|
||||||
|
}
|
||||||
export function getCode(data) {
|
export function getCode(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/auth/sendSms',
|
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 aesEncrypt: typeof import('./utils/crypto.js')['aesEncrypt']
|
||||||
const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
|
const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
|
||||||
const autoResetRef: typeof import('@vueuse/core')['autoResetRef']
|
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 computed: typeof import('vue')['computed']
|
||||||
const computedAsync: typeof import('@vueuse/core')['computedAsync']
|
const computedAsync: typeof import('@vueuse/core')['computedAsync']
|
||||||
const computedEager: typeof import('@vueuse/core')['computedEager']
|
const computedEager: typeof import('@vueuse/core')['computedEager']
|
||||||
@ -329,6 +331,8 @@ declare module 'vue' {
|
|||||||
readonly aesEncrypt: UnwrapRef<typeof import('./utils/crypto.js')['aesEncrypt']>
|
readonly aesEncrypt: UnwrapRef<typeof import('./utils/crypto.js')['aesEncrypt']>
|
||||||
readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']>
|
readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']>
|
||||||
readonly autoResetRef: UnwrapRef<typeof import('@vueuse/core')['autoResetRef']>
|
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 computed: UnwrapRef<typeof import('vue')['computed']>
|
||||||
readonly computedAsync: UnwrapRef<typeof import('@vueuse/core')['computedAsync']>
|
readonly computedAsync: UnwrapRef<typeof import('@vueuse/core')['computedAsync']>
|
||||||
readonly computedEager: UnwrapRef<typeof import('@vueuse/core')['computedEager']>
|
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']
|
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']
|
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']
|
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']
|
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']
|
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",
|
"layout": "page",
|
||||||
"title": "投诉服务"
|
"title": "投诉服务"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"path": "pages/example copy",
|
|
||||||
"type": "page",
|
|
||||||
"layout": "page",
|
|
||||||
"title": "报告示例"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"path": "pages/example",
|
|
||||||
"type": "page",
|
|
||||||
"layout": "page",
|
|
||||||
"title": "示例报告"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"path": "pages/inquire",
|
"path": "pages/inquire",
|
||||||
"type": "page",
|
"type": "page",
|
||||||
@ -51,42 +39,12 @@
|
|||||||
"type": "page",
|
"type": "page",
|
||||||
"layout": "home"
|
"layout": "home"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"path": "pages/pay",
|
|
||||||
"type": "page",
|
|
||||||
"layout": "page",
|
|
||||||
"title": "全能查收款"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"path": "pages/payb",
|
|
||||||
"type": "page",
|
|
||||||
"layout": "page",
|
|
||||||
"title": "全能查收款"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"path": "pages/privacyPolicy",
|
"path": "pages/privacyPolicy",
|
||||||
"type": "page",
|
"type": "page",
|
||||||
"layout": "page",
|
"layout": "page",
|
||||||
"title": "隐私政策"
|
"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",
|
"path": "pages/service",
|
||||||
"type": "page",
|
"type": "page",
|
||||||
|
@ -1,70 +1,14 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, ref } from 'vue'
|
import WebviewPage from '@/components/WebviewPage.vue'
|
||||||
|
|
||||||
const userMessage = ref('')
|
const webviewSrc = '/ai' // 可以根据不同页面设置不同的值
|
||||||
const messages = ref([
|
const navigationBarTitleText = 'AI律师' // 同样可以根据需要修改
|
||||||
{ 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 // 设置安全区顶部距离
|
|
||||||
}
|
|
||||||
},
|
|
||||||
})
|
|
||||||
})
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<view
|
<WebviewPage :webview-src="webviewSrc" :navigation-bar-title-text="navigationBarTitleText" />
|
||||||
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>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.chat-page {
|
|
||||||
height: calc(100vh - 108px);
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<route lang="json">
|
<route lang="json">
|
||||||
{
|
{
|
||||||
"layout": "home"
|
"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: '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: '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: '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() {
|
function toHistory() {
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
@ -33,8 +34,8 @@ function toHistory() {
|
|||||||
mode="aspectFit"
|
mode="aspectFit"
|
||||||
/>
|
/>
|
||||||
</view>
|
</view>
|
||||||
<view class="relative p-4 pb-4 pt-2">
|
<view class="relative p-4 pb-4 pt-8">
|
||||||
<view class="mb-1 flex items-center">
|
<!-- <view class="mb-1 flex items-center">
|
||||||
<view class="flex-shrink-0 pl-2 font-bold">
|
<view class="flex-shrink-0 pl-2 font-bold">
|
||||||
在线信息
|
在线信息
|
||||||
</view>
|
</view>
|
||||||
@ -42,7 +43,7 @@ function toHistory() {
|
|||||||
:text="noticeText" direction="vertical" :delay="5" color="#4c4c4c"
|
:text="noticeText" direction="vertical" :delay="5" color="#4c4c4c"
|
||||||
background-color="#00000000"
|
background-color="#00000000"
|
||||||
/>
|
/>
|
||||||
</view>
|
</view> -->
|
||||||
<view class="grid grid-cols-2 gap-3">
|
<view class="grid grid-cols-2 gap-3">
|
||||||
<template v-for="(service, index) in services" :key="index">
|
<template v-for="(service, index) in services" :key="index">
|
||||||
<view
|
<view
|
||||||
@ -67,7 +68,7 @@ function toHistory() {
|
|||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
</view>
|
</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"
|
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"
|
@click="toHistory"
|
||||||
>
|
>
|
||||||
@ -84,7 +85,7 @@ function toHistory() {
|
|||||||
查询记录有效期为30天
|
查询记录有效期为30天
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</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"
|
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) => {
|
}).then((res) => {
|
||||||
if (res.code === 200) {
|
if (res.code === 200) {
|
||||||
uni.showToast({ title: '获取成功', icon: 'none' })
|
uni.showToast({ title: '获取成功', icon: 'none' })
|
||||||
|
|
||||||
startCountdown()
|
startCountdown()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -72,9 +71,10 @@ function handleLogin() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
login({ mobile: phoneNumber.value, code: verificationCode.value }).then((res) => {
|
login({ mobile: phoneNumber.value, code: verificationCode.value }).then((res) => {
|
||||||
console.log('res.data.AccessToken', res.data.accessToken)
|
|
||||||
if (res.code === 200) {
|
if (res.code === 200) {
|
||||||
uni.setStorageSync('token', res.data.accessToken)
|
uni.setStorageSync('token', res.data.accessToken)
|
||||||
|
uni.setStorageSync('refreshAfter', res.data.refreshAfter)
|
||||||
|
uni.setStorageSync('accessExpire', res.data.accessExpire)
|
||||||
uni.showToast({ title: '登录成功', icon: 'none' })
|
uni.showToast({ title: '登录成功', icon: 'none' })
|
||||||
uni.reLaunch({
|
uni.reLaunch({
|
||||||
url: '/pages/index',
|
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 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 isLoggedIn = ref(false)
|
||||||
const features = ref([
|
const features = ref([
|
||||||
{ title: '我的报告', icon: 'list', action: () => toHistory() },
|
|
||||||
{ title: '联系客服', icon: 'service', action: () => toService() },
|
{ title: '联系客服', icon: 'service', action: () => toService() },
|
||||||
{ title: '用户协议', icon: 'file', action: () => toUserAgreement() },
|
{ title: '用户协议', icon: 'file', action: () => toUserAgreement() },
|
||||||
{ title: '退出登录', icon: 'logout', action: () => handleLogout() },
|
{ title: '退出登录', icon: 'logout', action: () => handleLogout() },
|
||||||
])
|
])
|
||||||
function toHistory() {
|
|
||||||
uni.navigateTo({
|
|
||||||
url: '/pages/queryHistory',
|
|
||||||
})
|
|
||||||
}
|
|
||||||
function toUserAgreement() {
|
function toUserAgreement() {
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: '/pages/userAgreement',
|
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/ai" |
|
||||||
"/pages/authorization" |
|
"/pages/authorization" |
|
||||||
"/pages/complaint" |
|
"/pages/complaint" |
|
||||||
"/pages/example copy" |
|
|
||||||
"/pages/example" |
|
|
||||||
"/pages/inquire" |
|
"/pages/inquire" |
|
||||||
"/pages/login" |
|
"/pages/login" |
|
||||||
"/pages/me" |
|
"/pages/me" |
|
||||||
"/pages/pay" |
|
|
||||||
"/pages/payb" |
|
|
||||||
"/pages/privacyPolicy" |
|
"/pages/privacyPolicy" |
|
||||||
"/pages/queryHistory" |
|
|
||||||
"/pages/result copy" |
|
|
||||||
"/pages/result" |
|
|
||||||
"/pages/service" |
|
"/pages/service" |
|
||||||
"/pages/userAgreement";
|
"/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
|
// utils/request.js
|
||||||
// #ifdef APP
|
// #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'
|
// const BASE_URL = 'https://6m4685017o.goho.co/api/v1'
|
||||||
|
|
||||||
// #endif
|
// #endif
|
||||||
@ -21,6 +21,8 @@ function request(options) {
|
|||||||
options.header = {
|
options.header = {
|
||||||
...options.header,
|
...options.header,
|
||||||
Authorization: `${token}`,
|
Authorization: `${token}`,
|
||||||
|
'X-Platform': 'app', // 添加平台信息
|
||||||
|
'X-Brand': 'qnc', // 添加品牌信息
|
||||||
}
|
}
|
||||||
// 如果是 GET 请求,并且有参数,将参数拼接到 URL
|
// 如果是 GET 请求,并且有参数,将参数拼接到 URL
|
||||||
let url = BASE_URL + options.url
|
let url = BASE_URL + options.url
|
||||||
|
Loading…
Reference in New Issue
Block a user