af-mobile-client-vue3 1.0.54

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 (156) hide show
  1. package/.editorconfig +38 -0
  2. package/.env +7 -0
  3. package/.env.development +4 -0
  4. package/.env.envoiceShow +7 -0
  5. package/.env.production +7 -0
  6. package/.husky/commit-msg +1 -0
  7. package/.husky/pre-commit +1 -0
  8. package/.vscode/extensions.json +7 -0
  9. package/.vscode/settings.json +61 -0
  10. package/LICENSE +21 -0
  11. package/README.md +181 -0
  12. package/af-example-mobile-vue-web.iml +9 -0
  13. package/build/vite/index.ts +91 -0
  14. package/build/vite/vconsole.ts +44 -0
  15. package/eslint.config.js +7 -0
  16. package/index.html +17 -0
  17. package/mock/data.ts +20 -0
  18. package/mock/index.ts +5 -0
  19. package/mock/modules/prose.mock.ts +16 -0
  20. package/mock/modules/user.mock.ts +152 -0
  21. package/netlify.toml +12 -0
  22. package/package.json +107 -0
  23. package/public/favicon-dark.svg +4 -0
  24. package/public/favicon.ico +0 -0
  25. package/public/favicon.svg +4 -0
  26. package/public/pwa-192x192.png +0 -0
  27. package/public/pwa-512x512.png +0 -0
  28. package/public/safari-pinned-tab.svg +32 -0
  29. package/scripts/verifyCommit.js +19 -0
  30. package/src/App.vue +43 -0
  31. package/src/api/mock/index.ts +30 -0
  32. package/src/api/user/index.ts +40 -0
  33. package/src/assets/common/default-user-profile.png +0 -0
  34. package/src/assets/img/apps/apply-web.png +0 -0
  35. package/src/assets/img/apps/example-web.png +0 -0
  36. package/src/assets/img/apps/iot-web.png +0 -0
  37. package/src/assets/img/apps/linepatrol-web.png +0 -0
  38. package/src/assets/img/apps/monitor-web.png +0 -0
  39. package/src/assets/img/apps/oa-web.png +0 -0
  40. package/src/assets/img/apps/revenue-web.png +0 -0
  41. package/src/assets/img/apps/safe-check-web.png +0 -0
  42. package/src/assets/img/component/logo.png +0 -0
  43. package/src/assets/img/home/banner1.png +0 -0
  44. package/src/assets/img/home/banner2.png +0 -0
  45. package/src/assets/img/home/banner3.png +0 -0
  46. package/src/assets/img/home/banner4.png +0 -0
  47. package/src/assets/img/home/notice/icon.png +0 -0
  48. package/src/assets/img/user/login/background-shadow-1.svg +20 -0
  49. package/src/assets/img/user/login/logo-background.svg +20 -0
  50. package/src/assets/img/user/login/logo.png +0 -0
  51. package/src/assets/img/user/my/exit-login.png +0 -0
  52. package/src/assets/img/user/my/setting-arrow.png +0 -0
  53. package/src/assets/img/user/my/setting.png +0 -0
  54. package/src/bootstrap.ts +32 -0
  55. package/src/components/core/App/MicroAppView.vue +59 -0
  56. package/src/components/core/BeautifulLoading/index.vue +47 -0
  57. package/src/components/core/NavBar/index.vue +12 -0
  58. package/src/components/core/SvgIcon/index.vue +61 -0
  59. package/src/components/core/Tabbar/index.vue +38 -0
  60. package/src/components/core/Uploader/index.vue +104 -0
  61. package/src/components/core/XMultiSelect/index.vue +196 -0
  62. package/src/components/core/XSelect/index.vue +130 -0
  63. package/src/components/data/XBadge/index.vue +85 -0
  64. package/src/components/data/XCellDetail/index.vue +106 -0
  65. package/src/components/data/XCellList/index.vue +358 -0
  66. package/src/components/data/XCellListFilter/index.vue +392 -0
  67. package/src/components/data/XForm/index.vue +127 -0
  68. package/src/components/data/XFormItem/index.vue +472 -0
  69. package/src/components/data/XReportForm/XReportFormJsonRender.vue +220 -0
  70. package/src/components/data/XReportForm/index.vue +1058 -0
  71. package/src/components/layout/NormalDataLayout/index.vue +70 -0
  72. package/src/components/layout/TabBarLayout/index.vue +40 -0
  73. package/src/components.d.ts +53 -0
  74. package/src/enums/requestEnum.ts +25 -0
  75. package/src/env.d.ts +16 -0
  76. package/src/font-style/PingFangSC-Regular.woff2 +0 -0
  77. package/src/font-style/font.css +4 -0
  78. package/src/hooks/useCommon.ts +9 -0
  79. package/src/hooks/useLogin.ts +97 -0
  80. package/src/icons/svg/bird.svg +1 -0
  81. package/src/icons/svg/check-in.svg +33 -0
  82. package/src/icons/svg/dark.svg +5 -0
  83. package/src/icons/svg/github.svg +5 -0
  84. package/src/icons/svg/light.svg +5 -0
  85. package/src/icons/svg/link.svg +5 -0
  86. package/src/icons/svg/loadError.svg +1 -0
  87. package/src/icons/svg/notFound.svg +1 -0
  88. package/src/icons/svgo.yml +22 -0
  89. package/src/layout/PageLayout.vue +51 -0
  90. package/src/layout/SingleLayout.vue +35 -0
  91. package/src/locales/en-US.json +25 -0
  92. package/src/locales/zh-CN.json +25 -0
  93. package/src/main.ts +48 -0
  94. package/src/plugins/AppData.ts +38 -0
  95. package/src/plugins/GetLoginInfoService.ts +10 -0
  96. package/src/plugins/index.ts +11 -0
  97. package/src/router/README.md +8 -0
  98. package/src/router/guards.ts +60 -0
  99. package/src/router/index.ts +60 -0
  100. package/src/router/invoiceRoutes.ts +33 -0
  101. package/src/router/routes.ts +84 -0
  102. package/src/services/api/Login.ts +6 -0
  103. package/src/services/api/common.ts +98 -0
  104. package/src/services/api/index.ts +7 -0
  105. package/src/services/api/manage.ts +8 -0
  106. package/src/services/restTools.ts +37 -0
  107. package/src/settings.ts +1 -0
  108. package/src/stores/index.ts +7 -0
  109. package/src/stores/modules/cachedView.ts +31 -0
  110. package/src/stores/modules/counter.ts +19 -0
  111. package/src/stores/modules/routeTransitionName.ts +26 -0
  112. package/src/stores/modules/setting.ts +28 -0
  113. package/src/stores/modules/user.ts +180 -0
  114. package/src/stores/mutation-type.ts +7 -0
  115. package/src/styles/app.less +67 -0
  116. package/src/styles/login.less +81 -0
  117. package/src/typing.ts +3 -0
  118. package/src/utils/Storage.ts +124 -0
  119. package/src/utils/authority-utils.ts +87 -0
  120. package/src/utils/common.ts +41 -0
  121. package/src/utils/crypto.ts +39 -0
  122. package/src/utils/dataUtil.ts +42 -0
  123. package/src/utils/dictUtil.ts +51 -0
  124. package/src/utils/http/index.ts +158 -0
  125. package/src/utils/i18n.ts +41 -0
  126. package/src/utils/indexedDB.ts +180 -0
  127. package/src/utils/local-storage.ts +9 -0
  128. package/src/utils/mobileUtil.ts +26 -0
  129. package/src/utils/progress.ts +19 -0
  130. package/src/utils/routerUtil.ts +271 -0
  131. package/src/utils/set-page-title.ts +7 -0
  132. package/src/utils/validate.ts +6 -0
  133. package/src/views/chat/index.vue +153 -0
  134. package/src/views/common/LoadError.vue +64 -0
  135. package/src/views/common/NotFound.vue +68 -0
  136. package/src/views/component/EvaluateRecordView/index.vue +40 -0
  137. package/src/views/component/XCellDetailView/index.vue +216 -0
  138. package/src/views/component/XCellListView/index.vue +36 -0
  139. package/src/views/component/XFormView/index.vue +478 -0
  140. package/src/views/component/XReportFormIframeView/index.vue +45 -0
  141. package/src/views/component/XReportFormView/index.vue +295 -0
  142. package/src/views/component/index.vue +111 -0
  143. package/src/views/component/menu.vue +117 -0
  144. package/src/views/component/notice.vue +46 -0
  145. package/src/views/component/topNav.vue +36 -0
  146. package/src/views/invoiceShow/index.vue +62 -0
  147. package/src/views/user/login/ForgetPasswordForm.vue +93 -0
  148. package/src/views/user/login/LoginForm.vue +145 -0
  149. package/src/views/user/login/LoginTitle.vue +68 -0
  150. package/src/views/user/login/LoginWave.vue +109 -0
  151. package/src/views/user/login/index.vue +22 -0
  152. package/src/views/user/my/index.vue +230 -0
  153. package/src/vue-router.d.ts +9 -0
  154. package/tsconfig.json +43 -0
  155. package/uno.config.ts +32 -0
  156. package/vite.config.ts +110 -0
package/.editorconfig ADDED
@@ -0,0 +1,38 @@
1
+ [*]
2
+ charset=utf-8
3
+ end_of_line=lf
4
+ insert_final_newline=false
5
+ indent_style=space
6
+ indent_size=2
7
+
8
+ [{*.ng,*.sht,*.html,*.shtm,*.shtml,*.htm}]
9
+ indent_style=space
10
+ indent_size=2
11
+
12
+ [{*.jhm,*.xslt,*.xul,*.rng,*.xsl,*.xsd,*.ant,*.tld,*.fxml,*.jrxml,*.xml,*.jnlp,*.wsdl}]
13
+ indent_style=space
14
+ indent_size=2
15
+
16
+ [{.babelrc,.stylelintrc,jest.config,.eslintrc,.prettierrc,*.json,*.jsb3,*.jsb2,*.bowerrc}]
17
+ indent_style=space
18
+ indent_size=2
19
+
20
+ [*.svg]
21
+ indent_style=space
22
+ indent_size=2
23
+
24
+ [*.js.map]
25
+ indent_style=space
26
+ indent_size=2
27
+
28
+ [*.less]
29
+ indent_style=space
30
+ indent_size=2
31
+
32
+ [{*.vue,*.ts,*.tsx}]
33
+ indent_style=space
34
+ indent_size=2
35
+
36
+ [{.analysis_options,*.yml,*.yaml}]
37
+ indent_style=space
38
+ indent_size=2
package/.env ADDED
@@ -0,0 +1,7 @@
1
+ VITE_APP_PUBLIC_PATH=/example-web
2
+ VITE_APP_PREVIEW=true
3
+ VITE_APP_API_BASE_URL=/api
4
+ VITE_APP_WEB_CONFIG_KEY=admin.webconfig
5
+ VITE_APP_SYSTEM_NAME=af-system
6
+ # 最低兼容性 V4(最新产品)V3(V3产品) OA(公司OA)
7
+ VITE_APP_COMPATIBLE=OA
@@ -0,0 +1,4 @@
1
+ NODE_ENV=development
2
+ VITE_APP_PUBLIC_PATH=/
3
+ VITE_APP_PREVIEW=true
4
+ VITE_APP_API_BASE_URL=/api
@@ -0,0 +1,7 @@
1
+ VITE_APP_PUBLIC_PATH=/invoiceShow
2
+ VITE_APP_PREVIEW=true
3
+ VITE_APP_API_BASE_URL=/api
4
+ VITE_APP_WEB_CONFIG_KEY=admin.webconfig
5
+ VITE_APP_SYSTEM_NAME=af-system
6
+ # 最低兼容性 V4(最新产品)V3(V3产品) OA(公司OA)
7
+ VITE_APP_COMPATIBLE=V4
@@ -0,0 +1,7 @@
1
+ VITE_APP_PUBLIC_PATH=/
2
+ VITE_APP_PREVIEW=true
3
+ VITE_APP_API_BASE_URL=/api
4
+ VITE_APP_WEB_CONFIG_KEY=admin.webconfig
5
+ VITE_APP_SYSTEM_NAME=af-system
6
+ # 最低兼容性 V4(最新产品)V3(V3产品) OA(公司OA)
7
+ VITE_APP_COMPATIBLE=V4
@@ -0,0 +1 @@
1
+ node scripts/verifyCommit.js
@@ -0,0 +1 @@
1
+ pnpm lint
@@ -0,0 +1,7 @@
1
+ {
2
+ "recommendations": [
3
+ "Vue.volar",
4
+ "antfu.unocss",
5
+ "simonhe.common-intellisense"
6
+ ]
7
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ // Enable the ESlint flat config support
3
+ "eslint.experimental.useFlatConfig": true,
4
+
5
+ // Disable the default formatter, use eslint instead
6
+ "prettier.enable": false,
7
+ "editor.formatOnSave": false,
8
+
9
+ // Auto fix
10
+ "editor.codeActionsOnSave": {
11
+ "source.fixAll": "explicit",
12
+ "source.organizeImports": "never"
13
+ },
14
+
15
+ // Disable the MD033 rule
16
+ "markdownlint.config": {
17
+ "default": true,
18
+ "MD033": false
19
+ },
20
+
21
+ // Silent the stylistic rules in you IDE, but still auto fix them
22
+ "eslint.rules.customizations": [
23
+ { "rule": "style/*", "severity": "off" },
24
+ { "rule": "*-indent", "severity": "off" },
25
+ { "rule": "*-spacing", "severity": "off" },
26
+ { "rule": "*-spaces", "severity": "off" },
27
+ { "rule": "*-order", "severity": "off" },
28
+ { "rule": "*-dangle", "severity": "off" },
29
+ { "rule": "*-newline", "severity": "off" },
30
+ { "rule": "*quotes", "severity": "off" },
31
+ { "rule": "*semi", "severity": "off" }
32
+ ],
33
+
34
+ // Enable eslint for all supported languages
35
+ "eslint.validate": [
36
+ "javascript",
37
+ "javascriptreact",
38
+ "typescript",
39
+ "typescriptreact",
40
+ "vue",
41
+ "html",
42
+ "markdown",
43
+ "json",
44
+ "jsonc",
45
+ "yaml"
46
+ ],
47
+
48
+ // Specify the UI library you need to prompt
49
+ "common-intellisense.showSlots": false,
50
+ "common-intellisense.ui": [
51
+ "vant4"
52
+ ],
53
+
54
+ // Configuration of i18n i18n-ally
55
+ "i18n-ally.enabledParsers": ["json"],
56
+ "i18n-ally.displayLanguage": "zh-CN",
57
+ "i18n-ally.localesPaths": [
58
+ "src/locales"
59
+ ],
60
+ "i18n-ally.keystyle": "nested"
61
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Charlie Wang
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,181 @@
1
+ <h1 align="center">af-system-mobile-vue-web</h1>
2
+
3
+ <p align="center">基于v4架构的vue移动端主应用</p>
4
+
5
+ <h1 align="center">介绍</h1>
6
+
7
+ 🔥 脚手架选用Vue3-Vant-Mobile,一个集成 Vue3、Vite5、Vant4、Pinia2、Vitest、TypeScript 构建的集成最新技术栈、完整干净的移动端模板 -> [Github](https://github.com/CharleeWa/vue3-vant-mobile)
8
+
9
+ 🔥 UI框架选用Vant4,有赞团队开发的轻量、可定制的移动端 Vue 组件库 -> [官网](https://vant-contrib.gitee.io/vant/#/zh-CN)
10
+
11
+ <h1 align="center">使用指南</h1>
12
+
13
+ <p align="center">指南非常地详细,并非说明上手多么地复杂,只是更好地使用它做的说明而已</p>
14
+
15
+ ## 需要注意的地方
16
+ - 本项目作为微前端框架micro-app的主应用,虽然同样派生自example项目,但example项目主要用于子应用的快速建设,因此本项目在微前端接入代码方面和example表现不一致
17
+
18
+ ## 特性
19
+
20
+ - 🌓 支持暗黑模式
21
+ - 💪 使用TypeScript编写
22
+ - 🚀 Vue3 生态开箱即用
23
+ - 🤖 自动导入组件
24
+ - 📦 使用pnpm包管理器
25
+ - 💾 支持Mock服务器
26
+ - 🌈 支持Git hooks(lint和commit)
27
+ - 💖 移动端UI组件(Vant4)
28
+ - 🍍 Pinia,Vue的状态管理库
29
+
30
+ ### 包管理器
31
+
32
+ 推荐使用 [pnpm](https://pnpm.io/) 来进行包管理,可以极大地减少install时间, 而且非常节省磁盘空间。
33
+
34
+ ### 目录结构
35
+
36
+ 下面是模板的主要目录结构和一些简要地说明。
37
+
38
+ ```
39
+ ├── src
40
+ │ ├── api # Api ajax 等
41
+ │ ├── assets # 本地静态资源
42
+ │ ├── layouts # 封装布局组件
43
+ │ ├── components # 业务通用组件和基础布局组件
44
+ │ ├── router # Vue-Router
45
+ │ ├── store # Pinia
46
+ │ ├── utils # 工具库
47
+ │ ├── views # 业务页面入口和常用模板
48
+ │ ├── App.vue # Vue 模板入口
49
+ │ └── main.ts # Vue 入口 JS
50
+ │ └── app.less # 全局样式
51
+ │ └── env.d.ts # 全局公用 TypeScript 类型
52
+ ├── build/mock # mock 服务
53
+ ├── mock # mock 数据
54
+ ├── public # 静态文件
55
+ ├── scripts # 公共执行脚本
56
+ ├── tests # 单元测试
57
+ ├── auto-imports.d.ts # Vue3 组合式API 类型声明文件
58
+ ├── components.d.ts # 组件自注册类型声明文件
59
+ ├── vite.config.ts # Vite 配置文件
60
+ ├── tsconfig.json # TS 配置文件
61
+ ├── index.html # 浏览器渲染入口
62
+ ├── README.md # 简单介绍
63
+ └── package.json # 项目的依赖
64
+ ```
65
+
66
+ ### 本地开发
67
+
68
+ 最快的使用方式是在本项目的gitlab主页点击`派生`按钮,即可复制一份本项目结构
69
+
70
+ 随后请按照以下步骤完成对项目的修改
71
+
72
+ 1. 将`app.less`,`main.ts`,`progress.ts`,`vite.config.ts`,`index.html`中的`#example-app`改成你的业务模块实际名称,如`#safecheck-app`
73
+ 2. 将`.env`中的`VITE_APP_PUBLIC_PATH`值改成你的业务模块实际名称,如`/safecheck-web`
74
+ 3. 将`package.json`中的`af-example-mobile-vue-web`改成你的项目实际名称,如`af-safecheck-mobile-vue-web`
75
+ 4. 在`af-system-mobile-vue-web`项目的`microApps.ts`文件中注册微应用
76
+
77
+ 进入代码目录,安装项目的依赖。
78
+
79
+ ```bash
80
+ # with pnpm
81
+ pnpm install
82
+ ```
83
+
84
+ > 如果网络状况不佳,可以设置 pnpm 的 npm 加载源,如 pnpm config set registry <https://registry.npmmirror.com>
85
+
86
+ 完成前面的步骤以后,就可以开始进行业务开发了。
87
+
88
+ - 启动服务
89
+
90
+ ```bash
91
+ pnpm dev
92
+ ```
93
+
94
+ - 打包构建
95
+
96
+ ```bash
97
+ pnpm build
98
+ ```
99
+
100
+ ## 浏览器支持
101
+
102
+ 支持现代浏览器
103
+
104
+ | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
105
+ |:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
106
+ | not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
107
+
108
+ ### 新增页面
109
+
110
+ 这里的『页面』指配置了路由,能够通过链接直接访问的模块,要新建一个页面,通常只需要在脚手架的基础上进行简单的配置。
111
+
112
+ - 手动创建
113
+
114
+ 在 src/views 下新建页面的vue文件,如果相关页面有多个,可以新建一个文件夹来放置相关文件。
115
+
116
+ 值得提醒的是,样式文件默认使用 `Less`,如果想要集成其它预处理器,如 `Sass` 和 `Stylus`,请自行安装。
117
+
118
+ 最后,记得将新建的文件加入路由 - router/index.ts
119
+
120
+ ### 新增业务组件
121
+
122
+ 对于一些可能被多处引用的功能模块,建议提炼成业务组件统一管理。这些组件一般有以下特征:
123
+
124
+ - 只负责一块相对独立,稳定的功能;
125
+ - 没有单独的路由配置;
126
+ - 可能是纯静态的,也可能包含自己的 state,但不涉及 pinia 的数据流,仅受父组件(通常是一个页面)传递的参数控制。
127
+
128
+ 这里以一个简单的静态组件为例进行介绍。假设你的应用中经常需要展现图片,这些图片有固定的高度和宽度,有背景颜色,还有一段文字介绍。你可以用一个组件来实现这个功能,它有默认的样式,同时可以接收父组件传递过来的参数进行展示。
129
+
130
+ - 1、新建文件
131
+
132
+ 在 src/components 下新建一个以组件名命名的文件夹,注意首字母大写,命名尽量体现组件的功能,这里就叫 image-wrapper。在此文件夹下新增 js/ts/vue 文件及样式文件(如果需要),命名为 index.ts和 index.less。
133
+
134
+ > 如果你的组件比较复杂,可以分为多个文件,最后在 index.ts 中统一 export。
135
+
136
+ 你的代码大概是这个样子:
137
+
138
+ ```
139
+ <template>
140
+ <div class="image-wrapper">
141
+ <img class="img" :src="src" :alt="desc" />
142
+ <!-- 如果使用该组件的使用者没用 slot,则默认 div.desc 来输出传递的 desc 属性 -->
143
+ <slot name="desc">
144
+ <div class="desc" v-if="desc">{{ desc }}</div>
145
+ </slot>
146
+ </div>
147
+ </template>
148
+
149
+ <script setup lang="ts">
150
+ const props = defineProps({
151
+ src: String,
152
+ desc: String,
153
+ })
154
+ </script>
155
+ ```
156
+
157
+ - 2、使用
158
+
159
+ 在要使用这个组件的地方,按照组件定义的 API 传入参数,直接使用就好:
160
+
161
+ ```
162
+ <template>
163
+ <!-- 普通使用方式 -->
164
+ <image-wrapper :src="state.imageSrc" :desc="state.context"></image-wrapper>
165
+ <!-- 使用 slot 的 desc 方式 -->
166
+ <image-wrapper :src="state.imageSrc">
167
+ <template #desc>
168
+ <span>{{ state.context }}</span>
169
+ </template>
170
+ </image-wrapper>
171
+ </template>
172
+
173
+ <script setup lang="ts">
174
+ const state = reactive({
175
+ context: '示意图',
176
+ imageSrc: 'xxxxxxxxx.png'
177
+ })
178
+ </script>
179
+ ```
180
+
181
+ 值得说明的是,我们不必先引入组件再使用组件,也不必先引入Vue3 API再使用API,因为这一切都由 `unplugin-vue-components` 和 `unplugin-auto-import` 帮我们做好了。
@@ -0,0 +1,9 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="WEB_MODULE" version="4">
3
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
4
+ <exclude-output />
5
+ <content url="file://$MODULE_DIR$" />
6
+ <orderEntry type="inheritedJdk" />
7
+ <orderEntry type="sourceFolder" forTests="false" />
8
+ </component>
9
+ </module>
@@ -0,0 +1,91 @@
1
+ import path from 'node:path'
2
+ import process from 'node:process'
3
+ import vue from '@vitejs/plugin-vue'
4
+ import legacy from '@vitejs/plugin-legacy'
5
+ import UnoCSS from 'unocss/vite'
6
+ import viteCompression from 'vite-plugin-compression'
7
+ import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
8
+ import { VitePWA } from 'vite-plugin-pwa'
9
+ import Sitemap from 'vite-plugin-sitemap'
10
+ import mockDevServerPlugin from 'vite-plugin-mock-dev-server'
11
+ import { createViteVConsole } from './vconsole'
12
+
13
+ export function createVitePlugins() {
14
+ const root = process.cwd()
15
+
16
+ return [
17
+ vue({
18
+ template: {
19
+ compilerOptions: {
20
+ // 注册自定义组件micro-app 防止控制台警告
21
+ isCustomElement: tag => tag.startsWith('micro-app'),
22
+ },
23
+ },
24
+ }),
25
+
26
+ // https://github.com/jbaubree/vite-plugin-sitemap
27
+ Sitemap(),
28
+
29
+ // https://github.com/pengzhanbo/vite-plugin-mock-dev-server
30
+ mockDevServerPlugin(),
31
+
32
+ // svg icon
33
+ createSvgIconsPlugin({
34
+ // 指定图标文件夹
35
+ iconDirs: [path.resolve(root, 'src/icons/svg')],
36
+ // 指定 symbolId 格式
37
+ symbolId: 'icon-[dir]-[name]',
38
+ }),
39
+
40
+ // 生产环境 gzip 压缩资源
41
+ viteCompression({
42
+ algorithm: 'gzip',
43
+ // 文件大于10240b(10kb)时才压缩文件
44
+ threshold: 10240,
45
+ // 禁止在控制台输出压缩结果
46
+ verbose: false,
47
+ // 压缩完文件后删除源文件
48
+ deleteOriginFile: false,
49
+ }),
50
+
51
+ legacy({
52
+ targets: ['defaults', 'not IE 11'],
53
+ }),
54
+
55
+ // https://github.com/antfu/unocss
56
+ // see uno.config.ts for config
57
+ UnoCSS(),
58
+
59
+ // https://github.com/vadxq/vite-plugin-vconsole
60
+ createViteVConsole(),
61
+
62
+ // https://github.com/antfu/vite-plugin-pwa
63
+ VitePWA({
64
+ registerType: 'autoUpdate',
65
+ includeAssets: ['favicon.svg', 'safari-pinned-tab.svg'],
66
+ manifest: {
67
+ name: 'af-mobile-client-vue3',
68
+ short_name: 'af-mobile-client-vue3',
69
+ theme_color: '#ffffff',
70
+ icons: [
71
+ {
72
+ src: '/pwa-192x192.png',
73
+ sizes: '192x192',
74
+ type: 'image/png',
75
+ },
76
+ {
77
+ src: '/pwa-512x512.png',
78
+ sizes: '512x512',
79
+ type: 'image/png',
80
+ },
81
+ {
82
+ src: '/pwa-512x512.png',
83
+ sizes: '512x512',
84
+ type: 'image/png',
85
+ purpose: 'any maskable',
86
+ },
87
+ ],
88
+ },
89
+ }),
90
+ ]
91
+ }
@@ -0,0 +1,44 @@
1
+ import path from 'node:path'
2
+ import { viteVConsole } from 'vite-plugin-vconsole'
3
+
4
+ export function createViteVConsole() {
5
+ return viteVConsole({
6
+ entry: [path.resolve('src/main.ts')],
7
+ enabled: false,
8
+ config: {
9
+ maxLogNumber: 1000,
10
+ theme: 'light',
11
+ },
12
+ // https://github.com/vadxq/vite-plugin-vconsole/issues/21
13
+ dynamicConfig: {
14
+ theme: `document.documentElement.classList.contains('dark') ? 'dark' : 'light'`,
15
+ },
16
+ eventListener: `
17
+ const targetElement = document.querySelector('html'); // 择要监听的元素
18
+ const observerOptions = {
19
+ attributes: true, // 监听属性变化
20
+ attributeFilter: ['class'] // 只监听class属性变化
21
+ };
22
+
23
+ // 定义回调函数来处理观察到的变化
24
+ function handleAttributeChange(mutationsList) {
25
+ for(let mutation of mutationsList) {
26
+ if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
27
+ if (window && window.vConsole) {
28
+ window.vConsole.dynamicChange.value = new Date().getTime();
29
+ }
30
+ }
31
+ }
32
+ }
33
+
34
+ // 创建观察者实例并传入回调函数
35
+ const observer = new MutationObserver(handleAttributeChange);
36
+
37
+ // 开始观察目标元素
38
+ observer.observe(targetElement, observerOptions);
39
+
40
+ // 当不再需要观察时,停止观察
41
+ // observer.disconnect();
42
+ `,
43
+ })
44
+ }
@@ -0,0 +1,7 @@
1
+ import antfu from '@antfu/eslint-config'
2
+
3
+ export default antfu({
4
+ // enable UnoCSS support
5
+ // https://unocss.dev/integrations/vscode
6
+ unocss: true,
7
+ })
package/index.html ADDED
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="theme-color" content="#ffffff" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover, user-scalable=no"/>
7
+ <link rel="icon" href="/favicon.ico" />
8
+ </head>
9
+ <body>
10
+ <div id="system-app"></div>
11
+ <script type="module" src="/src/main.ts"></script>
12
+ <noscript>
13
+ This website requires JavaScript to function properly.
14
+ Please enable JavaScript to continue.
15
+ </noscript>
16
+ </body>
17
+ </html>
package/mock/data.ts ADDED
@@ -0,0 +1,20 @@
1
+ import { defineMockData } from 'vite-plugin-mock-dev-server'
2
+
3
+ // defineMockData,用于在 mock 文件中使用 data.ts 作为共享数据源。
4
+ export default defineMockData('proses', [
5
+ { prose: '🔖 躲在某一时间,想念一段时光的掌纹;躲在某一地点,想念一个站在来路也站在去路的,让我牵挂的人。' },
6
+ { prose: '🔖 天空一碧如洗,灿烂的阳光正从密密的松针的缝隙间射下来,形成一束束粗粗细细的光柱,把飘荡着轻纱般薄雾的林荫照得通亮。' },
7
+ { prose: '🔖 这一次相遇,美得彻骨,美得震颤,美得孤绝,美得惊艳。' },
8
+ { prose: '🔖 沉默的状态,能让我感觉到呼吸的自由和自己原来就处于的本色位置。' },
9
+ { prose: '🔖 青春,是一包象征着阳光的向日葵种子,在现在洒下,就会在未来得到收获,那一株株饱含青春的花朵。' },
10
+ { prose: '🔖 燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?' },
11
+ { prose: '🔖 毕业了,青春在无形之中离去,我们即将翻开人生的另一页。' },
12
+ { prose: '🔖 成长,是每个孩子的权力,也是他们必经的征程,或平坦、或崎岖,有悲欢,有离合。' },
13
+ { prose: '🔖 旧时光里的人和事,琐碎而零乱。我的记忆很模糊,好像大部分都成了一种温馨的符号,静静的沉在我心底。' },
14
+ { prose: '🔖 生活是一部大百科全书,包罗万象;生活是一把六弦琴,弹奏出多重美妙的旋律:生活是一座飞马牌大钟,上紧发条,便会使人获得浓缩的生命。' },
15
+ { prose: '🔖 毕业了,身边的朋友一个个各奔东西,开始学会自己撑起生命的暖色。' },
16
+ { prose: '🔖 已经走到尽头的东西,重生也不过是再一次的消亡。就像所有的开始,其实都只是一个写好了的结局。' },
17
+ { prose: '🔖 下午茶的芬香熏陶着房内的任何一个角落,午后的阳光透过窗帘的间隙洒在木制的桌面上,一份思念随着红茶顺滑至心中。' },
18
+ { prose: '🔖 这里再不是我们的校园,当我们就此离开我们的青葱岁月。' },
19
+ { prose: '🔖 很久找你,一直没有找到,微风吹过的时候,我深深的呼吸,才感觉到你也在陪伴着我呼吸。' },
20
+ ])
package/mock/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ import prose from './modules/prose.mock'
2
+
3
+ export default {
4
+ ...prose,
5
+ }
@@ -0,0 +1,16 @@
1
+ // https://github.com/pengzhanbo/vite-plugin-mock-dev-server
2
+ import { defineMock } from 'vite-plugin-mock-dev-server'
3
+ import proses from '../data'
4
+
5
+ export default defineMock({
6
+ url: '/api/project/prose',
7
+ delay: 100,
8
+ body: () => {
9
+ const prose = proses.value[Math.floor(Math.random() * 8)]
10
+ return {
11
+ code: 200,
12
+ data: prose,
13
+ msg: 'success',
14
+ }
15
+ },
16
+ })