af-mobile-client-vue3 1.3.29 → 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.
- package/.claude/settings.local.json +10 -0
- package/.cursorrules +60 -60
- package/.editorconfig +9 -9
- package/.env +10 -10
- package/.env.development +1 -1
- package/.env.production +1 -1
- package/.node-version +1 -1
- package/.vscode/extensions.json +12 -12
- package/.vscode/settings.json +68 -66
- package/CLAUDE.md +218 -189
- package/README.md +182 -182
- package/af-example-mobile-vue-web.iml +9 -9
- package/build/vite/index.ts +98 -98
- package/build/vite/optimize.ts +34 -34
- package/build/vite/vconsole.ts +47 -47
- package/commitlint.config.ts +32 -32
- package/compress.js +36 -36
- package/eslint.config.ts +31 -30
- package/index.html +23 -23
- package/mock/data.ts +20 -20
- package/mock/index.ts +7 -7
- package/mock/modules/prose.mock.ts +13 -13
- package/mock/modules/user.mock.ts +95 -152
- package/mock/util.ts +19 -19
- package/netlify.toml +12 -12
- package/package.json +114 -114
- package/postcss.config.ts +27 -27
- package/public/favicon.svg +4 -4
- package/public/safari-pinned-tab.svg +4 -4
- package/scripts/verifyCommit.js +19 -19
- package/src/App.vue +79 -79
- package/src/api/auth/index.ts +77 -0
- package/src/api/auth/types.ts +200 -0
- package/src/api/mock/index.ts +30 -30
- package/src/api/user/index.ts +40 -40
- package/src/assets/img/user/login/background-shadow-1.svg +20 -20
- package/src/assets/img/user/login/logo-background.svg +20 -20
- package/src/bootstrap.ts +26 -26
- package/src/components/core/BeautifulLoading/index.vue +52 -52
- package/src/components/core/ImageUploader/index.vue +251 -249
- package/src/components/core/NavBar/index.vue +53 -53
- package/src/components/core/Tabbar/index.vue +32 -32
- package/src/components/core/Uploader/index.vue +124 -124
- package/src/components/core/XGridDropOption/index.vue +154 -154
- package/src/components/core/XMultiSelect/index.vue +183 -183
- package/src/components/core/XSelect/index.vue +149 -149
- package/src/components/data/CardContainer/CardContainer.vue +118 -118
- package/src/components/data/CardContainer/CardHeader.vue +99 -99
- package/src/components/data/InfoDisplay/index.vue +132 -132
- package/src/components/data/UserDetail/api.ts +24 -24
- package/src/components/data/UserDetail/index.vue +620 -620
- package/src/components/data/UserDetail/recordEntries.ts +159 -159
- package/src/components/data/UserDetail/types.ts +26 -26
- package/src/components/data/XBadge/index.vue +82 -82
- package/src/components/data/XCellDetail/index.vue +105 -105
- package/src/components/data/XCellList/XCellList.md +432 -313
- package/src/components/data/XCellList/index.vue +1436 -1436
- package/src/components/data/XCellListFilter/QrScanner/index.vue +207 -207
- package/src/components/data/XCellListFilter/QrScanner/startScanAnimation.ts +53 -53
- package/src/components/data/XCellListFilter/VpnRecognition/index.vue +119 -119
- package/src/components/data/XCellListFilter/index.vue +705 -705
- package/src/components/data/XForm/index.vue +659 -659
- package/src/components/data/XFormGroup/doc/DeviceForm.vue +122 -122
- package/src/components/data/XFormGroup/doc/FormGroupDemo.vue +56 -56
- package/src/components/data/XFormGroup/doc/README.md +286 -286
- package/src/components/data/XFormGroup/doc/UserForm.vue +102 -102
- package/src/components/data/XFormGroup/index.vue +240 -240
- package/src/components/data/XFormItem/index.vue +1310 -1310
- package/src/components/data/XOlMap/README.md +227 -227
- package/src/components/data/XOlMap/XLocationPicker/index.vue +226 -226
- package/src/components/data/XOlMap/index.vue +1490 -1490
- package/src/components/data/XOlMap/types.ts +149 -149
- package/src/components/data/XOlMap/utils/{wgs84ToGcj02.js → wgs84ToGcj02.ts} +33 -16
- package/src/components/data/XReportForm/DateTimeSecondsPicker.vue +208 -208
- package/src/components/data/XReportForm/XReportFormJsonRender.vue +220 -220
- package/src/components/data/XReportForm/index.vue +1393 -1393
- package/src/components/data/XReportGrid/XAddReport/XAddReport.vue +198 -198
- package/src/components/data/XReportGrid/XAddReport/index.js +3 -3
- package/src/components/data/XReportGrid/XAddReport/index.md +53 -53
- package/src/components/data/XReportGrid/XAddReport/index.ts +10 -10
- package/src/components/data/XReportGrid/XReport.vue +960 -960
- package/src/components/data/XReportGrid/XReportDemo.vue +33 -33
- package/src/components/data/XReportGrid/XReportDesign.vue +597 -597
- package/src/components/data/XReportGrid/XReportDrawer/XReportDrawer.vue +148 -148
- package/src/components/data/XReportGrid/XReportDrawer/index.js +3 -3
- package/src/components/data/XReportGrid/XReportDrawer/index.ts +10 -10
- package/src/components/data/XReportGrid/XReportJsonRender.vue +399 -399
- package/src/components/data/XReportGrid/XReportTrGroup.vue +592 -592
- package/src/components/data/XReportGrid/index.md +46 -46
- package/src/components/data/XReportGrid/print.js +184 -184
- package/src/components/data/XSignature/index.vue +284 -284
- package/src/components/data/XTag/index.vue +10 -10
- package/src/components/layout/NormalDataLayout/index.vue +69 -69
- package/src/components/layout/TabBarLayout/index.vue +40 -40
- package/src/composables/dark.ts +5 -5
- package/src/config/routes.ts +9 -9
- package/src/constants/index.ts +2 -2
- package/src/enums/requestEnum.ts +25 -25
- package/src/expression/ExpressionRunner.ts +28 -28
- package/src/expression/TestExpression.ts +510 -510
- package/src/expression/core/Delegate.ts +116 -116
- package/src/expression/core/Expression.ts +1359 -1359
- package/src/expression/core/Program.ts +985 -985
- package/src/expression/core/Token.ts +29 -29
- package/src/expression/enums/ExpressionType.ts +81 -81
- package/src/expression/enums/TokenType.ts +11 -11
- package/src/expression/exception/BreakWayException.ts +2 -2
- package/src/expression/exception/ContinueWayException.ts +2 -2
- package/src/expression/exception/ExpressionException.ts +29 -29
- package/src/expression/exception/ReturnWayException.ts +14 -14
- package/src/expression/exception/ServiceException.ts +22 -22
- package/src/expression/instances/JSONArray.ts +52 -52
- package/src/expression/instances/JSONObject.ts +118 -118
- package/src/expression/instances/LogicConsole.ts +31 -31
- package/src/font-style/font.css +4 -4
- package/src/hooks/useBoolean.ts +26 -26
- package/src/hooks/useCommon.ts +9 -9
- package/src/hooks/useLoading.ts +16 -16
- package/src/hooks/useLogin.ts +97 -97
- package/src/icons/svg/check-in.svg +32 -32
- package/src/icons/svg/dark.svg +4 -4
- package/src/icons/svg/github.svg +4 -4
- package/src/icons/svg/light.svg +4 -4
- package/src/icons/svg/link.svg +4 -4
- package/src/icons/svgo.yml +22 -22
- package/src/layout/GridView/index.vue +16 -16
- package/src/layout/PageLayout.vue +9 -9
- package/src/layout/SingleLayout.vue +9 -9
- package/src/locales/en-US.json +128 -128
- package/src/locales/zh-CN.json +128 -128
- package/src/logic/LogicRunner.ts +67 -67
- package/src/logic/TestLogic.ts +13 -13
- package/src/logic/plugins/common/DateTools.ts +35 -35
- package/src/logic/plugins/common/VueTools.ts +30 -30
- package/src/logic/plugins/index.ts +7 -7
- package/src/main.ts +44 -44
- package/src/plugins/AppData.ts +38 -38
- package/src/plugins/GetLoginInfoService.ts +10 -10
- package/src/plugins/collectIcons.ts +10 -10
- package/src/plugins/index.ts +11 -11
- package/src/router/README.md +8 -8
- package/src/router/external-routes.ts +60 -0
- package/src/router/guards.ts +131 -59
- package/src/router/index.ts +35 -35
- package/src/router/invoiceRoutes.ts +33 -33
- package/src/router/routes.ts +426 -347
- package/src/services/api/Login.ts +6 -6
- package/src/services/api/common.ts +109 -109
- package/src/services/api/index.ts +7 -7
- package/src/services/api/manage.ts +8 -8
- package/src/services/api/search.ts +16 -16
- package/src/services/api/user.ts +17 -17
- package/src/services/restTools.ts +56 -56
- package/src/services/v3Api.ts +147 -147
- package/src/stores/index.ts +13 -13
- package/src/stores/modules/counter.ts +19 -19
- package/src/stores/modules/homeApp.ts +55 -55
- package/src/stores/modules/routeCache.ts +22 -23
- package/src/stores/modules/setting.ts +87 -87
- package/src/stores/modules/user.ts +326 -235
- package/src/stores/mutation-type.ts +12 -7
- package/src/styles/app.less +36 -36
- package/src/styles/login.less +109 -109
- package/src/styles/var.less +25 -25
- package/src/types/auth.ts +85 -0
- package/src/types/env.d.ts +16 -16
- package/src/types/platform.ts +194 -0
- package/src/types/settings.ts +1 -1
- package/src/types/vue-router.d.ts +13 -9
- package/src/utils/Storage.ts +124 -124
- package/src/utils/authority-utils.ts +84 -84
- package/src/utils/common.ts +41 -41
- package/src/utils/crypto.ts +39 -39
- package/src/utils/dataUtil.ts +42 -42
- package/src/utils/dictUtil.ts +52 -52
- package/src/utils/http/index.ts +201 -199
- package/src/utils/i18n.ts +72 -72
- package/src/utils/indexedDB.ts +195 -195
- package/src/utils/inline-px-to-vw.ts +28 -28
- package/src/utils/mobileUtil.ts +33 -34
- package/src/utils/platform-auth.ts +134 -0
- package/src/utils/progress.ts +19 -19
- package/src/utils/queryFormDefaultRangePicker.ts +57 -57
- package/src/utils/routerUtil.ts +271 -271
- package/src/utils/runEvalFunction.ts +13 -13
- package/src/utils/secureStorage.ts +70 -71
- package/src/utils/set-page-title.ts +5 -5
- package/src/utils/validate.ts +6 -6
- package/src/views/chat/index.vue +153 -153
- package/src/views/common/Forbidden.vue +97 -0
- package/src/views/common/LoadError.vue +63 -63
- package/src/views/common/NotFound.vue +67 -67
- package/src/views/component/EvaluateRecordView/index.vue +40 -40
- package/src/views/component/IconifyView/index.vue +504 -504
- package/src/views/component/UserDetailView/UserDetailPage.vue +77 -77
- package/src/views/component/UserDetailView/index.vue +234 -234
- package/src/views/component/XCellDetailView/index.vue +217 -217
- package/src/views/component/XCellListView/index.vue +108 -108
- package/src/views/component/XFormAppraiseView/index.vue +174 -174
- package/src/views/component/XFormGroupView/index.vue +78 -78
- package/src/views/component/XFormView/index.vue +27 -27
- package/src/views/component/XOlMapView/index.vue +434 -434
- package/src/views/component/XOlMapView/testData.ts +64 -64
- package/src/views/component/XReportFormIframeView/index.vue +47 -47
- package/src/views/component/XReportFormView/index.vue +13 -13
- package/src/views/component/XReportGridView/index.vue +17 -17
- package/src/views/component/XRequestView/index.vue +234 -234
- package/src/views/component/XSignatureView/index.vue +50 -50
- package/src/views/component/index.vue +181 -181
- package/src/views/component/menu.vue +117 -117
- package/src/views/component/notice.vue +46 -46
- package/src/views/component/topNav.vue +36 -36
- package/src/views/external/index.vue +152 -0
- package/src/views/invoiceShow/index.vue +61 -61
- package/src/views/loading/AuthLoading.vue +345 -0
- package/src/views/user/login/ForgetPasswordForm.vue +94 -94
- package/src/views/user/login/LoginForm.vue +350 -347
- package/src/views/user/login/LoginTitle.vue +76 -76
- package/src/views/user/login/LoginWave.vue +109 -109
- package/src/views/user/login/index.vue +22 -22
- package/src/views/user/my/comm/ModifyPassword.vue +346 -346
- package/src/views/user/my/index.vue +507 -507
- package/src/views/user/register/index.vue +952 -952
- package/src/views/userRecords/AbnormalAlarmRecords.vue +21 -21
- package/src/views/userRecords/CardReplacementRecords.vue +21 -21
- package/src/views/userRecords/ChangeRecords.vue +19 -19
- package/src/views/userRecords/CommandViewRecords.vue +20 -20
- package/src/views/userRecords/GasCompensationRecords.vue +20 -20
- package/src/views/userRecords/InstrumentCollectionRecords.vue +21 -21
- package/src/views/userRecords/MeterRecords.vue +20 -20
- package/src/views/userRecords/OperateRecords.vue +51 -51
- package/src/views/userRecords/OtherChargeRecords.vue +19 -19
- package/src/views/userRecords/PaymentRecords.vue +28 -28
- package/src/views/userRecords/PriceAdjustmentRecords.vue +19 -19
- package/src/views/userRecords/ReplacementRecords.vue +19 -19
- package/src/views/userRecords/SafetyRecords.vue +19 -19
- package/src/views/userRecords/TransactionRecords.vue +21 -21
- package/src/views/userRecords/TransferRecords.vue +19 -19
- package/src/views/userRecords/operateRecordDetail/index.vue +316 -316
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AddUserDetail.vue +124 -124
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AdvanceDeliveryDetail.vue +88 -88
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AutoAccountsCancelDetail.vue +205 -205
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AutoAccountsDetail.vue +192 -192
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BankDkDetail.vue +192 -192
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BankPayDetail.vue +192 -192
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BlacklistDetail.vue +153 -153
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CancellationDetail.vue +101 -101
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardMeterCenterCancelDetail.vue +127 -127
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardMeterCenterDetail.vue +153 -153
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardOverUserDetail.vue +153 -153
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ChangeMeterCancelDetail.vue +166 -166
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ChangeMeterDetail.vue +205 -205
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/DisableManageDetail.vue +127 -127
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/EnableManageDetail.vue +114 -114
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/FaZheChangeDetail.vue +124 -124
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/FeeDeductionDetail.vue +153 -153
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/GasPriceChangeDetail.vue +126 -126
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/InputtorChangeDetail.vue +126 -126
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotMeterCenterCancelDetail.vue +114 -114
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotMeterCenterDetail.vue +127 -127
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotOpenDetail.vue +88 -88
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineCardDetail.vue +101 -101
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineMeterCenterCancelDetail.vue +218 -218
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineMeterCenterDetail.vue +153 -153
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OffGasAddGasDetail.vue +140 -140
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OtherChargeCancelDetail.vue +127 -127
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OtherChargeDetail.vue +114 -114
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OverUserChangeDetail.vue +127 -127
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReBillDetail.vue +127 -127
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/RefundDetail.vue +114 -114
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReplaceCardManageCancelDetail.vue +127 -127
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReplaceCardManageDetail.vue +114 -114
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/SaleCardGasDetail.vue +140 -140
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/TransferManageCancelDetail.vue +152 -152
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/TransferManageDetail.vue +178 -178
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/UserChangeDetail.vue +123 -123
- package/src/views/userRecords/operateRecordDetail/operateRecordDetails/WechatPayDetail.vue +192 -192
- package/src/views/userRecords/types.ts +66 -66
- package/tsconfig.json +39 -39
- package/uno.config.ts +82 -82
- package/vite.config.ts +119 -118
- package/src/router/types.ts +0 -7
- package/src/utils/wechatUtil.ts +0 -9
package/src/utils/dictUtil.ts
CHANGED
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 字典工具
|
|
3
|
-
*/
|
|
4
|
-
import { getConfigByName } from '@af-mobile-client-vue3/services/api/common'
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* 获取字典
|
|
8
|
-
* @param configName 配置名
|
|
9
|
-
* @param callback 获取到字典的回调
|
|
10
|
-
* @param serviceName 服务名
|
|
11
|
-
*/
|
|
12
|
-
export function getDict(configName: string, callback: Function, serviceName = import.meta.env.VITE_APP_SYSTEM_NAME) {
|
|
13
|
-
getConfigByName(configName, (result) => {
|
|
14
|
-
if (result != null && result.value) {
|
|
15
|
-
callback(result.value)
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
console.warn(`dict [${configName}] not found`)
|
|
19
|
-
callback(null)
|
|
20
|
-
}
|
|
21
|
-
}, serviceName)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function getDictItemByValue(configName: string, serviceName: string, value: string, callback: Function) {
|
|
25
|
-
getDict(configName, (result) => {
|
|
26
|
-
if (result != null) {
|
|
27
|
-
for (const item of result) {
|
|
28
|
-
if (item.value.toString() === value) {
|
|
29
|
-
callback(item)
|
|
30
|
-
return
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
console.warn(`dict [${configName}] 's value [${value}] not found`)
|
|
34
|
-
}
|
|
35
|
-
callback(null)
|
|
36
|
-
}, serviceName)
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function getDictItemByLabel(configName: string, serviceName: string, label: string, callback: Function) {
|
|
40
|
-
getDict(configName, (result) => {
|
|
41
|
-
if (result != null) {
|
|
42
|
-
for (const item of result) {
|
|
43
|
-
if (item.label.toString() === label) {
|
|
44
|
-
callback(item)
|
|
45
|
-
return
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
console.warn(`dict [${configName}] 's label [${label}] not found`)
|
|
49
|
-
}
|
|
50
|
-
callback(null)
|
|
51
|
-
}, serviceName)
|
|
52
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* 字典工具
|
|
3
|
+
*/
|
|
4
|
+
import { getConfigByName } from '@af-mobile-client-vue3/services/api/common'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 获取字典
|
|
8
|
+
* @param configName 配置名
|
|
9
|
+
* @param callback 获取到字典的回调
|
|
10
|
+
* @param serviceName 服务名
|
|
11
|
+
*/
|
|
12
|
+
export function getDict(configName: string, callback: Function, serviceName = import.meta.env.VITE_APP_SYSTEM_NAME) {
|
|
13
|
+
getConfigByName(configName, (result) => {
|
|
14
|
+
if (result != null && result.value) {
|
|
15
|
+
callback(result.value)
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
console.warn(`dict [${configName}] not found`)
|
|
19
|
+
callback(null)
|
|
20
|
+
}
|
|
21
|
+
}, serviceName)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function getDictItemByValue(configName: string, serviceName: string, value: string, callback: Function) {
|
|
25
|
+
getDict(configName, (result) => {
|
|
26
|
+
if (result != null) {
|
|
27
|
+
for (const item of result) {
|
|
28
|
+
if (item.value.toString() === value) {
|
|
29
|
+
callback(item)
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
console.warn(`dict [${configName}] 's value [${value}] not found`)
|
|
34
|
+
}
|
|
35
|
+
callback(null)
|
|
36
|
+
}, serviceName)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function getDictItemByLabel(configName: string, serviceName: string, label: string, callback: Function) {
|
|
40
|
+
getDict(configName, (result) => {
|
|
41
|
+
if (result != null) {
|
|
42
|
+
for (const item of result) {
|
|
43
|
+
if (item.label.toString() === label) {
|
|
44
|
+
callback(item)
|
|
45
|
+
return
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
console.warn(`dict [${configName}] 's label [${label}] not found`)
|
|
49
|
+
}
|
|
50
|
+
callback(null)
|
|
51
|
+
}, serviceName)
|
|
52
|
+
}
|
package/src/utils/http/index.ts
CHANGED
|
@@ -1,199 +1,201 @@
|
|
|
1
|
-
import type { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'
|
|
2
|
-
import { ContentTypeEnum, ResultEnum } from '@af-mobile-client-vue3/enums/requestEnum'
|
|
3
|
-
import { useUserStore } from '@af-mobile-client-vue3/stores/modules/user'
|
|
4
|
-
import { ACCESS_TOKEN } from '@af-mobile-client-vue3/stores/mutation-type'
|
|
5
|
-
import axios from 'axios'
|
|
6
|
-
import { showToast } from 'vant'
|
|
7
|
-
|
|
8
|
-
// 默认 axios 实例请求配置
|
|
9
|
-
const configDefault = {
|
|
10
|
-
headers: {
|
|
11
|
-
'Content-Type': ContentTypeEnum.JSON,
|
|
12
|
-
},
|
|
13
|
-
// 请求超时时间
|
|
14
|
-
timeout: 20000,
|
|
15
|
-
// API 请求的默认前缀
|
|
16
|
-
baseURL: import.meta.env.VITE_APP_API_BASE_URL,
|
|
17
|
-
data: {},
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
class Http {
|
|
21
|
-
// 当前实例
|
|
22
|
-
private static axiosInstance: AxiosInstance
|
|
23
|
-
// 请求配置
|
|
24
|
-
private static axiosConfigDefault: AxiosRequestConfig
|
|
25
|
-
|
|
26
|
-
// 请求拦截
|
|
27
|
-
private httpInterceptorsRequest(): void {
|
|
28
|
-
Http.axiosInstance.interceptors.request.use(
|
|
29
|
-
(config) => {
|
|
30
|
-
// 发送请求前,可在此让每个请求携带自定义 token, 请根据实际情况修改
|
|
31
|
-
const savedToken = useUserStore().getToken()
|
|
32
|
-
// 如果 token 存在
|
|
33
|
-
if (savedToken)
|
|
34
|
-
config.headers[ACCESS_TOKEN] = savedToken
|
|
35
|
-
return config
|
|
36
|
-
},
|
|
37
|
-
(error: AxiosError) => {
|
|
38
|
-
showToast({
|
|
39
|
-
message: error.message,
|
|
40
|
-
position: 'bottom',
|
|
41
|
-
})
|
|
42
|
-
return Promise.reject(error)
|
|
43
|
-
},
|
|
44
|
-
)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// 响应拦截
|
|
48
|
-
private httpInterceptorsResponse(): void {
|
|
49
|
-
Http.axiosInstance.interceptors.response.use(
|
|
50
|
-
async (response: AxiosResponse) => {
|
|
51
|
-
const compatible = import.meta.env.VITE_APP_COMPATIBLE
|
|
52
|
-
if (compatible !== 'V4') {
|
|
53
|
-
return response.data
|
|
54
|
-
}
|
|
55
|
-
// 与后端协定的返回字段
|
|
56
|
-
const { code, msg, data } = response.data
|
|
57
|
-
// 临时向v3请求上传服务,因为没有code,未来会改
|
|
58
|
-
if (code === undefined) {
|
|
59
|
-
return response.data
|
|
60
|
-
}
|
|
61
|
-
// 判断请求是否成功
|
|
62
|
-
const isSuccess = code === ResultEnum.SUCCESS
|
|
63
|
-
if (isSuccess) {
|
|
64
|
-
// 兼容 V3 请求没有data的情况
|
|
65
|
-
if (data) {
|
|
66
|
-
return data
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
return response.data
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
if (code === 401) {
|
|
74
|
-
showToast({
|
|
75
|
-
message: '登录态已失效,请重新登录',
|
|
76
|
-
position: 'bottom',
|
|
77
|
-
})
|
|
78
|
-
await useUserStore().logout()
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
showToast({
|
|
82
|
-
message: msg,
|
|
83
|
-
position: 'bottom',
|
|
84
|
-
})
|
|
85
|
-
console.error(`请求失败,返回结果:${msg}`)
|
|
86
|
-
}
|
|
87
|
-
return Promise.reject(response.data)
|
|
88
|
-
}
|
|
89
|
-
},
|
|
90
|
-
(error: AxiosError) => {
|
|
91
|
-
// 处理 HTTP 网络错误
|
|
92
|
-
let message: string = error.response?.data as string
|
|
93
|
-
if (!message) {
|
|
94
|
-
// HTTP 状态码
|
|
95
|
-
const status = error.response?.status
|
|
96
|
-
switch (status) {
|
|
97
|
-
case 400:
|
|
98
|
-
message = '请求错误'
|
|
99
|
-
break
|
|
100
|
-
case 401:
|
|
101
|
-
message = '
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
*
|
|
176
|
-
* @param
|
|
177
|
-
* @param
|
|
178
|
-
* @
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
case METHOD.
|
|
185
|
-
return axios.
|
|
186
|
-
case METHOD.
|
|
187
|
-
return axios.
|
|
188
|
-
case METHOD.
|
|
189
|
-
return axios.
|
|
190
|
-
|
|
191
|
-
return axios.
|
|
192
|
-
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
1
|
+
import type { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'
|
|
2
|
+
import { ContentTypeEnum, ResultEnum } from '@af-mobile-client-vue3/enums/requestEnum'
|
|
3
|
+
import { useUserStore } from '@af-mobile-client-vue3/stores/modules/user'
|
|
4
|
+
import { ACCESS_TOKEN } from '@af-mobile-client-vue3/stores/mutation-type'
|
|
5
|
+
import axios from 'axios'
|
|
6
|
+
import { showToast } from 'vant'
|
|
7
|
+
|
|
8
|
+
// 默认 axios 实例请求配置
|
|
9
|
+
const configDefault = {
|
|
10
|
+
headers: {
|
|
11
|
+
'Content-Type': ContentTypeEnum.JSON,
|
|
12
|
+
},
|
|
13
|
+
// 请求超时时间
|
|
14
|
+
timeout: 20000,
|
|
15
|
+
// API 请求的默认前缀
|
|
16
|
+
baseURL: import.meta.env.VITE_APP_API_BASE_URL,
|
|
17
|
+
data: {},
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
class Http {
|
|
21
|
+
// 当前实例
|
|
22
|
+
private static axiosInstance: AxiosInstance
|
|
23
|
+
// 请求配置
|
|
24
|
+
private static axiosConfigDefault: AxiosRequestConfig
|
|
25
|
+
|
|
26
|
+
// 请求拦截
|
|
27
|
+
private httpInterceptorsRequest(): void {
|
|
28
|
+
Http.axiosInstance.interceptors.request.use(
|
|
29
|
+
(config) => {
|
|
30
|
+
// 发送请求前,可在此让每个请求携带自定义 token, 请根据实际情况修改
|
|
31
|
+
const savedToken = useUserStore().getToken()
|
|
32
|
+
// 如果 token 存在
|
|
33
|
+
if (savedToken)
|
|
34
|
+
config.headers[ACCESS_TOKEN] = savedToken
|
|
35
|
+
return config
|
|
36
|
+
},
|
|
37
|
+
(error: AxiosError) => {
|
|
38
|
+
showToast({
|
|
39
|
+
message: error.message,
|
|
40
|
+
position: 'bottom',
|
|
41
|
+
})
|
|
42
|
+
return Promise.reject(error)
|
|
43
|
+
},
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 响应拦截
|
|
48
|
+
private httpInterceptorsResponse(): void {
|
|
49
|
+
Http.axiosInstance.interceptors.response.use(
|
|
50
|
+
async (response: AxiosResponse) => {
|
|
51
|
+
const compatible = import.meta.env.VITE_APP_COMPATIBLE
|
|
52
|
+
if (compatible !== 'V4') {
|
|
53
|
+
return response.data
|
|
54
|
+
}
|
|
55
|
+
// 与后端协定的返回字段
|
|
56
|
+
const { code, msg, data } = response.data
|
|
57
|
+
// 临时向v3请求上传服务,因为没有code,未来会改
|
|
58
|
+
if (code === undefined) {
|
|
59
|
+
return response.data
|
|
60
|
+
}
|
|
61
|
+
// 判断请求是否成功
|
|
62
|
+
const isSuccess = code === ResultEnum.SUCCESS
|
|
63
|
+
if (isSuccess) {
|
|
64
|
+
// 兼容 V3 请求没有data的情况
|
|
65
|
+
if (data) {
|
|
66
|
+
return data
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
return response.data
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
if (code === 401) {
|
|
74
|
+
showToast({
|
|
75
|
+
message: '登录态已失效,请重新登录',
|
|
76
|
+
position: 'bottom',
|
|
77
|
+
})
|
|
78
|
+
await useUserStore().logout()
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
showToast({
|
|
82
|
+
message: msg,
|
|
83
|
+
position: 'bottom',
|
|
84
|
+
})
|
|
85
|
+
console.error(`请求失败,返回结果:${msg}`)
|
|
86
|
+
}
|
|
87
|
+
return Promise.reject(response.data)
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
(error: AxiosError) => {
|
|
91
|
+
// 处理 HTTP 网络错误
|
|
92
|
+
let message: string = error.response?.data as string
|
|
93
|
+
if (!message) {
|
|
94
|
+
// HTTP 状态码
|
|
95
|
+
const status = error.response?.status
|
|
96
|
+
switch (status) {
|
|
97
|
+
case 400:
|
|
98
|
+
message = '请求错误'
|
|
99
|
+
break
|
|
100
|
+
case 401:
|
|
101
|
+
message = '登录态已失效,请重新登录'
|
|
102
|
+
// 401状态码处理:自动登出并跳转到登录页
|
|
103
|
+
useUserStore().logout()
|
|
104
|
+
break
|
|
105
|
+
case 403:
|
|
106
|
+
message = '拒绝访问'
|
|
107
|
+
break
|
|
108
|
+
case 404:
|
|
109
|
+
message = `请求地址出错: ${error.response?.config?.url}`
|
|
110
|
+
break
|
|
111
|
+
case 408:
|
|
112
|
+
message = '请求超时'
|
|
113
|
+
break
|
|
114
|
+
case 500:
|
|
115
|
+
message = '服务器内部错误'
|
|
116
|
+
break
|
|
117
|
+
case 501:
|
|
118
|
+
message = '服务未实现'
|
|
119
|
+
break
|
|
120
|
+
case 502:
|
|
121
|
+
message = '网关错误'
|
|
122
|
+
break
|
|
123
|
+
case 503:
|
|
124
|
+
message = '服务不可用'
|
|
125
|
+
break
|
|
126
|
+
case 504:
|
|
127
|
+
message = '网关超时'
|
|
128
|
+
break
|
|
129
|
+
case 505:
|
|
130
|
+
message = 'HTTP版本不受支持'
|
|
131
|
+
break
|
|
132
|
+
default:
|
|
133
|
+
message = '网络连接故障'
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
showToast({
|
|
137
|
+
message,
|
|
138
|
+
position: 'bottom',
|
|
139
|
+
})
|
|
140
|
+
return Promise.reject(error)
|
|
141
|
+
},
|
|
142
|
+
)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
constructor(config: AxiosRequestConfig) {
|
|
146
|
+
Http.axiosConfigDefault = config
|
|
147
|
+
Http.axiosInstance = axios.create(config)
|
|
148
|
+
this.httpInterceptorsRequest()
|
|
149
|
+
this.httpInterceptorsResponse()
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// 通用请求函数
|
|
153
|
+
public request<T>(paramConfig: AxiosRequestConfig): Promise<T> {
|
|
154
|
+
const config = { ...Http.axiosConfigDefault, ...paramConfig }
|
|
155
|
+
return new Promise((resolve, reject) => {
|
|
156
|
+
Http.axiosInstance
|
|
157
|
+
.request(config)
|
|
158
|
+
.then((response: any) => {
|
|
159
|
+
resolve(response)
|
|
160
|
+
})
|
|
161
|
+
.catch((error) => {
|
|
162
|
+
reject(error)
|
|
163
|
+
})
|
|
164
|
+
})
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const METHOD = {
|
|
169
|
+
GET: 'get',
|
|
170
|
+
POST: 'post',
|
|
171
|
+
PUT: 'put',
|
|
172
|
+
DELETE: 'delete',
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* axios请求
|
|
176
|
+
* @param url 请求地址
|
|
177
|
+
* @param method {METHOD} http method
|
|
178
|
+
* @param params 请求参数
|
|
179
|
+
* @param config
|
|
180
|
+
* @returns {Promise<AxiosResponse<T>>}
|
|
181
|
+
*/
|
|
182
|
+
async function request(url, method, params, config) {
|
|
183
|
+
switch (method) {
|
|
184
|
+
case METHOD.GET:
|
|
185
|
+
return axios.get(url, { params, ...config })
|
|
186
|
+
case METHOD.POST:
|
|
187
|
+
return axios.post(url, params, config)
|
|
188
|
+
case METHOD.PUT:
|
|
189
|
+
return axios.put(url, params, config)
|
|
190
|
+
case METHOD.DELETE:
|
|
191
|
+
return axios.delete(url, { params, ...config })
|
|
192
|
+
default:
|
|
193
|
+
return axios.get(url, { params, ...config })
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export const http = new Http(configDefault)
|
|
198
|
+
export {
|
|
199
|
+
METHOD,
|
|
200
|
+
request,
|
|
201
|
+
}
|
package/src/utils/i18n.ts
CHANGED
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
import type { PickerColumn } from 'vant'
|
|
2
|
-
import { Locale } from 'vant'
|
|
3
|
-
import enUS from 'vant/es/locale/lang/en-US'
|
|
4
|
-
import zhCN from 'vant/es/locale/lang/zh-CN'
|
|
5
|
-
import { computed } from 'vue'
|
|
6
|
-
import { createI18n } from 'vue-i18n'
|
|
7
|
-
|
|
8
|
-
const FALLBACK_LOCALE = 'zh-CN'
|
|
9
|
-
|
|
10
|
-
const vantLocales = {
|
|
11
|
-
'zh-CN': zhCN,
|
|
12
|
-
'en-US': enUS,
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export const languageColumns: PickerColumn = [
|
|
16
|
-
{ text: '简体中文', value: 'zh-CN' },
|
|
17
|
-
{ text: 'English', value: 'en-US' },
|
|
18
|
-
]
|
|
19
|
-
|
|
20
|
-
export const i18n = setupI18n()
|
|
21
|
-
type I18n = typeof i18n
|
|
22
|
-
|
|
23
|
-
export const locale = computed({
|
|
24
|
-
get() {
|
|
25
|
-
return i18n.global.locale.value
|
|
26
|
-
},
|
|
27
|
-
set(language: string) {
|
|
28
|
-
setLang(language, i18n)
|
|
29
|
-
},
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
function setupI18n() {
|
|
33
|
-
const locale = getI18nLocale()
|
|
34
|
-
const i18n = createI18n({
|
|
35
|
-
locale,
|
|
36
|
-
legacy: false,
|
|
37
|
-
})
|
|
38
|
-
setLang(locale, i18n)
|
|
39
|
-
return i18n
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
async function setLang(lang: string, i18n: I18n) {
|
|
43
|
-
await loadLocaleMsg(lang, i18n)
|
|
44
|
-
|
|
45
|
-
document.querySelector('html').setAttribute('lang', lang)
|
|
46
|
-
localStorage.setItem('language', lang)
|
|
47
|
-
i18n.global.locale.value = lang
|
|
48
|
-
|
|
49
|
-
// 设置 vant 组件语言包
|
|
50
|
-
Locale.use(lang, vantLocales[lang])
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// 加载本地语言包
|
|
54
|
-
async function loadLocaleMsg(locale: string, i18n: I18n) {
|
|
55
|
-
const messages = await import(`../locales/${locale}.json`)
|
|
56
|
-
i18n.global.setLocaleMessage(locale, messages.default)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// 获取当前语言对应的语言包名称
|
|
60
|
-
function getI18nLocale() {
|
|
61
|
-
const storedLocale = localStorage.getItem('language') || navigator.language
|
|
62
|
-
|
|
63
|
-
const langs = languageColumns.map(v => v.value as string)
|
|
64
|
-
|
|
65
|
-
// 存在当前语言的语言包 或 存在当前语言的任意地区的语言包
|
|
66
|
-
const foundLocale = langs.find(v => v === storedLocale || v.indexOf(storedLocale) === 0)
|
|
67
|
-
|
|
68
|
-
// 若未找到,则使用 默认语言包
|
|
69
|
-
const locale = foundLocale || FALLBACK_LOCALE
|
|
70
|
-
|
|
71
|
-
return locale
|
|
72
|
-
}
|
|
1
|
+
import type { PickerColumn } from 'vant'
|
|
2
|
+
import { Locale } from 'vant'
|
|
3
|
+
import enUS from 'vant/es/locale/lang/en-US'
|
|
4
|
+
import zhCN from 'vant/es/locale/lang/zh-CN'
|
|
5
|
+
import { computed } from 'vue'
|
|
6
|
+
import { createI18n } from 'vue-i18n'
|
|
7
|
+
|
|
8
|
+
const FALLBACK_LOCALE = 'zh-CN'
|
|
9
|
+
|
|
10
|
+
const vantLocales = {
|
|
11
|
+
'zh-CN': zhCN,
|
|
12
|
+
'en-US': enUS,
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const languageColumns: PickerColumn = [
|
|
16
|
+
{ text: '简体中文', value: 'zh-CN' },
|
|
17
|
+
{ text: 'English', value: 'en-US' },
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
export const i18n = setupI18n()
|
|
21
|
+
type I18n = typeof i18n
|
|
22
|
+
|
|
23
|
+
export const locale = computed({
|
|
24
|
+
get() {
|
|
25
|
+
return i18n.global.locale.value
|
|
26
|
+
},
|
|
27
|
+
set(language: string) {
|
|
28
|
+
setLang(language, i18n)
|
|
29
|
+
},
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
function setupI18n() {
|
|
33
|
+
const locale = getI18nLocale()
|
|
34
|
+
const i18n = createI18n({
|
|
35
|
+
locale,
|
|
36
|
+
legacy: false,
|
|
37
|
+
})
|
|
38
|
+
setLang(locale, i18n)
|
|
39
|
+
return i18n
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function setLang(lang: string, i18n: I18n) {
|
|
43
|
+
await loadLocaleMsg(lang, i18n)
|
|
44
|
+
|
|
45
|
+
document.querySelector('html').setAttribute('lang', lang)
|
|
46
|
+
localStorage.setItem('language', lang)
|
|
47
|
+
i18n.global.locale.value = lang
|
|
48
|
+
|
|
49
|
+
// 设置 vant 组件语言包
|
|
50
|
+
Locale.use(lang, vantLocales[lang])
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// 加载本地语言包
|
|
54
|
+
async function loadLocaleMsg(locale: string, i18n: I18n) {
|
|
55
|
+
const messages = await import(`../locales/${locale}.json`)
|
|
56
|
+
i18n.global.setLocaleMessage(locale, messages.default)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// 获取当前语言对应的语言包名称
|
|
60
|
+
function getI18nLocale() {
|
|
61
|
+
const storedLocale = localStorage.getItem('language') || navigator.language
|
|
62
|
+
|
|
63
|
+
const langs = languageColumns.map(v => v.value as string)
|
|
64
|
+
|
|
65
|
+
// 存在当前语言的语言包 或 存在当前语言的任意地区的语言包
|
|
66
|
+
const foundLocale = langs.find(v => v === storedLocale || v.indexOf(storedLocale) === 0)
|
|
67
|
+
|
|
68
|
+
// 若未找到,则使用 默认语言包
|
|
69
|
+
const locale = foundLocale || FALLBACK_LOCALE
|
|
70
|
+
|
|
71
|
+
return locale
|
|
72
|
+
}
|