@minilo/utils 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/config.d.ts +3 -3
- package/dist/config/guider.d.ts +51 -67
- package/dist/config/index.d.ts +6 -6
- package/dist/config/storageManager.d.ts +41 -41
- package/dist/config/types.d.ts +18 -18
- package/dist/config/updateCssVariables.d.ts +11 -14
- package/dist/constrant/index.d.ts +5 -5
- package/dist/func/color.d.ts +5 -5
- package/dist/func/common.d.ts +8 -15
- package/dist/func/index.d.ts +4 -4
- package/dist/func/merge.d.ts +2 -2
- package/dist/hooks/helper.d.ts +6 -0
- package/dist/hooks/helper.d.ts.map +1 -0
- package/dist/hooks/helper.js +45 -0
- package/dist/hooks/helper.js.map +1 -0
- package/dist/hooks/index.d.ts +4 -5
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +4 -5
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useChartResize.d.ts +20 -0
- package/dist/hooks/useChartResize.d.ts.map +1 -0
- package/dist/hooks/useChartResize.js +67 -0
- package/dist/hooks/useChartResize.js.map +1 -0
- package/dist/hooks/useCountDown.d.ts +9 -0
- package/dist/hooks/useCountDown.d.ts.map +1 -0
- package/dist/hooks/useCountDown.js +42 -0
- package/dist/hooks/useCountDown.js.map +1 -0
- package/dist/hooks/useFormAutoSave.d.ts +2 -0
- package/dist/hooks/useFormAutoSave.d.ts.map +1 -0
- package/dist/hooks/useFormAutoSave.js +73 -0
- package/dist/hooks/useFormAutoSave.js.map +1 -0
- package/dist/hooks/useRouteCache.d.ts +2 -0
- package/dist/hooks/useRouteCache.d.ts.map +1 -0
- package/dist/hooks/useRouteCache.js +92 -0
- package/dist/hooks/useRouteCache.js.map +1 -0
- package/dist/hooks/useScroll.d.ts +15 -0
- package/dist/hooks/useScroll.d.ts.map +1 -0
- package/dist/hooks/useScroll.js +71 -0
- package/dist/hooks/useScroll.js.map +1 -0
- package/dist/hooks/useUpload.d.ts +17 -0
- package/dist/hooks/useUpload.d.ts.map +1 -0
- package/dist/hooks/useUpload.js +87 -0
- package/dist/hooks/useUpload.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/request/index.d.ts +34 -16
- package/dist/request/index.d.ts.map +1 -1
- package/dist/request/index.js +15 -8
- package/dist/request/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -2
- package/dist/hooks/useButtonPermission.d.ts +0 -9
- package/dist/hooks/useButtonPermission.d.ts.map +0 -1
- package/dist/hooks/useButtonPermission.js +0 -38
- package/dist/hooks/useButtonPermission.js.map +0 -1
- package/dist/hooks/useGuider.d.ts +0 -2
- package/dist/hooks/useGuider.d.ts.map +0 -1
- package/dist/hooks/useGuider.js +0 -5
- package/dist/hooks/useGuider.js.map +0 -1
- package/dist/hooks/useInitGlobalStyle.d.ts +0 -2
- package/dist/hooks/useInitGlobalStyle.d.ts.map +0 -1
- package/dist/hooks/useInitGlobalStyle.js +0 -80
- package/dist/hooks/useInitGlobalStyle.js.map +0 -1
- package/dist/hooks/useLogout.d.ts +0 -8
- package/dist/hooks/useLogout.d.ts.map +0 -1
- package/dist/hooks/useLogout.js +0 -55
- package/dist/hooks/useLogout.js.map +0 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { computed, onUnmounted, ref } from 'vue';
|
|
2
|
+
export default function useCountdown(seconds) {
|
|
3
|
+
// 剩余秒数
|
|
4
|
+
const remaining = ref(seconds);
|
|
5
|
+
// 倒计时状态
|
|
6
|
+
const isRunning = ref(false);
|
|
7
|
+
let timer = null;
|
|
8
|
+
const formattedTime = computed(() => {
|
|
9
|
+
const sec = remaining.value % 60;
|
|
10
|
+
const min = Math.floor(remaining.value / 60);
|
|
11
|
+
// 小于1分钟显示秒数,否则显示分:秒
|
|
12
|
+
return min > 0
|
|
13
|
+
? `${min.toString().padStart(2, '0')}:${sec.toString().padStart(2, '0')}`
|
|
14
|
+
: `${sec}s`;
|
|
15
|
+
});
|
|
16
|
+
// 启动倒计时
|
|
17
|
+
const start = () => {
|
|
18
|
+
if (isRunning.value || remaining.value <= 0)
|
|
19
|
+
return;
|
|
20
|
+
isRunning.value = true;
|
|
21
|
+
timer = setInterval(() => {
|
|
22
|
+
remaining.value--;
|
|
23
|
+
if (remaining.value <= 0) {
|
|
24
|
+
stop();
|
|
25
|
+
}
|
|
26
|
+
}, 1000);
|
|
27
|
+
};
|
|
28
|
+
// 暂停倒计时
|
|
29
|
+
const stop = () => {
|
|
30
|
+
clearInterval(timer);
|
|
31
|
+
timer = null;
|
|
32
|
+
isRunning.value = false;
|
|
33
|
+
};
|
|
34
|
+
// 重置倒计时
|
|
35
|
+
const reset = (newSeconds = seconds) => {
|
|
36
|
+
stop();
|
|
37
|
+
remaining.value = newSeconds;
|
|
38
|
+
};
|
|
39
|
+
onUnmounted(() => stop());
|
|
40
|
+
return { remaining, isRunning, formattedTime, start, stop, reset };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=useCountDown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCountDown.js","sourceRoot":"","sources":["../../hooks/useCountDown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAEhD,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,OAAe;IAClD,OAAO;IACP,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,CAAA;IAC9B,QAAQ;IACR,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAA;IAC5B,IAAI,KAAK,GAA0B,IAAI,CAAA;IAEvC,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,EAAE;QAClC,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,GAAG,EAAE,CAAA;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,GAAG,EAAE,CAAC,CAAA;QAC5C,oBAAoB;QACpB,OAAO,GAAG,GAAG,CAAC;YACZ,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;YACzE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,QAAQ;IACR,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,IAAI,CAAC;YAAE,OAAM;QACnD,SAAS,CAAC,KAAK,GAAG,IAAI,CAAA;QACtB,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YACvB,SAAS,CAAC,KAAK,EAAE,CAAA;YACjB,IAAI,SAAS,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;gBACzB,IAAI,EAAE,CAAA;YACR,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,CAAA;IACV,CAAC,CAAA;IAED,QAAQ;IACR,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,aAAa,CAAC,KAAuB,CAAC,CAAA;QACtC,KAAK,GAAG,IAAI,CAAA;QACZ,SAAS,CAAC,KAAK,GAAG,KAAK,CAAA;IACzB,CAAC,CAAA;IAED,QAAQ;IACR,MAAM,KAAK,GAAG,CAAC,UAAU,GAAG,OAAO,EAAE,EAAE;QACrC,IAAI,EAAE,CAAA;QACN,SAAS,CAAC,KAAK,GAAG,UAAU,CAAA;IAC9B,CAAC,CAAA;IAED,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;IAEzB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFormAutoSave.d.ts","sourceRoot":"","sources":["../../hooks/useFormAutoSave.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { onUnmounted, ref, watch } from 'vue';
|
|
2
|
+
/**
|
|
3
|
+
* 表单草稿自动保存 Hooks
|
|
4
|
+
* @param {string} key - 存储键名
|
|
5
|
+
* @param {Object} formData - 表单响应式数据
|
|
6
|
+
* @param {number} interval - 自动保存间隔(秒,默认30秒)
|
|
7
|
+
* @param {number} expire - 草稿过期时间(秒,默认7天)
|
|
8
|
+
* @returns {Object} 保存状态和手动操作方法
|
|
9
|
+
*/
|
|
10
|
+
const useFormAutoSave = (key, formData, interval = 30, expire = 60 * 60 * 24 * 7) => {
|
|
11
|
+
// 复用带过期的本地存储
|
|
12
|
+
const { value: draftData, setValue: saveToStorage } = useLocalStorageWithExpire(key, {}, expire);
|
|
13
|
+
// 自动保存定时器
|
|
14
|
+
let autoSaveTimer = null;
|
|
15
|
+
// 是否有未保存的修改
|
|
16
|
+
const hasChange = ref(false);
|
|
17
|
+
// 最后保存时间
|
|
18
|
+
const lastSaveTime = ref(null);
|
|
19
|
+
// 对比表单数据和草稿数据,判断是否修改
|
|
20
|
+
const checkChange = () => {
|
|
21
|
+
hasChange.value = JSON.stringify(formData) !== JSON.stringify(draftData);
|
|
22
|
+
};
|
|
23
|
+
// 手动保存草稿
|
|
24
|
+
const saveDraft = () => {
|
|
25
|
+
saveToStorage({ ...formData });
|
|
26
|
+
lastSaveTime.value = new Date().toLocaleString();
|
|
27
|
+
hasChange.value = false;
|
|
28
|
+
};
|
|
29
|
+
// 恢复草稿到表单
|
|
30
|
+
const restoreDraft = () => {
|
|
31
|
+
Object.keys(draftData).forEach((key) => {
|
|
32
|
+
formData[key] = draftData[key];
|
|
33
|
+
});
|
|
34
|
+
hasChange.value = false;
|
|
35
|
+
};
|
|
36
|
+
// 清空草稿
|
|
37
|
+
const clearDraft = () => {
|
|
38
|
+
saveToStorage({});
|
|
39
|
+
lastSaveTime.value = null;
|
|
40
|
+
hasChange.value = false;
|
|
41
|
+
};
|
|
42
|
+
// 启动自动保存
|
|
43
|
+
const startAutoSave = () => {
|
|
44
|
+
autoSaveTimer = setInterval(() => {
|
|
45
|
+
if (hasChange.value)
|
|
46
|
+
saveDraft();
|
|
47
|
+
}, interval * 1000);
|
|
48
|
+
};
|
|
49
|
+
// 停止自动保存
|
|
50
|
+
const stopAutoSave = () => {
|
|
51
|
+
clearInterval(autoSaveTimer);
|
|
52
|
+
};
|
|
53
|
+
// 监听表单变化,标记“未保存”
|
|
54
|
+
watch(formData, checkChange, { deep: true, immediate: true });
|
|
55
|
+
// 组件卸载时停止自动保存+手动保存一次
|
|
56
|
+
onUnmounted(() => {
|
|
57
|
+
stopAutoSave();
|
|
58
|
+
if (hasChange.value)
|
|
59
|
+
saveDraft();
|
|
60
|
+
});
|
|
61
|
+
// 初始化启动自动保存
|
|
62
|
+
startAutoSave();
|
|
63
|
+
return {
|
|
64
|
+
hasChange,
|
|
65
|
+
lastSaveTime,
|
|
66
|
+
saveDraft,
|
|
67
|
+
restoreDraft,
|
|
68
|
+
clearDraft,
|
|
69
|
+
stopAutoSave,
|
|
70
|
+
startAutoSave
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=useFormAutoSave.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFormAutoSave.js","sourceRoot":"","sources":["../../hooks/useFormAutoSave.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,CAAA;AAE7C;;;;;;;GAOG;AACH,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;IAClF,aAAa;IACb,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,yBAAyB,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;IAChG,UAAU;IACV,IAAI,aAAa,GAAG,IAAI,CAAA;IACxB,YAAY;IACZ,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAA;IAC5B,SAAS;IACT,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,CAAA;IAE9B,qBAAqB;IACrB,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAC1E,CAAC,CAAA;IAED,SAAS;IACT,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,aAAa,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAA;QAC9B,YAAY,CAAC,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,cAAc,EAAE,CAAA;QAChD,SAAS,CAAC,KAAK,GAAG,KAAK,CAAA;IACzB,CAAC,CAAA;IAED,UAAU;IACV,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACrC,QAAQ,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;QACF,SAAS,CAAC,KAAK,GAAG,KAAK,CAAA;IACzB,CAAC,CAAA;IAED,OAAO;IACP,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,aAAa,CAAC,EAAE,CAAC,CAAA;QACjB,YAAY,CAAC,KAAK,GAAG,IAAI,CAAA;QACzB,SAAS,CAAC,KAAK,GAAG,KAAK,CAAA;IACzB,CAAC,CAAA;IAED,SAAS;IACT,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;YAC/B,IAAI,SAAS,CAAC,KAAK;gBAAE,SAAS,EAAE,CAAA;QAClC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,CAAA;IACrB,CAAC,CAAA;IAED,SAAS;IACT,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,aAAa,CAAC,aAAa,CAAC,CAAA;IAC9B,CAAC,CAAA;IAED,iBAAiB;IACjB,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAE7D,qBAAqB;IACrB,WAAW,CAAC,GAAG,EAAE;QACf,YAAY,EAAE,CAAA;QACd,IAAI,SAAS,CAAC,KAAK;YAAE,SAAS,EAAE,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,YAAY;IACZ,aAAa,EAAE,CAAA;IAEf,OAAO;QACL,SAAS;QACT,YAAY;QACZ,SAAS;QACT,YAAY;QACZ,UAAU;QACV,YAAY;QACZ,aAAa;KACd,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRouteCache.d.ts","sourceRoot":"","sources":["../../hooks/useRouteCache.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { ref, watch } from 'vue';
|
|
2
|
+
import { useRoute, useRouter } from 'vue-router';
|
|
3
|
+
/**
|
|
4
|
+
* 路由/标签页缓存管理 Hooks
|
|
5
|
+
* @param {Array} defaultCached - 默认缓存的路由名称列表
|
|
6
|
+
* @returns {Object} 缓存状态和操作方法
|
|
7
|
+
*/
|
|
8
|
+
const useRouteCache = (defaultCached = []) => {
|
|
9
|
+
const route = useRoute();
|
|
10
|
+
const router = useRouter();
|
|
11
|
+
// keep-alive 的 include 列表(响应式)
|
|
12
|
+
const cachedRoutes = ref([...defaultCached]);
|
|
13
|
+
// 已打开的标签页列表
|
|
14
|
+
const tabList = ref([]);
|
|
15
|
+
// 初始化标签页(从当前路由)
|
|
16
|
+
const initTabList = () => {
|
|
17
|
+
if (!tabList.value.some((tab) => tab.path === route.path)) {
|
|
18
|
+
tabList.value.push({
|
|
19
|
+
title: route.meta.title || route.name,
|
|
20
|
+
path: route.path,
|
|
21
|
+
name: route.name
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
// 添加标签页(并缓存)
|
|
26
|
+
const addTab = (tab) => {
|
|
27
|
+
if (!tabList.value.some((t) => t.path === tab.path)) {
|
|
28
|
+
tabList.value.push(tab);
|
|
29
|
+
// 仅缓存标记为 keepAlive 的路由
|
|
30
|
+
if (tab.meta?.keepAlive) {
|
|
31
|
+
addCachedRoute(tab.name);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// 跳转到该标签页
|
|
35
|
+
router.push(tab.path);
|
|
36
|
+
};
|
|
37
|
+
// 关闭标签页
|
|
38
|
+
const closeTab = (path, toPath = '/') => {
|
|
39
|
+
const index = tabList.value.findIndex((t) => t.path === path);
|
|
40
|
+
if (index > -1) {
|
|
41
|
+
const closedTab = tabList.value.splice(index, 1)[0];
|
|
42
|
+
// 关闭时移除缓存
|
|
43
|
+
removeCachedRoute(closedTab.name);
|
|
44
|
+
// 如果关闭的是当前页,跳转到指定页
|
|
45
|
+
if (path === route.path) {
|
|
46
|
+
router.push(toPath || tabList.value[index - 1]?.path || '/');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
// 关闭其他标签页
|
|
51
|
+
const closeOtherTabs = (currentPath) => {
|
|
52
|
+
tabList.value = tabList.value.filter((t) => t.path === currentPath);
|
|
53
|
+
// 仅保留当前页的缓存(如果有)
|
|
54
|
+
const currentTab = tabList.value[0];
|
|
55
|
+
cachedRoutes.value = currentTab.meta?.keepAlive ? [currentTab.name] : [];
|
|
56
|
+
};
|
|
57
|
+
// 添加缓存路由
|
|
58
|
+
const addCachedRoute = (name) => {
|
|
59
|
+
if (name && !cachedRoutes.value.includes(name)) {
|
|
60
|
+
cachedRoutes.value.push(name);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
// 移除缓存路由
|
|
64
|
+
const removeCachedRoute = (name) => {
|
|
65
|
+
const index = cachedRoutes.value.findIndex((n) => n === name);
|
|
66
|
+
if (index > -1)
|
|
67
|
+
cachedRoutes.value.splice(index, 1);
|
|
68
|
+
};
|
|
69
|
+
// 刷新当前路由(移除缓存后重新进入)
|
|
70
|
+
const refreshCurrentRoute = () => {
|
|
71
|
+
const currentName = route.name;
|
|
72
|
+
removeCachedRoute(currentName);
|
|
73
|
+
// 先跳转到空页面(或自身),再跳转回来触发刷新
|
|
74
|
+
const tempPath = `/empty-${Date.now()}`;
|
|
75
|
+
router.replace({ path: tempPath }).then(() => {
|
|
76
|
+
router.replace({ path: route.path });
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
// 初始化
|
|
80
|
+
watch(() => route.path, initTabList, { immediate: true });
|
|
81
|
+
return {
|
|
82
|
+
cachedRoutes,
|
|
83
|
+
tabList,
|
|
84
|
+
addTab,
|
|
85
|
+
closeTab,
|
|
86
|
+
closeOtherTabs,
|
|
87
|
+
addCachedRoute,
|
|
88
|
+
removeCachedRoute,
|
|
89
|
+
refreshCurrentRoute
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=useRouteCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRouteCache.js","sourceRoot":"","sources":["../../hooks/useRouteCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
interface ScrollOptions {
|
|
2
|
+
container?: string | HTMLElement | Window;
|
|
3
|
+
initialThreshold?: number;
|
|
4
|
+
onReach?: Function | null;
|
|
5
|
+
direction?: string;
|
|
6
|
+
throttleTime?: number;
|
|
7
|
+
}
|
|
8
|
+
export default function useScroll(options?: ScrollOptions): {
|
|
9
|
+
scrollPosition: import("vue").Ref<number, number>;
|
|
10
|
+
isReached: import("vue").Ref<boolean, boolean>;
|
|
11
|
+
checkThreshold: () => void;
|
|
12
|
+
updateThreshold: (val: number) => void;
|
|
13
|
+
};
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=useScroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useScroll.d.ts","sourceRoot":"","sources":["../../hooks/useScroll.ts"],"names":[],"mappings":"AAGA,UAAU,aAAa;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAA;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,OAAO,GAAE,aAAkB;;;;2BAmC7B,MAAM;EA2CrC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { throttle } from 'lodash-es';
|
|
2
|
+
import { ref, onMounted, onUnmounted } from 'vue';
|
|
3
|
+
export default function useScroll(options = {}) {
|
|
4
|
+
const { container = window, initialThreshold = 0, onReach = null, direction = 'vertical', throttleTime = 200 } = options;
|
|
5
|
+
const threshold = ref(initialThreshold || 0);
|
|
6
|
+
let target;
|
|
7
|
+
const scrollPosition = ref(0);
|
|
8
|
+
const isReached = ref(false);
|
|
9
|
+
let rafId;
|
|
10
|
+
// 获取容器元素
|
|
11
|
+
const getContainer = () => {
|
|
12
|
+
if (typeof container === 'string') {
|
|
13
|
+
return document.querySelector(container);
|
|
14
|
+
}
|
|
15
|
+
return container;
|
|
16
|
+
};
|
|
17
|
+
const getScrollPosition = () => {
|
|
18
|
+
if (!target)
|
|
19
|
+
return 0;
|
|
20
|
+
if (target === window) {
|
|
21
|
+
return direction === 'vertical' ? window.scrollY : window.scrollX;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
return direction === 'vertical'
|
|
25
|
+
? target.scrollTop
|
|
26
|
+
: target.scrollLeft;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const updateThreshold = (val) => {
|
|
30
|
+
threshold.value = val;
|
|
31
|
+
};
|
|
32
|
+
const checkThreshold = () => {
|
|
33
|
+
const currentPos = getScrollPosition();
|
|
34
|
+
scrollPosition.value = currentPos;
|
|
35
|
+
// 实时检测是否达到阈值
|
|
36
|
+
const newReached = currentPos >= threshold.value;
|
|
37
|
+
if (newReached !== isReached.value) {
|
|
38
|
+
isReached.value = newReached;
|
|
39
|
+
if (onReach)
|
|
40
|
+
onReach(newReached);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const handleScroll = throttle(() => {
|
|
44
|
+
if (rafId)
|
|
45
|
+
return;
|
|
46
|
+
rafId = requestAnimationFrame(() => {
|
|
47
|
+
checkThreshold();
|
|
48
|
+
rafId = null;
|
|
49
|
+
});
|
|
50
|
+
}, throttleTime);
|
|
51
|
+
onMounted(() => {
|
|
52
|
+
target = getContainer();
|
|
53
|
+
if (target) {
|
|
54
|
+
target.addEventListener('scroll', handleScroll);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
onUnmounted(() => {
|
|
58
|
+
if (target) {
|
|
59
|
+
target.removeEventListener('scroll', handleScroll);
|
|
60
|
+
}
|
|
61
|
+
if (rafId)
|
|
62
|
+
cancelAnimationFrame(rafId);
|
|
63
|
+
});
|
|
64
|
+
return {
|
|
65
|
+
scrollPosition,
|
|
66
|
+
isReached,
|
|
67
|
+
checkThreshold, // 暴露手动检测方法
|
|
68
|
+
updateThreshold
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=useScroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useScroll.js","sourceRoot":"","sources":["../../hooks/useScroll.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface UploadConfig {
|
|
2
|
+
params?: Record<string, any>;
|
|
3
|
+
headers?: Record<string, string>;
|
|
4
|
+
quality?: number;
|
|
5
|
+
}
|
|
6
|
+
export default function useUpload(uploadUrl: string, uploadConfig?: UploadConfig): {
|
|
7
|
+
previewUrl: import("vue").Ref<string, string>;
|
|
8
|
+
uploadProgress: import("vue").Ref<number, number>;
|
|
9
|
+
isUploading: import("vue").Ref<boolean, boolean>;
|
|
10
|
+
uploadError: import("vue").Ref<string, string>;
|
|
11
|
+
uploadResult: import("vue").Ref<any, any>;
|
|
12
|
+
selectImage: (e: Event) => File | undefined;
|
|
13
|
+
uploadImage: (file: File | Blob, retry?: number) => Promise<any>;
|
|
14
|
+
clearUploadState: () => void;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=useUpload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUpload.d.ts","sourceRoot":"","sources":["../../hooks/useUpload.ts"],"names":[],"mappings":"AAIA,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,GAAE,YAAiB;;;;;;qBAS1D,KAAK;wBAeI,IAAI,GAAG,IAAI,qBAAc,OAAO,CAAC,GAAG,CAAC;;EAgEvE"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { ref } from 'vue';
|
|
2
|
+
import axios from 'axios';
|
|
3
|
+
import { compressImage } from './helper';
|
|
4
|
+
export default function useUpload(uploadUrl, uploadConfig = {}) {
|
|
5
|
+
// 上传状态
|
|
6
|
+
const previewUrl = ref(''); // 图片预览地址
|
|
7
|
+
const uploadProgress = ref(0); // 上传进度
|
|
8
|
+
const isUploading = ref(false); // 是否正在上传
|
|
9
|
+
const uploadError = ref(''); // 上传错误信息
|
|
10
|
+
const uploadResult = ref(null); // 上传结果(接口返回)
|
|
11
|
+
// 选择图片(生成预览)
|
|
12
|
+
const selectImage = (e) => {
|
|
13
|
+
const target = e.target;
|
|
14
|
+
const file = target.files?.[0];
|
|
15
|
+
if (!file || !file.type.startsWith('image/')) {
|
|
16
|
+
uploadError.value = '请选择有效的图片文件';
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
// 生成预览URL
|
|
20
|
+
previewUrl.value = URL.createObjectURL(file);
|
|
21
|
+
uploadError.value = '';
|
|
22
|
+
return file;
|
|
23
|
+
};
|
|
24
|
+
// 上传图片(支持压缩+进度+重试)
|
|
25
|
+
const uploadImage = async (file, retry = 1) => {
|
|
26
|
+
if (!file)
|
|
27
|
+
return;
|
|
28
|
+
isUploading.value = true;
|
|
29
|
+
uploadProgress.value = 0;
|
|
30
|
+
uploadError.value = '';
|
|
31
|
+
try {
|
|
32
|
+
// 图片压缩(可选)
|
|
33
|
+
let uploadFile = file;
|
|
34
|
+
if (file instanceof File && file.type.startsWith('image/')) {
|
|
35
|
+
uploadFile = await compressImage(file, { quality: uploadConfig.quality || 0.8 });
|
|
36
|
+
}
|
|
37
|
+
// 构建FormData
|
|
38
|
+
const formData = new FormData();
|
|
39
|
+
formData.append('file', uploadFile);
|
|
40
|
+
// 业务自定义参数
|
|
41
|
+
if (uploadConfig.params) {
|
|
42
|
+
Object.entries(uploadConfig.params).forEach(([k, v]) => formData.append(k, v));
|
|
43
|
+
}
|
|
44
|
+
// 上传请求(带进度)
|
|
45
|
+
const res = await axios.post(uploadUrl, formData, {
|
|
46
|
+
headers: { 'Content-Type': 'multipart/form-data', ...uploadConfig.headers },
|
|
47
|
+
onUploadProgress: (e) => {
|
|
48
|
+
if (e.total) {
|
|
49
|
+
uploadProgress.value = Math.round((e.loaded / e.total) * 100);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
uploadResult.value = res.data;
|
|
54
|
+
return res.data;
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
uploadError.value = err.message || '上传失败';
|
|
58
|
+
// 重试逻辑
|
|
59
|
+
if (retry > 0) {
|
|
60
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
61
|
+
return uploadImage(file, retry - 1);
|
|
62
|
+
}
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
isUploading.value = false;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
// 清空上传状态
|
|
70
|
+
const clearUploadState = () => {
|
|
71
|
+
previewUrl.value = '';
|
|
72
|
+
uploadProgress.value = 0;
|
|
73
|
+
uploadError.value = '';
|
|
74
|
+
uploadResult.value = null;
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
previewUrl,
|
|
78
|
+
uploadProgress,
|
|
79
|
+
isUploading,
|
|
80
|
+
uploadError,
|
|
81
|
+
uploadResult,
|
|
82
|
+
selectImage,
|
|
83
|
+
uploadImage,
|
|
84
|
+
clearUploadState
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=useUpload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUpload.js","sourceRoot":"","sources":["../../hooks/useUpload.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACvD,cAAc,QAAQ,CAAA;AACtB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACvD,cAAc,QAAQ,CAAA;AACtB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACvD,cAAc,QAAQ,CAAA;AACtB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACvD,cAAc,QAAQ,CAAA;AACtB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA"}
|
package/dist/request/index.d.ts
CHANGED
|
@@ -1,42 +1,60 @@
|
|
|
1
|
-
import { type AxiosRequestConfig, type AxiosResponse, type CreateAxiosDefaults } from 'axios'
|
|
2
|
-
export * from 'axios'
|
|
1
|
+
import { type AxiosRequestConfig, type AxiosResponse, type CreateAxiosDefaults } from 'axios';
|
|
2
|
+
export * from 'axios';
|
|
3
3
|
/**
|
|
4
4
|
* 后端统一响应格式
|
|
5
5
|
* @template T - 响应体中 result 字段的类型
|
|
6
6
|
*/
|
|
7
7
|
export interface ApiResponse<T = any> {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
data: T;
|
|
9
|
+
code: number;
|
|
10
|
+
msg: string;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
13
|
* 取消所有 pending 状态的请求
|
|
14
14
|
*/
|
|
15
|
-
export declare const cancelAllRequests: () => void
|
|
15
|
+
export declare const cancelAllRequests: () => void;
|
|
16
16
|
/**
|
|
17
17
|
* 根据URL取消相关请求
|
|
18
18
|
* @param {String} url 要取消请求的URL
|
|
19
19
|
*/
|
|
20
|
-
export declare const cancelRequestsByUrl: (url: string) => void
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
export declare const cancelRequestsByUrl: (url: string) => void;
|
|
21
|
+
/**
|
|
22
|
+
* 请求实例初始化配置选项
|
|
23
|
+
*/
|
|
24
|
+
export interface RequestInstanceOptions {
|
|
25
|
+
/** 请求拦截器额外处理逻辑 */
|
|
26
|
+
interceptorsRequestFn?: (config: AxiosRequestConfig) => void;
|
|
27
|
+
/** 响应拦截器额外处理逻辑 */
|
|
28
|
+
interceptorsResponseFn?: (response: AxiosResponse) => void;
|
|
29
|
+
/** 判断响应是否成功的逻辑,默认判断 code === 200 */
|
|
30
|
+
isSuccess?: (data: any) => boolean;
|
|
31
|
+
/** 从响应中提取数据的逻辑,默认返回 data.data */
|
|
32
|
+
getData?: (data: any) => any;
|
|
33
|
+
/** 从响应中提取错误消息的逻辑,默认返回 data.msg */
|
|
34
|
+
getMessage?: (data: any) => string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* @description 初始化请求实例
|
|
38
|
+
* @author xieshuhong
|
|
39
|
+
* @param {CreateAxiosDefaults} [extendConfig={}] 扩展配置
|
|
40
|
+
* @param {RequestInstanceOptions} [options={}] 配置选项
|
|
41
|
+
* @return {*} 请求实例
|
|
42
|
+
*/
|
|
43
|
+
export declare const initRequestInstance: (extendConfig?: CreateAxiosDefaults, options?: RequestInstanceOptions) => import("axios").AxiosInstance;
|
|
26
44
|
/**
|
|
27
45
|
* 生成请求唯一标识
|
|
28
46
|
* @param {Object} config 请求配置
|
|
29
47
|
* @returns {String} 唯一标识
|
|
30
48
|
*/
|
|
31
|
-
export declare const generateRequestKey: (config: AxiosRequestConfig) => string
|
|
49
|
+
export declare const generateRequestKey: (config: AxiosRequestConfig) => string;
|
|
32
50
|
/**
|
|
33
51
|
* 添加请求到pending列表
|
|
34
52
|
* @param {Object} config 请求配置
|
|
35
53
|
*/
|
|
36
|
-
export declare const addPendingRequest: (config: AxiosRequestConfig) => void
|
|
54
|
+
export declare const addPendingRequest: (config: AxiosRequestConfig) => void;
|
|
37
55
|
/**
|
|
38
56
|
* 从pending列表移除请求
|
|
39
57
|
* @param {Object} config 请求配置
|
|
40
58
|
*/
|
|
41
|
-
export declare const removePendingRequest: (config: AxiosRequestConfig) => void
|
|
42
|
-
//# sourceMappingURL=index.d.ts.map
|
|
59
|
+
export declare const removePendingRequest: (config: AxiosRequestConfig) => void;
|
|
60
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../request/index.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,kBAAkB,EAAE,KAAK,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAA;AAIpG,cAAc,OAAO,CAAA;AAErB;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,IAAI,EAAE,CAAC,CAAA;IACP,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,YAK7B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,KAAK,MAAM,SAO9C,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../request/index.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,kBAAkB,EAAE,KAAK,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAA;AAIpG,cAAc,OAAO,CAAA;AAErB;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,IAAI,EAAE,CAAC,CAAA;IACP,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,YAK7B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,KAAK,MAAM,SAO9C,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,kBAAkB;IAClB,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAC5D,kBAAkB;IAClB,sBAAsB,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAA;IAC1D,oCAAoC;IACpC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAA;IAClC,iCAAiC;IACjC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,CAAA;IAC5B,kCAAkC;IAClC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,MAAM,CAAA;CACnC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,eAAc,mBAAwB,EACtC,UAAS,sBAA2B,kCA0GrC,CAAA;AAKD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,kBAAkB,WAM5D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,kBAAkB,SAa3D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,kBAAkB,SAK9D,CAAA"}
|
package/dist/request/index.js
CHANGED
|
@@ -23,8 +23,15 @@ export const cancelRequestsByUrl = (url) => {
|
|
|
23
23
|
}
|
|
24
24
|
});
|
|
25
25
|
};
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
/**
|
|
27
|
+
* @description 初始化请求实例
|
|
28
|
+
* @author xieshuhong
|
|
29
|
+
* @param {CreateAxiosDefaults} [extendConfig={}] 扩展配置
|
|
30
|
+
* @param {RequestInstanceOptions} [options={}] 配置选项
|
|
31
|
+
* @return {*} 请求实例
|
|
32
|
+
*/
|
|
33
|
+
export const initRequestInstance = (extendConfig = {}, options = {}) => {
|
|
34
|
+
const { interceptorsRequestFn = () => { }, interceptorsResponseFn = () => { }, isSuccess = (data) => data?.code === 200, getData = (data) => data?.data, getMessage = (data) => data?.msg || '请求失败' } = options;
|
|
28
35
|
const axiosConfig = merge({}, extendConfig, {
|
|
29
36
|
baseURL: '/', // 从环境变量获取基础URL
|
|
30
37
|
timeout: 10000, // 超时时间
|
|
@@ -50,18 +57,19 @@ export const initRequestInstance = (extendConfig = {}, interceptorsRequestFn = (
|
|
|
50
57
|
// 从pending列表移除请求
|
|
51
58
|
removePendingRequest(response.config);
|
|
52
59
|
const data = response.data;
|
|
53
|
-
//
|
|
54
|
-
if (data
|
|
60
|
+
// 根据配置的逻辑处理响应
|
|
61
|
+
if (isSuccess(data)) {
|
|
55
62
|
return Promise.resolve({
|
|
56
63
|
...response,
|
|
57
64
|
...data,
|
|
58
|
-
data: data
|
|
65
|
+
data: getData(data)
|
|
59
66
|
});
|
|
60
67
|
}
|
|
61
68
|
else {
|
|
62
69
|
// 非成功状态,显示错误信息
|
|
63
|
-
|
|
64
|
-
|
|
70
|
+
const msg = getMessage(data);
|
|
71
|
+
ElMessage.error(msg);
|
|
72
|
+
return Promise.reject(new Error(msg));
|
|
65
73
|
}
|
|
66
74
|
}, (error) => {
|
|
67
75
|
console.log('请求发生错误>>>>>>>>>>>>>>>>>>:', error);
|
|
@@ -85,7 +93,6 @@ export const initRequestInstance = (extendConfig = {}, interceptorsRequestFn = (
|
|
|
85
93
|
switch (response.status) {
|
|
86
94
|
case 401:
|
|
87
95
|
ElMessage.error('身份验证失败,请重新登录');
|
|
88
|
-
// 可以在这里添加跳转到登录页的逻辑
|
|
89
96
|
break;
|
|
90
97
|
case 403:
|
|
91
98
|
ElMessage.error('没有权限执行此操作');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../request/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAgF,MAAM,OAAO,CAAA;AACpG,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAE/B,cAAc,OAAO,CAAA;AAYrB;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,EAAE;IACpC,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACjC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IACF,eAAe,CAAC,KAAK,EAAE,CAAA;AACzB,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAE,EAAE;IACjD,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE;QAC9D,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,WAAW,CAAC,CAAA;YACjC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC7B,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../request/index.ts"],"names":[],"mappings":"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"}
|