فهرست منبع

修改服务器指令
修改服务器管理
修改分页设置

DESKTOP-NE65RNK\Citrus_limon 1 سال پیش
والد
کامیت
f225bacb38

+ 1 - 1
.env.development

@@ -1,2 +1,2 @@
 # VITE_API_BASE_URL = "http://cc.skyfffire.com/api"
-VITE_API_BASE_URL = "http://192.168.1.5:81"
+VITE_API_BASE_URL = "http://192.168.1.2:81"

+ 23 - 0
package-lock.json

@@ -12,6 +12,7 @@
         "axios": "^1.6.4",
         "codemirror": "^5.65.16",
         "codemirror-editor-vue3": "^2.4.1",
+        "echarts": "^5.5.0",
         "js-md5": "^0.8.3",
         "pinia": "^2.1.7",
         "vue": "^3.3.11",
@@ -1616,6 +1617,15 @@
       "resolved": "https://registry.npmmirror.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
       "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="
     },
+    "node_modules/echarts": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.5.0.tgz",
+      "integrity": "sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==",
+      "dependencies": {
+        "tslib": "2.3.0",
+        "zrender": "5.5.0"
+      }
+    },
     "node_modules/electron-to-chromium": {
       "version": "1.4.620",
       "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.620.tgz",
@@ -2645,6 +2655,11 @@
         "node": ">=8.0"
       }
     },
+    "node_modules/tslib": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+    },
     "node_modules/typescript": {
       "version": "5.3.3",
       "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.3.3.tgz",
@@ -2968,6 +2983,14 @@
       "engines": {
         "node": ">=6"
       }
+    },
+    "node_modules/zrender": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.5.0.tgz",
+      "integrity": "sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==",
+      "dependencies": {
+        "tslib": "2.3.0"
+      }
     }
   }
 }

+ 1 - 0
package.json

@@ -17,6 +17,7 @@
     "axios": "^1.6.4",
     "codemirror": "^5.65.16",
     "codemirror-editor-vue3": "^2.4.1",
+    "echarts": "^5.5.0",
     "js-md5": "^0.8.3",
     "pinia": "^2.1.7",
     "vue": "^3.3.11",

+ 14 - 0
src/api/index.ts

@@ -38,6 +38,14 @@ export const get_user_log_list = (params: any, callback: any) => {
   });
 };
 
+// 账户信息
+// 账户信息-账户余额
+export const get_remaining = (params: any, callback: any) => {
+  return http.request("/remaining/list", "get", params).then((data) => {
+    if (data) callback && callback(data);
+  });
+};
+
 // 机器人管理
 // 机器人管理-机器人列表
 export const get_robot_list = (params: any, callback: any) => {
@@ -367,6 +375,12 @@ export const get_instruct_log_list = (params: any, callback: any) => {
     if (data) callback && callback(data);
   });
 };
+// 指令记录-指令执行结果
+export const get_instruct_log_result = (params: any, callback: any) => {
+  return http.request("/instruct-log/getResult", "get", params).then((data) => {
+    if (data) callback && callback(data);
+  });
+};
 // 指令记录-刪除记录
 export const delete_instruct_log = (params: any, callback: any) => {
   return http.request("/instruct-log/delLog", "post", params).then((data) => {

+ 8 - 9
src/components/PageLayout/Header.vue

@@ -34,15 +34,14 @@ defineProps({
 });
 
 const handeLoginOut = () => {
-  client_logout({}, () => {
-    window.sessionStorage.removeItem("_4L_TOKEN");
-    window.sessionStorage.removeItem("_4L_MENU_PATH");
-    window.sessionStorage.removeItem("_4L_S_MENU_PATH");
-    window.sessionStorage.removeItem("_4L_TAG_LIST");
-    window.sessionStorage.removeItem("_4L_API_LIST");
-    window.sessionStorage.removeItem("_4L_MENU_COLLAPSE");
-    router.push({ path: "/login" });
-  });
+  client_logout({}, () => {});
+  window.sessionStorage.removeItem("_4L_TOKEN");
+  window.sessionStorage.removeItem("_4L_MENU_PATH");
+  window.sessionStorage.removeItem("_4L_S_MENU_PATH");
+  window.sessionStorage.removeItem("_4L_TAG_LIST");
+  window.sessionStorage.removeItem("_4L_API_LIST");
+  window.sessionStorage.removeItem("_4L_MENU_COLLAPSE");
+  router.push({ path: "/login" });
 };
 </script>
 <style lang="scss" scoped>

+ 9 - 1
src/utils/enum.ts

@@ -3,5 +3,13 @@ interface Enum {
 }
 
 export const OS_TYPE: Enum = {
-  "0": "Ubantu",
+  "0": "Ubuntu",
+};
+
+export const QUANT_PARAMS_TYPE: Enum = {
+  "0": "字符串(String)",
+  "1": "数字(Number)",
+  "2": "布尔(Boolean)",
+  "3": "下拉框(Option)",
+  "5": "账户(ApiKey)",
 };

+ 1 - 1
src/utils/request.ts

@@ -68,7 +68,7 @@ class HttpRequest {
         auth: "4L",
         Token: token,
       },
-      timeout: 50000,
+      timeout: 180000,
       baseURL: BASEURL,
       responseType: responseType,
     });

+ 111 - 4
src/views/bot/manage/detail.vue

@@ -19,6 +19,16 @@
         </lay-tag>
       </lay-space>
     </div>
+    <div>
+      <lay-card class="custom-card">
+        <template v-slot:title>
+          <span class="card-title">盈利图</span>
+        </template>
+        <template v-slot:body>
+          <div class="profit-chart" id="profit-chart" ref="balanceChartRef"></div>
+        </template>
+      </lay-card>
+    </div>
     <div>
       <lay-card class="custom-card">
         <template v-slot:title>
@@ -26,16 +36,17 @@
         </template>
 
         <template v-slot:body>
-          <lay-table :columns="columns" size="sm" resize :data-source="logsList" :loading="pageConfig.loading" />
+          <lay-table :columns="columns" size="sm" resize :data-source="logsList" />
         </template>
       </lay-card>
     </div>
   </div>
 </template>
-<script lang="ts" setup name="BotManageBot">
-import { ref, reactive } from "vue";
+<script lang="ts" setup name="BotManageDetail">
+import { ref, reactive, onUnmounted, shallowRef } from "vue";
 import { useRoute } from "vue-router";
-import { get_robot_detail, get_robot_logs } from "@/api";
+import * as echarts from "echarts";
+import { get_robot_detail, get_robot_logs, get_remaining } from "@/api";
 
 const ROBOT_STATUS: any = reactive({
   STOPPED: "已停止",
@@ -47,6 +58,8 @@ const ROBOT_STATUS: any = reactive({
   ERROR: "错误",
 });
 
+const balanceChartRef = ref();
+
 const route = useRoute();
 
 interface PageConfig {
@@ -67,6 +80,9 @@ const columns = ref([
 ]);
 let logsList = ref<Array<Logs>>();
 let robotDetail = ref<any>({});
+let balanceList = ref([]);
+let timer = ref();
+let balanceChart = shallowRef();
 
 const getRobotDetail = () => {
   pageConfig.loading = true;
@@ -76,10 +92,42 @@ const getRobotDetail = () => {
     pageConfig.loading = false;
     if (data.code == 200) {
       robotDetail.value = data.data;
+      getBalanceInfo(data.data.accId);
     }
   });
 };
 getRobotDetail();
+
+// 获取账户余额
+const getBalanceInfo = (id: number) => {
+  const params = { id: id };
+  pageConfig.loading = true;
+  get_remaining(params, (data: any) => {
+    pageConfig.loading = false;
+    if (data.code == 200) {
+      balanceList.value = data.data;
+      !balanceChart.value
+        ? initChart(data.data)
+        : balanceChart.value.setOption({
+            xAxis: {
+              type: "category",
+              boundaryGap: false,
+              data: data.map((item: any) => item.creationTime),
+            },
+            series: {
+              name: "Balance",
+              type: "line",
+              areaStyle: {},
+              lineStyle: {
+                width: 1,
+              },
+              data: data.map((item: any) => item.balance),
+            },
+          });
+    }
+  });
+};
+
 // 请求机器人日志
 const getLogsInfo = () => {
   pageConfig.loading = true;
@@ -101,6 +149,62 @@ const handlePageInfo = (data: any) => {
   });
   return result;
 };
+
+const initChart = (data: any) => {
+  balanceChart.value = echarts.init(balanceChartRef.value);
+
+  window.removeEventListener("resize", () => {
+    balanceChart.value.resize();
+  });
+  window.addEventListener("resize", () => {
+    balanceChart.value.resize();
+  });
+
+  const balanceChartOption = {
+    tooltip: {
+      trigger: "axis",
+      axisPointer: {
+        type: "cross",
+      },
+    },
+    dataZoom: [
+      {
+        start: 50,
+        end: 100,
+      },
+      {
+        type: "inside",
+        start: 50,
+        end: 100,
+      },
+    ],
+    xAxis: {
+      type: "category",
+      boundaryGap: false,
+      data: data.map((item: any) => item.creationTime),
+    },
+    yAxis: {
+      type: "value",
+      boundaryGap: [0, "100%"],
+    },
+    series: {
+      name: "Balance",
+      type: "line",
+      areaStyle: {},
+      data: data.map((item: any) => item.balance),
+    },
+  };
+  balanceChart.value.setOption(balanceChartOption);
+};
+timer.value = setInterval(() => {
+  // getBalanceInfo(robotDetail.value.accId);
+  getLogsInfo();
+}, 5000);
+
+onUnmounted(() => {
+  window.removeEventListener("resize", balanceChart.value.resize());
+  clearInterval(timer.value);
+});
 </script>
 
 <style lang="scss" scoped>
@@ -109,6 +213,9 @@ const handlePageInfo = (data: any) => {
   padding: 20px 40px;
   background-color: rgb(244, 246, 247);
 }
+.profit-chart {
+  height: 300px;
+}
 .robot-info-header {
   background-color: white;
   padding: 16px 24px;

+ 2 - 1
src/views/bot/manage/index.vue

@@ -185,7 +185,7 @@ let refreshInterval = setInterval(() => {
       handleShowInfo(data.data);
     }
   });
-}, 100000);
+}, 2000);
 
 const jumpDetail = (info: any) => {
   window.open(`/bot/manage/detail/${info.id}`);
@@ -248,6 +248,7 @@ const handleDelete = async (value: any) => {
 // 分页设置
 const handleCurrentChange = (val: any) => {
   pageParams.pageNum = val.current;
+  pageParams.pageSize = val.limit;
   getPageInfo();
 };
 

+ 1 - 0
src/views/exchange/apikey/index.vue

@@ -129,6 +129,7 @@ const handleDelete = async (value: any) => {
 // 分页设置
 const handleCurrentChange = (val: any) => {
   pageParams.pageNum = val.current;
+  pageParams.pageSize = val.limit;
   getPageInfo();
 };
 </script>

+ 1 - 0
src/views/exchange/manage/index.vue

@@ -140,6 +140,7 @@ const handleStatus = async (value: any) => {
 // 分页设置
 const handleCurrentChange = (val: any) => {
   pageParams.pageNum = val.current;
+  pageParams.pageSize = val.limit;
   getPageInfo();
 };
 </script>

+ 2 - 8
src/views/quant/manage/components/UpdateParams.vue

@@ -10,7 +10,7 @@
         </lay-form-item>
         <lay-form-item label="类型" prop="valType">
           <lay-select v-model="modelParams.valType">
-            <lay-select-option v-for="item in paramsTypeList" :value="item.key" :label="item.value" />
+            <lay-select-option v-for="(value, key) of QUANT_PARAMS_TYPE" :value="key" :label="value" />
           </lay-select>
         </lay-form-item>
         <lay-form-item v-if="modelParams.valType == 3" prop="contentVal" label="可选值">
@@ -27,16 +27,10 @@
 
 <script lang="ts" setup>
 import { ref, reactive } from "vue";
+import { QUANT_PARAMS_TYPE } from "@/utils/enum";
 
 const modelFormRef = ref();
 
-const paramsTypeList = [
-  { key: 0, value: "String" },
-  { key: 1, value: "Number" },
-  { key: 2, value: "Boolean" },
-  { key: 3, value: "List" },
-  { key: 5, value: "ApiKey" },
-];
 interface ModelConfig {
   title: string;
   visible: boolean;

+ 8 - 2
src/views/quant/manage/components/UpdateVersion.vue

@@ -21,6 +21,9 @@
         </div>
         <div class="table-wp">
           <lay-table :page="tablePage" :columns="columns" resize :data-source="dataSource" :loading="modelConfig.loading" @change="handleCurrentChange">
+            <template v-slot:valType="{ row }">
+              {{ QUANT_PARAMS_TYPE[row.valType] }}
+            </template>
             <template v-slot:status="{ row }">
               {{ row.status ? "启用" : "禁用" }}
             </template>
@@ -43,6 +46,7 @@ import { ref, reactive, getCurrentInstance } from "vue";
 import TableButton from "@/components/TableButton.vue";
 import DragUpload from "@/components/DragUpload.vue";
 import UpdateParams from "./UpdateParams.vue";
+import { QUANT_PARAMS_TYPE } from "@/utils/enum";
 import { add_strategy_program, update_strategy_program, get_strategy_program_params_list } from "@/api";
 
 const { proxy }: any = getCurrentInstance();
@@ -86,7 +90,7 @@ const tablePage: TablePage = reactive({ current: 1, limit: 10, total: 0 });
 const columns = ref([
   { title: "名称", key: "name" },
   { title: "字段", key: "code" },
-  { title: "类型", key: "valType" },
+  { title: "类型", key: "valType", customSlot: "valType" },
   { title: "默认值", key: "defaultVal" },
   { title: "可选值", key: "contentVal" },
   {
@@ -120,7 +124,9 @@ const handleUpVersion = async () => {
   get_strategy_program_params_list(params, (data: any) => {
     modelConfig.loading = false;
     if (data.code == 200) {
-      dataSource.value = data.data;
+      dataSource.value = data.data.map((item: any, index: number) => {
+        return { ...item, id: -index };
+      });
     }
   });
 };

+ 1 - 0
src/views/quant/manage/components/Version.vue

@@ -136,6 +136,7 @@ const handleDelete = async (value: any) => {
 // 分页设置
 const handleCurrentChange = (val: any) => {
   pageParams.pageNum = val.current;
+  pageParams.pageSize = val.limit;
   getPageInfo();
 };
 defineExpose({ show });

+ 1 - 0
src/views/quant/manage/index.vue

@@ -123,6 +123,7 @@ const handleDelete = async (value: any) => {
 // 分页设置
 const handleCurrentChange = (val: any) => {
   pageParams.pageNum = val.current;
+  pageParams.pageSize = val.limit;
   getPageInfo();
 };
 </script>

+ 1 - 0
src/views/records/login/index.vue

@@ -67,6 +67,7 @@ getPageInfo();
 // 分页设置
 const handleCurrentChange = (val: any) => {
   pageParams.pageNum = val.current;
+  pageParams.pageSize = val.limit;
   getPageInfo();
 };
 </script>

+ 1 - 0
src/views/records/user/index.vue

@@ -61,6 +61,7 @@ getPageInfo();
 // 分页设置
 const handleCurrentChange = (val: any) => {
   pageParams.pageNum = val.current;
+  pageParams.pageSize = val.limit;
   getPageInfo();
 };
 </script>

+ 1 - 0
src/views/server/command/index.vue

@@ -121,6 +121,7 @@ const handleDelete = async (value: any) => {
 // 分页设置
 const handleCurrentChange = (val: any) => {
   pageParams.pageNum = val.current;
+  pageParams.pageSize = val.limit;
   getPageInfo();
 };
 </script>

+ 16 - 4
src/views/server/manage/components/Result.vue → src/views/server/command_record/components/Result.vue

@@ -1,7 +1,7 @@
 <template>
   <lay-layer :title="modelConfig.title" v-model="modelConfig.visible" area="auto">
     <div class="width-800 custom-layer" style="padding: 20px">
-      <div class="result-name">服务器名称:{{ modelParams.serverName }}</div>
+      <div class="result-name">服务器名称:{{ modelParams.title }}</div>
       <div class="result-content">
         <div class="content-title">执行结果</div>
         <div class="content" v-html="modelParams.result?.replace(/\n/g, '<br />')"></div>
@@ -12,6 +12,7 @@
 
 <script lang="ts" setup>
 import { ref, reactive } from "vue";
+import { get_instruct_log_result } from "@/api";
 
 interface ModelConfig {
   title: string;
@@ -21,8 +22,7 @@ interface ModelConfig {
 }
 interface ModelParams {
   result?: string;
-  serverId?: number;
-  serverName?: string;
+  title?: string;
 }
 
 let modelParams = ref<ModelParams>({});
@@ -31,7 +31,19 @@ let modelConfig: ModelConfig = reactive({ title: "", visible: false, isUpdate: f
 const show = (params?: any) => {
   modelConfig.visible = true;
   modelConfig.title = "执行结果";
-  modelParams.value = { ...params };
+  getInstructResult(params.instructLogId);
+  modelParams.value = { title: params.title };
+};
+
+const getInstructResult = (id: any) => {
+  const params = { id };
+  modelConfig.loading = true;
+  get_instruct_log_result(params, (data: any) => {
+    modelConfig.loading = false;
+    if (data.code == 200) {
+      modelParams.value = { ...modelParams.value, result: data.data };
+    }
+  });
 };
 
 defineExpose({ show });

+ 11 - 2
src/views/server/command_record/index.vue

@@ -25,11 +25,13 @@
           </template>
           <template v-slot:operator="{ row }">
             <lay-space>
+              <TableButton v-if="apiList?.includes('/user/delete')" text="记录" @click="showResult(row)" />
               <TableButton v-if="apiList?.includes('/user/delete')" type="danger" text="删除" @click="handleDelete(row)" />
             </lay-space>
           </template>
         </lay-table>
       </div>
+      <Result ref="resultRef" />
     </template>
   </lay-card>
 </template>
@@ -37,10 +39,12 @@
 <script lang="ts" setup name="ServerCommandRecord">
 import { ref, reactive, getCurrentInstance } from "vue";
 import TableButton from "@/components/TableButton.vue";
+import Result from "./components/Result.vue";
 import { OS_TYPE } from "@/utils/enum";
 import { get_instruct_log_list, delete_instruct_log } from "@/api";
 
 const { proxy }: any = getCurrentInstance();
+const resultRef = ref();
 const apiList = ref(window.sessionStorage.getItem("_4L_API_LIST"));
 
 interface PageConfig {
@@ -65,10 +69,10 @@ interface TablePage {
 }
 const tablePage: TablePage = reactive({ current: 1, limit: 10, total: 0 });
 const columns = ref([
-  { title: "名称", key: "title" },
+  { title: "名称", key: "title", ellipsisTooltip: true },
   { title: "服务器", key: "ipAddrs" },
   { title: "状态", key: "executeReq", customSlot: "executeReq" },
-  { title: "执行CODE", key: "code" },
+  { title: "执行CODE", key: "code", ellipsisTooltip: true },
   { title: "系统类型", key: "osType", customSlot: "osType" },
   { title: "执行时间", key: "creationTime" },
   { title: "执行人", key: "name" },
@@ -95,6 +99,10 @@ const getPageInfo = (isSearch?: boolean) => {
 };
 getPageInfo();
 
+const showResult = (row: any) => {
+  resultRef.value.show(row);
+};
+
 // 删除指令记录
 const handleDelete = async (value: any) => {
   let result = await proxy.$waitingConfirm("是否确认删除该指令记录?");
@@ -113,6 +121,7 @@ const handleDelete = async (value: any) => {
 // 分页设置
 const handleCurrentChange = (val: any) => {
   pageParams.pageNum = val.current;
+  pageParams.pageSize = val.limit;
   getPageInfo();
 };
 </script>

+ 3 - 22
src/views/server/manage/components/Command.vue

@@ -8,31 +8,17 @@
           </lay-select>
         </lay-form-item>
       </lay-form>
-      <div class="result-wp" v-if="resultList.length > 0">
-        <div class="result-title">结果列表</div>
-        <div class="result-content">
-          <div class="result-item" v-for="item in resultList">
-            <span class="name">{{ item.serverName }}</span> <TableButton text="查看" @click="showResult(item)" />
-          </div>
-        </div>
-      </div>
     </div>
-    <Result ref="resultRef" />
   </lay-layer>
 </template>
 
 <script lang="ts" setup>
 import { ref, reactive, getCurrentInstance } from "vue";
-import { layer } from "@layui/layui-vue";
-import TableButton from "@/components/TableButton.vue";
-import Result from "./Result.vue";
 import { run_execut_server, get_instruct_list_all } from "@/api";
 
 const { proxy }: any = getCurrentInstance();
 
 const modelFormRef = ref();
-const resultRef = ref();
-
 interface ModelConfig {
   title: string;
   visible: boolean;
@@ -74,10 +60,6 @@ const get_instruct_list = () => {
   });
 };
 
-const showResult = async (result: any) => {
-  await resultRef.value.show(result);
-};
-
 const operator = reactive([
   {
     text: "执行",
@@ -85,12 +67,11 @@ const operator = reactive([
       modelFormRef.value.validate((isValidate: boolean) => {
         if (isValidate) {
           const params = { serverList: userServerId.value, ...modelParams.value };
-          let loading = layer.load();
+          modelConfig.loading = true;
           run_execut_server(params, (data: any) => {
-            layer.close(loading);
+            modelConfig.loading = false;
             if (data.code == 200) {
-              proxy.$message("执行成功!");
-              resultList.value = data.data;
+              proxy.$message("指令发送成功,执行结果请查看指令记录!");
             }
           });
         }

+ 1 - 0
src/views/server/manage/components/Pem.vue

@@ -132,6 +132,7 @@ const handleDelete = async (value: any) => {
 // 分页设置
 const handleCurrentChange = (val: any) => {
   pageParams.pageNum = val.current;
+  pageParams.pageSize = val.limit;
   getPageInfo();
 };
 

+ 33 - 3
src/views/server/manage/index.vue

@@ -33,7 +33,10 @@
           @change="handleCurrentChange"
         >
           <template v-slot:status="{ row }">
-            {{ row.status ? "启用" : "禁用" }}
+            {{ row.status ? "已配置" : "未配置" }}
+          </template>
+          <template v-slot:lastReportTime="{ row }">
+            <span :class="{ 'danger-color': timeConverts(row.lastReportTime).indexOf('秒') == -1 }">{{ row.lastReportTime ? timeConverts(row.lastReportTime) : "未通讯" }}</span>
           </template>
           <template v-slot:operator="{ row }">
             <lay-space>
@@ -55,12 +58,13 @@
 </template>
 
 <script lang="ts" setup name="ServerManage">
-import { ref, reactive, getCurrentInstance } from "vue";
+import { ref, reactive, getCurrentInstance, onBeforeUnmount } from "vue";
 import Pem from "./components/Pem.vue";
 import Update from "./components/Update.vue";
 import Batch from "./components/Batch.vue";
 import Command from "./components/Command.vue";
 import TableButton from "@/components/TableButton.vue";
+import { timeConverts } from "@/utils/index";
 import { get_server_list, delete_server, test_connect_server } from "@/api";
 
 const { proxy }: any = getCurrentInstance();
@@ -98,8 +102,9 @@ const columns = ref([
   { title: "IP", width: "120px", key: "ipAddrComplex" },
   { title: "端口号", width: "80px", key: "portComplex" },
   { title: "状态", width: "80px", key: "status", customSlot: "status" },
-  { title: "备注", key: "remark", ellipsisTooltip: true },
+  { title: "通讯", width: "160px", key: "lastReportTime", customSlot: "lastReportTime" },
   { title: "更新时间", width: "160px", key: "updateTime" },
+  { title: "备注", key: "remark", ellipsisTooltip: true },
   {
     title: "操作",
     customSlot: "operator",
@@ -124,6 +129,15 @@ const getPageInfo = (isSearch?: boolean) => {
 };
 getPageInfo();
 
+const refreshInterval = setInterval(() => {
+  get_server_list(pageParams, (data: any) => {
+    if (data.code == 200) {
+      dataSource.value = data.data.list;
+      tablePage.total = data.data.total;
+    }
+  });
+}, 2000);
+
 const handlePem = async () => {
   const result = await pemRef.value.show();
   if (result) getPageInfo();
@@ -179,6 +193,22 @@ const handleDelete = async (value: any) => {
 // 分页设置
 const handleCurrentChange = (val: any) => {
   pageParams.pageNum = val.current;
+  pageParams.pageSize = val.limit;
   getPageInfo();
 };
+onBeforeUnmount(() => {
+  clearInterval(refreshInterval);
+});
 </script>
+
+<style lang="scss" scoped>
+.primary-color {
+  color: var(--primary-color);
+}
+.normal-color {
+  color: var(--normal-color);
+}
+.danger-color {
+  color: var(--danger-color);
+}
+</style>

+ 1 - 0
src/views/system/organization/index.vue

@@ -141,6 +141,7 @@ const jumpPermissions = (value: any) => {
 // 分页设置
 const handleCurrentChange = (val: any) => {
   pageParams.pageNum = val.current;
+  pageParams.pageSize = val.limit;
   getPageInfo();
 };
 </script>

+ 1 - 0
src/views/system/user/index.vue

@@ -157,6 +157,7 @@ const handleResetPassword = async (value: any) => {
 // 分页设置
 const handleCurrentChange = (val: any) => {
   pageParams.pageNum = val.current;
+  pageParams.pageSize = val.limit;
   getPageInfo();
 };
 </script>

+ 1 - 0
src/views/system/webpage/components/Operator.vue

@@ -115,6 +115,7 @@ const handleDelete = async (value: any) => {
 // 分页设置
 const handleCurrentChange = (val: any) => {
   pageParams.pageNum = val.current;
+  pageParams.pageSize = val.limit;
   getPageInfo();
 };
 defineExpose({ show });

+ 1 - 0
src/views/system/webpage/index.vue

@@ -114,6 +114,7 @@ const handleDelete = async (value: any) => {
 // 分页设置
 const handleCurrentChange = (val: any) => {
   pageParams.pageNum = val.current;
+  pageParams.pageSize = val.limit;
   getPageInfo();
 };
 </script>