zhangqiOMG 2 年 前
コミット
7e966ca114

+ 2 - 2
node_modules/.vite/deps/@ant-design_icons-vue.js

@@ -57,10 +57,10 @@ import {
   svgBaseProps,
   useInsertStyles,
   warning
-} from "./chunk-5XDXAD5U.js";
+} from "./chunk-BOZTDRRV.js";
 import {
   createVNode
-} from "./chunk-IDMHQ7FM.js";
+} from "./chunk-3NMN3MUW.js";
 import "./chunk-4EOJPDL2.js";
 
 // node_modules/@ant-design/icons-svg/es/asn/AccountBookFilled.js

ファイルの差分が大きいため隠しています
+ 0 - 0
node_modules/.vite/deps/@ant-design_icons-vue.js.map


+ 27 - 27
node_modules/.vite/deps/_metadata.json

@@ -1,104 +1,104 @@
 {
-  "hash": "0d9d205c",
-  "browserHash": "81d05683",
+  "hash": "4374df86",
+  "browserHash": "ec4c1811",
   "optimized": {
     "@ant-design/icons-vue": {
       "src": "../../@ant-design/icons-vue/es/index.js",
       "file": "@ant-design_icons-vue.js",
-      "fileHash": "8e02ca6b",
+      "fileHash": "f1f31ea5",
       "needsInterop": false
     },
     "ant-design-vue": {
       "src": "../../ant-design-vue/es/index.js",
       "file": "ant-design-vue.js",
-      "fileHash": "829568bd",
+      "fileHash": "e958e50c",
       "needsInterop": false
     },
     "ant-design-vue/es/locale/zh_CN": {
       "src": "../../ant-design-vue/es/locale/zh_CN.js",
       "file": "ant-design-vue_es_locale_zh_CN.js",
-      "fileHash": "a361d9d2",
+      "fileHash": "c30f749f",
       "needsInterop": false
     },
     "axios": {
       "src": "../../axios/index.js",
       "file": "axios.js",
-      "fileHash": "7514f3e7",
+      "fileHash": "3abc17ec",
       "needsInterop": false
     },
     "dayjs": {
       "src": "../../dayjs/dayjs.min.js",
       "file": "dayjs.js",
-      "fileHash": "e5d604b4",
+      "fileHash": "b2b743af",
       "needsInterop": true
     },
     "dayjs/locale/zh-cn": {
       "src": "../../dayjs/locale/zh-cn.js",
       "file": "dayjs_locale_zh-cn.js",
-      "fileHash": "0ba0e49e",
+      "fileHash": "5cd59bb2",
       "needsInterop": true
     },
     "js-md5": {
       "src": "../../js-md5/src/md5.js",
       "file": "js-md5.js",
-      "fileHash": "5f92d7e8",
+      "fileHash": "bd43d209",
       "needsInterop": true
     },
     "less": {
       "src": "../../less/dist/less.js",
       "file": "less.js",
-      "fileHash": "1b1eb850",
+      "fileHash": "966ee37d",
       "needsInterop": true
     },
     "mathjs": {
       "src": "../../mathjs/lib/esm/index.js",
       "file": "mathjs.js",
-      "fileHash": "a09badc9",
+      "fileHash": "156f6ef5",
       "needsInterop": false
     },
     "pinia": {
       "src": "../../pinia/dist/pinia.mjs",
       "file": "pinia.js",
-      "fileHash": "24af44a4",
+      "fileHash": "0eb43ba2",
       "needsInterop": false
     },
     "pinia-plugin-persist": {
       "src": "../../pinia-plugin-persist/dist/pinia-persist.es.js",
       "file": "pinia-plugin-persist.js",
-      "fileHash": "029824d5",
+      "fileHash": "6a023e4e",
       "needsInterop": false
     },
     "vue": {
       "src": "../../vue/dist/vue.runtime.esm-bundler.js",
       "file": "vue.js",
-      "fileHash": "7bb21984",
+      "fileHash": "41933eaa",
       "needsInterop": false
     },
     "vue-router": {
       "src": "../../vue-router/dist/vue-router.mjs",
       "file": "vue-router.js",
-      "fileHash": "6e6e5f1d",
+      "fileHash": "346bff36",
       "needsInterop": false
     }
   },
   "chunks": {
-    "chunk-TQOCY6B2": {
-      "file": "chunk-TQOCY6B2.js"
+    "chunk-5OBJFL24": {
+      "file": "chunk-5OBJFL24.js"
     },
-    "chunk-VCGGRANA": {
-      "file": "chunk-VCGGRANA.js"
+    "chunk-KBUAZBQ3": {
+      "file": "chunk-KBUAZBQ3.js"
     },
-    "chunk-5XDXAD5U": {
-      "file": "chunk-5XDXAD5U.js"
+    "chunk-BOZTDRRV": {
+      "file": "chunk-BOZTDRRV.js"
     },
-    "chunk-IDMHQ7FM": {
-      "file": "chunk-IDMHQ7FM.js"
+    "chunk-3NMN3MUW": {
+      "file": "chunk-3NMN3MUW.js"
     },
-    "chunk-UVFXKAFZ": {
-      "file": "chunk-UVFXKAFZ.js"
+    "chunk-BCNMYODF": {
+      "file": "chunk-BCNMYODF.js"
     },
-    "chunk-WT3GSKHH": {
-      "file": "chunk-WT3GSKHH.js"
+    "chunk-WNF2IDJY": {
+      "file": "chunk-WNF2IDJY.js"
     },
     "chunk-XMOLR7NX": {
       "file": "chunk-XMOLR7NX.js"

+ 5 - 5
node_modules/.vite/deps/ant-design-vue.js

@@ -1,6 +1,6 @@
 import {
   _extends
-} from "./chunk-VCGGRANA.js";
+} from "./chunk-KBUAZBQ3.js";
 import {
   ArrowLeftOutlined_default,
   ArrowRightOutlined_default,
@@ -57,7 +57,7 @@ import {
   ZoomOutOutlined_default,
   generate,
   presetPrimaryColors
-} from "./chunk-5XDXAD5U.js";
+} from "./chunk-BOZTDRRV.js";
 import {
   Comment,
   Fragment,
@@ -104,16 +104,16 @@ import {
   watchEffect,
   withDirectives,
   withModifiers
-} from "./chunk-IDMHQ7FM.js";
+} from "./chunk-3NMN3MUW.js";
 import {
   _objectSpread2,
   zh_CN_default
-} from "./chunk-UVFXKAFZ.js";
+} from "./chunk-BCNMYODF.js";
 import {
   _defineProperty,
   _toPropertyKey,
   _typeof
-} from "./chunk-WT3GSKHH.js";
+} from "./chunk-WNF2IDJY.js";
 import {
   require_dayjs_min
 } from "./chunk-XMOLR7NX.js";

ファイルの差分が大きいため隠しています
+ 0 - 0
node_modules/.vite/deps/ant-design-vue.js.map


+ 2 - 2
node_modules/.vite/deps/ant-design-vue_es_locale_zh_CN.js

@@ -1,8 +1,8 @@
 import {
   _objectSpread2,
   zh_CN_default
-} from "./chunk-UVFXKAFZ.js";
-import "./chunk-WT3GSKHH.js";
+} from "./chunk-BCNMYODF.js";
+import "./chunk-WNF2IDJY.js";
 import "./chunk-4EOJPDL2.js";
 
 // node_modules/ant-design-vue/es/vc-picker/locale/zh_CN.js

ファイルの差分が大きいため隠しています
+ 0 - 0
node_modules/.vite/deps/ant-design-vue_es_locale_zh_CN.js.map


ファイルの差分が大きいため隠しています
+ 0 - 0
node_modules/.vite/deps/axios.js.map


ファイルの差分が大きいため隠しています
+ 0 - 0
node_modules/.vite/deps/js-md5.js.map


+ 2 - 2
node_modules/.vite/deps/mathjs.js

@@ -1,9 +1,9 @@
 import {
   _extends
-} from "./chunk-VCGGRANA.js";
+} from "./chunk-KBUAZBQ3.js";
 import {
   _defineProperty
-} from "./chunk-WT3GSKHH.js";
+} from "./chunk-WNF2IDJY.js";
 import {
   __commonJS,
   __export,

ファイルの差分が大きいため隠しています
+ 0 - 0
node_modules/.vite/deps/mathjs.js.map


+ 1 - 1
node_modules/.vite/deps/pinia-plugin-persist.js.map

@@ -1,7 +1,7 @@
 {
   "version": 3,
   "sources": ["../../pinia-plugin-persist/dist/pinia-persist.es.js"],
-  "sourcesContent": ["const updateStorage = (strategy, store) => {\r\n  const storage = strategy.storage || sessionStorage;\r\n  const storeKey = strategy.key || store.$id;\r\n  if (strategy.paths) {\r\n    const partialState = strategy.paths.reduce((finalObj, key) => {\r\n      finalObj[key] = store.$state[key];\r\n      return finalObj;\r\n    }, {});\r\n    storage.setItem(storeKey, JSON.stringify(partialState));\r\n  } else {\r\n    storage.setItem(storeKey, JSON.stringify(store.$state));\r\n  }\r\n};\r\nvar index = ({ options, store }) => {\r\n  var _a, _b, _c, _d;\r\n  if ((_a = options.persist) == null ? void 0 : _a.enabled) {\r\n    const defaultStrat = [{\r\n      key: store.$id,\r\n      storage: sessionStorage\r\n    }];\r\n    const strategies = ((_c = (_b = options.persist) == null ? void 0 : _b.strategies) == null ? void 0 : _c.length) ? (_d = options.persist) == null ? void 0 : _d.strategies : defaultStrat;\r\n    strategies.forEach((strategy) => {\r\n      const storage = strategy.storage || sessionStorage;\r\n      const storeKey = strategy.key || store.$id;\r\n      const storageResult = storage.getItem(storeKey);\r\n      if (storageResult) {\r\n        store.$patch(JSON.parse(storageResult));\r\n        updateStorage(strategy, store);\r\n      }\r\n    });\r\n    store.$subscribe(() => {\r\n      strategies.forEach((strategy) => {\r\n        updateStorage(strategy, store);\r\n      });\r\n    });\r\n  }\r\n};\r\nexport { index as default, updateStorage };\r\n"],
+  "sourcesContent": ["const updateStorage = (strategy, store) => {\n  const storage = strategy.storage || sessionStorage;\n  const storeKey = strategy.key || store.$id;\n  if (strategy.paths) {\n    const partialState = strategy.paths.reduce((finalObj, key) => {\n      finalObj[key] = store.$state[key];\n      return finalObj;\n    }, {});\n    storage.setItem(storeKey, JSON.stringify(partialState));\n  } else {\n    storage.setItem(storeKey, JSON.stringify(store.$state));\n  }\n};\nvar index = ({ options, store }) => {\n  var _a, _b, _c, _d;\n  if ((_a = options.persist) == null ? void 0 : _a.enabled) {\n    const defaultStrat = [{\n      key: store.$id,\n      storage: sessionStorage\n    }];\n    const strategies = ((_c = (_b = options.persist) == null ? void 0 : _b.strategies) == null ? void 0 : _c.length) ? (_d = options.persist) == null ? void 0 : _d.strategies : defaultStrat;\n    strategies.forEach((strategy) => {\n      const storage = strategy.storage || sessionStorage;\n      const storeKey = strategy.key || store.$id;\n      const storageResult = storage.getItem(storeKey);\n      if (storageResult) {\n        store.$patch(JSON.parse(storageResult));\n        updateStorage(strategy, store);\n      }\n    });\n    store.$subscribe(() => {\n      strategies.forEach((strategy) => {\n        updateStorage(strategy, store);\n      });\n    });\n  }\n};\nexport { index as default, updateStorage };\n"],
   "mappings": ";;;AAAA,IAAM,gBAAgB,CAAC,UAAU,UAAU;AACzC,QAAM,UAAU,SAAS,WAAW;AACpC,QAAM,WAAW,SAAS,OAAO,MAAM;AACvC,MAAI,SAAS,OAAO;AAClB,UAAM,eAAe,SAAS,MAAM,OAAO,CAAC,UAAU,QAAQ;AAC5D,eAAS,GAAG,IAAI,MAAM,OAAO,GAAG;AAChC,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AACL,YAAQ,QAAQ,UAAU,KAAK,UAAU,YAAY,CAAC;AAAA,EACxD,OAAO;AACL,YAAQ,QAAQ,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,EACxD;AACF;AACA,IAAI,QAAQ,CAAC,EAAE,SAAS,MAAM,MAAM;AAClC,MAAI,IAAI,IAAI,IAAI;AAChB,OAAK,KAAK,QAAQ,YAAY,OAAO,SAAS,GAAG,SAAS;AACxD,UAAM,eAAe,CAAC;AAAA,MACpB,KAAK,MAAM;AAAA,MACX,SAAS;AAAA,IACX,CAAC;AACD,UAAM,eAAe,MAAM,KAAK,QAAQ,YAAY,OAAO,SAAS,GAAG,eAAe,OAAO,SAAS,GAAG,WAAW,KAAK,QAAQ,YAAY,OAAO,SAAS,GAAG,aAAa;AAC7K,eAAW,QAAQ,CAAC,aAAa;AAC/B,YAAM,UAAU,SAAS,WAAW;AACpC,YAAM,WAAW,SAAS,OAAO,MAAM;AACvC,YAAM,gBAAgB,QAAQ,QAAQ,QAAQ;AAC9C,UAAI,eAAe;AACjB,cAAM,OAAO,KAAK,MAAM,aAAa,CAAC;AACtC,sBAAc,UAAU,KAAK;AAAA,MAC/B;AAAA,IACF,CAAC;AACD,UAAM,WAAW,MAAM;AACrB,iBAAW,QAAQ,CAAC,aAAa;AAC/B,sBAAc,UAAU,KAAK;AAAA,MAC/B,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;",
   "names": []
 }

+ 2 - 2
node_modules/.vite/deps/pinia.js

@@ -1,6 +1,6 @@
 import {
   setupDevtoolsPlugin
-} from "./chunk-TQOCY6B2.js";
+} from "./chunk-5OBJFL24.js";
 import {
   computed,
   effectScope,
@@ -19,7 +19,7 @@ import {
   toRefs,
   unref,
   watch
-} from "./chunk-IDMHQ7FM.js";
+} from "./chunk-3NMN3MUW.js";
 import "./chunk-4EOJPDL2.js";
 
 // node_modules/pinia/node_modules/vue-demi/lib/index.mjs

+ 2 - 2
node_modules/.vite/deps/vue-router.js

@@ -1,6 +1,6 @@
 import {
   setupDevtoolsPlugin
-} from "./chunk-TQOCY6B2.js";
+} from "./chunk-5OBJFL24.js";
 import {
   computed,
   defineComponent,
@@ -18,7 +18,7 @@ import {
   unref,
   watch,
   watchEffect
-} from "./chunk-IDMHQ7FM.js";
+} from "./chunk-3NMN3MUW.js";
 import "./chunk-4EOJPDL2.js";
 
 // node_modules/vue-router/dist/vue-router.mjs

+ 1 - 1
node_modules/.vite/deps/vue.js

@@ -145,7 +145,7 @@ import {
   withMemo,
   withModifiers,
   withScopeId
-} from "./chunk-IDMHQ7FM.js";
+} from "./chunk-3NMN3MUW.js";
 import "./chunk-4EOJPDL2.js";
 export {
   BaseTransition,

+ 59 - 9
src/components/layout/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <a-layout class="sw-layout">
+  <a-layout class="sw-layout" v-if="isRefresh">
     <!-- <web-socket></web-socket> -->
     <head-temp></head-temp>
     <div class="flex">
@@ -7,7 +7,7 @@
       <menu-temp></menu-temp>
       <a-layout-content class="content-height">
         <history-tabs></history-tabs>
-        <div :style="{ padding: '0px 10px 0 10px', minHeight: 'calc(100vh - 130px)'}">
+        <div :style="{ padding: '10px', minHeight: 'calc(100vh - 130px)'}">
           <router-view v-slot="{ Component }">
             <transition  mode="out-in">
               <keep-alive>
@@ -21,10 +21,13 @@
         </div>
       </a-layout-content>
     </div>
-    <!-- <a-layout-footer class="footer">
-      Copyright © 2023 嘉兴市云链信息技术有限公司
-    </a-layout-footer> -->
   </a-layout>
+  <div class="flex-loading" v-else>
+    <div style="text-align:center">
+      <div class="loading"></div>
+      <p style="margin-top:40px;color:rgb(100, 108, 255)">站点切换中,正在加载站点配置...</p>
+    </div>
+  </div>
 </template>
 <script setup>
 import headTemp from './modules/header.vue';
@@ -32,13 +35,13 @@ import asideTemp from './modules/systemMod.vue'
 import menuTemp from './modules/menu.vue'
 import historyTabs from './modules/historyTabs.vue'
 import webSocket from '../webSocket/index.vue'
+import { storeToRefs } from 'pinia'
+import { useAuthStore } from '@/stores/modules/auth'
 import { useRouter } from "vue-router";
 const router = useRouter()
 
-// watch(() => router.currentRoute.value,(to, from) => {
-//   rotTabs.saveRoute(to)
-//   store.appData(to.name)
-// })
+const store = useAuthStore()
+let { isRefresh } = storeToRefs(store)
 </script>
 <style>
 .site-layout-content {
@@ -80,4 +83,51 @@ const router = useRouter()
   opacity: 0;
   transform: scale(0.9);
 }
+.flex-loading{
+  height: 100vh;
+  width: 100vw;
+  display: flex;
+  align-items: center;
+  justify-content: space-around;
+  background-image: url(@/assets/bg.png);
+  background-size: cover;
+}
+.loading {
+  position: relative;
+  width: 205px;
+  perspective: 200px;
+  text-align: center;
+}
+
+.loading:before,
+.loading:after {
+  position: absolute;
+  width: 20px;
+  height: 20px;
+  content: "";
+  animation: jumping 0.5s infinite alternate;
+  background: rgba(0, 0, 0, 0);
+}
+
+.loading:before {
+  left: 55%;
+}
+
+.loading:after {
+  right: 55%;
+  animation-delay: 0.15s;
+}
+
+@keyframes jumping {
+  0% {
+    transform: scale(1) translateY(0px) rotateX(0deg);
+    box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+  }
+
+  100% {
+    transform: scale(1.2) translateY(-25px) rotateX(45deg);
+    background: rgb(100, 108, 255);
+    box-shadow: 0 25px 40px #000;
+  }
+}
 </style>

+ 10 - 2
src/components/layout/modules/header.vue

@@ -37,7 +37,7 @@
 </template>
 
 <script setup>
-import {ref,createVNode} from 'vue'
+import {ref,createVNode,watch,nextTick} from 'vue'
 import { UserOutlined, DownOutlined,BellOutlined,QuestionCircleOutlined, LogoutOutlined,ExclamationCircleOutlined} from '@ant-design/icons-vue';
 import { useAuthStore } from '@/stores/modules/auth'
 import { useRouteTabsStore } from '@/stores/modules/Htabs'
@@ -49,11 +49,14 @@ const router = useRouter()
 import Api from '@/api/api'
 
 const store = useAuthStore()
-let { accountList,nowAccount } = storeToRefs(store)
+let { mods,actMod,nowAccount,accountList,current,app } = storeToRefs(store)
 
 const rotTabs = useRouteTabsStore()
 let {historyRoutes} = storeToRefs(rotTabs)
 const accountItemClick = (account,bool)=>{
+  if (router.currentRoute.value.meta.isDetail) {
+    router.go(-1)
+  }
   store.defaultAccount(account,()=>{
     store.reloadPage()
     historyRoutes.value = []
@@ -73,6 +76,11 @@ const loginOut = ()=>{
     }
   });
 }
+watch(() => router.currentRoute.value,(to, from) => {
+  nextTick(()=>{
+    current.value = [app.value.systemmoduleid,app.value.systemappid]
+  })
+})
 </script>
 <style scoped>
 .sw-header{

+ 2 - 2
src/components/layout/modules/systemMod.vue

@@ -95,7 +95,7 @@ watch (()=>system.value,() => {
   font-size: 14px;
   text-align: center;
   line-height: 30px;
-
+  
 }
 .collapsed{
   display: block;
@@ -104,4 +104,4 @@ watch (()=>system.value,() => {
 .onSystem .uncollapsed{
  color:#333;
 }
-</style>
+</style>

+ 29 - 67
src/components/listTemplate/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
-    <div>
-      <field v-if="searchType" :searchType="searchType" @onSubmit="search"></field>
+    <div v-if="props.searchType" >
+      <field :searchType="props.searchType" @onSubmit="search"></field>
     </div>
     <a-card id="fulltable" :bodyStyle="{padding:'10px'}">
       <template #title>
@@ -37,7 +37,7 @@
       </template>
       <a-table class="ant-table-small ant-table-red" :loading="loading" size="small" :dataSource="dataSource" :columns="columns" :pagination="{showSizeChanger:true,defaultPageSize:20,total:total}" :scroll="fullscreen?{x:'max-content',y:'86vh'}:{x:'max-content'}" :row-class-name="(_record, index) => formatter(_record, index)" @change="onChange" bordered>
         <template #headerCell="{ column }">
-          <div style="width:100%;" v-if="column.filter == 1 || column.filter == 2">
+          <div style="width:100%;min-width:70px" v-if="column.filter == 1 || column.filter == 2">
             <a-input v-model:value="column.value" :placeholder="column.title" @change="setSearchParam(column.dataIndex,column.value)" @pressEnter="tableData" :bordered="true">
               <template v-if="column.sortable == 1" #suffix>
                 <sort-ascending-outlined v-if="column.sort == 0" @click="setSort(column,1)"/>
@@ -52,7 +52,7 @@
               <sort-descending-outlined v-else @click="setSort(column,0)"/>
             </span>
           </div>
-
+          
         </template>
         <template #bodyCell="{ column, record }">
           <template v-if="column.dataIndex === 'status'">
@@ -72,21 +72,24 @@
   import field from './field/index.vue'
   import Api  from '@/api/api'
   import utils from '@/utils/utils'
-  /*import settingColumns from '@/components/tableConfiguration/settingColumns.vue'
-  import fullScreen from '@/components/tableConfiguration/fullScreen.vue'*/
-  import {ref,getCurrentInstance,onMounted,defineExpose,watch, computed,onActivated} from 'vue'
+  import settingColumns from '@/components/tableConfiguration/settingColumns.vue'
+  import fullScreen from '@/components/tableConfiguration/fullScreen.vue'
+  import {ref,getCurrentInstance,onMounted,defineExpose,watch, computed,onActivated,onDeactivated} from 'vue'
   import { SortAscendingOutlined,SortDescendingOutlined,DownOutlined,SyncOutlined,SettingOutlined  } from '@ant-design/icons-vue';
   import { storeToRefs } from 'pinia'
-  import { useRouter,onBeforeRouteLeave } from "vue-router";
+  import { useRouter } from "vue-router";
   import { useAuthStore } from '@/stores/modules/auth'
   import { useColumnsStore } from '@/stores/modules/columns'
   import { useBaseStore } from '@/stores/modules/base'
+  import { useRouteTabsStore } from '@/stores/modules/Htabs'
   const store = useAuthStore()
   const colStore = useColumnsStore()
   const base = useBaseStore()
+  const routeTabs = useRouteTabsStore()
   let { app } = storeToRefs(store)
-  let { PageUpParam,nowPageData,keyid,pageTotal,fullscreen } = storeToRefs(base)
+  let { fullscreen } = storeToRefs(base)
   let { selectedColumns } = storeToRefs(colStore)
+  let { historyRoutes } = storeToRefs(routeTabs)
   const router = useRouter()
   const props = defineProps({
     param: Object,
@@ -103,7 +106,7 @@
   const total = ref(0)
 
   const formatter = (_record, index) => {
-    if (props.tableRowStyle)
+    if (props.tableRowStyle) 
       return props.tableRowStyle(_record, index)
     if (index % 2 === 1) {
       return 'table-striped'
@@ -121,15 +124,7 @@
      * 开启列过滤时需要传tableid,因此在获取表格数据的时候把table赋值到请求参数中
      */
     props.param.content.tableid = app.value.meta.tables[props.tableName].tableid
-
-    let param = {
-      tableName:props.tableName,
-      app:app.value,
-      fn:()=>{
-        columns.value = utils.TBLayout(props.tableName)
-      }
-    }
-    colStore.setConfig(param)
+    columns.value = colStore.loadTableConfig(props.tableName)
   }
   const sort = ref([])
   const tableData = async ()=>{
@@ -138,19 +133,14 @@
     dataSource.value = res.data
     total.value = res.total
     sort.value = res.sort
-    loading.value = false
-    // 设置翻页数据
-    if (props.detailPage) {
-      PageUpParam.value = props.param
-      nowPageData.value = dataSource.value
-      keyid.value = props.detailPage.idname
-      pageTotal.value = res.pageTotal
-    }
+    setTimeout(() => {
+      loading.value = false
+    }, 1000);
   }
 
   const toDetailPage = (record)=>{
     // 跳转到详情
-    router.push({name:props.detailPage.name,query:{id:record[props.detailPage.idname]}})
+    router.push({name:props.detailPage.name,query:{id:record[props.detailPage.idname],rowindex:record.rowindex}})
   }
   const search = (val)=>{
     props.param.content.where = Object.assign({},props.param.content.where,val)
@@ -164,33 +154,10 @@
     props.param.content.sort = [nowSort.value]
     tableData()
   }
-  const cache = ref([])
   const setSearchParam = (dataIndex,value)=>{
     props.param.content.pageNumber = 1
     props.param.content.where.tablefilter = props.param.content.where.tablefilter ? props.param.content.where.tablefilter : {}
     props.param.content.where.tablefilter[dataIndex] = value
-
-    //缓存搜索数据
-    let rs = cache.value.some(item=>item.dataIndex == dataIndex)
-    if (rs) {
-      cache.value.forEach(e=>{
-        if (e.dataIndex == dataIndex) {
-          e.value = value
-        }
-      })
-    } else {
-      cache.value.push({
-        dataIndex:dataIndex,
-        value:value
-      })
-    }
-
-    let param = {
-      tableName:props.tableName,
-      app:app.value,
-      cache:cache.value
-    }
-    colStore.cacheInputParam(param)
   }
   const setSort = (column,sort)=>{
     props.param.content.simplesort = {}
@@ -201,27 +168,23 @@
       }
     })
     tableData()
-
+    
   }
+  watch (() => selectedColumns.value,(n, o) => {
+    colStore.loadTableConfig(props.tableName)?columns.value = colStore.loadTableConfig(props.tableName):''
+  })
   defineExpose({
     tableData
   })
-  /**
-   * 开启缓存后需要拉取新数据
-   */
-  onActivated(()=>{
-    getTableLayout()
-  })
   onMounted (()=>{
     getTableLayout()
     props.noAutoQuery ? '' : tableData()
   })
-  watch (() => selectedColumns.value,(n, o) => {
-    columns.value = colStore.getCacheInputParam({
-      tableName:props.tableName,
-      app:app.value,
-      columns:selectedColumns.value
-    })
+  onActivated (()=>{
+    // getTableLayout()
+    props.noAutoQuery ? '' : tableData()
+  })
+  onDeactivated (()=>{
   })
 </script>
 <style scoped>
@@ -230,11 +193,10 @@
 }
 .ant-table-small :deep td{
   font-size: 12px;
-  min-width: 150px;
 }
 .ant-table-small :deep(.table-striped) td {
   background-color: #f8f9fd;
-
+  
 }
 .ant-table-small :deep(.table-striped-red) td {
   color: #d9363e;
@@ -257,4 +219,4 @@
   align-items: center;
   justify-content: space-between;
 }
-</style>
+</style>

+ 62 - 0
src/components/tableConfiguration/fullScreen.vue

@@ -0,0 +1,62 @@
+<template>
+  <div>
+     <fullscreen-outlined v-if="!fullscreen" @click="enterFullscreen"/>
+     <fullscreen-exit-outlined v-else @click="exitFullscreen"/>
+  </div>
+</template>
+
+<script setup>
+  import { FullscreenOutlined,FullscreenExitOutlined  } from '@ant-design/icons-vue';
+  import {ref,defineProps,onMounted,watch} from 'vue'
+  import { storeToRefs } from 'pinia'
+  import { useBaseStore } from '@/stores/modules/base'
+  const base = useBaseStore()
+  let { fullscreen } = storeToRefs(base)
+  const props = defineProps(['domId'])
+  const enterFullscreen = () => {
+     /* 获取(<html>)元素以全屏显示页面 */
+    const full = document.getElementById(props.domId)
+    if (full.RequestFullScreen) {
+        full.RequestFullScreen()
+        //兼容Firefox
+    } else if (full.mozRequestFullScreen) {
+        full.mozRequestFullScreen()
+        //兼容Chrome, Safari and Opera等
+    } else if (full.webkitRequestFullScreen) {
+        full.webkitRequestFullScreen()
+        //兼容IE/Edge
+    } else if (full.msRequestFullscreen) {
+        full.msRequestFullscreen()
+    }
+  }
+  const exitFullscreen = ()=>{
+    if (document.exitFullscreen) {
+        document.exitFullscreen();
+    } else if (document.webkitCancelFullScreen) {
+        document.webkitCancelFullScreen();
+    } else if (document.mozCancelFullScreen) {
+        document.mozCancelFullScreen();
+    } else if (document.msExitFullscreen) {
+        document.msExitFullscreen();
+    }
+  }
+  const handleFullscreenChange = ()=> {
+    if (document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement) {
+      // 全屏模式激活
+      console.log('全屏模式已激活');
+      fullscreen.value = true
+    } else {
+      // 全屏模式退出
+      fullscreen.value = false
+      console.log('全屏模式已退出');
+    }
+  }
+  onMounted(()=>{
+    document.addEventListener('fullscreenchange', handleFullscreenChange);
+    document.addEventListener('mozfullscreenchange', handleFullscreenChange);
+    document.addEventListener('webkitfullscreenchange', handleFullscreenChange);
+    document.addEventListener('MSFullscreenChange',handleFullscreenChange)
+  })
+</script>
+<style>
+</style>

+ 108 - 0
src/components/tableConfiguration/settingColumns.vue

@@ -0,0 +1,108 @@
+<template>
+  <div>
+    <a-popover trigger="click" placement="left" :getPopupContainer="triggerNode => {return triggerNode.parentNode || document.body;}">
+      <template #title>
+        <div class="title-panel">
+          <span>筛选列</span>
+          <a-button class="fl-r" type="link" @click="reloadConfig">重置</a-button>
+        </div>
+      </template>
+      <template #content>
+        <div style="width:150px">
+          <a-checkbox-group v-model:value="checkedColumns" name="checkboxgroup" @change="onChange">
+            <a-row>
+              <a-col class="mt-10" v-for="(box,index) in columnsData" :key="box.index" :span="24" :draggable="true" @dragstart="dragStart(index)" @dragover="dragOver(index)" @drop="drop(index)" @dragend="dragEnd">
+                <div class="flex">
+                  <a-checkbox :value="box.value">{{box.label}}</a-checkbox>
+                  <drag-outlined />
+                </div>
+              </a-col>
+            </a-row>
+          </a-checkbox-group>
+        </div>
+      </template>
+      <setting-outlined />
+    </a-popover>
+    
+  </div>
+</template>
+
+<script setup>
+  import { SettingOutlined,DragOutlined  } from '@ant-design/icons-vue';
+  import {defineProps,ref,computed,defineEmits,defineExpose,onMounted,onActivated, nextTick} from 'vue'
+  import utils from '@/utils/utils'
+  import { storeToRefs } from 'pinia'
+  import { useColumnsStore } from '@/stores/modules/columns'
+  import { useAuthStore } from '@/stores/modules/auth'
+  const colStore = useColumnsStore()
+  const store = useAuthStore()
+  let { app } = storeToRefs(store)
+  let { checkedColumns,columnsIndex } = storeToRefs(colStore)
+  const props = defineProps(['tableName','columns'])
+  const emit = defineEmits(['change'])
+  const columnsData = ref([]) // checkboxGroup数据
+  const reloadConfig = ()=>{
+    columnsIndex.value = checkedColumns.value = utils.TBLayout(props.tableName).map(e=>e.dataIndex)
+    colStore.userSetting(props.tableName)
+  }
+  /**
+   * 根据选中的数据过滤出表格列数据集
+   * @param {Array} selectedColumns 当前选中的表格列
+   */
+  const onChange = (val)=>{
+    colStore.userSetting(props.tableName)
+  }
+  const draggedIndex = ref(0)
+  const dragStart = (index)=> {
+    draggedIndex.value = index;
+  }
+  const dragOver = (index)=> {
+    event.preventDefault();
+    const movedIndex = draggedIndex.value;
+    if (movedIndex !== index) {
+      const list = [...columnsData.value];
+      const movedItem = list[movedIndex];
+      list.splice(movedIndex, 1);
+      list.splice(index, 0, movedItem);
+      columnsData.value = list;
+      draggedIndex.value = index;
+      columnsIndex.value = columnsData.value.map(e=>e.value)
+    }
+  }
+  const drop = (index)=> {
+    event.preventDefault();
+  }
+  const dragEnd = ()=> {
+    colStore.userSetting(props.tableName)
+    draggedIndex.value = null;
+    
+  }
+  const initData = () => {
+    columnsData.value = colStore.getUserSetting(props.tableName)
+  }
+  onMounted(()=>{
+   initData()
+  })
+  onActivated (()=>{
+    initData()
+  })
+  defineExpose({
+  })
+</script>
+<style scoped>
+.flex{
+  padding: 2px 5px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+.title-panel{
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  overflow: hidden;
+}
+.fl-r{
+  float: right;
+}
+</style>

+ 23 - 15
src/stores/modules/auth.js

@@ -15,6 +15,7 @@ export const useAuthStore = defineStore('auth', {
       app:{},
       actMod:{},
       current:[],
+      tableConfigs:{},
       hiddenSensitiveFields:false
     }
   },
@@ -24,7 +25,7 @@ export const useAuthStore = defineStore('auth', {
     strategies: [
       {
         storage: localStorage,
-        paths: ['system', 'mods','app','accountList','nowAccount','actSystem','current']
+        paths: ['system', 'mods','app','accountList','nowAccount','actSystem','current','tableConfigs']
       }
     ]
   },
@@ -83,20 +84,27 @@ export const useAuthStore = defineStore('auth', {
     },
     // 获取应用数据
     appData (appName) {
-      const findApp = (array, name) => {
-        for (const item of array) {
-          for (const module of item.modules) {
-            const match = module.apps.find(app => app.name === name)
-            if (match) {
-              return match
+      function findAppByName(systems, targetName) {
+        let foundApp = null;
+        function search(systems) {
+          for (let i = 0; i < systems.length; i++) {
+            const system = systems[i];
+            if (system.modules && system.modules.length > 0) {
+              search(system.modules); // 递归调用搜索函数
+            }
+            if (system.apps) {
+              const app = system.apps.find((app) => app.name === targetName);
+              if (app) {
+                foundApp = app;
+                break; // 找到目标 app 后停止搜索
+              }
             }
           }
         }
+        search(systems);
+        return foundApp;
       }
-      if (this.app.name !== appName) {
-        this.app = findApp(this.system,appName)
-      }
-      
+      this.app = findAppByName(this.system,appName)
     },
 
     async getConfig () {
@@ -107,15 +115,16 @@ export const useAuthStore = defineStore('auth', {
         }
       })
       if (res.data.config) {
-        sessionStorage.setItem('customConfig',res.data.config)
+        this.tableConfigs = JSON.parse(res.data.config)
       } else {
-        sessionStorage.removeItem('customConfig')
+        this.tableConfigs = {}
       }
     },
     /**
      * 设置默认账号
      */
     defaultAccount (account,fn) {
+
       this.nowAccount = account
 
       sessionStorage.setItem('token',account.token)
@@ -124,7 +133,7 @@ export const useAuthStore = defineStore('auth', {
 
       this.systemAuthData()
 
-      fn && fn()
+      fn()
     },
     /**
      * 切换站点以后刷新数据
@@ -136,5 +145,4 @@ export const useAuthStore = defineStore('auth', {
       }, 1000);
     }
   }
-    
 })

+ 84 - 96
src/stores/modules/columns.js

@@ -1,5 +1,9 @@
 import { defineStore } from 'pinia'
 import utils from '@/utils/utils'
+import { storeToRefs } from 'pinia'
+import { useAuthStore } from "@/stores/modules/auth";
+const store = useAuthStore()
+let { tableConfigs,app } = storeToRefs(store)
 
 import Api from '@/api/api'
 
@@ -9,10 +13,9 @@ export const useColumnsStore = defineStore('columnStore', {
   state: () => {
     return {
       colIndex:[],
-      tableConfigs:{},
       checkedColumns:[],
       columnsIndex:[],
-      selectedColumns:[],
+      selectedColumns:0,
       cacheData:{},
       time:null
     }
@@ -29,45 +32,91 @@ export const useColumnsStore = defineStore('columnStore', {
   },
   getters:{},
   actions:{
+
     /**
-     * 获取配置数据
-     * @param columnsIndex 列索配置
-     * @param checkedColumns 选择配置
-     * @param tableName 表名称
-     * @param app 应用名称
+     * 用户修改后的配置
      */
-    configToJson ({columnsIndex,checkedColumns,tableName,app}) {
-      this.tableConfigs[`${app.systemappid}${tableName}`] = {
-        index:columnsIndex,
-        selected:checkedColumns
-      }
-      this.setColnums({columnsIndex,checkedColumns,tableName,app})
-      if (this.time !== null) {
-        clearTimeout(this.time)
-      }
-      this.time = setTimeout(() => {
-        this.saveConfig(JSON.stringify(this.tableConfigs))
-      }, 2000);
-
-      sessionStorage.setItem('customConfig',JSON.stringify(this.tableConfigs))
+    userSetting (tableName) {
+      // 设置时间戳,监听列表发生改动
+      this.selectedColumns = new Date()
+      
+      // 配置项
+      tableConfigs.value[`${app.value.systemappid}${tableName}`] = {}
+      tableConfigs.value[`${app.value.systemappid}${tableName}`].columnsIndex = this.columnsIndex
+      tableConfigs.value[`${app.value.systemappid}${tableName}`].checkedColumns = this.checkedColumns
+      this.saveConfig(tableConfigs.value)
     },
     /**
-     * 根据获取到的排序重新排列表格列
-     * @param a 目标数组
-     * @param b 索引数组
+     * 获取应用配置
      */
-    sortTableColnums (ky,columnsData) {
-      let customConfig = sessionStorage.getItem('customConfig')
-      if (customConfig && customConfig[ky]) {
-        customConfig = JSON.parse(customConfig)
-        let a = columnsData
-        let b = []
-        b = customConfig[ky].index
-        const sortedA = b.map((key) => a.find((item) => item.value === key));
-        return sortedA
+    getUserSetting (tableName) {
+      let a = []
+      let b = new Map()
+      let tableColData = utils.TBLayout(tableName)
+      let config = tableConfigs.value[`${app.value.systemappid}${tableName}`]
+      if (config && tableColData.length == config.columnsIndex.length) {
+        let tableColData = utils.TBLayout(tableName).map(e=>{
+          return {
+            value:e.dataIndex,
+            label:e.title
+          }
+        })
+        
+        tableColData.forEach(e=>{
+          b.set(e.value,e.label)
+        })
+
+        //设置选中数据
+        this.checkedColumns = config.checkedColumns
+        config.columnsIndex = this.columnsIndex =  config.columnsIndex.length == 0 ? utils.TBLayout(tableName).map(e=>e.dataIndex) : config.columnsIndex
+        // 设置配置项数据
+        config.columnsIndex.forEach(e=>{
+          a.push({
+            value:e,
+            label:b.get(e)
+          })
+        })
+        return a
       } else {
-        return 'none'
+        //设置选中数据
+        this.checkedColumns = this.columnsIndex = utils.TBLayout(tableName).map(e=>e.dataIndex)
+        a = utils.TBLayout(tableName).map(e=>{
+          return {
+            value:e.dataIndex,
+            label:e.title
+          }
+        })
+        // this.userSetting(tableName)
+        return a
       }
+    },
+    /**表格加载配置项 */
+    loadTableConfig(tableName) {
+      let tableColData = utils.TBLayout(tableName)
+      let config = tableConfigs.value[`${app.value.systemappid}${tableName}`]
+      let a = []
+      let b = new Map()
+      try {
+        if (config && tableColData.length == config.columnsIndex.length) {
+          tableColData.forEach(e=>{
+            b.set(e.dataIndex,e)
+          })
+          config.columnsIndex.forEach(e=>{
+            a.push(b.get(e))
+          })
+          a = a.filter(e=>{
+            if(config.checkedColumns.some(item => item === e.dataIndex)) {
+              return e
+            }
+          })
+          return a
+        } else {
+          return tableColData
+        }
+      } catch (error) {
+      }
+      
+      
     },
      /**
      * 处理系统系统配置项
@@ -77,71 +126,10 @@ export const useColumnsStore = defineStore('columnStore', {
         "classname": "sysmanage.develop.users.users",
         "method": "updateClientConfig",
         "content": {
-          "config": config
+          "config": JSON.stringify(config)
         }
       })
     },
-    /**
-     * 获取系统配置
-     */
-    async setConfig ({tableName,app,fn}) {
-      let parsedData = sessionStorage.getItem('customConfig')
-      if (parsedData) {
-        this.tableConfigs = JSON.parse(parsedData)
-        if (this.tableConfigs[`${app.systemappid}${tableName}`]) {
-          this.columnsIndex =  this.tableConfigs[`${app.systemappid}${tableName}`].index
-          let a = utils.TBLayout(tableName)
-          let b = this.tableConfigs[`${app.systemappid}${tableName}`].selected
-          b = this.columnsIndex.filter(e=>b.includes(e))
-          this.selectedColumns = b.map((key) => a.find((obj) => obj.dataIndex === key));
-        } else {
-          console.log('未查询到设置项')
-          this.columnsIndex = utils.TBLayout(tableName).map(e=>e.dataIndex)
-          fn()
-        }
-      } else {
-        console.log('未查询到设置项')
-        this.columnsIndex = utils.TBLayout(tableName).map(e=>e.dataIndex)
-        fn()
-      }
-      
-    },
-    /**
-     * 设置配置的列数据
-     */
-
-    setColnums (param) {
-      let a = utils.TBLayout(param.tableName)
-      let b = param.checkedColumns ? param.checkedColumns : a.map(e=>e.dataIndex)
-      b = this.columnsIndex.filter(e=>b.includes(e))
-      this.selectedColumns = b.map((key) => a.find((obj) => obj.dataIndex === key));
-    },
-
-    /**
-     * 由于每次缓存都会刷新列配置所以需要手动缓存列搜索信息
-     */
-    cacheInputParam ({tableName,app,cache}) {
-      this.cacheData[`${app.systemappid}${tableName}`] = cache
-    },
-
-    /**
-     * 获取缓存数据
-     */
-    getCacheInputParam ({tableName,app,columns}) {
-      if (this.cacheData[`${app.systemappid}${tableName}`]) {
-        this.cacheData[`${app.systemappid}${tableName}`].forEach(e => {
-          columns.forEach(c => {
-            if (c.dataIndex == e.dataIndex) {
-              c.value = e.value
-            }
-          })
-        })
-        console.log(this.cacheData[`${app.systemappid}${tableName}`])
-        return columns
-      } else {
-        return columns
-      }
-    }
   }
     
 })

+ 60 - 22
src/utils/utils.js

@@ -1,4 +1,5 @@
 import { message } from 'ant-design-vue';
+
 import { create, all } from 'mathjs'
 import { useAuthStore } from "@/stores/modules/auth";
 
@@ -8,6 +9,8 @@ const config = {
 }
 const math = create(all, config)
 let time = null
+const hide = null
+
 export default {
 
   // 检查权限是否存在
@@ -16,31 +19,34 @@ export default {
     const store = useAuthStore()
     let appData = store.app
     let auth = appData.meta.auth
-
-    hasPermission = auth.some(item=>item.option == permission)
-
-    return hasPermission
+    if (appData.meta.auth) {
+      hasPermission = auth.some(item=>item.option == permission)
+      return hasPermission
+    }
+    
   },
   // 获取应用表格
-  TBLayout (appname) {
-
+  TBLayout (tablename,i) {
     try {
       // 获取应用数据
       const store = useAuthStore()
-      console.log(store)
       let apps = store.app
       // 获取当前应用表格数据
-      let tablecols = apps.meta.tables[appname].tablecols.map(e=>{
-        return {
-          title:e.title,
-          filter:e.filter,
-          dataIndex:e.columnname,
-          width:e.width == 0?'150':e.width,
-          ellipsis:true,
-          fixed:e.columnname == 'operation'?'right':''
-        }
-      })
-      return tablecols
+      if (apps.meta.tables[tablename]) {
+        let tablecols = apps.meta.tables[tablename].tablecols.map(e=>{
+          return {
+            title:e.title,
+            filter:e.filter,
+            sortable:e.sortable,
+            dataIndex:e.columnname,
+            sort:0,
+            width:e.width == 0?'150':e.width,
+            ellipsis:true
+          }
+        })
+        return tablecols
+      }
+      
     } catch (error) {
       console.log(error,'tool')
     }
@@ -69,8 +75,9 @@ export default {
   },
 
   // 数据消息提醒
-  
   message (res,msg,fn) {
+    
+    if (!res) return false
     if (res.code === 1) {
       msg ? message.success({content:msg,key:1}) : ''
       if(time !== null){
@@ -80,6 +87,7 @@ export default {
         fn ? fn() : ''
       },500)
     } else {
+      console.log(res)
       message.error({content:res.data + ':' + res.msg,key:1})
     }
   },
@@ -88,7 +96,7 @@ export default {
   formatAmount(amount, decimalDigits = 0) {
     const { hiddenSensitiveFields } = useAuthStore()
     if (hiddenSensitiveFields) return '****'
-    let amt = math.format(amount, {notation: 'fixed',precision: 2})
+    let amt = math.format(Number(amount), {notation: 'fixed',precision: 2})
     const amountStr = String(amt)
     const reg = /\B(?=(?:\d{3})+$)/g
     // 是否是小数
@@ -118,14 +126,13 @@ export default {
   // 设置状态颜色
   statusAndColor(status) {
     let statusArr = [
-      {st:'新建',cl:"#1890ff"},
+      {st:'新建',cl:"#1677ff"},
       {st:'提交',cl:'#646cff'},
       {st:'审核',cl:'#ff5656'},
       {st:'关闭',cl:'#acbdc5'},
       {st:'预提交',cl:'#005792'},
       {st:'确认',cl:'#01352c'},
       {st:'复核',cl:'#ff9234'},
-
       {st:'启用',cl:"#1890ff"},
       {st:'停用',cl:'#acbdc5'},
     ]
@@ -136,4 +143,35 @@ export default {
     }
     
   },
+
+  // 接口防抖
+  anti_shake (config, axios) {
+    const now_date = new Date().getTime();
+    
+    const request_info = JSON.parse(sessionStorage.getItem("request_url"));
+    
+    sessionStorage.setItem(
+      "request_url",
+      JSON.stringify({ url: config.type, time: new Date().getTime() })
+    );
+    
+    if (request_info === null) return true;
+    
+    if (now_date - request_info.time < 500 && config.type == 'post') {
+    
+      let cancel;
+      config.cancelToken = new axios.CancelToken((c) => {
+        cancel = c;
+      });
+      cancel(`${config.url}请求被中断`);
+      
+      return false;
+    }
+    return true;
+  },
+  messageLoading: {
+    hide:()=>{
+      message.loading({content:'操作正在执行,请稍等..',duration:0,key:1});
+    }
+  }
 }

+ 274 - 273
src/views/login/login.vue

@@ -1,296 +1,297 @@
 <template>
   <div class="conatiner">
-      <!-- <p class="introduce">楚楚E-订单系统&nbsp;<small>是一个便捷、高效的供应链管理软件。我们的系统为您提供基于云端的物流和供应链、库存管理、产品管理等功能,让订货变得无比简单。通过本系统,您可以随时下单或查看订单状态,轻松跟踪进度并且及时调整采购计划。</small></p> -->
-      <div class="login-form">
-        <!-- <p class="color-info">欢迎登录</p> -->
-        <div style="text-align: center;">
-          <div style="display: inline-block;">
-            <p class="title">
-              <img height="30" src="@/assets/LOGO.svg" alt="">
-            </p>
-          </div>
+    <!-- <p class="introduce">楚楚E-订单系统&nbsp;<small>是一个便捷、高效的供应链管理软件。我们的系统为您提供基于云端的物流和供应链、库存管理、产品管理等功能,让订货变得无比简单。通过本系统,您可以随时下单或查看订单状态,轻松跟踪进度并且及时调整采购计划。</small></p> -->
+    <div class="login-form">
+      <!-- <p class="color-info">欢迎登录</p> -->
+      <div style="text-align: center;">
+        <div style="display: inline-block;">
+          <p class="title">
+            <img height="30" src="@/assets/LOGO.svg" alt="">
+          </p>
         </div>
-        <a-form
-          :model="formState"
-          name="basic"
-          layout="vertical"
-          autocomplete="off"
-          @finish="onFinish"
-          @finishFailed="onFinishFailed"
-        >
-          <!--账号登录-->
-          <div :style="{display: loginWrp == 'account' ? 'block' : 'none'}">
-            <a-form-item
-              name="phonenumber"
-              :rules="[{ required: true, message: '请输入账号' }]"
-              style="margin-bottom: 32px;"
-            >
-              <a-input v-model:value="formState.phonenumber" size="large" placeholder="请输入账号">
-                <template #prefix>
-                  <i class="iconfont" style="margin-right: 4px;">&#xe6a5;</i>
-                </template>
-              </a-input>
-            </a-form-item>
-  
-            <a-form-item
-              name="password"
-              :rules="[{ required: true, message: '请输入密码!' }]"
-            >
-              <a-input-password v-model:value="formState.password" size="large" placeholder="请输入密码">
+      </div>
+      <a-form
+        :model="formState"
+        name="basic"
+        layout="vertical"
+        autocomplete="off"
+        @finish="onFinish"
+        @finishFailed="onFinishFailed"
+      >
+        <!--账号登录-->
+        <div :style="{display: loginWrp == 'account' ? 'block' : 'none'}">
+          <a-form-item
+            name="phonenumber"
+            :rules="[{ required: true, message: '请输入账号' }]"
+            style="margin-bottom: 32px;"
+          >
+            <a-input v-model:value="formState.phonenumber" size="large" placeholder="请输入账号">
               <template #prefix>
-                <i class="iconfont" style="margin-right: 4px;">&#xe6a4;</i>
+                <i class="iconfont" style="margin-right: 4px;">&#xe6a5;</i>
               </template>
-            </a-input-password>
-            </a-form-item>
-  
-            <a-form-item name="remember">
-              <div style="display: flex;justify-content: space-between;align-items: center;">
-                <a-checkbox v-model:checked="formState.remember"><span style="color:#ffffff">记住密码</span></a-checkbox>
-                <a-button type="link" style="color: #ffffff !important;">忘记密码?</a-button>
-              </div>
-            </a-form-item>
-  
-            <a-form-item>
-              <a-button :loading="loading" type="primary" style="background: #143B88 !important;border: none;" html-type="submit" size="large" block>登录</a-button>
-            </a-form-item>
-          </div>
-          <!--手机号登录-->
-          <div :style="{display: loginWrp == 'phone' ? 'block' : 'none'}">
-            <a-form-item
-              name="phonenumber"
-              :rules="[{ required: true, message: '请输入手机号' }]"
-              style="margin-bottom: 32px;"
-            >
-              <a-input v-model:value="formState.phonenumber" size="large" placeholder="请输入手机号">
+            </a-input>
+          </a-form-item>
+
+          <a-form-item
+            name="password"
+            :rules="[{ required: true, message: '请输入密码!' }]"
+          >
+            <a-input-password v-model:value="formState.password" size="large" placeholder="请输入密码">
+            <template #prefix>
+              <i class="iconfont" style="margin-right: 4px;">&#xe6a4;</i>
+            </template>
+          </a-input-password>
+          </a-form-item>
+
+          <a-form-item name="remember">
+            <div style="display: flex;justify-content: space-between;align-items: center;">
+              <a-checkbox v-model:checked="formState.remember"><span style="color:#ffffff">记住密码</span></a-checkbox>
+              <a-button type="link" style="color: #ffffff !important;">忘记密码?</a-button>
+            </div>
+          </a-form-item>
+
+          <a-form-item>
+            <a-button :loading="loading" type="primary" style="background: #143B88 !important;border: none;" html-type="submit" size="large" block>登录</a-button>
+          </a-form-item>
+        </div>
+        <!--手机号登录-->
+        <div :style="{display: loginWrp == 'phone' ? 'block' : 'none'}">
+          <a-form-item
+            name="phonenumber"
+            :rules="[{ required: true, message: '请输入手机号' }]"
+            style="margin-bottom: 32px;"
+          >
+            <a-input v-model:value="formState.phonenumber" size="large" placeholder="请输入手机号">
+              <template #prefix>
+                <i class="iconfont" style="margin-right: 4px;">&#xe6a0;</i>
+              </template>
+            </a-input>
+          </a-form-item>
+
+          <a-form-item
+            name="password"
+            :rules="[{ required: true, message: '请输入验证码!' }]"
+          >
+            <div style="display:flex">
+              <a-input v-model:value="formState.password" size="large" placeholder="请输入验证码">
                 <template #prefix>
-                  <i class="iconfont" style="margin-right: 4px;">&#xe6a0;</i>
+                  <i class="iconfont" style="margin-right: 4px;">&#xe6a1;</i>
                 </template>
               </a-input>
-            </a-form-item>
-  
-            <a-form-item
-              name="password"
-              :rules="[{ required: true, message: '请输入验证码!' }]"
-            >
-              <div style="display:flex">
-                <a-input v-model:value="formState.password" size="large" placeholder="请输入验证码">
-                  <template #prefix>
-                    <i class="iconfont" style="margin-right: 4px;">&#xe6a1;</i>
-                  </template>
-                </a-input>
-                <a-button type="primary" style="background: #143B88 !important;border: none;width: 120px;margin-left: 10px;" size="large" block>获取验证码</a-button>
-              </div>
-              
-            </a-form-item>
-  
-            <a-form-item>
-              <a-button :loading="loading" type="primary" style="background: #143B88 !important;border: none;" html-type="submit" size="large" block>登录</a-button>
-            </a-form-item>
-          </div>
-        </a-form>
-        <a-divider style="color: #ffffff;border-color: #ffffff;">其他登录方式</a-divider>
-        <div class="login-item">
-          <img src="@/assets/loginIcon.png" alt="" style="margin-right: 32px;cursor: pointer;" v-if="loginWrp == 'phone'" @click="loginWrp = 'account'">
-          <img src="@/assets/phone.png" alt="" style="margin-right: 32px;cursor: pointer;" v-else  @click="loginWrp = 'phone'">
-          <img src="@/assets/wechat.png" alt="" style="cursor: pointer;">
+              <a-button type="primary" style="background: #143B88 !important;border: none;width: 120px;margin-left: 10px;" size="large" block>获取验证码</a-button>
+            </div>
+            
+          </a-form-item>
+
+          <a-form-item>
+            <a-button :loading="loading" type="primary" style="background: #143B88 !important;border: none;" html-type="submit" size="large" block>登录</a-button>
+          </a-form-item>
         </div>
-        <!-- <a-divider><span style="color:#999;font-weight:300">其他登录方式</span></a-divider>
-        <span>敬请期待</span> -->
+      </a-form>
+      <a-divider style="color: #ffffff;border-color: #ffffff;">其他登录方式</a-divider>
+      <div class="login-item">
+        <img src="@/assets/loginIcon.png" alt="" style="margin-right: 32px;cursor: pointer;" v-if="loginWrp == 'phone'" @click="loginWrp = 'account'">
+        <img src="@/assets/phone.png" alt="" style="margin-right: 32px;cursor: pointer;" v-else  @click="loginWrp = 'phone'">
+        <img src="@/assets/wechat.png" alt="" style="cursor: pointer;">
       </div>
-      <div class="login-wrap">
-        <div class="top">
-          <!-- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 320"><path fill="#1890ff" fill-opacity="1" d="M0,288L48,266.7C96,245,192,203,288,202.7C384,203,480,245,576,245.3C672,245,768,203,864,202.7C960,203,1056,245,1152,272C1248,299,1344,309,1392,314.7L1440,320L1440,0L1392,0C1344,0,1248,0,1152,0C1056,0,960,0,864,0C768,0,672,0,576,0C480,0,384,0,288,0C192,0,96,0,48,0L0,0Z"></path></svg> -->
-        </div>
+      <!-- <a-divider><span style="color:#999;font-weight:300">其他登录方式</span></a-divider>
+      <span>敬请期待</span> -->
+    </div>
+    <div class="login-wrap">
+      <div class="top">
+        <!-- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 320"><path fill="#1890ff" fill-opacity="1" d="M0,288L48,266.7C96,245,192,203,288,202.7C384,203,480,245,576,245.3C672,245,768,203,864,202.7C960,203,1056,245,1152,272C1248,299,1344,309,1392,314.7L1440,320L1440,0L1392,0C1344,0,1248,0,1152,0C1056,0,960,0,864,0C768,0,672,0,576,0C480,0,384,0,288,0C192,0,96,0,48,0L0,0Z"></path></svg> -->
       </div>
-      <a-layout-footer class="footer" style="background: #143B88 !important;">
-        浙CP备2023011622号-1
-      </a-layout-footer>
     </div>
-  </template>
-  <script>
-  import { defineComponent, reactive,ref } from 'vue'
-  import { useRouter } from "vue-router"
-  import Api  from '@/api/api'
-  import md5 from 'js-md5'
-  import { message } from 'ant-design-vue'
-  import { useAuthStore } from '@/stores/modules/auth'
-  import { useRouteTabsStore } from '@/stores/modules/Htabs'
-  import { storeToRefs } from 'pinia'
-  const rotTabs = useRouteTabsStore()
-  const store = useAuthStore()
-  let { accountList } = storeToRefs(store)
-  let { historyRoutes } = storeToRefs(rotTabs)
-  export default defineComponent({
-    setup() {
-      let loginWrp = ref('account')
-      const router = useRouter()
-      const formState = reactive({
-        phonenumber: 'admin',
-        password: '123456',
-        remember: true,
-      });
-      let loading = ref(false)
-      const onFinish = (values) => {
-        login()
-      };
-  
-      const onFinishFailed = (errorInfo) => {
-        console.log('Failed:', errorInfo);
-      };
-  
-      const login = async ()=>{
-        loading.value = true
-        const res = await Api.loginbyaccount({
-          "accountno":formState.phonenumber,
-          "password":md5(formState.password),
-          "systemclient": "cweb"
-        })
-        if (res.code === 1) {
-          if (res.account_list[0].status == 'INACTIVE')
-            return message.error('当前账号已停用!')
-          loading.value = false
-          accountList.value = res.account_list
-          store.defaultAccount(res.account_list[0])
+    <a-layout-footer class="footer" style="background: #143B88 !important;">
+      浙CP备2023011622号-1
+    </a-layout-footer>
+  </div>
+</template>
+<script>
+import { defineComponent, reactive,ref } from 'vue'
+import { useRouter } from "vue-router"
+import Api  from '@/api/api'
+import md5 from 'js-md5'
+import { message } from 'ant-design-vue'
+import { useAuthStore } from '@/stores/modules/auth'
+import { useRouteTabsStore } from '@/stores/modules/Htabs'
+import { storeToRefs } from 'pinia'
+const rotTabs = useRouteTabsStore()
+const store = useAuthStore()
+let { accountList } = storeToRefs(store)
+let { historyRoutes } = storeToRefs(rotTabs)
+export default defineComponent({
+  setup() {
+    let loginWrp = ref('account')
+    const router = useRouter()
+    const formState = reactive({
+      phonenumber: 'admin',
+      password: '123456',
+      remember: true,
+    });
+    let loading = ref(false)
+    const onFinish = (values) => {
+      login()
+    };
+
+    const onFinishFailed = (errorInfo) => {
+      console.log('Failed:', errorInfo);
+    };
+
+    const login = async ()=>{
+      loading.value = true
+      const res = await Api.loginbyaccount({
+        "accountno":formState.phonenumber,
+        "password":md5(formState.password),
+        "systemclient": "cweb"
+      })
+      if (res.code === 1) {
+        if (res.account_list[0].status == 'INACTIVE')
+          return message.error('当前账号已停用!')
+        loading.value = false
+        accountList.value = res.account_list
+        store.defaultAccount(res.account_list[0],()=>{
           router.replace({path:'/home'})
-  
-        } else {
-          loading.value = false
-          message.error(res.msg)
-        }
+        })
+
+      } else {
+        loading.value = false
+        message.error(res.msg)
       }
-      return {
-        formState,
-        onFinish,
-        onFinishFailed,
-        loading,
-        loginWrp
-      };
-    },
-    mounted () {
-      sessionStorage.clear()
-      localStorage.clear();
-      historyRoutes.value = []
     }
-  });
-  </script>
-  
-  <style scoped>
-  
-  
-  .conatiner{
-    background: url('@/assets/wallhaven-0pq8gm.jpeg');
-    background-size: cover;
-  }
-  .title{
-    height: 33px;
-    margin: 0 0 48px;
-    color: #ffffff;
-    font-size: 2rem;
-    font-weight: 500;
-    animation: showup 3s forwards ;
-    display: flex;
-    align-items: center;
+    return {
+      formState,
+      onFinish,
+      onFinishFailed,
+      loading,
+      loginWrp
+    };
+  },
+  mounted () {
+    sessionStorage.clear()
+    localStorage.clear();
+    historyRoutes.value = []
   }
-  .login-wrap{
-    overflow: hidden;
+});
+</script>
+
+<style scoped>
+
+
+.conatiner{
+  background: url('@/assets/wallhaven-0pq8gm.jpeg');
+  background-size: cover;
+}
+.title{
+  height: 33px;
+  margin: 0 0 48px;
+  color: #ffffff;
+  font-size: 2rem;
+  font-weight: 500;
+  animation: showup 3s forwards ;
+  display: flex;
+  align-items: center;
+}
+.login-wrap{
+  overflow: hidden;
+}
+.login-wrap .top{
+  width:100%;
+  /* background:#f3f4f591 */
+}
+.login-wrap .top{
+  height:calc(100vh - 70px);
+  width:100%;
+}
+.login-wrap svg{
+  height: 70%;
+}
+.login-form{
+  position: absolute;
+  right: 50%;
+  top:50vh;
+  width: 500px;
+  margin-right: -250px;
+  margin-top: -244px;
+  padding: 50px 80px;
+  background-color: rgba(255,255,255,.2);
+  border-radius: 5px;
+  box-shadow: 0 0 12px rgb(0 0 0 / 10%);
+  z-index: 9999;
+}
+
+.login-item {
+  text-align: center;
+}
+
+.input-wrap{
+  width: 100%;
+}
+.color-info{
+  color:#999;
+  font-weight:300
+}
+.introduce{
+  position: absolute;
+  left: 10%;
+  top:10vh;
+  font-size: 20px;
+  color:#fff;
+  text-indent: 3rem;
+  line-height: 3rem;
+  text-shadow: 0 0px 5px #666;
+}
+.introduce {
+  white-space: pre-wrap; /* 允许换行 */
+  overflow: hidden; /* 隐藏超出部分 */
+  max-width: 700px; /* 固定宽度为 200 像素 */
+  animation: typingH 5s forwards;
+
+  display: inline-block; /* 让行内元素可以自适应宽度、允许换行 */
+}
+
+/deep/.ant-input {
+  color: #ffffff;
+  background: none !important;
+}
+
+/deep/.ant-input-affix-wrapper {
+  background: rgba(43, 141, 195, 1) !important;
+  border: none;
+}
+
+/deep/.ant-input-affix-wrapper input {
+  background: none;
+}
+
+/deep/.anticon {
+  color: #ffffff;
+}
+
+/* 伪元素来实现光标 */
+.introduce::after {
+  content: "";
+  display: inline-block;
+  width: 5px;
+  height: 1.2em;
+  margin-left: 5px; /* 调整光标与文本的距离 */
+}
+@keyframes typingH {
+  0% {
+    height: 0px;
   }
-  .login-wrap .top{
-    width:100%;
-    /* background:#f3f4f591 */
-  }
-  .login-wrap .top{
-    height:calc(100vh - 70px);
-    width:100%;
-  }
-  .login-wrap svg{
-    height: 70%;
+  100% {
+    height: 300px;
   }
+}
+
+@media(max-width: 1600px) {
   .login-form{
-    position: absolute;
-    right: 50%;
-    top:50vh;
-    width: 500px;
-    margin-right: -250px;
-    margin-top: -244px;
-    padding: 50px 80px;
-    background-color: rgba(255,255,255,.2);
-    border-radius: 5px;
-    box-shadow: 0 0 12px rgb(0 0 0 / 10%);
-    z-index: 9999;
-  }
-  
-  .login-item {
-    text-align: center;
-  }
-  
-  .input-wrap{
-    width: 100%;
-  }
-  .color-info{
-    color:#999;
-    font-weight:300
+    transform: scale(.8);
   }
   .introduce{
-    position: absolute;
-    left: 10%;
-    top:10vh;
-    font-size: 20px;
-    color:#fff;
-    text-indent: 3rem;
-    line-height: 3rem;
-    text-shadow: 0 0px 5px #666;
-  }
-  .introduce {
-    white-space: pre-wrap; /* 允许换行 */
-    overflow: hidden; /* 隐藏超出部分 */
-    max-width: 700px; /* 固定宽度为 200 像素 */
-    animation: typingH 5s forwards;
-  
-    display: inline-block; /* 让行内元素可以自适应宽度、允许换行 */
-  }
-  
-  /deep/.ant-input {
-    color: #ffffff;
-    background: none !important;
-  }
-  
-  /deep/.ant-input-affix-wrapper {
-    background: rgba(43, 141, 195, 1) !important;
-    border: none;
-  }
-  
-  /deep/.ant-input-affix-wrapper input {
-    background: none;
-  }
-  
-  /deep/.anticon {
-    color: #ffffff;
-  }
-  
-  /* 伪元素来实现光标 */
-  .introduce::after {
-    content: "";
-    display: inline-block;
-    width: 5px;
-    height: 1.2em;
-    margin-left: 5px; /* 调整光标与文本的距离 */
-  }
-  @keyframes typingH {
-    0% {
-      height: 0px;
-    }
-    100% {
-      height: 300px;
-    }
-  }
-  
-  @media(max-width: 1600px) {
-    .login-form{
-      transform: scale(.8);
-    }
-    .introduce{
-      font-size: 15px;
-    }
+    font-size: 15px;
   }
-  </style>
+}
+</style>
   

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません