Przeglądaj źródła

feat|fix: 完善项目

1. 修复一些bug
2. 文档出卷添加按钮
zhupei@smartai.com 1 rok temu
rodzic
commit
4bbd703165

+ 5 - 0
public/config.js

@@ -39,6 +39,11 @@ window.DIFY_BASE_URL = 'http://192.168.20.119:28003';
  */
  */
 window.REFFERENCE_ASSETS_FILE_URL = 'http://192.168.20.119:11080';
 window.REFFERENCE_ASSETS_FILE_URL = 'http://192.168.20.119:11080';
 
 
+/**
+ * 文档出卷 -> 出卷 -> iframe弹窗地址
+ */
+window.IFRAME_URL_CHUJUAN = 'http://192.168.20.119:8501';
+
 /**
 /**
  * 小数系统访问地址
  * 小数系统访问地址
  */
  */

BIN
src/assets/1.png


+ 32 - 6
src/directive/hasPermi/index.js

@@ -1,14 +1,40 @@
 import { localST_UserInfo } from '../../base/storage';
 import { localST_UserInfo } from '../../base/storage';
 
 
 function hasPermissionDirective(el, binding) {
 function hasPermissionDirective(el, binding) {
-  // 获取用户权限
-  const { permissions } = JSON.parse(localST_UserInfo.getItem());
+  const user_str = localST_UserInfo.getItem();
 
 
-  // 获取按钮权限
-  const btnPermission = binding.value;
-  if (!permissions.includes('*:*:*') && !permissions.includes(btnPermission)) {
-    el.style.display = 'none';
+  if (!user_str) {
+    return false;
   }
   }
+
+  try {
+    const user_info = JSON.parse(user_str);
+
+    const { permissions } = user_info;
+
+    // 获取按钮权限
+    const btnPermission = binding.value;
+    if (!permissions.includes('*:*:*') && !permissions.includes(btnPermission)) {
+      el.style.display = 'none';
+    }
+
+    // if (permissions.includes('*:*:*')) {
+    //   return true;
+    // }
+
+    // return permissions.includes(str);
+  } catch (err) {
+    return false;
+  }
+
+  // // 获取用户权限
+  // const { permissions } = JSON.parse(localST_UserInfo.getItem());
+
+  // // 获取按钮权限
+  // const btnPermission = binding.value;
+  // if (!permissions.includes('*:*:*') && !permissions.includes(btnPermission)) {
+  //   el.style.display = 'none';
+  // }
 }
 }
 
 
 export default {
 export default {

+ 4 - 0
src/modules/answer-refference/RefferenceFileNameContentLinks.vue

@@ -80,6 +80,10 @@ const goKnowledge = (knowledge) => {
   line-height: 18px;
   line-height: 18px;
   font-size: 12px;
   font-size: 12px;
 }
 }
+.knowledge-page-item.active {
+  background-color: rgb(var(--primary-6));
+  color: #fff;
+}
 
 
 .show-detail-btn {
 .show-detail-btn {
   cursor: pointer;
   cursor: pointer;

+ 64 - 0
src/modules/btn-iframe-chujuan/BtnIframeChujuan.vue

@@ -0,0 +1,64 @@
+<template>
+  <a-button @click="handleClick" class="chujuan-btn"> <img class="chujuan-logo-img" :src="logo" /> 出卷 </a-button>
+
+  <a-modal
+    v-model:visible="visible"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    modal-class="chujuan-container-modal"
+    body-class="chujuan-container-body"
+    width="90%"
+  >
+    <template #title> <img class="chujuan-logo-img" :src="logo" /> 出卷 </template>
+
+    <iframe :src="iframe_src" class="chujuan-iframe"></iframe>
+  </a-modal>
+</template>
+
+<script setup>
+import { ref } from 'vue';
+
+import logo from '../../assets/1.png';
+
+import { getConfigField } from '../../config';
+
+// const iframe_src = 'http://192.168.20.119:8501';
+const iframe_src = getConfigField('IFRAME_URL_CHUJUAN');
+
+const visible = ref(false);
+
+const handleClick = () => {
+  visible.value = true;
+};
+const handleOk = () => {
+  visible.value = false;
+};
+const handleCancel = () => {
+  visible.value = false;
+};
+</script>
+
+<style scoped>
+.chujuan-btn {
+  border-radius: 30px;
+  color: #353535;
+}
+.chujuan-logo-img {
+  width: 22px;
+  display: inline-block;
+  margin-right: 5px;
+}
+</style>
+
+<style>
+.chujuan-container-modal {
+}
+.arco-modal-body.chujuan-container-body {
+  width: 100%;
+  padding: 0;
+}
+.arco-modal-body.chujuan-container-body .chujuan-iframe {
+  width: 100%;
+  height: 80vh;
+}
+</style>

+ 23 - 9
src/modules/conversation-chat/DialogInputTop.vue

@@ -1,27 +1,41 @@
 <template>
 <template>
   <div class="dialog-input-area-top-container">
   <div class="dialog-input-area-top-container">
-    <a-space size="large">
-      <a-tooltip :content="radio_qingxi_text">
-        <a-radio :value="1" :model-value="act_type" @click="handleRadioClick(1)">文档清洗</a-radio>
-      </a-tooltip>
+    <template v-if="menu_id === 7">
+      <!-- 文档出卷 -->
+      <BtnIframeChujuan />
+    </template>
 
 
-      <a-tooltip :content="radio_shengcheng_text">
-        <a-radio :value="2" :model-value="act_type" @click="handleRadioClick(2)">报告生成</a-radio>
-      </a-tooltip>
-    </a-space>
+    <template v-if="menu_id === 9">
+      <a-space size="large">
+        <a-tooltip :content="radio_qingxi_text">
+          <a-radio :value="1" :model-value="act_type" @click="handleRadioClick(1)">文档清洗</a-radio>
+        </a-tooltip>
+
+        <a-tooltip :content="radio_shengcheng_text">
+          <a-radio :value="2" :model-value="act_type" @click="handleRadioClick(2)">报告生成</a-radio>
+        </a-tooltip>
+      </a-space>
+    </template>
   </div>
   </div>
 </template>
 </template>
 
 
 <script setup>
 <script setup>
 import { ref, onMounted, onUnmounted } from 'vue';
 import { ref, onMounted, onUnmounted } from 'vue';
 
 
+import BtnIframeChujuan from '../btn-iframe-chujuan/BtnIframeChujuan.vue';
+
 /**
 /**
  * 此组件用以处理对话的附加参数
  * 此组件用以处理对话的附加参数
  * 父组件通过ref调用此组件expose的两个方法
  * 父组件通过ref调用此组件expose的两个方法
  */
  */
 
 
 const props = defineProps({
 const props = defineProps({
-  disabled: Boolean
+  disabled: Boolean,
+  /**
+   * 菜单ID
+   * 不同的值,对应不同的智能体
+   */
+  menu_id: Number
 });
 });
 
 
 const act_type = ref(1);
 const act_type = ref(1);

+ 24 - 6
src/utils/permission.js

@@ -3,9 +3,25 @@ import { localST_UserInfo } from '../base/storage';
 import Intelligent from '../views/Intelligent.vue';
 import Intelligent from '../views/Intelligent.vue';
 // 判断是否有该权限
 // 判断是否有该权限
 export const hasPermission = (str) => {
 export const hasPermission = (str) => {
-  const { permissions } = JSON.parse(localST_UserInfo.getItem());
-  if (permissions.includes('*:*:*')) return true;
-  return permissions.includes(str);
+  const user_str = localST_UserInfo.getItem();
+
+  if (!user_str) {
+    return false;
+  }
+
+  try {
+    const user_info = JSON.parse(user_str);
+
+    const { permissions } = user_info;
+
+    if (permissions.includes('*:*:*')) {
+      return true;
+    }
+
+    return permissions.includes(str);
+  } catch (err) {
+    return false;
+  }
 };
 };
 
 
 export const formatRoutes = (data) => {
 export const formatRoutes = (data) => {
@@ -35,9 +51,11 @@ export const formatRoutes = (data) => {
     routes.push(formattedRoute);
     routes.push(formattedRoute);
   }
   }
 
 
-  data.forEach((item) => {
-    addRoutes(item);
-  });
+  if (data && Array.isArray(data)) {
+    data.forEach((item) => {
+      addRoutes(item);
+    });
+  }
 
 
   return routes;
   return routes;
 };
 };

+ 58 - 30
src/views/ConversationQA.vue

@@ -4,7 +4,7 @@
       <ChatAsideMenu />
       <ChatAsideMenu />
 
 
       <template v-if="query_value_status === 2">
       <template v-if="query_value_status === 2">
-        <ConversationChatContainer :agent_id="chat_agent" :session_id="chat_session" />
+        <ConversationChatContainer :agent_id="chat_agent" :session_id="chat_session" :key="chat_agent" />
       </template>
       </template>
 
 
       <template v-if="query_value_status === 3">
       <template v-if="query_value_status === 3">
@@ -22,7 +22,7 @@
 
 
 <script setup>
 <script setup>
 import { ref, onMounted } from 'vue';
 import { ref, onMounted } from 'vue';
-import { useRoute, useRouter } from 'vue-router';
+import { useRoute, useRouter, onBeforeRouteUpdate } from 'vue-router';
 import LayoutExperience from './layout/LayoutExperience.vue';
 import LayoutExperience from './layout/LayoutExperience.vue';
 import ContentContainer from './layout/ContentContainer.vue';
 import ContentContainer from './layout/ContentContainer.vue';
 
 
@@ -97,6 +97,61 @@ async function isValidAgent(agent_id) {
   }
   }
 }
 }
 
 
+/**
+ * 获取默认的对话ID
+ */
+async function getDefaultAgentId() {
+  let default_agent_id = null;
+
+  const agent_list = allAgent.getList();
+  const len = agent_list.length;
+
+  if (len > 1) {
+    for (let i = 0; i < len; i++) {
+      const item = agent_list[i];
+      if (item.name === '知识问答') {
+        default_agent_id = item.id;
+        break;
+      }
+    }
+    if (!default_agent_id) {
+      // 未搜索到: 使用第一个
+      default_agent_id = agent_list[0].id;
+    }
+  } else if (len === 1) {
+    // 仅有一个
+    default_agent_id = agent_list[0].id;
+  } else {
+    // 为0: 使用配置的ID
+    default_agent_id = getConfigField('DEFAULT_CHAT_AGENT_ID');
+  }
+  if (!default_agent_id) {
+    // 如果ID依然不生效,则需要请求api
+    // TODO: 请求API
+  }
+
+  return default_agent_id;
+}
+
+onBeforeRouteUpdate(async (to, from) => {
+  // console.log(to, from);
+  // // 路由发生了变化
+  if (to.path === '/chat' || to.path === '/chat/qa') {
+    const default_agent_id = await getDefaultAgentId();
+
+    if (!to.query.agent) {
+      chat_agent.value = default_agent_id;
+
+      router.replace({
+        path: '/chat/qa',
+        query: {
+          agent: default_agent_id
+        }
+      });
+    }
+  }
+});
+
 onMounted(async () => {
 onMounted(async () => {
   const query = route.query;
   const query = route.query;
 
 
@@ -115,34 +170,7 @@ onMounted(async () => {
      * 默认的agent,和赵秦刚沟通,为知识问答(2024-12-18)
      * 默认的agent,和赵秦刚沟通,为知识问答(2024-12-18)
      * 下列为知识问答的ID
      * 下列为知识问答的ID
      */
      */
-    let default_agent_id = null;
-
-    const agent_list = allAgent.getList();
-    const len = agent_list.length;
-
-    if (len > 1) {
-      for (let i = 0; i < len; i++) {
-        const item = agent_list[i];
-        if (item.name === '知识问答') {
-          default_agent_id = item.id;
-          break;
-        }
-      }
-      if (!default_agent_id) {
-        // 未搜索到: 使用第一个
-        default_agent_id = agent_list[0].id;
-      }
-    } else if (len === 1) {
-      // 仅有一个
-      default_agent_id = agent_list[0].id;
-    } else {
-      // 为0: 使用配置的ID
-      default_agent_id = getConfigField('DEFAULT_CHAT_AGENT_ID');
-    }
-    if (!default_agent_id) {
-      // 如果ID依然不生效,则需要请求api
-      // TODO: 请求API
-    }
+    const default_agent_id = await getDefaultAgentId();
 
 
     chat_agent.value = default_agent_id;
     chat_agent.value = default_agent_id;
     // ------------------------------------------------------
     // ------------------------------------------------------

+ 37 - 30
src/views/common/Header.vue

@@ -57,8 +57,8 @@ import BtnSettings from './header-btns/BtnSettings.vue';
 import BtnCurrentUser from './header-btns/BtnCurrentUser.vue';
 import BtnCurrentUser from './header-btns/BtnCurrentUser.vue';
 
 
 const currentUser = useCurrentUserStore();
 const currentUser = useCurrentUserStore();
-const nav_list = ref([])
-const dropdown_list = ref([])
+const nav_list = ref([]);
+const dropdown_list = ref([]);
 /**
 /**
  * 请求网页全屏
  * 请求网页全屏
  */
  */
@@ -71,40 +71,47 @@ const handleNameChange = () => {
   // currentUser.updateName(nm);
   // currentUser.updateName(nm);
 };
 };
 const formatMenuItems = (list) => {
 const formatMenuItems = (list) => {
-
-  return list.map(item => {
-    // 过滤掉meta.title为'权限管理'
-    if (item.meta.title === '权限管理') {
-      return null;
-    }
-
-    if (item.resourceType.id && item.resourceType.id == '0') {
-      // 只处理菜单项
+  if (Array.isArray(list)) {
+    return list
+      .map((item) => {
+        // 过滤掉meta.title为'权限管理'
+        if (item.meta.title === '权限管理') {
+          return null;
+        }
+
+        if (item.resourceType.id && item.resourceType.id == '0') {
+          // 只处理菜单项
+          return {
+            label: `header.${item.meta.title}`,
+            to: item.path,
+            icon_name: item.meta.icon || 'header-zhinengti' // 假设icon_name是根据name字段来命名的
+          };
+        }
+      })
+      .filter((item) => item !== null); // 过滤掉null值
+  } else {
+    return [];
+  }
+};
+const formatPermissionItems = (permissionList) => {
+  return permissionList.children
+    .map((item) => {
       return {
       return {
-        label: `header.${item.meta.title}`,
-        to: item.path,
-        icon_name: item.meta.icon || 'header-zhinengti' // 假设icon_name是根据name字段来命名的
+        label: item.meta.title,
+        path: item.path
       };
       };
-    }
-
-  }).filter(item => item !== null); // 过滤掉null值
-}
-const formatPermissionItems = (permissionList) => {
-  return permissionList.children.map(item => {
-    return {
-      label: item.meta.title,
-      path: item.path,
-    };
-  }).filter(item => item !== null); // 过滤掉null值
-}
+    })
+    .filter((item) => item !== null); // 过滤掉null值
+};
 onMounted(() => {
 onMounted(() => {
   // 延迟渲染菜单,防止菜单渲染时还没获取到权限信息
   // 延迟渲染菜单,防止菜单渲染时还没获取到权限信息
   const routesList = JSON.parse(localST_RoutesList.getItem());
   const routesList = JSON.parse(localST_RoutesList.getItem());
 
 
-  nav_list.value = formatMenuItems(routesList)
-  const permissionList = routesList.find(item => item.meta.title === '权限管理');
-  dropdown_list.value = permissionList ? formatPermissionItems(permissionList) : []
-
+  if (routesList && Array.isArray(routesList)) {
+    nav_list.value = formatMenuItems(routesList);
+    const permissionList = routesList.find((item) => item.meta.title === '权限管理');
+    dropdown_list.value = permissionList ? formatPermissionItems(permissionList) : [];
+  }
 });
 });
 </script>
 </script>
 
 

+ 15 - 15
src/views/conversation/ConversationChatContainer.vue

@@ -36,7 +36,7 @@
           @submit="handleInputSubmit"
           @submit="handleInputSubmit"
         >
         >
           <template v-if="show_input_others_opts" v-slot:top>
           <template v-if="show_input_others_opts" v-slot:top>
-            <DialogInputTop :agent_info="CHAT_AGENT_INFOMATION" ref="dialog_input_top" />
+            <DialogInputTop :menu_id="current_menu_id" :agent_info="CHAT_AGENT_INFOMATION" ref="dialog_input_top" />
           </template>
           </template>
         </DialogInput>
         </DialogInput>
       </div>
       </div>
@@ -196,12 +196,18 @@ const chat_display_list = computed(() => {
   return [].concat(chat_log_list.value, chat_new_list.value);
   return [].concat(chat_log_list.value, chat_new_list.value);
 });
 });
 
 
+const current_menu_id = computed(() => {
+  const agent = CHAT_AGENT_INFOMATION.value.agent;
+  const menu_id = agent.menuId / 1;
+  return menu_id;
+});
 /**
 /**
  * 当前对话的类型
  * 当前对话的类型
  */
  */
 const current_chat_type = computed(() => {
 const current_chat_type = computed(() => {
-  const agent = CHAT_AGENT_INFOMATION.value.agent;
-  const menu_id = agent.menuId / 1;
+  // const agent = CHAT_AGENT_INFOMATION.value.agent;
+  // const menu_id = agent.menuId / 1;
+  const menu_id = current_menu_id.value;
   const chat_type = menu_id === 1 ? 'excel' : '';
   const chat_type = menu_id === 1 ? 'excel' : '';
 
 
   return chat_type;
   return chat_type;
@@ -220,19 +226,13 @@ const show_welcome = ref(true);
  * 文档报告场景下需要显示此组件
  * 文档报告场景下需要显示此组件
  */
  */
 const show_input_others_opts = computed(() => {
 const show_input_others_opts = computed(() => {
-  const agentInfo = CHAT_AGENT_INFOMATION.value;
+  const menu_id = current_menu_id.value;
 
 
-  if (!agentInfo) {
-    return false;
-  }
-
-  if (!agentInfo.agent) {
-    return false;
-  }
-
-  const agent = agentInfo.agent;
-  if (agent.menuId / 1 === 9) {
-    // 文档报告场景: 显示附加参数表单
+  /**
+   * 7 文档出卷
+   * 9 文档报告
+   */
+  if (menu_id === 7 || menu_id === 9) {
     return true;
     return true;
   }
   }