Merge remote-tracking branch 'origin/feature/v1.3_主agent_rxd' into test
This commit is contained in:
@ -171,7 +171,7 @@ export default {
|
|||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
onCancel={handleCancel}
|
onCancel={handleCancel}
|
||||||
/>
|
/>
|
||||||
<p class="cts !color-#939499 text-12px !lh-20px my-4px">内容由AI生成,仅供参考</p>
|
<p class="cts !color-#939499 !text-12px !lh-20px my-4px">内容由AI生成,仅供参考</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|||||||
@ -113,12 +113,16 @@ export default function useChatHandler(options: UseChatHandlerOptions): UseChatH
|
|||||||
const isShow = conversationList.value[conversationList.value.length - 1].run_id === item.run_id;
|
const isShow = conversationList.value[conversationList.value.length - 1].run_id === item.run_id;
|
||||||
return (
|
return (
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<Tooltip title="复制" onClick={() => onCopy(content)}>
|
<Tooltip title="复制" onClick={() => onCopy(content)} align={{ offset: [0, 4] }} >
|
||||||
<IconCopy size={16} class="color-#737478 cursor-pointer mr-12px" />
|
<div class="action-box">
|
||||||
|
<IconCopy size={16} class="color-#737478" />
|
||||||
|
</div>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
{isShow && (
|
{isShow && (
|
||||||
<Tooltip title="重新生成" onClick={() => handleRemoteRefresh(item)}>
|
<Tooltip title="重新生成" onClick={() => handleRemoteRefresh(item)} align={{ offset: [0, 4] }}>
|
||||||
<IconRefresh size={16} class="color-#737478 cursor-pointer" />
|
<div class="action-box ml-12px">
|
||||||
|
<IconRefresh size={16} class="color-#737478 " />
|
||||||
|
</div>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@ -353,17 +357,23 @@ export default function useChatHandler(options: UseChatHandlerOptions): UseChatH
|
|||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
{!extra_data && (
|
{!extra_data && (
|
||||||
// ? (
|
// ? (
|
||||||
// <Tooltip title="下载" onClick={onDownload}>
|
// <Tooltip title="下载" onClick={onDownload} align={{ offset: [0, 4] }}>
|
||||||
// <IconDownload size={16} class="color-#737478 cursor-pointer mr-12px" />
|
// <div class="action-box">
|
||||||
|
// <IconDownload size={16} class="color-#737478 mr-12px" />
|
||||||
|
// </div>
|
||||||
// </Tooltip>
|
// </Tooltip>
|
||||||
// ) :
|
// ) :
|
||||||
<Tooltip title="复制" onClick={() => onCopy(_targetTask.content.output)}>
|
<Tooltip title="复制" onClick={() => onCopy(_targetTask.content.output)} align={{ offset: [0, 4] }}>
|
||||||
<IconCopy size={16} class="color-#737478 cursor-pointer mr-12px" />
|
<div class="action-box">
|
||||||
|
<IconCopy size={16} class="color-#737478" />
|
||||||
|
</div>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
)}
|
)}
|
||||||
{isShow && (
|
{isShow && (
|
||||||
<Tooltip title="重新生成" onClick={() => onRefresh(teamRunTaskId)}>
|
<Tooltip title="重新生成" onClick={() => onRefresh(teamRunTaskId)} align={{ offset: [0, 4] }}>
|
||||||
<IconRefresh size={16} class="color-#737478 cursor-pointer" />
|
<div class="action-box ml-12px">
|
||||||
|
<IconRefresh size={16} class="color-#737478 " />
|
||||||
|
</div>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -127,6 +127,17 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.action-box {
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 2px;
|
||||||
|
border-radius: 2px;
|
||||||
|
transition: all 0.2s;
|
||||||
|
line-height: normal;
|
||||||
|
&:hover {
|
||||||
|
background-color: #f2f3f5;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.xt-bubble-header {
|
.xt-bubble-header {
|
||||||
|
|||||||
@ -23,9 +23,6 @@ const route = useRoute();
|
|||||||
|
|
||||||
useResponsive(true);
|
useResponsive(true);
|
||||||
|
|
||||||
const showSider = computed(() => {
|
|
||||||
return !route.meta?.hideSidebar;
|
|
||||||
});
|
|
||||||
const isHomeRoute = computed(() => {
|
const isHomeRoute = computed(() => {
|
||||||
return route.name === 'Home';
|
return route.name === 'Home';
|
||||||
});
|
});
|
||||||
@ -43,20 +40,10 @@ const layoutPageClass = computed(() => {
|
|||||||
return result;
|
return result;
|
||||||
});
|
});
|
||||||
|
|
||||||
const siderWidth = computed(() => {
|
|
||||||
return showSider.value ? sidebarStore.sidebarWidth : 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
const collapsed = computed(() => {
|
|
||||||
return sidebarStore.menuCollapse;
|
|
||||||
});
|
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
checkHasInviteCode();
|
checkHasInviteCode();
|
||||||
});
|
});
|
||||||
const setCollapsed = (val) => {
|
|
||||||
appStore.updateSettings({ menuCollapse: val });
|
|
||||||
};
|
|
||||||
|
|
||||||
const checkHasInviteCode = () => {
|
const checkHasInviteCode = () => {
|
||||||
const inviteCode = getQueryParam('invite_code');
|
const inviteCode = getQueryParam('invite_code');
|
||||||
@ -74,21 +61,11 @@ const checkHasInviteCode = () => {
|
|||||||
<Navbar />
|
<Navbar />
|
||||||
</Layout.Header>
|
</Layout.Header>
|
||||||
<Layout class="flex layout-content-wrap">
|
<Layout class="flex layout-content-wrap">
|
||||||
<Layout.Sider
|
|
||||||
v-if="showSider"
|
|
||||||
v-model="collapsed"
|
|
||||||
:width="siderWidth"
|
|
||||||
collapsible
|
|
||||||
trigger
|
|
||||||
@collapse="setCollapsed"
|
|
||||||
class="layout-sider"
|
|
||||||
>
|
|
||||||
<SiderBar />
|
<SiderBar />
|
||||||
</Layout.Sider>
|
|
||||||
<Layout
|
<Layout
|
||||||
class="layout-content"
|
class="layout-content"
|
||||||
:style="{
|
:style="{
|
||||||
paddingLeft: `${siderWidth}px`,
|
paddingLeft: `${sidebarStore.sidebarWidth}px`,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<Layout.Content :class="layoutPageClass" class="!min-h-initial">
|
<Layout.Content :class="layoutPageClass" class="!min-h-initial">
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<script lang="tsx">
|
<script lang="tsx">
|
||||||
import { Dropdown, Menu } from 'ant-design-vue';
|
import { Dropdown, Menu, Layout } from 'ant-design-vue';
|
||||||
import type { RouteMeta, RouteRecordRaw } from 'vue-router';
|
import type { RouteMeta, RouteRecordRaw } from 'vue-router';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import SvgIcon from '@/components/svg-icon/index.vue';
|
import SvgIcon from '@/components/svg-icon/index.vue';
|
||||||
@ -20,6 +20,7 @@ export default defineComponent({
|
|||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
|
|
||||||
const sidebarStore = useSidebarStore();
|
const sidebarStore = useSidebarStore();
|
||||||
|
const appStore = useAppStore();
|
||||||
|
|
||||||
const currentMenuList = ref<typeMenuItem[]>([]);
|
const currentMenuList = ref<typeMenuItem[]>([]);
|
||||||
const currentMenuModInfo = ref<typeMenuItem>({});
|
const currentMenuModInfo = ref<typeMenuItem>({});
|
||||||
@ -29,6 +30,13 @@ export default defineComponent({
|
|||||||
const isHomeRoute = computed(() => currentRouteName.value === 'Home');
|
const isHomeRoute = computed(() => currentRouteName.value === 'Home');
|
||||||
const showAiSearch = computed(() => !route.meta?.hideAiSearch);
|
const showAiSearch = computed(() => !route.meta?.hideAiSearch);
|
||||||
|
|
||||||
|
const collapsed = computed(() => {
|
||||||
|
return sidebarStore.menuCollapse;
|
||||||
|
});
|
||||||
|
|
||||||
|
const setCollapsed = (val) => {
|
||||||
|
appStore.updateSettings({ menuCollapse: val });
|
||||||
|
};
|
||||||
const getCollapseMenuKey = (routeName: string): string => {
|
const getCollapseMenuKey = (routeName: string): string => {
|
||||||
let _key: string;
|
let _key: string;
|
||||||
for (let i = 0; i < currentMenuList.value.length; i++) {
|
for (let i = 0; i < currentMenuList.value.length; i++) {
|
||||||
@ -113,8 +121,9 @@ export default defineComponent({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const initMenuList = () => {
|
const initMenuList = () => {
|
||||||
const groupMenuList = MENU_LIST?.[currentRouteGroup.value as string];
|
const groupMenuList = MENU_LIST?.[currentRouteGroup.value as string] ?? [];
|
||||||
currentMenuList.value = cloneDeep(groupMenuList);
|
currentMenuList.value = cloneDeep(groupMenuList);
|
||||||
|
sidebarStore.setCurrentMenuList(groupMenuList);
|
||||||
};
|
};
|
||||||
const initCollapse = () => {
|
const initCollapse = () => {
|
||||||
getCollapseMenuKey(currentRouteName.value);
|
getCollapseMenuKey(currentRouteName.value);
|
||||||
@ -144,7 +153,16 @@ export default defineComponent({
|
|||||||
});
|
});
|
||||||
|
|
||||||
return () => (
|
return () => (
|
||||||
<Menu class={`siderBar-wrap p-16px w-full h-full flex flex-col ${sidebarStore.menuCollapse ? 'menu-fold' : ''}`}>
|
<Layout.Sider
|
||||||
|
v-model={collapsed.value}
|
||||||
|
width={sidebarStore.sidebarWidth}
|
||||||
|
collapsible
|
||||||
|
trigger
|
||||||
|
onCollapse={setCollapsed}
|
||||||
|
>
|
||||||
|
<Menu
|
||||||
|
class={`siderBar-wrap p-16px w-full h-full flex flex-col ${sidebarStore.menuCollapse ? 'menu-fold' : ''}`}
|
||||||
|
>
|
||||||
{showAiSearch.value && (
|
{showAiSearch.value && (
|
||||||
<>
|
<>
|
||||||
<Menu.Item class={`menu-item !mb-0 ${isHomeRoute.value ? 'active' : ''}`} onClick={handleUserHome}>
|
<Menu.Item class={`menu-item !mb-0 ${isHomeRoute.value ? 'active' : ''}`} onClick={handleUserHome}>
|
||||||
@ -175,6 +193,7 @@ export default defineComponent({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Menu>
|
</Menu>
|
||||||
|
</Layout.Sider>
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@ -15,6 +15,7 @@ const COMPONENTS: AppRouteRecordRaw[] = [
|
|||||||
requireLogin: true,
|
requireLogin: true,
|
||||||
roles: ['*'],
|
roles: ['*'],
|
||||||
id: MENU_GROUP_IDS.AGENT,
|
id: MENU_GROUP_IDS.AGENT,
|
||||||
|
group: 'agent'
|
||||||
},
|
},
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
@ -26,7 +27,9 @@ const COMPONENTS: AppRouteRecordRaw[] = [
|
|||||||
requiresAuth: false,
|
requiresAuth: false,
|
||||||
requireLogin: true,
|
requireLogin: true,
|
||||||
hideFooter: true,
|
hideFooter: true,
|
||||||
isAgentRoute: true
|
isAgentRoute: true,
|
||||||
|
group: 'agent',
|
||||||
|
hideAiSearch: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -41,6 +44,8 @@ const COMPONENTS: AppRouteRecordRaw[] = [
|
|||||||
id: MENU_GROUP_IDS.AGENT,
|
id: MENU_GROUP_IDS.AGENT,
|
||||||
isAgentRoute: true,
|
isAgentRoute: true,
|
||||||
hideInMenu: true,
|
hideInMenu: true,
|
||||||
|
group: 'agent',
|
||||||
|
hideAiSearch: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -56,6 +61,8 @@ const COMPONENTS: AppRouteRecordRaw[] = [
|
|||||||
id: MENU_GROUP_IDS.AGENT,
|
id: MENU_GROUP_IDS.AGENT,
|
||||||
isAgentRoute: true,
|
isAgentRoute: true,
|
||||||
hideInMenu: true,
|
hideInMenu: true,
|
||||||
|
group: 'agent',
|
||||||
|
hideAiSearch: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
* @Author: RenXiaoDong
|
* @Author: RenXiaoDong
|
||||||
* @Date: 2025-06-23 22:13:30
|
* @Date: 2025-06-23 22:13:30
|
||||||
*/
|
*/
|
||||||
|
// import { useRoute } from 'vue-router';
|
||||||
import { defineStore } from 'pinia';
|
import { defineStore } from 'pinia';
|
||||||
import router from '@/router';
|
import router from '@/router';
|
||||||
import type { RouteLocationNormalized } from 'vue-router';
|
import type { RouteLocationNormalized } from 'vue-router';
|
||||||
@ -11,7 +12,7 @@ import { getTaskUnread, patchTaskRead } from '@/api/all/common';
|
|||||||
|
|
||||||
interface sidebarState {
|
interface sidebarState {
|
||||||
activeMenuKey: string | number | null;
|
activeMenuKey: string | number | null;
|
||||||
// menuList: any[];
|
currentMenuList: any[];
|
||||||
unreadInfo: number[];
|
unreadInfo: number[];
|
||||||
menuCollapse: boolean;
|
menuCollapse: boolean;
|
||||||
}
|
}
|
||||||
@ -21,12 +22,17 @@ let unreadInfoTimer: number | null = null;
|
|||||||
export const useSidebarStore = defineStore('sidebar', {
|
export const useSidebarStore = defineStore('sidebar', {
|
||||||
state: (): sidebarState => ({
|
state: (): sidebarState => ({
|
||||||
activeMenuKey: null, // 激活的菜单id
|
activeMenuKey: null, // 激活的菜单id
|
||||||
// menuList: [], // 菜单信息
|
currentMenuList: [], // 菜单信息
|
||||||
unreadInfo: [], // 未读消息
|
unreadInfo: [], // 未读消息
|
||||||
menuCollapse: false, // 菜单是否折叠
|
menuCollapse: false, // 菜单是否折叠
|
||||||
}),
|
}),
|
||||||
getters: {
|
getters: {
|
||||||
|
showSider(): boolean {
|
||||||
|
const route = router.currentRoute.value;
|
||||||
|
return !route.meta?.hideSidebar && this.currentMenuList.length > 0;
|
||||||
|
},
|
||||||
sidebarWidth(): number {
|
sidebarWidth(): number {
|
||||||
|
if (!this.showSider) return 0;
|
||||||
return this.menuCollapse ? 74 : 138;
|
return this.menuCollapse ? 74 : 138;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -43,9 +49,9 @@ export const useSidebarStore = defineStore('sidebar', {
|
|||||||
clearMenuCollapse() {
|
clearMenuCollapse() {
|
||||||
this.menuCollapse = false;
|
this.menuCollapse = false;
|
||||||
},
|
},
|
||||||
// clearUserNavbarMenuList() {
|
setCurrentMenuList(val: any[]) {
|
||||||
// this.menuList = [];
|
this.currentMenuList = val;
|
||||||
// },
|
},
|
||||||
// navbar菜单列表由企业对应权限决定
|
// navbar菜单列表由企业对应权限决定
|
||||||
// getUserNavbarMenuList() {
|
// getUserNavbarMenuList() {
|
||||||
// const enterpriseStore = useEnterpriseStore();
|
// const enterpriseStore = useEnterpriseStore();
|
||||||
|
|||||||
@ -60,7 +60,6 @@ export function handleUserLogout() {
|
|||||||
userStore.clearUserInfo(); // 清除用户信息
|
userStore.clearUserInfo(); // 清除用户信息
|
||||||
userStore.clearToken(); // 清除token
|
userStore.clearToken(); // 清除token
|
||||||
enterpriseStore.clearUserEnterpriseInfo(); // 清除企业信息
|
enterpriseStore.clearUserEnterpriseInfo(); // 清除企业信息
|
||||||
// sidebarStore.clearUserNavbarMenuList(); // 清除navbar菜单信息
|
|
||||||
// userStore.clearUserAllowAccessRoutes(); // 清除权限路由列表
|
// userStore.clearUserAllowAccessRoutes(); // 清除权限路由列表
|
||||||
sidebarStore.stopUnreadInfoPolling(); // 清除未读消息
|
sidebarStore.stopUnreadInfoPolling(); // 清除未读消息
|
||||||
sidebarStore.clearActiveMenuKey(); // 清除active菜单id
|
sidebarStore.clearActiveMenuKey(); // 清除active菜单id
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="px-4px h-full flex flex-col overflow-y-auto">
|
<div class="pl-16px h-full flex flex-col overflow-y-auto">
|
||||||
<div class="back-wap cursor-pointer mb-17px mt--3px !w-fit" @click="goChatIndex">
|
<div class="back-wap cursor-pointer mb-17px mt--3px !w-fit" @click="goChatIndex">
|
||||||
<icon-left size="16" class="color-#737478 mr-4px" />
|
<icon-left size="16" class="color-#737478 mr-4px" />
|
||||||
<span class="cs">返回空间</span>
|
<span class="cs">返回空间</span>
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="agent-wrap relative h-full">
|
<div class="agent-wrap relative h-full pl-16px">
|
||||||
<a-input
|
<a-input
|
||||||
v-model="query.name"
|
v-model="query.name"
|
||||||
@press-enter="getData()"
|
@press-enter="getData()"
|
||||||
placeholder="搜索智能体"
|
placeholder="搜索智能体"
|
||||||
size="large"
|
size="large"
|
||||||
allow-clear
|
allow-clear
|
||||||
class="absolute right-0 top--10px !w-400px"
|
class="absolute right-0 top-4px !w-400px"
|
||||||
>
|
>
|
||||||
<template #prefix>
|
<template #prefix>
|
||||||
<icon-search @click="getData()" />
|
<icon-search @click="getData()" />
|
||||||
|
|||||||
@ -90,7 +90,7 @@ export default {
|
|||||||
return () => (
|
return () => (
|
||||||
<Drawer width={240} rootClassName="ct-history-conversation-drawer" v-model:open={open.value} onClose={onClose}>
|
<Drawer width={240} rootClassName="ct-history-conversation-drawer" v-model:open={open.value} onClose={onClose}>
|
||||||
<header class="header h-40px px-12px flex justify-between items-center">
|
<header class="header h-40px px-12px flex justify-between items-center">
|
||||||
<span class="text-16px font-400 color-#211F24 font-family-medium">历史对话</span>
|
<span class="text-12px font-400 color-#211F24 font-family-medium">历史对话</span>
|
||||||
<icon-close size={16} class="color-#211F24 cursor-pointer" onClick={onClose} />
|
<icon-close size={16} class="color-#211F24 cursor-pointer" onClick={onClose} />
|
||||||
</header>
|
</header>
|
||||||
{dataSource.value.length === 0 ? (
|
{dataSource.value.length === 0 ? (
|
||||||
|
|||||||
Reference in New Issue
Block a user