@peng_kai/kit 0.2.51 → 0.3.0-beta.10
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/.vscode/settings.json +2 -2
- package/admin/components/currency/src/CurrencyIcon.vue +35 -33
- package/admin/components/date/PeriodPicker.vue +122 -0
- package/admin/components/date/TimeFieldSelectForLabel.vue +24 -0
- package/admin/components/date/TtaTimeZone.vue +516 -0
- package/admin/components/date/helpers.ts +223 -0
- package/admin/components/date/index.ts +4 -0
- package/admin/components/filter/src/FilterReset.vue +22 -5
- package/admin/components/provider/Admin.vue +17 -0
- package/admin/components/provider/admin-permission.ts +48 -0
- package/admin/components/provider/admin-router.ts +358 -0
- package/admin/components/provider/index.ts +3 -0
- package/admin/components/text/index.ts +2 -0
- package/admin/components/text/src/Amount.v2.vue +127 -0
- package/admin/components/text/src/Datetime.vue +15 -11
- package/admin/components/text/src/Num.vue +192 -0
- package/admin/layout/large/Breadcrumb.vue +10 -23
- package/admin/layout/large/Content.vue +9 -6
- package/admin/layout/large/Layout.vue +129 -0
- package/admin/layout/large/Menu.vue +24 -17
- package/admin/layout/large/Notice.vue +140 -0
- package/admin/layout/large/Tabs.vue +177 -0
- package/admin/layout/large/index.ts +3 -1
- package/admin/layout/large/y682.mp3 +0 -0
- package/admin/permission/routerGuard.ts +15 -8
- package/admin/permission/vuePlugin.ts +5 -10
- package/admin/route-guards/index.ts +0 -1
- package/admin/stores/index.ts +1 -0
- package/admin/styles/classCover.scss +1 -1
- package/admin/styles/globalCover.scss +4 -0
- package/admin/styles/index.scss +2 -2
- package/antd/hooks/useAntdModal.ts +20 -8
- package/antd/hooks/useAntdTable.ts +2 -0
- package/antd/hooks/useAntdTheme.ts +7 -0
- package/antd/index.ts +1 -1
- package/libs/bignumber.ts +1 -1
- package/libs/dayjs.ts +11 -1
- package/libs/fingerprintjs.ts +1 -0
- package/package.json +30 -31
- package/request/interceptors/getDeviceInfo.ts +0 -22
- package/utils/LocaleManager.ts +1 -1
- package/utils/locale/LocaleManager.ts +2 -1
- package/utils/number.ts +37 -12
- package/utils/storage.ts +31 -0
- package/admin/layout/large/PageTab.vue +0 -70
- package/admin/route-guards/collapseMenu.ts +0 -11
- package/libs/a-calc.ts +0 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@peng_kai/kit",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.0-beta.10",
|
|
5
5
|
"description": "",
|
|
6
6
|
"author": "",
|
|
7
7
|
"license": "ISC",
|
|
@@ -13,41 +13,40 @@
|
|
|
13
13
|
"lint:fix": "eslint . --fix"
|
|
14
14
|
},
|
|
15
15
|
"peerDependencies": {
|
|
16
|
-
"ant-design-vue": "4.2.
|
|
17
|
-
"vue": "3.
|
|
18
|
-
"vue-router": "4.
|
|
16
|
+
"ant-design-vue": "4.2.6",
|
|
17
|
+
"vue": "3.5.17",
|
|
18
|
+
"vue-router": "4.5.1"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@aws-sdk/client-s3": "^3.
|
|
22
|
-
"@aws-sdk/lib-storage": "^3.
|
|
23
|
-
"@babel/generator": "^7.
|
|
24
|
-
"@babel/parser": "^7.
|
|
25
|
-
"@babel/traverse": "^7.
|
|
26
|
-
"@babel/types": "^7.
|
|
21
|
+
"@aws-sdk/client-s3": "^3.835.0",
|
|
22
|
+
"@aws-sdk/lib-storage": "^3.835.0",
|
|
23
|
+
"@babel/generator": "^7.27.5",
|
|
24
|
+
"@babel/parser": "^7.27.5",
|
|
25
|
+
"@babel/traverse": "^7.27.4",
|
|
26
|
+
"@babel/types": "^7.27.6",
|
|
27
27
|
"@ckeditor/ckeditor5-vue": "^5.1.0",
|
|
28
|
-
"@fingerprintjs/fingerprintjs": "^4.
|
|
29
|
-
"@tanstack/vue-query": "^5.
|
|
30
|
-
"@vueuse/components": "^
|
|
31
|
-
"@vueuse/core": "^
|
|
32
|
-
"@vueuse/router": "^
|
|
33
|
-
"a-calc": "^1.3.12",
|
|
28
|
+
"@fingerprintjs/fingerprintjs": "^4.6.2",
|
|
29
|
+
"@tanstack/vue-query": "^5.81.2",
|
|
30
|
+
"@vueuse/components": "^13.4.0",
|
|
31
|
+
"@vueuse/core": "^13.4.0",
|
|
32
|
+
"@vueuse/router": "^13.4.0",
|
|
34
33
|
"archiver": "^7.0.1",
|
|
35
|
-
"axios": "^1.
|
|
36
|
-
"bignumber.js": "^9.
|
|
34
|
+
"axios": "^1.10.0",
|
|
35
|
+
"bignumber.js": "^9.3.0",
|
|
37
36
|
"chokidar": "^3.6.0",
|
|
38
37
|
"crypto-es": "^2.1.0",
|
|
39
|
-
"dayjs": "^1.11.
|
|
40
|
-
"echarts": "^5.
|
|
41
|
-
"execa": "^9.
|
|
38
|
+
"dayjs": "^1.11.13",
|
|
39
|
+
"echarts": "^5.5.1",
|
|
40
|
+
"execa": "^9.4.0",
|
|
42
41
|
"fast-glob": "^3.3.2",
|
|
43
42
|
"localstorage-slim": "^2.7.1",
|
|
44
43
|
"lodash-es": "^4.17.21",
|
|
45
44
|
"nprogress": "^0.2.0",
|
|
46
|
-
"pinia": "^
|
|
45
|
+
"pinia": "^3.0.3",
|
|
47
46
|
"tsx": "^4.16.00",
|
|
48
|
-
"vue": "^3.
|
|
49
|
-
"vue-i18n": "^
|
|
50
|
-
"vue-router": "^4.
|
|
47
|
+
"vue": "^3.5.17",
|
|
48
|
+
"vue-i18n": "^11.1.7",
|
|
49
|
+
"vue-router": "^4.5.1"
|
|
51
50
|
},
|
|
52
51
|
"devDependencies": {
|
|
53
52
|
"@ckeditor/ckeditor5-adapter-ckfinder": "^41.1.0",
|
|
@@ -82,14 +81,14 @@
|
|
|
82
81
|
"@ckeditor/ckeditor5-upload": "^41.1.0",
|
|
83
82
|
"@ckeditor/ckeditor5-word-count": "^41.1.0",
|
|
84
83
|
"@peng_kai/lint": "^0.1.0",
|
|
85
|
-
"@types/archiver": "^6.0.
|
|
84
|
+
"@types/archiver": "^6.0.3",
|
|
86
85
|
"@types/crypto-js": "^4.2.2",
|
|
87
86
|
"@types/lodash-es": "^4.17.12",
|
|
88
|
-
"@types/node": "^
|
|
87
|
+
"@types/node": "^22.15.33",
|
|
89
88
|
"@types/nprogress": "^0.2.3",
|
|
90
|
-
"ant-design-vue": "^4.2.
|
|
91
|
-
"type-fest": "^4.
|
|
92
|
-
"typescript": "^5.
|
|
93
|
-
"vue-component-type-helpers": "^2.
|
|
89
|
+
"ant-design-vue": "^4.2.6",
|
|
90
|
+
"type-fest": "^4.41.0",
|
|
91
|
+
"typescript": "^5.8.3",
|
|
92
|
+
"vue-component-type-helpers": "^2.2.10"
|
|
94
93
|
}
|
|
95
94
|
}
|
|
@@ -25,7 +25,6 @@ export function getDeviceInfo(callback: (base: Record<string, any>, all: GetResu
|
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
req.headers.set('Device', callback(base, result));
|
|
28
|
-
req.headers.set('Device-Id', getDeviceID(base.visitor_id));
|
|
29
28
|
req.headers.set('Accept-Date', getCurrentTimeZone());
|
|
30
29
|
|
|
31
30
|
return req;
|
|
@@ -39,24 +38,3 @@ function getCurrentTimeZone() {
|
|
|
39
38
|
const tzOffset = now.getTimezoneOffset() / 60;
|
|
40
39
|
return toBase64([time, tz, tzOffset, describe].join('|'));
|
|
41
40
|
}
|
|
42
|
-
|
|
43
|
-
function getDeviceID(visitorId: string) {
|
|
44
|
-
const key = 'APP_DEVICE_ID';
|
|
45
|
-
const oldId = localStorage.getItem(key);
|
|
46
|
-
const newId = oldId || visitorId || generateRandomStringSecure(32);
|
|
47
|
-
newId !== oldId && localStorage.setItem(key, newId);
|
|
48
|
-
return newId;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function generateRandomStringSecure(length: number) {
|
|
52
|
-
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
53
|
-
const randomValues = new Uint32Array(length);
|
|
54
|
-
window.crypto.getRandomValues(randomValues); // 浏览器内置加密 API
|
|
55
|
-
|
|
56
|
-
let result = '';
|
|
57
|
-
for (let i = 0; i < length; i++) {
|
|
58
|
-
result += chars[randomValues[i] % chars.length];
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return result;
|
|
62
|
-
}
|
package/utils/LocaleManager.ts
CHANGED
|
@@ -63,7 +63,7 @@ export class LocaleManager {
|
|
|
63
63
|
|
|
64
64
|
for (const target of localeTargets) {
|
|
65
65
|
for (const codes of codeMatrix) {
|
|
66
|
-
const matched = codes.some(code =>
|
|
66
|
+
const matched = codes.some(code => target.toUpperCase().startsWith(code.toUpperCase()));
|
|
67
67
|
|
|
68
68
|
if (matched) {
|
|
69
69
|
localeFinal = codes[0];
|
|
@@ -65,7 +65,7 @@ export class LocaleManager {
|
|
|
65
65
|
|
|
66
66
|
for (const target of localeTargets) {
|
|
67
67
|
for (const codes of codeMatrix) {
|
|
68
|
-
const matched = codes.some(code =>
|
|
68
|
+
const matched = codes.some(code => target.toUpperCase().startsWith(code.toUpperCase()));
|
|
69
69
|
|
|
70
70
|
if (matched) {
|
|
71
71
|
localeFinal = codes[0];
|
|
@@ -92,6 +92,7 @@ export class LocaleManager {
|
|
|
92
92
|
if (!this.localesAvailable.includes(locale))
|
|
93
93
|
return;
|
|
94
94
|
|
|
95
|
+
// TODO: 这样可能无法支持code中的语言
|
|
95
96
|
const message = await this.messageLoaders[locale]?.().catch(() => undefined);
|
|
96
97
|
|
|
97
98
|
// 由于是异步加载,所以需要再判断是否已经加载过
|
package/utils/number.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import { calc } from 'a-calc';
|
|
2
1
|
import type { BigNumber } from 'bignumber.js';
|
|
3
2
|
import bn from 'bignumber.js';
|
|
4
3
|
|
|
5
4
|
export { default as bn } from 'bignumber.js';
|
|
6
|
-
export { calc } from 'a-calc';
|
|
7
5
|
|
|
8
6
|
/**
|
|
9
7
|
* 常用的数值格式化规则
|
|
@@ -17,23 +15,50 @@ export { calc } from 'a-calc';
|
|
|
17
15
|
*/
|
|
18
16
|
export const numFmt = {
|
|
19
17
|
/** 保留18位小数,千位符 */
|
|
20
|
-
t: (num: any,
|
|
18
|
+
t: (num: any, fallback: any = 'NaN') => {
|
|
19
|
+
const result = bn(num);
|
|
20
|
+
return result.isNaN() ? fallback : result.decimalPlaces(18, bn.ROUND_DOWN).toFormat();
|
|
21
|
+
},
|
|
21
22
|
/** 舍去小数,四舍五入,千位符 */
|
|
22
|
-
d0r5t: (num: any,
|
|
23
|
+
d0r5t: (num: any, fallback: any = 'NaN') => {
|
|
24
|
+
const result = bn(num);
|
|
25
|
+
return result.isNaN() ? fallback : result.decimalPlaces(0, bn.ROUND_HALF_UP).toFormat(0);
|
|
26
|
+
},
|
|
23
27
|
/** 舍去小数,向下取整,千位符 */
|
|
24
|
-
d0r0t: (num: any,
|
|
28
|
+
d0r0t: (num: any, fallback: any = 'NaN') => {
|
|
29
|
+
const result = bn(num);
|
|
30
|
+
return result.isNaN() ? fallback : result.decimalPlaces(0, bn.ROUND_DOWN).toFormat(0);
|
|
31
|
+
},
|
|
25
32
|
/** 保留2位小数,四舍五入,千位符 */
|
|
26
|
-
d2r5t: (num: any,
|
|
33
|
+
d2r5t: (num: any, fallback: any = 'NaN') => {
|
|
34
|
+
const result = bn(num);
|
|
35
|
+
return result.isNaN() ? fallback : result.decimalPlaces(2, bn.ROUND_HALF_UP).toFormat(2);
|
|
36
|
+
},
|
|
27
37
|
/** 保留2位小数,向下取整,千位符 */
|
|
28
|
-
d2r0t: (num: any,
|
|
38
|
+
d2r0t: (num: any, fallback: any = 'NaN') => {
|
|
39
|
+
const result = bn(num);
|
|
40
|
+
return result.isNaN() ? fallback : result.decimalPlaces(2, bn.ROUND_DOWN).toFormat(2);
|
|
41
|
+
},
|
|
29
42
|
/** 保留6位小数,四舍五入,千位符 */
|
|
30
|
-
d6r5t: (num: any,
|
|
43
|
+
d6r5t: (num: any, fallback: any = 'NaN') => {
|
|
44
|
+
const result = bn(num);
|
|
45
|
+
return result.isNaN() ? fallback : result.decimalPlaces(6, bn.ROUND_HALF_UP).toFormat(6);
|
|
46
|
+
},
|
|
31
47
|
/** 保留6位小数,向下取整,千位符 */
|
|
32
|
-
d6r0t: (num: any,
|
|
48
|
+
d6r0t: (num: any, fallback: any = 'NaN') => {
|
|
49
|
+
const result = bn(num);
|
|
50
|
+
return result.isNaN() ? fallback : result.decimalPlaces(6, bn.ROUND_DOWN).toFormat(6);
|
|
51
|
+
},
|
|
33
52
|
/** 保留8位小数,四舍五入,千位符 */
|
|
34
|
-
d8r5t: (num: any,
|
|
53
|
+
d8r5t: (num: any, fallback: any = 'NaN') => {
|
|
54
|
+
const result = bn(num);
|
|
55
|
+
return result.isNaN() ? fallback : result.decimalPlaces(8, bn.ROUND_HALF_UP).toFormat(8);
|
|
56
|
+
},
|
|
35
57
|
/** 保留8位小数,向下取整,千位符 */
|
|
36
|
-
d8r0t: (num: any,
|
|
58
|
+
d8r0t: (num: any, fallback: any = 'NaN') => {
|
|
59
|
+
const result = bn(num);
|
|
60
|
+
return result.isNaN() ? fallback : result.decimalPlaces(8, bn.ROUND_DOWN).toFormat(8);
|
|
61
|
+
},
|
|
37
62
|
};
|
|
38
63
|
|
|
39
64
|
/**
|
|
@@ -43,7 +68,7 @@ export const numFmt = {
|
|
|
43
68
|
* @returns 金额的格式化字符串表示。
|
|
44
69
|
*/
|
|
45
70
|
export function toAmount(amount: any, decimal: string | number = 0) {
|
|
46
|
-
const res =
|
|
71
|
+
const res = bn(amount).div(bn(10).pow(Number(decimal)));
|
|
47
72
|
const fmt = (fmt: keyof typeof numFmt) => (numFmt[fmt] ?? numFmt.t)(res);
|
|
48
73
|
fmt.toString = () => numFmt.t(res);
|
|
49
74
|
|
package/utils/storage.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type MaybeRefOrGetter, computed, isReactive, reactive, toValue } from 'vue';
|
|
2
|
+
|
|
3
|
+
export class StorageKey<F extends Record<string, string | number>> {
|
|
4
|
+
public factors: F;
|
|
5
|
+
private split = '_';
|
|
6
|
+
|
|
7
|
+
public constructor(factors: F, private order: Array<keyof F>) {
|
|
8
|
+
this.factors = isReactive(factors) ? factors : reactive(factors) as F;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 构建存储键
|
|
13
|
+
* @param parts 键的部分
|
|
14
|
+
* @param excludeFactors 排除键的因素
|
|
15
|
+
*/
|
|
16
|
+
public build(parts: Array<MaybeRefOrGetter<F[string]>>, excludeFactors: Array<keyof F> | boolean = false) {
|
|
17
|
+
const finalKey = computed(() => {
|
|
18
|
+
const thisKeys = parts.map(k => String(toValue(k)));
|
|
19
|
+
const factorKeys = Array.isArray(excludeFactors)
|
|
20
|
+
? this.order.filter(k => !excludeFactors?.includes(k)).map(k => this.factors[k])
|
|
21
|
+
: excludeFactors
|
|
22
|
+
? []
|
|
23
|
+
: this.order.map(k => this.factors[k]);
|
|
24
|
+
const thisStr = thisKeys.join(this.split);
|
|
25
|
+
const factorStr = factorKeys.join(this.split);
|
|
26
|
+
return `${factorStr}${factorStr ? this.split : ''}${thisStr}`;
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
return finalKey;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { TabPane as ATabPane, Tabs as ATabs } from 'ant-design-vue';
|
|
3
|
-
import { injectTTAdmin } from '../../adminPlugin';
|
|
4
|
-
|
|
5
|
-
const pageTabStore = injectTTAdmin()!.deps.usePageTabStore();
|
|
6
|
-
</script>
|
|
7
|
-
|
|
8
|
-
<template>
|
|
9
|
-
<ATabs
|
|
10
|
-
class="app-page-tabs"
|
|
11
|
-
:activeKey="pageTabStore.activeTab"
|
|
12
|
-
type="editable-card"
|
|
13
|
-
size="small"
|
|
14
|
-
:animated="false"
|
|
15
|
-
:hideAdd="true"
|
|
16
|
-
:tabBarGutter="4"
|
|
17
|
-
@tabClick="(pageTabStore.openTab as any)"
|
|
18
|
-
@edit="(pageTabStore.closeTab as any)"
|
|
19
|
-
>
|
|
20
|
-
<ATabPane v-for="tab of pageTabStore.tabList" :key="tab.key" :tab="tab.title">
|
|
21
|
-
<template #closeIcon>
|
|
22
|
-
<i class="i-icon-park-outline:close" />
|
|
23
|
-
</template>
|
|
24
|
-
</ATabPane>
|
|
25
|
-
</ATabs>
|
|
26
|
-
</template>
|
|
27
|
-
|
|
28
|
-
<style scoped lang="scss">
|
|
29
|
-
.app-page-tabs {
|
|
30
|
-
:deep(.ant-tabs-nav) {
|
|
31
|
-
margin: 0;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
:deep(.ant-tabs-nav::before) {
|
|
35
|
-
display: none;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
:deep(.ant-tabs-tab) {
|
|
39
|
-
--uno: 'border-rd-3px! text-14px p-[3px_1px_3px_8px]! select-none';
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
:deep(.ant-tabs-tab .ant-tabs-tab-btn) {
|
|
43
|
-
transform: translateX(8px);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
:deep(.ant-tabs-tab-active) {
|
|
47
|
-
--uno: 'border-[currentColor]!';
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
:deep(.ant-tabs-tab-remove) {
|
|
51
|
-
display: flex;
|
|
52
|
-
height: 100%;
|
|
53
|
-
align-items: center;
|
|
54
|
-
margin: 0;
|
|
55
|
-
opacity: 0;
|
|
56
|
-
transition: all 150ms;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
:deep(.ant-tabs-tab:hover .ant-tabs-tab-btn),
|
|
60
|
-
:deep(.ant-tabs-tab-active .ant-tabs-tab-btn) {
|
|
61
|
-
transform: translateX(0);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
:deep(.ant-tabs-tab:hover .ant-tabs-tab-remove),
|
|
65
|
-
:deep(.ant-tabs-tab-active .ant-tabs-tab-remove) {
|
|
66
|
-
margin-left: 0;
|
|
67
|
-
opacity: 1;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
</style>
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { Router } from 'vue-router';
|
|
2
|
-
import { adminPlugin } from '../adminPlugin';
|
|
3
|
-
|
|
4
|
-
export function setupCollapseMenu(router: Router) {
|
|
5
|
-
const menuStore = adminPlugin.deps.useMenuStore();
|
|
6
|
-
|
|
7
|
-
router.beforeEach(() => {
|
|
8
|
-
menuStore.collapsed = false;
|
|
9
|
-
return true;
|
|
10
|
-
});
|
|
11
|
-
}
|
package/libs/a-calc.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from 'a-calc';
|