@gx-design-vue/create-gx-cli 0.1.3 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +5 -12
- package/package.json +3 -2
- package/template-mobile-vant-cli/.editorconfig +19 -0
- package/template-mobile-vant-cli/.env +0 -0
- package/template-mobile-vant-cli/.env.development +19 -0
- package/template-mobile-vant-cli/.env.pro +19 -0
- package/template-mobile-vant-cli/.env.production +19 -0
- package/template-mobile-vant-cli/.eslintignore +15 -0
- package/template-mobile-vant-cli/.prettierignore +9 -0
- package/template-mobile-vant-cli/build/cdn.ts +5 -0
- package/template-mobile-vant-cli/build/generateModifyVars.ts +7 -0
- package/template-mobile-vant-cli/build/optimizer.ts +18 -0
- package/template-mobile-vant-cli/build/plugin/autoImport.ts +24 -0
- package/template-mobile-vant-cli/build/plugin/html.ts +26 -0
- package/template-mobile-vant-cli/build/plugin/index.ts +42 -0
- package/template-mobile-vant-cli/build/plugin/mock.ts +14 -0
- 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/build/script/postBuild.ts +14 -0
- package/template-mobile-vant-cli/eslint.config.js +49 -0
- package/template-mobile-vant-cli/index.html +24 -0
- package/template-mobile-vant-cli/mock/_createProductionServer.ts +19 -0
- package/template-mobile-vant-cli/mock/datasSource/api/index.ts +0 -0
- package/template-mobile-vant-cli/mock/utils.ts +9 -0
- package/template-mobile-vant-cli/package.json +57 -0
- package/template-mobile-vant-cli/postcss.config.cjs +8 -0
- package/template-mobile-vant-cli/prettier.config.cjs +18 -0
- package/template-mobile-vant-cli/public/favicon.ico +0 -0
- package/template-mobile-vant-cli/public/js/flexible.js +44 -0
- package/template-mobile-vant-cli/src/App.vue +5 -0
- package/template-mobile-vant-cli/src/components/PageContainer/ProSkeleton.tsx +29 -0
- package/template-mobile-vant-cli/src/components/PageContainer/index.tsx +115 -0
- package/template-mobile-vant-cli/src/components/PageContainer/style.module.less +14 -0
- package/template-mobile-vant-cli/src/core/gx-design/index.ts +7 -0
- package/template-mobile-vant-cli/src/core/index.ts +12 -0
- package/template-mobile-vant-cli/src/core/vant-design/index.ts +4 -0
- package/template-mobile-vant-cli/src/design/config.less +0 -0
- package/template-mobile-vant-cli/src/design/index.less +3 -0
- package/template-mobile-vant-cli/src/design/reset.less +155 -0
- package/template-mobile-vant-cli/src/design/root.less +3 -0
- package/template-mobile-vant-cli/src/design/vant.less +2 -0
- package/template-mobile-vant-cli/src/global.less +1 -0
- package/template-mobile-vant-cli/src/hooks/web/index.ts +5 -0
- package/template-mobile-vant-cli/src/hooks/web/usePageLoading.ts +58 -0
- package/template-mobile-vant-cli/src/layout/BasicLayout.vue +16 -0
- package/template-mobile-vant-cli/src/layout/basicLayout.less +11 -0
- package/template-mobile-vant-cli/src/main.ts +27 -0
- package/template-mobile-vant-cli/src/pages/home.vue +71 -0
- package/template-mobile-vant-cli/src/router/index.ts +25 -0
- package/template-mobile-vant-cli/src/router/routes.ts +20 -0
- package/template-mobile-vant-cli/src/router/typings.ts +8 -0
- package/template-mobile-vant-cli/src/services/index.ts +31 -0
- package/template-mobile-vant-cli/src/settings/index.ts +10 -0
- package/template-mobile-vant-cli/src/store/index.ts +17 -0
- package/template-mobile-vant-cli/src/store/modules/global.ts +30 -0
- package/template-mobile-vant-cli/src/utils/crypto/base64.ts +101 -0
- package/template-mobile-vant-cli/src/utils/crypto/index.ts +57 -0
- package/template-mobile-vant-cli/src/utils/env.ts +50 -0
- package/template-mobile-vant-cli/src/utils/pageTitle.ts +14 -0
- package/template-mobile-vant-cli/src/utils/request/XHR.ts +139 -0
- package/template-mobile-vant-cli/src/utils/request/axiosCancel.ts +69 -0
- package/template-mobile-vant-cli/src/utils/request/checkStatus.ts +9 -0
- package/template-mobile-vant-cli/src/utils/request/index.ts +142 -0
- package/template-mobile-vant-cli/src/utils/request/typings.ts +171 -0
- package/template-mobile-vant-cli/src/utils/storage.ts +198 -0
- package/template-mobile-vant-cli/src/utils/util.ts +27 -0
- package/template-mobile-vant-cli/src/utils/validate.ts +216 -0
- package/template-mobile-vant-cli/tsconfig.json +42 -0
- package/template-mobile-vant-cli/types/ant-design-import.d.ts +13 -0
- package/template-mobile-vant-cli/types/auto-imports.d.ts +64 -0
- package/template-mobile-vant-cli/types/components.d.ts +12 -0
- package/template-mobile-vant-cli/types/global.d.ts +39 -0
- package/template-mobile-vant-cli/types/module.d.ts +20 -0
- package/template-mobile-vant-cli/types/plugins-auto-import.d.ts +14 -0
- package/template-mobile-vant-cli/types/response.d.ts +15 -0
- 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 +145 -0
- package/template-mobile-vant-html/css/global.css +293 -0
- package/template-mobile-vant-html/css/global.css.map +1 -0
- package/template-mobile-vant-html/css/global.less +293 -0
- package/template-mobile-vant-html/css/index.css +20 -0
- package/template-mobile-vant-html/css/index.css.map +1 -0
- package/template-mobile-vant-html/css/index.less +21 -0
- package/template-mobile-vant-html/image/disconnected.svg +60 -0
- package/template-mobile-vant-html/image/empty.svg +52 -0
- package/template-mobile-vant-html/image/error.svg +53 -0
- package/template-mobile-vant-html/image/loading.svg +1 -0
- package/template-mobile-vant-html/index.html +91 -0
- package/template-mobile-vant-html/js/index.js +29 -0
- package/template-mobile-vant-html/js/plugin/day.min.js +1 -0
- package/template-mobile-vant-html/js/plugin/fastclick.js +730 -0
- package/template-mobile-vant-html/js/plugin/jquery.min.js +2 -0
- package/template-mobile-vant-html/js/plugin/rem.js +28 -0
- package/template-mobile-vant-html/js/utils/appUtil.js +70 -0
- package/template-mobile-vant-html/js/utils/config.js +3 -0
- package/template-mobile-vant-html/js/utils/request.js +61 -0
- package/template-mobile-vant-html/js/utils/utils.js +65 -0
- package/template-mobile-vant-html/js/utils/validate.js +292 -0
@@ -0,0 +1,69 @@
|
|
1
|
+
(async () => {
|
2
|
+
try {
|
3
|
+
await import('mockjs')
|
4
|
+
} catch (e) {
|
5
|
+
throw new Error('vite-plugin-vue-mock requires mockjs to be present in the dependency tree.')
|
6
|
+
}
|
7
|
+
})()
|
8
|
+
|
9
|
+
import type { Plugin, ResolvedConfig } from 'vite'
|
10
|
+
import { normalizePath } from 'vite'
|
11
|
+
import path from 'node:path'
|
12
|
+
import type { ViteMockOptions } from './types'
|
13
|
+
import { fileExists } from './utils'
|
14
|
+
import { createMockServer, requestMiddleware } from './createMockServer'
|
15
|
+
|
16
|
+
function getDefaultPath(supportTs = true) {
|
17
|
+
return path.resolve(process.cwd(), `src/main.${supportTs ? 'ts' : 'js'}`)
|
18
|
+
}
|
19
|
+
|
20
|
+
export function viteMockServe(opt: ViteMockOptions = {}): Plugin {
|
21
|
+
let isDev = false
|
22
|
+
let needSourcemap = false
|
23
|
+
let config: ResolvedConfig
|
24
|
+
let defaultPath = getDefaultPath()
|
25
|
+
if (!fileExists(defaultPath)) {
|
26
|
+
defaultPath = getDefaultPath(false)
|
27
|
+
if (!fileExists(defaultPath)) {
|
28
|
+
defaultPath = ''
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
const defaultEnter = normalizePath(defaultPath)
|
33
|
+
|
34
|
+
const { injectFile = defaultEnter } = opt
|
35
|
+
|
36
|
+
return {
|
37
|
+
name: 'vite:mock',
|
38
|
+
enforce: 'pre' as const,
|
39
|
+
configResolved(resolvedConfig) {
|
40
|
+
config = resolvedConfig
|
41
|
+
isDev = config.command === 'serve'
|
42
|
+
needSourcemap = !!resolvedConfig.build.sourcemap
|
43
|
+
isDev && createMockServer(opt, config)
|
44
|
+
},
|
45
|
+
|
46
|
+
configureServer: async ({ middlewares }) => {
|
47
|
+
const { enable = isDev } = opt
|
48
|
+
if (!enable) {
|
49
|
+
return
|
50
|
+
}
|
51
|
+
const middleware = await requestMiddleware(opt)
|
52
|
+
middlewares.use(middleware)
|
53
|
+
},
|
54
|
+
transform: (code, id) => {
|
55
|
+
if (isDev || !injectFile || !id.endsWith(injectFile)) {
|
56
|
+
return null
|
57
|
+
}
|
58
|
+
|
59
|
+
const { injectCode = '' } = opt
|
60
|
+
|
61
|
+
return {
|
62
|
+
map: needSourcemap ? this.getCombinedSourcemap() : null,
|
63
|
+
code: `${code}\n${injectCode}`
|
64
|
+
}
|
65
|
+
}
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
export * from './types'
|
@@ -0,0 +1,48 @@
|
|
1
|
+
import { IncomingMessage, ServerResponse } from 'http'
|
2
|
+
|
3
|
+
export interface ViteMockOptions {
|
4
|
+
mockPath?: string;
|
5
|
+
configPath?: string;
|
6
|
+
injectFile?: string;
|
7
|
+
injectCode?: string;
|
8
|
+
ignore?: RegExp | ((fileName: string) => boolean);
|
9
|
+
watchFiles?: boolean;
|
10
|
+
enable?: boolean;
|
11
|
+
cors?: boolean;
|
12
|
+
/**
|
13
|
+
* Automatic recognition, no need to configure again
|
14
|
+
* @deprecated Deprecated after 2.8.0
|
15
|
+
*/
|
16
|
+
supportTs?: boolean;
|
17
|
+
logger?: boolean;
|
18
|
+
}
|
19
|
+
|
20
|
+
export interface RespThisType {
|
21
|
+
req: IncomingMessage
|
22
|
+
res: ServerResponse
|
23
|
+
parseJson: () => any
|
24
|
+
}
|
25
|
+
|
26
|
+
export type MethodType = 'get' | 'post' | 'put' | 'delete' | 'patch'
|
27
|
+
|
28
|
+
export type Recordable<T = any> = Record<string, T>
|
29
|
+
|
30
|
+
export declare interface MockMethod {
|
31
|
+
url: string
|
32
|
+
method?: MethodType
|
33
|
+
timeout?: number
|
34
|
+
statusCode?: number
|
35
|
+
response?:
|
36
|
+
| ((
|
37
|
+
this: RespThisType,
|
38
|
+
opt: { url: Recordable; body: Recordable; query: Recordable; headers: Recordable },
|
39
|
+
) => any)
|
40
|
+
| any
|
41
|
+
rawResponse?: (this: RespThisType, req: IncomingMessage, res: ServerResponse) => void
|
42
|
+
}
|
43
|
+
|
44
|
+
export interface MockConfig {
|
45
|
+
env: Record<string, any>
|
46
|
+
mode: string
|
47
|
+
command: 'build' | 'serve'
|
48
|
+
}
|
@@ -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,14 @@
|
|
1
|
+
// #!/usr/bin/env node
|
2
|
+
import chalk from 'chalk'
|
3
|
+
|
4
|
+
import pkg from '../../package.json'
|
5
|
+
|
6
|
+
export const runBuild = async () => {
|
7
|
+
try {
|
8
|
+
console.log(`✨ ${chalk.cyan(`[${pkg.name}]`)}` + ' - build successfully!')
|
9
|
+
} catch (error) {
|
10
|
+
console.log(chalk.red('vite build error:\n' + error))
|
11
|
+
process.exit(1)
|
12
|
+
}
|
13
|
+
}
|
14
|
+
runBuild()
|
@@ -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
|
+
})
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="zh">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8" />
|
5
|
+
<link rel="icon" href="/favicon.ico" type="image/x-icon" />
|
6
|
+
<meta
|
7
|
+
name="viewport"
|
8
|
+
content="width=device-width,viewport-fit=cover,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"
|
9
|
+
/>
|
10
|
+
<title>vue-vant-mobile</title>
|
11
|
+
<% for (var i in injectLink) { %>
|
12
|
+
<link rel="stylesheet" type="text/css" href="<%= injectLink[i] %>" />
|
13
|
+
<% } %>
|
14
|
+
</head>
|
15
|
+
<body>
|
16
|
+
<div id="app"></div>
|
17
|
+
<% for (var i in injectScript) { %>
|
18
|
+
<script type="text/javascript" src="<%= injectScript[i] %>"></script>
|
19
|
+
<% } %>
|
20
|
+
<script type="module" src="/src/main.ts"></script>
|
21
|
+
<%- injectVlogScript %>
|
22
|
+
<script src="/js/flexible.js"></script>
|
23
|
+
</body>
|
24
|
+
</html>
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { createProdMockServer } from '../build/plugin/viteMock/client'
|
2
|
+
|
3
|
+
const modules = import.meta.glob('./datasSource/**/*.ts', { eager: true })
|
4
|
+
|
5
|
+
const mockModules: any[] = []
|
6
|
+
Object.keys(modules).forEach((key) => {
|
7
|
+
if (key.includes('/_')) {
|
8
|
+
return
|
9
|
+
}
|
10
|
+
if (modules[key] && modules[key]['default'])
|
11
|
+
mockModules.push(...modules[key]['default'])
|
12
|
+
})
|
13
|
+
|
14
|
+
/**
|
15
|
+
* Used in a production environment. Need to manually import all modules
|
16
|
+
*/
|
17
|
+
export function setupProdMockServer() {
|
18
|
+
createProdMockServer(mockModules)
|
19
|
+
}
|
File without changes
|
@@ -0,0 +1,57 @@
|
|
1
|
+
{
|
2
|
+
"name": "gx-mobile-cli",
|
3
|
+
"version": "0.0.0",
|
4
|
+
"type": "module",
|
5
|
+
"scripts": {
|
6
|
+
"dev": "vite",
|
7
|
+
"start:pro": "cross-env VITE_APP_ENV=pro vite",
|
8
|
+
"build": "vite build",
|
9
|
+
"build:pro": "vite build --mode pro",
|
10
|
+
"preview": "vite preview"
|
11
|
+
},
|
12
|
+
"dependencies": {
|
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",
|
18
|
+
"crypto-js": "^4.1.1",
|
19
|
+
"dayjs": "^1.11.6",
|
20
|
+
"lodash-es": "^4.17.21",
|
21
|
+
"pinia": "2.1.7",
|
22
|
+
"qs": "^6.11.0",
|
23
|
+
"vant": "^4.8.8",
|
24
|
+
"vue": "^3.3.7",
|
25
|
+
"vue-router": "^4.1.6"
|
26
|
+
},
|
27
|
+
"devDependencies": {
|
28
|
+
"@antfu/eslint-config": "^2.9.0",
|
29
|
+
"@types/lodash-es": "^4.17.4",
|
30
|
+
"@types/node": "^20.11.19",
|
31
|
+
"@typescript-eslint/eslint-plugin": "^5.20.0",
|
32
|
+
"@typescript-eslint/parser": "^5.20.0",
|
33
|
+
"@vitejs/plugin-vue": "^5.0.4",
|
34
|
+
"@vitejs/plugin-vue-jsx": "^3.1.0",
|
35
|
+
"autoprefixer": "^10.4.13",
|
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",
|
42
|
+
"less": "^4.1.3",
|
43
|
+
"less-loader": "^11.1.0",
|
44
|
+
"postcss": "^8.4.18",
|
45
|
+
"postcss-html": "^1.5.0",
|
46
|
+
"postcss-less": "^6.0.0",
|
47
|
+
"postcss-pxtorem": "^6.0.0",
|
48
|
+
"prettier": "^2.7.1",
|
49
|
+
"typescript": "^5.3.3",
|
50
|
+
"unplugin-auto-import": "^0.11.4",
|
51
|
+
"unplugin-vue-components": "^0.22.9",
|
52
|
+
"vite": "^5.1.4",
|
53
|
+
"vite-plugin-html": "^3.2.0",
|
54
|
+
"vite-plugin-vue-setup-extend": "^0.4.0",
|
55
|
+
"vue-tsc": "^1.8.27"
|
56
|
+
}
|
57
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module.exports = {
|
2
|
+
printWidth: 100,
|
3
|
+
useTabs: false,
|
4
|
+
semi: false,
|
5
|
+
singleQuote: true,
|
6
|
+
quoteProps: 'as-needed',
|
7
|
+
bracketSpacing: true,
|
8
|
+
trailingComma: 'none',
|
9
|
+
jsxBracketSameLine: false,
|
10
|
+
jsxSingleQuote: false,
|
11
|
+
arrowParens: 'always',
|
12
|
+
insertPragma: false,
|
13
|
+
requirePragma: false,
|
14
|
+
proseWrap: 'never',
|
15
|
+
htmlWhitespaceSensitivity: 'strict',
|
16
|
+
endOfLine: 'auto',
|
17
|
+
rangeStart: 0,
|
18
|
+
};
|
Binary file
|
@@ -0,0 +1,44 @@
|
|
1
|
+
(function flexible (window, document) {
|
2
|
+
var docEl = document.documentElement
|
3
|
+
var dpr = window.devicePixelRatio || 1
|
4
|
+
|
5
|
+
// adjust body font size
|
6
|
+
function setBodyFontSize () {
|
7
|
+
if (document.body) {
|
8
|
+
document.body.style.fontSize = (12 * dpr) + 'px'
|
9
|
+
}
|
10
|
+
else {
|
11
|
+
document.addEventListener('DOMContentLoaded', setBodyFontSize)
|
12
|
+
}
|
13
|
+
}
|
14
|
+
setBodyFontSize();
|
15
|
+
|
16
|
+
// set 1rem = viewWidth / 10
|
17
|
+
function setRemUnit () {
|
18
|
+
var rem = (docEl.clientWidth < 600 ? docEl.clientWidth : 600) / 10
|
19
|
+
docEl.style.fontSize = rem + 'px'
|
20
|
+
}
|
21
|
+
|
22
|
+
setRemUnit()
|
23
|
+
|
24
|
+
// reset rem unit on page resize
|
25
|
+
window.addEventListener('resize', setRemUnit)
|
26
|
+
window.addEventListener('pageshow', function (e) {
|
27
|
+
if (e.persisted) {
|
28
|
+
setRemUnit()
|
29
|
+
}
|
30
|
+
})
|
31
|
+
|
32
|
+
// detect 0.5px supports
|
33
|
+
if (dpr >= 2) {
|
34
|
+
var fakeBody = document.createElement('body')
|
35
|
+
var testElement = document.createElement('div')
|
36
|
+
testElement.style.border = '.5px solid transparent'
|
37
|
+
fakeBody.appendChild(testElement)
|
38
|
+
docEl.appendChild(fakeBody)
|
39
|
+
if (testElement.offsetHeight === 1) {
|
40
|
+
docEl.classList.add('hairlines')
|
41
|
+
}
|
42
|
+
docEl.removeChild(fakeBody)
|
43
|
+
}
|
44
|
+
}(window, document))
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import type { FunctionalComponent } from 'vue'
|
2
|
+
import { Skeleton } from 'vant'
|
3
|
+
import styles from './style.module.less'
|
4
|
+
|
5
|
+
import 'vant/es/skeleton/style'
|
6
|
+
|
7
|
+
const Proskeleton: FunctionalComponent<{ line: number; loading: boolean }> = (props, { slots }) => {
|
8
|
+
const renderMapItem = () => {
|
9
|
+
const show = []
|
10
|
+
for (let i = 0; i < props.line; i += 1) {
|
11
|
+
show.push(
|
12
|
+
<div class={styles.skeletonItem}>
|
13
|
+
<Skeleton row={3} loading />
|
14
|
+
</div>
|
15
|
+
)
|
16
|
+
}
|
17
|
+
return show
|
18
|
+
}
|
19
|
+
|
20
|
+
return (
|
21
|
+
<>
|
22
|
+
{
|
23
|
+
props.loading ? renderMapItem() : <>{ slots.default?.() }</>
|
24
|
+
}
|
25
|
+
</>
|
26
|
+
)
|
27
|
+
}
|
28
|
+
|
29
|
+
export default Proskeleton
|
@@ -0,0 +1,115 @@
|
|
1
|
+
import { defineComponent, toRefs, watch } from 'vue'
|
2
|
+
import { usePageLoading } from '@gx-mobile/hooks/web'
|
3
|
+
import ProSkeleton from './ProSkeleton'
|
4
|
+
import styles from './style.module.less'
|
5
|
+
import type { SetLoadingParams } from '@gx-mobile/hooks/web/usePageLoading'
|
6
|
+
|
7
|
+
export type PageLoadingTpe = 'toast' | 'skeleton'
|
8
|
+
|
9
|
+
type ChangeLoadingParams<T> = Omit<SetLoadingParams<T>, 'type'> & {
|
10
|
+
hiddenSlot?: boolean;
|
11
|
+
}
|
12
|
+
|
13
|
+
const PageContainer = defineComponent({
|
14
|
+
name: 'GProPageContainer',
|
15
|
+
inheritAttrs: false,
|
16
|
+
props: {
|
17
|
+
loading: Boolean as VuePropType<boolean>,
|
18
|
+
hiddenSlot: {
|
19
|
+
type: Boolean as VuePropType<boolean>,
|
20
|
+
default: true
|
21
|
+
},
|
22
|
+
loadingMsg: {
|
23
|
+
type: String as VuePropType<string>,
|
24
|
+
default: '加载中'
|
25
|
+
},
|
26
|
+
loadingType: {
|
27
|
+
type: String as VuePropType<PageLoadingTpe>,
|
28
|
+
default: 'toast'
|
29
|
+
},
|
30
|
+
bgcolor: {
|
31
|
+
type: String as VuePropType<string>,
|
32
|
+
default: '#fafafa'
|
33
|
+
}
|
34
|
+
},
|
35
|
+
emits: [ 'update:loading' ],
|
36
|
+
setup(props, { slots, expose, emit }) {
|
37
|
+
const { loading: loadingRef, loadingType, loadingMsg, hiddenSlot } = toRefs(props)
|
38
|
+
|
39
|
+
const initStatus = ref(true)
|
40
|
+
|
41
|
+
const hiddenSlotRef = ref(props.hiddenSlot)
|
42
|
+
|
43
|
+
const [ loading, setLoading ] = usePageLoading({
|
44
|
+
defaultType: loadingType.value,
|
45
|
+
defaultMessage: loadingMsg.value,
|
46
|
+
defaultLoading: loadingRef.value
|
47
|
+
})
|
48
|
+
|
49
|
+
watch(() => loading.value, (val) => {
|
50
|
+
if (initStatus.value && val)
|
51
|
+
initStatus.value = false
|
52
|
+
emit('update:loading', val)
|
53
|
+
}, {
|
54
|
+
deep: true,
|
55
|
+
immediate: true
|
56
|
+
})
|
57
|
+
|
58
|
+
watch(() => loadingRef.value, (val) => {
|
59
|
+
if (loadingType.value === 'toast') {
|
60
|
+
setLoading({
|
61
|
+
value: val,
|
62
|
+
type: loadingType.value,
|
63
|
+
message: loadingMsg.value
|
64
|
+
})
|
65
|
+
} else if (initStatus.value || !val) {
|
66
|
+
setLoading({
|
67
|
+
value: val,
|
68
|
+
type: loadingType.value,
|
69
|
+
message: loadingMsg.value
|
70
|
+
})
|
71
|
+
}
|
72
|
+
})
|
73
|
+
|
74
|
+
watch(() => hiddenSlot.value, (val) => {
|
75
|
+
hiddenSlotRef.value = val
|
76
|
+
}, {
|
77
|
+
immediate: true
|
78
|
+
})
|
79
|
+
|
80
|
+
const changeLoading = ({
|
81
|
+
value,
|
82
|
+
message,
|
83
|
+
hiddenSlot
|
84
|
+
}: ChangeLoadingParams<boolean>) => {
|
85
|
+
if (loadingType.value === 'toast') {
|
86
|
+
hiddenSlotRef.value = hiddenSlot
|
87
|
+
setLoading({ value, message, type: loadingType.value })
|
88
|
+
}
|
89
|
+
}
|
90
|
+
|
91
|
+
expose({
|
92
|
+
toggleLoading: changeLoading
|
93
|
+
})
|
94
|
+
|
95
|
+
return () => {
|
96
|
+
return (
|
97
|
+
<div class={styles.pageContainer} style={{ backgroundColor: props.bgcolor }}>
|
98
|
+
<div class={styles.pageContainerWrapper}>
|
99
|
+
{
|
100
|
+
loadingType.value === 'skeleton'
|
101
|
+
? (
|
102
|
+
<ProSkeleton line={3} loading={loading.value}>
|
103
|
+
{slots.default?.()}
|
104
|
+
</ProSkeleton>
|
105
|
+
)
|
106
|
+
: ((!loading.value || !hiddenSlotRef.value) && <>{slots.default?.()}</>)
|
107
|
+
}
|
108
|
+
</div>
|
109
|
+
</div>
|
110
|
+
)
|
111
|
+
}
|
112
|
+
}
|
113
|
+
})
|
114
|
+
|
115
|
+
export default PageContainer
|
File without changes
|