From 823879add051374d327eae0603f7a71bff82d701 Mon Sep 17 00:00:00 2001 From: shaohuzhang1 Date: Mon, 20 May 2024 11:18:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AF=B9=E8=AF=9D=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serializers/chat_serializers.py | 9 ++++++-- apps/application/views/chat_views.py | 5 +++-- ui/src/api/log.ts | 8 ++++--- ui/src/components/ai-chat/index.vue | 2 +- ui/src/stores/modules/log.ts | 5 +++-- ui/src/views/chat/embed/index.vue | 12 +++++++++-- ui/src/views/chat/pc/index.vue | 21 ++++++++++++++----- 7 files changed, 45 insertions(+), 17 deletions(-) diff --git a/apps/application/serializers/chat_serializers.py b/apps/application/serializers/chat_serializers.py index efdc7925a..cedfffbf0 100644 --- a/apps/application/serializers/chat_serializers.py +++ b/apps/application/serializers/chat_serializers.py @@ -337,13 +337,16 @@ class ChatRecordSerializer(serializers.Serializer): class Query(serializers.Serializer): application_id = serializers.UUIDField(required=True) chat_id = serializers.UUIDField(required=True) + order_asc = serializers.BooleanField(required=False) def list(self, with_valid=True): if with_valid: self.is_valid(raise_exception=True) QuerySet(ChatRecord).filter(chat_id=self.data.get('chat_id')) + order_by = 'create_time' if self.data.get('order_asc') is None or self.data.get( + 'order_asc') else '-create_time' return [ChatRecordSerializerModel(chat_record).data for chat_record in - QuerySet(ChatRecord).filter(chat_id=self.data.get('chat_id')).order_by("create_time")] + QuerySet(ChatRecord).filter(chat_id=self.data.get('chat_id')).order_by(order_by)] @staticmethod def reset_chat_record(chat_record): @@ -372,8 +375,10 @@ class ChatRecordSerializer(serializers.Serializer): def page(self, current_page: int, page_size: int, with_valid=True): if with_valid: self.is_valid(raise_exception=True) + order_by = 'create_time' if self.data.get('order_asc') is None or self.data.get( + 'order_asc') else '-create_time' page = page_search(current_page, page_size, - QuerySet(ChatRecord).filter(chat_id=self.data.get('chat_id')).order_by("create_time"), + QuerySet(ChatRecord).filter(chat_id=self.data.get('chat_id')).order_by(order_by), post_records_handler=lambda chat_record: self.reset_chat_record(chat_record)) return page diff --git a/apps/application/views/chat_views.py b/apps/application/views/chat_views.py index 9ff3ce555..3bae2b877 100644 --- a/apps/application/views/chat_views.py +++ b/apps/application/views/chat_views.py @@ -221,7 +221,7 @@ class ChatView(APIView): def get(self, request: Request, application_id: str, chat_id: str): return result.success(ChatRecordSerializer.Query( data={'application_id': application_id, - 'chat_id': chat_id}).list()) + 'chat_id': chat_id, 'order_asc': request.query_params.get('order_asc')}).list()) class Page(APIView): authentication_classes = [TokenAuth] @@ -242,7 +242,8 @@ class ChatView(APIView): def get(self, request: Request, application_id: str, chat_id: str, current_page: int, page_size: int): return result.success(ChatRecordSerializer.Query( data={'application_id': application_id, - 'chat_id': chat_id}).page(current_page, page_size)) + 'chat_id': chat_id, 'order_asc': request.query_params.get('order_asc')}).page(current_page, + page_size)) class Vote(APIView): authentication_classes = [TokenAuth] diff --git a/ui/src/api/log.ts b/ui/src/api/log.ts index 57126a3d5..42327cde9 100644 --- a/ui/src/api/log.ts +++ b/ui/src/api/log.ts @@ -64,11 +64,13 @@ const getChatRecordLog: ( application_id: String, chart_id: String, page: pageRequest, - loading?: Ref -) => Promise> = (application_id, chart_id, page, loading) => { + loading?: Ref, + order_asc?: boolean +) => Promise> = (application_id, chart_id, page, loading, order_asc) => { + console.log(order_asc) return get( `${prefix}/${application_id}/chat/${chart_id}/chat_record/${page.current_page}/${page.page_size}`, - undefined, + { order_asc: order_asc !== undefined ? order_asc : true }, loading ) } diff --git a/ui/src/components/ai-chat/index.vue b/ui/src/components/ai-chat/index.vue index 8c7c5831a..61b491f99 100644 --- a/ui/src/components/ai-chat/index.vue +++ b/ui/src/components/ai-chat/index.vue @@ -564,7 +564,7 @@ const handleScrollTop = ($event: any) => { } else { scorll.value = false } - emit('scroll', $event) + emit('scroll', { ...$event, dialogScrollbar: dialogScrollbar.value, scrollDiv: scrollDiv.value }) } const handleScroll = () => { diff --git a/ui/src/stores/modules/log.ts b/ui/src/stores/modules/log.ts index 194aa91ec..cc08ad303 100644 --- a/ui/src/stores/modules/log.ts +++ b/ui/src/stores/modules/log.ts @@ -23,11 +23,12 @@ const useLogStore = defineStore({ id: string, chatId: string, page: pageRequest, - loading?: Ref + loading?: Ref, + order_asc?: boolean ) { return new Promise((resolve, reject) => { logApi - .getChatRecordLog(id, chatId, page, loading) + .getChatRecordLog(id, chatId, page, loading, order_asc) .then((data) => { resolve(data) }) diff --git a/ui/src/views/chat/embed/index.vue b/ui/src/views/chat/embed/index.vue index e43fdf3f9..26119ba8a 100644 --- a/ui/src/views/chat/embed/index.vue +++ b/ui/src/views/chat/embed/index.vue @@ -135,14 +135,22 @@ function getChatLog(id: string) { function getChatRecord() { log - .asyncChatRecordLog(applicationDetail.value.id, currentChatId.value, paginationConfig, loading) + .asyncChatRecordLog( + applicationDetail.value.id, + currentChatId.value, + paginationConfig, + loading, + false + ) .then((res: any) => { paginationConfig.total = res.data.total const list = res.data.records list.map((v: any) => { v['write_ed'] = true }) - currentRecordList.value = [...currentRecordList.value, ...list] + currentRecordList.value = [...list, ...currentRecordList.value].sort((a, b) => + a.create_time.localeCompare(b.create_time) + ) }) } diff --git a/ui/src/views/chat/pc/index.vue b/ui/src/views/chat/pc/index.vue index 5e1be5a8b..4fa33804b 100644 --- a/ui/src/views/chat/pc/index.vue +++ b/ui/src/views/chat/pc/index.vue @@ -90,7 +90,7 @@ const chatLogeData = ref([]) const paginationConfig = reactive({ current_page: 1, - page_size: 20, + page_size: 3, total: 0 }) @@ -100,8 +100,11 @@ const currentChatName = ref('新建对话') function handleScroll(event: any) { if (event.scrollTop === 0 && paginationConfig.total > currentRecordList.value.length) { + const histry_height = event.dialogScrollbar.offsetHeight paginationConfig.current_page += 1 - getChatRecord() + getChatRecord().then(() => { + event.scrollDiv.setScrollTop(event.dialogScrollbar.offsetHeight - histry_height) + }) } } @@ -152,15 +155,23 @@ function getChatLog(id: string) { } function getChatRecord() { - log - .asyncChatRecordLog(applicationDetail.value.id, currentChatId.value, paginationConfig, loading) + return log + .asyncChatRecordLog( + applicationDetail.value.id, + currentChatId.value, + paginationConfig, + loading, + false + ) .then((res: any) => { paginationConfig.total = res.data.total const list = res.data.records list.map((v: any) => { v['write_ed'] = true }) - currentRecordList.value = [...list, ...currentRecordList.value] + currentRecordList.value = [...list, ...currentRecordList.value].sort((a, b) => + a.create_time.localeCompare(b.create_time) + ) if (paginationConfig.current_page === 1) { nextTick(() => { // 将滚动条滚动到最下面