af-mobile-client-vue3 1.3.30 → 1.3.32

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 (284) 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 +135 -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/index.ts +4 -0
  127. package/src/layout/GridView/index.vue +16 -16
  128. package/src/layout/PageLayout.vue +9 -9
  129. package/src/layout/SingleLayout.vue +9 -9
  130. package/src/locales/en-US.json +128 -128
  131. package/src/locales/zh-CN.json +128 -128
  132. package/src/logic/LogicRunner.ts +67 -67
  133. package/src/logic/TestLogic.ts +13 -13
  134. package/src/logic/plugins/common/DateTools.ts +35 -35
  135. package/src/logic/plugins/common/VueTools.ts +30 -30
  136. package/src/logic/plugins/index.ts +7 -7
  137. package/src/main.ts +44 -44
  138. package/src/plugins/AppData.ts +38 -38
  139. package/src/plugins/GetLoginInfoService.ts +10 -10
  140. package/src/plugins/collectIcons.ts +10 -10
  141. package/src/plugins/index.ts +11 -11
  142. package/src/router/README.md +8 -8
  143. package/src/router/external-routes.ts +60 -0
  144. package/src/router/guards.ts +131 -59
  145. package/src/router/index.ts +35 -35
  146. package/src/router/invoiceRoutes.ts +33 -33
  147. package/src/router/routes.ts +426 -347
  148. package/src/services/api/Login.ts +6 -6
  149. package/src/services/api/common.ts +109 -109
  150. package/src/services/api/index.ts +7 -7
  151. package/src/services/api/manage.ts +8 -8
  152. package/src/services/api/search.ts +16 -16
  153. package/src/services/api/user.ts +17 -17
  154. package/src/services/restTools.ts +56 -56
  155. package/src/services/v3Api.ts +147 -147
  156. package/src/stores/index.ts +13 -13
  157. package/src/stores/modules/counter.ts +19 -19
  158. package/src/stores/modules/homeApp.ts +55 -55
  159. package/src/stores/modules/routeCache.ts +22 -23
  160. package/src/stores/modules/setting.ts +87 -87
  161. package/src/stores/modules/user.ts +326 -235
  162. package/src/stores/mutation-type.ts +12 -7
  163. package/src/styles/app.less +36 -36
  164. package/src/styles/login.less +109 -109
  165. package/src/styles/var.less +25 -25
  166. package/src/types/auth.ts +85 -0
  167. package/src/types/env.d.ts +16 -16
  168. package/src/types/platform.ts +194 -0
  169. package/src/types/settings.ts +1 -1
  170. package/src/types/vue-router.d.ts +13 -9
  171. package/src/utils/Storage.ts +124 -124
  172. package/src/utils/authority-utils.ts +84 -84
  173. package/src/utils/common.ts +41 -41
  174. package/src/utils/crypto.ts +39 -39
  175. package/src/utils/dataUtil.ts +42 -42
  176. package/src/utils/dictUtil.ts +52 -52
  177. package/src/utils/http/index.ts +201 -199
  178. package/src/utils/i18n.ts +72 -72
  179. package/src/utils/indexedDB.ts +195 -195
  180. package/src/utils/inline-px-to-vw.ts +28 -28
  181. package/src/utils/mobileUtil.ts +33 -34
  182. package/src/utils/platform-auth.ts +134 -0
  183. package/src/utils/progress.ts +19 -19
  184. package/src/utils/routerUtil.ts +271 -271
  185. package/src/utils/runEvalFunction.ts +13 -13
  186. package/src/utils/secureStorage.ts +70 -71
  187. package/src/utils/set-page-title.ts +5 -5
  188. package/src/utils/validate.ts +6 -6
  189. package/src/views/chat/index.vue +153 -153
  190. package/src/views/common/Forbidden.vue +97 -0
  191. package/src/views/common/LoadError.vue +63 -63
  192. package/src/views/common/NotFound.vue +67 -67
  193. package/src/views/component/EvaluateRecordView/index.vue +40 -40
  194. package/src/views/component/IconifyView/index.vue +504 -504
  195. package/src/views/component/UserDetailView/UserDetailPage.vue +77 -77
  196. package/src/views/component/UserDetailView/index.vue +234 -234
  197. package/src/views/component/XCellDetailView/index.vue +217 -217
  198. package/src/views/component/XCellListView/index.vue +108 -129
  199. package/src/views/component/XFormAppraiseView/index.vue +174 -174
  200. package/src/views/component/XFormGroupView/index.vue +78 -82
  201. package/src/views/component/XFormView/index.vue +27 -27
  202. package/src/views/component/XOlMapView/XLocationPicker/index.vue +118 -118
  203. package/src/views/component/XOlMapView/index.vue +434 -434
  204. package/src/views/component/XOlMapView/testData.ts +64 -64
  205. package/src/views/component/XReportFormIframeView/index.vue +47 -47
  206. package/src/views/component/XReportFormView/index.vue +13 -13
  207. package/src/views/component/XReportGridView/index.vue +17 -17
  208. package/src/views/component/XRequestView/index.vue +234 -234
  209. package/src/views/component/XSignatureView/index.vue +50 -50
  210. package/src/views/component/index.vue +181 -181
  211. package/src/views/component/menu.vue +117 -117
  212. package/src/views/component/notice.vue +46 -46
  213. package/src/views/component/topNav.vue +36 -36
  214. package/src/views/external/index.vue +152 -0
  215. package/src/views/invoiceShow/index.vue +61 -61
  216. package/src/views/loading/AuthLoading.vue +345 -0
  217. package/src/views/user/login/ForgetPasswordForm.vue +94 -94
  218. package/src/views/user/login/LoginForm.vue +350 -347
  219. package/src/views/user/login/LoginTitle.vue +76 -76
  220. package/src/views/user/login/LoginWave.vue +109 -109
  221. package/src/views/user/login/index.vue +22 -22
  222. package/src/views/user/my/comm/ModifyPassword.vue +346 -346
  223. package/src/views/user/my/index.vue +507 -507
  224. package/src/views/user/register/index.vue +952 -952
  225. package/src/views/userRecords/AbnormalAlarmRecords.vue +21 -21
  226. package/src/views/userRecords/CardReplacementRecords.vue +21 -21
  227. package/src/views/userRecords/ChangeRecords.vue +19 -19
  228. package/src/views/userRecords/CommandViewRecords.vue +20 -20
  229. package/src/views/userRecords/GasCompensationRecords.vue +20 -20
  230. package/src/views/userRecords/InstrumentCollectionRecords.vue +21 -21
  231. package/src/views/userRecords/MeterRecords.vue +20 -20
  232. package/src/views/userRecords/OperateRecords.vue +51 -51
  233. package/src/views/userRecords/OtherChargeRecords.vue +19 -19
  234. package/src/views/userRecords/PaymentRecords.vue +28 -28
  235. package/src/views/userRecords/PriceAdjustmentRecords.vue +19 -19
  236. package/src/views/userRecords/ReplacementRecords.vue +19 -19
  237. package/src/views/userRecords/SafetyRecords.vue +19 -19
  238. package/src/views/userRecords/TransactionRecords.vue +21 -21
  239. package/src/views/userRecords/TransferRecords.vue +19 -19
  240. package/src/views/userRecords/operateRecordDetail/index.vue +316 -316
  241. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AddUserDetail.vue +124 -124
  242. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AdvanceDeliveryDetail.vue +88 -88
  243. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AutoAccountsCancelDetail.vue +205 -205
  244. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AutoAccountsDetail.vue +192 -192
  245. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BankDkDetail.vue +192 -192
  246. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BankPayDetail.vue +192 -192
  247. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BlacklistDetail.vue +153 -153
  248. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CancellationDetail.vue +101 -101
  249. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardMeterCenterCancelDetail.vue +127 -127
  250. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardMeterCenterDetail.vue +153 -153
  251. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardOverUserDetail.vue +153 -153
  252. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ChangeMeterCancelDetail.vue +166 -166
  253. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ChangeMeterDetail.vue +205 -205
  254. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/DisableManageDetail.vue +127 -127
  255. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/EnableManageDetail.vue +114 -114
  256. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/FaZheChangeDetail.vue +124 -124
  257. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/FeeDeductionDetail.vue +153 -153
  258. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/GasPriceChangeDetail.vue +126 -126
  259. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/InputtorChangeDetail.vue +126 -126
  260. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotMeterCenterCancelDetail.vue +114 -114
  261. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotMeterCenterDetail.vue +127 -127
  262. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotOpenDetail.vue +88 -88
  263. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineCardDetail.vue +101 -101
  264. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineMeterCenterCancelDetail.vue +218 -218
  265. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineMeterCenterDetail.vue +153 -153
  266. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OffGasAddGasDetail.vue +140 -140
  267. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OtherChargeCancelDetail.vue +127 -127
  268. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OtherChargeDetail.vue +114 -114
  269. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OverUserChangeDetail.vue +127 -127
  270. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReBillDetail.vue +127 -127
  271. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/RefundDetail.vue +114 -114
  272. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReplaceCardManageCancelDetail.vue +127 -127
  273. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReplaceCardManageDetail.vue +114 -114
  274. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/SaleCardGasDetail.vue +140 -140
  275. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/TransferManageCancelDetail.vue +152 -152
  276. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/TransferManageDetail.vue +178 -178
  277. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/UserChangeDetail.vue +123 -123
  278. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/WechatPayDetail.vue +192 -192
  279. package/src/views/userRecords/types.ts +66 -66
  280. package/tsconfig.json +39 -39
  281. package/uno.config.ts +82 -82
  282. package/vite.config.ts +119 -118
  283. package/src/router/types.ts +0 -7
  284. 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
+ }