@gx-design-vue/create-gx-cli 0.1.3 → 0.1.5

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.
Files changed (102) hide show
  1. package/README.md +5 -12
  2. package/package.json +3 -2
  3. package/template-mobile-vant-cli/.editorconfig +19 -0
  4. package/template-mobile-vant-cli/.env +0 -0
  5. package/template-mobile-vant-cli/.env.development +19 -0
  6. package/template-mobile-vant-cli/.env.pro +19 -0
  7. package/template-mobile-vant-cli/.env.production +19 -0
  8. package/template-mobile-vant-cli/.eslintignore +15 -0
  9. package/template-mobile-vant-cli/.prettierignore +9 -0
  10. package/template-mobile-vant-cli/build/cdn.ts +5 -0
  11. package/template-mobile-vant-cli/build/generateModifyVars.ts +7 -0
  12. package/template-mobile-vant-cli/build/optimizer.ts +18 -0
  13. package/template-mobile-vant-cli/build/plugin/autoImport.ts +24 -0
  14. package/template-mobile-vant-cli/build/plugin/html.ts +26 -0
  15. package/template-mobile-vant-cli/build/plugin/index.ts +42 -0
  16. package/template-mobile-vant-cli/build/plugin/mock.ts +14 -0
  17. package/template-mobile-vant-cli/build/plugin/viteMock/client.ts +88 -0
  18. package/template-mobile-vant-cli/build/plugin/viteMock/createMockServer.ts +271 -0
  19. package/template-mobile-vant-cli/build/plugin/viteMock/index.ts +69 -0
  20. package/template-mobile-vant-cli/build/plugin/viteMock/types.ts +48 -0
  21. package/template-mobile-vant-cli/build/plugin/viteMock/utils.ts +48 -0
  22. package/template-mobile-vant-cli/build/script/postBuild.ts +14 -0
  23. package/template-mobile-vant-cli/eslint.config.js +49 -0
  24. package/template-mobile-vant-cli/index.html +24 -0
  25. package/template-mobile-vant-cli/mock/_createProductionServer.ts +19 -0
  26. package/template-mobile-vant-cli/mock/datasSource/api/index.ts +0 -0
  27. package/template-mobile-vant-cli/mock/utils.ts +9 -0
  28. package/template-mobile-vant-cli/package.json +57 -0
  29. package/template-mobile-vant-cli/postcss.config.cjs +8 -0
  30. package/template-mobile-vant-cli/prettier.config.cjs +18 -0
  31. package/template-mobile-vant-cli/public/favicon.ico +0 -0
  32. package/template-mobile-vant-cli/public/js/flexible.js +44 -0
  33. package/template-mobile-vant-cli/src/App.vue +5 -0
  34. package/template-mobile-vant-cli/src/components/PageContainer/ProSkeleton.tsx +29 -0
  35. package/template-mobile-vant-cli/src/components/PageContainer/index.tsx +115 -0
  36. package/template-mobile-vant-cli/src/components/PageContainer/style.module.less +14 -0
  37. package/template-mobile-vant-cli/src/core/gx-design/index.ts +7 -0
  38. package/template-mobile-vant-cli/src/core/index.ts +12 -0
  39. package/template-mobile-vant-cli/src/core/vant-design/index.ts +4 -0
  40. package/template-mobile-vant-cli/src/design/config.less +0 -0
  41. package/template-mobile-vant-cli/src/design/index.less +3 -0
  42. package/template-mobile-vant-cli/src/design/reset.less +155 -0
  43. package/template-mobile-vant-cli/src/design/root.less +3 -0
  44. package/template-mobile-vant-cli/src/design/vant.less +2 -0
  45. package/template-mobile-vant-cli/src/global.less +1 -0
  46. package/template-mobile-vant-cli/src/hooks/web/index.ts +5 -0
  47. package/template-mobile-vant-cli/src/hooks/web/usePageLoading.ts +58 -0
  48. package/template-mobile-vant-cli/src/layout/BasicLayout.vue +16 -0
  49. package/template-mobile-vant-cli/src/layout/basicLayout.less +11 -0
  50. package/template-mobile-vant-cli/src/main.ts +27 -0
  51. package/template-mobile-vant-cli/src/pages/home.vue +71 -0
  52. package/template-mobile-vant-cli/src/router/index.ts +25 -0
  53. package/template-mobile-vant-cli/src/router/routes.ts +20 -0
  54. package/template-mobile-vant-cli/src/router/typings.ts +8 -0
  55. package/template-mobile-vant-cli/src/services/index.ts +31 -0
  56. package/template-mobile-vant-cli/src/settings/index.ts +10 -0
  57. package/template-mobile-vant-cli/src/store/index.ts +17 -0
  58. package/template-mobile-vant-cli/src/store/modules/global.ts +30 -0
  59. package/template-mobile-vant-cli/src/utils/crypto/base64.ts +101 -0
  60. package/template-mobile-vant-cli/src/utils/crypto/index.ts +57 -0
  61. package/template-mobile-vant-cli/src/utils/env.ts +50 -0
  62. package/template-mobile-vant-cli/src/utils/pageTitle.ts +14 -0
  63. package/template-mobile-vant-cli/src/utils/request/XHR.ts +139 -0
  64. package/template-mobile-vant-cli/src/utils/request/axiosCancel.ts +69 -0
  65. package/template-mobile-vant-cli/src/utils/request/checkStatus.ts +9 -0
  66. package/template-mobile-vant-cli/src/utils/request/index.ts +142 -0
  67. package/template-mobile-vant-cli/src/utils/request/typings.ts +171 -0
  68. package/template-mobile-vant-cli/src/utils/storage.ts +198 -0
  69. package/template-mobile-vant-cli/src/utils/util.ts +27 -0
  70. package/template-mobile-vant-cli/src/utils/validate.ts +216 -0
  71. package/template-mobile-vant-cli/tsconfig.json +42 -0
  72. package/template-mobile-vant-cli/types/ant-design-import.d.ts +13 -0
  73. package/template-mobile-vant-cli/types/auto-imports.d.ts +64 -0
  74. package/template-mobile-vant-cli/types/components.d.ts +12 -0
  75. package/template-mobile-vant-cli/types/global.d.ts +39 -0
  76. package/template-mobile-vant-cli/types/module.d.ts +20 -0
  77. package/template-mobile-vant-cli/types/plugins-auto-import.d.ts +14 -0
  78. package/template-mobile-vant-cli/types/response.d.ts +15 -0
  79. package/template-mobile-vant-cli/types/vant-import.d.ts +13 -0
  80. package/template-mobile-vant-cli/unocss.config.ts +101 -0
  81. package/template-mobile-vant-cli/vite.config.ts +145 -0
  82. package/template-mobile-vant-html/css/global.css +293 -0
  83. package/template-mobile-vant-html/css/global.css.map +1 -0
  84. package/template-mobile-vant-html/css/global.less +293 -0
  85. package/template-mobile-vant-html/css/index.css +20 -0
  86. package/template-mobile-vant-html/css/index.css.map +1 -0
  87. package/template-mobile-vant-html/css/index.less +21 -0
  88. package/template-mobile-vant-html/image/disconnected.svg +60 -0
  89. package/template-mobile-vant-html/image/empty.svg +52 -0
  90. package/template-mobile-vant-html/image/error.svg +53 -0
  91. package/template-mobile-vant-html/image/loading.svg +1 -0
  92. package/template-mobile-vant-html/index.html +91 -0
  93. package/template-mobile-vant-html/js/index.js +29 -0
  94. package/template-mobile-vant-html/js/plugin/day.min.js +1 -0
  95. package/template-mobile-vant-html/js/plugin/fastclick.js +730 -0
  96. package/template-mobile-vant-html/js/plugin/jquery.min.js +2 -0
  97. package/template-mobile-vant-html/js/plugin/rem.js +28 -0
  98. package/template-mobile-vant-html/js/utils/appUtil.js +70 -0
  99. package/template-mobile-vant-html/js/utils/config.js +3 -0
  100. package/template-mobile-vant-html/js/utils/request.js +61 -0
  101. package/template-mobile-vant-html/js/utils/utils.js +65 -0
  102. 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
+ }
@@ -0,0 +1,9 @@
1
+ export const builder = (config?: Partial<ResponseResult>) => {
2
+ const code = config?.code || 200
3
+ const result: ResponseResult = {
4
+ ...config,
5
+ code,
6
+ msg: config?.msg || code ? 'success' : 'Request failed'
7
+ }
8
+ return result
9
+ }
@@ -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,8 @@
1
+ module.exports = {
2
+ plugins: {
3
+ 'postcss-pxtorem': {
4
+ rootValue: 37.5,
5
+ propList: ['*'],
6
+ },
7
+ },
8
+ };
@@ -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
+ };
@@ -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,5 @@
1
+ <template>
2
+ <div id="gx-pro-mobile">
3
+ <router-view />
4
+ </div>
5
+ </template>
@@ -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
@@ -0,0 +1,14 @@
1
+ .pageContainer {
2
+ width: 100%;
3
+ min-height: 100vh;
4
+ padding: 15px;
5
+ background: var(--van-background-3);
6
+
7
+ .pageContainerWrapper {
8
+ position: relative;
9
+ }
10
+
11
+ .skeletonItem + .skeletonItem {
12
+ margin-top: 50px;
13
+ }
14
+ }
@@ -0,0 +1,7 @@
1
+ import PageContainer from '@/components/PageContainer'
2
+
3
+ const vantDesign = (app) => {
4
+ app.component('g-pro-page-container', PageContainer)
5
+ }
6
+
7
+ export default vantDesign
@@ -0,0 +1,12 @@
1
+ import dayjs from 'dayjs'
2
+ import 'dayjs/locale/zh-cn'
3
+
4
+ dayjs.locale('zh-cn')
5
+
6
+ import vantDesign from './vant-design'
7
+ import gxDesign from './gx-design'
8
+
9
+ export function setupGlobCommon(app) {
10
+ gxDesign(app)
11
+ vantDesign(app)
12
+ }
@@ -0,0 +1,4 @@
1
+ const vantDesign = (_app) => {
2
+ }
3
+
4
+ export default vantDesign
@@ -0,0 +1,3 @@
1
+ @import './root';
2
+ @import './reset';
3
+ @import './vant';