From be050fe89112d99e4fe43296454116ce51f52abb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E2=80=9Cyiyousong=E2=80=9D?= <鈥測ousong_yi@foxmail.com鈥�>
Date: Thu, 20 Feb 2025 09:14:55 +0800
Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=A8=A1=E5=9D=97?=
 =?UTF-8?q?=E7=AE=A1=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../admin/src/pages/basicset/deploy/Index.vue |  50 ++++
 .../src/pages/basicset/deploy/Statement.vue   | 276 ++++++++++++++++++
 .../src/pages/basicset/deploy/deploy.vue      |  31 +-
 .../basicset/deploy/modal/AddStatement.vue    |  51 +++-
 base-manager-ui/admin/src/router/config.js    |  21 +-
 5 files changed, 396 insertions(+), 33 deletions(-)
 create mode 100644 base-manager-ui/admin/src/pages/basicset/deploy/Index.vue
 create mode 100644 base-manager-ui/admin/src/pages/basicset/deploy/Statement.vue

diff --git a/base-manager-ui/admin/src/pages/basicset/deploy/Index.vue b/base-manager-ui/admin/src/pages/basicset/deploy/Index.vue
new file mode 100644
index 00000000..c2cb6bbc
--- /dev/null
+++ b/base-manager-ui/admin/src/pages/basicset/deploy/Index.vue
@@ -0,0 +1,50 @@
+<template>
+  <div class="page flex flexc">
+    <a-tabs :activeKey="activeKey" @change="changeRouter">
+      <a-tab-pane key="/deploy/manage">
+        <span slot="tab">
+          <a-icon type="folder-add" />
+          妯″潡绠$悊
+        </span>
+      </a-tab-pane>
+      <a-tab-pane key="/deploy/statement">
+        <span slot="tab">
+          <a-icon type="project" />
+          鎶ヨ〃绠$悊
+        </span>
+      </a-tab-pane>
+    </a-tabs>
+    <div class="out-box flex1">
+      <router-view></router-view>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  computed: {
+    activeKey() {
+      return this.$route.path;
+    },
+  },
+  methods: {
+    changeRouter(path) {
+      this.$router.push(path);
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.page {
+  width: 100%;
+  height: 100%;
+  .out-box {
+    padding: 0px 15px 15px 15px;
+    overflow-y: auto;
+  }
+  /deep/.ant-tabs-nav-container {
+    border-bottom: 1px solid #f0f0f0 !important;
+  }
+}
+</style>
diff --git a/base-manager-ui/admin/src/pages/basicset/deploy/Statement.vue b/base-manager-ui/admin/src/pages/basicset/deploy/Statement.vue
new file mode 100644
index 00000000..0d479d39
--- /dev/null
+++ b/base-manager-ui/admin/src/pages/basicset/deploy/Statement.vue
@@ -0,0 +1,276 @@
+<template>
+  <div>
+    <div class="flex aic jcb mb20">
+      <div>
+        <a-space>
+          <a-button type="primary" @click="handleAdd"> 鏂板 </a-button>
+          <a-button type="danger" @click="handleDelAll"> 鎵归噺鍒犻櫎 </a-button>
+        </a-space>
+      </div>
+      <a-space>
+        <a-select optionFilterProp="label" v-model="censusType">
+          <a-select-option value=""> 鍏ㄩ儴绫诲瀷 </a-select-option>
+          <a-select-option
+            v-for="(v, key) in dict.censusType"
+            :key="key"
+            :value="Number(key)"
+          >
+            {{ v }}
+          </a-select-option>
+        </a-select>
+        <a-space>
+          <a-input
+            placeholder="璇疯緭鍏ユ姤琛ㄥ悕绉版悳绱�"
+            v-model="censusName"
+            allowClear
+          />
+          <a-button type="primary" @click="onSearch">鎼滅储</a-button>
+          <a-button @click="resetSearch">閲嶇疆</a-button>
+        </a-space>
+
+        <!-- 
+        <a-input-search
+          style="width: 300px"
+          placeholder="璇疯緭鍏ユ姤琛ㄥ悕绉版悳绱�"
+          enter-button="鎼滅储"
+          v-model="censusName"
+          allowClear
+          @search="onSearch"
+        /> -->
+      </a-space>
+    </div>
+    <!-- 琛ㄦ牸 -->
+    <div class="table-content">
+      <y-table
+        :columns="columns"
+        :data="tableData"
+        :pageSize.sync="size"
+        :page.sync="page"
+        :total="total"
+        :loading="loading"
+        :scroll="{ y: 560 }"
+        :row-selection="{
+          selectedRowKeys: selectedRowKeys,
+          onChange: onSelectChange,
+        }"
+        @changePagination="getStatementList"
+      >
+        <!-- 搴忓彿 -->
+        <span slot="index" slot-scope="{ index }">{{
+          (page - 1) * size + index + 1
+        }}</span>
+        <!-- 鎵€灞炴ā鍧� -->
+        <template slot="model" slot-scope="{ record }">
+          {{ filterModel(record.modelId) }}
+        </template>
+        <!-- 缁熻绫诲瀷 -->
+        <template slot="censusType" slot-scope="{ record }">
+          {{ dict.censusType[record.censusType] }}
+        </template>
+        <!-- 鏄惁寮€鏀� -->
+        <template slot="status" slot-scope="{ record }">
+          <a-tag color="blue" v-if="record.status === 1"> 鏄� </a-tag>
+          <a-tag color="red" v-else> 鍚� </a-tag>
+        </template>
+        <!-- 鎿嶄綔 -->
+        <template slot="action" slot-scope="{ record }">
+          <a-space size="middle">
+            <a href="javascript:;" class="primary" @click="handleEdit(record)"
+              >缂栬緫</a
+            >
+            <a href="javascript:;" class="delete" @click="handleDel(record.id)"
+              >鍒犻櫎</a
+            >
+          </a-space>
+        </template>
+      </y-table>
+    </div>
+    <!-- 鏂板鎶ヨ〃 -->
+    <AddStatement
+      :addStatementVisile.sync="addStatementVisile"
+      :title="title"
+      :dict="dict"
+      ref="AddStatement"
+      :modelList="modelData"
+      @addSuccess="getStatementList"
+    ></AddStatement>
+  </div>
+</template>
+
+<script>
+import {
+  getStatementList,
+  delStatement,
+  modelList,
+} from "@/services/basicsetFun";
+import AddStatement from "./modal/AddStatement.vue";
+import YTable from "@/components/YTable.vue";
+const columns = [
+  {
+    title: "搴忓彿",
+    dataIndex: "index",
+    width: "65px",
+    scopedSlots: {
+      customRender: "index",
+    },
+  },
+  {
+    title: "鎶ヨ〃鍚嶇О",
+    dataIndex: "censusName",
+  },
+  {
+    title: "鎵€灞炴ā鍧�",
+    scopedSlots: { customRender: "model" },
+  },
+  {
+    title: "缁熻绫诲瀷",
+    width: "160px",
+    scopedSlots: { customRender: "censusType" },
+  },
+  {
+    title: "璁块棶璺敱",
+    dataIndex: "censusUrl",
+  },
+  {
+    title: "鏄惁寮€鏀�",
+    width: "150px",
+    scopedSlots: { customRender: "status" },
+  },
+  {
+    title: "鎿嶄綔",
+    width: "120px",
+    scopedSlots: { customRender: "action" },
+  },
+];
+export default {
+  components: {
+    AddStatement,
+    YTable,
+  },
+  data() {
+    return {
+      columns,
+      loading: false,
+      censusType: "",
+      total: 0,
+      size: 10,
+      page: 1,
+      modelData: [],
+      selectedRowKeys: [],
+      tableData: [],
+      addStatementVisile: false,
+      title: "鏂板",
+      censusName: "",
+      dict: {}, // 瀛楀吀
+    };
+  },
+
+  created() {
+    this.modelList();
+    this.getStatementList();
+  },
+  methods: {
+    // 鑾峰彇妯″潡
+    async modelList() {
+      let res = await modelList({
+        page: 1,
+        size: -1,
+      });
+      if (res.data.code == 1) {
+        let { data } = res.data.data;
+        this.modelData = data;
+      }
+    },
+    // 鑾峰彇鎶ヨ〃鍒楄〃
+    async getStatementList() {
+      this.loading = true;
+      let res = await getStatementList({
+        page: this.page,
+        size: this.size,
+        censusType: this.censusType,
+        censusName: `%${this.censusName}%`,
+      });
+      this.loading = false;
+      if (res.data.code == 1) {
+        let { dict, data, total } = res.data.data;
+        if (!data.length && this.page > 1) {
+          this.page -= 1;
+          this.getStatementList();
+        }
+        this.tableData = data;
+        this.total = total;
+        this.dict = dict;
+      }
+    },
+    handleAdd() {
+      this.title = "鏂板鎶ヨ〃";
+      this.addStatementVisile = true;
+      this.$refs.AddStatement.onAdd(this.modelInfo);
+    },
+    handleDelAll() {
+      if (!this.selectedRowKeys.length) {
+        this.$message.warning("璇峰厛鍕鹃€夋暟鎹�");
+        return;
+      }
+      let ids = this.selectedRowKeys.join(",");
+      this.handleDel(ids);
+    },
+
+    // 鎼滅储
+    onSearch() {
+      this.page = 1;
+      this.selectedRowKeys = [];
+      this.getStatementList();
+    },
+    resetSearch() {
+      this.page = 1;
+      this.selectedRowKeys = [];
+      this.censusType = "";
+      this.censusName = "";
+      this.getStatementList();
+    },
+    // 缂栬緫
+    handleEdit(row) {
+      this.title = "缂栬緫鎶ヨ〃";
+      this.addStatementVisile = true;
+      this.$refs.AddStatement.onEdit(row);
+    },
+    // 鍒犻櫎
+    handleDel(id) {
+      let _this = this;
+      this.$confirm({
+        title: "绯荤粺鎻愮ず",
+        content: "鍒犻櫎涓嶅彲鎭㈠锛岀‘瀹氳鍒犻櫎鍚楋紵",
+        okText: "纭畾",
+        okType: "danger",
+        cancelText: "鍙栨秷",
+        centered: true,
+        icon: "exclamation-circle",
+        maskClosable: true,
+        async onOk() {
+          let res = await delStatement({ id });
+          let { code, msg } = res.data;
+          if (code === 1) {
+            _this.$message.success(msg);
+            _this.selectedRowKeys = [];
+            _this.getStatementList();
+          }
+        },
+      });
+    },
+    // 閫変腑
+    onSelectChange(keys) {
+      this.selectedRowKeys = keys;
+    },
+
+    filterModel(modelId) {
+      let curModel = this.modelData.find((item) => item.id === modelId);
+      if (curModel) {
+        return curModel.modelName;
+      }
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>
diff --git a/base-manager-ui/admin/src/pages/basicset/deploy/deploy.vue b/base-manager-ui/admin/src/pages/basicset/deploy/deploy.vue
index 435b0680..87317e5d 100644
--- a/base-manager-ui/admin/src/pages/basicset/deploy/deploy.vue
+++ b/base-manager-ui/admin/src/pages/basicset/deploy/deploy.vue
@@ -1,7 +1,6 @@
 <template>
   <div class="deploy flex flexc">
-    <TabHeader label="閮ㄧ讲鏉垮潡绠$悊"></TabHeader>
-    <div class="pd15 flex1 auto-scroll-y">
+    <div class="flex1 auto-scroll-y">
       <div class="control pdr6">
         <div>
           <a-button type="primary" style="margin-right: 10px" @click="handleAdd"
@@ -54,29 +53,24 @@
             </div>
             <span v-else>--</span>
           </template>
+          <!-- 绫诲瀷 -->
+          <template slot="type" slot-scope="{ record }">
+            {{ dict.type[record.type] }}
+          </template>
           <!-- 鍒涘缓鏃堕棿 -->
           <template slot="createTime" slot-scope="{ record }">
             {{ record.createTime | dateFormat }}
           </template>
           <!-- 鎿嶄綔 -->
           <template slot="action" slot-scope="{ record }">
-            <a-space>
-              <span
-                href="javascript:;"
-                class="primary pointer"
-                @click="statementManage(record)"
+            <a-space size="middle">
+              <!-- <span class="primary pointer" @click="statementManage(record)"
                 >閰嶇疆鎶ヨ〃</span
-              >
-              <span
-                href="javascript:;"
-                class="primary pointer"
-                @click="handleEdit(record)"
+              > -->
+              <span class="primary pointer" @click="handleEdit(record)"
                 >缂栬緫</span
               >
-              <span
-                href="javascript:;"
-                class="delete pointer"
-                @click="handleDel(record.id)"
+              <span class="delete pointer" @click="handleDel(record.id)"
                 >鍒犻櫎</span
               >
             </a-space>
@@ -196,7 +190,6 @@
 <script>
 import { modelList, addMode, delMode } from "@/services/basicsetFun";
 import StatementManage from "./components/StatementManage.vue";
-import TabHeader from "@/components/TabHeader";
 import YTable from "@/components/YTable.vue";
 import YUpload from "@/components/YUpload.vue";
 const columns = [
@@ -234,6 +227,7 @@ const columns = [
   },
   {
     title: "绫诲瀷",
+    width: "8%",
     scopedSlots: { customRender: "type" },
   },
   {
@@ -248,14 +242,13 @@ const columns = [
   },
   {
     title: "鎿嶄綔",
-    width: "180px",
+    width: "120px",
     scopedSlots: { customRender: "action" },
   },
 ];
 export default {
   components: {
     StatementManage,
-    TabHeader,
     YTable,
     YUpload,
   },
diff --git a/base-manager-ui/admin/src/pages/basicset/deploy/modal/AddStatement.vue b/base-manager-ui/admin/src/pages/basicset/deploy/modal/AddStatement.vue
index 58eb340c..9ed9a25c 100644
--- a/base-manager-ui/admin/src/pages/basicset/deploy/modal/AddStatement.vue
+++ b/base-manager-ui/admin/src/pages/basicset/deploy/modal/AddStatement.vue
@@ -19,8 +19,23 @@
         :label-col="{ span: 4 }"
         :wrapper-col="{ span: 20 }"
       >
-        <a-form-model-item label="鎵€灞炴ā鍧�">
-          <a-input disabled :value="modelInfo.modelName" />
+        <a-form-model-item label="鎵€灞炴ā鍧�" prop="modelId">
+          <a-select
+            show-search
+            allowClear
+            optionFilterProp="label"
+            v-model="formData.modelId"
+            placeholder="璇烽€夋嫨妯″潡"
+          >
+            <a-select-option
+              v-for="v in modelList"
+              :key="v.id"
+              :value="v.id"
+              :label="v.modelName"
+            >
+              {{ v.modelName }}
+            </a-select-option>
+          </a-select>
         </a-form-model-item>
         <a-form-model-item label="鎶ヨ〃鍚嶇О" prop="censusName">
           <a-input v-model="formData.censusName" placeholder="璇疯緭鍏ユ姤琛ㄥ悕绉�" />
@@ -32,7 +47,11 @@
           />
         </a-form-model-item>
         <a-form-model-item label="缁熻绫诲瀷" prop="censusType">
-          <a-select v-model="formData.censusType" placeholder="璇烽€夋嫨缁熻绫诲瀷">
+          <a-select
+            allowClear
+            v-model="formData.censusType"
+            placeholder="璇烽€夋嫨缁熻绫诲瀷"
+          >
             <a-select-option
               v-for="(v, key) in dict.censusType"
               :key="key"
@@ -56,37 +75,46 @@ import YSwitch from "@/components/yswitch/YSwitch.vue";
 export default {
   props: {
     title: {
-      require: true,
+      required: true,
       type: String,
       default: "",
     },
     addStatementVisile: {
       type: Boolean,
-      require: true,
+      required: true,
       default: false,
     },
     dict: {
       type: Object,
-      require: true,
+      required: true,
       default: () => {
         return {};
       },
     },
+    modelList: {
+      type: Array,
+      required: true,
+      default: () => {
+        return [];
+      },
+    },
   },
   components: {
     YSwitch,
   },
   data() {
     return {
-      modelInfo: {},
       formData: {
-        modelId: "", // 妯″潡id
+        modelId: undefined, // 妯″潡id
         censusName: "", // 鎶ヨ〃鍚嶇О
         censusUrl: "", // 鎶ヨ〃璁块棶璺敱
         censusType: undefined, // 缁熻绫诲瀷
         status: 1, // 鐘舵€侊紙0锛氫负寮€閫氾紝1锛氬紑閫氾級
       },
       rules: {
+        modelId: [
+          { required: true, message: "璇疯緭鍏ユ墍灞炴ā鍧�", trigger: "change" },
+        ],
         censusName: [
           { required: true, message: "璇疯緭鍏ユ姤琛ㄥ悕绉�", trigger: "blur" },
         ],
@@ -111,16 +139,13 @@ export default {
   },
   methods: {
     // 鏂板
-    onAdd(modelInfo) {
+    onAdd() {
       Object.assign(this.formData, this.$options.data().formData);
       this.formData.id && this.$delete(this.formData, "id");
-      this.modelInfo = modelInfo;
-      this.formData.modelId = modelInfo.id;
     },
     // 缂栬緫
-    onEdit(data, modelInfo) {
+    onEdit(data) {
       this.$nextTick(() => {
-        this.modelInfo = modelInfo;
         this.formData = { ...data };
       });
     },
diff --git a/base-manager-ui/admin/src/router/config.js b/base-manager-ui/admin/src/router/config.js
index 3927f8b7..51068b35 100644
--- a/base-manager-ui/admin/src/router/config.js
+++ b/base-manager-ui/admin/src/router/config.js
@@ -148,7 +148,26 @@ const options = {
             icon: "appstore",
             roles: ["admin"],
           },
-          component: () => import("@/pages/basicset/deploy/deploy"),
+          component: () => import("@/pages/basicset/deploy/Index"),
+          redirect: "/deploy/manage",
+          children: [
+            {
+              path: "manage",
+              name: "妯″潡绠$悊",
+              component: () => import("@/pages/basicset/deploy/deploy"),
+              meta: {
+                invisible: true,
+              },
+            },
+            {
+              path: "statement",
+              name: "鎶ヨ〃绠$悊",
+              meta: {
+                invisible: true,
+              },
+              component: () => import("@/pages/basicset/deploy/Statement"),
+            },
+          ],
         },
 
         {
-- 
2.24.3