Forráskód Böngészése

Merge branch 'MicroFunction' of http://47.103.92.60:3003/skyversation/qp_onemap_ui

DESKTOP-6LTVLN7\Liumouren 3 hete
szülő
commit
4e0a58f1b8

+ 8 - 0
public/index.html

@@ -26,6 +26,14 @@
 </body>
 
 <style>
+
+@font-face {
+  font-family: 'din-bold';
+  src: url('./static/font/DIN-Bold/din-bold-2.ttf') format('truetype');
+  font-weight: normal;
+  font-style: normal;
+}
+
   :root {
 
     /* 滚动条整体部分,必须要设置 */

+ 2 - 0
public/static/config/config.js

@@ -24,6 +24,8 @@ let systemConfig = {
     modelIds: [1667, 1690, 1677, 1673],
     columnIds: [1657, 1659, 1666, 1676, 1665, 1651, 1662],
 
+    iframeUrl: "http://10.235.245.174:2024/",
+
     // baseServicerPath: "/oneMap",
     baseServicerPath: "http://121.43.55.7:13901/qpyzt",
     // oauth和DMS环境

+ 1 - 1
src/components/AppVue/Header.vue

@@ -87,7 +87,7 @@ export default {
         cursor: pointer;
         // margin: 10px 20px;
         padding: 10px 20px;
-        font-size: 16px;
+        font-size: 14px;
         // font-weight: bold;
       }
 

+ 1 - 1
src/components/AppVue/digitalScrollersComp.vue

@@ -93,7 +93,7 @@ watch(
 }
  
 .count-flop-content {
-  font-family: MicrosoftYaHei-Bold;
+  font-family: 'din-bold';
   text-align: center;
   position: absolute;
   left: 0;

+ 1 - 1
src/components/AppVue/numberScroll.vue

@@ -1,5 +1,5 @@
 <template>
-  <span ref="numberEl">{{ displayValue }}</span>
+  <span ref="numberEl" style="font-family: 'din-bold';">{{ displayValue }}</span>
 </template>
 
 <script setup>

+ 88 - 23
src/components/wgn/controlPanel.vue

@@ -119,10 +119,7 @@
                 >渲染到地图中</span
               >
               <el-tooltip content="定位到当前入参渲染要素" placement="top">
-                <span
-                  v-if="renderStatus.input"
-                  @click="locateRenderedGeojson('input')"
-                >
+                <span v-if="renderStatus.input" @click="locateRenderedGeojson('input')">
                   定位
                 </span>
               </el-tooltip>
@@ -164,10 +161,7 @@
                 >渲染到地图中</span
               >
               <el-tooltip content="定位到当前返回渲染要素" placement="top">
-                <span
-                  v-if="renderStatus.output"
-                  @click="locateRenderedGeojson('output')"
-                >
+                <span v-if="renderStatus.output" @click="locateRenderedGeojson('output')">
                   定位
                 </span>
               </el-tooltip>
@@ -318,6 +312,7 @@ export default {
         outFileType: "",
         outPrj: "",
         inPrj: "",
+        compressionRatio: "",
         lon: "",
         lat: "",
       },
@@ -467,6 +462,16 @@ export default {
             },
           ],
         },
+        {
+          value: "1.5.8",
+          label: "1.5.8自定义工具",
+          children: [
+            {
+              value: "1.5.8.1",
+              label: "obj三维模型轻量化",
+            },
+          ],
+        },
         // 时空算子库
         {
           value: "1.2.5",
@@ -530,6 +535,24 @@ export default {
             label: "WEB_Mercator",
           },
         ],
+        compressionRatio: [
+          {
+            value: "100%",
+            label: "100%",
+          },
+          {
+            value: "80%",
+            label: "80%",
+          },
+          {
+            value: "50%",
+            label: "50%",
+          },
+          {
+            value: "25%",
+            label: "25%",
+          },
+        ],
         outPrj: [
           {
             value: "WGS84",
@@ -724,7 +747,8 @@ export default {
         this.showToMap(this.renderedGeojsonCache[source], source);
         return;
       }
-      const sourceGeojson = this.getSourceGeojsonData(source) || this.renderedGeojsonCache[source];
+      const sourceGeojson =
+        this.getSourceGeojsonData(source) || this.renderedGeojsonCache[source];
       this.flyToGeojson(sourceGeojson);
     },
     collectGeometryCoordinates(geometry) {
@@ -775,7 +799,11 @@ export default {
       }
       if (points.length === 1) {
         viewer.camera.flyTo({
-          destination: SkyScenery.Cartesian3.fromDegrees(points[0][0], points[0][1], 1200),
+          destination: SkyScenery.Cartesian3.fromDegrees(
+            points[0][0],
+            points[0][1],
+            1200
+          ),
           duration: 1.1,
           orientation: {
             heading: viewer.camera.heading,
@@ -850,7 +878,10 @@ export default {
       if (!isNaN(Number(value))) {
         return Number(value);
       }
-      if ((value.startsWith("{") && value.endsWith("}")) || (value.startsWith("[") && value.endsWith("]"))) {
+      if (
+        (value.startsWith("{") && value.endsWith("}")) ||
+        (value.startsWith("[") && value.endsWith("]"))
+      ) {
         try {
           return JSON.parse(value);
         } catch (e) {
@@ -916,11 +947,15 @@ export default {
         item.editKey = item.originalKey || "";
         return;
       }
-      this.propertyDialog.propertiesRef[currentKey] = this.parsePropertyValue(item.editValue);
+      this.propertyDialog.propertiesRef[currentKey] = this.parsePropertyValue(
+        item.editValue
+      );
       item.originalKey = currentKey;
       item.editKey = currentKey;
       this.syncPropertyToEntity(this.propertyDialog.propertiesRef);
-      this.syncJsonEditorData(this.propertyDialog.source || this.currentRenderedSource || "input");
+      this.syncJsonEditorData(
+        this.propertyDialog.source || this.currentRenderedSource || "input"
+      );
     },
     handlePropertyKeyChange(item) {
       if (!this.propertyDialog.propertiesRef || !item) {
@@ -936,7 +971,10 @@ export default {
         item.editKey = oldKey;
         return;
       }
-      if (newKey !== oldKey && Object.prototype.hasOwnProperty.call(this.propertyDialog.propertiesRef, newKey)) {
+      if (
+        newKey !== oldKey &&
+        Object.prototype.hasOwnProperty.call(this.propertyDialog.propertiesRef, newKey)
+      ) {
         this.$message({
           message: "属性名已存在,请更换",
           type: "warning",
@@ -952,19 +990,28 @@ export default {
       item.originalKey = newKey;
       item.editKey = newKey;
       this.syncPropertyToEntity(this.propertyDialog.propertiesRef);
-      this.syncJsonEditorData(this.propertyDialog.source || this.currentRenderedSource || "input");
+      this.syncJsonEditorData(
+        this.propertyDialog.source || this.currentRenderedSource || "input"
+      );
     },
     deleteProperty(item) {
       if (!this.propertyDialog.propertiesRef || !item) {
         return;
       }
       const key = (item.originalKey || "").trim();
-      if (key && Object.prototype.hasOwnProperty.call(this.propertyDialog.propertiesRef, key)) {
+      if (
+        key &&
+        Object.prototype.hasOwnProperty.call(this.propertyDialog.propertiesRef, key)
+      ) {
         delete this.propertyDialog.propertiesRef[key];
       }
-      this.propertyDialog.list = this.propertyDialog.list.filter((property) => property.id !== item.id);
+      this.propertyDialog.list = this.propertyDialog.list.filter(
+        (property) => property.id !== item.id
+      );
       this.syncPropertyToEntity(this.propertyDialog.propertiesRef);
-      this.syncJsonEditorData(this.propertyDialog.source || this.currentRenderedSource || "input");
+      this.syncJsonEditorData(
+        this.propertyDialog.source || this.currentRenderedSource || "input"
+      );
     },
     addProperty() {
       if (!this.propertyDialog.propertiesRef) {
@@ -976,7 +1023,9 @@ export default {
       }
       let index = 1;
       let newKey = "newKey";
-      while (Object.prototype.hasOwnProperty.call(this.propertyDialog.propertiesRef, newKey)) {
+      while (
+        Object.prototype.hasOwnProperty.call(this.propertyDialog.propertiesRef, newKey)
+      ) {
         newKey = `newKey${index}`;
         index += 1;
       }
@@ -988,7 +1037,9 @@ export default {
         editValue: "",
       });
       this.syncPropertyToEntity(this.propertyDialog.propertiesRef);
-      this.syncJsonEditorData(this.propertyDialog.source || this.currentRenderedSource || "input");
+      this.syncJsonEditorData(
+        this.propertyDialog.source || this.currentRenderedSource || "input"
+      );
     },
     syncPropertyToEntity(propertiesRef) {
       if (!propertiesRef || !viewer || !this.currentRenderedSource) {
@@ -1341,7 +1392,8 @@ export default {
           this.currentRenderedSource ||
           "input";
         const geojsonData =
-          this.getSourceGeojsonData(propertySource) || this.renderedGeojsonCache[propertySource];
+          this.getSourceGeojsonData(propertySource) ||
+          this.renderedGeojsonCache[propertySource];
         let propertiesRef = null;
         if (geojsonData) {
           if (
@@ -1354,7 +1406,8 @@ export default {
             if (!geojsonData.features[entity.__featureRef.featureIndex].properties) {
               geojsonData.features[entity.__featureRef.featureIndex].properties = {};
             }
-            propertiesRef = geojsonData.features[entity.__featureRef.featureIndex].properties;
+            propertiesRef =
+              geojsonData.features[entity.__featureRef.featureIndex].properties;
           } else {
             if (!geojsonData.properties) {
               geojsonData.properties = {};
@@ -1365,7 +1418,10 @@ export default {
         const propertyList = this.formatFeatureProperties(
           propertiesRef || entity.__featureProperties || {}
         );
-        if (propertiesRef || (entity.__featureProperties && typeof entity.__featureProperties === "object")) {
+        if (
+          propertiesRef ||
+          (entity.__featureProperties && typeof entity.__featureProperties === "object")
+        ) {
           this.propertyDialog.source = propertySource;
           this.propertyDialog.propertiesRef =
             propertiesRef || entity.__featureProperties || {};
@@ -1987,6 +2043,15 @@ export default {
       ) {
         requestData.inPrj = this.params.inPrj;
       }
+      if (
+        this.SceneValue &&
+        this.dmsServerItem &&
+        this.dmsServerItem.elementTypes &&
+        this.ifHasType("compressionRatio") &&
+        this.params.compressionRatio
+      ) {
+        requestData.compressionRatio = this.params.compressionRatio;
+      }
       if (
         this.SceneValue &&
         this.dmsServerItem &&

+ 3 - 3
src/components/yxgl/table.vue

@@ -42,10 +42,10 @@ export default {
   computed: {
     headerCellStyle() {
       return {
-        backgroundColor: "rgba(24, 144, 255, 0.25)",
-        color: "#0071e3",
+        // backgroundColor: "rgba(24, 144, 255, 0.25)",
+        color: "#fff",
         fontWeight: "bold",
-        borderBottom: "2px solid rgba(24, 144, 255, 0.3)",
+        // borderBottom: "2px solid rgba(24, 144, 255, 0.3)",
         padding: "12px 8px",
       };
     },

+ 62 - 3
src/views/HomePage.vue

@@ -14,6 +14,20 @@
         </div>
       </el-affix>
     </div> -->
+
+    <div :class="isOpen ?'isOpenLeftShow':'isOpenRightShow'" @click="isOpen = !isOpen">
+      <div>
+        <el-icon :size="20" class="btn_color">
+          <DArrowLeft v-if="isOpen == false"/>
+          <DArrowRight v-else/>
+        </el-icon>
+      </div>
+    </div>
+
+    <el-drawer v-model="isOpen" :with-header="false" size="100%">
+      <iframe :src="iframeUrl" class="win-iframe"></iframe>
+    </el-drawer>
+
     <div class="part1" id="top">
       <div style="margin-left: 10%;">
         <div class="super-title">青浦区“一张图”区级节点</div>
@@ -175,7 +189,7 @@
             <!-- <el-icon color="#0071e3" size="30px">
               <List></List>
             </el-icon> -->
-            <div>热点资源 Top10</div>
+            <div>热点资源 TOP10</div>
           </div>
           <div class="row">
             <div class="top-list" style="flex-grow: 1;">
@@ -210,7 +224,7 @@
             <!-- <el-icon color="#0071e3" size="30px">
               <School />
             </el-icon> -->
-            <div>委办调用 Top5</div>
+            <div>委办调用 TOP5</div>
           </div>
           <div class="top-list">
             <div v-for="index in 5" :key="index" class="list-item">
@@ -643,7 +657,7 @@ export default {
       ],
       userTop: [
       ],
-
+      iframeUrl:systemConfig.iframeUrl+"?token="+localStorage.getItem("token"),
       examplelist:systemConfig.examplelist,
 
       useCase: {
@@ -731,6 +745,7 @@ export default {
       chartMluUnitName: null,
       chartMluAppName: null,
       chartMluTimeRange: null,
+      isOpen:false,
 
     };
   },
@@ -2289,4 +2304,48 @@ export default {
     }
   }
 }
+.isOpenRightShow{
+    position: fixed;
+    top: 45%;
+    right: 10px;
+    z-index: 2020;
+    cursor: pointer;
+}
+.isOpenLeftShow{
+    position: fixed;
+    top: 45%;
+    left: 10px;
+    z-index: 2020;
+    cursor: pointer;
+    
+}
+.btn_color{
+    color:#fff;
+    background: #1a2a6075;
+    padding: 10px;
+    border-radius: 20px;
+    &:hover {
+      background: #29558f;
+      color:rgb(0, 247, 255)
+    }
+}
+.win-iframe {
+    width: 100%; /* 使iframe宽度适应父容器 */
+    height: 100%; /* 固定高度 */
+    border: none; /* 移除默认边框 */
+}
+/deep/.el-drawer__body{
+  padding: 0;
+}
+/deep/.el-overlay{
+  // height: calc(100vh - 44px);
+  // top: 44px;
+}
+/deep/.el-drawer {
+  transition: transform 1.5s ease; 
+}
+/deep/.el-modal-drawer {
+  transition: transform 1.5s ease; 
+}
 </style>
+

+ 636 - 551
src/views/Wgn.vue

@@ -1,319 +1,330 @@
 <template>
-  <div class="wgn_box">
-    <!-- <div class="server_title">
-      <el-image
-        style="width: 50%; height: calc(100vh - 120px)"
-        src="static/images/wgn_title.png"
-        fit="cover"
-      />
-      <div class="server_title_text">
-        <div class="server_title_text_title">微功能服务</div>
-        <div class="server_title_text_content">
-          微功能子系统专注于提供强大的空间计算与数据处理能力,是支撑青浦区三维数字底板空间分析与数据流转的核心模块,聚焦
-          “精准计算 + 灵活处理”
-          两大核心能力,所有功能均以标准化服务接口形式对外提供(支持第三方委办、上层应用系统调用),同时在系统内部集成可视化操作界面,实现
-          “计算 - 分析 - 展示” 闭环。
-        </div>
-        <div class="server_title_text_btu" v-if="$getUserType() == 3"> -->
-          <!-- 先打开弹窗,然后上传文件保存信息到DMS的任务表,同时发送任务到微功能子系统,微功能子系统处理完成后,更新任务状态 -->
-          <!-- <el-button type="primary" round plain size="large" @click="createTask"
-            >大批量数据处理任务<el-icon><Position /></el-icon
-          ></el-button>
-        </div>
-      </div>
-    </div> -->
-
-    <!-- 顶部横幅区域 -->
-    <div class="banner">
-      <div class="banner-content">
-        <h1 class="banner-title">微功能服务</h1>
-        <p class="banner-description">
-          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;微功能子系统专注于提供强大的空间计算与数据处理能力,是支撑青浦区三维数字底板空间分析与数据流转的核心模块,聚焦“精准计算 + 灵活处理”两大核心能力,所有功能均以标准化服务接口形式对外提供(支持第三方委办、上层应用系统调用),同时在系统内部集成可视化操作界面,实现“计算 - 分析 - 展示” 闭环。
-        </p>
-        <div v-if="$getUserType() == 3">
-           <el-button type="primary" round plain size="large" @click="createTask"
-            >大批量数据处理任务<el-icon><Position /></el-icon
-          ></el-button>
-        </div>
-      </div>
-    </div>
+  <el-affix :offset="0">
+    <div style="height: 44px; width: 100vw; background: #00002a"></div>
+  </el-affix>
+  <el-affix :offset="44">
+    <div class="application-overview">
+      <!-- 右侧主内容区 -->
+      <div class="main-content">
+        <div style="display: flex; justify-content: space-between; padding-right: 30px">
+          <!-- 搜索栏 -->
+          <div class="search-bar">
+            <el-input
+              placeholder="输入搜索关键词"
+              v-model="searchStr"
+              class="search-input"
+            >
+            </el-input>
+            <el-button type="primary" class="search-btn" @click="searchServerList"
+              >搜索</el-button
+            >
+            <!-- <span>搜索到{{total}}条微功能服务</span> -->
+          </div>
 
-    <div class="server_list_box">
-      <div class="server_list_box_title">微功能列表</div>
-      <el-affix :offset="80">
-        <div class="server_list_box_search">
-          <el-input
-            v-model="searchStr"
-            style="width: 525px; margin-left: 37px"
-            placeholder="输入搜索关键词"
-            class="input-with-select"
-            clearable
-            size="large"
-            @change="searchServerList()"
-          >
-            <template #append>
-              <el-button icon="Search" @click="searchServerList()" />
-            </template>
-          </el-input>
+          <div>
+            <el-button
+              v-if="$getUserType() != 1"
+              type="primary"
+              class="search-btn"
+              @click="createTask"
+              >大批量数据处理任务</el-button
+            >
+          </div>
         </div>
-      </el-affix>
-      <div class="server_list_box_table" v-if="dmsServerList">
-        <div
-          v-for="item in dmsServerList"
-          :key="item.c_scene_name"
-          class="server_list_box_table_item"
-          :id="item.c_scene_name + 'list'"
-        >
-          <div class="server_list_box_table_item_content">
-            <div class="server_list_box_table_item_content_title">{{ item.title }}</div>
-            <div class="server_list_box_table_item_content_text">{{ item.content }}</div>
-            <div class="server_list_box_table_item_content_button_box">
-              <div
-                class="server_list_box_table_item_content_button_box_item"
-                @click.stop="handleOnlineDemo(item)"
-              >
-                在线演示
+
+        <!-- 应用卡片网格 -->
+        <div class="wgn-content">
+          <div class="applications-grid">
+            <div
+              class="application-card"
+              v-for="(item, index) in dmsServerList"
+              :key="index"
+            >
+              <div class="card-image">
+                <img :src="curUrl + item.c_picture" :alt="item.title" />
               </div>
-              <div
-                class="server_list_box_table_item_content_button_box_item"
-                @click.stop="handleApply(item)"
-              >
-                申请使用
+              <div class="card-content">
+                <div class="wgn-header">
+                  <h3 class="wgn-name">{{ item.title }}</h3>
+                  <!-- <span class="wgn-version">{{ item.version }}</span> -->
+                </div>
+                <!-- <div class="wgn-tags">
+                <el-tag size="small" type="success">{{ item.buffName }}</el-tag>
+                <el-tag size="small" v-for="tag in item.tags" :key="tag">{{ tag }}</el-tag>
+              </div> -->
+                <el-tooltip placement="top" effect="dark">
+                  <template #content>
+                    <div style="max-width: 500px">{{ item.content }}</div>
+                  </template>
+                  <p class="wgn-description">{{ item.content }}</p>
+                </el-tooltip>
+                <div class="wgn-footer">
+                  <!-- <span class="wgn-date">{{ item.createTime }}</span> -->
+                  <el-button
+                    type="primary"
+                    size="small"
+                    class="visit-button"
+                    @click="handleOnlineDemo(item)"
+                    >在线体验</el-button
+                  >
+                  <el-button
+                    type="primary"
+                    size="small"
+                    class="visit-button"
+                    @click="handleApply(item)"
+                    >申请使用</el-button
+                  >
+                </div>
               </div>
             </div>
           </div>
-          <div class="server_list_box_table_item_image">
-            <el-image
-              style="width: 690px; height: 410px"
-              :src="dmsDataProxy + item.c_picture"
-              fit="cover"
-            />
-          </div>
         </div>
-      </div>
-      <!-- 申请使用微功能服务的表单弹窗 -->
-      <el-dialog
-        title="申请使用微功能服务"
-        v-model="showFrom"
-        width="60%"
-        :close-on-click-modal="false"
-        :close-on-press-escape="false"
-        :show-close="true"
-      >
-        <el-form :model="column.from" :rules="rules" ref="formRef" label-width="120px">
-          <el-form-item label="应用名称" prop="c_application_name">
-            <el-input
-              v-model="column.from.c_application_name"
-              placeholder="请输入应用名称"
-            />
-          </el-form-item>
-          <el-form-item label="接口路径" prop="c_interface_path">
-            <el-input
-              v-model="column.from.c_interface_path"
-              disabled
-              placeholder="请输入接口路径"
-            />
-          </el-form-item>
-          <el-form-item label="联系电话" prop="c_phone">
-            <el-input v-model="column.from.c_phone" placeholder="请输入联系电话" />
-          </el-form-item>
-          <el-form-item label="单位名称" prop="c_unit_name">
-            <el-input v-model="column.from.c_unit_name" placeholder="请输入单位名称" />
-          </el-form-item>
-          <el-form-item label="部门名称" prop="c_department">
-            <el-input v-model="column.from.c_department" placeholder="请输入部门名称" />
-          </el-form-item>
-          <!-- 项目负责人 -->
-          <el-form-item label="项目负责人" prop="c_business_leader">
-            <el-input
-              v-model="column.from.c_business_leader"
-              placeholder="请输入项目负责人"
-            />
-          </el-form-item>
-          <!-- 申请使用微功能服务的详细信息 -->
-          <el-form-item label="申请使用微功能服务的详细信息" prop="content">
-            <el-input
-              type="textarea"
-              v-model="column.from.content"
-              placeholder="请输入申请使用微功能服务的详细信息"
-            />
-          </el-form-item>
-        </el-form>
-        <template #footer>
-          <div class="dialog-footer">
-            <el-button @click="showFrom = false">取消</el-button>
-            <el-button type="primary" @click="handleApplySubmit">确定</el-button>
-          </div>
-        </template>
-      </el-dialog>
-      <!-- 创建任务的表单弹窗 -->
-      <el-dialog
-        title="创建任务"
-        v-model="showTaskFrom"
-        width="60%"
-        :close-on-click-modal="false"
-        :close-on-press-escape="false"
-        :show-close="true"
-      >
-        <el-form
-          :model="taskColumn.from"
-          :rules="taskColumn.rules"
-          ref="taskFormRef"
-          label-width="120px"
+
+        <!-- 申请使用微功能服务的表单弹窗 -->
+        <el-dialog
+          title="申请使用微功能服务"
+          v-model="showFrom"
+          width="60%"
+          :close-on-click-modal="false"
+          :close-on-press-escape="false"
+          :show-close="true"
         >
-          <el-form-item label="任务名称" prop="c_name">
-            <el-input
-              v-model="taskColumn.from.c_name"
-              placeholder="请输入任务名称"
-              clearable
-            >
-              <template #prepend>{{
-                $moment(new Date()).format("YYMMDD_HHmm") +
-                "_" +
-                (taskColumn.from.c_type
-                  ? $getDmsTypes("yzt_task_type", taskColumn.from.c_type) + "_"
-                  : "")
-              }}</template>
-            </el-input>
-          </el-form-item>
-          <el-form-item label="任务备注" prop="c_comment">
-            <el-input
-              type="textarea"
-              clearable
-              v-model="taskColumn.from.c_comment"
-              placeholder="请输入任务备注"
-            />
-          </el-form-item>
-          <!-- 下拉框选择任务类型 -->
-          <el-form-item label="任务类型" prop="c_type">
-            <el-select
-              v-model="taskColumn.from.c_type"
-              @change="changeTaskType"
-              placeholder="请选择任务类型"
-            >
-              <el-option
-                v-for="(name, index) in $store.state.DmsTypesMap['yzt_task_type']"
-                :key="index"
-                :label="name"
-                :value="index"
+          <el-form :model="column.from" :rules="rules" ref="formRef" label-width="120px">
+            <el-form-item label="应用名称" prop="c_application_name">
+              <el-input
+                v-model="column.from.c_application_name"
+                placeholder="请输入应用名称"
               />
-            </el-select>
-          </el-form-item>
-          <!-- 渲染任务描述:仅查看 -->
-          <el-form-item
-            label="任务描述"
-            prop="apiDescription"
-            v-if="taskColumn.apiFrom.apiDescription"
-          >
-            <el-input
-              type="textarea"
-              disabled
-              v-model="taskColumn.apiFrom.apiDescription"
-            />
-          </el-form-item>
-          <!-- 任务文件是必须的 -->
-          <el-form-item label="任务文件" prop="c_source_file">
-            <el-input disabled v-model="taskColumn.from.c_source_file" v-show="false" />
-            <el-upload class="avatar-uploader" :http-request="handleTCUpload" :limit="1">
-              <el-button size="small" type="primary">点击上传</el-button>
-            </el-upload>
-          </el-form-item>
-          <el-divider />
-          <!-- 其他参数数据 -->
-          <el-form-item label="其他参数数据" prop="c_source_data" v-show="false">
-            <el-input
-              type="textarea"
-              clearable
-              v-model="taskColumn.from.c_source_data"
-              placeholder="请输入其他参数数据"
-            />
-          </el-form-item>
-          <div
-            v-if="
-              taskColumn.apiFrom.apiParameterRules &&
-              includesKey(['lonKey', 'latKey', 'outFileType', 'inPrj', 'outPrj'])
-            "
+            </el-form-item>
+            <el-form-item label="接口路径" prop="c_interface_path">
+              <el-input
+                v-model="column.from.c_interface_path"
+                disabled
+                placeholder="请输入接口路径"
+              />
+            </el-form-item>
+            <el-form-item label="联系电话" prop="c_phone">
+              <el-input v-model="column.from.c_phone" placeholder="请输入联系电话" />
+            </el-form-item>
+            <el-form-item label="单位名称" prop="c_unit_name">
+              <el-input v-model="column.from.c_unit_name" placeholder="请输入单位名称" />
+            </el-form-item>
+            <el-form-item label="部门名称" prop="c_department">
+              <el-input v-model="column.from.c_department" placeholder="请输入部门名称" />
+            </el-form-item>
+            <!-- 项目负责人 -->
+            <el-form-item label="项目负责人" prop="c_business_leader">
+              <el-input
+                v-model="column.from.c_business_leader"
+                placeholder="请输入项目负责人"
+              />
+            </el-form-item>
+            <!-- 申请使用微功能服务的详细信息 -->
+            <el-form-item label="申请使用微功能服务的详细信息" prop="content">
+              <el-input
+                type="textarea"
+                v-model="column.from.content"
+                placeholder="请输入申请使用微功能服务的详细信息"
+              />
+            </el-form-item>
+          </el-form>
+          <template #footer>
+            <div class="dialog-footer">
+              <el-button @click="showFrom = false">取消</el-button>
+              <el-button type="primary" @click="handleApplySubmit">确定</el-button>
+            </div>
+          </template>
+        </el-dialog>
+        <!-- 创建任务的表单弹窗 -->
+        <el-dialog
+          title="创建任务"
+          v-model="showTaskFrom"
+          width="60%"
+          :close-on-click-modal="false"
+          :close-on-press-escape="false"
+          :show-close="true"
+        >
+          <el-form
+            :model="taskColumn.from"
+            :rules="taskColumn.rules"
+            ref="taskFormRef"
+            label-width="120px"
           >
-            <template
-              v-for="(rulesItem, index) in taskColumn.apiFrom.apiParameterRules"
-              :key="index"
-            >
-              <el-form-item
-                v-if="
-                  ['lonKey', 'latKey', 'outFileType', 'inPrj', 'outPrj'].includes(
-                    rulesItem
-                  )
-                "
-                :label="rulesItem"
+            <el-form-item label="任务名称" prop="c_name">
+              <el-input
+                v-model="taskColumn.from.c_name"
+                placeholder="请输入任务名称"
+                clearable
+              >
+                <template #prepend>{{
+                  $moment(new Date()).format("YYMMDD_HHmm") +
+                  "_" +
+                  (taskColumn.from.c_type
+                    ? $getDmsTypes("yzt_task_type", taskColumn.from.c_type) + "_"
+                    : "")
+                }}</template>
+              </el-input>
+            </el-form-item>
+            <el-form-item label="任务备注" prop="c_comment">
+              <el-input
+                type="textarea"
+                clearable
+                v-model="taskColumn.from.c_comment"
+                placeholder="请输入任务备注"
+              />
+            </el-form-item>
+            <!-- 下拉框选择任务类型 -->
+            <el-form-item label="任务类型" prop="c_type">
+              <el-select
+                v-model="taskColumn.from.c_type"
+                @change="changeTaskType"
+                placeholder="请选择任务类型"
               >
-                <el-input
-                  v-if="['lonKey', 'latKey'].includes(rulesItem)"
-                  v-model="taskColumn.from.c_source_data[rulesItem]"
-                  placeholder="当文件为xlsx时必填"
+                <el-option
+                  v-for="(name, index) in $store.state.DmsTypesMap['yzt_task_type']"
+                  :key="index"
+                  :label="name"
+                  :value="index"
                 />
-                <el-select
-                  v-if="['outFileType', 'inPrj', 'outPrj'].includes(rulesItem)"
-                  v-model="taskColumn.from.c_source_data[rulesItem]"
-                  :placeholder="'请选择' + rulesItem"
-                >
-                  <el-option
-                    v-for="item in taskColumn.selectOptions[rulesItem]"
-                    :key="'wgn-task-selectOptions-form-' + item.label"
-                    :label="item.label"
-                    :value="item.value"
-                  />
-                </el-select>
-              </el-form-item>
-            </template>
-          </div>
-          <!-- 任务状态默认为初始化 -->
-          <el-form-item label="任务状态" prop="c_state" v-show="false">
-            <el-select
-              disabled
-              v-model="taskColumn.from.c_state"
-              placeholder="请选择任务状态"
+              </el-select>
+            </el-form-item>
+            <!-- 渲染任务描述:仅查看 -->
+            <el-form-item
+              label="任务描述"
+              prop="apiDescription"
+              v-if="taskColumn.apiFrom.apiDescription"
             >
-              <el-option
-                v-for="(name, index) in $store.state.DmsTypesMap['task_status']"
-                :key="'wgn-task-form-' + index"
-                :label="name"
-                :value="index"
+              <el-input
+                type="textarea"
+                disabled
+                v-model="taskColumn.apiFrom.apiDescription"
               />
-            </el-select>
-          </el-form-item>
-          <!-- 任务负责人默认为当前登录用户 -->
-          <el-form-item label="用户id" prop="c_user_id" v-show="false">
-            <el-input disabled v-model="taskColumn.from.c_user_id" />
-          </el-form-item>
-          <!-- 任务负责人默认为当前登录用户 -->
-          <el-form-item label="用户名" prop="c_user_name" v-show="false">
-            <el-input disabled v-model="taskColumn.from.c_user_name" />
-          </el-form-item>
-        </el-form>
-        <template #footer>
-          <div class="dialog-footer">
-            <el-button @click="showTaskFrom = false">取消</el-button>
-            <el-button type="primary" @click="handleTaskSubmit">确定</el-button>
-          </div>
-        </template>
-      </el-dialog>
+            </el-form-item>
+            <!-- 任务文件是必须的 -->
+            <el-form-item label="任务文件" prop="c_source_file">
+              <el-input disabled v-model="taskColumn.from.c_source_file" v-show="false" />
+              <el-upload
+                class="avatar-uploader"
+                :http-request="handleTCUpload"
+                :limit="1"
+              >
+                <el-button size="small" type="primary">点击上传</el-button>
+              </el-upload>
+            </el-form-item>
+            <el-divider />
+            <!-- 其他参数数据 -->
+            <el-form-item label="其他参数数据" prop="c_source_data" v-show="false">
+              <el-input
+                type="textarea"
+                clearable
+                v-model="taskColumn.from.c_source_data"
+                placeholder="请输入其他参数数据"
+              />
+            </el-form-item>
+            <div
+              v-if="
+                taskColumn.apiFrom.apiParameterRules &&
+                includesKey([
+                  'lonKey',
+                  'latKey',
+                  'outFileType',
+                  'inPrj',
+                  'outPrj',
+                  'compressionRatio',
+                ])
+              "
+            >
+              <template
+                v-for="(rulesItem, index) in taskColumn.apiFrom.apiParameterRules"
+                :key="index"
+              >
+                <el-form-item
+                  v-if="
+                    [
+                      'lonKey',
+                      'latKey',
+                      'outFileType',
+                      'inPrj',
+                      'outPrj',
+                      'compressionRatio',
+                    ].includes(rulesItem)
+                  "
+                  :label="rulesItem"
+                >
+                  <el-input
+                    v-if="['lonKey', 'latKey'].includes(rulesItem)"
+                    v-model="taskColumn.from.c_source_data[rulesItem]"
+                    placeholder="当文件为xlsx时必填"
+                  />
+                  <el-select
+                    v-if="
+                      ['outFileType', 'inPrj', 'outPrj', 'compressionRatio'].includes(
+                        rulesItem
+                      )
+                    "
+                    v-model="taskColumn.from.c_source_data[rulesItem]"
+                    :placeholder="'请选择' + rulesItem"
+                  >
+                    <el-option
+                      v-for="item in taskColumn.selectOptions[rulesItem]"
+                      :key="'wgn-task-selectOptions-form-' + item.label"
+                      :label="item.label"
+                      :value="item.value"
+                    />
+                  </el-select>
+                </el-form-item>
+              </template>
+            </div>
+            <!-- 任务状态默认为初始化 -->
+            <el-form-item label="任务状态" prop="c_state" v-show="false">
+              <el-select
+                disabled
+                v-model="taskColumn.from.c_state"
+                placeholder="请选择任务状态"
+              >
+                <el-option
+                  v-for="(name, index) in $store.state.DmsTypesMap['task_status']"
+                  :key="'wgn-task-form-' + index"
+                  :label="name"
+                  :value="index"
+                />
+              </el-select>
+            </el-form-item>
+            <!-- 任务负责人默认为当前登录用户 -->
+            <el-form-item label="用户id" prop="c_user_id" v-show="false">
+              <el-input disabled v-model="taskColumn.from.c_user_id" />
+            </el-form-item>
+            <!-- 任务负责人默认为当前登录用户 -->
+            <el-form-item label="用户名" prop="c_user_name" v-show="false">
+              <el-input disabled v-model="taskColumn.from.c_user_name" />
+            </el-form-item>
+          </el-form>
+          <template #footer>
+            <div class="dialog-footer">
+              <el-button @click="showTaskFrom = false">取消</el-button>
+              <el-button type="primary" @click="handleTaskSubmit">确定</el-button>
+            </div>
+          </template>
+        </el-dialog>
+      </div>
     </div>
-  </div>
+  </el-affix>
 </template>
 
 <script>
 import { ElNotification } from "element-plus";
+import moment from "moment";
 import api from "@/api/content";
 export default {
-  name: "微功能服务",
+  name: "ApplicationOverview",
   data() {
     return {
+      total: 0,
+      curUrl: systemConfig.dmsDataProxy,
       // 搜索关键词
       searchStr: "",
       // 微功能服务列表
       dmsServerList: [],
-      // DMS数据代理地址
-      dmsDataProxy: "",
       // 是否显示申请使用微功能服务的表单弹窗
       showFrom: false,
       // 是否显示创建任务的表单弹窗
@@ -443,6 +454,24 @@ export default {
               label: "WEB_Mercator",
             },
           ],
+          compressionRatio: [
+            {
+              value: "100%",
+              label: "100%",
+            },
+            {
+              value: "80%",
+              label: "80%",
+            },
+            {
+              value: "50%",
+              label: "50%",
+            },
+            {
+              value: "25%",
+              label: "25%",
+            },
+          ],
           outPrj: [
             {
               value: "WGS84",
@@ -486,7 +515,6 @@ export default {
     };
   },
   mounted() {
-    this.dmsDataProxy = systemConfig.dmsDataProxy;
     // 任务负责人默认为当前登录用户
     this.taskColumn.from.c_user_id = this.$store.state.userInfo.id;
     // 任务创建人用户名默认为当前登录用户用户名
@@ -590,6 +618,36 @@ export default {
         this.taskColumn.from.c_source_data = {};
       }
     },
+    // 申请使用微功能服务
+    handleApply(item) {
+      // 申请使用微功能服务时,先从localStorage中获取数据,填充到表单中
+      let applyInfo = localStorage.getItem("wgnApplyInfo");
+      if (applyInfo) {
+        this.column.from = JSON.parse(applyInfo);
+      }
+      // 先打开弹窗,显示from表单,用户输入表单数据并提交
+      this.column.from.c_interface_path = item.c_url;
+      this.showFrom = true;
+    },
+    // 在线演示微功能服务
+    handleOnlineDemo(item) {
+      let routerPath = {};
+      // 1. 解析目标路由(支持传参、命名路由等)
+      if (item.c_scene_name == "view") {
+        routerPath = {
+          path: item.c_url,
+        };
+        this.$router.push(routerPath);
+      } else {
+        routerPath = {
+          path: "/wgnSingle", // 微功能
+          query: { sceneId: item.c_scene_name },
+        };
+        const routeData = this.$router.resolve(routerPath);
+        // 2. 打开新窗口(_blank 表示新窗口)
+        window.open(routeData.href, "_blank");
+      }
+    },
     // 搜索微功能服务
     searchServerList() {
       // 添加防抖功能,避免频繁搜索导致性能问题
@@ -617,39 +675,83 @@ export default {
           .getSimpleContentList(requestParams)
           .then((res) => {
             if (res.code === 200) {
-              this.dmsServerList = res.content.data;
-              ElNotification.success({
-                title: "成功",
-                message: "搜索到" + this.dmsServerList.length + "条微功能服务",
-                offset: 80,
-              });
+              // 过滤掉自定义工具微功能服务1.5.8.1
+              this.dmsServerList = res.content.data.filter(
+                (item) => item.c_scene_name != "1.5.8.1"
+              );
+              // 转换时间格式
+              this.dmsServerList = this.dmsServerList.map((item) => ({
+                ...item,
+                createTime: moment(item.create_time).format("YYYY-MM-DD HH:mm:ss"),
+              }));
+              this.total = this.dmsServerList.length;
+              // ElNotification.success({
+              //   title: "成功",
+              //   message: "搜索到" + this.dmsServerList.length + "条微功能服务",
+              //   offset: 80,
+              // });
             } else {
-              ElNotification.error({
-                title: "失败",
-                message: "搜索到0条微功能服务",
-                offset: 80,
-              });
+              this.total = 0;
+              // ElNotification.error({
+              //   title: "失败",
+              //   message: "搜索到0条微功能服务",
+              //   offset: 80,
+              // });
             }
           })
           .catch((e) => {
-            ElNotification.error({
-              title: "失败",
-              message: "搜索微功能服务失败" + e,
-              offset: 80,
-            });
+            this.total = 0;
+            // ElNotification.error({
+            //   title: "失败",
+            //   message: "搜索微功能服务失败" + e,
+            //   offset: 80,
+            // });
           });
       }, 0);
     },
-    // 申请使用微功能服务
-    handleApply(item) {
-      // 申请使用微功能服务时,先从localStorage中获取数据,填充到表单中
-      let applyInfo = localStorage.getItem("wgnApplyInfo");
-      if (applyInfo) {
-        this.column.from = JSON.parse(applyInfo);
-      }
-      // 先打开弹窗,显示from表单,用户输入表单数据并提交
-      this.column.from.c_interface_path = item.c_url;
-      this.showFrom = true;
+    // 提交申请使用微功能服务表单
+    handleApplySubmit() {
+      let that = this;
+      this.$refs.formRef.validate((valid) => {
+        if (valid) {
+          // 提交时把信息添加到localStorage中,下次打开弹窗时,从localStorage中获取数据,填充到表单中
+          localStorage.setItem("wgnApplyInfo", JSON.stringify(that.column.from));
+          // 标题:电话+时间
+          that.column.from.title =
+            that.column.from.c_unit_name +
+            "_" +
+            that.column.from.c_business_leader +
+            "_" +
+            that.column.from.c_phone;
+          // 备注:申请使用微功能服务的详细信息
+          let params = {
+            content: JSON.stringify(that.column.from),
+            columnId: that.column.columnId,
+            modelId: that.column.modelId,
+          };
+          api.addContent(params).then((res) => {
+            if (res.code === 200) {
+              // 确认申请使用
+              that.$message({
+                message: "申请成功,请等待审核通过后工作人员专人联系,请保持电话通畅!",
+                type: "success",
+              });
+              that.showFrom = false;
+            } else {
+              that.$message({
+                message: "申请使用" + item.title + "失败" + res.msg,
+                type: "error",
+              });
+            }
+          });
+        } else {
+          // 表单验证失败,提示用户填写完整信息
+          that.$message({
+            message: "请填写完整信息",
+            type: "warning",
+          });
+        }
+      });
     },
     // 创建任务
     createTask() {
@@ -704,273 +806,256 @@ export default {
         }
       });
     },
-    // 提交申请使用微功能服务表单
-    handleApplySubmit() {
-      let that = this;
-      this.$refs.formRef.validate((valid) => {
-        if (valid) {
-          // 提交时把信息添加到localStorage中,下次打开弹窗时,从localStorage中获取数据,填充到表单中
-          localStorage.setItem("wgnApplyInfo", JSON.stringify(that.column.from));
-          // 标题:电话+时间
-          that.column.from.title =
-            that.column.from.c_unit_name +
-            "_" +
-            that.column.from.c_business_leader +
-            "_" +
-            that.column.from.c_phone;
-          // 备注:申请使用微功能服务的详细信息
-          let params = {
-            content: JSON.stringify(that.column.from),
-            columnId: that.column.columnId,
-            modelId: that.column.modelId,
-          };
-          api.addContent(params).then((res) => {
-            if (res.code === 200) {
-              // 确认申请使用
-              that.$message({
-                message: "申请成功,请等待审核通过后工作人员专人联系,请保持电话通畅!",
-                type: "success",
-              });
-              that.showFrom = false;
-            } else {
-              that.$message({
-                message: "申请使用" + item.title + "失败" + res.msg,
-                type: "error",
-              });
-            }
-          });
-        } else {
-          // 表单验证失败,提示用户填写完整信息
-          that.$message({
-            message: "请填写完整信息",
-            type: "warning",
-          });
-        }
-      });
-    },
-    // 在线演示微功能服务
-    handleOnlineDemo(item) {
-      let routerPath = {};
-      // 1. 解析目标路由(支持传参、命名路由等)
-      if (item.c_scene_name == "view") {
-        routerPath = {
-          path: item.c_url,
-        };
-        this.$router.push(routerPath);
-      } else {
-        routerPath = {
-          path: "/wgnSingle", // 微功能
-          query: { sceneId: item.c_scene_name },
-        };
-        const routeData = this.$router.resolve(routerPath);
-        // 2. 打开新窗口(_blank 表示新窗口)
-        window.open(routeData.href, "_blank");
-      }
-    },
   },
 };
 </script>
 
 <style lang="less" scoped>
-.wgn_box {
-  width: 100vw;
-  margin: 0 auto;
-  background-color: #08224a;
+.application-overview {
+  display: fixed !important;
+  width: 100%;
+  height: 100vh;
+  // background-color: #08224a;
+  background-color: #00002a;
+  color: #ffffff;
 }
-.server_title {
-  display: flex;
-  justify-content: center;
-  align-items: center;
+
+/* 右侧主内容区 */
+.main-content {
+  flex: 1;
+  padding: 20px 100px;
+  overflow-y: auto;
 }
-.server_title_text {
-  width: calc(77vw - 200px);
-  height: calc(100vh - 120px);
-  background-color: #1c2631;
-  color: #fff;
-  display: flex;
-  flex-direction: column;
-  justify-content: center;
-  overflow: hidden;
-  padding: 0 100px;
-  &_title {
-    font-size: 64px;
-    font-weight: bold;
-    // letter-spacing: 0.5rem;
+
+/* 搜索栏样式 */
+.search-bar {
+  margin-bottom: 20px;
+
+  .search-input {
+    width: 400px;
+
+    // ::v-deep .el-input__inner {
+    //   background-color: rgba(255, 255, 255, 0.1);
+    //   border: 1px solid rgba(255, 255, 255, 0.2);
+    //   color: #ffffff;
+
+    //   &::placeholder {
+    //     color: rgba(255, 255, 255, 0.6);
+    //   }
+    // }
+
+    // ::v-deep .el-input__prepend {
+    //   background-color: rgba(255, 255, 255, 0.1);
+    //   border-color: rgba(255, 255, 255, 0.2);
+    //   color: rgba(255, 255, 255, 0.8);
+    // }
   }
-  &_content {
-    margin-top: 77px;
-    font-size: 22px;
+  .search-btn {
+    margin-left: 10px;
   }
-  &_btu {
-    margin-top: 77px;
-    font-size: 22px;
-    // letter-spacing: 0.2rem;
-    color: #4095e5;
+}
+
+/* 过滤标签样式 */
+.filter-tabs {
+  margin-bottom: 30px;
+
+  :deep(.el-radio-group) {
+    .el-radio-button {
+      background-color: rgba(255, 255, 255, 0.1);
+      border-color: rgba(255, 255, 255, 0.2);
+      color: rgba(255, 255, 255, 0.8);
+
+      &:first-child .el-radio-button__inner {
+        border-left-color: rgba(255, 255, 255, 0.2);
+      }
+
+      .el-radio-button__inner {
+        background-color: transparent;
+        border-color: rgba(255, 255, 255, 0.2);
+        color: rgba(255, 255, 255, 0.8);
+      }
+
+      &.is-active {
+        background-color: #1890ff;
+
+        .el-radio-button__inner {
+          background-color: #1890ff;
+          border-color: #1890ff;
+          color: #ffffff;
+        }
+      }
+    }
   }
 }
-.anchor_box {
-  background: #ffffff32;
-  float: left;
+.wgn-content {
+  // height: 640px;
+  height: calc(100vh - 160px);
+  overflow: auto;
+  padding-right: 20px;
 }
-.server_list_box {
-  width: 100vw;
-  background-color: #00002e;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  color: #fff;
-  position: relative;
-  &_menu {
-    position: absolute;
-    top: 100px;
-    left: 10px;
-    z-index: 1;
+
+/* 应用卡片网格样式 */
+.applications-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
+  gap: 25px;
+}
+
+/* 应用卡片样式 */
+.application-card {
+  background-color: rgba(255, 255, 255, 0.05);
+  border: 1px solid rgba(255, 255, 255, 0.1);
+  border-radius: 8px;
+  overflow: hidden;
+  transition: all 0.3s ease;
+
+  &:hover {
+    transform: translateY(-5px);
+    box-shadow: 0 10px 30px rgba(24, 144, 255, 0.2);
+    border-color: rgba(24, 144, 255, 0.4);
   }
-  &_title {
-    margin: 100px 0;
-    font-size: 35px;
-    font-weight: bold;
+
+  .card-image {
+    width: 100%;
+    height: 160px;
+    overflow: hidden;
     position: relative;
-    &::after {
-      content: "";
-      position: absolute;
-      bottom: -12px;
-      left: 50%;
-      transform: translateX(-50%);
-      width: 100px;
-      height: 4px;
-      background-image: linear-gradient(to right, #1d88f0, #00bfff);
+
+    img {
+      width: 100%;
+      height: 100%;
+      object-fit: cover;
+      transition: transform 0.3s ease;
     }
+
+    // &:hover img {
+    //   transform: scale(1.05);
+    // }
   }
-  &_search {
-    // margin-top: 100px;
-    font-size: 25px;
+
+  .card-content {
+    padding: 15px;
+  }
+
+  .wgn-header {
     display: flex;
-    flex-wrap: nowrap;
+    justify-content: space-between;
     align-items: center;
-    width: -webkit-fill-available;
-    justify-content: center;
-    .input-with-select {
-      background: #08224a;
+    margin-bottom: 10px;
+
+    .wgn-name {
+      font-size: 16px;
+      font-weight: bold;
+      margin: 0;
+      color: #ffffff;
     }
-  }
-  &_table {
-    margin-top: 50px;
-    width: 100vw;
-    &_item {
-      display: flex;
-      justify-content: space-evenly;
-      align-items: center;
-      padding: 100px 0;
-
-      &:nth-child(odd) {
-        flex-direction: row;
-      }
-      &:nth-child(even) {
-        flex-direction: row-reverse;
-      }
-      &_content {
-        width: 760px;
-        height: 100px;
-        display: flex;
-        flex-direction: column;
-        justify-content: center;
-        align-items: center;
-        &_title {
-          font-size: 35px;
-          font-weight: bold;
-          color: #fff;
-        }
-        &_text {
-          margin-top: 35px;
-          font-size: 18px;
-        }
-        &_button_box {
-          display: flex;
-          justify-content: space-evenly;
-          width: 100%;
-          &_item {
-            margin-top: 35px;
-            font-size: 20px;
-            // letter-spacing: 0.2rem;
-            color: #4095e5;
-            border: 1px solid #4095e5;
-            border-radius: 10px;
-            padding: 10px 36px;
-            cursor: pointer;
-            &:hover {
-              background-color: #4095e5;
-              color: #fff;
-            }
-          }
-        }
-      }
-      &_image {
-        width: 690px;
-        display: flex;
-        justify-content: center;
-        align-items: center;
-        border-radius: 30px;
-        overflow: hidden;
-      }
+    .wgn-level {
+      font-size: 12px;
+      color: rgba(255, 255, 255, 0.6);
+      background-color: rgba(27, 117, 236, 0.8);
+      padding: 2px 6px;
+      border-radius: 4px;
+    }
+
+    .wgn-version {
+      font-size: 12px;
+      color: rgba(255, 255, 255, 0.6);
+      background-color: rgba(255, 255, 255, 0.1);
+      padding: 2px 6px;
+      border-radius: 4px;
     }
   }
-}
-/* 顶部横幅样式 */
-.banner {
-  width: 100%;
-  // height: calc(100vh - 120px);
-  height: 552px;
-  background: url('@static/images/wgn/bg.png');
-  background-size: cover;
-  display: flex;
-  justify-content: right;
-  align-items: start;
-  position: relative;
-  overflow: hidden;
 
-  .banner-content {
-    position: relative;
-    z-index: 2;
-    text-align: right;
-    max-width: 500px;
-    padding: 0 10%;
-    justify-content: right;
-    display: grid;
-    padding-top: 100px;
+  .wgn-tags {
+    margin-bottom: 10px;
+
+    .el-tag {
+      margin-right: 5px;
+      margin-bottom: 5px;
+    }
   }
 
-  .banner-title {
-    font-size: 56px;
-    font-weight: bold;
-    // letter-spacing: 0.5rem;
-    // margin-bottom: 20px;
-    color: #ffffff;
-    text-align: right;
-    text-shadow: 0 2px 10px rgba(0, 0, 0, 0.5);
+  .wgn-description {
+    font-size: 13px;
+    line-height: 1.6;
+    height: 40px;
+    color: rgba(255, 255, 255, 0.7);
+    margin-bottom: 15px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    display: -webkit-box;
+    -webkit-line-clamp: 2;
+    -webkit-box-orient: vertical;
   }
 
-  .banner-description {
-    font-size: 16px;
-    // line-height: 1.8;
-    margin: 20px 0px;
-    text-align: left;
-    color: rgba(255, 255, 255, 0.9);
+  .wgn-footer {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+
+    .wgn-date {
+      font-size: 12px;
+      color: rgba(255, 255, 255, 0.5);
+    }
+
+    .visit-button {
+      padding: 4px 12px;
+      font-size: 12px;
+      border-radius: 4px;
+    }
   }
+}
+
+/* 加载更多按钮 */
+.load-more {
+  text-align: center;
+  margin-bottom: 30px;
 
-  .enter-button {
-    padding: 12px 36px;
-    font-size: 18px;
-    border-radius: 10px;
-    background-color: #1890ff;
-    border: none;
-    transition: all 0.3s ease;
+  .el-button {
+    padding: 10px 30px;
+    background-color: rgba(24, 144, 255, 0.2);
+    border-color: rgba(24, 144, 255, 0.4);
+    color: #1890ff;
 
     &:hover {
-      background-color: #40a9ff;
-      transform: translateY(-2px);
-      box-shadow: 0 4px 12px rgba(24, 144, 255, 0.4);
+      background-color: rgba(24, 144, 255, 0.3);
+      border-color: rgba(24, 144, 255, 0.6);
+    }
+  }
+}
+
+/* 响应式设计 */
+@media (max-width: 1200px) {
+  .applications-grid {
+    grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
+    gap: 20px;
+  }
+}
+
+@media (max-width: 992px) {
+  .sidebar {
+    width: 180px;
+
+    .sidebar-menu .menu-item {
+      padding: 12px 15px;
+
+      i {
+        font-size: 16px;
+      }
     }
   }
+
+  .main-content {
+    padding: 15px 20px;
+  }
+
+  .search-input {
+    width: 300px !important;
+  }
+
+  .applications-grid {
+    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+    gap: 15px;
+  }
 }
 </style>

+ 976 - 0
src/views/WgnLast.vue

@@ -0,0 +1,976 @@
+<template>
+  <div class="wgn_box">
+    <!-- <div class="server_title">
+      <el-image
+        style="width: 50%; height: calc(100vh - 120px)"
+        src="static/images/wgn_title.png"
+        fit="cover"
+      />
+      <div class="server_title_text">
+        <div class="server_title_text_title">微功能服务</div>
+        <div class="server_title_text_content">
+          微功能子系统专注于提供强大的空间计算与数据处理能力,是支撑青浦区三维数字底板空间分析与数据流转的核心模块,聚焦
+          “精准计算 + 灵活处理”
+          两大核心能力,所有功能均以标准化服务接口形式对外提供(支持第三方委办、上层应用系统调用),同时在系统内部集成可视化操作界面,实现
+          “计算 - 分析 - 展示” 闭环。
+        </div>
+        <div class="server_title_text_btu" v-if="$getUserType() == 3"> -->
+          <!-- 先打开弹窗,然后上传文件保存信息到DMS的任务表,同时发送任务到微功能子系统,微功能子系统处理完成后,更新任务状态 -->
+          <!-- <el-button type="primary" round plain size="large" @click="createTask"
+            >大批量数据处理任务<el-icon><Position /></el-icon
+          ></el-button>
+        </div>
+      </div>
+    </div> -->
+
+    <!-- 顶部横幅区域 -->
+    <div class="banner">
+      <div class="banner-content">
+        <h1 class="banner-title">微功能服务</h1>
+        <p class="banner-description">
+          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;微功能子系统专注于提供强大的空间计算与数据处理能力,是支撑青浦区三维数字底板空间分析与数据流转的核心模块,聚焦“精准计算 + 灵活处理”两大核心能力,所有功能均以标准化服务接口形式对外提供(支持第三方委办、上层应用系统调用),同时在系统内部集成可视化操作界面,实现“计算 - 分析 - 展示” 闭环。
+        </p>
+        <div v-if="$getUserType() == 3">
+           <el-button type="primary" round plain size="large" @click="createTask"
+            >大批量数据处理任务<el-icon><Position /></el-icon
+          ></el-button>
+        </div>
+      </div>
+    </div>
+
+    <div class="server_list_box">
+      <div class="server_list_box_title">微功能列表</div>
+      <el-affix :offset="80">
+        <div class="server_list_box_search">
+          <el-input
+            v-model="searchStr"
+            style="width: 525px; margin-left: 37px"
+            placeholder="输入搜索关键词"
+            class="input-with-select"
+            clearable
+            size="large"
+            @change="searchServerList()"
+          >
+            <template #append>
+              <el-button icon="Search" @click="searchServerList()" />
+            </template>
+          </el-input>
+        </div>
+      </el-affix>
+      <div class="server_list_box_table" v-if="dmsServerList">
+        <div
+          v-for="item in dmsServerList"
+          :key="item.c_scene_name"
+          class="server_list_box_table_item"
+          :id="item.c_scene_name + 'list'"
+        >
+          <div class="server_list_box_table_item_content">
+            <div class="server_list_box_table_item_content_title">{{ item.title }}</div>
+            <div class="server_list_box_table_item_content_text">{{ item.content }}</div>
+            <div class="server_list_box_table_item_content_button_box">
+              <div
+                class="server_list_box_table_item_content_button_box_item"
+                @click.stop="handleOnlineDemo(item)"
+              >
+                在线演示
+              </div>
+              <div
+                class="server_list_box_table_item_content_button_box_item"
+                @click.stop="handleApply(item)"
+              >
+                申请使用
+              </div>
+            </div>
+          </div>
+          <div class="server_list_box_table_item_image">
+            <el-image
+              style="width: 690px; height: 410px"
+              :src="dmsDataProxy + item.c_picture"
+              fit="cover"
+            />
+          </div>
+        </div>
+      </div>
+      <!-- 申请使用微功能服务的表单弹窗 -->
+      <el-dialog
+        title="申请使用微功能服务"
+        v-model="showFrom"
+        width="60%"
+        :close-on-click-modal="false"
+        :close-on-press-escape="false"
+        :show-close="true"
+      >
+        <el-form :model="column.from" :rules="rules" ref="formRef" label-width="120px">
+          <el-form-item label="应用名称" prop="c_application_name">
+            <el-input
+              v-model="column.from.c_application_name"
+              placeholder="请输入应用名称"
+            />
+          </el-form-item>
+          <el-form-item label="接口路径" prop="c_interface_path">
+            <el-input
+              v-model="column.from.c_interface_path"
+              disabled
+              placeholder="请输入接口路径"
+            />
+          </el-form-item>
+          <el-form-item label="联系电话" prop="c_phone">
+            <el-input v-model="column.from.c_phone" placeholder="请输入联系电话" />
+          </el-form-item>
+          <el-form-item label="单位名称" prop="c_unit_name">
+            <el-input v-model="column.from.c_unit_name" placeholder="请输入单位名称" />
+          </el-form-item>
+          <el-form-item label="部门名称" prop="c_department">
+            <el-input v-model="column.from.c_department" placeholder="请输入部门名称" />
+          </el-form-item>
+          <!-- 项目负责人 -->
+          <el-form-item label="项目负责人" prop="c_business_leader">
+            <el-input
+              v-model="column.from.c_business_leader"
+              placeholder="请输入项目负责人"
+            />
+          </el-form-item>
+          <!-- 申请使用微功能服务的详细信息 -->
+          <el-form-item label="申请使用微功能服务的详细信息" prop="content">
+            <el-input
+              type="textarea"
+              v-model="column.from.content"
+              placeholder="请输入申请使用微功能服务的详细信息"
+            />
+          </el-form-item>
+        </el-form>
+        <template #footer>
+          <div class="dialog-footer">
+            <el-button @click="showFrom = false">取消</el-button>
+            <el-button type="primary" @click="handleApplySubmit">确定</el-button>
+          </div>
+        </template>
+      </el-dialog>
+      <!-- 创建任务的表单弹窗 -->
+      <el-dialog
+        title="创建任务"
+        v-model="showTaskFrom"
+        width="60%"
+        :close-on-click-modal="false"
+        :close-on-press-escape="false"
+        :show-close="true"
+      >
+        <el-form
+          :model="taskColumn.from"
+          :rules="taskColumn.rules"
+          ref="taskFormRef"
+          label-width="120px"
+        >
+          <el-form-item label="任务名称" prop="c_name">
+            <el-input
+              v-model="taskColumn.from.c_name"
+              placeholder="请输入任务名称"
+              clearable
+            >
+              <template #prepend>{{
+                $moment(new Date()).format("YYMMDD_HHmm") +
+                "_" +
+                (taskColumn.from.c_type
+                  ? $getDmsTypes("yzt_task_type", taskColumn.from.c_type) + "_"
+                  : "")
+              }}</template>
+            </el-input>
+          </el-form-item>
+          <el-form-item label="任务备注" prop="c_comment">
+            <el-input
+              type="textarea"
+              clearable
+              v-model="taskColumn.from.c_comment"
+              placeholder="请输入任务备注"
+            />
+          </el-form-item>
+          <!-- 下拉框选择任务类型 -->
+          <el-form-item label="任务类型" prop="c_type">
+            <el-select
+              v-model="taskColumn.from.c_type"
+              @change="changeTaskType"
+              placeholder="请选择任务类型"
+            >
+              <el-option
+                v-for="(name, index) in $store.state.DmsTypesMap['yzt_task_type']"
+                :key="index"
+                :label="name"
+                :value="index"
+              />
+            </el-select>
+          </el-form-item>
+          <!-- 渲染任务描述:仅查看 -->
+          <el-form-item
+            label="任务描述"
+            prop="apiDescription"
+            v-if="taskColumn.apiFrom.apiDescription"
+          >
+            <el-input
+              type="textarea"
+              disabled
+              v-model="taskColumn.apiFrom.apiDescription"
+            />
+          </el-form-item>
+          <!-- 任务文件是必须的 -->
+          <el-form-item label="任务文件" prop="c_source_file">
+            <el-input disabled v-model="taskColumn.from.c_source_file" v-show="false" />
+            <el-upload class="avatar-uploader" :http-request="handleTCUpload" :limit="1">
+              <el-button size="small" type="primary">点击上传</el-button>
+            </el-upload>
+          </el-form-item>
+          <el-divider />
+          <!-- 其他参数数据 -->
+          <el-form-item label="其他参数数据" prop="c_source_data" v-show="false">
+            <el-input
+              type="textarea"
+              clearable
+              v-model="taskColumn.from.c_source_data"
+              placeholder="请输入其他参数数据"
+            />
+          </el-form-item>
+          <div
+            v-if="
+              taskColumn.apiFrom.apiParameterRules &&
+              includesKey(['lonKey', 'latKey', 'outFileType', 'inPrj', 'outPrj'])
+            "
+          >
+            <template
+              v-for="(rulesItem, index) in taskColumn.apiFrom.apiParameterRules"
+              :key="index"
+            >
+              <el-form-item
+                v-if="
+                  ['lonKey', 'latKey', 'outFileType', 'inPrj', 'outPrj'].includes(
+                    rulesItem
+                  )
+                "
+                :label="rulesItem"
+              >
+                <el-input
+                  v-if="['lonKey', 'latKey'].includes(rulesItem)"
+                  v-model="taskColumn.from.c_source_data[rulesItem]"
+                  placeholder="当文件为xlsx时必填"
+                />
+                <el-select
+                  v-if="['outFileType', 'inPrj', 'outPrj'].includes(rulesItem)"
+                  v-model="taskColumn.from.c_source_data[rulesItem]"
+                  :placeholder="'请选择' + rulesItem"
+                >
+                  <el-option
+                    v-for="item in taskColumn.selectOptions[rulesItem]"
+                    :key="'wgn-task-selectOptions-form-' + item.label"
+                    :label="item.label"
+                    :value="item.value"
+                  />
+                </el-select>
+              </el-form-item>
+            </template>
+          </div>
+          <!-- 任务状态默认为初始化 -->
+          <el-form-item label="任务状态" prop="c_state" v-show="false">
+            <el-select
+              disabled
+              v-model="taskColumn.from.c_state"
+              placeholder="请选择任务状态"
+            >
+              <el-option
+                v-for="(name, index) in $store.state.DmsTypesMap['task_status']"
+                :key="'wgn-task-form-' + index"
+                :label="name"
+                :value="index"
+              />
+            </el-select>
+          </el-form-item>
+          <!-- 任务负责人默认为当前登录用户 -->
+          <el-form-item label="用户id" prop="c_user_id" v-show="false">
+            <el-input disabled v-model="taskColumn.from.c_user_id" />
+          </el-form-item>
+          <!-- 任务负责人默认为当前登录用户 -->
+          <el-form-item label="用户名" prop="c_user_name" v-show="false">
+            <el-input disabled v-model="taskColumn.from.c_user_name" />
+          </el-form-item>
+        </el-form>
+        <template #footer>
+          <div class="dialog-footer">
+            <el-button @click="showTaskFrom = false">取消</el-button>
+            <el-button type="primary" @click="handleTaskSubmit">确定</el-button>
+          </div>
+        </template>
+      </el-dialog>
+    </div>
+  </div>
+</template>
+
+<script>
+import { ElNotification } from "element-plus";
+import api from "@/api/content";
+export default {
+  name: "微功能服务",
+  data() {
+    return {
+      // 搜索关键词
+      searchStr: "",
+      // 微功能服务列表
+      dmsServerList: [],
+      // DMS数据代理地址
+      dmsDataProxy: "",
+      // 是否显示申请使用微功能服务的表单弹窗
+      showFrom: false,
+      // 是否显示创建任务的表单弹窗
+      showTaskFrom: false,
+      // 申请使用微功能服务的表单验证规则
+      rules: {
+        c_application_name: [
+          { required: true, message: "请输入应用名称", trigger: "blur" },
+        ],
+        c_interface_path: [
+          { required: true, message: "请输入接口路径", trigger: "blur" },
+        ],
+        c_business_leader: [
+          { required: true, message: "请输入项目负责人", trigger: "blur" },
+        ],
+        // 添加手机号正则验证
+        c_phone: [
+          { required: true, message: "请输入联系电话", trigger: "blur" },
+          {
+            validator: (rule, value, callback) => {
+              // 手机号正则验证
+              let phoneRegex = /^1[3456789]\d{9}$/;
+              if (!phoneRegex.test(value)) {
+                callback(new Error("请输入正确的手机号"));
+              } else {
+                callback();
+              }
+            },
+            trigger: "blur",
+          },
+        ],
+        c_unit_name: [{ required: true, message: "请输入单位名称", trigger: "blur" }],
+        c_department: [{ required: true, message: "请输入部门名称", trigger: "blur" }],
+      },
+      // 申请使用微功能服务的表单数据
+      column: {
+        columnId: systemConfig.columnIds[4],
+        modelId: systemConfig.modelIds[2],
+        from: {
+          // 备注:申请使用微功能服务的详细信息,非必填
+          content: "",
+          // 项目负责人,必填
+          c_business_leader: "",
+          // 应用名称,必填
+          c_application_name: "",
+          // 接口路径,必填
+          c_interface_path: "",
+          // 联系电话,必填
+          c_phone: "",
+          // 单位名称,必填
+          c_unit_name: "",
+          // 部门名称,必填
+          c_department: "",
+        },
+      },
+      // 创建任务的表单数据
+      taskColumn: {
+        columnId: systemConfig.columnIds[6],
+        modelId: systemConfig.modelIds[3],
+        rules: {
+          c_name: [{ required: true, message: "请输入任务名称", trigger: "blur" }],
+          c_comment: [{ required: true, message: "请输入任务备注", trigger: "blur" }],
+          c_type: [{ required: true, message: "请选择任务类型", trigger: "change" }],
+          c_source_file: [
+            { required: true, message: "请上传任务文件", trigger: "change" },
+          ],
+        },
+        from: {
+          title: "",
+          content: "",
+          // 任务名称,必填(默认应该是:日期-任务类型-用户自定义名称),这里保存的就是用户自定义名称,提交的时候会自动补充日期-任务类型-
+          c_name: "",
+          // 备注:任务的详细信息,必填
+          c_comment: "",
+          // 任务类型,必填
+          c_type: "",
+          // 任务创建人用户名,必填
+          c_user_name: "",
+          // 任务创建人,必填
+          c_user_id: "",
+          // 任务文件,必填
+          c_source_file: "",
+          // 任务文件名,上传文件时自动带入
+          c_source_file_name: "",
+          // 其他参数数据
+          c_source_data: {},
+          // 申请状态,默认初始化【0:初始化;1:运行中;2:成功完成;3:异常中断】
+          c_state: "0",
+        },
+        // 切换任务类型时,渲染的接口详情
+        apiFrom: {
+          // 任务描述,仅查看
+          apiDescription: "",
+          // 接口参数,仅查看
+          apiParameterRules: [],
+          // 接口路径
+          apiUrl: "",
+        },
+        // 其他参数
+        selectOptions: {
+          // 单位
+          unit: [
+            {
+              value: "METER",
+              label: "米",
+            },
+            {
+              value: "KILOMETER",
+              label: "千米",
+            },
+          ],
+          inPrj: [
+            {
+              value: "WGS84",
+              label: "WGS84",
+            },
+            {
+              value: "SH2000",
+              label: "SH2000",
+            },
+            {
+              value: "UTM",
+              label: "UTM",
+            },
+            {
+              value: "WEB_Mercator",
+              label: "WEB_Mercator",
+            },
+          ],
+          outPrj: [
+            {
+              value: "WGS84",
+              label: "WGS84",
+            },
+            {
+              value: "SH2000",
+              label: "SH2000",
+            },
+            {
+              value: "UTM",
+              label: "UTM",
+            },
+            {
+              value: "WEB_Mercator",
+              label: "WEB_Mercator",
+            },
+          ],
+          outFileType: [
+            {
+              value: "geoJson",
+              label: "geoJson",
+            },
+            {
+              value: "shp",
+              label: "shp",
+            },
+            {
+              value: "csv",
+              label: "csv",
+            },
+            {
+              value: "xlsx",
+              label: "xlsx",
+            },
+          ],
+        },
+      },
+      // 搜索微功能服务的防抖定时器
+      searchTimeout: null,
+    };
+  },
+  mounted() {
+    this.dmsDataProxy = systemConfig.dmsDataProxy;
+    // 任务负责人默认为当前登录用户
+    this.taskColumn.from.c_user_id = this.$store.state.userInfo.id;
+    // 任务创建人用户名默认为当前登录用户用户名
+    this.taskColumn.from.c_user_name = this.$store.state.userInfo.username;
+    this.searchServerList();
+  },
+  methods: {
+    includesKey(keys) {
+      let hasKey = false;
+      keys.forEach((key) => {
+        if (this.taskColumn.apiFrom.apiParameterRules.includes(key)) {
+          hasKey = true;
+        }
+      });
+      return hasKey;
+    },
+    handleTCUpload(emit) {
+      // 上传任务文件
+      let formData = new FormData();
+      formData.append("file", emit.file);
+      formData.append("columnId", this.taskColumn.columnId);
+      formData.append("type", 0);
+      formData.append("paraName", emit.file.name);
+      api
+        .uploadFile(formData)
+        .then((res) => {
+          if (res.code === 200) {
+            this.taskColumn.from.c_source_file_name = emit.file.name;
+            this.taskColumn.from.c_source_file = res.content;
+            ElNotification.success({
+              title: "成功",
+              message: "上传任务文件成功",
+              offset: 80,
+            });
+          } else {
+            ElNotification.error({
+              title: "失败",
+              message: "上传任务文件失败" + res.msg,
+              offset: 80,
+            });
+          }
+        })
+        .catch((e) => {
+          ElNotification.error({
+            title: "失败",
+            message: "上传任务文件失败" + e,
+            offset: 80,
+          });
+        });
+    },
+    changeTaskType() {
+      if (this.taskColumn.from.c_type) {
+        // 先把任务类型每个字符中间都添加一个句号
+        let serviceId = this.taskColumn.from.c_type.split("").join(".");
+        // 根据任务类型获取任务参数
+        api
+          .getSimpleContentList({
+            columnId: systemConfig.columnIds[5],
+            states: 0,
+            pageSize: 1,
+            page: 0,
+            search: JSON.stringify([
+              {
+                field: "c_scene_name",
+                searchType: 1,
+                content: { value: serviceId },
+              },
+            ]),
+          })
+          .then((res) => {
+            if (res.code === 200) {
+              let apiInfo = res.content.data[0];
+              // 接口描述
+              this.taskColumn.apiFrom.apiDescription = apiInfo.content;
+              // 接口参数规则
+              this.taskColumn.apiFrom.apiParameterRules = JSON.parse(
+                apiInfo.c_input_parameter_rules
+              );
+              // 接口路径
+              this.taskColumn.apiFrom.apiUrl = apiInfo.c_url;
+            } else {
+              this.taskColumn.apiFrom.apiDescription = "";
+              this.taskColumn.apiFrom.apiParameterRules = [];
+              this.taskColumn.apiFrom.apiUrl = "";
+              ElNotification.error({
+                title: "失败",
+                message: "获取任务参数失败" + res.msg,
+                offset: 80,
+              });
+            }
+          })
+          .catch((e) => {
+            this.taskColumn.apiFrom.apiDescription = "";
+            this.taskColumn.apiFrom.apiParameterRules = "";
+            ElNotification.error({
+              title: "失败",
+              message: "获取任务参数失败" + e,
+              offset: 80,
+            });
+          });
+        this.taskColumn.from.c_source_data = {};
+      }
+    },
+    // 搜索微功能服务
+    searchServerList() {
+      // 添加防抖功能,避免频繁搜索导致性能问题
+      if (this.searchTimeout != null) {
+        clearTimeout(this.searchTimeout);
+      }
+      this.searchTimeout = setTimeout(() => {
+        let requestParams = {
+          columnId: systemConfig.columnIds[5],
+          states: 0,
+          pageSize: 999,
+          page: 0,
+        };
+        if (this.searchStr) {
+          requestParams.search = JSON.stringify([
+            {
+              field: "title",
+              searchType: 2,
+              content: { value: "%" + this.searchStr + "%" },
+            },
+          ]);
+        }
+        // 获取微功能服务列表
+        api
+          .getSimpleContentList(requestParams)
+          .then((res) => {
+            if (res.code === 200) {
+              this.dmsServerList = res.content.data;
+              ElNotification.success({
+                title: "成功",
+                message: "搜索到" + this.dmsServerList.length + "条微功能服务",
+                offset: 80,
+              });
+            } else {
+              ElNotification.error({
+                title: "失败",
+                message: "搜索到0条微功能服务",
+                offset: 80,
+              });
+            }
+          })
+          .catch((e) => {
+            ElNotification.error({
+              title: "失败",
+              message: "搜索微功能服务失败" + e,
+              offset: 80,
+            });
+          });
+      }, 0);
+    },
+    // 申请使用微功能服务
+    handleApply(item) {
+      // 申请使用微功能服务时,先从localStorage中获取数据,填充到表单中
+      let applyInfo = localStorage.getItem("wgnApplyInfo");
+      if (applyInfo) {
+        this.column.from = JSON.parse(applyInfo);
+      }
+      // 先打开弹窗,显示from表单,用户输入表单数据并提交
+      this.column.from.c_interface_path = item.c_url;
+      this.showFrom = true;
+    },
+    // 创建任务
+    createTask() {
+      // 打开弹窗,显示任务创建表单
+      this.showTaskFrom = true;
+    },
+    // 提交任务创建表单
+    handleTaskSubmit() {
+      let that = this;
+      // 表单验证
+      this.$refs.taskFormRef.validate((valid) => {
+        if (valid) {
+          let content = this.taskColumn.from;
+          content.title =
+            this.$moment(new Date()).format("YYMMDD_HHmm") +
+            "_" +
+            (this.taskColumn.from.c_type
+              ? this.$getDmsTypes("yzt_task_type", this.taskColumn.from.c_type) + "_"
+              : "") +
+            content.c_name;
+          content.content = this.taskColumn.apiFrom.apiDescription
+            ? this.taskColumn.apiFrom.apiDescription
+            : "";
+          content.c_name = content.title;
+          // 提交任务创建表单
+          let params = {
+            content: JSON.stringify(content),
+            columnId: this.taskColumn.columnId,
+            modelId: this.taskColumn.modelId,
+          };
+          api.addContent(params).then((res) => {
+            if (res.code === 200) {
+              that.$message({
+                message: "任务创建成功",
+                type: "success",
+              });
+              // 不直接开始任务,需要到任务管理页面启动
+              that.showTaskFrom = false;
+            } else {
+              that.$message({
+                message: "任务创建失败" + res.msg,
+                type: "error",
+              });
+            }
+          });
+        } else {
+          // 表单验证失败,提示用户填写完整信息
+          that.$message({
+            message: "请填写完整信息",
+            type: "warning",
+          });
+        }
+      });
+    },
+    // 提交申请使用微功能服务表单
+    handleApplySubmit() {
+      let that = this;
+      this.$refs.formRef.validate((valid) => {
+        if (valid) {
+          // 提交时把信息添加到localStorage中,下次打开弹窗时,从localStorage中获取数据,填充到表单中
+          localStorage.setItem("wgnApplyInfo", JSON.stringify(that.column.from));
+          // 标题:电话+时间
+          that.column.from.title =
+            that.column.from.c_unit_name +
+            "_" +
+            that.column.from.c_business_leader +
+            "_" +
+            that.column.from.c_phone;
+          // 备注:申请使用微功能服务的详细信息
+          let params = {
+            content: JSON.stringify(that.column.from),
+            columnId: that.column.columnId,
+            modelId: that.column.modelId,
+          };
+          api.addContent(params).then((res) => {
+            if (res.code === 200) {
+              // 确认申请使用
+              that.$message({
+                message: "申请成功,请等待审核通过后工作人员专人联系,请保持电话通畅!",
+                type: "success",
+              });
+              that.showFrom = false;
+            } else {
+              that.$message({
+                message: "申请使用" + item.title + "失败" + res.msg,
+                type: "error",
+              });
+            }
+          });
+        } else {
+          // 表单验证失败,提示用户填写完整信息
+          that.$message({
+            message: "请填写完整信息",
+            type: "warning",
+          });
+        }
+      });
+    },
+    // 在线演示微功能服务
+    handleOnlineDemo(item) {
+      let routerPath = {};
+      // 1. 解析目标路由(支持传参、命名路由等)
+      if (item.c_scene_name == "view") {
+        routerPath = {
+          path: item.c_url,
+        };
+        this.$router.push(routerPath);
+      } else {
+        routerPath = {
+          path: "/wgnSingle", // 微功能
+          query: { sceneId: item.c_scene_name },
+        };
+        const routeData = this.$router.resolve(routerPath);
+        // 2. 打开新窗口(_blank 表示新窗口)
+        window.open(routeData.href, "_blank");
+      }
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.wgn_box {
+  width: 100vw;
+  margin: 0 auto;
+  background-color: #08224a;
+}
+.server_title {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.server_title_text {
+  width: calc(77vw - 200px);
+  height: calc(100vh - 120px);
+  background-color: #1c2631;
+  color: #fff;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  overflow: hidden;
+  padding: 0 100px;
+  &_title {
+    font-size: 64px;
+    font-weight: bold;
+    // letter-spacing: 0.5rem;
+  }
+  &_content {
+    margin-top: 77px;
+    font-size: 22px;
+  }
+  &_btu {
+    margin-top: 77px;
+    font-size: 22px;
+    // letter-spacing: 0.2rem;
+    color: #4095e5;
+  }
+}
+.anchor_box {
+  background: #ffffff32;
+  float: left;
+}
+.server_list_box {
+  width: 100vw;
+  background-color: #00002e;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  color: #fff;
+  position: relative;
+  &_menu {
+    position: absolute;
+    top: 100px;
+    left: 10px;
+    z-index: 1;
+  }
+  &_title {
+    margin: 100px 0;
+    font-size: 35px;
+    font-weight: bold;
+    position: relative;
+    &::after {
+      content: "";
+      position: absolute;
+      bottom: -12px;
+      left: 50%;
+      transform: translateX(-50%);
+      width: 100px;
+      height: 4px;
+      background-image: linear-gradient(to right, #1d88f0, #00bfff);
+    }
+  }
+  &_search {
+    // margin-top: 100px;
+    font-size: 25px;
+    display: flex;
+    flex-wrap: nowrap;
+    align-items: center;
+    width: -webkit-fill-available;
+    justify-content: center;
+    .input-with-select {
+      background: #08224a;
+    }
+  }
+  &_table {
+    margin-top: 50px;
+    width: 100vw;
+    &_item {
+      display: flex;
+      justify-content: space-evenly;
+      align-items: center;
+      padding: 100px 0;
+
+      &:nth-child(odd) {
+        flex-direction: row;
+      }
+      &:nth-child(even) {
+        flex-direction: row-reverse;
+      }
+      &_content {
+        width: 760px;
+        height: 100px;
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+        &_title {
+          font-size: 35px;
+          font-weight: bold;
+          color: #fff;
+        }
+        &_text {
+          margin-top: 35px;
+          font-size: 18px;
+        }
+        &_button_box {
+          display: flex;
+          justify-content: space-evenly;
+          width: 100%;
+          &_item {
+            margin-top: 35px;
+            font-size: 20px;
+            // letter-spacing: 0.2rem;
+            color: #4095e5;
+            border: 1px solid #4095e5;
+            border-radius: 10px;
+            padding: 10px 36px;
+            cursor: pointer;
+            &:hover {
+              background-color: #4095e5;
+              color: #fff;
+            }
+          }
+        }
+      }
+      &_image {
+        width: 690px;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        border-radius: 30px;
+        overflow: hidden;
+      }
+    }
+  }
+}
+/* 顶部横幅样式 */
+.banner {
+  width: 100%;
+  // height: calc(100vh - 120px);
+  height: 552px;
+  background: url('@static/images/wgn/bg.png');
+  background-size: cover;
+  display: flex;
+  justify-content: right;
+  align-items: start;
+  position: relative;
+  overflow: hidden;
+
+  .banner-content {
+    position: relative;
+    z-index: 2;
+    text-align: right;
+    max-width: 500px;
+    padding: 0 10%;
+    justify-content: right;
+    display: grid;
+    padding-top: 100px;
+  }
+
+  .banner-title {
+    font-size: 56px;
+    font-weight: bold;
+    // letter-spacing: 0.5rem;
+    // margin-bottom: 20px;
+    color: #ffffff;
+    text-align: right;
+    text-shadow: 0 2px 10px rgba(0, 0, 0, 0.5);
+  }
+
+  .banner-description {
+    font-size: 16px;
+    // line-height: 1.8;
+    margin: 20px 0px;
+    text-align: left;
+    color: rgba(255, 255, 255, 0.9);
+  }
+
+  .enter-button {
+    padding: 12px 36px;
+    font-size: 18px;
+    border-radius: 10px;
+    background-color: #1890ff;
+    border: none;
+    transition: all 0.3s ease;
+
+    &:hover {
+      background-color: #40a9ff;
+      transform: translateY(-2px);
+      box-shadow: 0 4px 12px rgba(24, 144, 255, 0.4);
+    }
+  }
+}
+</style>

+ 5 - 4
src/views/Yxgl.vue

@@ -1,6 +1,6 @@
 <template>
   <el-affix :offset="0">
-    <div style="height: 44px;width: 100vw;background: #08224a;"></div>
+    <div style="height: 44px;width: 100vw;background: #00002a;"></div>
   </el-affix>
   <el-affix :offset="44">
   <div id="yxgl_box">
@@ -41,7 +41,7 @@
       class="viewBox"
       :style="{
         width: isCollapse ? 'calc(100vw - 60px)' : 'calc(100% - 200px)',
-        background: menuActive == 'StatisticalAnalysis' ? '#08224a' : '#08224a',
+        background: menuActive == 'StatisticalAnalysis' ? '#00002a' : '#00002a',
         overflowY: menuActive == 'StatisticalAnalysis' ? 'auto' : 'hidden',
       }"
     >
@@ -119,7 +119,8 @@ export default {
   // height: calc(100vh - 120px);
   height: 100vh;
   margin: 0;
-  background: #08224a;
+  background: #00002a;
+  border-right: 1px solid rgba(255, 255, 255, 0.1);
 }
 .viewBox {
   width: calc(100vw - 200px);
@@ -134,6 +135,6 @@ export default {
 iframe {
   width: 100%;
   height: calc(100%);
-  background: #08224a;
+  background: #00002a;
 }
 </style>

+ 140 - 36
src/views/rwgl/Index.vue

@@ -1,10 +1,10 @@
 <template>
   <el-affix :offset="0">
-    <div style="height: 44px; width: 100vw; background: #08224a"></div>
+    <div style="height: 44px; width: 100vw; background: #00002a"></div>
   </el-affix>
   <el-affix :offset="44">
     <div class="blue-background">
-      <div class="lighter-container">
+      <div style="padding: 0px 20px;margin: 0px 15px;">
         <div class="left-row">
           <div>
             <span>状态:</span>
@@ -27,17 +27,6 @@
               >
                 {{ status.name }}
               </el-tag>
-              <template v-for="status in taskStatus" :key="status.index">
-                <el-tag
-                  size="large"
-                  :effect="focusTaskStatus.includes(status.index) ? 'dark' : ''"
-                  type="primary"
-                  @click="changeTaskStatus(status)"
-                  style="cursor: pointer; margin: 10px 5px"
-                >
-                  {{ status.name }}
-                </el-tag>
-              </template>
             </template>
           </div>
           <div>
@@ -63,8 +52,18 @@
               </el-tag>
             </template>
           </div>
+          <div class="row-search">
+            <el-input
+              size="mini"
+              class="searcher"
+              v-model="searcher"
+              placeholder="请输入任务名称相关关键字"
+            />
+            <el-button type="primary" @click="pullTaskData(1)">搜索</el-button>
+            <el-button class="reset-btn" @click="reset(), pullTaskData(1)">重置</el-button>
+          </div>
         </div>
-        <div class="row">
+        <!-- <div class="row">
           <el-input
             class="searcher"
             v-model="searcher"
@@ -72,11 +71,16 @@
           />
           <el-button type="primary" @click="pullTaskData(1)">搜索</el-button>
           <el-button type="primary" @click="reset(), pullTaskData(1)">重置</el-button>
-        </div>
+        </div> -->
       </div>
       <div class="lighter-container">
-        <div style="padding-bottom: 10px">查询到{{ taskNum }}条任务</div>
-        <el-table table-layout="fixed" row-key="main_id" :data="taskData" class="table">
+        <!-- <div style="padding-bottom: 10px">检索出{{ taskNum }}条任务</div> -->
+        <el-table table-layout="fixed" row-key="main_id" :data="taskData" class="table" 
+        :header-cell-style="headerCellStyle"
+        :row-style="rowStyle"
+        :cell-style="cellStyle"
+        stripe
+        border>
           <el-table-column prop="main_c_name" label="名称" />
           <el-table-column prop="main_c_user_name" label="用户" />
           <el-table-column prop="main_c_state" label="类型">
@@ -143,6 +147,13 @@
               >
                 运行
               </el-button>
+              <el-button
+                v-if="scope.row.main_c_state == 3"
+                type="warning"
+                @click="runTask(scope.row.main_id)"
+              >
+                重试
+              </el-button>
               <template
                 v-if="scope.row.main_c_file != null && scope.row.main_c_file_name != null"
               >
@@ -161,13 +172,24 @@
             </template>
           </el-table-column>
         </el-table>
-        <div class="between-row pagination-container">
-          <div><!--empty div--></div>
+        <!-- <div class="between-row pagination-container">
+          <div></div>
           <el-pagination
             layout="prev, pager, next"
             :total="taskNum"
             @change="(page) => pullTaskData(page)"
           />
+        </div> -->
+        <div class="between-row pagination-container">
+          <span class="total-text">检索出{{ taskNum }}条任务</span>
+          <el-pagination
+            layout="prev, pager, next, jumper, total"
+            :total="taskNum"
+            :current-page="page"
+            :page-size="pageSize"
+            @current-change="pullTaskData"
+          >
+          </el-pagination>
         </div>
       </div>
       <el-dialog v-model="dialog" :show-close="true" width="750">
@@ -234,6 +256,15 @@
                 预览结果
               </el-button>
             </template>
+            <el-button
+              v-if="focusTask.main_c_state == 3"
+              type="warning"
+              size="small"
+              style="margin-left: 8px"
+              @click="runTask(focusTask.main_id)"
+            >
+              重新执行
+            </el-button>
           </el-descriptions-item>
           <el-descriptions-item label="原始数据">
             <template
@@ -287,8 +318,35 @@ export default {
       focusTask: {},
       dialog: false,
       page: 1,
+      pageSize: 10,
       tableHeight: 0,
     };
+  },
+   computed: {
+    headerCellStyle() {
+      return {
+        // backgroundColor: "rgba(24, 144, 255, 0.25)",
+        color: "#fff",
+        fontWeight: "bold",
+        // borderBottom: "2px solid rgba(24, 144, 255, 0.3)",
+        padding: "12px 8px",
+      };
+    },
+    rowStyle() {
+      return {
+        // 调整行背景色为更浅的黑色,增加透明度
+        backgroundColor: "rgba(0, 0, 0, 0.05)",
+        borderBottom: "1px solid rgba(255, 255, 255, 0.05)",
+        transition: "all 0.3s ease",
+      };
+    },
+    cellStyle() {
+      return {
+        color: "#e0e0e0",
+        padding: "12px 8px",
+        borderRight: "1px solid rgba(255, 255, 255, 0.05)",
+      };
+    },
   },
   mounted() {
     this.pullTaskStatus();
@@ -399,7 +457,7 @@ export default {
       if (page != null) this.page = page;
       let res = await getTasks(
         this.page,
-        10,
+        this.pageSize,
         this.searcher,
         this.getCheckedStatus(),
         this.getCheckedType()
@@ -498,17 +556,56 @@ export default {
 </script>
 
 <style lang="less" scoped>
-* {
-  --el-table-bg-color: #eeeeee0b;
-  /* 表格背景 */
-  --el-table-header-bg-color: #eeeeee0b;
-  /* 表头背景 */
-  --el-table-tr-bg-color: #eeeeee0b;
-  /* 行背景 */
-  --el-table-row-hover-bg-color: #eeeeee0b;
-  /* 行悬浮背景 */
-  --el-table-header-text-color: #ededed;
-  /* 表头文字颜色 */
+// * {
+//   --el-table-bg-color: #eeeeee0b;
+//   /* 表格背景 */
+//   --el-table-header-bg-color: #eeeeee0b;
+//   /* 表头背景 */
+//   --el-table-tr-bg-color: #eeeeee0b;
+//   /* 行背景 */
+//   --el-table-row-hover-bg-color: #eeeeee0b;
+//   /* 行悬浮背景 */
+//   --el-table-header-text-color: #ededed;
+//   /* 表头文字颜色 */
+// }
+
+// 美化表格行悬停效果
+:deep(.el-table__body tr:hover > td) {
+  background-color: rgba(24, 144, 255, 0.1) !important;
+}
+
+// 美化表格边框
+:deep(.el-table__inner-wrapper) {
+  border-radius: 6px;
+  overflow: hidden;
+}
+
+:deep(.el-table__cell) {
+  border-right: 1px solid rgba(255, 255, 255, 0.05);
+}
+
+:deep(.el-table__row) {
+  border-bottom: 1px solid rgba(255, 255, 255, 0.05);
+}
+
+// 调整奇偶行背景色,使其更明亮
+:deep(.el-table--striped .el-table__body tr.el-table__row--striped) {
+  background-color: rgba(255, 255, 255, 0.02) !important;
+}
+
+// 调整表格主体背景色
+:deep(.el-table__body) {
+  background-color: rgba(0, 0, 0, 0.05);
+}
+:deep(.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell) {
+  background-color: rgba(255, 255, 255, 0.02);
+}
+:deep(.el-tag--primary){
+  background-color: rgba(0, 0, 0, 0);
+  color: #fff;
+}
+:deep(.el-tag--dark){
+  background-color: var(--el-color-primary);
 }
 
 .font,
@@ -573,7 +670,7 @@ link {
 
 .blue-background,
 body {
-  background: #08224a;
+  background: #00002a;
 }
 
 .bluedark-background {
@@ -629,10 +726,15 @@ body {
 .between-row,
 .left-row {
   display: flex !important;
-  justify-content: space-around;
+  justify-content: space-between;
   padding: 0;
   align-items: stretch;
 }
+.row-search{
+  display: flex !important;
+  justify-content: space-between;
+  align-items: center;
+}
 
 .warp-row {
   flex-wrap: wrap;
@@ -643,11 +745,11 @@ body {
 }
 
 .left-row {
-  justify-content: flex-start;
+  justify-content: space-between;
 }
 
 .left-row > * {
-  margin-right: 15px;
+  // margin-right: 15px;
 }
 
 .col {
@@ -734,8 +836,10 @@ body {
 }
 
 .searcher {
-  background-color: #334155;
+  background-color: #00002a;
   margin-right: 15px;
+  width: 500px;
+  height: 34px;
 }
 
 .blue {

+ 1 - 1
src/views/skmh/index.vue

@@ -45,7 +45,7 @@
                 class="server_list_box_table_item_content_button_box_item"
                 @click.stop="handleOpenPage(item)"
               >
-                在线演示
+                进入系统
               </div>
               <div v-else
                 class="server_list_box_table_item_content_button_box_expect"

+ 3 - 3
src/views/yxgl/StatisticalAnalysis.vue

@@ -2,7 +2,7 @@
   <div class="mainBox" v-loading="getDataStatus">
     <!-- 搜索区域 -->
     <div class="searchBox">
-      <div>
+      <div style="font-size: large;">
         <!-- 对比时间:
         <el-date-picker
           v-model="lastTimes"
@@ -1095,7 +1095,7 @@ export default {
     border-radius: 5px;
     padding: 20px 18px;
     // background: #00000032;
-    background: rgba(255, 255, 255, 0.1);
+    background: #eeeeee0b;
     box-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);
   }
 
@@ -1114,7 +1114,7 @@ export default {
     // background: #00000032;
     position: relative;
     flex-direction: column;
-    background: rgba(255, 255, 255, 0.1);
+    background: #eeeeee0b;
     box-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);
     .tools {
       position: absolute;

+ 11 - 8
src/views/yygl/appCenter.vue

@@ -1,6 +1,6 @@
 <template>
   <el-affix :offset="0">
-  <div style="height: 44px;width: 100vw;background: #08224a;"></div>
+  <div style="height: 44px;width: 100vw;background: #00002a;"></div>
   </el-affix>
   <el-affix :offset="44">
   <div class="app-center">
@@ -81,7 +81,7 @@ export default {
     // min-height: 100vh;
   // height: calc(100vh - 120px);
   height: 100vh;
-  background-color: #08224a;
+  background-color: #00002a;
   color: #ffffff;
   overflow-x: hidden;
 }
@@ -89,14 +89,14 @@ export default {
   display: flex;
   width: 100%;
   height: 100%;
-  background-color: #08224a;
+  background-color: #00002a;
   color: #ffffff;
 }
 
 /* 左侧导航栏样式 */
 .sidebar {
   width: 200px;
-  background-color: #0a2a5a;
+  background-color: #00002a;
   border-right: 1px solid rgba(255, 255, 255, 0.1);
 
   .sidebar-menu {
@@ -109,6 +109,7 @@ export default {
       cursor: pointer;
       transition: all 0.3s ease;
       color: rgba(255, 255, 255, 0.8);
+      font-size: var(--el-menu-item-font-size);
 
       i {
         margin-right: 12px;
@@ -116,14 +117,16 @@ export default {
       }
 
       &:hover {
-        background-color: rgba(24, 144, 255, 0.2);
+        // background-color: rgba(24, 144, 255, 0.2);
+        background-color: var(--el-menu-hover-bg-color);
         color: #ffffff;
       }
 
       &.active {
-        background-color: rgba(24, 144, 255, 0.3);
-        color: #ffffff;
-        border-right: 3px solid #1890ff;
+        // background-color: rgba(24, 144, 255, 0.3);
+        // color: #ffffff;
+        color: var(--el-menu-active-color);
+        // border-right: 3px solid #1890ff;
       }
     }
   }

+ 1 - 1
src/views/yygl/manage/index.vue

@@ -447,7 +447,7 @@ export default {
 <style lang="less" scoped>
 .application-management {
   width: 100%;
-  background-color: #08224a;
+  background-color: #00002a;
   color: #ffffff;
 }
 

+ 8 - 3
src/views/yygl/monitor/index.vue

@@ -4,9 +4,14 @@
     <div class="main-content">
       <!-- 应用统计卡片 -->
       <div class="stats-cards">
-        <div class="stat-card" v-for="item in getLimitedList()" :key="item.name">
+        <div class="stat-card" v-for="(item, index) in getLimitedList()" :key="item.name">
           <div class="stat-icon approved">
-            <el-icon><CircleCheckFilled /></el-icon>
+            <el-icon>
+              <CircleCheckFilled v-if="index == 0" style="color: orange;" />
+              <Clock v-else-if="index == 1" style="color:greenyellow;" />
+              <UploadFilled v-else-if="index == 2" style="color: yellow;" />
+              <DeleteFilled v-else style="color:cadetblue;" />
+            </el-icon>
           </div>
           <div class="stat-content">
             <div class="stat-label">{{ item.name }}</div>
@@ -548,7 +553,7 @@ export default {
 <style lang="less" scoped>
 .application-monitor {
   width: 100%;
-  background-color: #08224a;
+  background-color: #00002a;
   color: #ffffff;
 }
 

+ 12 - 2
src/views/yygl/overview/index.vue

@@ -58,7 +58,12 @@
                 <!-- <el-tag size="small" type="success">{{ app.status }}</el-tag> -->
                 <el-tag size="small" v-for="tag in app.tags" :key="tag">{{ tag }}</el-tag>
               </div>
-              <p class="app-description">{{ app.content }}</p>
+              <el-tooltip placement="top" effect="dark">
+                <template #content>
+                  <div style="max-width: 500px;">{{ app.content }}</div>
+                </template>
+                <p class="app-description">{{ app.content }}</p>
+              </el-tooltip>
               <div class="app-footer">
                 <span class="app-date">{{ app.createTime }}</span>
                 <el-button
@@ -221,7 +226,7 @@ export default {
 .application-overview {
   display: flex;
   width: 100%;
-  background-color: #08224a;
+  background-color: #00002a;
   color: #ffffff;
 }
 
@@ -462,4 +467,9 @@ export default {
     gap: 15px;
   }
 }
+
+/* 在你的组件或全局样式文件中 */
+.custom-tooltip-width {
+  width: 200px; /* 设置你想要的宽度 */
+}
 </style>