Compare commits

...

2 Commits

Author SHA1 Message Date
Mac
ee1d28abdb temp
Some checks failed
Check / typecheck (22.x, macos-latest) (push) Has been cancelled
Check / typecheck (22.x, ubuntu-latest) (push) Has been cancelled
Check / typecheck (22.x, windows-latest) (push) Has been cancelled
Check / build (build, 18.x, macos-latest) (push) Has been cancelled
Check / build (build, 18.x, ubuntu-latest) (push) Has been cancelled
Check / build (build, 18.x, windows-latest) (push) Has been cancelled
Check / build (build, 20.x, macos-latest) (push) Has been cancelled
Check / build (build, 20.x, ubuntu-latest) (push) Has been cancelled
Check / build (build, 20.x, windows-latest) (push) Has been cancelled
Check / build (build, 22.x, macos-latest) (push) Has been cancelled
Check / build (build, 22.x, ubuntu-latest) (push) Has been cancelled
Check / build (build, 22.x, windows-latest) (push) Has been cancelled
Check / build (build:app, 18.x, macos-latest) (push) Has been cancelled
Check / build (build:app, 18.x, ubuntu-latest) (push) Has been cancelled
Check / build (build:app, 18.x, windows-latest) (push) Has been cancelled
Check / build (build:app, 20.x, macos-latest) (push) Has been cancelled
Check / build (build:app, 20.x, ubuntu-latest) (push) Has been cancelled
Check / build (build:app, 20.x, windows-latest) (push) Has been cancelled
Check / build (build:app, 22.x, macos-latest) (push) Has been cancelled
Check / build (build:app, 22.x, ubuntu-latest) (push) Has been cancelled
Check / build (build:app, 22.x, windows-latest) (push) Has been cancelled
Check / build (build:mp-weixin, 18.x, macos-latest) (push) Has been cancelled
Check / build (build:mp-weixin, 18.x, ubuntu-latest) (push) Has been cancelled
Check / build (build:mp-weixin, 18.x, windows-latest) (push) Has been cancelled
Check / build (build:mp-weixin, 20.x, macos-latest) (push) Has been cancelled
Check / build (build:mp-weixin, 20.x, ubuntu-latest) (push) Has been cancelled
Check / build (build:mp-weixin, 20.x, windows-latest) (push) Has been cancelled
Check / build (build:mp-weixin, 22.x, macos-latest) (push) Has been cancelled
Check / build (build:mp-weixin, 22.x, ubuntu-latest) (push) Has been cancelled
Check / build (build:mp-weixin, 22.x, windows-latest) (push) Has been cancelled
2025-01-25 17:13:22 +08:00
f9b5952525 temp 2025-01-25 17:03:07 +08:00
29 changed files with 569 additions and 1035 deletions

View File

@ -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 },

View File

@ -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 refreshAfterrefreshAfter
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>

View File

@ -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',

View File

@ -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
View File

@ -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']
} }
} }

View 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>

View File

@ -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",

View File

@ -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"

View File

@ -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> &nbsp; &nbsp; 报告有效期<strong>30</strong>过期自动删除 </p><p> &nbsp; &nbsp; 若您的数据不全面可能是数据具有延迟性或者合作信息机构未获取到您的数据若数据有错误请联系客服</p>
</view>
</view>
</div>
</template>
</div>
</template>
<style lang="scss" scoped>
</style>
<route lang="json">
{
"layout": "page",
"title": "报告示例"
}
</route>

View File

@ -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>

View File

@ -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"
> >

View File

@ -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',

View File

@ -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',

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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> &nbsp; &nbsp; 报告有效期<strong>30</strong>过期自动删除 </p><p> &nbsp; &nbsp; 若您的数据不全面可能是数据具有延迟性或者合作信息机构未获取到您的数据若数据有错误请联系客服</p>
</view>
</view>
</div>
</template>
</div>
</template>
<style lang="scss" scoped>
</style>
<route lang="json">
{
"layout": "page",
"title": "报告结果"
}
</route>

View File

@ -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
View File

@ -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";
} }

View 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"
}
}
}
}
}

View 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)

View File

@ -0,0 +1,3 @@
{
"deploymentTarget": "12"
}

View 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);
});
}

View File

@ -0,0 +1,6 @@
/**
* interface.uts
* uts插件接口定义文件按规范定义接口文件可以在HBuilderX中更好的做到语法提示
*/
export type UrlLaunch = (url : string) => void

View 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
View 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
View 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()
}

View File

@ -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