修复bug
This commit is contained in:
parent
89c23cae2c
commit
538de6d717
BIN
favicon.ico
Normal file
BIN
favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
11
index.html
11
index.html
@ -1,7 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" href="favicon.ico" type="image/x-icon">
|
||||
<script>
|
||||
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
|
||||
CSS.supports('top: constant(a)'))
|
||||
@ -10,12 +12,13 @@
|
||||
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
|
||||
</script>
|
||||
<title></title>
|
||||
|
||||
<!--preload-links-->
|
||||
<!--app-context-->
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="app"><!--app-html--></div>
|
||||
<script type="module" src="/src/main.ts"></script>
|
||||
<div id="app"><!--app-html--></div>
|
||||
<script type="module" src="/src/main.ts"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
</html>
|
||||
@ -78,7 +78,7 @@ const setLocalStorage = async () => {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
const obj = { expire: "", value: cookiesToken }
|
||||
const obj = { expire: "604800", value: cookiesToken }
|
||||
localStorage.setItem("app_token", JSON.stringify(obj));
|
||||
}
|
||||
|
||||
|
||||
@ -14,7 +14,8 @@
|
||||
<u-input class="flex-1" v-model="formData.mobile" :border="false" placeholder="请输入手机号码" />
|
||||
</u-form-item>
|
||||
<u-form-item label="邮箱" borderBottom>
|
||||
<u-input class="flex-1" v-model="formData.email" :border="false" placeholder="请输入邮箱账号" />
|
||||
<u-input class="flex-1" v-model="formData.email" :disabled="true" :border="false"
|
||||
placeholder="请输入邮箱账号" />
|
||||
</u-form-item>
|
||||
<u-form-item label="验证码" borderBottom>
|
||||
<u-input class="flex-1" v-model="formData.code" placeholder="请输入验证码" :border="false" />
|
||||
@ -56,6 +57,15 @@ import { SMSEnum } from '@/enums/appEnums'
|
||||
import { useAppStore } from '@/stores/app'
|
||||
import { reactive, ref, shallowRef, computed } from 'vue'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import { useUserStore } from '@/stores/user'
|
||||
|
||||
const userStore = useUserStore()
|
||||
|
||||
|
||||
const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
|
||||
|
||||
console.log('userStore', userInfo);
|
||||
|
||||
|
||||
enum ForgotPwdSceneEnum {
|
||||
MOBILE = 2,
|
||||
@ -89,7 +99,7 @@ const uCodeRef = shallowRef()
|
||||
const codeTips = ref('')
|
||||
const formData = reactive({
|
||||
mobile: '',
|
||||
email: '',
|
||||
email: userInfo.email || '',
|
||||
code: '',
|
||||
scene: 3,
|
||||
password: '',
|
||||
@ -100,7 +110,7 @@ const isValidMobile = computed(() => uni.$u.test.mobile(formData.mobile))
|
||||
const isValidMailBox = computed(() => uni.$u.test.email(formData.email))
|
||||
const isMobile = computed(() => formData.scene == ForgotPwdSceneEnum.MOBILE)
|
||||
const isMailbox = computed(() => formData.scene == ForgotPwdSceneEnum.MAILBOX)
|
||||
console.log('isMailbox', isMailbox.value);
|
||||
|
||||
|
||||
const codeChange = (text: string) => {
|
||||
codeTips.value = text
|
||||
|
||||
@ -8,43 +8,22 @@
|
||||
<view class="flex-1 min-h-0">
|
||||
<scroll-view scroll-y class="h-full">
|
||||
<view class="py-[14rpx] px-[30rpx]">
|
||||
<u-search
|
||||
v-model="keyword"
|
||||
placeholder="请输入关键词搜索"
|
||||
height="72"
|
||||
bg-color="#fff"
|
||||
:show-action="false"
|
||||
@search="getData()"
|
||||
/>
|
||||
<u-search v-model="keyword" placeholder="请输入关键词搜索" height="72" bg-color="#fff" :show-action="false"
|
||||
@search="getData()" />
|
||||
</view>
|
||||
<view class="px-[30rpx]">
|
||||
<template v-for="category in data" :key="category.id">
|
||||
<view
|
||||
class="py-[25rpx]"
|
||||
v-if="!(category.modelsList.length == 0 && category.name == '我的收藏')"
|
||||
>
|
||||
<!-- <template v-for="category in data" :key="category.id">
|
||||
<view class="py-[25rpx]" v-if="!(category.modelsList.length == 0 && category.name == '我的收藏')">
|
||||
<text class="font-medium text-lg">{{ category.name }}</text>
|
||||
</view>
|
||||
<view class="flex flex-wrap mx-[-10rpx] rounded-[14rpx]">
|
||||
<view
|
||||
class="w-1/2 px-[10rpx] mb-[20rpx]"
|
||||
v-for="item in category.modelsList"
|
||||
:key="item.id"
|
||||
>
|
||||
<view class="w-1/2 px-[10rpx] mb-[20rpx]" v-for="item in category.modelsList"
|
||||
:key="item.id">
|
||||
<view class="rounded-[16rpx] py-[24rpx] h-full w-full">
|
||||
<router-navigate
|
||||
:to="`/packages/pages/create/create?id=${item.id}`"
|
||||
>
|
||||
<router-navigate :to="`/packages/pages/create/create?id=${item.id}`">
|
||||
<view class="flex w-full">
|
||||
<u-image
|
||||
:src="item.image"
|
||||
width="76"
|
||||
height="76"
|
||||
class="flex-none"
|
||||
/>
|
||||
<view
|
||||
class="ml-[14rpx] flex flex-col justify-around min-w-0"
|
||||
>
|
||||
<u-image :src="item.image" width="76" height="76" class="flex-none" />
|
||||
<view class="ml-[14rpx] flex flex-col justify-around min-w-0">
|
||||
<view class="font-medium text-[30rpx]">
|
||||
{{ item.name }}
|
||||
</view>
|
||||
@ -57,7 +36,31 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
</template> -->
|
||||
<u-collapse v-for="(models, index) in data" :key="index">
|
||||
<u-collapse-item :title="models.name" class="" :open="true" v-if="models.modelsList.length > 0">
|
||||
<view class="flex flex-wrap ">
|
||||
<view class="w-1/2 " v-for="item in models.modelsList" :key="item.id">
|
||||
<view class="rounded-[16rpx] py-[24rpx]">
|
||||
<router-navigate :to="`/packages/pages/create/create?id=${item.id}`">
|
||||
<view class="flex w-full" :style="{ 'color': '#333' }">
|
||||
<u-image :src="item.image" width="76" height="76" class="flex-none" />
|
||||
<view class="ml-[14rpx] flex flex-col justify-around min-w-0">
|
||||
<view class="font-medium text-[30rpx]">
|
||||
{{ item.name }}
|
||||
</view>
|
||||
<view class="text-[24rpx] text-[#666666] truncate">
|
||||
{{ item.tips }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</router-navigate>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
</u-collapse-item>
|
||||
</u-collapse>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
|
||||
@ -60,7 +60,7 @@ const initChart = () => {
|
||||
name: '部门使用次数',
|
||||
type: 'pie',
|
||||
radius: ['40%', '70%'],
|
||||
avoidLabelOverlap: false,
|
||||
// avoidLabelOverlap: false,
|
||||
top: '20%',
|
||||
itemStyle: {
|
||||
borderRadius: 10
|
||||
@ -70,10 +70,10 @@ const initChart = () => {
|
||||
position: 'center'
|
||||
},
|
||||
emphasis: {
|
||||
label: {
|
||||
show: true,
|
||||
fontSize: 40,
|
||||
fontWeight: 'bold'
|
||||
itemStyle: {
|
||||
shadowBlur: 10,
|
||||
shadowOffsetX: 0,
|
||||
shadowColor: 'rgba(0, 0, 0, 0.5)'
|
||||
}
|
||||
},
|
||||
labelLine: {
|
||||
|
||||
@ -49,7 +49,11 @@ import Tabs from '@/packages/components/tabs/tabs.vue'
|
||||
import Tab from '@/packages/components/tab/tab.vue'
|
||||
import uCalendar from '@/uni_modules/vk-uview-ui/components/u-calendar/u-calendar.vue'
|
||||
import uField from '@/uni_modules/vk-uview-ui/components/u-field/u-field.vue'
|
||||
import { useUserStore } from '@/stores/user'
|
||||
import { useRouter } from 'uniapp-router-next'
|
||||
|
||||
const userStore = useUserStore()
|
||||
const router = useRouter()
|
||||
|
||||
|
||||
// 获取昨天往前7天的日期范围
|
||||
@ -109,6 +113,11 @@ const getData = async () => {
|
||||
|
||||
status.value = PageStatusEnum.NORMAL
|
||||
} catch (error) {
|
||||
console.log('error', error);
|
||||
if (!userStore.isLogin) {
|
||||
uni.$u.toast('未登录')
|
||||
router.navigateTo({ path: '/pages/login/login' })
|
||||
}
|
||||
status.value = PageStatusEnum.ERROR
|
||||
}
|
||||
}
|
||||
|
||||
@ -40,5 +40,8 @@ export const useAppStore = defineStore({
|
||||
const data = await getConfig({ type: 1 });
|
||||
this.config = data;
|
||||
},
|
||||
setToken(token: string) {
|
||||
this.config.token = token;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
@ -28,16 +28,18 @@ export const useUserStore = defineStore({
|
||||
token: this.token,
|
||||
});
|
||||
this.userInfo = data;
|
||||
|
||||
localStorage.setItem("userInfo", JSON.stringify(data));
|
||||
},
|
||||
login(token: string) {
|
||||
cache.set(TOKEN_KEY, token);
|
||||
cache.set(TOKEN_KEY, token, "604800");
|
||||
this.token = token;
|
||||
useSharedId();
|
||||
},
|
||||
logout() {
|
||||
this.token = "";
|
||||
this.userInfo = {};
|
||||
cache.remove(TOKEN_KEY);
|
||||
// cache.remove(TOKEN_KEY);
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
@ -11,7 +11,7 @@ const isWechatWork = () => {
|
||||
export function getToken() {
|
||||
if (isWechatWork()) {
|
||||
const token = Cookies.get("token");
|
||||
const obj = { expire: "", value: token };
|
||||
const obj = { expire: "604800", value: token };
|
||||
localStorage.setItem("app_token", JSON.stringify(obj));
|
||||
return token || "";
|
||||
} else {
|
||||
|
||||
@ -1,50 +1,51 @@
|
||||
const cache = {
|
||||
key: 'app_',
|
||||
//设置缓存(expire为缓存时效)
|
||||
set(key: string, value: any, expire?: string) {
|
||||
key = this.getKey(key)
|
||||
let data: any = {
|
||||
expire: expire ? this.time() + expire : '',
|
||||
value
|
||||
}
|
||||
key: "app_",
|
||||
//设置缓存(expire为缓存时效)
|
||||
set(key: string, value: any, expire?: string) {
|
||||
key = this.getKey(key);
|
||||
let data: any = {
|
||||
expire: expire ? this.time() + expire : "",
|
||||
value,
|
||||
};
|
||||
|
||||
if (typeof data === 'object') {
|
||||
data = JSON.stringify(data)
|
||||
}
|
||||
try {
|
||||
uni.setStorageSync(key, data)
|
||||
} catch (e) {
|
||||
return undefined
|
||||
}
|
||||
},
|
||||
get(key: string) {
|
||||
key = this.getKey(key)
|
||||
try {
|
||||
const data = uni.getStorageSync(key)
|
||||
if (!data) {
|
||||
return undefined
|
||||
}
|
||||
const { value, expire } = JSON.parse(data)
|
||||
if (expire && expire < this.time()) {
|
||||
uni.removeStorageSync(key)
|
||||
return undefined
|
||||
}
|
||||
return value
|
||||
} catch (e) {
|
||||
return undefined
|
||||
}
|
||||
},
|
||||
//获取当前时间
|
||||
time() {
|
||||
return Math.round(new Date().getTime() / 1000)
|
||||
},
|
||||
remove(key: string) {
|
||||
key = this.getKey(key)
|
||||
uni.removeStorageSync(key)
|
||||
},
|
||||
getKey(key: string) {
|
||||
return this.key + key
|
||||
if (typeof data === "object") {
|
||||
data = JSON.stringify(data);
|
||||
}
|
||||
}
|
||||
try {
|
||||
uni.setStorageSync(key, data);
|
||||
} catch (e) {
|
||||
return undefined;
|
||||
}
|
||||
},
|
||||
get(key: string) {
|
||||
key = this.getKey(key);
|
||||
try {
|
||||
const data = uni.getStorageSync(key);
|
||||
|
||||
export default cache
|
||||
if (!data) {
|
||||
return undefined;
|
||||
}
|
||||
const { value, expire } = JSON.parse(data);
|
||||
if (expire && expire < this.time()) {
|
||||
uni.removeStorageSync(key);
|
||||
return undefined;
|
||||
}
|
||||
return value;
|
||||
} catch (e) {
|
||||
return undefined;
|
||||
}
|
||||
},
|
||||
//获取当前时间
|
||||
time() {
|
||||
return Math.round(new Date().getTime() / 1000);
|
||||
},
|
||||
remove(key: string) {
|
||||
key = this.getKey(key);
|
||||
uni.removeStorageSync(key);
|
||||
},
|
||||
getKey(key: string) {
|
||||
return this.key + key;
|
||||
},
|
||||
};
|
||||
|
||||
export default cache;
|
||||
|
||||
@ -1,348 +1,406 @@
|
||||
import { merge } from 'lodash-es'
|
||||
import { isFunction } from '@vue/shared'
|
||||
import { merge } from "lodash-es";
|
||||
import { isFunction } from "@vue/shared";
|
||||
import {
|
||||
HttpRequestOptions,
|
||||
RequestConfig,
|
||||
RequestEventStreamConfig,
|
||||
RequestOptions,
|
||||
UploadFileOption
|
||||
} from './type'
|
||||
import { RequestErrMsgEnum, RequestMethodsEnum } from '@/enums/requestEnums'
|
||||
import requestCancel from './cancel'
|
||||
import { objectToQuery } from '../util'
|
||||
import { isObject } from 'mathjs'
|
||||
import {Base64} from 'js-base64'
|
||||
import { parse } from 'jsonc-parser'
|
||||
HttpRequestOptions,
|
||||
RequestConfig,
|
||||
RequestEventStreamConfig,
|
||||
RequestOptions,
|
||||
UploadFileOption,
|
||||
} from "./type";
|
||||
import { RequestErrMsgEnum, RequestMethodsEnum } from "@/enums/requestEnums";
|
||||
import requestCancel from "./cancel";
|
||||
import { objectToQuery } from "../util";
|
||||
import { isObject } from "mathjs";
|
||||
import { Base64 } from "js-base64";
|
||||
import { parse } from "jsonc-parser";
|
||||
|
||||
/**
|
||||
* @description 将流转换为utf-8
|
||||
*/
|
||||
function decodeUTF8(arr: Uint8Array) {
|
||||
let str = ''
|
||||
for (let i = 0; i < arr.length; i++) {
|
||||
str += String.fromCharCode(arr[i])
|
||||
}
|
||||
return decodeURIComponent(escape(str))
|
||||
let str = "";
|
||||
for (let i = 0; i < arr.length; i++) {
|
||||
str += String.fromCharCode(arr[i]);
|
||||
}
|
||||
return decodeURIComponent(escape(str));
|
||||
}
|
||||
|
||||
function isStreamResponse(header?: any) {
|
||||
const contentType = header?.['Content-Type'] || header?.['content-type'] || header.get('content-type')!
|
||||
if (typeof contentType !== 'string') return false
|
||||
return contentType.includes('text/event-stream')
|
||||
const contentType =
|
||||
header?.["Content-Type"] ||
|
||||
header?.["content-type"] ||
|
||||
header.get("content-type")!;
|
||||
if (typeof contentType !== "string") return false;
|
||||
return contentType.includes("text/event-stream");
|
||||
}
|
||||
|
||||
export default class HttpRequest {
|
||||
private readonly options: HttpRequestOptions
|
||||
constructor(options: HttpRequestOptions) {
|
||||
this.options = options
|
||||
private readonly options: HttpRequestOptions;
|
||||
constructor(options: HttpRequestOptions) {
|
||||
this.options = options;
|
||||
}
|
||||
/**
|
||||
* @description 重新请求
|
||||
*/
|
||||
retryRequest(options: RequestOptions, config: RequestConfig) {
|
||||
const { retryCount, retryTimeout } = config;
|
||||
if (
|
||||
!retryCount ||
|
||||
options.method?.toUpperCase() == RequestMethodsEnum.POST
|
||||
) {
|
||||
return Promise.reject();
|
||||
}
|
||||
/**
|
||||
* @description 重新请求
|
||||
*/
|
||||
retryRequest(options: RequestOptions, config: RequestConfig) {
|
||||
const { retryCount, retryTimeout } = config
|
||||
if (!retryCount || options.method?.toUpperCase() == RequestMethodsEnum.POST) {
|
||||
return Promise.reject()
|
||||
}
|
||||
uni.showLoading({ title: '加载中...' })
|
||||
config.hasRetryCount = config.hasRetryCount || 0
|
||||
if (config.hasRetryCount >= retryCount) {
|
||||
return Promise.reject()
|
||||
}
|
||||
config.hasRetryCount++
|
||||
config.requestHooks.requestInterceptorsHook = (options) => options
|
||||
return new Promise((resolve) => setTimeout(resolve, retryTimeout))
|
||||
.then(() => this.request(options, config))
|
||||
.finally(() => uni.hideLoading())
|
||||
uni.showLoading({ title: "加载中..." });
|
||||
config.hasRetryCount = config.hasRetryCount || 0;
|
||||
if (config.hasRetryCount >= retryCount) {
|
||||
return Promise.reject();
|
||||
}
|
||||
/**
|
||||
* @description get请求
|
||||
*/
|
||||
get<T = any>(options: RequestOptions, config?: Partial<RequestConfig>): Promise<T> {
|
||||
return this.request({ ...options, method: RequestMethodsEnum.GET }, config)
|
||||
config.hasRetryCount++;
|
||||
config.requestHooks.requestInterceptorsHook = (options) => options;
|
||||
return new Promise((resolve) => setTimeout(resolve, retryTimeout))
|
||||
.then(() => this.request(options, config))
|
||||
.finally(() => uni.hideLoading());
|
||||
}
|
||||
/**
|
||||
* @description get请求
|
||||
*/
|
||||
get<T = any>(
|
||||
options: RequestOptions,
|
||||
config?: Partial<RequestConfig>
|
||||
): Promise<T> {
|
||||
return this.request({ ...options, method: RequestMethodsEnum.GET }, config);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description post请求
|
||||
*/
|
||||
post<T = any>(
|
||||
options: RequestOptions,
|
||||
config?: Partial<RequestConfig>
|
||||
): Promise<T> {
|
||||
return this.request(
|
||||
{ ...options, method: RequestMethodsEnum.POST },
|
||||
config
|
||||
);
|
||||
}
|
||||
/**
|
||||
* @description 事件流
|
||||
*/
|
||||
eventStream(options: RequestOptions, config?: RequestEventStreamConfig) {
|
||||
let mergeOptions: RequestOptions = merge(
|
||||
{},
|
||||
this.options.requestOptions,
|
||||
options
|
||||
);
|
||||
const mergeConfig: RequestEventStreamConfig = merge(
|
||||
{},
|
||||
this.options,
|
||||
config
|
||||
);
|
||||
const { requestInterceptorsHook, responseInterceptorsHook } =
|
||||
mergeConfig.requestHooks || {};
|
||||
if (requestInterceptorsHook && isFunction(requestInterceptorsHook)) {
|
||||
mergeOptions = requestInterceptorsHook(
|
||||
mergeOptions,
|
||||
mergeConfig as RequestConfig
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description post请求
|
||||
*/
|
||||
post<T = any>(options: RequestOptions, config?: Partial<RequestConfig>): Promise<T> {
|
||||
return this.request({ ...options, method: RequestMethodsEnum.POST }, config)
|
||||
}
|
||||
/**
|
||||
* @description 事件流
|
||||
*/
|
||||
eventStream(options: RequestOptions, config?: RequestEventStreamConfig) {
|
||||
let mergeOptions: RequestOptions = merge({}, this.options.requestOptions, options)
|
||||
const mergeConfig: RequestEventStreamConfig = merge({}, this.options, config)
|
||||
const { requestInterceptorsHook, responseInterceptorsHook } = mergeConfig.requestHooks || {}
|
||||
if (requestInterceptorsHook && isFunction(requestInterceptorsHook)) {
|
||||
mergeOptions = requestInterceptorsHook(mergeOptions, mergeConfig as RequestConfig)
|
||||
}
|
||||
|
||||
const { onmessage, onclose, onstart } = mergeConfig
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
// #ifdef H5
|
||||
const decoder = new TextDecoder()
|
||||
const abortController = new AbortController()
|
||||
const push = async (controller: any, reader: any) => {
|
||||
try {
|
||||
const { value, done } = await reader.read()
|
||||
if (done) {
|
||||
controller.close()
|
||||
onclose?.()
|
||||
} else {
|
||||
const tempval = Base64.decode(decoder.decode(value))
|
||||
onmessage?.(tempval)
|
||||
controller.enqueue(tempval)
|
||||
push(controller, reader)
|
||||
}
|
||||
} catch (error) {
|
||||
onclose?.()
|
||||
}
|
||||
}
|
||||
|
||||
if (mergeOptions.method!.toUpperCase() == RequestMethodsEnum.GET) {
|
||||
if (isObject(mergeOptions.data)) {
|
||||
mergeOptions.data = objectToQuery(mergeOptions.data as Record<string, any>)
|
||||
}
|
||||
mergeOptions.url = `${mergeOptions.url}?${mergeOptions.data}`
|
||||
}
|
||||
let body = undefined
|
||||
if (mergeOptions.method!.toUpperCase() == RequestMethodsEnum.POST) {
|
||||
body = isObject(mergeOptions.data)
|
||||
? JSON.stringify(mergeOptions.data)
|
||||
: (mergeOptions.data as string)
|
||||
}
|
||||
fetch(mergeOptions.url, {
|
||||
...mergeOptions,
|
||||
signal: abortController.signal,
|
||||
body,
|
||||
headers: {
|
||||
'content-type': 'application/json; charset=utf-8',
|
||||
...mergeOptions.header,
|
||||
Accept: 'text/event-stream'
|
||||
}
|
||||
})
|
||||
.then(async (response) => {
|
||||
if (response.status == 200) {
|
||||
if (isStreamResponse(response.headers)) {
|
||||
const reader = response.body!.getReader()
|
||||
onstart?.(abortController)
|
||||
new ReadableStream({
|
||||
start(controller) {
|
||||
push(controller, reader)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
//@ts-ignore
|
||||
response.data = await response.json()
|
||||
return response
|
||||
}
|
||||
} else {
|
||||
reject(response.statusText)
|
||||
}
|
||||
})
|
||||
.then(async (response: any) => {
|
||||
if (!response) {
|
||||
resolve(response)
|
||||
return
|
||||
}
|
||||
if (responseInterceptorsHook && isFunction(responseInterceptorsHook)) {
|
||||
try {
|
||||
response = await responseInterceptorsHook(
|
||||
response,
|
||||
mergeConfig as RequestConfig,
|
||||
mergeOptions
|
||||
)
|
||||
resolve(response)
|
||||
} catch (error) {
|
||||
reject(error)
|
||||
}
|
||||
return
|
||||
}
|
||||
resolve(response)
|
||||
})
|
||||
.catch((error) => {
|
||||
reject(error)
|
||||
})
|
||||
// #endif
|
||||
|
||||
// #ifdef MP-WEIXIN
|
||||
let header: Record<string, any> = {}
|
||||
const requestTask = uni.request({
|
||||
...mergeOptions,
|
||||
enableChunked: true,
|
||||
responseType: 'arraybuffer',
|
||||
async success(response) {
|
||||
if (response.statusCode !== 200) {
|
||||
reject(response)
|
||||
return
|
||||
}
|
||||
resolve(response)
|
||||
},
|
||||
fail(error) {
|
||||
reject(error)
|
||||
},
|
||||
complete() {
|
||||
onclose?.()
|
||||
}
|
||||
})
|
||||
onstart?.(requestTask)
|
||||
//@ts-ignore
|
||||
requestTask.onHeadersReceived((response) => {
|
||||
header = response.header
|
||||
})
|
||||
//@ts-ignore
|
||||
requestTask.onChunkReceived(async (response) => {
|
||||
const arrayBuffer = response.data
|
||||
const uint8Array = new Uint8Array(arrayBuffer)
|
||||
const base64str = decodeUTF8(uint8Array)
|
||||
const str = Base64.decode(base64str);
|
||||
if (isStreamResponse(header)) {
|
||||
console.log(str)
|
||||
onmessage?.(str)
|
||||
} else {
|
||||
const data = parse(str)
|
||||
if (responseInterceptorsHook && isFunction(responseInterceptorsHook)) {
|
||||
try {
|
||||
const response = await responseInterceptorsHook(
|
||||
{ data, statusCode: 200 },
|
||||
mergeConfig as RequestConfig,
|
||||
mergeOptions
|
||||
)
|
||||
resolve(response)
|
||||
} catch (error) {
|
||||
reject(error)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
})
|
||||
// #endif
|
||||
} catch (e) {
|
||||
reject()
|
||||
const { onmessage, onclose, onstart } = mergeConfig;
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
// #ifdef H5
|
||||
const decoder = new TextDecoder();
|
||||
const abortController = new AbortController();
|
||||
const push = async (controller: any, reader: any) => {
|
||||
try {
|
||||
const { value, done } = await reader.read();
|
||||
if (done) {
|
||||
controller.close();
|
||||
onclose?.();
|
||||
} else {
|
||||
const tempval = Base64.decode(decoder.decode(value));
|
||||
onmessage?.(tempval);
|
||||
controller.enqueue(tempval);
|
||||
push(controller, reader);
|
||||
}
|
||||
})
|
||||
}
|
||||
/**
|
||||
* @description 上传图片
|
||||
*/
|
||||
uploadFile(options: UploadFileOption, config?: Partial<RequestConfig>) {
|
||||
let mergeOptions: RequestOptions = merge({}, this.options.requestOptions, options)
|
||||
const mergeConfig: RequestConfig = merge({}, this.options, config)
|
||||
const { requestInterceptorsHook, responseInterceptorsHook, responseInterceptorsCatchHook } =
|
||||
mergeConfig.requestHooks || {}
|
||||
if (requestInterceptorsHook && isFunction(requestInterceptorsHook)) {
|
||||
mergeOptions = requestInterceptorsHook(mergeOptions, mergeConfig)
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
const task = uni.uploadFile({
|
||||
...mergeOptions,
|
||||
header: {
|
||||
...mergeOptions.header
|
||||
},
|
||||
async success(response) {
|
||||
if (response.statusCode == 200) {
|
||||
response.data = parse(response.data)
|
||||
if (responseInterceptorsHook && isFunction(responseInterceptorsHook)) {
|
||||
try {
|
||||
response = await responseInterceptorsHook(
|
||||
response,
|
||||
mergeConfig,
|
||||
mergeOptions
|
||||
)
|
||||
resolve(response)
|
||||
} catch (error) {
|
||||
reject(error)
|
||||
}
|
||||
return
|
||||
}
|
||||
} catch (error) {
|
||||
onclose?.();
|
||||
}
|
||||
};
|
||||
|
||||
resolve(response)
|
||||
} else {
|
||||
reject(response.errMsg)
|
||||
}
|
||||
},
|
||||
fail(err) {
|
||||
if (err.errMsg == RequestErrMsgEnum.ABORT) {
|
||||
return
|
||||
}
|
||||
if (
|
||||
responseInterceptorsCatchHook &&
|
||||
isFunction(responseInterceptorsCatchHook)
|
||||
) {
|
||||
reject(responseInterceptorsCatchHook(mergeOptions, err))
|
||||
return
|
||||
}
|
||||
reject(err)
|
||||
}
|
||||
})
|
||||
task.onProgressUpdate(({ progress }) => {
|
||||
mergeConfig.onProgress?.(progress)
|
||||
})
|
||||
})
|
||||
}
|
||||
/**
|
||||
* @description 请求函数
|
||||
*/
|
||||
async request(options: RequestOptions, config?: Partial<RequestConfig>): Promise<any> {
|
||||
let mergeOptions: RequestOptions = merge({}, this.options.requestOptions, options)
|
||||
const mergeConfig: RequestConfig = merge({}, this.options, config)
|
||||
const { requestInterceptorsHook, responseInterceptorsHook, responseInterceptorsCatchHook } =
|
||||
mergeConfig.requestHooks || {}
|
||||
if (requestInterceptorsHook && isFunction(requestInterceptorsHook)) {
|
||||
mergeOptions = requestInterceptorsHook(mergeOptions, mergeConfig)
|
||||
if (mergeOptions.method!.toUpperCase() == RequestMethodsEnum.GET) {
|
||||
if (isObject(mergeOptions.data)) {
|
||||
mergeOptions.data = objectToQuery(
|
||||
mergeOptions.data as Record<string, any>
|
||||
);
|
||||
}
|
||||
mergeOptions.url = `${mergeOptions.url}?${mergeOptions.data}`;
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
const requestTask = uni.request({
|
||||
...mergeOptions,
|
||||
async success(response) {
|
||||
if (response.statusCode !== 200) {
|
||||
return reject()
|
||||
}
|
||||
if (responseInterceptorsHook && isFunction(responseInterceptorsHook)) {
|
||||
try {
|
||||
response = await responseInterceptorsHook(
|
||||
response,
|
||||
mergeConfig,
|
||||
mergeOptions
|
||||
)
|
||||
resolve(response)
|
||||
} catch (error) {
|
||||
reject(error)
|
||||
}
|
||||
return
|
||||
}
|
||||
resolve(response)
|
||||
},
|
||||
fail: async (err) => {
|
||||
if (err.errMsg == RequestErrMsgEnum.TIMEOUT) {
|
||||
this.retryRequest(mergeOptions, mergeConfig)
|
||||
.then((res) => resolve(res))
|
||||
.catch((err) => reject(err))
|
||||
return
|
||||
}
|
||||
if (err.errMsg == RequestErrMsgEnum.ABORT) {
|
||||
return
|
||||
}
|
||||
if (
|
||||
responseInterceptorsCatchHook &&
|
||||
isFunction(responseInterceptorsCatchHook)
|
||||
) {
|
||||
reject(await responseInterceptorsCatchHook(mergeOptions, err))
|
||||
return
|
||||
}
|
||||
reject(err)
|
||||
},
|
||||
complete(err) {
|
||||
if (err.errMsg !== RequestErrMsgEnum.ABORT) {
|
||||
requestCancel.remove(options.url)
|
||||
}
|
||||
}
|
||||
})
|
||||
const { ignoreCancel } = mergeConfig
|
||||
!ignoreCancel && requestCancel.add(options.url, requestTask)
|
||||
let body = undefined;
|
||||
if (mergeOptions.method!.toUpperCase() == RequestMethodsEnum.POST) {
|
||||
body = isObject(mergeOptions.data)
|
||||
? JSON.stringify(mergeOptions.data)
|
||||
: (mergeOptions.data as string);
|
||||
}
|
||||
fetch(mergeOptions.url, {
|
||||
...mergeOptions,
|
||||
signal: abortController.signal,
|
||||
body,
|
||||
headers: {
|
||||
"content-type": "application/json; charset=utf-8",
|
||||
...mergeOptions.header,
|
||||
Accept: "text/event-stream",
|
||||
},
|
||||
})
|
||||
.then(async (response) => {
|
||||
if (response.status == 200) {
|
||||
if (isStreamResponse(response.headers)) {
|
||||
const reader = response.body!.getReader();
|
||||
onstart?.(abortController);
|
||||
new ReadableStream({
|
||||
start(controller) {
|
||||
push(controller, reader);
|
||||
},
|
||||
});
|
||||
} else {
|
||||
//@ts-ignore
|
||||
response.data = await response.json();
|
||||
return response;
|
||||
}
|
||||
} else {
|
||||
reject(response.statusText);
|
||||
}
|
||||
})
|
||||
.then(async (response: any) => {
|
||||
if (!response) {
|
||||
resolve(response);
|
||||
return;
|
||||
}
|
||||
if (
|
||||
responseInterceptorsHook &&
|
||||
isFunction(responseInterceptorsHook)
|
||||
) {
|
||||
try {
|
||||
response = await responseInterceptorsHook(
|
||||
response,
|
||||
mergeConfig as RequestConfig,
|
||||
mergeOptions
|
||||
);
|
||||
resolve(response);
|
||||
} catch (error) {
|
||||
reject(error);
|
||||
}
|
||||
return;
|
||||
}
|
||||
resolve(response);
|
||||
})
|
||||
.catch((error) => {
|
||||
reject(error);
|
||||
});
|
||||
// #endif
|
||||
|
||||
// #ifdef MP-WEIXIN
|
||||
let header: Record<string, any> = {};
|
||||
const requestTask = uni.request({
|
||||
...mergeOptions,
|
||||
enableChunked: true,
|
||||
responseType: "arraybuffer",
|
||||
async success(response) {
|
||||
if (response.statusCode !== 200) {
|
||||
reject(response);
|
||||
return;
|
||||
}
|
||||
resolve(response);
|
||||
},
|
||||
fail(error) {
|
||||
reject(error);
|
||||
},
|
||||
complete() {
|
||||
onclose?.();
|
||||
},
|
||||
});
|
||||
onstart?.(requestTask);
|
||||
//@ts-ignore
|
||||
requestTask.onHeadersReceived((response) => {
|
||||
header = response.header;
|
||||
});
|
||||
//@ts-ignore
|
||||
requestTask.onChunkReceived(async (response) => {
|
||||
const arrayBuffer = response.data;
|
||||
const uint8Array = new Uint8Array(arrayBuffer);
|
||||
const base64str = decodeUTF8(uint8Array);
|
||||
const str = Base64.decode(base64str);
|
||||
if (isStreamResponse(header)) {
|
||||
console.log(str);
|
||||
onmessage?.(str);
|
||||
} else {
|
||||
const data = parse(str);
|
||||
if (
|
||||
responseInterceptorsHook &&
|
||||
isFunction(responseInterceptorsHook)
|
||||
) {
|
||||
try {
|
||||
const response = await responseInterceptorsHook(
|
||||
{ data, statusCode: 200 },
|
||||
mergeConfig as RequestConfig,
|
||||
mergeOptions
|
||||
);
|
||||
resolve(response);
|
||||
} catch (error) {
|
||||
reject(error);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
// #endif
|
||||
} catch (e) {
|
||||
reject();
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* @description 上传图片
|
||||
*/
|
||||
uploadFile(options: UploadFileOption, config?: Partial<RequestConfig>) {
|
||||
let mergeOptions: RequestOptions = merge(
|
||||
{},
|
||||
this.options.requestOptions,
|
||||
options
|
||||
);
|
||||
const mergeConfig: RequestConfig = merge({}, this.options, config);
|
||||
const {
|
||||
requestInterceptorsHook,
|
||||
responseInterceptorsHook,
|
||||
responseInterceptorsCatchHook,
|
||||
} = mergeConfig.requestHooks || {};
|
||||
if (requestInterceptorsHook && isFunction(requestInterceptorsHook)) {
|
||||
mergeOptions = requestInterceptorsHook(mergeOptions, mergeConfig);
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
const task = uni.uploadFile({
|
||||
...mergeOptions,
|
||||
header: {
|
||||
...mergeOptions.header,
|
||||
},
|
||||
async success(response) {
|
||||
if (response.statusCode == 200) {
|
||||
response.data = parse(response.data);
|
||||
if (
|
||||
responseInterceptorsHook &&
|
||||
isFunction(responseInterceptorsHook)
|
||||
) {
|
||||
try {
|
||||
response = await responseInterceptorsHook(
|
||||
response,
|
||||
mergeConfig,
|
||||
mergeOptions
|
||||
);
|
||||
resolve(response);
|
||||
} catch (error) {
|
||||
reject(error);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
resolve(response);
|
||||
} else {
|
||||
reject(response.errMsg);
|
||||
}
|
||||
},
|
||||
fail(err) {
|
||||
if (err.errMsg == RequestErrMsgEnum.ABORT) {
|
||||
return;
|
||||
}
|
||||
if (
|
||||
responseInterceptorsCatchHook &&
|
||||
isFunction(responseInterceptorsCatchHook)
|
||||
) {
|
||||
reject(responseInterceptorsCatchHook(mergeOptions, err));
|
||||
return;
|
||||
}
|
||||
reject(err);
|
||||
},
|
||||
});
|
||||
task.onProgressUpdate(({ progress }) => {
|
||||
mergeConfig.onProgress?.(progress);
|
||||
});
|
||||
});
|
||||
}
|
||||
/**
|
||||
* @description 请求函数
|
||||
*/
|
||||
async request(
|
||||
options: RequestOptions,
|
||||
config?: Partial<RequestConfig>
|
||||
): Promise<any> {
|
||||
let mergeOptions: RequestOptions = merge(
|
||||
{},
|
||||
this.options.requestOptions,
|
||||
options
|
||||
);
|
||||
const mergeConfig: RequestConfig = merge({}, this.options, config);
|
||||
const {
|
||||
requestInterceptorsHook,
|
||||
responseInterceptorsHook,
|
||||
responseInterceptorsCatchHook,
|
||||
} = mergeConfig.requestHooks || {};
|
||||
if (requestInterceptorsHook && isFunction(requestInterceptorsHook)) {
|
||||
mergeOptions = requestInterceptorsHook(mergeOptions, mergeConfig);
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
const requestTask = uni.request({
|
||||
...mergeOptions,
|
||||
async success(response) {
|
||||
if (response.statusCode !== 200) {
|
||||
return reject();
|
||||
}
|
||||
if (
|
||||
responseInterceptorsHook &&
|
||||
isFunction(responseInterceptorsHook)
|
||||
) {
|
||||
try {
|
||||
response = await responseInterceptorsHook(
|
||||
response,
|
||||
mergeConfig,
|
||||
mergeOptions
|
||||
);
|
||||
resolve(response);
|
||||
} catch (error) {
|
||||
reject(error);
|
||||
}
|
||||
return;
|
||||
}
|
||||
resolve(response);
|
||||
},
|
||||
fail: async (err) => {
|
||||
if (err.errMsg == RequestErrMsgEnum.TIMEOUT) {
|
||||
this.retryRequest(mergeOptions, mergeConfig)
|
||||
.then((res) => resolve(res))
|
||||
.catch((err) => reject(err));
|
||||
return;
|
||||
}
|
||||
if (err.errMsg == RequestErrMsgEnum.ABORT) {
|
||||
return;
|
||||
}
|
||||
if (
|
||||
responseInterceptorsCatchHook &&
|
||||
isFunction(responseInterceptorsCatchHook)
|
||||
) {
|
||||
reject(await responseInterceptorsCatchHook(mergeOptions, err));
|
||||
return;
|
||||
}
|
||||
reject(err);
|
||||
},
|
||||
complete(err) {
|
||||
if (err.errMsg !== RequestErrMsgEnum.ABORT) {
|
||||
requestCancel.remove(options.url);
|
||||
}
|
||||
},
|
||||
});
|
||||
const { ignoreCancel } = mergeConfig;
|
||||
!ignoreCancel && requestCancel.add(options.url, requestTask);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -31,6 +31,8 @@ export default defineConfig(({ mode }) => {
|
||||
|
||||
return {
|
||||
// base: "https://cdn.xglpa.com/ai-agent-m/",
|
||||
base: mode === "production" ? "https://cdn.xglpa.com/ai-agent-m/" : "./",
|
||||
|
||||
plugins: [
|
||||
uni(),
|
||||
uniRouter({
|
||||
|
||||
Loading…
Reference in New Issue
Block a user