* feat: 添加聊天记录删除按钮及功能 #548
This commit is contained in:
parent
3f38f14caa
commit
4c1fcba546
18
apps/application/migrations/0008_chat_is_deleted.py
Normal file
18
apps/application/migrations/0008_chat_is_deleted.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 4.1.13 on 2024-06-13 11:46
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('application', '0007_alter_application_prologue'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='chat',
|
||||||
|
name='is_deleted',
|
||||||
|
field=models.BooleanField(default=False, verbose_name=''),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -75,6 +75,7 @@ class Chat(AppModelMixin):
|
|||||||
application = models.ForeignKey(Application, on_delete=models.CASCADE)
|
application = models.ForeignKey(Application, on_delete=models.CASCADE)
|
||||||
abstract = models.CharField(max_length=1024, verbose_name="摘要")
|
abstract = models.CharField(max_length=1024, verbose_name="摘要")
|
||||||
client_id = models.UUIDField(verbose_name="客户端id", default=None, null=True)
|
client_id = models.UUIDField(verbose_name="客户端id", default=None, null=True)
|
||||||
|
is_deleted = models.BooleanField(verbose_name="", default=False)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
db_table = "application_chat"
|
db_table = "application_chat"
|
||||||
|
|||||||
@ -50,6 +50,13 @@ class ChatSerializers(serializers.Serializer):
|
|||||||
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话id"))
|
chat_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("对话id"))
|
||||||
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
|
application_id = serializers.UUIDField(required=True, error_messages=ErrMessage.uuid("应用id"))
|
||||||
|
|
||||||
|
def logic_delete(self, with_valid=True):
|
||||||
|
if with_valid:
|
||||||
|
self.is_valid(raise_exception=True)
|
||||||
|
QuerySet(Chat).filter(id=self.data.get('chat_id'), application_id=self.data.get('application_id')).update(
|
||||||
|
is_deleted=True)
|
||||||
|
return True
|
||||||
|
|
||||||
def delete(self, with_valid=True):
|
def delete(self, with_valid=True):
|
||||||
if with_valid:
|
if with_valid:
|
||||||
self.is_valid(raise_exception=True)
|
self.is_valid(raise_exception=True)
|
||||||
@ -64,7 +71,8 @@ class ChatSerializers(serializers.Serializer):
|
|||||||
if with_valid:
|
if with_valid:
|
||||||
self.is_valid(raise_exception=True)
|
self.is_valid(raise_exception=True)
|
||||||
queryset = QuerySet(Chat).filter(client_id=self.data.get('client_id'),
|
queryset = QuerySet(Chat).filter(client_id=self.data.get('client_id'),
|
||||||
application_id=self.data.get('application_id'))
|
application_id=self.data.get('application_id'),
|
||||||
|
is_deleted=False)
|
||||||
queryset = queryset.order_by('-create_time')
|
queryset = queryset.order_by('-create_time')
|
||||||
return page_search(current_page, page_size, queryset, lambda row: ChatSerializerModel(row).data)
|
return page_search(current_page, page_size, queryset, lambda row: ChatSerializerModel(row).data)
|
||||||
|
|
||||||
|
|||||||
@ -32,6 +32,8 @@ urlpatterns = [
|
|||||||
path("application/chat/open", views.ChatView.OpenTemp.as_view()),
|
path("application/chat/open", views.ChatView.OpenTemp.as_view()),
|
||||||
path("application/<str:application_id>/chat/client/<int:current_page>/<int:page_size>",
|
path("application/<str:application_id>/chat/client/<int:current_page>/<int:page_size>",
|
||||||
views.ChatView.ClientChatHistoryPage.as_view()),
|
views.ChatView.ClientChatHistoryPage.as_view()),
|
||||||
|
path("application/<str:application_id>/chat/client/<chat_id>",
|
||||||
|
views.ChatView.ClientChatHistoryPage.Operate.as_view()),
|
||||||
path('application/<str:application_id>/chat/export', views.ChatView.Export.as_view(), name='export'),
|
path('application/<str:application_id>/chat/export', views.ChatView.Export.as_view(), name='export'),
|
||||||
path('application/<str:application_id>/chat', views.ChatView.as_view(), name='chats'),
|
path('application/<str:application_id>/chat', views.ChatView.as_view(), name='chats'),
|
||||||
path('application/<str:application_id>/chat/<int:current_page>/<int:page_size>', views.ChatView.Page.as_view()),
|
path('application/<str:application_id>/chat/<int:current_page>/<int:page_size>', views.ChatView.Page.as_view()),
|
||||||
|
|||||||
@ -160,6 +160,25 @@ class ChatView(APIView):
|
|||||||
current_page=current_page,
|
current_page=current_page,
|
||||||
page_size=page_size))
|
page_size=page_size))
|
||||||
|
|
||||||
|
class Operate(APIView):
|
||||||
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
|
@action(methods=['DELETE'], detail=False)
|
||||||
|
@swagger_auto_schema(operation_summary="客户端删除对话",
|
||||||
|
operation_id="客户端删除对话",
|
||||||
|
tags=["应用/对话日志"])
|
||||||
|
@has_permissions(ViewPermission(
|
||||||
|
[RoleConstants.APPLICATION_ACCESS_TOKEN],
|
||||||
|
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
|
||||||
|
dynamic_tag=keywords.get('application_id'))],
|
||||||
|
compare=CompareConstants.AND),
|
||||||
|
compare=CompareConstants.AND)
|
||||||
|
def delete(self, request: Request, application_id: str, chat_id: str):
|
||||||
|
return result.success(
|
||||||
|
ChatSerializers.Operate(
|
||||||
|
data={'application_id': application_id, 'user_id': request.user.id,
|
||||||
|
'chat_id': chat_id}).logic_delete())
|
||||||
|
|
||||||
class Page(APIView):
|
class Page(APIView):
|
||||||
authentication_classes = [TokenAuth]
|
authentication_classes = [TokenAuth]
|
||||||
|
|
||||||
|
|||||||
@ -186,6 +186,18 @@ const getChatLogClient: (
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 客户端删除日志
|
||||||
|
* @param 参数 application_id, chat_id,
|
||||||
|
*/
|
||||||
|
const delChatClientLog: (
|
||||||
|
application_id: string,
|
||||||
|
chat_id: string,
|
||||||
|
loading?: Ref<boolean>
|
||||||
|
) => Promise<Result<boolean>> = (application_id, chat_id, loading) => {
|
||||||
|
return del(`${prefix}/${application_id}/chat/client/${chat_id}`, undefined, {}, loading)
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
getChatLog,
|
getChatLog,
|
||||||
delChatLog,
|
delChatLog,
|
||||||
@ -195,5 +207,6 @@ export default {
|
|||||||
getRecordDetail,
|
getRecordDetail,
|
||||||
delMarkRecord,
|
delMarkRecord,
|
||||||
exportChatLog,
|
exportChatLog,
|
||||||
getChatLogClient
|
getChatLogClient,
|
||||||
|
delChatClientLog
|
||||||
}
|
}
|
||||||
|
|||||||
@ -96,7 +96,6 @@
|
|||||||
plain
|
plain
|
||||||
size="small"
|
size="small"
|
||||||
@click="openParagraph(item)"
|
@click="openParagraph(item)"
|
||||||
:disabled="!item.paragraph_list || item.paragraph_list?.length === 0"
|
|
||||||
>引用分段:{{ item.paragraph_list?.length || 0 }}</el-button
|
>引用分段:{{ item.paragraph_list?.length || 0 }}</el-button
|
||||||
>
|
>
|
||||||
<el-tag type="info" effect="plain" class="mr-8 mt-8">
|
<el-tag type="info" effect="plain" class="mr-8 mt-8">
|
||||||
|
|||||||
@ -48,6 +48,18 @@ const useLogStore = defineStore({
|
|||||||
reject(error)
|
reject(error)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
async asyncDelChatClientLog(id: string, chatId: string, loading?: Ref<boolean>) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
logApi
|
||||||
|
.delChatClientLog(id, chatId, loading)
|
||||||
|
.then((data) => {
|
||||||
|
resolve(data)
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
reject(error)
|
||||||
|
})
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@ -45,9 +45,16 @@
|
|||||||
@click="clickListHandle"
|
@click="clickListHandle"
|
||||||
>
|
>
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
|
<div class="flex-between">
|
||||||
<auto-tooltip :content="row.abstract">
|
<auto-tooltip :content="row.abstract">
|
||||||
{{ row.abstract }}
|
{{ row.abstract }}
|
||||||
</auto-tooltip>
|
</auto-tooltip>
|
||||||
|
<div @click.stop>
|
||||||
|
<el-button text @click.stop="deleteLog(row)">
|
||||||
|
<el-icon><Delete /></el-icon>
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #empty>
|
<template #empty>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
@ -94,6 +101,18 @@ const paginationConfig = reactive({
|
|||||||
const currentRecordList = ref<any>([])
|
const currentRecordList = ref<any>([])
|
||||||
const currentChatId = ref('new') // 当前历史记录Id 默认为'new'
|
const currentChatId = ref('new') // 当前历史记录Id 默认为'new'
|
||||||
|
|
||||||
|
function deleteLog(row: any) {
|
||||||
|
log.asyncDelChatClientLog(applicationDetail.value.id, row.id, left_loading).then(() => {
|
||||||
|
if (currentChatId.value === row.id) {
|
||||||
|
currentChatId.value = 'new'
|
||||||
|
paginationConfig.current_page = 1
|
||||||
|
paginationConfig.total = 0
|
||||||
|
currentRecordList.value = []
|
||||||
|
}
|
||||||
|
getChatLog(applicationDetail.value.id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
function handleScroll(event: any) {
|
function handleScroll(event: any) {
|
||||||
if (
|
if (
|
||||||
currentChatId.value !== 'new' &&
|
currentChatId.value !== 'new' &&
|
||||||
|
|||||||
@ -25,9 +25,16 @@
|
|||||||
@click="clickListHandle"
|
@click="clickListHandle"
|
||||||
>
|
>
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
|
<div class="flex-between">
|
||||||
<auto-tooltip :content="row.abstract">
|
<auto-tooltip :content="row.abstract">
|
||||||
{{ row.abstract }}
|
{{ row.abstract }}
|
||||||
</auto-tooltip>
|
</auto-tooltip>
|
||||||
|
<div @click.stop>
|
||||||
|
<el-button text @click.stop="deleteLog(row)">
|
||||||
|
<el-icon><Delete /></el-icon>
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #empty>
|
<template #empty>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
@ -144,6 +151,19 @@ const currentRecordList = ref<any>([])
|
|||||||
const currentChatId = ref('new') // 当前历史记录Id 默认为'new'
|
const currentChatId = ref('new') // 当前历史记录Id 默认为'new'
|
||||||
const currentChatName = ref('新建对话')
|
const currentChatName = ref('新建对话')
|
||||||
|
|
||||||
|
function deleteLog(row: any) {
|
||||||
|
log.asyncDelChatClientLog(applicationDetail.value.id, row.id, left_loading).then(() => {
|
||||||
|
if (currentChatId.value === row.id) {
|
||||||
|
currentChatId.value = 'new'
|
||||||
|
currentChatName.value = '新建对话'
|
||||||
|
paginationConfig.value.current_page = 1
|
||||||
|
paginationConfig.value.total = 0
|
||||||
|
currentRecordList.value = []
|
||||||
|
}
|
||||||
|
getChatLog(applicationDetail.value.id)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
function handleScroll(event: any) {
|
function handleScroll(event: any) {
|
||||||
if (
|
if (
|
||||||
currentChatId.value !== 'new' &&
|
currentChatId.value !== 'new' &&
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user