li.shaoyi 2 år sedan
förälder
incheckning
da574a01e5

+ 5 - 0
.env.zrwyt

@@ -0,0 +1,5 @@
+VUE_APP_ENV = 'mobile'
+VUE_APP_TITLE = 中融文遗通
+VUE_APP_ROOT = src/packages/mobile/
+VUE_APP_OEM = oem/zrwyt/
+VUE_APP_HOST = localhost

+ 5 - 0
.env.zrwyt@pc

@@ -0,0 +1,5 @@
+VUE_APP_ENV = 'pc'
+VUE_APP_TITLE = 中融文遗通
+VUE_APP_ROOT = src/packages/pc/
+VUE_APP_OEM = oem/zrwyt/
+VUE_APP_HOST = localhost

BIN
oem/zrwyt/logo/logo-horizontal.png


+ 2 - 2
package.json

@@ -6,10 +6,8 @@
     "dev:pc": "vue-cli-service serve --mode pc",
     "dev:mobile": "vue-cli-service serve --mode mobile",
     "dev:gstj": "vue-cli-service serve --mode gstj",
-    "dev:gstj@pc": "vue-cli-service serve --mode gstj@pc",
     "dev:sbyj": "vue-cli-service serve --mode sbyj",
     "dev:qxst": "vue-cli-service serve --mode qxst",
-    "dev:qxst@pc": "vue-cli-service serve --mode qxst@pc",
     "build:pc": "vue-cli-service build --mode pc",
     "build:mobile": "vue-cli-service build --mode mobile",
     "build:gstj": "vue-cli-service build --mode gstj",
@@ -17,6 +15,8 @@
     "build:sbyj": "vue-cli-service build --mode sbyj",
     "build:qxst": "vue-cli-service build --mode qxst",
     "build:qxst@pc": "vue-cli-service build --mode qxst@pc",
+    "build:zrwyt": "vue-cli-service build --mode zrwyt",
+    "build:zrwyt@pc": "vue-cli-service build --mode zrwyt@pc",
     "lint": "vue-cli-service lint"
   },
   "dependencies": {

+ 21 - 0
src/hooks/menu/index.ts

@@ -3,6 +3,7 @@ import { useRoute, useRouter } from 'vue-router'
 import { useMenuStore } from '@/stores'
 import { AuthType } from '@/constants/menu'
 
+// 待优化
 export function useMenu(authCode?: string) {
     const menuStore = useMenuStore()
     const { userRoutes } = menuStore.$toRefs()
@@ -71,6 +72,25 @@ export function useMenu(authCode?: string) {
     }
 
     /**
+     * 获取首页地址
+     * @returns 
+     */
+    const getHomeUrl = () => {
+        const findNode = (tree: Model.UserRoutes[]): string => {
+            for (const node of tree) {
+                if (node.children?.length) {
+                    const res = findNode(node.children)
+                    if (res) return res
+                } else {
+                    return node.url
+                }
+            }
+            return '/404'
+        }
+        return findNode(getMenus())
+    }
+
+    /**
      * 获取操作权限
      * @returns 
      */
@@ -134,6 +154,7 @@ export function useMenu(authCode?: string) {
         userRoutes,
         componentMap,
         getMenus,
+        getHomeUrl,
         getChildrenMenus,
         getAuthButtons,
         getAuthComponents,

+ 1 - 1
src/packages/mobile/views/boot/Index.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="boot">
+  <div class="boot" :style="`background-image: url(${'./app/splashscreen/1080x1920.png'});`">
     <Swipe class="boot__guide" :loop="false" v-if="state.showGuide">
       <SwipeItem>
         <img :src="'./app/splashscreen/1080x1920.png'" />

+ 3 - 1
src/packages/mobile/views/boot/index.less

@@ -1,6 +1,8 @@
 .boot {
     height: 100vh;
-    background: #fff url('/public/app/splashscreen/1080x1920.png') no-repeat center top;
+    background-color: #fff;
+    background-repeat: no-repeat;
+    background-position: center top;
     background-size: cover;
     overflow: hidden;
 

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

@@ -1,7 +1,7 @@
 <template>
   <app-view class="home-main">
     <template #header>
-      <app-navbar title="多元世纪" :show-back-button="false" />
+      <app-navbar :title="globalStore.appName" :show-back-button="false" />
     </template>
     <Banner :data-list="topBanners" />
     <PullRefresh class="home-main__container" v-model="refreshing" @refresh="onRefresh">
@@ -66,10 +66,11 @@ import { formatDate } from "@/filters";
 import { useNavigation } from '../../../router/navigation';
 import { queryImageConfigs } from "@/services/api/common";
 import { queryNewTitles } from "@/services/api/news";
-import { useLoginStore } from '@/stores'
+import { useLoginStore, useGlobalStore } from '@/stores'
 import Banner from '../../../components/base/banner/index.vue'
 import Iconfont from '../../../components/base/iconfont/index.vue'
 
+const globalStore = useGlobalStore()
 const loginStore = useLoginStore();
 const { routerTo, setGlobalUrlParams } = useNavigation();
 const refreshing = shallowRef(false); // 是否处于加载中状态

+ 4 - 0
src/packages/pc/assets/themes/default/default.less

@@ -141,6 +141,7 @@
         }
 
         .el-input,
+        .el-input-number,
         .el-select,
         .el-textarea {
             --el-input-bg-color: #15202b;
@@ -150,7 +151,10 @@
             --el-select-border-color-hover: var(--el-input-hover-border-color);
             --el-select-input-focus-border-color: var(--el-input-hover-border-color);
             --el-input-text-color: var(--color-default);
+            --el-text-color-regular: #fff;
             --el-text-color-placeholder: #4f5f6c;
+            --el-disabled-bg-color: #1f2b37;
+            --el-disabled-border-color: var(--el-input-border-color);
         }
 
         .el-select {

+ 5 - 1
src/packages/pc/router/index.ts

@@ -1,4 +1,5 @@
 import { createWebHashHistory, RouteRecordRaw } from 'vue-router'
+import { useMenu } from '@/hooks/menu'
 import { useLoginStore, useGlobalStore } from '@/stores'
 import dynamicRouter from './dynamicRouter'
 import historyRouter from './historyRouter'
@@ -10,7 +11,10 @@ const loginStore = useLoginStore()
 const routes: Array<RouteRecordRaw> = [
     {
         path: '/',
-        redirect: () => loginStore.token ? '/market/trade/goods' : '/login', // 重定向到默认页面
+        redirect: () => {
+            const { getHomeUrl } = useMenu() // 待优化
+            return loginStore.token ? getHomeUrl() : '/login' // 重定向到默认页面
+        }
     },
     {
         path: '/login',

+ 59 - 27
src/packages/pc/views/market/trade/goods/list/listing/index.vue

@@ -22,7 +22,7 @@
                 <el-form-item prop="OrderPrice" label="价格">
                     <div class="el-form-item--col">
                         <el-input-number ref="priceRef" placeholder="请输入" :min="0" :step="priceStep"
-                            :precision="selectedGoods?.decimalplace" v-model="formData.OrderPrice"
+                            :precision="selectedGoods?.decimalplace" :disabled="orderPriceType === 3" v-model="orderPrice"
                             @keyup.enter="qtyInputFocus" />
                         <div v-if="selectedGoods">
                             <div class="row-price g-price-up">
@@ -45,31 +45,31 @@
                         </el-radio-group>
                     </div>
                 </el-form-item>
+                <el-form-item>
+                    <template v-if="formData.BuyOrSell === BuyOrSell.Buy">
+                        <el-button ref="submitRef" type="primary" :loading="loading"
+                            :disabled="!selectedGoodsId || !formData.OrderQty"
+                            @click="onSubmit(EBuildType.BUILDTYPE_OPEN)">订立</el-button>
+                        <el-button type="primary" :loading="loading"
+                            :disabled="!formData.OrderQty || !sellQty || (formData.OrderQty > sellQty)"
+                            @click="onSubmit(EBuildType.BUILDTYPE_CLOSE)">
+                            <span>转让</span>
+                            <span v-if="sellQty">(≤{{ sellQty }})</span>
+                        </el-button>
+                    </template>
+                    <template v-if="formData.BuyOrSell === BuyOrSell.Sell">
+                        <el-button ref="submitRef" type="primary" :loading="loading"
+                            :disabled="!selectedGoodsId || !formData.OrderQty"
+                            @click="onSubmit(EBuildType.BUILDTYPE_OPEN)">订立</el-button>
+                        <el-button type="primary" :loading="loading"
+                            :disabled="!formData.OrderQty || !buyQty || (formData.OrderQty > buyQty)"
+                            @click="onSubmit(EBuildType.BUILDTYPE_CLOSE)">
+                            <span>转让</span>
+                            <span v-if="buyQty">(≤{{ buyQty }})</span>
+                        </el-button>
+                    </template>
+                </el-form-item>
             </el-form>
-            <div class="footer-btnbar">
-                <template v-if="formData.BuyOrSell === BuyOrSell.Buy">
-                    <el-button ref="submitRef" type="primary" :loading="loading"
-                        :disabled="!selectedGoodsId || !formData.OrderQty"
-                        @click="onSubmit(EBuildType.BUILDTYPE_OPEN)">订立买入</el-button>
-                    <el-button type="primary" :loading="loading"
-                        :disabled="!formData.OrderQty || !sellQty || (formData.OrderQty > sellQty)"
-                        @click="onSubmit(EBuildType.BUILDTYPE_CLOSE)">
-                        <span>转让买入</span>
-                        <span v-if="sellQty">(≤{{ sellQty }})</span>
-                    </el-button>
-                </template>
-                <template v-if="formData.BuyOrSell === BuyOrSell.Sell">
-                    <el-button ref="submitRef" type="primary" :loading="loading"
-                        :disabled="!selectedGoodsId || !formData.OrderQty"
-                        @click="onSubmit(EBuildType.BUILDTYPE_OPEN)">订立卖出</el-button>
-                    <el-button type="primary" :loading="loading"
-                        :disabled="!formData.OrderQty || !buyQty || (formData.OrderQty > buyQty)"
-                        @click="onSubmit(EBuildType.BUILDTYPE_CLOSE)">
-                        <span>转让卖出</span>
-                        <span v-if="buyQty">(≤{{ buyQty }})</span>
-                    </el-button>
-                </template>
-            </div>
         </div>
     </div>
 </template>
@@ -81,10 +81,11 @@ import { EPriceMode, EListingSelectType, EDelistingType, EBuildType, EValidType,
 import { BuyOrSell, getBuyOrSellList } from '@/constants/order'
 import { useOrder } from '@/business/trade'
 import { usePosition } from '@/business/position'
-import { useFuturesStore } from '@/stores'
+import { useFuturesStore, useSettingStore } from '@/stores'
 import Forex from '@pc/components/modules/quote/forex/index.vue'
 import Icon from '@pc/components/base/icon/index.vue'
 
+const settingStore = useSettingStore()
 const futuresStore = useFuturesStore()
 const { selectedGoodsId, selectedGoods, marketGoodsList } = futuresStore.$toRefs()
 const { formData, loading, formSubmit } = useOrder()
@@ -112,6 +113,32 @@ const buyQty = computed(() => getOrderQty(BuyOrSell.Buy, selectedGoodsId.value))
 // 卖方向持仓数量
 const sellQty = computed(() => getOrderQty(BuyOrSell.Sell, selectedGoodsId.value))
 
+// 价格类型
+const orderPriceType = computed(() => settingStore.getSettingValue('orderPriceType'))
+
+// 订单价格
+const orderPrice = computed({
+    get: () => {
+        const { last, bid, ask, presettle = 0 } = selectedGoods.value ?? {}
+        // 1=现价,2=对手价,3=实时价
+        switch (orderPriceType.value) {
+            case 2:
+                if (formData.BuyOrSell === BuyOrSell.Buy) {
+                    return ask || last || presettle
+                } else {
+                    return bid || last || presettle
+                }
+            case 3:
+                return last || presettle
+            default:
+                return formData.OrderPrice
+        }
+    },
+    set: (val) => {
+        formData.OrderPrice = val
+    }
+})
+
 const formRules: FormRules = {
     OrderPrice: [{
         required: true,
@@ -186,7 +213,12 @@ const onSubmit = (buildType: number) => {
                 }).catch((err) => {
                     ElMessage.error('挂牌失败:' + err)
                 }).finally(() => {
-                    priceInputFocus()
+                    const focusType = settingStore.getSettingValue('orderFocusType')
+                    if (focusType === 2 || orderPriceType.value === 3) {
+                        qtyInputFocus()
+                    } else {
+                        priceInputFocus()
+                    }
                 })
             })
         }

+ 8 - 2
src/packages/pc/views/market/trade/presell/transfer/listing/index.vue

@@ -68,10 +68,11 @@ import { BuyOrSell, getBuyOrSellList } from '@/constants/order'
 import { useRequest } from '@/hooks/request'
 import { queryMineTradePositionExs } from '@/services/api/transfer'
 import { useOrder } from '@/business/trade'
-import { useFuturesStore } from '@/stores'
+import { useFuturesStore, useSettingStore } from '@/stores'
 import Forex from '@pc/components/modules/quote/forex/index.vue'
 import Icon from '@pc/components/base/icon/index.vue'
 
+const settingStore = useSettingStore()
 const futuresStore = useFuturesStore()
 const { selectedGoodsId, selectedGoods, marketGoodsList } = futuresStore.$toRefs()
 const { formData, loading, formSubmit } = useOrder()
@@ -184,7 +185,12 @@ const onSubmit = () => {
                 }).catch((err) => {
                     ElMessage.error('挂牌失败:' + err)
                 }).finally(() => {
-                    priceInputFocus()
+                    const focusType = settingStore.getSettingValue('orderFocusType')
+                    if (focusType === 1) {
+                        priceInputFocus()
+                    } else {
+                        qtyInputFocus()
+                    }
                 })
             })
         }

+ 2 - 1
src/stores/index.ts

@@ -9,4 +9,5 @@ export { useFuturesStore } from './modules/futures'
 export { useErrorInfoStore } from './modules/errorInfo'
 export { useNoticeStore } from './modules/notice'
 export { useGoodsStore } from './modules/goods'
-export { usePositionStore } from './modules/position'
+export { usePositionStore } from './modules/position'
+export { useSettingStore } from './modules/setting'

+ 3 - 0
src/stores/modules/futures.ts

@@ -70,6 +70,9 @@ export const useFuturesStore = defineStore(() => {
                 })
             }).finally(() => {
                 state.loading = false
+                if (!state.selectedGoodsId) {
+                    state.selectedGoodsId = marketGoodsList.value[0]?.goodsid
+                }
                 // 每5分钟获取一次盘面
                 timerTask.setTimeout(() => getQuoteDay(codes), 5 * 60 * 1000, 'quoteDay')
             })

+ 47 - 0
src/stores/modules/setting.ts

@@ -1,10 +1,57 @@
+import { computed } from 'vue'
 import { defineStore } from '../store'
+import { useLoginStore } from './login'
+import { localData } from '../storage'
 
 /**
  * 系统设置存储对象
  */
 export const useSettingStore = defineStore(() => {
+    const loginStore = useLoginStore()
+    const settings = localData.getValue('settings')
+
+    const settingIndex = computed(() => settings.findIndex(((e) => e.loginId === loginStore.userId)))
+
+    const userSetting = computed(() => (settings[settingIndex.value] ?? {
+        loginId: 0,
+        showOrderDialog: true,
+        showOrderSuccessDialog: false,
+        showOrderFailDialog: false,
+        orderFocusType: 1,
+        orderPriceType: 1,
+    }))
+
+    // 获取设置项值
+    const getSettingValue = (key: keyof Omit<Model.LocalSetting, 'loginId'>) => {
+        return userSetting.value[key]
+    }
+
+    // 保存设置
+    const saveSettings = (value: Omit<Model.LocalSetting, 'loginId'>) => {
+        const item = {
+            loginId: loginStore.userId,
+            ...value
+        }
+        if (settingIndex.value > -1) {
+            settings[settingIndex.value] = item
+        } else {
+            settings.push(item)
+        }
+        localData.setValue('settings', settings)
+    }
+
+    // 恢复默认设置
+    const restoreDefaultSettings = () => {
+        if (settingIndex.value > -1) {
+            settings.splice(settingIndex.value, 1)
+            localData.setValue('settings', settings)
+        }
+    }
 
     return {
+        userSetting,
+        getSettingValue,
+        saveSettings,
+        restoreDefaultSettings
     }
 })

+ 1 - 8
src/stores/storage.ts

@@ -8,14 +8,7 @@ function createLocalData() {
         appTheme: AppTheme.Default,
         loginInfo: <Model.LoginRsp | undefined>undefined,
         autoLoginEncryptedData: '', // 自动登录加密数据
-        // setting: [
-        //     {
-        //         loginId: 0,
-        //         showOrderDialog: true, // 挂/摘牌时弹出提示确认对话框
-        //         showOrderSuccessDialog: false, // 挂/摘牌成功使用对话框提示
-        //         showOrderFailDialog: false, // 挂/摘牌失败使用对话框提示
-        //     }
-        // ]
+        settings: <Model.LocalSetting[]>([])
     }
 }
 

+ 10 - 0
src/types/model/common.d.ts

@@ -323,5 +323,15 @@ declare global {
         interface J10NewsReq {
             limit?: number; // 获取最新limit条内容
         }
+
+        /** 本地设置项 */
+        interface LocalSetting {
+            loginId: number;
+            showOrderDialog: boolean; // 挂/摘牌时弹出提示确认对话框
+            showOrderSuccessDialog: boolean; // 挂/摘牌成功使用对话框提示
+            showOrderFailDialog: boolean; // 挂/摘牌失败使用对话框提示
+            orderFocusType: number; // 下单后默认焦点对象,1=价格,2=数量
+            orderPriceType: number; // 下单默认价格类型,1=现价,2=对手价,3=实时价
+        }
     }
 }