@gx-design-vue/create-gx-cli 0.1.2 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +4 -11
- package/package.json +3 -2
- package/src/main.js +9 -3
- package/template-mobile-vant-cli/.env +0 -0
- package/template-mobile-vant-cli/.env.pro +1 -1
- package/template-mobile-vant-cli/.env.production +2 -2
- package/template-mobile-vant-cli/.eslintignore +0 -1
- package/template-mobile-vant-cli/build/plugin/autoImport.ts +8 -10
- package/template-mobile-vant-cli/build/plugin/index.ts +2 -10
- package/template-mobile-vant-cli/build/plugin/mock.ts +5 -11
- package/template-mobile-vant-cli/build/plugin/viteMock/client.ts +88 -0
- package/template-mobile-vant-cli/build/plugin/viteMock/createMockServer.ts +271 -0
- package/template-mobile-vant-cli/build/plugin/viteMock/index.ts +69 -0
- package/template-mobile-vant-cli/build/plugin/viteMock/types.ts +48 -0
- package/template-mobile-vant-cli/build/plugin/viteMock/utils.ts +48 -0
- package/template-mobile-vant-cli/eslint.config.js +49 -0
- package/template-mobile-vant-cli/mock/_createProductionServer.ts +4 -4
- package/template-mobile-vant-cli/mock/datasSource/api/index.ts +0 -0
- package/template-mobile-vant-cli/package.json +26 -33
- package/template-mobile-vant-cli/src/components/PageContainer/ProSkeleton.tsx +1 -2
- package/template-mobile-vant-cli/src/components/PageContainer/index.tsx +7 -6
- package/template-mobile-vant-cli/src/components/PageContainer/style.module.less +1 -1
- package/template-mobile-vant-cli/src/core/vant-design/index.ts +1 -1
- package/template-mobile-vant-cli/src/hooks/web/usePageLoading.ts +8 -5
- package/template-mobile-vant-cli/src/layout/BasicLayout.vue +3 -3
- package/template-mobile-vant-cli/src/pages/home.vue +27 -27
- package/template-mobile-vant-cli/src/router/index.ts +3 -2
- package/template-mobile-vant-cli/src/router/typings.ts +1 -1
- package/template-mobile-vant-cli/src/settings/index.ts +2 -2
- package/template-mobile-vant-cli/src/store/modules/global.ts +1 -1
- package/template-mobile-vant-cli/src/utils/crypto/base64.ts +101 -0
- package/template-mobile-vant-cli/src/utils/{cryptoJS.ts → crypto/index.ts} +23 -5
- package/template-mobile-vant-cli/src/utils/env.ts +15 -17
- package/template-mobile-vant-cli/src/utils/pageTitle.ts +5 -3
- package/template-mobile-vant-cli/src/utils/request/XHR.ts +38 -30
- package/template-mobile-vant-cli/src/utils/request/axiosCancel.ts +32 -23
- package/template-mobile-vant-cli/src/utils/request/checkStatus.ts +1 -3
- package/template-mobile-vant-cli/src/utils/request/index.ts +3 -4
- package/template-mobile-vant-cli/src/utils/request/typings.ts +74 -17
- package/template-mobile-vant-cli/src/utils/storage.ts +25 -18
- package/template-mobile-vant-cli/src/utils/util.ts +0 -5
- package/template-mobile-vant-cli/src/utils/validate.ts +191 -3
- package/template-mobile-vant-cli/tsconfig.json +8 -9
- package/template-mobile-vant-cli/types/{gx-components.d.ts → ant-design-import.d.ts} +3 -3
- package/template-mobile-vant-cli/types/auto-imports.d.ts +3 -0
- package/template-mobile-vant-cli/types/components.d.ts +2 -5
- package/template-mobile-vant-cli/types/global.d.ts +7 -4
- package/template-mobile-vant-cli/types/module.d.ts +15 -2
- package/template-mobile-vant-cli/types/plugins-auto-import.d.ts +14 -0
- package/template-mobile-vant-cli/types/response.d.ts +8 -5
- package/template-mobile-vant-cli/types/vant-import.d.ts +13 -0
- package/template-mobile-vant-cli/unocss.config.ts +101 -0
- package/template-mobile-vant-cli/vite.config.ts +43 -11
- package/template-mobile-vant-cli/.eslintrc.js +0 -64
- package/template-mobile-vant-cli/.stylelintignore +0 -3
- package/template-mobile-vant-cli/mock/api/index.ts +0 -66
- package/template-mobile-vant-cli/stylelint.config.js +0 -106
- /package/template-mobile-vant-cli/{postcss.config.js → postcss.config.cjs} +0 -0
- /package/template-mobile-vant-cli/{prettier.config.js → prettier.config.cjs} +0 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
import fs from 'node:fs'
|
2
|
+
|
3
|
+
const toString = Object.prototype.toString
|
4
|
+
|
5
|
+
export function is(val: unknown, type: string) {
|
6
|
+
return toString.call(val) === `[object ${type}]`
|
7
|
+
}
|
8
|
+
|
9
|
+
export function fileExists(f: string) {
|
10
|
+
try {
|
11
|
+
fs.accessSync(f, fs.constants.W_OK);
|
12
|
+
return true;
|
13
|
+
} catch (error) {
|
14
|
+
return false;
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
export function isFunction<T = Function>(val: unknown): val is T {
|
19
|
+
return is(val, 'Function') || is(val, 'AsyncFunction')
|
20
|
+
}
|
21
|
+
|
22
|
+
export function isArray(val: any): val is Array<any> {
|
23
|
+
return val && Array.isArray(val)
|
24
|
+
}
|
25
|
+
|
26
|
+
export function isRegExp(val: unknown): val is RegExp {
|
27
|
+
return is(val, 'RegExp')
|
28
|
+
}
|
29
|
+
|
30
|
+
export function isAbsPath(path: string | undefined) {
|
31
|
+
if (!path) {
|
32
|
+
return false
|
33
|
+
}
|
34
|
+
// Windows 路径格式:C:\ 或 \\ 开头,或已含盘符(D:\path\to\file)
|
35
|
+
if (/^([a-zA-Z]:\\|\\\\|(?:\/|\uFF0F){2,})/.test(path)) {
|
36
|
+
return true
|
37
|
+
}
|
38
|
+
// Unix/Linux 路径格式:/ 开头
|
39
|
+
return /^\/[^/]/.test(path)
|
40
|
+
}
|
41
|
+
|
42
|
+
export function sleep(time: number) {
|
43
|
+
return new Promise((resolve) => {
|
44
|
+
setTimeout(() => {
|
45
|
+
resolve('')
|
46
|
+
}, time)
|
47
|
+
})
|
48
|
+
}
|
@@ -0,0 +1,49 @@
|
|
1
|
+
import antFuEslint from '@antfu/eslint-config'
|
2
|
+
|
3
|
+
export default antFuEslint({
|
4
|
+
vue: true,
|
5
|
+
vueJsx: false,
|
6
|
+
typescript: true,
|
7
|
+
gitignore: true,
|
8
|
+
markdown: true,
|
9
|
+
ignores: [
|
10
|
+
'src/assets/**/*.js',
|
11
|
+
'build/plugin/viteMock',
|
12
|
+
'public',
|
13
|
+
'tsconfig.*.json',
|
14
|
+
'tsconfig.json'
|
15
|
+
]
|
16
|
+
}, {
|
17
|
+
rules: {
|
18
|
+
'curly': 0,
|
19
|
+
'no-console': 0,
|
20
|
+
'import/order': 0,
|
21
|
+
'style/quote-props': 0,
|
22
|
+
'style/brace-style': 0,
|
23
|
+
'style/comma-dangle': 0,
|
24
|
+
'style/multiline-ternary': 0,
|
25
|
+
'prefer-regex-literals': 0,
|
26
|
+
'antfu/top-level-function': 0,
|
27
|
+
'vue/array-bracket-spacing': 0,
|
28
|
+
'style/array-bracket-spacing': 0,
|
29
|
+
'node/prefer-global/process': 0,
|
30
|
+
'style/indent': 0,
|
31
|
+
'prefer-template': 0,
|
32
|
+
'dot-notation': 0,
|
33
|
+
'no-cond-assign': 0,
|
34
|
+
'no-useless-computed-key': 0,
|
35
|
+
'node/no-deprecated-api': 0,
|
36
|
+
'antfu/consistent-list-newline': 0,
|
37
|
+
'import/no-mutable-exports': 0,
|
38
|
+
'style/member-delimiter-style': 0,
|
39
|
+
'unused-imports/no-unused-imports': 0,
|
40
|
+
'eslint-comments/no-unlimited-disable': 0,
|
41
|
+
'no-async-promise-executor': 0,
|
42
|
+
'unicorn/escape-case': 0,
|
43
|
+
'ts/method-signature-style': 0,
|
44
|
+
'style/no-trailing-spaces': 0,
|
45
|
+
'ts/consistent-type-imports': 0,
|
46
|
+
'style/type-generic-spacing': 0,
|
47
|
+
'prefer-promise-reject-errors': 0
|
48
|
+
}
|
49
|
+
})
|
@@ -1,14 +1,14 @@
|
|
1
|
-
import { createProdMockServer } from '
|
1
|
+
import { createProdMockServer } from '../build/plugin/viteMock/client'
|
2
2
|
|
3
|
-
const modules = import.meta.
|
3
|
+
const modules = import.meta.glob('./datasSource/**/*.ts', { eager: true })
|
4
4
|
|
5
5
|
const mockModules: any[] = []
|
6
6
|
Object.keys(modules).forEach((key) => {
|
7
7
|
if (key.includes('/_')) {
|
8
8
|
return
|
9
9
|
}
|
10
|
-
if (modules[key] && modules[key]['default'])
|
11
|
-
|
10
|
+
if (modules[key] && modules[key]['default'])
|
11
|
+
mockModules.push(...modules[key]['default'])
|
12
12
|
})
|
13
13
|
|
14
14
|
/**
|
File without changes
|
@@ -1,42 +1,44 @@
|
|
1
1
|
{
|
2
2
|
"name": "gx-mobile-cli",
|
3
3
|
"version": "0.0.0",
|
4
|
+
"type": "module",
|
4
5
|
"scripts": {
|
5
6
|
"dev": "vite",
|
6
|
-
"
|
7
|
-
"build
|
7
|
+
"start:pro": "cross-env VITE_APP_ENV=pro vite",
|
8
|
+
"build": "vite build",
|
9
|
+
"build:pro": "vite build --mode pro",
|
8
10
|
"preview": "vite preview"
|
9
11
|
},
|
10
12
|
"dependencies": {
|
11
|
-
"@gx-design-vue/pro-hooks": "^0.
|
12
|
-
"@gx-design-vue/pro-utils": "^0.
|
13
|
-
"@vueuse/core": "^
|
14
|
-
"@vueuse/shared": "^
|
15
|
-
"axios": "^1.
|
13
|
+
"@gx-design-vue/pro-hooks": "^0.2.0-beta.19",
|
14
|
+
"@gx-design-vue/pro-utils": "^0.2.0-beta.26",
|
15
|
+
"@vueuse/core": "^10.7.2",
|
16
|
+
"@vueuse/shared": "^10.7.2",
|
17
|
+
"axios": "^1.6.7",
|
16
18
|
"crypto-js": "^4.1.1",
|
17
19
|
"dayjs": "^1.11.6",
|
18
20
|
"lodash-es": "^4.17.21",
|
19
|
-
"
|
20
|
-
"mockjs": "^1.1.0",
|
21
|
-
"pinia": "^2.0.23",
|
21
|
+
"pinia": "2.1.7",
|
22
22
|
"qs": "^6.11.0",
|
23
|
-
"
|
24
|
-
"
|
25
|
-
"vue": "^3.2.45",
|
23
|
+
"vant": "^4.8.8",
|
24
|
+
"vue": "^3.3.7",
|
26
25
|
"vue-router": "^4.1.6"
|
27
26
|
},
|
28
27
|
"devDependencies": {
|
28
|
+
"@antfu/eslint-config": "^2.9.0",
|
29
29
|
"@types/lodash-es": "^4.17.4",
|
30
|
-
"@types/node": "^
|
30
|
+
"@types/node": "^20.11.19",
|
31
31
|
"@typescript-eslint/eslint-plugin": "^5.20.0",
|
32
32
|
"@typescript-eslint/parser": "^5.20.0",
|
33
|
-
"@vitejs/plugin-vue": "^
|
34
|
-
"@vitejs/plugin-vue-jsx": "^3.
|
33
|
+
"@vitejs/plugin-vue": "^5.0.4",
|
34
|
+
"@vitejs/plugin-vue-jsx": "^3.1.0",
|
35
35
|
"autoprefixer": "^10.4.13",
|
36
|
-
"
|
37
|
-
"
|
38
|
-
"
|
39
|
-
"
|
36
|
+
"unocss": "^0.58.5",
|
37
|
+
"mockjs": "^1.1.0",
|
38
|
+
"cross-env": "^7.0.3",
|
39
|
+
"connect": "^3.7.0",
|
40
|
+
"path-to-regexp": "^6.2.1",
|
41
|
+
"bundle-require": "^4.0.1",
|
40
42
|
"less": "^4.1.3",
|
41
43
|
"less-loader": "^11.1.0",
|
42
44
|
"postcss": "^8.4.18",
|
@@ -44,21 +46,12 @@
|
|
44
46
|
"postcss-less": "^6.0.0",
|
45
47
|
"postcss-pxtorem": "^6.0.0",
|
46
48
|
"prettier": "^2.7.1",
|
47
|
-
"
|
48
|
-
"stylelint": "^14.7.1",
|
49
|
-
"stylelint-config-prettier": "^9.0.3",
|
50
|
-
"stylelint-config-recommended": "^7.0.0",
|
51
|
-
"stylelint-config-recommended-vue": "^1.4.0",
|
52
|
-
"stylelint-config-standard": "^25.0.0",
|
53
|
-
"stylelint-order": "^5.0.0",
|
54
|
-
"typescript": "^4.6.4",
|
49
|
+
"typescript": "^5.3.3",
|
55
50
|
"unplugin-auto-import": "^0.11.4",
|
56
51
|
"unplugin-vue-components": "^0.22.9",
|
57
|
-
"vite": "^
|
52
|
+
"vite": "^5.1.4",
|
58
53
|
"vite-plugin-html": "^3.2.0",
|
59
|
-
"vite-plugin-mock": "^2.9.6",
|
60
54
|
"vite-plugin-vue-setup-extend": "^0.4.0",
|
61
|
-
"vue-
|
62
|
-
"vue-tsc": "^1.0.9"
|
55
|
+
"vue-tsc": "^1.8.27"
|
63
56
|
}
|
64
|
-
}
|
57
|
+
}
|
@@ -5,10 +5,9 @@ import styles from './style.module.less'
|
|
5
5
|
import 'vant/es/skeleton/style'
|
6
6
|
|
7
7
|
const Proskeleton: FunctionalComponent<{ line: number; loading: boolean }> = (props, { slots }) => {
|
8
|
-
|
9
8
|
const renderMapItem = () => {
|
10
9
|
const show = []
|
11
|
-
for(let i = 0; i < props.line; i += 1) {
|
10
|
+
for (let i = 0; i < props.line; i += 1) {
|
12
11
|
show.push(
|
13
12
|
<div class={styles.skeletonItem}>
|
14
13
|
<Skeleton row={3} loading />
|
@@ -14,21 +14,21 @@ const PageContainer = defineComponent({
|
|
14
14
|
name: 'GProPageContainer',
|
15
15
|
inheritAttrs: false,
|
16
16
|
props: {
|
17
|
-
loading: Boolean as
|
17
|
+
loading: Boolean as VuePropType<boolean>,
|
18
18
|
hiddenSlot: {
|
19
|
-
type: Boolean as
|
19
|
+
type: Boolean as VuePropType<boolean>,
|
20
20
|
default: true
|
21
21
|
},
|
22
22
|
loadingMsg: {
|
23
|
-
type: String as
|
23
|
+
type: String as VuePropType<string>,
|
24
24
|
default: '加载中'
|
25
25
|
},
|
26
26
|
loadingType: {
|
27
|
-
type: String as
|
27
|
+
type: String as VuePropType<PageLoadingTpe>,
|
28
28
|
default: 'toast'
|
29
29
|
},
|
30
30
|
bgcolor: {
|
31
|
-
type: String as
|
31
|
+
type: String as VuePropType<string>,
|
32
32
|
default: '#fafafa'
|
33
33
|
}
|
34
34
|
},
|
@@ -47,7 +47,8 @@ const PageContainer = defineComponent({
|
|
47
47
|
})
|
48
48
|
|
49
49
|
watch(() => loading.value, (val) => {
|
50
|
-
if (initStatus.value && val)
|
50
|
+
if (initStatus.value && val)
|
51
|
+
initStatus.value = false
|
51
52
|
emit('update:loading', val)
|
52
53
|
}, {
|
53
54
|
deep: true,
|
@@ -3,7 +3,11 @@ import { ref, watch } from 'vue'
|
|
3
3
|
import { closeToast, showLoadingToast } from 'vant'
|
4
4
|
import type { PageLoadingTpe } from '@/components/PageContainer'
|
5
5
|
|
6
|
-
export
|
6
|
+
export interface SetLoadingParams<T> {
|
7
|
+
value: T;
|
8
|
+
type?: PageLoadingTpe;
|
9
|
+
message?: string
|
10
|
+
}
|
7
11
|
|
8
12
|
type ChangeLoadingFn<T> = ({ value, type, message }: SetLoadingParams<T>) => void
|
9
13
|
|
@@ -16,9 +20,7 @@ export default function usePageLoading<T, R = Ref<T>>({
|
|
16
20
|
defaultMessage?: string;
|
17
21
|
defaultLoading?: T | (() => T);
|
18
22
|
}): [ R, ChangeLoadingFn<T> ] {
|
19
|
-
|
20
|
-
const initValue: T =
|
21
|
-
typeof defaultLoading === 'function' ? (defaultLoading as any)() : defaultLoading
|
23
|
+
const initValue: T = typeof defaultLoading === 'function' ? (defaultLoading as any)() : defaultLoading
|
22
24
|
|
23
25
|
const pageLoading = ref(initValue) as Ref<T>
|
24
26
|
|
@@ -48,7 +50,8 @@ export default function usePageLoading<T, R = Ref<T>>({
|
|
48
50
|
const changeLoading = ({ value, type, message }: SetLoadingParams<T>) => {
|
49
51
|
pageLoading.value = value
|
50
52
|
loadingMessage.value = message
|
51
|
-
if (type)
|
53
|
+
if (type)
|
54
|
+
loadingType.value = type
|
52
55
|
}
|
53
56
|
|
54
57
|
return [ pageLoading as unknown as R, changeLoading ]
|
@@ -1,3 +1,6 @@
|
|
1
|
+
<script setup lang="ts">
|
2
|
+
</script>
|
3
|
+
|
1
4
|
<template>
|
2
5
|
<div :class="$style['basic-layout']">
|
3
6
|
<RouterView>
|
@@ -8,9 +11,6 @@
|
|
8
11
|
</div>
|
9
12
|
</template>
|
10
13
|
|
11
|
-
<script setup lang="ts">
|
12
|
-
</script>
|
13
|
-
|
14
14
|
<style lang="less" module>
|
15
15
|
@import './basicLayout';
|
16
16
|
</style>
|
@@ -1,22 +1,3 @@
|
|
1
|
-
<template>
|
2
|
-
<g-pro-page-container
|
3
|
-
ref="pageContainer"
|
4
|
-
v-model:loading="loading"
|
5
|
-
:loadingMsg="loadingMsg"
|
6
|
-
:hiddenSlot="hiddenSlot"
|
7
|
-
>
|
8
|
-
<div style="display: flex;flex-direction: column;gap: 20px;">
|
9
|
-
<p>以下刷新只针对toast</p>
|
10
|
-
<van-button @click="init(true)">刷新(隐藏子组件)</van-button>
|
11
|
-
<van-button @click="init(false)">刷新(不隐藏子组件)</van-button>
|
12
|
-
<van-button @click="changeLoading('切换中')">切换loading提示语</van-button>
|
13
|
-
<van-button @click="toggleLoading(true)">刷新-调用方法-隐藏</van-button>
|
14
|
-
<van-button @click="toggleLoading(false)">刷新-调用方法-不隐藏</van-button>
|
15
|
-
<van-button @click="toggleLoading(false, '切换中')">刷新-调用方法-不隐藏-切换提示语</van-button>
|
16
|
-
</div>
|
17
|
-
</g-pro-page-container>
|
18
|
-
</template>
|
19
|
-
|
20
1
|
<script setup lang="ts">
|
21
2
|
import { isBoolean } from '@gx-design-vue/pro-utils'
|
22
3
|
|
@@ -25,21 +6,22 @@ const pageContainer = ref()
|
|
25
6
|
const loadingMsg = ref('加载中')
|
26
7
|
const hiddenSlot = ref(true)
|
27
8
|
|
28
|
-
onMounted(() => {
|
29
|
-
init()
|
30
|
-
})
|
31
|
-
|
32
9
|
const init = (val?: boolean) => {
|
33
10
|
loadingMsg.value = '加载中'
|
34
11
|
loading.value = true
|
35
|
-
|
36
|
-
if (isBoolean(val))
|
37
|
-
|
12
|
+
|
13
|
+
if (isBoolean(val))
|
14
|
+
hiddenSlot.value = val
|
15
|
+
|
38
16
|
setTimeout(() => {
|
39
17
|
loading.value = false
|
40
18
|
}, 1000)
|
41
19
|
}
|
42
20
|
|
21
|
+
onMounted(() => {
|
22
|
+
init()
|
23
|
+
})
|
24
|
+
|
43
25
|
const changeLoading = (message: string) => {
|
44
26
|
loadingMsg.value = message
|
45
27
|
loading.value = true
|
@@ -64,8 +46,26 @@ const toggleLoading = (hiddenSlot: boolean, message?: string) => {
|
|
64
46
|
})
|
65
47
|
}, 1000)
|
66
48
|
}
|
67
|
-
|
68
49
|
</script>
|
69
50
|
|
51
|
+
<template>
|
52
|
+
<g-pro-page-container
|
53
|
+
ref="pageContainer"
|
54
|
+
v-model:loading="loading"
|
55
|
+
:loadingMsg="loadingMsg"
|
56
|
+
:hiddenSlot="hiddenSlot"
|
57
|
+
>
|
58
|
+
<div style="display: flex;flex-direction: column;gap: 20px;">
|
59
|
+
<p>以下刷新只针对toast</p>
|
60
|
+
<van-button @click="init(true)">刷新(隐藏子组件)</van-button>
|
61
|
+
<van-button @click="init(false)">刷新(不隐藏子组件)</van-button>
|
62
|
+
<van-button @click="changeLoading('切换中')">切换loading提示语</van-button>
|
63
|
+
<van-button @click="toggleLoading(true)">刷新-调用方法-隐藏</van-button>
|
64
|
+
<van-button @click="toggleLoading(false)">刷新-调用方法-不隐藏</van-button>
|
65
|
+
<van-button @click="toggleLoading(false, '切换中')">刷新-调用方法-不隐藏-切换提示语</van-button>
|
66
|
+
</div>
|
67
|
+
</g-pro-page-container>
|
68
|
+
</template>
|
69
|
+
|
70
70
|
<style lang="less" scoped>
|
71
71
|
</style>
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import type { App } from 'vue'
|
2
|
-
import {
|
2
|
+
import type { RouteRecordRaw } from 'vue-router'
|
3
|
+
import { createRouter, createWebHashHistory } from 'vue-router'
|
3
4
|
import settings from '@/settings'
|
4
5
|
import getPageTitle from '@/utils/pageTitle'
|
5
6
|
import { constantRoutes } from './routes'
|
@@ -18,7 +19,7 @@ const doRouterPermission = () => {
|
|
18
19
|
|
19
20
|
// 配置路由器
|
20
21
|
export function setupRouter(app: App<Element>) {
|
21
|
-
app.use(router)
|
22
|
+
app.use(router)
|
22
23
|
|
23
24
|
doRouterPermission()
|
24
25
|
}
|
@@ -0,0 +1,101 @@
|
|
1
|
+
export default class Base64 {
|
2
|
+
_keyStr: string
|
3
|
+
|
4
|
+
constructor() {
|
5
|
+
this._keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
|
6
|
+
}
|
7
|
+
|
8
|
+
_utf8_encode(string: string) {
|
9
|
+
string = string.replace(/\r\n/g, '\n')
|
10
|
+
let utftext = ''
|
11
|
+
for (let n = 0; n < string.length; n++) {
|
12
|
+
const c = string.charCodeAt(n)
|
13
|
+
if (c < 128) {
|
14
|
+
utftext += String.fromCharCode(c)
|
15
|
+
} else if ((c > 127) && (c < 2048)) {
|
16
|
+
utftext += String.fromCharCode((c >> 6) | 192)
|
17
|
+
utftext += String.fromCharCode((c & 63) | 128)
|
18
|
+
} else {
|
19
|
+
utftext += String.fromCharCode((c >> 12) | 224)
|
20
|
+
utftext += String.fromCharCode(((c >> 6) & 63) | 128)
|
21
|
+
utftext += String.fromCharCode((c & 63) | 128)
|
22
|
+
}
|
23
|
+
}
|
24
|
+
return utftext
|
25
|
+
}
|
26
|
+
|
27
|
+
_utf8_decode(utftext: string) {
|
28
|
+
let string = ''
|
29
|
+
let i = 0
|
30
|
+
let c = 0
|
31
|
+
let c1 = 0
|
32
|
+
let c2 = 0
|
33
|
+
while (i < utftext.length) {
|
34
|
+
c = utftext.charCodeAt(i)
|
35
|
+
if (c < 128) {
|
36
|
+
string += String.fromCharCode(c)
|
37
|
+
i++
|
38
|
+
} else if ((c > 191) && (c < 224)) {
|
39
|
+
c1 = utftext.charCodeAt(i + 1)
|
40
|
+
string += String.fromCharCode(((c & 31) << 6) | (c1 & 63))
|
41
|
+
i += 2
|
42
|
+
} else {
|
43
|
+
c1 = utftext.charCodeAt(i + 1)
|
44
|
+
c2 = utftext.charCodeAt(i + 2)
|
45
|
+
string += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63))
|
46
|
+
i += 3
|
47
|
+
}
|
48
|
+
}
|
49
|
+
return string
|
50
|
+
}
|
51
|
+
|
52
|
+
encode(input: string) {
|
53
|
+
let output = ''
|
54
|
+
let chr1, chr2, chr3, enc1, enc2, enc3, enc4
|
55
|
+
let i = 0
|
56
|
+
input = this._utf8_encode(input)
|
57
|
+
while (i < input.length) {
|
58
|
+
chr1 = input.charCodeAt(i++)
|
59
|
+
chr2 = input.charCodeAt(i++)
|
60
|
+
chr3 = input.charCodeAt(i++)
|
61
|
+
enc1 = chr1 >> 2
|
62
|
+
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4)
|
63
|
+
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6)
|
64
|
+
enc4 = chr3 & 63
|
65
|
+
if (Number.isNaN(chr2)) {
|
66
|
+
enc3 = enc4 = 64
|
67
|
+
} else if (Number.isNaN(chr3)) {
|
68
|
+
enc4 = 64
|
69
|
+
}
|
70
|
+
output = output + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + this._keyStr.charAt(
|
71
|
+
enc3) + this._keyStr.charAt(enc4)
|
72
|
+
}
|
73
|
+
return output
|
74
|
+
}
|
75
|
+
|
76
|
+
decode(input: string) {
|
77
|
+
let output = ''
|
78
|
+
let chr1, chr2, chr3
|
79
|
+
let enc1, enc2, enc3, enc4
|
80
|
+
let i = 0
|
81
|
+
input = input.replace(/[^A-Za-z0-9+/=]/g, '')
|
82
|
+
while (i < input.length) {
|
83
|
+
enc1 = this._keyStr.indexOf(input.charAt(i++))
|
84
|
+
enc2 = this._keyStr.indexOf(input.charAt(i++))
|
85
|
+
enc3 = this._keyStr.indexOf(input.charAt(i++))
|
86
|
+
enc4 = this._keyStr.indexOf(input.charAt(i++))
|
87
|
+
chr1 = (enc1 << 2) | (enc2 >> 4)
|
88
|
+
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2)
|
89
|
+
chr3 = ((enc3 & 3) << 6) | enc4
|
90
|
+
output = output + String.fromCharCode(chr1)
|
91
|
+
if (enc3 !== 64) {
|
92
|
+
output = output + String.fromCharCode(chr2)
|
93
|
+
}
|
94
|
+
if (enc4 !== 64) {
|
95
|
+
output = output + String.fromCharCode(chr3)
|
96
|
+
}
|
97
|
+
}
|
98
|
+
output = this._utf8_decode(output)
|
99
|
+
return output
|
100
|
+
}
|
101
|
+
}
|
@@ -2,12 +2,28 @@ import 'crypto-js/enc-utf8'
|
|
2
2
|
import 'crypto-js/tripledes'
|
3
3
|
import 'crypto-js/sha1'
|
4
4
|
import * as CryptoJS from 'crypto-js/core'
|
5
|
+
import CryptoProJS from 'crypto-js'
|
5
6
|
import { isJSONStr } from '@/utils/validate'
|
6
|
-
import {
|
7
|
+
import { isArray, isObject } from '@gx-design-vue/pro-utils'
|
7
8
|
|
8
|
-
const key = '1234123412ABCDEF'
|
9
|
+
const key = '1234123412ABCDEF' // 十六位十六进制数作为密钥
|
9
10
|
|
10
|
-
|
11
|
+
/**
|
12
|
+
* 登录密码加密
|
13
|
+
* @param password
|
14
|
+
* @returns {string}
|
15
|
+
*/
|
16
|
+
export const encodePassword = (password: string) => {
|
17
|
+
const key = CryptoProJS.enc.Utf8.parse('8QONwyJtHesysWpM')
|
18
|
+
const passwordENC = CryptoProJS.AES.encrypt(password, key, {
|
19
|
+
mode: CryptoProJS.mode.ECB,
|
20
|
+
padding: CryptoProJS.pad.Pkcs7
|
21
|
+
})
|
22
|
+
const encodePW = passwordENC.ciphertext.toString()
|
23
|
+
return encodePW
|
24
|
+
}
|
25
|
+
|
26
|
+
// 加密方法
|
11
27
|
export function Encrypt(word) {
|
12
28
|
let str: string | object = word
|
13
29
|
if (isObject(word) || isArray(word)) {
|
@@ -23,7 +39,7 @@ export function Encrypt(word) {
|
|
23
39
|
return CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
|
24
40
|
}
|
25
41
|
|
26
|
-
|
42
|
+
// 解密方法
|
27
43
|
export function Decrypt(word) {
|
28
44
|
const keyHex = CryptoJS.enc.Utf8.parse(key)
|
29
45
|
const ivHex = CryptoJS.enc.Utf8.parse(key)
|
@@ -35,5 +51,7 @@ export function Decrypt(word) {
|
|
35
51
|
padding: CryptoJS.pad.Pkcs7
|
36
52
|
})
|
37
53
|
const decryptedStr = decrypted.toString(CryptoJS.enc.Utf8)
|
38
|
-
return isJSONStr(decryptedStr.toString())
|
54
|
+
return isJSONStr(decryptedStr.toString())
|
55
|
+
? JSON.parse(decryptedStr.toString())
|
56
|
+
: decryptedStr.toString()
|
39
57
|
}
|
@@ -2,49 +2,47 @@
|
|
2
2
|
* @Author gx12358
|
3
3
|
* @DateTime 2022/4/1
|
4
4
|
* @lastTime 2022/4/1
|
5
|
-
* @description
|
5
|
+
* @description 环境:本地开发环境
|
6
6
|
*/
|
7
7
|
export function isDev(): boolean {
|
8
|
-
|
9
|
-
return DEV
|
8
|
+
return typeViteEnv('VITE_APP_ENV') === 'dev'
|
10
9
|
}
|
11
10
|
|
12
11
|
/**
|
13
12
|
* @Author gx12358
|
14
13
|
* @DateTime 2022/4/1
|
15
14
|
* @lastTime 2022/4/1
|
16
|
-
* @description
|
15
|
+
* @description 环境:正式
|
17
16
|
*/
|
18
|
-
export function
|
19
|
-
|
20
|
-
return PRO
|
17
|
+
export function isPro(): boolean {
|
18
|
+
return typeViteEnv('VITE_USE_MODE') === 'pro'
|
21
19
|
}
|
22
20
|
|
23
21
|
/**
|
24
22
|
* @Author gx12358
|
25
23
|
* @DateTime 2022/4/1
|
26
24
|
* @lastTime 2022/4/1
|
27
|
-
* @description
|
25
|
+
* @description 环境:非本地开发环境
|
28
26
|
*/
|
29
|
-
export function
|
30
|
-
return typeViteEnv('
|
27
|
+
export function isBuild(): boolean {
|
28
|
+
return typeViteEnv('VITE_NODE_ENV') === 'production'
|
31
29
|
}
|
32
30
|
|
33
31
|
/**
|
34
32
|
* @Author gx12358
|
35
33
|
* @DateTime 2022/4/1
|
36
34
|
* @lastTime 2022/4/1
|
37
|
-
* @description
|
35
|
+
* @description 当前联调环境
|
38
36
|
*/
|
39
|
-
export function
|
40
|
-
return typeViteEnv('VITE_USE_MODE')
|
37
|
+
export function currentMode() {
|
38
|
+
return typeViteEnv('VITE_USE_MODE')
|
41
39
|
}
|
42
40
|
|
43
|
-
export function typeViteEnv(key:
|
44
|
-
let value = import.meta.env[key]
|
45
|
-
if (value) {
|
46
|
-
value = (value as string).replace(/\\n/g, '\n')
|
41
|
+
export function typeViteEnv<T extends keyof ViteEnv>(key: T): ViteEnv[T] | undefined {
|
42
|
+
let value: any = (import.meta as any).env[key]
|
47
43
|
|
44
|
+
if (value && typeof value === 'string') {
|
45
|
+
value = value.replace(/\\n/g, '\n') as ViteEnv[T]
|
48
46
|
value = value === 'true' ? true : value === 'false' ? false : value
|
49
47
|
}
|
50
48
|
|