yangyin
2024-11-05 0f62897b6c82b90f3d0cbac88b75be99e30b70d1
src/components/chat/components/playBar/phrase/CommonPhrases.vue
@@ -1,7 +1,7 @@
<template>
   <div class="container" :class="isHome ? 'top-[100%] mt-[8px]' : 'bottom-[100%] mb-[8px]'">
      <div class="container_header">
         <div class="title">常用语</div>
         <div class="question">常用语</div>
         <span class="ywifont ywicon-guanbi text-[15px] cursor-pointer text-[#767a97]" @click="closeCommonPhrases"></span>
      </div>
      <div class="container_content">
@@ -9,10 +9,10 @@
            <div class="w-full h-full absolute top-0">
               <div class="py-0 mt-0 box-border h-full">
                  <div style="overflow-anchor: none" v-for="(item, index) in commonPhrases" :key="index">
                     <div class="phase_item">
                     <div class="phase_item" @click="titleClick(item)">
                        <div class="flex flex-col">
                           <div class="title" @click="titleClick(item)">
                              {{ item.title }}
                           <div class="question">
                              {{ item.question }}
                           </div>
                           <!-- <div class="content">
                              {{ item.content }}
@@ -21,11 +21,11 @@
                        <div class="py-2">
                           <span
                              class="ywifont ywicon-bianji cursor-pointer text-[#767a97] pt-[4px] pr-[6px] pb-[2px] pl-0 rounded-lg !text-[13px]"
                              @click="editCommonPhrases(item)"
                              @click.stop="editCommonPhrases(item)"
                           ></span>
                           <span
                              class="ywifont ywicon-shanchu3 cursor-pointer text-[red] pt-[4px] pr-[6px] pb-[2px] pl-0 rounded-lg"
                              @click="deleteCommonPhrases(item)"
                              @click.stop="deleteCommonPhrases(item)"
                           ></span>
                        </div>
                     </div>
@@ -59,15 +59,16 @@
</template>
<script setup lang="ts">
import { ElMessageBox } from 'element-plus';
import { computed, reactive, ref } from 'vue';
import { addUserSample } from '/@/api/ai/chat';
import { activeGroupType } from '/@/stores/chatRoom';
import { ElMessageBox, ElMessage } from 'element-plus';
import { computed, onMounted, reactive, ref } from 'vue';
import { addUserSample, deleteUserSample, listUserSample, updateUserSample } from '/@/api/ai/chat';
import { activeGroupType, activeRoomId, activeSampleId, setRoomConfig } from '/@/stores/chatRoom';
const state = reactive({
   useCommonPhrasesDialog: false,
   show_sample_title: false,
   inputCommonPhrases: '',
   sample_title: null,
   sample_id: null,
});
const commonPhrases = ref([]);
const props = defineProps(['isHome']);
@@ -85,7 +86,16 @@
   isShow.value = false;
};
//#endregion
//#region ====================== 获取常用语 ======================
const getCommonPhrases = async () => {
   const res = await listUserSample({
      group_type: activeGroupType.value,
   });
   if (res.json_ok) {
      commonPhrases.value = res.values;
   }
};
//#endregion
//#region ====================== 添加常用语 ======================
//关闭常用语弹窗
const handleClose = () => {
@@ -99,21 +109,42 @@
};
const editCommonPhrases = (item) => {
   state.useCommonPhrasesDialog = true;
   state.inputCommonPhrases = item.content;
   state.show_sample_title = true;
   state.inputCommonPhrases = item.question;
   state.sample_id = item.id;
};
const deleteCommonPhrases = (item) => {
   ElMessageBox.confirm(`你确定要删除常用语吗?<div style="white-space: pre-line;">[${item.title}]</div>`, '提示', {
const deleteCommonPhrases = (row) => {
   ElMessageBox.confirm(`你确定要删除常用语吗?`, '提示', {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: 'warning',
      dangerouslyUseHTMLString: true,
      type: 'warning',
   }).then(async () => {
      commonPhrases.value = commonPhrases.value.filter((i) => i.id !== item.id);
      const res = await deleteUserSample({
         sample_id: row.id,
      });
      const foundIndex = commonPhrases.value.findIndex((item) => item === row);
      foundIndex > -1 && commonPhrases.value.splice(foundIndex, 1);
   });
};
//提交常用语
const submitCommonPhrases = async () => {
   if (state.show_sample_title) {
      const res = await updateUserSample({
         sample_id: state.sample_id,
         question: state.inputCommonPhrases,
      });
      if (res.json_ok) {
         const foundIndex = commonPhrases.value.findIndex((item) => item.id === state.sample_id);
         foundIndex > -1 && (commonPhrases.value[foundIndex].question = state.inputCommonPhrases);
         handleClose();
      }
   } else {
      addCommonPhrasesData();
   }
};
//添加一条数据源
const addCommonPhrasesData = async () => {
   const res = await addUserSample({
      question: state.inputCommonPhrases,
      group_type: activeGroupType.value,
@@ -121,15 +152,36 @@
   if (res.json_ok) {
      commonPhrases.value.push({
         id: res.sample_id,
         title: state.inputCommonPhrases,
         question: state.inputCommonPhrases,
      });
      state.useCommonPhrasesDialog = false;
      handleClose();
   }
};
//#endregion
//#region ====================== 常用语到对话框 ======================
const titleClick = (item) => {};
const emits = defineEmits<{
   (event: 'updateCommonChatInput', val): void;
}>();
const titleClick = (item) => {
   emits('updateCommonChatInput', item.question);
   setRoomConfig(activeRoomId.value, 'isAnswerByLLM', false);
   activeSampleId.value = item.id;
};
const commonChatByUser = (data) => {
   const question = data.question;
   const isCommon = commonPhrases.value.findIndex((item) => item.question === question) > -1;
   if (isCommon) {
      return ElMessage.warning('该问题已存在常用语中');
   } else {
      state.inputCommonPhrases = question;
      addCommonPhrasesData();
   }
};
//#endregion
onMounted(() => {
   getCommonPhrases();
});
defineExpose({ commonChatByUser, getCommonPhrases });
</script>
<style scoped lang="scss">
.container {
@@ -153,7 +205,7 @@
      align-items: center;
      padding: 10px 6px;
      color: #060607;
      .title {
      .question {
         font-size: 14px;
         color: #060607;
         font-weight: 600;
@@ -187,16 +239,19 @@
            &:hover {
               background: #e5e7ed;
            }
            .title {
            .question {
               font-size: 14px;
               color: #060607;
               font-family: PingFang HK;
               font-weight: 600;
               color: #8d8e99;
               font-weight: 400;
               font-style: normal;
               white-space: nowrap;
               text-overflow: ellipsis;
               overflow: hidden;
               &:hover {
                  color: #060607;
               }
            }
            .content {
               font-size: 12px;
               color: #5e6772;