li.shaoyi il y a 1 jour
Parent
commit
26e24b1fd7
61 fichiers modifiés avec 301 ajouts et 510 suppressions
  1. 6 7
      src/business/login/index.ts
  2. 5 6
      src/filters/index.ts
  3. 3 4
      src/hooks/appsflyer/index.ts
  4. 2 3
      src/hooks/facebook/index.ts
  5. 2 1
      src/packages/digital/views/setting/index.vue
  6. 4 4
      src/packages/digital/views/user/login/index.vue
  7. 1 1
      src/packages/mobile/components/base/uploader/index.vue
  8. 4 5
      src/packages/mobile/components/layouts/login/index.vue
  9. 1 1
      src/packages/mobile/components/modules/luanguage/index.vue
  10. 1 1
      src/packages/mobile/components/modules/register-code/index.vue
  11. 1 1
      src/packages/mobile/components/modules/uploader/index.vue
  12. 1 1
      src/packages/mobile/views/home/main/Index.vue
  13. 2 4
      src/packages/mobile/views/mine/setting/Index.vue
  14. 4 4
      src/packages/mobile/views/order/position/components/goods/list/Index.vue
  15. 3 4
      src/packages/mobile/views/report/index.vue
  16. 1 1
      src/packages/mobile/views/rules/yszc/home.vue
  17. 1 1
      src/packages/mobile/views/spot/detail/Index.vue
  18. 1 1
      src/packages/mobile/views/swap/list/Index.vue
  19. 4 4
      src/packages/mobile/views/user/forget/Index.vue
  20. 3 3
      src/packages/mobile/views/user/password/Index.vue
  21. 4 4
      src/packages/mobile/views/user/register/Index.vue
  22. 1 1
      src/packages/pc/components/base/upload/index.vue
  23. 3 3
      src/packages/pc/components/layouts/header/components/setting/index.vue
  24. 1 1
      src/packages/pc/components/layouts/header/index.vue
  25. 2 1
      src/packages/pc/components/layouts/page/index.vue
  26. 1 1
      src/packages/pc/components/modules/goods-detail/order/index.vue
  27. 12 8
      src/packages/pc/components/modules/quote/price/index.vue
  28. 1 1
      src/packages/pc/views/account/sign/components/sign/index.vue
  29. 3 6
      src/packages/pc/views/auth/components/layout/index.vue
  30. 1 1
      src/packages/pc/views/auth/forget/index.vue
  31. 5 6
      src/packages/pc/views/auth/login/index.vue
  32. 1 1
      src/packages/pc/views/footer/capital/summary/index.vue
  33. 1 1
      src/packages/pc/views/market/trade/spot/order/index.vue
  34. 1 1
      src/packages/quote/views/quote/index.vue
  35. 3 3
      src/packages/sbyj/views/home/main/index.vue
  36. 3 3
      src/packages/sbyj/views/market/detail/composables.ts
  37. 2 2
      src/packages/sbyj/views/mine/index.vue
  38. 3 3
      src/packages/sbyj/views/order/detail/index.vue
  39. 2 3
      src/packages/sbyj/views/order/history/index.vue
  40. 3 3
      src/packages/sbyj/views/order/list/components/close-holder/index.vue
  41. 3 3
      src/packages/sbyj/views/order/list/components/market-order-delivery/index.vue
  42. 3 4
      src/packages/sbyj/views/order/list/index.vue
  43. 1 1
      src/packages/sbyj/views/user/login/Index.vue
  44. 2 1
      src/packages/sjgj/views/order/list/index.vue
  45. 4 4
      src/packages/tss/views/user/login/Index.vue
  46. 3 6
      src/services/api/account/index.ts
  47. 7 7
      src/services/api/common/index.ts
  48. 6 8
      src/services/http/index.ts
  49. 115 104
      src/services/index.ts
  50. 38 0
      src/services/types.ts
  51. 3 2
      src/services/websocket/quote.ts
  52. 3 2
      src/services/websocket/quoteV2.ts
  53. 3 2
      src/services/websocket/trade.ts
  54. 4 3
      src/services/websocket/tradeV2.ts
  55. 0 9
      src/services/worker/market/types.ts
  56. 0 0
      src/services/worker/quote/cache.ts
  57. 0 0
      src/services/worker/quote/thread.ts
  58. 0 163
      src/services/worker/service.ts
  59. 1 1
      src/services/worker/trade/index.ts
  60. 0 78
      src/stores/modules/global.ts
  61. 2 2
      src/stores/modules/market.ts

+ 6 - 7
src/business/login/index.ts

@@ -2,7 +2,7 @@ import { shallowRef, reactive } from 'vue'
 import { v4 } from 'uuid'
 import { timerTask } from '@/utils/timer'
 import { wsLogin, httpLogin, queryLoginId } from '@/services/api/account'
-import { useGlobalStore, useLoginStore, useEnumStore, useErrorInfoStore, useUserStore, useFuturesStore, useAccountStore, useDeliveryRelationStore, useGoodsCollectionStore } from '@/stores'
+import { useLoginStore, useEnumStore, useErrorInfoStore, useUserStore, useFuturesStore, useAccountStore, useDeliveryRelationStore, useGoodsCollectionStore } from '@/stores'
 import service from '@/services'
 import quoteSocket from '@/services/websocket/quote'
 import tradeSocket from '@/services/websocket/trade'
@@ -19,7 +19,6 @@ import { useCommonStore } from '@/stores/modules/common'
  * @returns 
  */
 export function useLogin(persist = false) {
-    const globalStore = useGlobalStore()
     const enumStore = useEnumStore()
     const errorInfoStore = useErrorInfoStore()
     const loginStore = useLoginStore()
@@ -40,7 +39,7 @@ export function useLogin(persist = false) {
     })
 
     const loadBaseData = async () => {
-        await service.onReady() // 等待服务初始化
+        await service.init() // 等待服务初始化
         await Promise.all([
             errorInfoStore.getErrorInfoList(),
             enumStore.getAllEnumList(),
@@ -60,7 +59,7 @@ export function useLogin(persist = false) {
         futuresStore.getGoodsList()
         checkTokenLoop()
 
-        if (globalStore.getSystemInfo('tradeChannel') === 'http') {
+        if (service.getAppConfig('tradeChannel') === 'http') {
             tradeV2Socket.connect()
         }
     }
@@ -81,7 +80,7 @@ export function useLogin(persist = false) {
                         reject('自动登录失败')
                     }
                 } else {
-                    if (globalStore.getSystemInfo('tradeChannel') === 'ws') {
+                    if (service.getAppConfig('tradeChannel') === 'ws') {
                         // websocket 登录参数
                         queryLoginId({
                             data: {
@@ -107,7 +106,7 @@ export function useLogin(persist = false) {
                 }
             })
 
-            if (globalStore.getSystemInfo('tradeChannel') === 'ws') {
+            if (service.getAppConfig('tradeChannel') === 'ws') {
                 // websocket 登录
                 const res = await wsLogin({
                     LoginID: payload.userName,
@@ -118,7 +117,7 @@ export function useLogin(persist = false) {
                     Version: '2.0.0.5'
                 })
                 // 首次登录是否强制修改密码
-                forcedPasswordChange = globalStore.getSystemInfo('forcedPasswordChange') && res.HasUpdatedPwd === 0
+                forcedPasswordChange = service.getAppConfig('forcedPasswordChange') && res.HasUpdatedPwd === 0
                 // 更新登录信息
                 loginStore.setLoginInfo({
                     expiresAt: 0,

+ 5 - 6
src/filters/index.ts

@@ -3,7 +3,7 @@ import service from '@/services'
 import Long from 'long'
 import moment from 'moment'
 import { currencyConfigMap } from '@/constants/currency'
-import { useGlobalStore, useUserStore, i18n } from '@/stores'
+import { useUserStore, i18n } from '@/stores'
 import { FormatCurrencyOptions } from './types'
 
 /**
@@ -13,7 +13,7 @@ import { FormatCurrencyOptions } from './types'
  * @returns 
  */
 export function getUrl(url: string, base?: string) {
-    const { uploadUrl } = service.config
+    const uploadUrl = service.getServiceConfig('uploadUrl')
     return new URL(url, base ?? uploadUrl)
 }
 
@@ -41,7 +41,7 @@ export function getFileUrl(filePath?: string) {
  * @returns 
  */
 export function getHtmlFileUrl(fileName: string) {
-    const { mobileOpenUrl } = service.config
+    const mobileOpenUrl = service.getServiceConfig('mobileOpenUrl')
     return mobileOpenUrl + '/html/' + fileName
 }
 
@@ -50,7 +50,7 @@ export function getHtmlFileUrl(fileName: string) {
  * @param filePath 
  */
 export function getNewsShareUrl(id: number | string = 0) {
-    const { shareUrl } = service.config
+    const shareUrl = service.getServiceConfig('shareUrl')
     return shareUrl + '/#/share/news?id=' + id
 }
 
@@ -139,8 +139,7 @@ export function handleNumberValue(value: number | string = 0, suffix = '') {
  * @returns 
  */
 export function handleRequestBigNumber(value: string) {
-    const globalStore = useGlobalStore()
-    if (globalStore.getSystemInfo('tradeChannel') === 'ws') {
+    if (service.getAppConfig('tradeChannel') === 'ws') {
         return Long.fromString(value.toString())
     }
     return value

+ 3 - 4
src/hooks/appsflyer/index.ts

@@ -1,13 +1,12 @@
-import { useGlobalStore } from '@/stores'
 import { CallbackMessage } from './types'
 //import appsFlyer from 'nativescript-plugin-appsflyer'
+import service from '@/services'
 import plus from '@/utils/h5plus'
 
 // https://support.appsflyer.com/hc/en-us/articles/217183026-NativeScript-plugin
 export const useAppsFlyer = (() => {
-    const { getSystemInfo } = useGlobalStore()
-    //const appsFlyerId = getSystemInfo('appsFlyerId')
-    const appsFlyerKey = getSystemInfo('appsFlyerKey')
+    //const appsFlyerId = service.getAppConfig('appsFlyerId')
+    const appsFlyerKey = service.getAppConfig('appsFlyerKey')
 
     const appsFlyerPromise = new Promise<CallbackMessage>((resolve, reject) => {
         if (appsFlyerKey) {

+ 2 - 3
src/hooks/facebook/index.ts

@@ -1,5 +1,5 @@
 import { onMounted } from 'vue'
-import { useGlobalStore } from '@/stores'
+import service from '@/services'
 import plus from '@/utils/h5plus'
 
 declare global {
@@ -11,8 +11,7 @@ declare global {
 
 // https://developers.facebook.com/docs/meta-pixel/reference
 export function useFacebook() {
-    const { getSystemInfo } = useGlobalStore()
-    const metaPixelId = getSystemInfo('metaPixelId')
+    const metaPixelId = service.getAppConfig('metaPixelId')
 
     // 初始化 MetaPixel
     const initMetaPixel = () => {

+ 2 - 1
src/packages/digital/views/setting/index.vue

@@ -32,7 +32,7 @@
                     <app-iconfont icon="g-icon-dark">{{ $t('digital.dark') }}</app-iconfont>
                 </template>
             </Cell>
-            <Cell is-link :to="{ name: 'setting-luanguage' }" v-if="globalStore.getSystemInfo('i18nEnabled')">
+            <Cell is-link :to="{ name: 'setting-luanguage' }" v-if="service.getAppConfig('i18nEnabled')">
                 <template #title>
                     <app-iconfont icon="g-icon-lang">{{ $t('mine.setting.language') }}</app-iconfont>
                 </template>
@@ -82,6 +82,7 @@ import { AuthStatus } from '@/constants/account'
 import { useRequest } from '@/hooks/request'
 import { getI18nConfigs } from '@/services/api/common'
 import { useUserStore, useGlobalStore, i18n } from '@/stores'
+import service from '@/services'
 import eventBus from '@/services/bus'
 import AppIconfont from '@/components/base/iconfont/index.vue'
 import AppSubmitbar from '@mobile/components/base/submitbar/index.vue'

+ 4 - 4
src/packages/digital/views/user/login/index.vue

@@ -3,7 +3,7 @@
     <template #header>
       <app-navbar>
         <template #right>
-          <app-luanguage v-if="globalStore.getSystemInfo('i18nEnabled')" />
+          <app-luanguage v-if="service.getAppConfig('i18nEnabled')" />
         </template>
       </app-navbar>
     </template>
@@ -26,7 +26,7 @@
           </Button>
         </ClickVerify>
         <div class="login-link">
-          <span @click="routerTo('user-register')" v-if="globalStore.hasSystemModule('register')">
+          <span @click="routerTo('user-register')" v-if="service.hasModule('register')">
             {{ $t('user.login.register') }}
           </span>
           <span @click="routerTo('user-forget')">
@@ -57,12 +57,12 @@ import { FormInstance, Button, Field, CellGroup, Form, Checkbox, showToast } fro
 import { fullloading, dialog } from '@/utils/vant'
 import { useLogin } from '@/business/login'
 import { useNavigation } from '@mobile/router/navigation'
-import { useGlobalStore, i18n } from '@/stores'
+import { i18n } from '@/stores'
+import service from '@/services'
 import ClickVerify from '@mobile/components/base/click-verify/index.vue'
 import AppLuanguage from '@mobile/components/modules/luanguage/index.vue'
 
 const { global: { t } } = i18n
-const globalStore = useGlobalStore()
 const { setGlobalUrlParams, routerTo, routerBack } = useNavigation()
 const { formData, userLogin } = useLogin()
 const formRef = shallowRef<FormInstance>()

+ 1 - 1
src/packages/mobile/components/base/uploader/index.vue

@@ -75,7 +75,7 @@ const onAfterRead = (file: any) => {
     file.status = 'uploading'
     file.message = t('common.tips28')
 
-    axios.post(service.getConfig('uploadUrl'), data).then(res => {
+    axios.post(service.getServiceConfig('uploadUrl'), data).then(res => {
         if (res.status == 200) {
             file.status = 'success'
             file.message = t('common.tips26')

+ 4 - 5
src/packages/mobile/components/layouts/login/index.vue

@@ -2,7 +2,7 @@
   <app-statusbar class="login">
     <app-navback class="login-navback" />
     <app-statusbar class="login-luanguage">
-      <app-luanguage v-if="globalStore.getSystemInfo('i18nEnabled')" />
+      <app-luanguage v-if="service.getAppConfig('i18nEnabled')" />
     </app-statusbar>
     <div class="login-logo">
       <slot name="logo">
@@ -25,7 +25,7 @@
       </ClickVerify>
     </Form>
     <div class="login-link">
-      <span @click="navigationTo('user-register')" v-if="globalStore.hasSystemModule('register')">{{
+      <span @click="navigationTo('user-register')" v-if="service.hasModule('register')">{{
         $t('user.login.register') }}</span>
       <span @click="navigationTo('user-forget')">{{ $t('user.login.forgetpassword') }}</span>
     </div>
@@ -55,7 +55,7 @@ import { FormInstance, Button, Field, CellGroup, Form, Checkbox, showFailToast,
 import { fullloading, dialog } from '@/utils/vant'
 import { useLogin } from '@/business/login'
 import { useNavigation } from '@mobile/router/navigation'
-import { useGlobalStore, i18n } from '@/stores'
+import { i18n } from '@/stores'
 import service from '@/services'
 import logoImage from '../../../assets/images/login-logo.png'
 import ClickVerify from '@mobile/components/base/click-verify/index.vue'
@@ -81,7 +81,6 @@ const props = defineProps({
 })
 
 const { global: { t } } = i18n
-const globalStore = useGlobalStore()
 const { setGlobalUrlParams, routerTo, routerBack } = useNavigation()
 const { formData, userLogin } = useLogin()
 const formRef = shallowRef<FormInstance>()
@@ -94,7 +93,7 @@ const appVersion = meta.namedItem('revised')?.content ?? '0'
 // 导航跳转
 const navigationTo = (name: string) => {
   fullloading((hideLoading) => {
-    service.onReady().then(() => {
+    service.init().then(() => {
       hideLoading()
       routerTo(name)
     }).catch(() => {

+ 1 - 1
src/packages/mobile/components/modules/luanguage/index.vue

@@ -74,7 +74,7 @@ const onConfirm = ({ selectedIndexes: [index], selectedValues: [value] }: Picker
     emit('confirm', value, index)
 }
 
-service.onReady().then(() => {
+service.onReady(() => {
     run()
 })
 </script>

+ 1 - 1
src/packages/mobile/components/modules/register-code/index.vue

@@ -31,7 +31,7 @@ const showConfirmButton = shallowRef(false)
 const base64Data = shallowRef('')
 
 const qrContent = computed(() => {
-    const url = service.getConfig('mobileOpenUrl')
+    const url = service.getServiceConfig('mobileOpenUrl')
     return url + '/#/?code=' + props.text
 })
 

+ 1 - 1
src/packages/mobile/components/modules/uploader/index.vue

@@ -24,7 +24,7 @@ const onUploadSuccess = (filePath: string) => {
 
 const autoUpload = (data: FormData) => {
     return new Promise<void>((resolve, reject) => {
-        axios.post(service.getConfig('uploadUrl'), data).then(res => {
+        axios.post(service.getServiceConfig('uploadUrl'), data).then(res => {
             if (res.status == 200) {
                 const filePath = res.data[0]?.filePath
                 onUploadSuccess(filePath)

+ 1 - 1
src/packages/mobile/views/home/main/Index.vue

@@ -1,7 +1,7 @@
 <template>
   <app-view class="home-main">
     <template #header>
-      <app-navbar :title="globalStore.getSystemInfo('appName')" :show-back-button="false" />
+      <app-navbar :title="service.getAppConfig('appName')" :show-back-button="false" />
     </template>
     <Banner :data-list="topBanners" />
     <PullRefresh class="home-main__container" v-model="refreshing" @refresh="onRefresh">

+ 2 - 4
src/packages/mobile/views/mine/setting/Index.vue

@@ -15,7 +15,7 @@
                         <app-iconfont icon="g-icon-cancel">{{ $t('routes.usercancel') }}</app-iconfont>
                     </template>
                 </Cell>
-                <Field readonly is-link v-if="globalStore.getSystemInfo('i18nEnabled')">
+                <Field readonly is-link v-if="service.getAppConfig('i18nEnabled')">
                     <template #left-icon>
                         <app-iconfont icon="g-icon-lang">{{ $t('mine.setting.language') }}</app-iconfont>
                     </template>
@@ -30,8 +30,8 @@
 
 <script lang="ts" setup>
 import { Cell, CellGroup, Field } from 'vant'
+import service from '@/services'
 import AppIconfont from '@/components/base/iconfont/index.vue'
-import { useGlobalStore } from '@/stores'
 import AppLuanguage from '@mobile/components/modules/luanguage/index.vue'
 
 defineProps({
@@ -40,6 +40,4 @@ defineProps({
         default: true
     }
 })
-
-const globalStore = useGlobalStore()
 </script>

+ 4 - 4
src/packages/mobile/views/order/position/components/goods/list/Index.vue

@@ -62,10 +62,11 @@
 import { shallowRef, computed, defineAsyncComponent } from 'vue'
 import { Button } from 'vant'
 import { useComponent } from '@/hooks/component'
-import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 import { getBuyOrSellName, BuyOrSell } from '@/constants/order'
 import { formatDecimal, handleNumberValue } from '@/filters'
-import { useGlobalStore, useUserStore, usePositionStore, useFuturesStore, useDeliveryRelationStore } from '@/stores'
+import { useUserStore, usePositionStore, useFuturesStore, useDeliveryRelationStore } from '@/stores'
+import service from '@/services'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 
 const componentMap = new Map<string, unknown>([
     ['close', defineAsyncComponent(() => import('../close/Index.vue'))],
@@ -73,7 +74,6 @@ const componentMap = new Map<string, unknown>([
     ['delivery16', defineAsyncComponent(() => import('../delivery16/index.vue'))]
 ])
 
-const globalStore = useGlobalStore()
 const userStore = useUserStore()
 const positionStore = usePositionStore()
 const futuresStore = useFuturesStore()
@@ -89,7 +89,7 @@ const { componentRef, componentId, openComponent, closeComponent } = useComponen
 })
 
 const showDelivery = (row: Model.TradePositionRsp) => {
-    if (globalStore.hasSystemModule('delivery')) {
+    if (service.hasModule('delivery')) {
         // #6084
         if (row.trademode === 16) {
             const item = deliveryRelationStore.getDeliveryRelationByGoodsId(row.goodsid)

+ 3 - 4
src/packages/mobile/views/report/index.vue

@@ -18,8 +18,9 @@ import { shallowRef } from 'vue'
 import { onBeforeRouteLeave } from 'vue-router'
 import { useNavigation } from '@mobile/router/navigation'
 import { Button } from 'vant'
-import { useLoginStore, useGlobalStore, i18n } from '@/stores'
+import { useLoginStore,  i18n } from '@/stores'
 import { dialog } from '@/utils/vant'
+import service from '@/services'
 import eventBus from '@/services/bus'
 import Report from './components/index.vue'
 
@@ -29,13 +30,11 @@ const isAgree = shallowRef(false)
 
 const { global: { t } } = i18n
 
-const globalStore = useGlobalStore()
-
 const onSubmit = (status: boolean) => {
     isAgree.value = true
     if (status) {
         // 是否需要弹出提示信息
-        const showLoginAlert = globalStore.getSystemInfo('showLoginAlert')
+        const showLoginAlert = service.getAppConfig('showLoginAlert')
         if (showLoginAlert) {
             dialog({message: t('user.login.tips7'), confirmButtonText: t('operation.confirm')}).then(() => {
                 routerBack()

+ 1 - 1
src/packages/mobile/views/rules/yszc/home.vue

@@ -12,7 +12,7 @@ import HtmlContainer from '@mobile/components/base/html-container/index.vue'
 const commonStore = useCommonStore()
 const document = computed(() => commonStore.getDocumentById(4))
 
-service.onReady().then(() => commonStore.fetcheDocuments())
+service.init().then(() => commonStore.fetcheDocuments())
 </script>
 
 <style lang="less">

+ 1 - 1
src/packages/mobile/views/spot/detail/Index.vue

@@ -100,7 +100,7 @@ const { getQueryString } = useNavigation()
 const { componentRef, componentId, openComponent, closeComponent } = useComponent()
 const quoteDetail = shallowRef<Model.OrderQuoteDetailRsp>() // 买卖详情
 const buyorsell = shallowRef(BuyOrSell.Buy) // 买卖方向
-const oem = service.getConfig('oem')
+const oem = service.getServiceConfig('oem')
 const buyList = shallowRef<Model.OrderQuoteDetailRsp[]>([])
 const sellList = shallowRef<Model.OrderQuoteDetailRsp[]>([])
 const wrfactortypeid = getQueryString('wrfactortypeid') ?? '0'

+ 1 - 1
src/packages/mobile/views/swap/list/Index.vue

@@ -68,7 +68,7 @@ const futuresStore = useFuturesStore()
 const userStore = useUserStore()
 const subscribe = quoteSocket.createSubscribe()
 const canProtocolSign = shallowRef(false)
-const oem = service.getConfig('oem')
+const oem = service.getServiceConfig('oem')
 const title = getQueryString('title')
 const titleName = computed(() => title ? decodeURIComponent(title) : props.marketSection?.displayname ?? '掉期贸易')
 

+ 4 - 4
src/packages/mobile/views/user/forget/Index.vue

@@ -69,9 +69,10 @@ import { getOpenMethodList } from '@/constants/common'
 import { useNavigation } from '@mobile/router/navigation'
 import { queryLoginId } from '@/services/api/account'
 import { resetPassword, sendResetVerifyCode } from '@/services/api/common'
-import cryptojs from 'crypto-js'
-import { i18n, useUserStore, useGlobalStore } from '@/stores'
+import { i18n, useUserStore } from '@/stores'
 import { getCountryCodeList } from '@/constants/unit'
+import cryptojs from 'crypto-js'
+import service from '@/services'
 import AppSwitchTab from '@mobile/components/base/switch-tab/index.vue'
 import AppSelect from '@mobile/components/base/select/index.vue'
 
@@ -87,7 +88,6 @@ const { router } = useNavigation()
 const formRef = ref<FormInstance>()
 const loading = ref(false)
 const isCountdown = ref(false) // 是否正在倒计时
-const globalStore = useGlobalStore()
 
 const openMethodList = getOpenMethodList() // 开户方式
 const selectedMethod = shallowRef(1) // 选中的开户方式
@@ -164,7 +164,7 @@ const formRules: { [key: string]: FieldRule[] } = {
         required: true,
         message: t('user.forget.tips3'),
         validator: (val) => {
-            if (globalStore.getSystemInfo('strongPassword')) {
+            if (service.getAppConfig('strongPassword')) {
                 if (validateRules.password.validate(val)) {
                     return true
                 }

+ 3 - 3
src/packages/mobile/views/user/password/Index.vue

@@ -29,7 +29,8 @@ import { useNavigation } from '@mobile/router/navigation'
 import { validateRules } from '@/constants/regex'
 import { useAccountPassword } from '@/business/user'
 import { useLogin } from '@/business/login'
-import { useGlobalStore, i18n } from '@/stores'
+import {  i18n } from '@/stores'
+import service from '@/services'
 import eventBus from '@/services/bus'
 import AppSubmitbar from '@mobile/components/base/submitbar/index.vue'
 
@@ -40,7 +41,6 @@ const formRef = shallowRef<FormInstance>()
 const confirmpassword = shallowRef('')
 
 const { global: { t } } = i18n
-const globalStore = useGlobalStore()
 
 // 表单验证规则
 const formRules: { [key: string]: FieldRule[] } = {
@@ -52,7 +52,7 @@ const formRules: { [key: string]: FieldRule[] } = {
         required: true,
         message: t('user.password.tips2'),
         validator: (val) => {
-            if (globalStore.getSystemInfo('strongPassword')) {
+            if (service.getAppConfig('strongPassword')) {
                 if (validateRules.password.validate(val)) {
                     return true
                 }

+ 4 - 4
src/packages/mobile/views/user/register/Index.vue

@@ -95,9 +95,10 @@ import { useFacebook } from '@/hooks/facebook'
 import { useAppsFlyer } from '@/hooks/appsflyer'
 import { useNavigation } from '@mobile/router/navigation'
 import { userRegister, sendRegisterVerifyCode2, queryMyRegisterMoney } from '@/services/api/common'
-import { i18n, useGlobalStore, useUserStore, useErrorInfoStore } from '@/stores'
+import { i18n, useUserStore, useErrorInfoStore } from '@/stores'
 import { getCountryCodeList } from '@/constants/unit'
 import { getOpenMethodList } from '@/constants/common'
+import service from '@/services'
 import cryptojs from 'crypto-js'
 import plus from '@/utils/h5plus'
 import AppSwitchTab from '@mobile/components/base/switch-tab/index.vue'
@@ -129,9 +130,8 @@ const { logEvent } = useAppsFlyer()
 const attrs = useAttrs()
 
 const { router, routerTo, getQueryString } = useNavigation()
-const globalStore = useGlobalStore()
 const errorInfoStore = useErrorInfoStore()
-const registrationCodeRule = globalStore.getSystemInfo('registrationCodeRule')
+const registrationCodeRule = service.getAppConfig('registrationCodeRule')
 const formRef = ref<FormInstance>()
 const checked = ref(false) // 是否同意注册条款
 const loading = ref(false)
@@ -220,7 +220,7 @@ const formRules: { [key: string]: FieldRule[] } = {
     required: true,
     message: t('user.register.tips2'),
     validator: (val) => {
-      if (globalStore.getSystemInfo('strongPassword')) {
+      if (service.getAppConfig('strongPassword')) {
         if (validateRules.password.validate(val)) {
           return true
         }

+ 1 - 1
src/packages/pc/components/base/upload/index.vue

@@ -47,7 +47,7 @@ const props = defineProps({
 
 const emit = defineEmits(['change'])
 
-const { uploadUrl } = service.config
+const uploadUrl = service.getServiceConfig('uploadUrl')
 const uploadRef = shallowRef<UploadInstance>()
 const showViewer = shallowRef(false)
 const fileList = shallowRef<UploadFiles>([])

+ 3 - 3
src/packages/pc/components/layouts/header/components/setting/index.vue

@@ -56,7 +56,7 @@
                 </el-form-item>
             </el-form>
         </fieldset>
-        <fieldset class="g-fieldset" v-if="globalStore.getSystemInfo('i18nEnabled')">
+        <fieldset class="g-fieldset" v-if="service.getAppConfig('i18nEnabled')">
             <legend class="g-fieldset__legend">{{ t('mine.setting.others') }}</legend>
             <el-form ref="formRef" class="el-form--horizontal" label-width="80px">
                 <el-form-item :label="t('mine.setting.language')">
@@ -80,14 +80,14 @@ import { ref, computed } from 'vue'
 import { ElMessageBox, FormInstance } from 'element-plus'
 import { getBuyOrSellList } from '@/constants/order'
 import { Language } from '@/constants/language'
-import { useGlobalStore, useSettingStore, i18n } from '@/stores'
+import { useSettingStore, i18n } from '@/stores'
 import { localData } from '@/stores/storage'
 import { useRequest } from '@/hooks/request'
 import { getI18nConfigs } from '@/services/api/common'
+import service from '@/services'
 import AppDrawer from '@pc/components/base/drawer/index.vue'
 import eventBus from '@/services/bus'
 
-const globalStore = useGlobalStore()
 const settingStore = useSettingStore()
 const formRef = ref<FormInstance>()
 const show = ref(true)

+ 1 - 1
src/packages/pc/components/layouts/header/index.vue

@@ -103,7 +103,7 @@ onMounted(() => {
     })
 
     // 是否需要弹出提示信息
-    // const showLoginAlert = globalStore.getSystemInfo('showLoginAlert')
+    // const showLoginAlert = service.getAppConfig('showLoginAlert')
     // if (showLoginAlert) {
     //     ElMessageBox.confirm(
     //         t('user.login.tips7'),

+ 2 - 1
src/packages/pc/components/layouts/page/index.vue

@@ -95,6 +95,7 @@ import { parsePercent } from '@/filters'
 import { getServerTime } from '@/services/api/common'
 import { useGlobalStore, useLoginStore, useAccountStore, i18n } from '@/stores'
 import eventBus from '@/services/bus'
+import service from '@/services'
 import quoteSocket from '@/services/websocket/quote'
 import AppIcon from '@pc/components/base/icon/index.vue'
 import AppHeader from '../header/index.vue'
@@ -115,7 +116,7 @@ const meta = document.getElementsByTagName('meta')
 const version = meta.namedItem('revised')?.content ?? '0'
 
 // 是否需要弹出提示信息
-const showLoginAlert = globalStore.getSystemInfo('showLoginAlert')
+const showLoginAlert = service.getAppConfig('showLoginAlert')
 
 const { t } = i18n.global
 

+ 1 - 1
src/packages/pc/components/modules/goods-detail/order/index.vue

@@ -50,7 +50,7 @@ const componentMap = new Map<string, unknown>([
 
 const futuresStore = useFuturesStore()
 const quote = futuresStore.getGoodsQuote(props.goodsId)
-const oem = service.getConfig('oem')
+const oem = service.getServiceConfig('oem')
 
 const { rowKey, expandKeys, selectedRow, rowClick } = useComposeTable<Model.WrTradeOrderDetailRsp>({ rowKey: 'orderid' })
 const { componentRef, componentId, closeComponent } = useComponent()

+ 12 - 8
src/packages/pc/components/modules/quote/price/index.vue

@@ -6,11 +6,14 @@
             </div>
             <div class="block-bottom">
                 <div class="block-bottom-left">
-                    <span :class="quote.lastColor" v-if="quote.trademode != 10">{{ handleNumberValue(quote.last.toFixed(quote.decimalplace)) }}</span>
+                    <span :class="quote.lastColor" v-if="quote.trademode != 10">{{
+                        handleNumberValue(quote.last.toFixed(quote.decimalplace)) }}</span>
                     <div v-else>
-                        <span :class="quote.askColor">{{ handleNumberValue(quote.ask.toFixed(quote.decimalplace)) }}</span>
+                        <span :class="quote.askColor">{{ handleNumberValue(quote.ask.toFixed(quote.decimalplace))
+                            }}</span>
                         <span>{{ ' / ' }}</span>
-                        <span :class="quote.bidColor">{{ handleNumberValue(quote.bid.toFixed(quote.decimalplace)) }}</span>
+                        <span :class="quote.bidColor">{{ handleNumberValue(quote.bid.toFixed(quote.decimalplace))
+                            }}</span>
                     </div>
                 </div>
                 <div class="block-bottom-right">
@@ -49,7 +52,8 @@
                 </li>
                 <li v-if="quote.marketid != 99201">
                     <span>{{ t('quote.limitdown') }}</span>
-                    <span class="g-price-down">{{ handleNumberValue(quote.limitdown.toFixed(quote.decimalplace)) }}</span>
+                    <span class="g-price-down">{{ handleNumberValue(quote.limitdown.toFixed(quote.decimalplace))
+                        }}</span>
                 </li>
                 <li>
                     <span>{{ t('quote.averageprice') }}</span>
@@ -65,11 +69,11 @@
                     <span>{{ t('quote.totalturnover') }}</span>
                     <span>{{ changeUnit(quote.totalturnover) }}</span>
                 </li>
-                <li v-if="globalStore.hasQuotationProperty('holdvolume')">
+                <li v-if="service.hasQuotationProperty('holdvolume')">
                     <span>{{ t('quote.holdvolume') }}</span>
                     <span>{{ changeUnit(quote.holdvolume) }}</span>
                 </li>
-                <li v-if="globalStore.hasQuotationProperty('totalvolume') && quote.marketid != 99201">
+                <li v-if="service.hasQuotationProperty('totalvolume') && quote.marketid != 99201">
                     <span>{{ t('quote.totalvolume') }}</span>
                     <span>{{ changeUnit(quote.totalvolume) }}</span>
                 </li>
@@ -80,7 +84,8 @@
 
 <script lang="ts" setup>
 import { parsePercent, handleNumberValue, changeUnit } from '@/filters'
-import { useGlobalStore, useFuturesStore, i18n } from '@/stores'
+import { useFuturesStore, i18n } from '@/stores'
+import service from '@/services'
 
 const props = defineProps({
     goodsCode: {
@@ -89,7 +94,6 @@ const props = defineProps({
     }
 })
 
-const globalStore = useGlobalStore()
 const futuresStore = useFuturesStore()
 const { goodsdisplay } = useFuturesStore()
 const quote = futuresStore.getGoodsQuote(props.goodsCode)

+ 1 - 1
src/packages/pc/views/account/sign/components/sign/index.vue

@@ -235,7 +235,7 @@ const showExtendInfo = (item: Model.BankCusBankExtendConfigRsp) => {
 const sendVerifyCode = () => {
     formRef.value?.validateField('MobilePhone', (valid) => {
         if (valid) {
-            service.onReady().then(() => {
+            service.init().then(() => {
                 smsVerificationCode().then((res) => {
                     if (res.CenterErrMsg) {
                         extendInfo.value['smsSerialNo'] = res.CenterErrMsg

+ 3 - 6
src/packages/pc/views/auth/components/layout/index.vue

@@ -5,7 +5,7 @@
         <pre>{{ i18n.global.t('app.slogan') }}</pre>
       </div>
       <div class="right">
-        <el-dropdown class="right-lang" @command="changeLuanguage" v-if="globalStore.getSystemInfo('i18nEnabled')">
+        <el-dropdown class="right-lang" @command="changeLuanguage" v-if="service.getAppConfig('i18nEnabled')">
           <div style="cursor: pointer;">
             <span>{{ luanguage }}</span>
             <AppIcon icon="CaretBottom" />
@@ -36,7 +36,7 @@
 
 <script lang="ts" setup>
 import { computed } from 'vue'
-import { i18n,useGlobalStore } from '@/stores'
+import { i18n } from '@/stores'
 import { useRequest } from '@/hooks/request'
 import { getI18nConfigs } from '@/services/api/common'
 import { localData } from '@/stores/storage'
@@ -54,8 +54,6 @@ defineProps({
 const meta = document.getElementsByTagName('meta')
 const version = meta.namedItem('revised')?.content ?? '0'
 
-const globalStore = useGlobalStore()
-
 const { dataList, run } = useRequest(getI18nConfigs, {
   manual: true
 })
@@ -99,10 +97,9 @@ const changeLuanguage = (e: string) => {
   eventBus.$emit('LogoutNotify')
 }
 
-service.onReady().then(() => {
+service.onReady(() => {
   run()
 })
-
 </script>
 
 <style lang="less">

+ 1 - 1
src/packages/pc/views/auth/forget/index.vue

@@ -124,7 +124,7 @@ const formRules: FormRules = {
 const sendVerifyCode = () => {
     formRef.value?.validateField('mobile', (valid) => {
         if (valid) {
-            service.onReady().then(() => {
+            service.init().then(() => {
                 sendResetVerifyCode({
                     data: {
                         mobile: getEncryptMobile(countryCode.value+formData.mobile),

+ 5 - 6
src/packages/pc/views/auth/login/index.vue

@@ -50,7 +50,7 @@ import { useRoute, useRouter } from 'vue-router'
 import { ElMessage } from 'element-plus'
 import type { FormInstance, FormRules } from 'element-plus'
 import { useLogin } from '@/business/login'
-import { useGlobalStore, useMenuStore, i18n } from '@/stores'
+import { useMenuStore, i18n } from '@/stores'
 import service from '@/services'
 import SignLayout from '../components/layout/index.vue'
 import Forget from "../forget/index.vue"
@@ -61,7 +61,6 @@ import ClickVerify from '@pc/components/base/click-verify/index.vue'
 const { formData, userLogin, userLogout } = useLogin()
 const route = useRoute()
 const router = useRouter()
-const globalStore = useGlobalStore()
 const menuStore = useMenuStore()
 const formRef = shallowRef<FormInstance>()
 const loading = shallowRef(false)
@@ -86,8 +85,8 @@ const formRules: FormRules = {
 const click = () => {
   isRegister.value = true
   rloading.value = true
-  service.onReady().then((res) => {
-    qrContent.value = res.mobileOpenUrl
+  service.init().then(() => {
+    qrContent.value = service.getServiceConfig('mobileOpenUrl')
   }).finally(() => {
     rloading.value = false
   })
@@ -134,8 +133,8 @@ const onClosed = () => {
   showPasswordMidify.value = false
 }
 
-service.systemInfoAsync.then(() => {
-  shwoRegister.value = globalStore.hasSystemModule('register')
+service.appConfigAsync.then(() => {
+  shwoRegister.value = service.hasModule('register')
 })
 </script>
 

+ 1 - 1
src/packages/pc/views/footer/capital/summary/index.vue

@@ -45,7 +45,7 @@ import { getUserId, getMemberUserId } from '@/services/methods/user'
 import AppTable from '@pc/components/base/table/index.vue'
 import service from '@/services'
 
-const oem = service.getConfig('oem')
+const oem = service.getServiceConfig('oem')
 const { t } = i18n.global
 
 const componentMap = new Map<string, unknown>([

+ 1 - 1
src/packages/pc/views/market/trade/spot/order/index.vue

@@ -91,7 +91,7 @@ const props = defineProps({
 })
 
 const emit = defineEmits(['closed'])
-const oem = service.getConfig('oem')
+const oem = service.getServiceConfig('oem')
 const { t } = i18n.global
 
 const componentMap = new Map<string, unknown>([

+ 1 - 1
src/packages/quote/views/quote/index.vue

@@ -92,7 +92,7 @@ const subscribeData = shallowRef<string[]>([])
 // 系统时间
 const serverTime = ref<Moment>()
 
-service.onReady().then(() => {
+service.init().then(() => {
     enumStore.getAllEnumList()
     marketRun()
 

+ 3 - 3
src/packages/sbyj/views/home/main/index.vue

@@ -3,7 +3,7 @@
     <template #header>
       <app-navbar :show-back-button="false">
         <div class="home-main__title">
-          <span>{{ globalStore.getSystemInfo('appName') }}</span>
+          <span>{{ service.getAppConfig('appName') }}</span>
           <span>订单管理系统</span>
         </div>
       </app-navbar>
@@ -61,12 +61,12 @@ import { Cell, CellGroup, PullRefresh, Badge } from "vant";
 import { formatDate } from "@/filters";
 import { useNavigation } from '@mobile/router/navigation';
 import { queryImageConfigs, getJ10News } from "@/services/api/common";
-import { useGlobalStore, useNoticeStore } from '@/stores'
+import { useNoticeStore } from '@/stores'
+import service from '@/services'
 import Banner from '@mobile/components/base/banner/index.vue'
 import Iconfont from '@/components/base/iconfont/index.vue'
 
 const { routerTo } = useNavigation()
-const globalStore = useGlobalStore()
 const noticeStore = useNoticeStore()
 const refreshing = shallowRef(false) // 是否处于加载中状态
 const topBanners = shallowRef<string[]>([]) // 轮播图列表

+ 3 - 3
src/packages/sbyj/views/market/detail/composables.ts

@@ -10,17 +10,17 @@ import { queryMdUserSwapProtocol } from '@/services/api/swap'
 import { getUserId } from '@/services/methods/user'
 import { useRequest } from '@/hooks/request'
 import { queryUserTradeSettings } from '@/services/api/order'
-import { useGlobalStore, useFuturesStore, useUserStore, useSBYJOrderStore } from '@/stores'
+import { useFuturesStore, useUserStore, useSBYJOrderStore } from '@/stores'
+import service from '@/services'
 
 export function useSetup() {
     const { getQueryString } = useNavigation()
     const { formData, formSubmit } = useOrder()
     const { getSBYJMyOrders, getOrderListByGoodsId } = useSBYJOrderStore()
-    const globalStore = useGlobalStore()
     const futuresStore = useFuturesStore()
     const userStore = useUserStore()
 
-    const riskType = globalStore.getSystemInfo('riskType') // 风控类型
+    const riskType = service.getAppConfig('riskType') // 风控类型
     const formRef = shallowRef<FormInstance>()
     const goodscode = getQueryString('goodscode') ?? ''
     const quote = futuresStore.getGoodsQuote(goodscode)

+ 2 - 2
src/packages/sbyj/views/mine/index.vue

@@ -44,7 +44,7 @@
                             </span>
                         </li>
                     </ul>
-                    <ul v-if="globalStore.getSystemInfo('riskType') === 2">
+                    <ul v-if="service.getAppConfig('riskType') === 2">
                         <li>
                             <span>净值</span>
                             <span>{{ currentAccount.hazardValue?.toFixed(2) }}</span>
@@ -152,9 +152,9 @@ import { handlePriceColor, parsePercent } from '@/filters'
 import { AuthStatus } from '@/constants/account'
 import Iconfont from '@/components/base/iconfont/index.vue'
 import { useSetup } from './composables'
+import service from '@/services'
 
 const {
-    globalStore,
     loginStore,
     userStore,
     noticeStore,

+ 3 - 3
src/packages/sbyj/views/order/detail/index.vue

@@ -72,11 +72,12 @@ import { CellGroup, Cell, Button, Checkbox } from 'vant'
 import { parsePercent, handlePriceColor, formatDecimal, handleRequestBigNumber, handleNumberValue } from '@/filters'
 import { BuyOrSell } from '@/constants/order'
 import { getGoodsUnitName } from '@/constants/unit'
-import { useGlobalStore, useFuturesStore } from '@/stores'
+import { useFuturesStore } from '@/stores'
 import { useModifyOrder } from '@/business/trade'
 import { fullloading, dialog } from '@/utils/vant'
 import AppModal from '@/components/base/modal/index.vue'
 import eventBus from '@/services/bus'
+import service from '@/services'
 import { i18n } from '@/stores'
 
 const props = defineProps({
@@ -89,9 +90,8 @@ const props = defineProps({
 const t = i18n.global.t
 const { formData, formSubmit } = useModifyOrder()
 
-const globalStore = useGlobalStore()
 const futuresStore = useFuturesStore()
-const riskType = globalStore.getSystemInfo('riskType') // 风控类型
+const riskType = service.getAppConfig('riskType') // 风控类型
 const showModal = shallowRef(true)
 const refresh = shallowRef(false) // 是否刷新父组件数据
 

+ 2 - 3
src/packages/sbyj/views/order/history/index.vue

@@ -86,15 +86,14 @@ import { getGoodsUnitName } from '@/constants/unit'
 import { useComponent } from '@/hooks/component'
 import { useRequest } from '@/hooks/request'
 import { queryTradeHolderDetailEx } from '@/services/api/order'
-import { useGlobalStore } from '@/stores'
+import service from '@/services'
 import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 
 const componentMap = new Map<string, unknown>([
     ['detail', defineAsyncComponent(() => import('./components/detail/index.vue'))], // 详情
 ])
 
-const globalStore = useGlobalStore()
-const riskType = globalStore.getSystemInfo('riskType') // 风控类型
+const riskType = service.getAppConfig('riskType') // 风控类型
 
 const error = shallowRef(false)
 const dataList = shallowRef<Model.TradeHolderDetailExRsp[]>([])

+ 3 - 3
src/packages/sbyj/views/order/list/components/close-holder/index.vue

@@ -24,7 +24,7 @@
                         :value="formatDecimal(selectedRow.tHDetailEx.holderPrice, selectedRow.decimalPlace)" />
                     <Cell title="可用重量" :value="enableqty + getGoodsUnitName(selectedRow.goodsUnitID)" />
                     <!-- 任务 #6631 -->
-                    <Cell title="终止重量" :value="orderQty" v-if="globalStore.getSystemInfo('allCloseEnabled')" />
+                    <Cell title="终止重量" :value="orderQty" v-if="service.getAppConfig('allCloseEnabled')" />
                     <Field name="OrderQty" label="终止重量" :rules="formRules.OrderQty" v-else>
                         <template #input>
                             <div class="g-qty-group">
@@ -58,9 +58,10 @@ import { fullloading } from '@/utils/vant'
 import { handleRequestBigNumber, handleNumberValue, formatDecimal, parsePercent } from '@/filters'
 import { getGoodsUnitName } from '@/constants/unit'
 import { useOrder } from '@/business/trade'
-import { useFuturesStore, useGlobalStore } from '@/stores'
+import { useFuturesStore } from '@/stores'
 import { EPriceMode, EValidType, EBuildType } from '@/constants/client'
 import { BuyOrSell } from '@/constants/order'
+import service from '@/services'
 import quoteSocket from '@/services/websocket/quote'
 import AppModal from '@/components/base/modal/index.vue'
 import Stepper from '@mobile/components/base/stepper/index.vue'
@@ -72,7 +73,6 @@ const props = defineProps({
     }
 })
 
-const globalStore = useGlobalStore()
 const futuresStore = useFuturesStore()
 const quote = futuresStore.getGoodsQuote(props.selectedRow.goodsCode)
 

+ 3 - 3
src/packages/sbyj/views/order/list/components/market-order-delivery/index.vue

@@ -13,7 +13,7 @@
                     <Cell title="可用重量" :value="enableqty + getGoodsUnitName(selectedRow.goodsUnitID)" />
                     <!-- 任务 #6631 -->
                     <Cell :title="getTagName() + '重量'" :value="orderQty"
-                        v-if="globalStore.getSystemInfo('allDeliveryEnabled')" />
+                        v-if="service.getAppConfig('allDeliveryEnabled')" />
                     <Field name="OrderQty" :label="getTagName() + '重量'" :rules="formRules.OrderQty" v-else>
                         <template #input>
                             <div class="g-qty-group">
@@ -53,7 +53,8 @@ import { BuyOrSell } from '@/constants/order'
 import { getGoodsUnitName } from '@/constants/unit'
 import { getServerTime } from '@/services/api/common'
 import { marketOrderDeliveryApply } from '@/services/api/trade'
-import { useGlobalStore, useUserStore, useFuturesStore } from '@/stores'
+import { useUserStore, useFuturesStore } from '@/stores'
+import service from '@/services'
 import AppModal from '@/components/base/modal/index.vue'
 import Stepper from '@mobile/components/base/stepper/index.vue'
 import moment from 'moment'
@@ -69,7 +70,6 @@ const userStore = useUserStore()
 const param326 = userStore.getSystemParamValue('326')
 const param327 = userStore.getSystemParamValue('327')
 
-const globalStore = useGlobalStore()
 const futuresStore = useFuturesStore()
 const quote = futuresStore.getGoodsQuote(props.selectedRow.goodsCode)
 

+ 3 - 4
src/packages/sbyj/views/order/list/index.vue

@@ -107,7 +107,8 @@ import { formatDecimal, parsePercent, handlePriceColor, handleNumberValue } from
 import { getGoodsUnitName } from '@/constants/unit'
 import { useComponent } from '@/hooks/component'
 import { Button, Tabs, Tab } from 'vant'
-import { useFuturesStore, useGlobalStore, useSBYJOrderStore } from '@/stores'
+import { useFuturesStore,  useSBYJOrderStore } from '@/stores'
+import service from '@/services'
 import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 import { useRequest } from '@/hooks/request'
 import { queryUserTradeSettings } from '@/services/api/order'
@@ -120,9 +121,7 @@ const componentMap = new Map<string, unknown>([
 ])
 
 const activeTab = shallowRef(0)
-
-const globalStore = useGlobalStore()
-const riskType = globalStore.getSystemInfo('riskType') // 风控类型
+const riskType = service.getAppConfig('riskType') // 风控类型
 
 const { getSBYJMyOrders, $toRefs } = useSBYJOrderStore()
 const { getGoods } = useFuturesStore()

+ 1 - 1
src/packages/sbyj/views/user/login/Index.vue

@@ -57,7 +57,7 @@ const appVersion = meta.namedItem('revised')?.content ?? '0'
 // 导航跳转
 const navigationTo = (name: string) => {
   fullloading((hideLoading) => {
-    service.onReady().then(() => {
+    service.init().then(() => {
       hideLoading()
       routerTo(name)
     }).catch(() => {

+ 2 - 1
src/packages/sjgj/views/order/list/index.vue

@@ -90,6 +90,7 @@ import { getGoodsUnitName } from '@/constants/unit'
 import { useComponent } from '@/hooks/component'
 import { Button, Tabs, Tab } from 'vant'
 import { useGlobalStore, useSBYJOrderStore } from '@/stores'
+import service from '@/services'
 import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 
 const componentMap = new Map<string, unknown>([
@@ -99,7 +100,7 @@ const componentMap = new Map<string, unknown>([
 const activeTab = shallowRef(0)
 
 const globalStore = useGlobalStore()
-const riskType = globalStore.getSystemInfo('riskType') // 风控类型
+const riskType = service.getAppConfig('riskType') // 风控类型
 
 const { getSBYJMyOrders, $toRefs } = useSBYJOrderStore()
 

+ 4 - 4
src/packages/tss/views/user/login/Index.vue

@@ -2,7 +2,7 @@
   <app-statusbar class="login">
     <app-navback class="login-navback" />
     <app-statusbar class="login-luanguage">
-      <app-luanguage v-if="globalStore.getSystemInfo('i18nEnabled')" />
+      <app-luanguage v-if="service.getAppConfig('i18nEnabled')" />
     </app-statusbar>
     <div class="login-logo">
       <slot name="logo">
@@ -51,7 +51,7 @@
         </Button>
       </div>
       <div class="login-form__link">
-        <span @click="routerTo('user-register')" v-if="globalStore.hasSystemModule('register')">
+        <span @click="routerTo('user-register')" v-if="service.hasModule('register')">
           {{ t('user.login.register') }}
         </span>
         <span @click="routerTo('user-forget')">
@@ -74,7 +74,8 @@ import { fullloading, dialog } from '@/utils/vant'
 import { getCountryCodeList } from '@/constants/unit'
 import { useLogin } from '@/business/login'
 import { useNavigation } from '@mobile/router/navigation'
-import { useGlobalStore, i18n } from '@/stores'
+import { i18n } from '@/stores'
+import service from '@/services'
 import plus from '@/utils/h5plus'
 import AppSelect from '@mobile/components/base/select/index.vue'
 import AppLuanguage from '@mobile/components/modules/luanguage/index.vue'
@@ -82,7 +83,6 @@ import AppLuanguage from '@mobile/components/modules/luanguage/index.vue'
 const { t } = i18n.global
 const { setGlobalUrlParams, routerTo, routerBack } = useNavigation()
 const { formData, userLogin } = useLogin()
-const globalStore = useGlobalStore()
 const checked = shallowRef(false) // 是否同意协议管理
 
 const loginType = shallowRef(0)

+ 3 - 6
src/services/api/account/index.ts

@@ -1,11 +1,8 @@
 import { getUserId, getToken, getLoginId, getMemberUserId, getAccountId } from '@/services/methods/user'
 import { RequestConfig } from '@/services/http/types'
-import { useGlobalStore } from '@/stores'
 import service from '@/services'
 import http from '@/services/http'
 
-const globalStore = useGlobalStore()
-
 /**
  * 账户登录
  */
@@ -42,7 +39,7 @@ export function logout(config: RequestConfig = {}) {
  * Token校验
  */
 export function tokenCheck() {
-    if (globalStore.getSystemInfo('tradeChannel') === 'ws') {
+    if (service.getAppConfig('tradeChannel') === 'ws') {
         return http.mqRequest<Proto.TokenCheckRsp>({
             data: <Proto.TokenCheckReq>{
                 LoginID: getLoginId(),
@@ -152,7 +149,7 @@ export function queryWrDraftUserInfo(config: RequestConfig<Model.WrDraftUserInfo
 export function requestAddAuth(config: RequestConfig<Model.AddAuthReq> = {}) {
     return http.request<Model.AddAuthRsp>({
         method: 'post',
-        url: service.getConfig('openApiUrl') + '/onlineopen/userInfo/addAuth',
+        url: service.getServiceConfig('openApiUrl') + '/onlineopen/userInfo/addAuth',
         data: config.data,
     })
 }
@@ -251,7 +248,7 @@ export function requestAsignWillFace(config: RequestConfig<Model.WillFaceReq> =
 export function requestCheckCardNum(config: RequestConfig<Model.CheckCardNumReq> = {}) {
     return http.request<Model.CheckCardNumRsp>({
         method: 'get',
-        url: service.getConfig('openApiUrl') + '/onlineopen/userInfo/checkCardNum',
+        url: service.getServiceConfig('openApiUrl') + '/onlineopen/userInfo/checkCardNum',
         params: {
             userid: getUserId(),
             ...config.data

+ 7 - 7
src/services/api/common/index.ts

@@ -27,7 +27,7 @@ export function getServerTime(config: RequestConfig = {}) {
  */
 export function getAppUpdateInfo(config: RequestConfig = {}) {
     return http.request<string>({
-        url: service.getConfig('androidUpdateUrl'),
+        url: service.getServiceConfig('androidUpdateUrl'),
         params: config.data,
     })
 }
@@ -38,7 +38,7 @@ export function getAppUpdateInfo(config: RequestConfig = {}) {
 export function userRegister(config: RequestConfig<Model.RegisterReq> = {}) {
     return http.request<Model.RegisterRsp>({
         method: 'post',
-        url: service.getConfig('openApiUrl') + '/onlineopen/userInfo/add3',
+        url: service.getServiceConfig('openApiUrl') + '/onlineopen/userInfo/add3',
         data: config.data,
     })
 }
@@ -48,7 +48,7 @@ export function userRegister(config: RequestConfig<Model.RegisterReq> = {}) {
  */
 export function sendRegisterVerifyCode(config: RequestConfig<{ phonenumber: string }> = {}) {
     return http.request({
-        url: service.getConfig('openApiUrl') + '/verifycode/identifyCode/' + config.data?.phonenumber,
+        url: service.getServiceConfig('openApiUrl') + '/verifycode/identifyCode/' + config.data?.phonenumber,
     })
 }
 
@@ -57,7 +57,7 @@ export function sendRegisterVerifyCode(config: RequestConfig<{ phonenumber: stri
  */
 export function sendRegisterVerifyCode2(config: RequestConfig<{ param: string }>) {
     return http.request({
-        url: service.getConfig('openApiUrl') + '/verifycode/identifyCode2',
+        url: service.getServiceConfig('openApiUrl') + '/verifycode/identifyCode2',
         params: config.data,
     })
 }
@@ -68,7 +68,7 @@ export function sendRegisterVerifyCode2(config: RequestConfig<{ param: string }>
 export function resetPassword(config: RequestConfig<Model.ResetPasswordReq> = {}) {
     return http.request<Model.ResetPasswordRsp>({
         method: 'post',
-        url: service.getConfig('commSearchUrl') + '/tradeoperation/resetpwdbycardnum',
+        url: service.getServiceConfig('commSearchUrl') + '/tradeoperation/resetpwdbycardnum',
         data: config.data,
     })
 }
@@ -79,7 +79,7 @@ export function resetPassword(config: RequestConfig<Model.ResetPasswordReq> = {}
 export function sendResetVerifyCode(config: RequestConfig<Model.SendResetVerifyCodeReq> = {}) {
     return http.request<Model.SendResetVerifyCodeRsp>({
         method: 'post',
-        url: service.getConfig('commSearchUrl') + '/user/smsvcode',
+        url: service.getServiceConfig('commSearchUrl') + '/user/smsvcode',
         data: config.data,
     })
 }
@@ -90,7 +90,7 @@ export function sendResetVerifyCode(config: RequestConfig<Model.SendResetVerifyC
 export function uploadFile(config: RequestConfig<Model.uploadFileReq> = {}) {
     return http.request<Model.uploadFileRsp>({
         method: 'post',
-        url: service.getConfig('uploadUrl'),
+        url: service.getServiceConfig('uploadUrl'),
         data: config.data,
     })
 }

+ 6 - 8
src/services/http/index.ts

@@ -5,7 +5,7 @@ import cryptojs from 'crypto-js'
 //import { addPending, removePending } from './pending'
 import { encryptBody, decryptBody } from '@/services/websocket/package/crypto'
 import { IMessageHead } from '@/types/proto/proto'
-import { useGlobalStore, useLoginStore, useAccountStore, useErrorInfoStore, i18n } from '@/stores'
+import { useLoginStore, useAccountStore, useErrorInfoStore, i18n } from '@/stores'
 import { CommonResult, ResultCode, SendMsgToMQ } from './types'
 import { FunCode } from '@/constants/funcode'
 import service from '@/services'
@@ -21,13 +21,12 @@ export default new (class {
         // 请求拦截器
         this.axiosInstance.interceptors.request.use(
             (config) => {
-                const globalStore = useGlobalStore()
                 const loginStore = useLoginStore()
                 //addPending(config) //将当前请求添加到列表中
                 //设置请求头
-                if (globalStore.getSystemInfo('tradeChannel') === 'ws') {
+                if (service.getAppConfig('tradeChannel') === 'ws') {
                     const key = 'dZChvstdjmqIt5fP'
-                    const timestamp = globalStore.getTimestamp()
+                    const timestamp = service.timestamp
                     const verification = cryptojs.HmacSHA256(loginStore.token + timestamp, key)
 
                     config.headers = {
@@ -135,7 +134,7 @@ export default new (class {
      * @returns 
      */
     async commonRequest<T>(config: AxiosRequestConfig, errMsg?: string) {
-        const baseUrl = service.getConfig('goCommonSearchUrl')
+        const baseUrl = service.getServiceConfig('goCommonSearchUrl')
         config.url = baseUrl + config.url
         const res = await this.request<CommonResult<T>>(config, errMsg)
         switch (res.code) {
@@ -158,7 +157,7 @@ export default new (class {
      * @returns 
      */
     async goRequest<T>(config: AxiosRequestConfig, errMsg?: string) {
-        const baseUrl = service.getConfig('goAccess')
+        const baseUrl = service.getServiceConfig('goAccess')
         config.url = baseUrl + config.url
         const res = await this.request<CommonResult<T>>(config, errMsg)
         switch (res.code) {
@@ -185,7 +184,6 @@ export default new (class {
         RetDesc: string;
         Status?: number;
     }>({ data, requestCode, responseCode, marketId = 0 }: SendMsgToMQ<{ Header?: IMessageHead }>, errMsg?: string) {
-        const globalStore = useGlobalStore()
         const loginStore = useLoginStore()
         const accountStore = useAccountStore()
         const requestId = FunCode[requestCode]
@@ -204,7 +202,7 @@ export default new (class {
         console.log(requestCode, data)
 
         try {
-            if (globalStore.getSystemInfo('tradeChannel') === 'ws') {
+            if (service.getAppConfig('tradeChannel') === 'ws') {
                 // websocket 通道
                 const res = await tradeService.send<T>({
                     data,

+ 115 - 104
src/services/index.ts

@@ -1,138 +1,149 @@
-import axios from 'axios'
-import { useGlobalStore } from '@/stores/modules/global'
-import { getServerTime } from './api/common'
 import moment from 'moment'
-
-const { getSystemConfig, $toRefs } = useGlobalStore()
-const { dateDiff } = $toRefs()
+import plus from '@/utils/h5plus'
+import { TaskQueue } from '@/utils/queue'
+import { AppConfig, ServiceConfig } from './types'
+import { getServerTime } from './api/common'
 
 export default new (class {
     constructor() {
-        this.systemInfoAsync = getSystemConfig()
+        // 自动初始化,若断网或其它原因导致初始化失败,需重新初始化
+        // IOS上架审核可能会遇到网络权限的情况,应用可能会在未授权网络权限的情况下发起请求,导致请求等待时间过长,最终审核被拒
+        //this.init()
+
+        this.onReady(() => {
+            // 同步服务器时间
+            getServerTime().then((res) => {
+                const serverTime = moment(res.data)
+                this.serverDiffTime = moment().diff(serverTime)
+            })
+        })
     }
 
-    systemInfoAsync
+    isReady = false
+
+    appConfigAsync = this.loadAppConfig()
+
+    private taskQueue = new TaskQueue()
+
+    /** 服务器和本地的时间差(毫秒数) */
+    private serverDiffTime = 0
+
+    /** 限制重试次数,0 = 无限制 */
+    private maxRetryCount = 5
+
+    private initPromise: Promise<void> | null = null
 
-    /** 服务配置信息 */
-    config = {
+    private appConfig: AppConfig = {
+        appName: document.title,
+        version: '1.0.0',
+        versionCode: '100000',
+        apiUrl: 'http://localhost',
+        tradeChannel: 'ws',
+        showLoginAlert: false,
+        modules: [],
+        quotationProperties: [],
+        forcedPasswordChange: false,
+        strongPassword: true,
+        registrationCodeRule: 0,
+        riskType: 0,
+        i18nEnabled: true,
+        allCloseEnabled: false,
+        allDeliveryEnabled: false,
+        metaPixelId: '',
+        appsFlyerId: '',
+        appsFlyerKey: ''
+    }
+
+    private serviceConfig: ServiceConfig = {
         commSearchUrl: '',
-        goAccess: '',
         goCommonSearchUrl: '',
-        hsbyBankSignZone: '',
-        hsbyRegister: '',
-        hsbyPayUrlWeb: '',
-        hsbySignUp: '',
-        mobileAuthUrl: '',
+        androidUpdateUrl: '',
+        tradeUrl: '',
+        quoteUrl: '',
+        goAccess: '',
         mobileOpenUrl: '',
-        newsUrl: '',
         openApiUrl: '',
-        quoteHost: '',
-        quotePort: '',
-        quoteUrl: '',
-        tradeHost: '',
-        tradePort: '',
-        tradeUrl: '',
         uploadUrl: '',
         quoteWS: '',
         tradeWS: '',
         oem: '',
-        iOS: '',
-        android: '',
-        androidUpdateUrl: '',
-        pcNewsUrl: '',
-        pcMangerUrl: '',
         shareUrl: '',
     }
 
-    /** 服务初始化完成状态 */
-    isReady = false
-
-    /** 等待服务初始化 */
-    private isPending = false
-
-    /**
-     * 自动初始化,若断网或其它原因导致初始化失败,需重新初始化
-     * IOS上架审核可能会遇到网络权限的情况,应用可能会在未授权网络权限的情况下发起请求,导致请求等待时间过长,最终审核被拒
-     */
-    //private onload = this.init()
-
-    /**
-     * 手动初始化
-     */
-    private onload = Promise.resolve(this.config)
-
-    /** 重试次数 */
-    private retryCount = 0
+    /** 加载本地配置 */
+    private async loadAppConfig() {
+        const data = await plus.getLocalFileContent<AppConfig>('./config/appconfig.json')
+        Object.assign(this.appConfig, data)
+        return data
+    }
 
-    /** 限制重试次数,0 = 无限制 */
-    private retryLimit = 5
-
-    /** 
-     * 失败时重新尝试初始化,直到成功为止
-     */
-    private tryinit = () => {
-        return new Promise<typeof this.config>((resolve, reject) => {
-            if (this.retryLimit === 0 || this.retryCount < this.retryLimit) {
-                this.retryCount++
-                setTimeout(() => {
-                    resolve(this.init())
-                }, 3000)
+    /** 加载服务配置 */
+    private loadServiceConfig = (url: string, retryCount = 0) => {
+        return new Promise<void>((resolve, reject) => {
+            if (this.maxRetryCount === 0 || retryCount <= this.maxRetryCount) {
+                plus.httpRequest({ url }).then((res) => {
+                    this.serviceConfig = res.data.data
+                    this.isReady = true
+                    this.taskQueue.run()
+                    resolve()
+                }).catch(() => {
+                    setTimeout(() => {
+                        retryCount++
+                        this.loadServiceConfig(url, retryCount).then(resolve).catch(reject)
+                    }, 3000)
+                })
             } else {
-                this.retryCount = 0
-                this.isPending = false
+                this.initPromise = null
                 reject('服务加载失败,请稍后再试')
             }
         })
     }
 
-    /**
-     * 初始化服务配置
-     */
-    private async init(): Promise<typeof this.config> {
-        this.isPending = true
-        await this.systemInfoAsync.catch(() => {
-            this.systemInfoAsync = getSystemConfig()
-        })
-        return new Promise((resolve, reject) => {
-            this.systemInfoAsync.then((res) => {
-                // 获取服务接口地址
-                axios(res.apiUrl).then((res) => {
-                    this.config = res.data.data
-                    this.isReady = true
-                    // 同步服务器时间
-                    getServerTime().then((res) => {
-                        const serverTime = moment(res.data)
-                        dateDiff.value = moment().diff(serverTime)
-                    })
-                    resolve(this.config)
+    async init() {
+        if (!this.initPromise) {
+            try {
+                await this.appConfigAsync
+            } catch {
+                this.appConfigAsync = this.loadAppConfig()
+            }
+            this.initPromise = new Promise<void>((resolve, reject) => {
+                this.appConfigAsync.then((data) => {
+                    this.loadServiceConfig(data.apiUrl).then(resolve).catch(reject)
                 }).catch(() => {
-                    const result = this.tryinit()
-                    resolve(result)
+                    this.initPromise = null
+                    reject('配置文件加载失败,请稍后再试')
                 })
-            }).catch(() => {
-                this.isPending = false
-                reject('配置文件加载失败,请稍后再试')
             })
-        })
-    }
-
-    /**
-     * 服务初始化完成时触发
-     */
-    onReady() {
-        if (!this.isReady && !this.isPending) {
-            this.onload = this.init()
         }
         // 确保当前只有一个初始化实例
-        return this.onload
+        return this.initPromise
+    }
+
+    get timestamp() {
+        return Date.now() - this.serverDiffTime
+    }
+
+    getAppConfig<K extends keyof AppConfig>(key: K) {
+        return this.appConfig[key]
+    }
+
+    getServiceConfig<K extends keyof ServiceConfig>(key: K) {
+        return this.serviceConfig[key]
+    }
+
+    hasModule = (module: AppConfig['modules'][number]) => {
+        return this.appConfig.modules.includes(module)
     }
 
-    /**
-     * 获取服务配置地址
-     * @param key 
-     * @returns 
-     */
-    getConfig<K extends keyof typeof this.config>(key: K) {
-        return this.config[key]
+    hasQuotationProperty = (key: keyof Model.QuoteDayRsp) => {
+        return this.appConfig.quotationProperties.includes(key)
+    }
+
+    onReady(callback: () => void) {
+        const cancel = this.taskQueue.add(callback)
+        if (this.isReady) {
+            this.taskQueue.run()
+        }
+        return cancel
     }
 })

+ 38 - 0
src/services/types.ts

@@ -0,0 +1,38 @@
+// 本地配置
+export interface AppConfig {
+    appName: string; // 应用名称
+    version: string; // 应用版本
+    versionCode: string; // 应用版本号
+    apiUrl: string; // 接口地址
+    tradeChannel: 'http' | 'ws'; // 交易通道
+    showLoginAlert: boolean; // 登录是否显示弹窗
+    modules: ('register' | 'delivery')[]; // 应用包含的模块
+    quotationProperties: (keyof Model.QuoteDayRsp)[]; // 盘面可显示的属性
+    forcedPasswordChange: boolean; // 首次登录是否强制修改密码
+    strongPassword: boolean; // 是否使用强密码规则
+    registrationCodeRule: -1 | 0 | 1; // 注册编码规则,-1=隐藏,0=非必填,1=必填
+    riskType: 0 | 1 | 2; // 风控类型,1=按单风控,2=按账户风控
+    i18nEnabled: boolean; // 是否启用多语言设置
+    allCloseEnabled: boolean; // 是否启用全部平仓
+    allDeliveryEnabled: boolean; // 是否启用全部交收
+    metaPixelId: string; // 是否启用像素追踪
+    appsFlyerId: string; // 是否启用像素追踪
+    appsFlyerKey: string; // 是否启用像素追踪
+}
+
+// 服务配置
+export interface ServiceConfig {
+    commSearchUrl: string;
+    goCommonSearchUrl: string;
+    androidUpdateUrl: string;
+    tradeUrl: string;
+    quoteUrl: string;
+    goAccess: string;
+    mobileOpenUrl: string;
+    openApiUrl: string;
+    uploadUrl: string;
+    quoteWS: string;
+    tradeWS: string;
+    oem: string;
+    shareUrl: string;
+}

+ 3 - 2
src/services/websocket/quote.ts

@@ -41,8 +41,9 @@ export default new (class {
     }
 
     async connect() {
-        const res = await service.onReady()
-        await this.socket.connect(res.quoteUrl)
+        await service.init()
+        const quoteUrl = service.getServiceConfig('quoteUrl')
+        await this.socket.connect(quoteUrl)
     }
 
     /**

+ 3 - 2
src/services/websocket/quoteV2.ts

@@ -37,8 +37,9 @@ export default new (class {
     }
 
     async connect() {
-        const res = await service.onReady()
-        await this.socket.connect(res.quoteWS, this.loginStore.token)
+        await service.init()
+        const quoteWS = service.getServiceConfig('quoteWS')
+        await this.socket.connect(quoteWS, this.loginStore.token)
     }
 
     /**

+ 3 - 2
src/services/websocket/trade.ts

@@ -37,8 +37,9 @@ export default new (class {
     private socket = new MTP2WebSocket(Package50);
 
     async connect() {
-        const res = await service.onReady()
-        await this.socket.connect(res.tradeUrl)
+        await service.init()
+        const tradeUrl = service.getServiceConfig('tradeUrl')
+        await this.socket.connect(tradeUrl)
     }
 
     /**

+ 4 - 3
src/services/websocket/tradeV2.ts

@@ -1,8 +1,8 @@
 import { useLoginStore } from '@/stores'
-import service from '@/services'
 import { MTP2WebSocket } from './build'
 import { Package50 } from './package'
 import { pushMessage50 } from './message'
+import service from '@/services'
 
 export default new (class {
     private loginStore = useLoginStore()
@@ -15,8 +15,9 @@ export default new (class {
     }
 
     async connect() {
-        const res = await service.onReady()
-        await this.socket.connect(res.tradeWS, this.loginStore.token)
+        await service.init()
+        const tradeWS = service.getServiceConfig('tradeWS')
+        await this.socket.connect(tradeWS, this.loginStore.token)
     }
 
     /**

+ 0 - 9
src/services/worker/market/types.ts

@@ -1,9 +0,0 @@
-export interface InitOptions {
-    url: string;
-    protocols: string | string[];
-}
-
-export interface UpdateData {
-    goodsList: Model.GoodsRsp[];
-    quoteList: Model.QuoteDayRsp[];
-}

+ 0 - 0
src/services/worker/market/cache.ts → src/services/worker/quote/cache.ts


+ 0 - 0
src/services/worker/market/thread.ts → src/services/worker/quote/thread.ts


+ 0 - 163
src/services/worker/service.ts

@@ -1,163 +0,0 @@
-import plus from '@/utils/h5plus'
-import { TaskQueue } from '@/utils/queue'
-
-// 本地配置
-interface AppConfig {
-    appName: string; // 应用名称
-    version: string; // 应用版本
-    versionCode: string; // 应用版本号
-    apiUrl: string; // 接口地址
-    tradeChannel: 'http' | 'ws'; // 交易通道
-    showLoginAlert: boolean; // 登录是否显示弹窗
-    modules: ('register' | 'delivery')[]; // 应用包含的模块
-    quotationProperties: (keyof Model.QuoteDayRsp)[]; // 盘面可显示的属性
-    forcedPasswordChange: boolean; // 首次登录是否强制修改密码
-    strongPassword: boolean; // 是否使用强密码规则
-    registrationCodeRule: -1 | 0 | 1; // 注册编码规则,-1=隐藏,0=非必填,1=必填
-    riskType: 0 | 1 | 2; // 风控类型,1=按单风控,2=按账户风控
-    i18nEnabled: boolean; // 是否启用多语言设置
-    allCloseEnabled: boolean; // 是否启用全部平仓
-    allDeliveryEnabled: boolean; // 是否启用全部交收
-    metaPixelId: string; // 是否启用像素追踪
-    appsFlyerId: string; // 是否启用像素追踪
-    appsFlyerKey: string; // 是否启用像素追踪
-}
-
-// 服务配置
-interface ServiceConfig {
-    commSearchUrl: string;
-    goCommonSearchUrl: string;
-    androidUpdateUrl: string;
-    tradeUrl: string;
-    quoteUrl: string;
-    goAccess: string;
-    mobileOpenUrl: string;
-    openApiUrl: string;
-    uploadUrl: string;
-    quoteWS: string;
-    tradeWS: string;
-    oem: string;
-    shareUrl: string;
-}
-
-export default new (class {
-    constructor() {
-        this.appConfigAsync = this.loadAppConfig()
-
-        // 自动初始化,若断网或其它原因导致初始化失败,需重新初始化
-        // IOS上架审核可能会遇到网络权限的情况,应用可能会在未授权网络权限的情况下发起请求,导致请求等待时间过长,最终审核被拒
-        //this.init()
-    }
-
-    isReady = false
-
-    private taskQueue = new TaskQueue()
-
-    /** 限制重试次数,0 = 无限制 */
-    private retryLimit = 5
-
-    private initPromise: Promise<void> | null = null
-
-    private appConfigAsync
-
-    private appConfig: AppConfig = {
-        appName: document.title,
-        version: '1.0.0',
-        versionCode: '100000',
-        apiUrl: 'http://localhost',
-        tradeChannel: 'ws',
-        showLoginAlert: false,
-        modules: [],
-        quotationProperties: [],
-        forcedPasswordChange: false,
-        strongPassword: true,
-        registrationCodeRule: 0,
-        riskType: 0,
-        i18nEnabled: true,
-        allCloseEnabled: false,
-        allDeliveryEnabled: false,
-        metaPixelId: '',
-        appsFlyerId: '',
-        appsFlyerKey: ''
-    }
-
-    private serviceConfig: ServiceConfig = {
-        commSearchUrl: '',
-        goCommonSearchUrl: '',
-        androidUpdateUrl: '',
-        tradeUrl: '',
-        quoteUrl: '',
-        goAccess: '',
-        mobileOpenUrl: '',
-        openApiUrl: '',
-        uploadUrl: '',
-        quoteWS: '',
-        tradeWS: '',
-        oem: '',
-        shareUrl: '',
-    }
-
-    /** 加载本地配置 */
-    private loadAppConfig() {
-        return plus.getLocalFileContent<AppConfig>('./config/appconfig.json')
-    }
-
-    /** 加载服务配置 */
-    private loadServiceConfig = (url: string, retryCount = 0) => {
-        return new Promise<void>((resolve, reject) => {
-            if (this.retryLimit === 0 || retryCount <= this.retryLimit) {
-                plus.httpRequest({ url }).then((res) => {
-                    this.serviceConfig = res.data.data
-                    this.isReady = true
-                    this.taskQueue.run()
-                    resolve()
-                }).catch(() => {
-                    setTimeout(() => {
-                        retryCount++
-                        this.loadServiceConfig(url, retryCount).then(resolve).catch(reject)
-                    }, 3000)
-                })
-            } else {
-                this.initPromise = null
-                reject('服务加载失败,请稍后再试')
-            }
-        })
-    }
-
-    async init() {
-        if (!this.initPromise) {
-            try {
-                await this.appConfigAsync
-            } catch {
-                this.appConfigAsync = this.loadAppConfig()
-            }
-            this.initPromise = new Promise<void>((resolve, reject) => {
-                this.appConfigAsync.then((data) => {
-                    Object.assign(this.appConfig, data)
-                    this.loadServiceConfig(data.apiUrl).then(resolve).catch(reject)
-                }).catch(() => {
-                    this.initPromise = null
-                    reject('配置文件加载失败,请稍后再试')
-                })
-            })
-        }
-        // 确保当前只有一个初始化实例
-        return this.initPromise
-    }
-
-    getAppConfig<K extends keyof AppConfig>(key: K) {
-        return this.appConfig[key]
-    }
-
-    getServiceConfig<K extends keyof ServiceConfig>(key: K) {
-        return this.serviceConfig[key]
-    }
-
-    onReady(callback: () => void) {
-        const cancel = this.taskQueue.add(callback)
-        if (this.isReady) {
-            this.taskQueue.run()
-        }
-        return cancel
-    }
-})

+ 1 - 1
src/services/worker/trade/index.ts

@@ -1,6 +1,6 @@
 import { FunCode } from '@/constants/funcode'
 import Worker from 'worker-loader!./thread'
-import Service from '../service'
+import Service from '../../index'
 
 interface RequestParams {
   content: unknown;

+ 0 - 78
src/stores/modules/global.ts

@@ -4,91 +4,18 @@ import { defineStore } from '../store'
 import { localData } from '../storage'
 import plus from '@/utils/h5plus'
 
-export interface SystemInfo {
-    appName: string; // 应用名称
-    version: string; // 应用版本
-    versionCode: string; // 应用版本号
-    apiUrl: string; // 接口地址
-    tradeChannel: 'http' | 'ws'; // 交易通道
-    showLoginAlert: boolean; // 登录是否显示弹窗
-    modules: ('register' | 'delivery')[]; // 应用包含的模块
-    quotationProperties: (keyof Model.QuoteDayRsp)[]; // 盘面可显示的属性
-    forcedPasswordChange: boolean; // 首次登录是否强制修改密码
-    strongPassword: boolean; // 是否使用强密码规则
-    registrationCodeRule: -1 | 0 | 1; // 注册编码规则,-1=隐藏,0=非必填,1=必填
-    riskType: 0 | 1 | 2; // 风控类型,1=按单风控,2=按账户风控
-    i18nEnabled: boolean; // 是否启用多语言设置
-    allCloseEnabled: boolean; // 是否启用全部平仓
-    allDeliveryEnabled: boolean; // 是否启用全部交收
-    metaPixelId: string; // 是否启用像素追踪
-    appsFlyerId: string; // 是否启用像素追踪
-    appsFlyerKey: string; // 是否启用像素追踪
-}
-
 export const useGlobalStore = defineStore(() => {
     const appTheme = localData.getRef('appTheme')
     const androidPermissions = localData.getRef('androidPermissions')
 
     const state = reactive({
-        dateDiff: 0, // 服务器和本地的时间差(毫秒数)
         showGoodsListing: false, // 是否显示订单交易挂牌
         showPricingListing: false, // 是否显示挂牌点价交易
         showTransferListing: false, // 是否显示定金转让挂牌
         clientWidth: 0, // 客户端宽度
         isMobile: false, // 是否移动设备
-        systemInfo: <SystemInfo>{
-            appName: document.title,
-            version: '1.0.0',
-            versionCode: '100000',
-            apiUrl: 'http://localhost',
-            tradeChannel: 'ws',
-            showLoginAlert: false,
-            modules: [],
-            quotationProperties: [],
-            forcedPasswordChange: false,
-            strongPassword: true,
-            registrationCodeRule: 0,
-            riskType: 0,
-            i18nEnabled: true,
-            allCloseEnabled: false,
-            allDeliveryEnabled: false,
-            metaPixelId: '',
-            appsFlyerId: '',
-            appsFlyerKey: ''
-        }
     })
 
-    // 获取当前服务器时间戳
-    const getTimestamp = () => {
-        const ts = Date.now()
-        return ts - state.dateDiff
-    }
-
-    // 获取系统配置项
-    const getSystemConfig = async () => {
-        const data = await plus.getLocalFileContent<SystemInfo>('./config/appconfig.json')
-        state.systemInfo = {
-            ...state.systemInfo,
-            ...data
-        }
-        return state.systemInfo
-    }
-
-    // 获取系统信息
-    const getSystemInfo = <K extends keyof SystemInfo>(key: K) => {
-        return state.systemInfo[key]
-    }
-
-    // 判断应用是否包含某个模块
-    const hasSystemModule = (module: SystemInfo['modules'][number]) => {
-        return state.systemInfo.modules.includes(module)
-    }
-
-    // 判断盘面是否包含某个属性
-    const hasQuotationProperty = (prop: keyof Model.QuoteDayRsp) => {
-        return state.systemInfo.quotationProperties.includes(prop)
-    }
-
     // 获取APP权限状态
     const getAndroidPermissions = <K extends keyof typeof androidPermissions.value>(key: K) => {
         if (plus.hasPlus() && plus.getSystemInfo('os') === 'Android') {
@@ -183,11 +110,6 @@ export const useGlobalStore = defineStore(() => {
     return {
         ...toRefs(state),
         appTheme,
-        getTimestamp,
-        getSystemConfig,
-        getSystemInfo,
-        hasSystemModule,
-        hasQuotationProperty,
         getAndroidPermissions,
         setAndroidPermissions,
         setStatusBarTheme,

+ 2 - 2
src/services/worker/market/index.ts → src/stores/modules/market.ts

@@ -4,8 +4,8 @@ import { isMatch } from 'lodash'
 import { TaskQueue } from '@/utils/queue'
 import { queryMemberGoodsLimitConfig } from '@/services/api/common'
 import { queryErmcpGoods, queryQuoteDay } from '@/services/api/goods'
-import Worker from 'worker-loader!./thread'
-import Service from '../service'
+import Worker from 'worker-loader!../../services/worker/quote/thread'
+import Service from '@/services'
 
 const worker = new Worker()