songxy пре 4 месеци
родитељ
комит
eb76fef27b

+ 3 - 3
ais_knowledge/knowledge/src/main/resources/application-prod.yaml

@@ -1,4 +1,4 @@
-spring:
+CCspring:
   # 数据源配置项
   autoconfigure:
     exclude:
@@ -44,13 +44,13 @@ spring:
           #          url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例
           #          url: jdbc:oracle:thin:@10.10.10.8:1521:ORCL # Oracle 连接的示例
           #          url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例
-          url: jdbc:postgresql://172.27.27.20:5432/knowledge
+          url: jdbc:postgresql://10.249.6.132:5432/knowledge
           username: knowledge
           password: zdww1402!
 
 # 远程调用地址
 retrofit-url:
-  ai-url: http://127.0.0.1:20331/
+  ai-url: http://10.249.6.132:8528/aiServer/
 
 logging:
   level:

+ 2 - 36
ais_search/web/public/config.js

@@ -1,7 +1,7 @@
 (function (global) {
   global.AppGlobalConfig = {
     system: {
-      name: '浙江自然资源大模型',
+      name: '温州自然资源大模型',
       copyright: '版权所有© 2024 浙江万维空间信息技术有限公司',
     },
     authToken: 'ZJUGIS-Authorization',
@@ -26,20 +26,6 @@
     landMarketUrl: 'https://natureai.zjugis.com/subscribe/',
     // 外链
     links: {
-      // 万维问策
-      policy: 'https://zjugpt.com/policy/#/policy/home',
-
-      // 万维问地
-      land: 'https://zjugpt.com/land',
-
-      // 万维写作
-      writer: 'https://zjugpt.com/write/#/newDocument',
-
-      // 万维文库
-      library: 'https://zjugpt.com/write/#/recommend',
-      // 万维问天
-
-      gis: 'http://121.40.148.47:8528/#/monitor',
 
       // 审批精灵
       approval: 'http://121.40.148.47:8528/#/approval',
@@ -54,7 +40,7 @@
       zjugis: 'https://zjugis.com/home/index.html',
 
       // 主页
-      home: '/#/home',
+      home: '/aisearch/#/home',
 
       // 注册页
       register: '/#/register',
@@ -65,26 +51,6 @@
 
       tool: 'http://guihuayun.com/',
 
-      //政策详情
-      policyDetail: 'https://zjugpt.com/policy/#/policy/library?id=-1&type=policyDetail',
-      //指定类型的重点专题详情
-      policySubject: "https://zjugpt.com/policy/#/policy/subject?page=thematic-detail&type=",
-      //重点专题
-      subjectUrl: "https://zjugpt.com/policy/#/policy/subject",
-      //政策智库
-      zczkUrl: "https://zjugpt.com/policy/#/policy/library",
-      //业务图谱
-      businessAtlas: 'https://zjugpt.com/policy/#/policy/businessAtlas',
-      //土地超市
-      landSupermarket: 'https://zjugpt.com/land/#/landSupermarket',
-      //市场洞察
-      supermarketCheck1: 'https://zjugpt.com/land/#/supermarketCheck1',
-      //城市画像
-      cityPortrait: 'https://zjugpt.com/land/#/cityPortrait',
-      //企业画像
-      companyPortrait: 'https://zjugpt.com/land/#/companyPortrait?type=1',
-      //问地地块详情
-      landMarketDetailUrl:'https://zjugpt.com/land/#/landSupermarketDetail'
     },
 
     tdtToken: '339e600c45a24c5d462c384bd8a1d257',

BIN
ais_search/web/src/assets/font/AlimamaShuHeiTi-Bold/AlimamaShuHeiTi-Bold.otf


BIN
ais_search/web/src/assets/font/AlimamaShuHeiTi-Bold/AlimamaShuHeiTi-Bold.ttf


BIN
ais_search/web/src/assets/font/AlimamaShuHeiTi-Bold/AlimamaShuHeiTi-Bold.woff


BIN
ais_search/web/src/assets/font/AlimamaShuHeiTi-Bold/AlimamaShuHeiTi-Bold.woff2


+ 19 - 0
ais_search/web/src/assets/font/AlimamaShuHeiTi-Bold/INSTRUCTION.txt

@@ -0,0 +1,19 @@
+A. 在哪里可以下载阿里妈妈数黑体?
+渠道一:https://www.iconfont.cn/fonts/detail?cnid=a9fXc2HD9n7s
+渠道二:fonts.alibabagroup.com
+
+
+B. 阿里阿里妈妈数黑体简介
+基本信息:阿里妈妈数黑体为中文简体字库,收纳的中文字符包括但不限于GB2312,共计6767个汉字;英文大小写共52个;常用标点符号共206个,总计7025个字符。 
+
+设计说明:阿里妈妈数黑体字型饱满、体态中正,布白极具现代韵律,落笔厚实而简练;字里行间流露出先锋、前卫和时尚的视觉感受。适用于电商、广告、品牌形象、推广物料等场景。
+
+C. 使用反馈、商业合作等问题,请email:
+alimama-font@list.alibaba-inc.com
+——
+重要!安装前请先阅读此文档
+请先按照下面流程安装文件夹里的字体包。
+
+1. 打开字体文件夹,根据不同系统需要选择OTF或TTF版本
+
+2. 字体所包含只有一个字重(双击安装)。

+ 15 - 0
ais_search/web/src/assets/font/AlimamaShuHeiTi-Bold/LICENSE.txt

@@ -0,0 +1,15 @@
+阿里妈妈数黑体法律声明
+
+1. 阿里妈妈数黑体字体及包含该字体的字库软件,合称“阿里妈妈数黑体”。
+
+2. 阿里妈妈数黑体的知识产权和相关权益归属于淘宝(中国)软件有限公司(以下简称“阿里妈妈”),受《中华人民共和国著作权法》及其他适用法律法规、国际公约、条约的保护。
+
+3. 阿里妈妈授权个人、企业等用户在遵守本声明相关条款的前提下,可以下载、安装和使用上述阿里妈妈字体,该授权是免费的普通许可,用户可基于合法目的用于商业用途或非商业用途,但不得以任何违反本声明第4条及法律法规、政策、规章或公序良俗的方式使用。
+
+4. 除本法律声明中明确授权之外,阿里妈妈未授予用户关于阿里妈妈数黑体的其他权利。未经阿里妈妈授权,任何人不得:1)对阿里妈妈数黑体进行仿制、转换、翻译、反编译、反向工程、拆分、破解或以其他方式试图从该字库软件获取源代码;2)删除、覆盖或修改阿里妈妈数黑体法律声明的全部或部分内容;3)将阿里妈妈数黑体进行单独定价出售、出租、出借、转让、转授权、或采取其他未经阿里妈妈授权的行为;4) 发布任何使外界误认其与阿里妈妈或其关联公司存在合作、赞助或背书等商业关联的不实信息。
+
+5. 阿里妈妈授予用户的上述授权不附带任何明示或暗示的保证,不对任何人因从非阿里妈妈官方渠道或指定渠道下载、安装或使用阿里妈妈数黑体而引发的任何直接或间接损失承担责任。
+
+6. 本声明的解释、履行与争议解决适用中华人民共和国的法律。用户与阿里妈妈就阿里妈妈数黑体的使用若发生争议,双方应友好协商,若协商不成,任一方有权向浙江省杭州市有管辖权的人民法院提起诉讼。
+
+反馈与咨询联系方:alimama-font@list.alibaba-inc.com

+ 48 - 0
ais_search/web/src/assets/font/AlimamaShuHeiTi-Bold/font.css

@@ -0,0 +1,48 @@
+@font-face {
+  font-family: "PingFang SC-Light";
+  src: url('./PingFangSC-Light.woff2') format('woff2');
+  font-weight: normal;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: "PingFang SC-Medium";
+  src: url('./PingFangSC-Medium.woff2') format('woff2');
+  font-weight: normal;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: "PingFang SC-Regular";
+  src: url('./PingFangSC-Regular.woff2') format('woff2');
+  font-weight: normal;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: "AlimamaShuHeiTi-Bold";
+  src: url('./AlimamaShuHeiTi-Bold.woff2') format('woff2');
+  font-weight: normal;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: "PingFang SC-Thin";
+  src: url('./PingFangSC-Thin.woff2') format('woff2');
+  font-weight: normal;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: "PingFang SC-Ultralight";
+  src: url('./PingFangSC-Ultralight.woff2') format('woff2');
+  font-weight: normal;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: "PangMenZhengDao";
+  src: url('./PangMenZhengDao.ttf') format('truetype');
+  font-weight: normal;
+  font-style: normal;
+}

BIN
ais_search/web/src/assets/images/home/home-logo.png


BIN
ais_search/web/src/assets/images/home/home-logo2.png


+ 1 - 0
ais_search/web/src/assets/main.css

@@ -1,4 +1,5 @@
 @import './base.css';
 @import "./iconfont/iconfont.css";
+@import "./font/AlimamaShuHeiTi-Bold/font.css";
 @import "./font/PingFangSC/font.css";
 @import "./scss/common.scss";

+ 30 - 0
ais_search/web/src/utils/common.js

@@ -69,3 +69,33 @@ export function maskPhoneNumber(phoneNumber) {
 
   return phoneNumber.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
 }
+
+export function findPath (tree, targetId) {
+  // 递归遍历节点以查找路径
+  function traverse(node, path) {
+    const currentPath = [...path, node.name];
+    
+    if (node.id === targetId) {
+      return currentPath;
+    }
+    
+    for (const child of node.children) {
+      const foundPath = traverse(child, currentPath);
+      if (foundPath) {
+        return foundPath;
+      }
+    }
+    
+    return null;
+  }
+
+  // 遍历所有根节点
+  for (const node of tree) {
+    const path = traverse(node, []);
+    if (path) {
+      return path.join('-');
+    }
+  }
+
+  return null;
+}

+ 0 - 30
ais_search/web/src/views/ai-search/ai-search.vue

@@ -244,36 +244,6 @@
                           </template>
                         </a-dropdown>
                       </div>
-
-                      <a-button
-                        style="
-                          margin-right: 8px;
-                          background: rgba(33, 133, 242, 0.5);
-                          border-radius: 5px;
-                        "
-                        type="primary"
-                        size="small"
-                        v-show="activeTab === 'knowledge'"
-                        @click="followVisible = !followVisible"
-                      >
-                        追问
-                      </a-button>
-                      <!--                    <a-dropdown :trigger="['click']">-->
-                      <!--                      <a class="ant-dropdown-link" @click.prevent>-->
-                      <!--                        <MoreOutlined />-->
-                      <!--                      </a>-->
-                      <!--                      <template #overlay>-->
-                      <!--                        <a-menu>-->
-                      <!--                          <a-menu-item key="0">-->
-                      <!--                            导出 Word-->
-                      <!--                          </a-menu-item>-->
-                      <!--                          <a-menu-divider />-->
-                      <!--                          <a-menu-item key="1">-->
-                      <!--                            导出 PDF-->
-                      <!--                          </a-menu-item>-->
-                      <!--                        </a-menu>-->
-                      <!--                      </template>-->
-                      <!--                    </a-dropdown>-->
                     </div>
                     <div class="follow-input" v-show="followVisible">
                       <a-textarea

+ 12 - 11
ais_search/web/src/views/document/Menus.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="menus_box">
     <div class="menu_item" v-for="(item, index) in items" :key="index">
-      <div :class="{menu: true, active: selectedId === item['id']}">
+      <div :class="{menu: true, active: currentId === item['id']}">
         <span class="left" @click="onClickHandle('query', item)">
           <ContainerOutlined v-if="item['parentId'] === 0" />
           {{item['name']}}
@@ -27,7 +27,7 @@
         </span>
       </div>
       <div :class="{menu_children: true, active: activeId === item['id']}" v-if="item['children'] && item['children'].length> 0">
-        <Menus :items="item['children']" :editor="editor" @menu-click="onMenuClickHandle" />
+        <Menus :items="item['children']" :editor="editor" @menu-click="onMenuClickHandle" :current-id="currentId" />
       </div>
     </div>
   </div>
@@ -56,19 +56,16 @@ interface MenuItemType {
 }
 const props = defineProps<{
   items: MenuItemType[],
-  editor: boolean
+  editor: boolean,
+  currentId: string
 }>()
-const selectedId = ref(-1)
 const activeId = ref(-1);
 const emits = defineEmits<{
   (e: 'menu-click', p: any)
 }>()
 const toggleMenusHandle = (item) => {
-  if(activeId.value === item['id']){
-    // activeId.value = -1;
-  }else if(item['id'] !== -1){
-    activeId.value = item['id']
-  }
+  if (activeId.value === item['id']) return;
+  activeId.value = item['id']
 }
 const onClickHandle = (type, payload) => {
   if(type === 'query'){
@@ -91,19 +88,23 @@ const onMenuClickHandle = (data) => {
 </script>
 <style scoped lang="scss">
 .menus_box {
-  padding-left: 20px;
   >.menu_item {
     >.menu {
-      padding: 10px 15px;
+      padding-right: 0px;
       display: flex;
       align-items: center;
       justify-content: space-between;
+      border: 1px solid transparent;
       cursor: pointer;
       >.left {
         font-size: 14px;
         color: #172538;
         flex: 1;
         user-select: none;
+        padding: 10px 15px;
+      }
+      >.right {
+        margin-right: 10px;
       }
       &.active {
         border-radius: 4px;

+ 22 - 14
ais_search/web/src/views/document/MoveFiles.vue

@@ -10,6 +10,7 @@
       v-model:expandedKeys="expandedKeys"
       v-model:selectedKeys="selectedKeys"
       :tree-data="treeData"
+      @select="onSelected"
       style="
         border: 1px solid #e4e7ea;
         border-radius: 4px;
@@ -46,16 +47,15 @@ const props = defineProps({
   open: {
     type: Boolean,
     default: false,
-  },
-  closeModel: {
-    type: Function,
-    default: () => {},
-  },
+  }
 });
-const { ids, open, closeModel } = toRefs(props);
+const emits = defineEmits<{
+  (e: 'close-model', p: boolean)
+}>()
+const { ids, open } = toRefs(props);
 
 const expandedKeys = ref<string[]>([]);
-const selectedKeys = ref<string[]>([]);
+const selectedKeys = ref<number[]>([]);
 const treeData = ref();
 
 const getTypeList = () => {
@@ -84,6 +84,9 @@ const getTypeList = () => {
     }
   })
 }
+const closeModel = () => {
+  emits('close-model', false)
+}
 getTypeList();
 onMounted(() => {
   initModel();
@@ -98,12 +101,17 @@ watch(
 const initModel = () => {
   selectedKeys.value = [];
 };
-
+const cParentId = ref(0)
+const onSelected = (item, data) => {
+  cParentId.value = data.node.parentId
+}
 const handleOk = async () => {
-  const selectKey =selectedKeys.value[0];
-  console.log("res", selectKey);
-  console.log(props.ids)
-  if(selectKey)
+  const selectKey = selectedKeys.value[0];
+  if (cParentId.value === 0 && selectKey !== -1) {
+    message.error("不能移动该节点!");
+    return;
+  }
+  updateHandle(props.ids[0], selectKey)
 };
 const updateHandle = (id, parentId) => {
   const urlStr = `/ai/knowledge/file/update`
@@ -113,8 +121,8 @@ const updateHandle = (id, parentId) => {
   }
   http.post(urlStr, sendData).then((result) => {
     if (result.data) {
-      message.success("重命名成功!");
-      getTypeList();
+      message.success("移动成功!");
+      emits('close-model', true)
     }
   });
 };

+ 6 - 1
ais_search/web/src/views/document/index.scss

@@ -52,6 +52,7 @@
         >.menu_box {
           flex: 1;
           overflow-y: auto;
+          padding: 10px 15px;
           ::v-deep {
             .ant-menu-light {
               background-color: transparent;
@@ -61,7 +62,8 @@
       }
       &.content_box {
         padding: 20px;
-        padding-left: 10px;
+        padding-left: 0px;
+        flex: 1;
         >.page-content {
           background-color: #fff;
           border-radius: 15px;
@@ -96,6 +98,9 @@
               cursor: pointer !important;
               span {
                 margin-left: 10px;
+                width: 450px;
+                overflow: hidden;
+                text-overflow: ellipsis;
               }
               &:hover {
                 color: #1890ff;

+ 57 - 40
ais_search/web/src/views/document/index.vue

@@ -20,6 +20,7 @@
             mode="inline"
             :items="folders"
             :editor="isFolderEditor"
+            :current-id="currentId"
             @menu-click="onMenuClickHandle" >
         </menus>
         </div>
@@ -34,7 +35,7 @@
               <a-button
                 type="primary"
                 :icon="h(CloudUploadOutlined)"
-                @click="uploadFiles(state.selectedRowKeys)"
+                @click="uploadFiles"
                 class="top_btn"
                 >导入</a-button
               >
@@ -47,9 +48,9 @@
               <a-dropdown>
                 <template #overlay>
                   <a-menu @click="onChangeBusClass">
-                    <a-menu-item key="1">
-                      是
-                    </a-menu-item>
+                    <a-menu-item key=""> 全部</a-menu-item>
+                    <a-menu-item key="1"></a-menu-item>
+                    <a-menu-item key="-1"> 否</a-menu-item>
                   </a-menu>
                 </template>
                 <a-button class="top_btn m-l-15">
@@ -57,18 +58,6 @@
                   <DownOutlined />
                 </a-button>
               </a-dropdown>
-              <a-dropdown>
-                <template #overlay>
-                  <a-menu @click="onChangeDocType">
-                    <a-menu-item key="0">pdf</a-menu-item>
-                    <a-menu-item key="1">doc</a-menu-item>
-                  </a-menu>
-                </template>
-                <a-button class="top_btn m-l-15">
-                  文档格式
-                  <DownOutlined />
-                </a-button>
-              </a-dropdown>
             </div>
             <div class="right">
               <a-input
@@ -106,16 +95,24 @@
                       <a-input v-model:value="editableData[record.id].name" @pressEnter="updateHandle(record.id)" />
                     </div>
                     <div v-else class="editable-cell-text-wrapper">
-                      <div class="name-box" @click="showFileDetail(record)">
+                      <div class="name-box" @click="showFileDetail(record)" :title="record.name">
                         <MyIcon icon="icon-wenjianleixing-suolvetu-PDFwendang" size="18" />
                         <span>{{ record.name }}</span>
                       </div>
                     </div>
                   </div>
                 </template>
+                <template v-if="column.key === 'typeName'">
+                  <div v-if="record.typeName === '未分类'" style="color: #EF740B">
+                    {{ record.typeName }}
+                  </div>
+                  <div v-else>
+                    {{ record.typeName }}
+                  </div>
+                </template>
                 <template v-if="column.key === 'createTime'">
                   <div>
-                    {{ dayjs(record.createTime).format("YYYY-MM-DD HH:mm:ss") }}
+                    {{ record.createTime && dayjs(record.createTime).format("YYYY-MM-DD HH:mm:ss") }}
                   </div>
                 </template>
                 <template v-else-if="column.key === 'action'">
@@ -165,6 +162,7 @@
                             :icon="h(FormOutlined)"
                             style="color: #000"
                             @click="editFolderName(record.id)"
+                            v-if="false"
                             >编辑</a-button
                           >
                         </a-menu-item>
@@ -205,7 +203,7 @@
     <MoveFileModel
       :open="moveFileModel"
       :ids="moveFileIds"
-      :closeModel="closeMoveFileModel"
+      @closeModel="closeMoveFileModel"
     />
     <FileUpload ref="userUploadFileRef" :pid="currentId" @close="closeHandle"/>
   </div>
@@ -217,6 +215,7 @@
 import { cloneDeep } from 'lodash-es';
 import { h, ref, reactive, onMounted } from "vue";
 import http from "@/utils/http";
+import { findPath } from "@/utils/common";
 import { listToTree } from '@/utils/struct'
 import {
   DownOutlined,
@@ -225,9 +224,9 @@ import {
   CloudUploadOutlined,
   SearchOutlined,
   DownloadOutlined,
-  FolderAddOutlined,
   VerticalAlignTopOutlined,
   DeliveredProcedureOutlined,
+  ConsoleSqlOutlined,
 } from "@ant-design/icons-vue";
 import HomeHeader from '@/views/home/components/HomeHeader.vue';
 import { message } from "ant-design-vue";
@@ -239,12 +238,15 @@ import FileDetail from "./FileDetail.vue";
 import dayjs from "dayjs";
 
 const currentId = ref(-1);
-
-const onChangeBusClass = () => {
-  
-}
-const onChangeDocType = () => {
-
+const isType = ref(0);
+const onChangeBusClass = (data) => {
+  const key = data['key']
+  if (!key) {
+    isType.value = 0
+  } else {
+    isType.value = parseInt(key)
+  }
+  initTableList();
 }
 // 表格列
 const columns = [
@@ -252,22 +254,26 @@ const columns = [
     title: "文档名称",
     dataIndex: "name",
     key: "name",
-    width: 360
+    width: 480,
+    ellipsis: true
   },
   {
     title: "文档类型",
     dataIndex: "type",
     key: "type",
+    width: 200
   },
   {
     title: "业务类型",
     dataIndex: "typeName",
     key: "typeName",
+    width: 200
   },
   {
     title: "文档大小",
     dataIndex: "size",
     key: "size",
+    width: 200,
     sorter: {
       compare: (a, b) => a.size - b.size,
       multiple: 2,
@@ -298,31 +304,40 @@ const getTableList = () => {
     pageNo: pageNo.value,
     pageSize: 10,
     name: searchValue.value,
+    isType: isType.value,
     parentId: currentId.value === -1 ? '' : currentId.value
   }
   http.get(urlStr, sendData).then((result) => {
     loading.value = false;
     const resultData = result.data;
     if (resultData['list']) {
-      dataSource.value = resultData['list'];
+      dataSource.value = resultData['list'].map((item) => {
+        return {
+          ...item,
+          typeName: filterTypeFunc(item['parentId'])
+        }
+      });
       total.value = resultData['total']
     }
   }).catch((err) => {
     loading.value = false;
   });
 };
+const filterTypeFunc = (parentId) => {
+  if (parentId == -1) return '未分类'
+  return findPath(folders.value, parentId)
+}
 const initTableList = () => {
   pageNo.value = 1;
   getTableList();
 }
 getTableList();
+
 const onPageChange = (page) => {
   pageNo.value = page;
   getTableList();
 }
-const state = reactive<{
-  loading: boolean;
-}>({
+const state = reactive({
   selectedRowKeys: [], // Check here to configure the default column
   loading: false,
 });
@@ -330,9 +345,6 @@ const state = reactive<{
 const onSelectChange = (selectedRowKeys1) => {
   state.selectedRowKeys = selectedRowKeys1;
 };
-const searchHandle = () => {
-  initTableList()
-}
 const currentFileId = ref(null)
 const deleteFileVisiabled = ref(false)
 const deleteFiles = () => {
@@ -371,7 +383,6 @@ const getTypeList = () => {
         "sort": null
       }].concat(result.data)
       folders.value = listToTree(lists)
-      console.log(folders.value)
     }
   })
 }
@@ -425,7 +436,7 @@ const deleteFolders = () => {
     deleteVisiabled.value = false;
   });
 }
-//文件夹刪除
+//文件夹移动
 const moveUpHandle = (id) => {
   const urlStr = `/ai/knowledge/type/move-up?id=${id}`
   http.get(urlStr).then((result) => {
@@ -452,11 +463,10 @@ const moveDownHandle = (id) => {
 const onMenuClickHandle = (data) => {
   const type = data['type']
   const payload = data['payload']
-  currentId.value = payload['id'] == -1 ? 0 : payload['id']
+  currentId.value = payload['id']
   switch (type) {
     case 'query':
       searchValue.value = ''
-      console.log("payload value:", payload)
       initTableList();
       break;
     case 'add':
@@ -483,6 +493,7 @@ const onMenuClickHandle = (data) => {
  */
 // 下载(单文件下载)
 const downloadFile = async (data: any) => {
+  console.log(data)
   const downloadUrl = `${window.AppGlobalConfig.knowledgeDocUrlProxy}${data.name}`
   const response = await fetch(downloadUrl);
   const blob = await response.blob();
@@ -505,12 +516,16 @@ const closeHandle = () => {
 }
 // 多文件打包下载
 const downloadFiles = async (ids: any[] = []) => {
+  if (!ids || ids.length === 0) {
+    message.error("请至少选择一个文件!");
+    return;
+  }
   message.success("正在为你下载文件,请稍等 ...");
   const selectedArrs = dataSource.value.filter((item) => {
     return ids.includes(item['id']);
   })
   selectedArrs.forEach((item) => {
-    downloadFile(item['name'])
+    downloadFile(item)
   })
 };
 // 置顶
@@ -536,9 +551,11 @@ const moveFiles = (ids: any[] = []) => {
   moveFileIds.value = ids;
   moveFileModel.value = true;
 };
-const closeMoveFileModel = () => {
+const closeMoveFileModel = (bool) => {
   moveFileModel.value = false;
+  if (!bool) return;
   moveFileIds.value = [];
+  getTableList();
 };
 // 跳到文件详情页面
 const fileViewerVisabled = ref(false)

+ 19 - 5
ais_search/web/src/views/home/components/HomeHeader.vue

@@ -1,7 +1,10 @@
 <template>
   <div class="home-header">
     <div class="left">
-      <div class="sys-icon" @click="linkToHome"></div>
+      <div class="sys-icon" @click="linkToHome">
+        <div class="logo"></div>
+        <div class="title">{{ systemTitle }}</div>
+      </div>
       <div v-if="subTitle" class="sub_title">{{ subTitle }}</div>
     </div>
     <div class="right user-panel" v-if="false">
@@ -13,6 +16,7 @@
 import UserAvatar from '@/views/components/UserNewAvatar.vue';
 import { linkToHome } from '@/utils/external-links';
 
+const systemTitle = ref(AppGlobalConfig.system.name)
 const props = defineProps({
   subTitle: {
     type: String,
@@ -34,11 +38,21 @@ const props = defineProps({
     justify-content: flex-start;
     align-items: center;
     .sys-icon {
-      width: 260px;
-      height: 32px;
-      background: url('@/assets/images/home/home-logo.png') no-repeat;
-      background-size: 100% 100%;
       margin-right: 11px;
+      display: flex;
+      align-items: center;
+      >.logo {
+        width:  42px;
+        height: 42px;
+        background: url('@/assets/images/home/home-logo.png') no-repeat;
+        background-size: 100% 100%;
+      }
+      >.title {
+        font-family: AlimamaShuHeiTi-Bold;
+        font-size: 25px;
+        margin-left: 10px;
+        color: #222222;
+      }
     }
     >.sub_title {
       color: #2089F0;