af-mobile-client-vue3 1.3.30 → 1.3.31

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 (283) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/.cursorrules +60 -60
  3. package/.editorconfig +9 -9
  4. package/.env +10 -10
  5. package/.env.development +1 -1
  6. package/.env.production +1 -1
  7. package/.node-version +1 -1
  8. package/.vscode/extensions.json +12 -12
  9. package/.vscode/settings.json +68 -66
  10. package/CLAUDE.md +218 -189
  11. package/README.md +182 -182
  12. package/af-example-mobile-vue-web.iml +9 -9
  13. package/build/vite/index.ts +98 -98
  14. package/build/vite/optimize.ts +34 -34
  15. package/build/vite/vconsole.ts +47 -47
  16. package/commitlint.config.ts +32 -32
  17. package/compress.js +36 -36
  18. package/eslint.config.ts +31 -30
  19. package/index.html +23 -23
  20. package/mock/data.ts +20 -20
  21. package/mock/index.ts +7 -7
  22. package/mock/modules/prose.mock.ts +13 -13
  23. package/mock/modules/user.mock.ts +95 -152
  24. package/mock/util.ts +19 -19
  25. package/netlify.toml +12 -12
  26. package/package.json +114 -114
  27. package/postcss.config.ts +27 -27
  28. package/public/favicon.svg +4 -4
  29. package/public/safari-pinned-tab.svg +4 -4
  30. package/scripts/verifyCommit.js +19 -19
  31. package/src/App.vue +79 -79
  32. package/src/api/auth/index.ts +77 -0
  33. package/src/api/auth/types.ts +200 -0
  34. package/src/api/mock/index.ts +30 -30
  35. package/src/api/user/index.ts +40 -40
  36. package/src/assets/img/user/login/background-shadow-1.svg +20 -20
  37. package/src/assets/img/user/login/logo-background.svg +20 -20
  38. package/src/bootstrap.ts +26 -26
  39. package/src/components/core/BeautifulLoading/index.vue +52 -52
  40. package/src/components/core/ImageUploader/index.vue +251 -251
  41. package/src/components/core/NavBar/index.vue +53 -53
  42. package/src/components/core/Tabbar/index.vue +32 -32
  43. package/src/components/core/Uploader/index.vue +124 -124
  44. package/src/components/core/XGridDropOption/index.vue +154 -154
  45. package/src/components/core/XMultiSelect/index.vue +183 -183
  46. package/src/components/core/XSelect/index.vue +149 -149
  47. package/src/components/data/CardContainer/CardContainer.vue +118 -118
  48. package/src/components/data/CardContainer/CardHeader.vue +99 -99
  49. package/src/components/data/InfoDisplay/index.vue +132 -132
  50. package/src/components/data/UserDetail/api.ts +24 -24
  51. package/src/components/data/UserDetail/index.vue +620 -620
  52. package/src/components/data/UserDetail/recordEntries.ts +159 -159
  53. package/src/components/data/UserDetail/types.ts +26 -26
  54. package/src/components/data/XBadge/index.vue +82 -82
  55. package/src/components/data/XCellDetail/index.vue +105 -105
  56. package/src/components/data/XCellList/XCellList.md +432 -432
  57. package/src/components/data/XCellList/index.vue +1436 -1436
  58. package/src/components/data/XCellListFilter/QrScanner/index.vue +207 -207
  59. package/src/components/data/XCellListFilter/QrScanner/startScanAnimation.ts +53 -53
  60. package/src/components/data/XCellListFilter/VpnRecognition/index.vue +119 -119
  61. package/src/components/data/XCellListFilter/index.vue +705 -705
  62. package/src/components/data/XForm/index.vue +659 -659
  63. package/src/components/data/XFormGroup/doc/DeviceForm.vue +122 -122
  64. package/src/components/data/XFormGroup/doc/FormGroupDemo.vue +56 -56
  65. package/src/components/data/XFormGroup/doc/README.md +286 -286
  66. package/src/components/data/XFormGroup/doc/UserForm.vue +102 -102
  67. package/src/components/data/XFormGroup/index.vue +240 -240
  68. package/src/components/data/XFormItem/index.vue +1310 -1310
  69. package/src/components/data/XOlMap/README.md +227 -227
  70. package/src/components/data/XOlMap/XLocationPicker/index.vue +226 -226
  71. package/src/components/data/XOlMap/index.vue +1490 -1490
  72. package/src/components/data/XOlMap/types.ts +149 -149
  73. package/src/components/data/XOlMap/utils/{wgs84ToGcj02.js → wgs84ToGcj02.ts} +171 -154
  74. package/src/components/data/XReportForm/DateTimeSecondsPicker.vue +208 -208
  75. package/src/components/data/XReportForm/XReportFormJsonRender.vue +220 -220
  76. package/src/components/data/XReportForm/index.vue +1393 -1393
  77. package/src/components/data/XReportGrid/XAddReport/XAddReport.vue +198 -198
  78. package/src/components/data/XReportGrid/XAddReport/index.js +3 -3
  79. package/src/components/data/XReportGrid/XAddReport/index.md +53 -53
  80. package/src/components/data/XReportGrid/XAddReport/index.ts +10 -10
  81. package/src/components/data/XReportGrid/XReport.vue +960 -960
  82. package/src/components/data/XReportGrid/XReportDemo.vue +33 -33
  83. package/src/components/data/XReportGrid/XReportDesign.vue +597 -597
  84. package/src/components/data/XReportGrid/XReportDrawer/XReportDrawer.vue +148 -148
  85. package/src/components/data/XReportGrid/XReportDrawer/index.js +3 -3
  86. package/src/components/data/XReportGrid/XReportDrawer/index.ts +10 -10
  87. package/src/components/data/XReportGrid/XReportJsonRender.vue +399 -399
  88. package/src/components/data/XReportGrid/XReportTrGroup.vue +592 -592
  89. package/src/components/data/XReportGrid/index.md +46 -46
  90. package/src/components/data/XReportGrid/print.js +184 -184
  91. package/src/components/data/XSignature/index.vue +284 -284
  92. package/src/components/data/XTag/index.vue +10 -10
  93. package/src/components/layout/NormalDataLayout/index.vue +69 -69
  94. package/src/components/layout/TabBarLayout/index.vue +40 -40
  95. package/src/composables/dark.ts +5 -5
  96. package/src/config/routes.ts +9 -9
  97. package/src/constants/index.ts +2 -2
  98. package/src/enums/requestEnum.ts +25 -25
  99. package/src/expression/ExpressionRunner.ts +28 -28
  100. package/src/expression/TestExpression.ts +510 -510
  101. package/src/expression/core/Delegate.ts +116 -116
  102. package/src/expression/core/Expression.ts +1359 -1359
  103. package/src/expression/core/Program.ts +985 -985
  104. package/src/expression/core/Token.ts +29 -29
  105. package/src/expression/enums/ExpressionType.ts +81 -81
  106. package/src/expression/enums/TokenType.ts +11 -11
  107. package/src/expression/exception/BreakWayException.ts +2 -2
  108. package/src/expression/exception/ContinueWayException.ts +2 -2
  109. package/src/expression/exception/ExpressionException.ts +29 -29
  110. package/src/expression/exception/ReturnWayException.ts +14 -14
  111. package/src/expression/exception/ServiceException.ts +22 -22
  112. package/src/expression/instances/JSONArray.ts +52 -52
  113. package/src/expression/instances/JSONObject.ts +118 -118
  114. package/src/expression/instances/LogicConsole.ts +31 -31
  115. package/src/font-style/font.css +4 -4
  116. package/src/hooks/useBoolean.ts +26 -26
  117. package/src/hooks/useCommon.ts +9 -9
  118. package/src/hooks/useLoading.ts +16 -16
  119. package/src/hooks/useLogin.ts +97 -97
  120. package/src/icons/svg/check-in.svg +32 -32
  121. package/src/icons/svg/dark.svg +4 -4
  122. package/src/icons/svg/github.svg +4 -4
  123. package/src/icons/svg/light.svg +4 -4
  124. package/src/icons/svg/link.svg +4 -4
  125. package/src/icons/svgo.yml +22 -22
  126. package/src/layout/GridView/index.vue +16 -16
  127. package/src/layout/PageLayout.vue +9 -9
  128. package/src/layout/SingleLayout.vue +9 -9
  129. package/src/locales/en-US.json +128 -128
  130. package/src/locales/zh-CN.json +128 -128
  131. package/src/logic/LogicRunner.ts +67 -67
  132. package/src/logic/TestLogic.ts +13 -13
  133. package/src/logic/plugins/common/DateTools.ts +35 -35
  134. package/src/logic/plugins/common/VueTools.ts +30 -30
  135. package/src/logic/plugins/index.ts +7 -7
  136. package/src/main.ts +44 -44
  137. package/src/plugins/AppData.ts +38 -38
  138. package/src/plugins/GetLoginInfoService.ts +10 -10
  139. package/src/plugins/collectIcons.ts +10 -10
  140. package/src/plugins/index.ts +11 -11
  141. package/src/router/README.md +8 -8
  142. package/src/router/external-routes.ts +60 -0
  143. package/src/router/guards.ts +131 -59
  144. package/src/router/index.ts +35 -35
  145. package/src/router/invoiceRoutes.ts +33 -33
  146. package/src/router/routes.ts +426 -347
  147. package/src/services/api/Login.ts +6 -6
  148. package/src/services/api/common.ts +109 -109
  149. package/src/services/api/index.ts +7 -7
  150. package/src/services/api/manage.ts +8 -8
  151. package/src/services/api/search.ts +16 -16
  152. package/src/services/api/user.ts +17 -17
  153. package/src/services/restTools.ts +56 -56
  154. package/src/services/v3Api.ts +147 -147
  155. package/src/stores/index.ts +13 -13
  156. package/src/stores/modules/counter.ts +19 -19
  157. package/src/stores/modules/homeApp.ts +55 -55
  158. package/src/stores/modules/routeCache.ts +22 -23
  159. package/src/stores/modules/setting.ts +87 -87
  160. package/src/stores/modules/user.ts +326 -235
  161. package/src/stores/mutation-type.ts +12 -7
  162. package/src/styles/app.less +36 -36
  163. package/src/styles/login.less +109 -109
  164. package/src/styles/var.less +25 -25
  165. package/src/types/auth.ts +85 -0
  166. package/src/types/env.d.ts +16 -16
  167. package/src/types/platform.ts +194 -0
  168. package/src/types/settings.ts +1 -1
  169. package/src/types/vue-router.d.ts +13 -9
  170. package/src/utils/Storage.ts +124 -124
  171. package/src/utils/authority-utils.ts +84 -84
  172. package/src/utils/common.ts +41 -41
  173. package/src/utils/crypto.ts +39 -39
  174. package/src/utils/dataUtil.ts +42 -42
  175. package/src/utils/dictUtil.ts +52 -52
  176. package/src/utils/http/index.ts +201 -199
  177. package/src/utils/i18n.ts +72 -72
  178. package/src/utils/indexedDB.ts +195 -195
  179. package/src/utils/inline-px-to-vw.ts +28 -28
  180. package/src/utils/mobileUtil.ts +33 -34
  181. package/src/utils/platform-auth.ts +134 -0
  182. package/src/utils/progress.ts +19 -19
  183. package/src/utils/routerUtil.ts +271 -271
  184. package/src/utils/runEvalFunction.ts +13 -13
  185. package/src/utils/secureStorage.ts +70 -71
  186. package/src/utils/set-page-title.ts +5 -5
  187. package/src/utils/validate.ts +6 -6
  188. package/src/views/chat/index.vue +153 -153
  189. package/src/views/common/Forbidden.vue +97 -0
  190. package/src/views/common/LoadError.vue +63 -63
  191. package/src/views/common/NotFound.vue +67 -67
  192. package/src/views/component/EvaluateRecordView/index.vue +40 -40
  193. package/src/views/component/IconifyView/index.vue +504 -504
  194. package/src/views/component/UserDetailView/UserDetailPage.vue +77 -77
  195. package/src/views/component/UserDetailView/index.vue +234 -234
  196. package/src/views/component/XCellDetailView/index.vue +217 -217
  197. package/src/views/component/XCellListView/index.vue +108 -129
  198. package/src/views/component/XFormAppraiseView/index.vue +174 -174
  199. package/src/views/component/XFormGroupView/index.vue +78 -82
  200. package/src/views/component/XFormView/index.vue +27 -27
  201. package/src/views/component/XOlMapView/XLocationPicker/index.vue +118 -118
  202. package/src/views/component/XOlMapView/index.vue +434 -434
  203. package/src/views/component/XOlMapView/testData.ts +64 -64
  204. package/src/views/component/XReportFormIframeView/index.vue +47 -47
  205. package/src/views/component/XReportFormView/index.vue +13 -13
  206. package/src/views/component/XReportGridView/index.vue +17 -17
  207. package/src/views/component/XRequestView/index.vue +234 -234
  208. package/src/views/component/XSignatureView/index.vue +50 -50
  209. package/src/views/component/index.vue +181 -181
  210. package/src/views/component/menu.vue +117 -117
  211. package/src/views/component/notice.vue +46 -46
  212. package/src/views/component/topNav.vue +36 -36
  213. package/src/views/external/index.vue +152 -0
  214. package/src/views/invoiceShow/index.vue +61 -61
  215. package/src/views/loading/AuthLoading.vue +345 -0
  216. package/src/views/user/login/ForgetPasswordForm.vue +94 -94
  217. package/src/views/user/login/LoginForm.vue +350 -347
  218. package/src/views/user/login/LoginTitle.vue +76 -76
  219. package/src/views/user/login/LoginWave.vue +109 -109
  220. package/src/views/user/login/index.vue +22 -22
  221. package/src/views/user/my/comm/ModifyPassword.vue +346 -346
  222. package/src/views/user/my/index.vue +507 -507
  223. package/src/views/user/register/index.vue +952 -952
  224. package/src/views/userRecords/AbnormalAlarmRecords.vue +21 -21
  225. package/src/views/userRecords/CardReplacementRecords.vue +21 -21
  226. package/src/views/userRecords/ChangeRecords.vue +19 -19
  227. package/src/views/userRecords/CommandViewRecords.vue +20 -20
  228. package/src/views/userRecords/GasCompensationRecords.vue +20 -20
  229. package/src/views/userRecords/InstrumentCollectionRecords.vue +21 -21
  230. package/src/views/userRecords/MeterRecords.vue +20 -20
  231. package/src/views/userRecords/OperateRecords.vue +51 -51
  232. package/src/views/userRecords/OtherChargeRecords.vue +19 -19
  233. package/src/views/userRecords/PaymentRecords.vue +28 -28
  234. package/src/views/userRecords/PriceAdjustmentRecords.vue +19 -19
  235. package/src/views/userRecords/ReplacementRecords.vue +19 -19
  236. package/src/views/userRecords/SafetyRecords.vue +19 -19
  237. package/src/views/userRecords/TransactionRecords.vue +21 -21
  238. package/src/views/userRecords/TransferRecords.vue +19 -19
  239. package/src/views/userRecords/operateRecordDetail/index.vue +316 -316
  240. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AddUserDetail.vue +124 -124
  241. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AdvanceDeliveryDetail.vue +88 -88
  242. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AutoAccountsCancelDetail.vue +205 -205
  243. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AutoAccountsDetail.vue +192 -192
  244. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BankDkDetail.vue +192 -192
  245. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BankPayDetail.vue +192 -192
  246. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BlacklistDetail.vue +153 -153
  247. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CancellationDetail.vue +101 -101
  248. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardMeterCenterCancelDetail.vue +127 -127
  249. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardMeterCenterDetail.vue +153 -153
  250. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardOverUserDetail.vue +153 -153
  251. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ChangeMeterCancelDetail.vue +166 -166
  252. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ChangeMeterDetail.vue +205 -205
  253. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/DisableManageDetail.vue +127 -127
  254. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/EnableManageDetail.vue +114 -114
  255. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/FaZheChangeDetail.vue +124 -124
  256. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/FeeDeductionDetail.vue +153 -153
  257. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/GasPriceChangeDetail.vue +126 -126
  258. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/InputtorChangeDetail.vue +126 -126
  259. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotMeterCenterCancelDetail.vue +114 -114
  260. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotMeterCenterDetail.vue +127 -127
  261. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotOpenDetail.vue +88 -88
  262. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineCardDetail.vue +101 -101
  263. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineMeterCenterCancelDetail.vue +218 -218
  264. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineMeterCenterDetail.vue +153 -153
  265. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OffGasAddGasDetail.vue +140 -140
  266. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OtherChargeCancelDetail.vue +127 -127
  267. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OtherChargeDetail.vue +114 -114
  268. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OverUserChangeDetail.vue +127 -127
  269. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReBillDetail.vue +127 -127
  270. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/RefundDetail.vue +114 -114
  271. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReplaceCardManageCancelDetail.vue +127 -127
  272. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReplaceCardManageDetail.vue +114 -114
  273. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/SaleCardGasDetail.vue +140 -140
  274. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/TransferManageCancelDetail.vue +152 -152
  275. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/TransferManageDetail.vue +178 -178
  276. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/UserChangeDetail.vue +123 -123
  277. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/WechatPayDetail.vue +192 -192
  278. package/src/views/userRecords/types.ts +66 -66
  279. package/tsconfig.json +39 -39
  280. package/uno.config.ts +82 -82
  281. package/vite.config.ts +119 -118
  282. package/src/router/types.ts +0 -7
  283. package/src/utils/wechatUtil.ts +0 -9
@@ -1,195 +1,195 @@
1
- // indexDB 存储
2
- import { post } from '@af-mobile-client-vue3/services/restTools'
3
-
4
- // 避免重复请求相同配置key的锁
5
- const locks: any = {}
6
-
7
- export const indexedDB = {
8
- db: undefined,
9
- indexedDB: window.indexedDB,
10
- IDBKeyRange: window.IDBKeyRange, // 键范围
11
- openDB(callback: Function) {
12
- // 建立或打开数据库,建立对象存储空间(ObjectStore)
13
- if (this.db) {
14
- callback(this.db)
15
- }
16
- else {
17
- const version = 1
18
- const request = this.indexedDB.open('view', version)
19
-
20
- request.onerror = function (e: any) {
21
- console.error(`打开数据库失败:${e.currentTarget.error.message}`)
22
- }
23
- request.onsuccess = function (e: any) {
24
- this.db = e.target.result
25
- callback(this.db)
26
- }
27
- request.onupgradeneeded = function (e: any) {
28
- const db = e.target.result
29
- if (!db.objectStoreNames.contains('metaCache')) {
30
- // 没有该对象空间时创建该对象空间
31
- db.createObjectStore('metaCache', {
32
- keyPath: 'key',
33
- })
34
- }
35
- }
36
- }
37
- },
38
- deleteDB(dbname: string) {
39
- // 删除数据库
40
- this.indexedDB.deleteDatabase(dbname)
41
- },
42
- closeDB() {
43
- if (!this.db)
44
- this.db.close()
45
- },
46
- add(key: string, data: any) {
47
- // eslint-disable-next-line ts/no-this-alias
48
- const self = this
49
- self.openDB((res: IDBDatabase) => {
50
- const request = res.transaction('metaCache', 'readwrite').objectStore('metaCache').add({
51
- key,
52
- data,
53
- })
54
- request.onerror = function () {
55
- self.update(key, data)
56
- }
57
- request.onsuccess = function () {
58
- }
59
- })
60
- },
61
- update(key: string, data: any) {
62
- this.openDB((res: IDBDatabase) => {
63
- const request = res.transaction('metaCache', 'readwrite').objectStore('metaCache').put({
64
- key,
65
- data,
66
- })
67
- request.onerror = function () {
68
- console.error('数据更新失败')
69
- }
70
- request.onsuccess = function () {
71
- }
72
- })
73
- },
74
- get(key: string, callback: Function) {
75
- this.openDB((res: IDBDatabase) => {
76
- // 根据存储空间的键找到对应数据
77
- const store = res.transaction('metaCache', 'readwrite').objectStore('metaCache')
78
- const request = store.get(key)
79
- request.onerror = function () {
80
- }
81
- request.onsuccess = function (e: any) {
82
- const result = e.target.result
83
- if (typeof (callback) === 'function')
84
- callback(result.data)
85
- }
86
- })
87
- },
88
- getByWeb(key: string, url: string, params: any, callback: Function, processFun: Function) {
89
- // 如果这个键正在被使用,等待它完成
90
- if (locks[key]) {
91
- locks[key].then(() => {
92
- this.getByWeb(key, url, params, callback, processFun)
93
- })
94
- return
95
- }
96
-
97
- // 创建一个新的 Promise
98
- locks[key] = new Promise<void>((resolve, reject) => {
99
- // eslint-disable-next-line ts/no-this-alias
100
- const self = this
101
- self.openDB((res: IDBDatabase) => {
102
- // 根据存储空间的键找到对应数据
103
- const store = res.transaction('metaCache', 'readwrite').objectStore('metaCache')
104
- const request = store.get(key)
105
- request.onerror = function (e) {
106
- reject(e)
107
- }
108
- request.onsuccess = function (e: any) {
109
- const result = e.target.result
110
- if (!result && url) {
111
- post(url, params).then((res) => {
112
- if (processFun)
113
- res = processFun(res)
114
-
115
- if (import.meta.env.NODE_ENV === 'production' || key !== 'webMobileConfig')
116
- self.add(key, res)
117
-
118
- try {
119
- callback(res)
120
- }
121
- catch (e) {
122
- console.error(e)
123
- }
124
-
125
- // 解锁这个键
126
- resolve()
127
- }).catch(() => {
128
- if (import.meta.env.NODE_ENV === 'production' || key !== 'webMobileConfig')
129
- self.add(key, null)
130
- callback(null)
131
-
132
- // 解锁这个键
133
- resolve()
134
- })
135
- }
136
- else {
137
- callback(result.data)
138
-
139
- // 解锁这个键
140
- resolve()
141
- }
142
- }
143
- })
144
- }).finally(() => {
145
- // 移除这个键的锁
146
- delete locks[key]
147
- })
148
- },
149
- delete(key: string) {
150
- this.openDB((res: IDBDatabase) => {
151
- // 删除某一条记录
152
- const request = res.transaction('metaCache', 'readwrite').objectStore('metaCache').delete(key)
153
-
154
- request.onerror = function () {
155
- console.error('数据删除失败')
156
- }
157
- request.onsuccess = function () {
158
- }
159
- })
160
- },
161
- clear(callback?: Function) {
162
- this.openDB((res: IDBDatabase) => {
163
- // 删除存储空间全部记录
164
- const request = res.transaction('metaCache', 'readwrite').objectStore('metaCache').clear()
165
-
166
- request.onerror = function () {
167
- console.error('数据删除失败')
168
- }
169
- request.onsuccess = function () {
170
- if (typeof callback === 'function')
171
- callback()
172
- }
173
- })
174
- },
175
- clearDB() {
176
- return new Promise<void>((resolve, reject) => {
177
- this.openDB((res: IDBDatabase) => {
178
- // 删除存储空间全部记录
179
- const request = res.transaction('metaCache', 'readwrite').objectStore('metaCache').clear()
180
-
181
- request.onerror = () => {
182
- reject(new Error('数据删除失败'))
183
- }
184
- request.onsuccess = () => {
185
- resolve()
186
- }
187
- })
188
- })
189
- },
190
- clearCache() {
191
- indexedDB.clear(() => {
192
- location.reload()
193
- })
194
- },
195
- }
1
+ // indexDB 存储
2
+ import { post } from '@af-mobile-client-vue3/services/restTools'
3
+
4
+ // 避免重复请求相同配置key的锁
5
+ const locks: any = {}
6
+
7
+ export const indexedDB = {
8
+ db: undefined,
9
+ indexedDB: window.indexedDB,
10
+ IDBKeyRange: window.IDBKeyRange, // 键范围
11
+ openDB(callback: Function) {
12
+ // 建立或打开数据库,建立对象存储空间(ObjectStore)
13
+ if (this.db) {
14
+ callback(this.db)
15
+ }
16
+ else {
17
+ const version = 1
18
+ const request = this.indexedDB.open('view', version)
19
+
20
+ request.onerror = function (e: any) {
21
+ console.error(`打开数据库失败:${e.currentTarget.error.message}`)
22
+ }
23
+ request.onsuccess = function (e: any) {
24
+ this.db = e.target.result
25
+ callback(this.db)
26
+ }
27
+ request.onupgradeneeded = function (e: any) {
28
+ const db = e.target.result
29
+ if (!db.objectStoreNames.contains('metaCache')) {
30
+ // 没有该对象空间时创建该对象空间
31
+ db.createObjectStore('metaCache', {
32
+ keyPath: 'key',
33
+ })
34
+ }
35
+ }
36
+ }
37
+ },
38
+ deleteDB(dbname: string) {
39
+ // 删除数据库
40
+ this.indexedDB.deleteDatabase(dbname)
41
+ },
42
+ closeDB() {
43
+ if (!this.db)
44
+ this.db.close()
45
+ },
46
+ add(key: string, data: any) {
47
+ // eslint-disable-next-line ts/no-this-alias
48
+ const self = this
49
+ self.openDB((res: IDBDatabase) => {
50
+ const request = res.transaction('metaCache', 'readwrite').objectStore('metaCache').add({
51
+ key,
52
+ data,
53
+ })
54
+ request.onerror = function () {
55
+ self.update(key, data)
56
+ }
57
+ request.onsuccess = function () {
58
+ }
59
+ })
60
+ },
61
+ update(key: string, data: any) {
62
+ this.openDB((res: IDBDatabase) => {
63
+ const request = res.transaction('metaCache', 'readwrite').objectStore('metaCache').put({
64
+ key,
65
+ data,
66
+ })
67
+ request.onerror = function () {
68
+ console.error('数据更新失败')
69
+ }
70
+ request.onsuccess = function () {
71
+ }
72
+ })
73
+ },
74
+ get(key: string, callback: Function) {
75
+ this.openDB((res: IDBDatabase) => {
76
+ // 根据存储空间的键找到对应数据
77
+ const store = res.transaction('metaCache', 'readwrite').objectStore('metaCache')
78
+ const request = store.get(key)
79
+ request.onerror = function () {
80
+ }
81
+ request.onsuccess = function (e: any) {
82
+ const result = e.target.result
83
+ if (typeof (callback) === 'function')
84
+ callback(result.data)
85
+ }
86
+ })
87
+ },
88
+ getByWeb(key: string, url: string, params: any, callback: Function, processFun: Function) {
89
+ // 如果这个键正在被使用,等待它完成
90
+ if (locks[key]) {
91
+ locks[key].then(() => {
92
+ this.getByWeb(key, url, params, callback, processFun)
93
+ })
94
+ return
95
+ }
96
+
97
+ // 创建一个新的 Promise
98
+ locks[key] = new Promise<void>((resolve, reject) => {
99
+ // eslint-disable-next-line ts/no-this-alias
100
+ const self = this
101
+ self.openDB((res: IDBDatabase) => {
102
+ // 根据存储空间的键找到对应数据
103
+ const store = res.transaction('metaCache', 'readwrite').objectStore('metaCache')
104
+ const request = store.get(key)
105
+ request.onerror = function (e) {
106
+ reject(e)
107
+ }
108
+ request.onsuccess = function (e: any) {
109
+ const result = e.target.result
110
+ if (!result && url) {
111
+ post(url, params).then((res) => {
112
+ if (processFun)
113
+ res = processFun(res)
114
+
115
+ if (import.meta.env.NODE_ENV === 'production' || key !== 'webMobileConfig')
116
+ self.add(key, res)
117
+
118
+ try {
119
+ callback(res)
120
+ }
121
+ catch (e) {
122
+ console.error(e)
123
+ }
124
+
125
+ // 解锁这个键
126
+ resolve()
127
+ }).catch(() => {
128
+ if (import.meta.env.NODE_ENV === 'production' || key !== 'webMobileConfig')
129
+ self.add(key, null)
130
+ callback(null)
131
+
132
+ // 解锁这个键
133
+ resolve()
134
+ })
135
+ }
136
+ else {
137
+ callback(result.data)
138
+
139
+ // 解锁这个键
140
+ resolve()
141
+ }
142
+ }
143
+ })
144
+ }).finally(() => {
145
+ // 移除这个键的锁
146
+ delete locks[key]
147
+ })
148
+ },
149
+ delete(key: string) {
150
+ this.openDB((res: IDBDatabase) => {
151
+ // 删除某一条记录
152
+ const request = res.transaction('metaCache', 'readwrite').objectStore('metaCache').delete(key)
153
+
154
+ request.onerror = function () {
155
+ console.error('数据删除失败')
156
+ }
157
+ request.onsuccess = function () {
158
+ }
159
+ })
160
+ },
161
+ clear(callback?: Function) {
162
+ this.openDB((res: IDBDatabase) => {
163
+ // 删除存储空间全部记录
164
+ const request = res.transaction('metaCache', 'readwrite').objectStore('metaCache').clear()
165
+
166
+ request.onerror = function () {
167
+ console.error('数据删除失败')
168
+ }
169
+ request.onsuccess = function () {
170
+ if (typeof callback === 'function')
171
+ callback()
172
+ }
173
+ })
174
+ },
175
+ clearDB() {
176
+ return new Promise<void>((resolve, reject) => {
177
+ this.openDB((res: IDBDatabase) => {
178
+ // 删除存储空间全部记录
179
+ const request = res.transaction('metaCache', 'readwrite').objectStore('metaCache').clear()
180
+
181
+ request.onerror = () => {
182
+ reject(new Error('数据删除失败'))
183
+ }
184
+ request.onsuccess = () => {
185
+ resolve()
186
+ }
187
+ })
188
+ })
189
+ },
190
+ clearCache() {
191
+ indexedDB.clear(() => {
192
+ location.reload()
193
+ })
194
+ },
195
+ }
@@ -1,28 +1,28 @@
1
- /**
2
- * 支持行内样式 px 转 vw
3
- * 本文件代码来自于 scale-view 开源项目
4
- * 源代码链接:https://github.com/wswmsword/scale-view
5
- * 非常感谢作者 @wswmsword 的支持
6
- */
7
-
8
- import { round } from 'lodash-es'
9
-
10
- // 理想宽度,设计稿的宽度
11
- const idealWidth = 375
12
-
13
- // 表示伸缩视图的最大宽度
14
- const maxWidth = 800
15
-
16
- /**
17
- * 限制大小的 vw 转换
18
- * @param {number} n
19
- */
20
- export default function vw(n: number) {
21
- if (n === 0)
22
- return n
23
-
24
- const vwN = round(n * 100 / idealWidth, 3)
25
- const maxN = round(n * maxWidth / idealWidth, 3)
26
- const cssF = n > 0 ? 'min' : 'max'
27
- return `${cssF}(${vwN}vw, ${maxN}px)`
28
- }
1
+ /**
2
+ * 支持行内样式 px 转 vw
3
+ * 本文件代码来自于 scale-view 开源项目
4
+ * 源代码链接:https://github.com/wswmsword/scale-view
5
+ * 非常感谢作者 @wswmsword 的支持
6
+ */
7
+
8
+ import { round } from 'lodash-es'
9
+
10
+ // 理想宽度,设计稿的宽度
11
+ const idealWidth = 375
12
+
13
+ // 表示伸缩视图的最大宽度
14
+ const maxWidth = 800
15
+
16
+ /**
17
+ * 限制大小的 vw 转换
18
+ * @param {number} n
19
+ */
20
+ export default function vw(n: number) {
21
+ if (n === 0)
22
+ return n
23
+
24
+ const vwN = round(n * 100 / idealWidth, 3)
25
+ const maxN = round(n * maxWidth / idealWidth, 3)
26
+ const cssF = n > 0 ? 'min' : 'max'
27
+ return `${cssF}(${vwN}vw, ${maxN}px)`
28
+ }
@@ -1,34 +1,33 @@
1
- interface Param {
2
- funcName: string // 注册列表中的对应函数的key
3
- param: Record<string, unknown> // 入参json格式
4
- callbackFunc: (result: unknown) => unknown // 回调函数
5
- callBackMethodName?: string // 随机回调函数名字-不用传
6
- }
7
- // js端调用flutter中工具函数
8
- /*
9
- * 例:mobileUtil.execute({
10
- funcName:'getLocationResult',
11
- param: {a: 1},
12
- callbackFunc: (result) => {
13
- console.log('回调了test111', JSON.stringify(result))
14
- message.value = JSON.stringify(result)
15
- return 222
16
- }
17
- });
18
- * */
19
- export class mobileUtil {
20
- // 执行flutter端函数
21
- static execute(locationParam: Param): any {
22
- locationParam.callBackMethodName = `mobile_func_${Math.random().toString(36).substring(7)}`
23
- if (window.__MICRO_APP_ENVIRONMENT__) {
24
- console.warn('我在微前端环境中');
25
- // 微前端应用中需要绑定函数到真实的window中
26
- (window as any).rawWindow[locationParam.callBackMethodName] = locationParam.callbackFunc
27
- }
28
- else {
29
- console.warn('我不在微前端环境中')
30
- window[locationParam.callBackMethodName] = locationParam.callbackFunc
31
- }
32
- window[locationParam.funcName].postMessage(JSON.stringify(locationParam))
33
- }
34
- }
1
+ interface Param {
2
+ funcName: string // 注册列表中的对应函数的key
3
+ param: Record<string, unknown> // 入参json格式
4
+ callbackFunc: (result: unknown) => unknown // 回调函数
5
+ callBackMethodName?: string // 随机回调函数名字-不用传
6
+ }
7
+ // js端调用flutter中工具函数
8
+ /*
9
+ * 例:mobileUtil.execute({
10
+ funcName:'getLocationResult',
11
+ param: {a: 1},
12
+ callbackFunc: (result) => {
13
+ console.log('回调了test111', JSON.stringify(result))
14
+ message.value = JSON.stringify(result)
15
+ return 222
16
+ }
17
+ });
18
+ * */
19
+ export class mobileUtil {
20
+ // 执行flutter端函数
21
+ static execute(locationParam: Param): any {
22
+ locationParam.callBackMethodName = `mobile_func_${Math.random().toString(36).substring(7)}`
23
+ if (window.__MICRO_APP_ENVIRONMENT__) {
24
+ console.warn('Page Load in _MICRO_APP_');
25
+ // 微前端应用中需要绑定函数到真实的window中
26
+ (window as any).rawWindow[locationParam.callBackMethodName] = locationParam.callbackFunc
27
+ }
28
+ else {
29
+ window[locationParam.callBackMethodName] = locationParam.callbackFunc
30
+ }
31
+ window[locationParam.funcName]?.postMessage(JSON.stringify(locationParam))
32
+ }
33
+ }
@@ -0,0 +1,134 @@
1
+ /**
2
+ * 统一平台认证工具类
3
+ * 合并了 wechatUtil.ts, wechat.ts 和 auth-platform.ts 的功能
4
+ */
5
+
6
+ import type { RouteLocationNormalized } from 'vue-router'
7
+ import { PLATFORM_ROUTE_MAP, PlatformType } from '@af-mobile-client-vue3/types/platform'
8
+
9
+ /**
10
+ * 认证参数接口
11
+ */
12
+ export interface AuthParams {
13
+ /** 授权码 */
14
+ code?: string
15
+ /** 状态参数 */
16
+ state?: string
17
+ /** 租户名称 */
18
+ tenantName?: string
19
+ /** 平台类型 */
20
+ platformType?: PlatformType
21
+ /** 错误信息 */
22
+ error?: string
23
+ /** 错误描述 */
24
+ error_description?: string
25
+ }
26
+
27
+ /**
28
+ * 微信回调参数接口(向后兼容)
29
+ */
30
+ export interface WechatCallbackParams extends AuthParams { }
31
+
32
+ /**
33
+ * 外部用户检测结果接口
34
+ */
35
+ export interface ExternalUserResult {
36
+ /** 是否为外部用户 */
37
+ isExternal: boolean
38
+ /** 认证参数(仅当 isExternal 为 true 且有授权参数时存在) */
39
+ authParams?: {
40
+ code?: string
41
+ state?: string
42
+ tenantName?: string
43
+ platformType?: string
44
+ platformUserId?: string
45
+ }
46
+ }
47
+
48
+ /**
49
+ * 统一的外部用户检测函数
50
+ * 这是系统中唯一的用户类型检测入口,仅在路由守卫中调用
51
+ * 集成了用户类型检测和认证参数解析功能
52
+ *
53
+ * @param to 目标路由对象
54
+ * @returns 外部用户检测结果,包含是否为外部用户和认证参数
55
+ */
56
+ export function isExternalUser(to: RouteLocationNormalized): ExternalUserResult {
57
+ console.log('[Platform Detection] 开始检测外部用户环境', { path: to.path, query: to.query })
58
+
59
+ // 第一层检测:URL参数检测(最高优先级)判断公众号登录逻辑
60
+ // 检查路由查询参数中是否有授权参数(code + state)
61
+ const { code, state } = to.query
62
+ if (code && state) {
63
+ // 解析认证参数
64
+ const authParams = {
65
+ code: code as string,
66
+ state: state as string,
67
+ tenantName: state as string,
68
+ platformType: PlatformType.WECHAT_OFFICIAL,
69
+ }
70
+
71
+ return {
72
+ isExternal: true,
73
+ authParams,
74
+ }
75
+ }
76
+
77
+ // 第二层检测:User-Agent环境检测
78
+ // 检查浏览器环境是否为第三方平台
79
+ const ua = navigator.userAgent.toLowerCase()
80
+
81
+ // 微信环境检测
82
+ if (/micromessenger/i.test(ua)) {
83
+ console.log('[Platform Detection] 检测到微信环境,判定为外部用户(无授权参数)')
84
+ return {
85
+ isExternal: true,
86
+ authParams: Object.assign(to.query, {
87
+ platformType: PlatformType.WECHAT_OFFICIAL,
88
+ tenantName: to.query.state as string || '',
89
+ }),
90
+ }
91
+ }
92
+
93
+ // 支付宝环境检测
94
+ if (/alipayclient/i.test(ua)) {
95
+ // 暂未实现 后续需要增加登陆参数
96
+ return {
97
+ isExternal: true,
98
+ authParams: {
99
+ platformType: PlatformType.ALIPAY,
100
+ },
101
+ }
102
+ }
103
+
104
+ // 钉钉环境检测
105
+ if (/dingtalk/i.test(ua)) {
106
+ // 暂未实现 后续需要增加登陆参数
107
+ return { isExternal: true }
108
+ }
109
+
110
+ // 第三层检测:路由前缀检测
111
+ // 检查路径是否以外部用户路由前缀开头
112
+ const platformPrefixes = Object.values(PLATFORM_ROUTE_MAP)
113
+ const isExternalRoute = platformPrefixes.some(prefix => to.path.startsWith(prefix)) || to.path.startsWith('/ex')
114
+
115
+ if (isExternalRoute) {
116
+ // 暂未实现 后续需要增加登陆参数
117
+ return {
118
+ isExternal: true,
119
+ authParams: Object.assign(to.query, {
120
+ platformType: PlatformType.WECHAT_OFFICIAL,
121
+ tenantName: to.query.state as string || '',
122
+ }),
123
+ }
124
+ }
125
+
126
+ // [Platform Detection] 未检测到外部用户环境,判定为内部用户
127
+ return { isExternal: false }
128
+ }
129
+
130
+ // 兼容性导出 - 保持向后兼容
131
+ export function isWechat(): boolean {
132
+ const ua = navigator.userAgent.toLowerCase()
133
+ return /micromessenger/i.test(ua)
134
+ }