yangyin
2024-10-29 5cb1b28d760e268a9e0bdb96843a654c240915b6
修改侧边组件的内容
已修改2个文件
104 ■■■■■ 文件已修改
src/components/drawer/CustomDrawer.vue 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/stores/chatRoom.ts 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/drawer/CustomDrawer.vue
@@ -5,19 +5,6 @@
        </div>
        <div class="pc-mouldboard column exampleSlide">
            <div class="header flex items-center justify-center">
                <!-- <div
                    class="box-border flex w-[234px] h-[32px] rounded-md items-center justify-between cursor-pointer relative border border-solid border-[#2c2d33]"
                >
                    <div
                        class="tabbar-item"
                        :class="activeGroupType.value === item.ID ? 'set-tabbar-active' : ''"
                        @click="handleTabClick(item)"
                        v-for="item in state.tabNameList"
                        :key="item.ID"
                    >
                        {{ item.Name }}
                    </div>
                </div> -->
                <i
                    class="ywifont ywicon-guanbi text-[#999] text-[18px] absolute right-[14px] top-5 cursor-pointer"
                    @click="handleCloseTemplate"
@@ -83,7 +70,7 @@
            <div class="box-border w-[354px] flex-1 min-h-0 bg-[#e0e7fb]" v-show="activeGroupType == '办公助手'">
                <div class="flex flex-col w100 h100 pt-0 pr-[15px] pb-0 pl-[20px]">
                    <div class="flex items-center w100 h-[30px] border border-solid border-[#b2b2b2] transition-[border-color 1s] rounded-2xl">
                        <el-input v-model="officeParams.template_title" placeholder="搜索更多" class="set-input" :prefix-icon="Search" clearable>
                        <el-input v-model="officeParams.sample_title" placeholder="搜索更多" class="set-input" :prefix-icon="Search" clearable>
                        </el-input>
                    </div>
                    <div class="mt10 w100 relative h100" v-show="state.customOfficeList.length > 0">
@@ -114,12 +101,12 @@
                            </div>
                        </div>
                        <div class="mt10 w100 overflow-auto set-height-custom">
                            <div class="w100 pb-[20px] flex flex-col" v-for="item in finalOfficeList" :key="item.group_id">
                            <div class="w100 pb-[20px] flex flex-col" v-for="item in finalOfficeList" :key="item.sample_id">
                                <div class="bg-[#f5f7fd] p-[12px] transition-[background-color .2s] flex flex-col rounded-2xl">
                                    <div class="flex justify-between">
                                        <span class="set-title">{{ item.template_title }}</span>
                                        <span class="set-title">{{ item.sample_title }}</span>
                                    </div>
                                    <div class="example-body ellipsis">{{ item.template_value }}</div>
                                    <div class="example-body ellipsis">{{ item.sample_question }}</div>
                                    <div class="example-bottom">
                                        <span class="example-item">{{ item.template_type }}</span>
                                        <el-button type="primary" class="set-button" @click="templateUseClick(item)">使用</el-button>
@@ -133,7 +120,7 @@
            <div class="box-border w-[354px] flex-1 min-h-0 bg-[#e0e7fb]" v-show="activeGroupType == '知识库'">
                <div class="flex flex-col w100 h100 pt-0 pr-[15px] pb-0 pl-[20px]">
                    <div class="flex items-center w100 h-[30px] border border-solid border-[#b2b2b2] transition-[border-color 1s] rounded-2xl">
                        <el-input v-model="queryParams.sample_title" placeholder="搜索更多" class="set-input" :prefix-icon="Search" clearable>
                        <el-input v-model="knowledgeParams.sample_title" placeholder="搜索更多" class="set-input" :prefix-icon="Search" clearable>
                        </el-input>
                    </div>
                    <div class="mt10 w100 relative h100" v-show="state.knowledgeBaseList.length > 0">
@@ -186,7 +173,7 @@
                    </div>
                </div>
            </div>
            <el-dialog v-model="state.useInstructDialog" :title="state.instructInfo?.template_title" width="500" :before-close="handleClose">
            <el-dialog v-model="state.useInstructDialog" :title="state.instructInfo?.sample_title" width="500" :before-close="handleClose">
                <el-input v-model="state.inputInstruct" :rows="10" type="textarea"></el-input>
                <template #footer>
                    <div class="dialog-footer">
@@ -202,9 +189,17 @@
<script setup lang="ts">
import { Search } from '@element-plus/icons-vue';
import { computed, reactive, ref, watch } from 'vue';
import { getSectionList, getSelectSample, getUserTemplateList } from '/@/api/ai/chat';
import { useSearch } from '/@/hooks/useSearch';
import { activeGroupType, activeRoomId, activeSampleId, activeSectionAId, sectionAList, setRoomConfig } from '/@/stores/chatRoom';
import {
    activeGroupType,
    activeRoomId,
    activeSampleId,
    activeSectionAId,
    exampleSceneList,
    sceneGroupList,
    sectionAList,
    setRoomConfig,
} from '/@/stores/chatRoom';
import { convertListToTree, debounce } from '/@/utils/util';
import { OptClassificationMap, classificationEnum } from '/@/views/types/processDrawing/index';
let state = reactive({
@@ -226,9 +221,6 @@
    exampleRandomContent: [],
    exampleContent: [],
    listSampleLoading: false,
    listInstructLoading: false,
    listSampleExpand: false,
    listInstructExpand: false,
});
//#region ====================== 传参 ======================
const isShow = defineModel('isShow', {
@@ -242,28 +234,9 @@
const exampleList = ref([]); //示例列表
//获取模版列表
const getSelectListSample = async () => {
    state.listSampleLoading = true;
    const res = await getSelectSample({}).finally(() => {
        state.listSampleLoading = false;
    });
    state.exampleRandomContent = res.samples;
    const array = [];
    res.samples.forEach((sample, index) => {
        sample.Icon = '/static/images/wave/ChatImg.png';
        sample.BgColor = randomHexColor();
        if (index < 4) {
            array.push(sample);
        }
    });
    exampleList.value = res.samples;
    state.exampleContent = array;
    exampleList.value = exampleSceneList.value;
};
//随机生成颜色
const randomHexColor = () => {
    return `#${Math.floor(Math.random() * 16777215)
        .toString(16)
        .padEnd(6, '0')}`;
};
const changeExample = (item) => {
    emit('updateChatInput', item.sample_question);
    setRoomConfig(activeRoomId.value, 'isAnswerByLLM', false);
@@ -272,11 +245,7 @@
};
//获取用户模板
const getUserTemplate = async () => {
    state.listInstructLoading = true;
    const res = await getUserTemplateList().finally(() => {
        state.listInstructLoading = false;
    });
    instructContentList.value = res.templates;
    instructContentList.value = exampleSceneList.value;
};
//#endregion
//#region ====================== 默认选择第一个的场景的子场景 ======================
@@ -335,7 +304,6 @@
};
//获取主场景列表
const getMainSectionList = async () => {
    const res = await getSectionList();
    const iconList = [
        'biaodan',
        'putong',
@@ -347,10 +315,10 @@
        'jinridaiban',
        'gongju',
    ];
    res.groups.forEach((sectionItem, index) => {
    await sceneGroupList.value.forEach((sectionItem, index) => {
        sectionItem.Icon = iconList[index];
    });
    sectionAList.value = res.groups;
    sectionAList.value = sceneGroupList.value;
    tagListClick(sectionAList.value);
};
const loadingData = ref(false);
@@ -361,9 +329,7 @@
            loadingData.value = false;
        });
        if (activeGroupType.value == '业务场景' || activeGroupType.value == '知识库') {
            if (state.listSampleExpand) return;
            await getSelectListSample();
            state.listSampleExpand = true;
        }
    }
};
@@ -372,7 +338,7 @@
const templateUseClick = (row) => {
    state.useInstructDialog = true;
    state.instructInfo = row;
    state.inputInstruct = row.template_value;
    state.inputInstruct = row.sample_question;
};
const handleClose = () => {
    state.useInstructDialog = false;
@@ -401,24 +367,24 @@
);
//办公
const officeParams = ref({
    template_title: '',
    sample_title: '',
});
const { query: queryInstruct, queryData: showInstructList } = useSearch(instructContentList, officeParams);
const finalOfficeList = computed(() => {
    const result = showInstructList.value.filter((item) => item.template_group == state.activeOfficeChildName);
    const result = showInstructList.value.filter((item) => item.group_id == state.activeOfficeChildName);
    return result ?? [];
});
const instructQuery = debounce(queryInstruct);
watch(
    () => officeParams.value.template_title,
    () => officeParams.value.sample_title,
    (val) => {
        instructQuery();
    }
);
//知识库
const knowledgeParams = ref({
    template_title: '',
    sample_title: '',
});
const { query: queryKnowledge, queryData: showKnowledgeList } = useSearch(exampleList, knowledgeParams);
const finalKnowledgeList = computed(() => {
@@ -428,7 +394,7 @@
const knowledgeQuery = debounce(queryKnowledge);
watch(
    () => officeParams.value.template_title,
    () => knowledgeParams.value.sample_title,
    (val) => {
        knowledgeQuery();
    }
@@ -510,9 +476,9 @@
    () => activeGroupType.value,
    async (val) => {
        if (val == '办公助手') {
            if (state.listInstructExpand) return;
            await getUserTemplate();
            state.listInstructExpand = true;
        } else {
            await getSelectListSample();
        }
        tagListClick(sectionAList.value);
    },
src/stores/chatRoom.ts
@@ -1,5 +1,5 @@
import { computed, ref } from 'vue';
import { getSectionList,getSelectSample, getUserTemplateList } from '../api/ai/chat';
import { getSectionList, getSelectSample, getUserTemplateList } from '../api/ai/chat';
import type { ChatRoomItem } from '../layout/component/sidebar/components/types';
/**
 * Room 关联的一些配置
@@ -103,7 +103,15 @@
        isTemplate: true,
        //#endregion
    }));
    exampleSceneList.value = samples.concat(templateSamples).map((item) => ({ ...item, Icon: '/static/images/wave/ChatImg.png' }));
    exampleSceneList.value = samples
        .concat(templateSamples)
        .map((item) => ({ ...item, Icon: '/static/images/wave/ChatImg.png', BgColor: randomHexColor() }));
};
//随机生成颜色
const randomHexColor = () => {
    return `#${Math.floor(Math.random() * 16777215)
        .toString(16)
        .padEnd(6, '0')}`;
};
/**
 * 获取全局所有数据