Merge remote-tracking branch 'origin/feature/v1.3_主agent_rxd' into test

This commit is contained in:
rd
2025-08-29 16:44:36 +08:00
11 changed files with 109 additions and 80 deletions

View File

@ -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>

View File

@ -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>

View File

@ -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 {

View File

@ -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">

View File

@ -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>
); );
}, },
}); });

View File

@ -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,
}, },
}, },
], ],

View File

@ -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();

View File

@ -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

View File

@ -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>

View File

@ -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()" />

View File

@ -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 ? (