From 394f32a766e99dd14ec65cdaf5e920fc682eea38 Mon Sep 17 00:00:00 2001
From: yangyin <1850366751@qq.com>
Date: 星期二, 19 十一月 2024 15:57:26 +0800
Subject: [PATCH] 修改左侧边样式

---
 src/layout/component/sidebar/components/ChatRecord.vue |   62 +++++-------
 src/layout/component/sidebar/SidebarOther.vue          |  204 ++++++++++++++++++++++++++++++++++++++--
 src/stores/chatRoom.ts                                 |   33 ++++++
 3 files changed, 248 insertions(+), 51 deletions(-)

diff --git a/src/layout/component/sidebar/SidebarOther.vue b/src/layout/component/sidebar/SidebarOther.vue
index 9e0afa6..216d6a1 100644
--- a/src/layout/component/sidebar/SidebarOther.vue
+++ b/src/layout/component/sidebar/SidebarOther.vue
@@ -12,7 +12,7 @@
 					</div>
 				</el-tooltip>
 				<el-tooltip content="鍘嗗彶浼氳瘽" placement="right">
-					<div class="nav__chat">
+					<div class="nav__chat" @click="historyChatRoomClick()">
 						<div class="nav__chat-icon">
 							<span class="chat_img ywifont ywicon-cshy-shizhong !text-[28px] text-[#fff]"></span>
 						</div>
@@ -42,16 +42,79 @@
 				</div>
 			</div>
 		</div>
+		<div class="nav_history_list bg-[#1c1e1d]" v-show="isShowHistoryChatRoom" ref="historyChatRoomRef">
+			<div class="flex flex-col flex-auto w-[210.98px] rounded-t-lg box-border relative opacity-100 overflow-y-auto h100 p-[12px]">
+				<div class="group flex-0 relative w100 h-[34px] bg-[#2b2c30]">
+					<el-input clearable v-model="queryParams.title" placeholder="鎼滅储" class="set-input">
+						<template #prefix>
+							<el-icon><search /></el-icon>
+						</template>
+					</el-input>
+					<div
+						class="absolute hidden top-[100%] w-[84px] z-[1001] left-0 group-hover:block overflow-hidden rounded-md text-sm text-gray-500 bg-[#fff] py-1.5"
+					>
+						<div
+							class="w100 relative hover:bg-[#e6f1ff]"
+							v-for="item in Object.keys(dateFilterMap)"
+							:key="item"
+							@click="filterDateClick(Number(item))"
+						>
+							<div
+								class="size-2 absolute left-2 rounded-full bg-[#2a82e4]"
+								:style="{ display: item === activeDateFilter + '' ? 'block' : 'none' }"
+								style="top: calc(50% - 0.25rem)"
+							></div>
+							<div class="w100 relative h-[28px] flex items-center justify-center cursor-pointer">{{ dateFilterMap[item] }}</div>
+						</div>
+					</div>
+				</div>
+
+				<div class="flex-auto text-[#ccc] flex flex-col items-center mt-6 overflow-y-auto" ref="chatRoomRef">
+					<div
+						:class="{ 'bg-[#41424a]': item.id === activeRoomId }"
+						class="group flex items-center w-full h-10 rounded-md cursor-pointer px-2 py-2 flex-0"
+						v-for="(item, index) in queryData"
+						:key="index"
+						@click="roomClick(item)"
+					>
+						<div class="ywifont ywicon-xiaoxi1 flex-0 mr-2.5"></div>
+						<div class="flex-auto text-ellipsis text-nowrap text-sm group-hover:text-[#0084ff]">{{ item.title }}</div>
+						<div class="text-gray-100 flex items-center space-x-2 ml-1">
+							<el-popconfirm title="纭畾鍒犻櫎鑱婂ぉ璁板綍?" @confirm.stop="confirmDeleteChatRoom(item)" width="180">
+								<template #reference>
+									<div class="ywifont invisible ywicon-shanchu3 group-hover:visible"></div>
+								</template>
+							</el-popconfirm>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
 	</div>
 </template>
 
 <script setup lang="ts">
-import { computed, onMounted, ref, watchEffect } from 'vue';
-import { isLoginStatus, isSharePage, isShowLogin, newChatRoomClick } from '/@/stores/chatRoom';
+import { onClickOutside } from '@vueuse/core';
+import moment from 'moment';
+import { computed, onMounted, ref, watch, watchEffect } from 'vue';
+import type { ChatRoomItem } from './components/types';
+import { DeleteHistoryGroups } from '/@/api/ai/chat';
+import { useSearch } from '/@/hooks/useSearch';
+import { DateFilter, dateFilterMap } from '/@/model/types/date';
+import {
+	activeRoomId,
+	chatRoomList,
+	gotoAnswerPage,
+	isLoginStatus,
+	isSharePage,
+	isShowLogin,
+	newChatRoomClick,
+} from '/@/stores/chatRoom';
 import emitter from '/@/utils/mitt';
 import { accessSessionKey, userNameKey } from '/@/utils/request';
-import { Local, LoginInfo } from '/@/utils/storage';
 import { gotoRoute } from '/@/utils/route';
+import { Local, LoginInfo } from '/@/utils/storage';
+import { debounce, getRecentDateRange } from '/@/utils/util';
 const emit = defineEmits(['toggleSidebar']);
 const prop = defineProps(['isShow']);
 const userName = ref('');
@@ -61,10 +124,43 @@
 const toggleSidebar = () => {
 	emit('toggleSidebar', false);
 };
-//#region ====================== 鍏徃淇℃伅 ======================
-	const companyClick = () => {
-		gotoRoute({ name: "AboutUs" });
+//#region ====================== 鍘嗗彶浼氳瘽 ===================
+const isShowHistoryChatRoom = ref(false);
+const historyChatRoomRef = ref(null);
+const chatRoomRef = ref<HTMLDivElement>(null);
+const queryParams = ref({
+	title: '',
+});
+const historyChatRoomClick = () => {
+	isShowHistoryChatRoom.value = true;
+};
+const roomClick = (room: ChatRoomItem) => {
+	activeRoomId.value = room.id;
+	gotoAnswerPage(room);
+};
+const confirmDeleteChatRoom = async (room: ChatRoomItem) => {
+	const res = await DeleteHistoryGroups({
+		history_group_id: room.id,
+	});
+
+	const foundIndex = chatRoomList.value.findIndex((item) => item === room);
+	chatRoomList.value.splice(foundIndex, 1);
+	if (chatRoomList.value.length === 0) {
+		newChatRoomClick();
+		return;
 	}
+	roomClick(chatRoomList.value[0]);
+	chatRoomRef.value.firstElementChild?.scrollIntoView();
+};
+
+onClickOutside(historyChatRoomRef, () => {
+	isShowHistoryChatRoom.value = false;
+});
+//#endregion
+//#region ====================== 鍏徃淇℃伅 ======================
+const companyClick = () => {
+	gotoRoute({ name: 'AboutUs' });
+};
 //#endregion
 //#region ====================== 鏄剧ず/閫�鍑虹櫥褰� ======================
 //鐧诲綍
@@ -85,17 +181,53 @@
 };
 const toggleExitLoginBtnRef = ref<HTMLDivElement>(null);
 
-const listenClickOtherExit = (e) => {
-	if (toggleExitLoginBtnRef.value !== e.target && !toggleExitLoginBtnRef.value?.contains(e.target)) {
-		isShowExitLogin.value = false;
-	}
+onClickOutside(toggleExitLoginBtnRef, () => {
+	isShowExitLogin.value = false;
+});
+//#endregion
+//#region ====================== 鏃ユ湡绛涢�� ======================
+const activeDateFilter = ref<DateFilter>(DateFilter.All);
+const filterDateClick = (dateFilter: DateFilter) => {
+	activeDateFilter.value = dateFilter;
 };
+const filteredChatRoomList = computed(() => {
+	if (activeDateFilter.value === DateFilter.All) return chatRoomList.value;
+	else {
+		let dayCount = null;
+		switch (activeDateFilter.value) {
+			case DateFilter.AWeek:
+				dayCount = 7;
+				break;
+
+			case DateFilter.AMonth:
+				dayCount = 30;
+
+				break;
+			case DateFilter.ThreeMonth:
+				dayCount = 90;
+				break;
+		}
+		const [startDay, endDay] = getRecentDateRange(dayCount);
+		const data = chatRoomList.value.filter((item) => moment(item.createTime).isBetween(startDay, endDay));
+		return data;
+	}
+});
+//#endregion
+//#region ====================== 鎼滅储鑱婂ぉ瀹� ======================
+const { query, queryData } = useSearch(filteredChatRoomList, queryParams);
+const debounceQuery = debounce(query);
+watch(
+	() => queryParams.value.title,
+	(val) => {
+		debounceQuery();
+	}
+);
 //#endregion
 watchEffect(() => {
 	if (!isLoginStatus.value) return;
 	userName.value = Local.get(userNameKey);
 });
-onMounted(() => {
+onMounted(async () => {
 	emitter.on('openLoginDlg', () => {
 		if (isShowLogin.value || isLoginStatus.value) return;
 		openLoginDlg();
@@ -103,7 +235,6 @@
 	emitter.on('logout', () => {
 		logoutClick();
 	});
-	document.addEventListener('click', listenClickOtherExit);
 });
 </script>
 
@@ -168,12 +299,13 @@
 						line-height: 0;
 						text-align: center;
 						text-transform: none;
-
+						height: 40px;
 						text-rendering: optimizeLegibility;
 						-webkit-font-smoothing: antialiased;
 					}
 				}
 			}
+
 			.nav__profile {
 				width: 40px;
 				height: 40px;
@@ -226,4 +358,48 @@
 		}
 	}
 }
+.nav_history_list {
+	overflow: hidden;
+	border-left: 1px solid rgba(237, 239, 245, 0.45);
+	width: 211px;
+	height: calc(100% - 42px);
+	position: absolute;
+	right: 0px;
+	left: 65px;
+	z-index: 100;
+	top: 42px;
+	opacity: 1;
+	transition: opacity 0.2s;
+}
+.set-input {
+	:deep(.el-input__wrapper) {
+		width: 100%;
+		height: 100%;
+		font-size: 12px;
+		font-weight: 400;
+		letter-spacing: 0;
+		color: #e5e5e5;
+		border-radius: 6px;
+		border: 1px solid transparent;
+		box-sizing: border-box;
+		line-height: 34px;
+		// padding-left: 31px;
+		padding-right: 10px;
+		background-color: transparent;
+		cursor: pointer;
+		transition: color 0.2s ease-in-out;
+		box-shadow: unset;
+	}
+	:deep(.el-input__inner) {
+		&::placeholder {
+			color: white;
+		}
+		color: white;
+	}
+}
+::-webkit-scrollbar {
+	height: 0;
+	width: 0;
+	color: transparent;
+}
 </style>
diff --git a/src/layout/component/sidebar/components/ChatRecord.vue b/src/layout/component/sidebar/components/ChatRecord.vue
index 520b30f..e959c1a 100644
--- a/src/layout/component/sidebar/components/ChatRecord.vue
+++ b/src/layout/component/sidebar/components/ChatRecord.vue
@@ -65,23 +65,19 @@
 
 <script setup lang="ts">
 import { Search } from '@element-plus/icons-vue';
-import { computed, onMounted, onUnmounted, reactive, ref, watch } from 'vue';
-import type { ChatRoomItem } from './types';
-import { CreateHistoryGroup, DeleteHistoryGroups, GetHistoryGroups } from '/@/api/ai/chat';
-import router from '/@/router';
-import { activeChatRoom, activeRoomId, chatRoomList, gotoAnswerPage, newChatRoomClick } from '/@/stores/chatRoom';
-import { DateFilter, dateFilterMap } from '/@/model/types/date';
-import { debounce, getRecentDateRange } from '/@/utils/util';
 import moment from 'moment';
+import { computed, onMounted, ref, watch } from 'vue';
+import type { ChatRoomItem } from './types';
+import { DeleteHistoryGroups } from '/@/api/ai/chat';
 import { useSearch } from '/@/hooks/useSearch';
-import { gotoRoute } from '/@/utils/route';
-import emitter from '/@/utils/mitt';
+import { DateFilter, dateFilterMap } from '/@/model/types/date';
+import { activeRoomId, chatRoomList, gotoAnswerPage, newChatRoomClick } from '/@/stores/chatRoom';
+import { debounce, getRecentDateRange } from '/@/utils/util';
 
 const chatRoomRef = ref<HTMLDivElement>(null);
 const queryParams = ref({
 	title: '',
 });
-
 
 const roomClick = (room: ChatRoomItem) => {
 	activeRoomId.value = room.id;
@@ -150,32 +146,28 @@
 //#endregion
 
 onMounted(async () => {
-	const res = await GetHistoryGroups();
-
-	const resData = (res?.groups || []) as any[];
-	// 鎸夋渶鏅氭椂闂村埌鏈�鏃╂椂闂�
-	chatRoomList.value = resData
-		?.toSorted((a, b) => {
-			return b.create_time.localeCompare(a.create_time);
-		})
-		.map((item) => {
-			return {
-				id: item.group_id,
-				title: item.group_title,
-				createTime: item.create_time,
-				isInitial: Number(item.chat_count) === 0,
-			};
-		});
-
-	if (!chatRoomList.value || chatRoomList.value.length === 0) {
-		newChatRoomClick();
-	} else {
-		const toClickRoom = activeChatRoom.value ?? chatRoomList.value[0];
-		roomClick(toClickRoom);
-	}
+	// const res = await GetHistoryGroups();
+	// const resData = (res?.groups || []) as any[];
+	// // 鎸夋渶鏅氭椂闂村埌鏈�鏃╂椂闂�
+	// chatRoomList.value = resData
+	// 	?.toSorted((a, b) => {
+	// 		return b.create_time.localeCompare(a.create_time);
+	// 	})
+	// 	.map((item) => {
+	// 		return {
+	// 			id: item.group_id,
+	// 			title: item.group_title,
+	// 			createTime: item.create_time,
+	// 			isInitial: Number(item.chat_count) === 0,
+	// 		};
+	// 	});
+	// if (!chatRoomList.value || chatRoomList.value.length === 0) {
+	// 	newChatRoomClick();
+	// } else {
+	// 	const toClickRoom = activeChatRoom.value ?? chatRoomList.value[0];
+	// 	roomClick(toClickRoom);
+	// }
 });
-
-
 </script>
 <style scoped lang="scss">
 .set-input {
diff --git a/src/stores/chatRoom.ts b/src/stores/chatRoom.ts
index a103424..3b07229 100644
--- a/src/stores/chatRoom.ts
+++ b/src/stores/chatRoom.ts
@@ -1,5 +1,5 @@
-import { computed, nextTick, ref } from 'vue';
-import { CreateHistoryGroup, getSectionList, getSelectSample, getUserTemplateList } from '../api/ai/chat';
+import { computed, ref } from 'vue';
+import { CreateHistoryGroup, GetHistoryGroups, getSectionList, getSelectSample, getUserTemplateList } from '../api/ai/chat';
 import type { ChatRoomItem } from '../layout/component/sidebar/components/types';
 import { router } from '../router';
 import emitter from '../utils/mitt';
@@ -125,6 +125,7 @@
 export const getAllData = async () => {
 	getSceneGroupList();
 	getSelectListSample();
+	getHistoryChatRooms();
 };
 
 //#endregion
@@ -195,3 +196,31 @@
 		return !this.get()?.web_login;
 	},
 };
+
+//鍘嗗彶瀵硅瘽
+const getHistoryChatRooms = async () => {
+	const res = await GetHistoryGroups();
+	const resData = (res?.groups || []) as any[];
+	chatRoomList.value = resData; // 鎸夋渶鏅氭椂闂村埌鏈�鏃╂椂闂�
+	chatRoomList.value = resData
+		?.toSorted((a, b) => {
+			return b.create_time.localeCompare(a.create_time);
+		})
+		.map((item) => {
+			return {
+				id: item.group_id,
+				title: item.group_title,
+				createTime: item.create_time,
+				isInitial: Number(item.chat_count) === 0,
+			};
+		});
+
+	if (!chatRoomList.value || chatRoomList.value.length === 0) {
+		newChatRoomClick();
+	} else {
+		const toClickRoom = activeChatRoom.value ?? chatRoomList.value[0];
+		activeRoomId.value = toClickRoom.id;
+
+		gotoAnswerPage(toClickRoom);
+	}
+};

--
Gitblit v1.9.3