From 844d7a62b74558ad554f089846fc44e2cf0d88d7 Mon Sep 17 00:00:00 2001 From: yangyin <1850366751@qq.com> Date: 星期五, 19 七月 2024 10:19:58 +0800 Subject: [PATCH] fix: 修改抽屉的样式 --- src/views/project/ch/home/Home.vue | 64 +++ src/views/project/ch/home/component/waterRight/center.vue | 397 ------------------------ src/components/drawer/CustomDrawer.vue | 468 +++++++++++++++++++++++++++++ 3 files changed, 542 insertions(+), 387 deletions(-) diff --git a/src/components/drawer/CustomDrawer.vue b/src/components/drawer/CustomDrawer.vue new file mode 100644 index 0000000..a390973 --- /dev/null +++ b/src/components/drawer/CustomDrawer.vue @@ -0,0 +1,468 @@ +<template> + <div class="pc-mouldboard column exampleSlide" v-show="isShowAdvanceExample"> + <div class="header flex items-center justify-center"> + <div + class="box-border flex w-[203px] h-[32px] rounded-md items-center justify-between cursor-pointer relative border border-solid border-[#2c2d33]" + > + <div + class="tabbar-item" + :class="state.activeName === item.ID ? 'set-tabbar-active' : ''" + @click="handleTabClick(item)" + v-for="item in state.tabNameList" + :key="item.ID" + > + {{ item.Name }} + </div> + </div> + <i + class="iconfont icon-shibai text-[#999] text-[18px] absolute right-[14px] top-5 cursor-pointer" + @click="handleCloseTemplate" + ></i> + </div> + + <div class="box-border w-[354px] flex-1 min-h-0 bg-[#e0e7fb]" v-show="state.activeName == 1"> + <div class="flex flex-col w100 h100 pt-0 pr-[15px] pb-0 pl-[20px] overflow-auto"> + <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> + </div> + <div class="mt20 w100 relative"> + <div + class="overflow-hidden max-h-[36px] transition-[max-height 0.2s] w100 flex flex-wrap text-xs leading-[14px] m-[-5px]" + :class="{ 'set-expand-active': state.isShowExpand }" + > + <div + v-for="item in state.exampleTabList" + :key="item.ID" + :class="{ 'set-label-active': state.activeLabelName === item.ID }" + @click="handleLabelClick(item)" + class="cursor-pointer m-[5px] py-[5px] px-[10px] rounded-xl border border-solid border-[#b2b2b2] bg-[#e0e7f] text-[#4c4c4c] transition-[background-color .1s, color .1s, border-color .1s]" + > + {{ item.Title }} + </div> + </div> + <div class="bg-[#e0e7fb] absolute right-0 top-0 text-[#131313] w-[30px] h-[26px] cursor-pointer flex items-center"> + <i class="iconfont icon-bolangneng" title="灞曞紑" @click="handleExpandClick(1)" v-show="!state.isShowExpand"></i> + <i class="iconfont icon-zhongduancanshu" title="鏀剁缉" @click="handleExpandClick(2)" v-show="state.isShowExpand"></i> + </div> + <div class="mt20 w100"> + <div class="w100 pb-[20px]" v-for="item in queryData" :key="item.sample_id"> + <div + class="cursor-pointer flex box-border p-[12px] w100 rounded bg-[#f5f7fd] transition-[background-color .2s]" + @click="changeExample(item)" + > + <i + class="iconfont icon-chazhaobiaodanliebiao pl-[2px] w-[16px] h-[16px] font12 text-[#fff] transform-[scale(.85)] rounded-[50%]" + :style="`background-color:${item.BgColor}`" + ></i> + <div class="ml-6 flex-1 min-w-0"> + <div class="text-sm text-[#000] m-0 p-0 font-bold">{{ item.sample_title }}</div> + <div class="mt-[6px] text-[13px] text-[#666] h-[20px] whitespace-nowrap text-ellipsis overflow-hidden"> + {{ item.sample_question }} + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + <div class="box-border w-[354px] flex-1 min-h-0 bg-[#e0e7fb]" v-show="state.activeName == 2"> + <div class="flex flex-col w100 h100 pt-0 pr-[15px] pb-0 pl-[20px] overflow-auto"> + <div class="flex items-center w100 h-[30px] border border-solid border-[#b2b2b2] transition-[border-color 1s] rounded-2xl"> + <el-input v-model="instructParams.template_title" placeholder="鎼滅储鏇村" class="set-input" :prefix-icon="Search" clearable> + </el-input> + </div> + <div class="mt20 w100 relative"> + <div + class="overflow-hidden max-h-[36px] transition-[max-height 0.2s] w100 flex flex-wrap text-xs leading-[14px] m-[-5px]" + :class="{ 'set-expand-active': state.isShowExpand }" + > + <div + v-for="item in state.instructList" + :key="item.ID" + :class="{ 'set-label-active': state.activeInstructName === item.ID }" + @click="handleInstructClick(item)" + class="cursor-pointer m-[5px] py-[5px] px-[10px] rounded-xl border border-solid border-[#b2b2b2] bg-[#e0e7f] text-[#4c4c4c] transition-[background-color .1s, color .1s, border-color .1s]" + > + {{ item.Title }} + </div> + </div> + <div class="bg-[#e0e7fb] absolute right-0 top-0 text-[#131313] w-[30px] h-[26px] cursor-pointer flex items-center"> + <i class="iconfont icon-bolangneng" title="灞曞紑" @click="handleExpandClick(1)" v-show="!state.isShowExpand"></i> + <i class="iconfont icon-zhongduancanshu" title="鏀剁缉" @click="handleExpandClick(2)" v-show="state.isShowExpand"></i> + </div> + <div class="mt20 w100"> + <div class="w100 pb-[20px] flex overflow-auto flex-col" v-for="item in showInstructList" :key="item.template_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> + </div> + <div class="example-body ellipsis">{{ item.template_value }}</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> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + + <el-dialog v-model="state.useInstructDialog" :title="state.instructInfo?.template_title" width="500" :before-close="handleClose"> + <el-input v-model="state.inputInstruct" :rows="10" type="textarea"></el-input> + <template #footer> + <div class="dialog-footer"> + <el-button @click="handleClose">鍙栨秷</el-button> + <el-button type="primary" @click="submitInstruct"> 纭 </el-button> + </div> + </template> + </el-dialog> + </div> +</template> + +<script setup lang="ts"> +import { Search } from '@element-plus/icons-vue'; +import { onMounted, reactive, ref, toRefs, watch } from 'vue'; +import { getSelectSample, getUserTemplateList } from '/@/api/ai/chat'; +import { useSearch } from '/@/hooks/useSearch'; +import { activeRoomId, activeSampleId, setRoomConfig } from '/@/stores/chatRoom'; +import emitter from '/@/utils/mitt'; +import { debounce } from '/@/utils/util'; +let state = reactive({ + tabNameList: [ + { ID: 1, Name: '鎻愰棶绀轰緥' }, + { ID: 2, Name: '鎸囦护妯℃澘' }, + ], + activeName: 1, + exampleTabList: [ + { + ID: 1, + Title: '宸ヤ綔', + }, + { + ID: 2, + Title: '鑱屽満', + }, + { + ID: 3, + Title: '绉戝', + }, + { + ID: 4, + Title: '姹傝亴', + }, + { + ID: 5, + Title: '鏂拌兘婧�,姹借溅,鏁版嵁', + }, + { + ID: 6, + Title: '鍐欎綔', + }, + { + ID: 7, + Title: '瀛︿範', + }, + { + ID: 8, + Title: '鍒涗綔', + }, + ], + instructList: [ + { + ID: 1, + Title: '鏂囧鏋勬��', + }, + { + ID: 2, + Title: '璇█缈昏瘧', + }, + { + ID: 3, + Title: '楂樻晥绛栧垝', + }, + { + ID: 4, + Title: '椤鹃棶涓撳', + }, + { + ID: 5, + Title: '浠g爜缂栫▼', + }, + { + ID: 6, + Title: '鍔炲叕鍐欎綔', + }, + { + ID: 7, + Title: '鍋ュ悍绠″', + }, + { + ID: 8, + Title: '鍙戠幇鎺㈢储', + }, + ], + activeLabelName: 0, + activeInstructName: 0, + isShowExpand: false, + useInstructDialog: false, + instructInfo: {}, + inputInstruct: '', //鍙慨鏀规寚浠� + exampleRandomContent: [], + exampleContent: [], +}); +const instructContentList = ref([]); //鎸囦护鍒楄〃 +const exampleList = ref([]); //绀轰緥鍒楄〃 +const props = defineProps({ + isShowAdvanceExample: { + type: Boolean, + default: false, //鏄惁鏄剧ず楂樼骇绀轰緥 + }, +}); +const { isShowAdvanceExample } = toRefs(props); +onMounted(() => { + getSelectListSample(); + getUserTemplate(); +}); +const emits = defineEmits<{ + (event: 'closeExampleClick', data): void; +}>(); +//鑾峰彇妯$増鍒楄〃 +const getSelectListSample = async () => { + const res = await getSelectSample({ + section_b_id: '', + }); + // console.log(res, 63); + 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; +}; +//闅忔満鐢熸垚棰滆壊 +const randomHexColor = () => { + return `#${Math.floor(Math.random() * 16777215) + .toString(16) + .padEnd(6, '0')}`; +}; +const changeExample = (item) => { + emitter.emit('updateChatInput', item.sample_question); + setRoomConfig(activeRoomId.value, 'isAnswerByLLM', false); + activeSampleId.value = item.sample_id; +}; +//鑾峰彇鐢ㄦ埛妯℃澘 +const getUserTemplate = async () => { + const res = await getUserTemplateList(); + instructContentList.value = res.templates; +}; +//鍒囨崲鍒版寚浠�/鎻愰棶 +const handleTabClick = (item) => { + state.activeName = item.ID; +}; +//鏍囩鐐瑰嚮浜嬩欢(鎻愰棶绀轰緥) +const handleLabelClick = (item) => { + state.activeLabelName = item.ID; +}; +//鏍囩鐐瑰嚮浜嬩欢(鎸囦护妯℃澘) +const handleInstructClick = (item) => { + state.activeInstructName = item.ID; +}; + +//灞曞紑鏀惰捣 +const handleExpandClick = (type) => { + if (type == 1) { + state.isShowExpand = true; + } else { + state.isShowExpand = false; + } +}; +//鍏抽棴楂樼骇绀轰緥 +const handleCloseTemplate = () => { + emits('closeExampleClick', false); +}; +//#region ====================== templateUseClick ====================== +const templateUseClick = (row) => { + state.useInstructDialog = true; + state.instructInfo = row; + state.inputInstruct = row.template_value; +}; +const handleClose = () => { + state.useInstructDialog = false; +}; +const submitInstruct = () => { + setRoomConfig(activeRoomId.value, 'isAnswerByLLM', true); + emitter.emit('updateChatInput', state.inputInstruct); + handleClose(); +}; +//#endregion +//#region ====================== 鎼滅储妯℃澘/鎸囦护 ====================== +const queryParams = ref({ + sample_title: '', +}); +const { query, queryData } = useSearch(exampleList, queryParams); + +const debounceQuery = debounce(query); + +watch( + () => queryParams.value.sample_title, + (val) => { + debounceQuery(); + } +); +//鎸囦护 +const instructParams = ref({ + template_title: '', +}); +const { query: queryInstruct, queryData: showInstructList } = useSearch(instructContentList, instructParams); + +const instructQuery = debounce(queryInstruct); + +watch( + () => instructParams.value.template_title, + (val) => { + instructQuery(); + } +); +//#endregion +</script> +<style scoped lang="scss"> +.exampleSlide { + // position: absolute; + right: 0; + top: 0; + height: 100%; + -webkit-box-sizing: border-box; + box-sizing: border-box; + z-index: 100; +} + +.pc-mouldboard { + width: 354px; + font-size: 14px; + -webkit-animation: right-c650b75e 0.2s; + animation: right-c650b75e 0.2s; + + .header { + box-sizing: border-box; + width: 100%; + background-color: #e0e7fb; + padding: 30px 20px 26px; + position: relative; + } + .tabbar-item { + width: 108px; + height: 30px; + font-size: 13px; + font-weight: 400; + line-height: 30px; + text-align: center; + cursor: pointer; + // position: absolute; + -o-transition: color 0.2s; + transition: color 0.2s; + &:nth-child(3) { + top: 0; + left: 0; + } + } + .tabbar-item-active { + color: #fff; + } + .set-tabbar-active { + left: 95px; + color: #fff; + background-color: #000; + } + .set-input { + :deep(.el-input__wrapper) { + border: none; + outline: none; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + min-width: 0; + height: 100%; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 5px 12px; + line-height: 20px; + border-radius: 15px; + color: #555; + font-size: 13px; + background-color: transparent; + box-shadow: unset; + } + } + .set-expand-active { + max-height: 180px; + } + .set-label-active { + border-color: #1c86ff; + background-color: #ccdcfb; + color: #1c86ff; + } + .example-body { + margin: 10px 0; + height: 40px; + font-weight: 400; + letter-spacing: 0; + line-height: 20px; + color: #8b939e; + } + .ellipsis { + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + font-size: 12px; + } + .example-bottom { + margin-top: 10px; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + .example-item { + background-color: #f0f2f3; + color: #8b939e; + border: 1px solid #f5f5f5; + border-radius: 9px; + width: 58px; + height: 18px; + font-size: 12px; + line-height: 18px; + text-align: center; + cursor: default; + margin-left: 5px; + } + .set-button { + border: none; + width: 68px; + height: 24px; + color: #fff; + font-size: 12px; + background-color: #2a82e4; + border-radius: 4px; + cursor: pointer; + } + } +} +.column { + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} +</style> diff --git a/src/views/project/ch/home/Home.vue b/src/views/project/ch/home/Home.vue index 54b6a77..eb9b609 100644 --- a/src/views/project/ch/home/Home.vue +++ b/src/views/project/ch/home/Home.vue @@ -5,11 +5,28 @@ <div class="w100 h100 overflow-hidden"> <div class="pc-chatRoom w100 h100"> <div class="homeBox w100 h-full"> - <div class="flex items-center flex-column mt-20"> + <div class="flex items-center h-full relative overflow-hidden"> <div class="flex items-center flex-column"> <waterTop /> - <waterCenter /> + <waterCenter + @advanceExampleClick="advanceExampleClick" + :isShowAdvanceExample="state.isShowAdvanceExample" + ref="waterCenterRef" + /> <waterBottom /> + </div> + <div + class="retract_icon" + :style="`right: ${state.rightBox}px;`" + @click="advanceExampleClick(!state.isShowAdvanceExample)" + > + <i + class="text-[#fff] transition-all" + :class="state.isShowAdvanceExample ? 'ywicon icon-zuoyoujiantou1' : 'ywicon icon-zuoyoujiantou'" + ></i> + </div> + <div class="h100" :style="`width: ${state.rightBoxWidth}px;transition:width 0.8s;`"> + <CustomDrawer :isShowAdvanceExample="state.isShowAdvanceExample" @closeExampleClick="closeExampleClick" /> </div> </div> </div> @@ -26,9 +43,28 @@ </template> <script setup lang="ts"> +import { reactive, ref } from 'vue'; import waterBottom from './component/waterRight/bottom.vue'; import waterCenter from './component/waterRight/center.vue'; import waterTop from './component/waterRight/top.vue'; +import CustomDrawer from '/@/components/drawer/CustomDrawer.vue'; +let state = reactive({ + isShowAdvanceExample: false, + rightBoxWidth: 0, + rightBox: 0, +}); +const waterCenterRef = ref(null); +const advanceExampleClick = (status: boolean) => { + state.isShowAdvanceExample = status; + state.rightBoxWidth = status ? 354 : 0; + state.rightBox = status ? 354 : 0; +}; +//鍏抽棴楂樼骇绀轰緥 +const closeExampleClick = (status: boolean) => { + state.isShowAdvanceExample = status; + state.rightBoxWidth = status ? 354 : 0; + state.rightBox = status ? 354 : 0; +}; </script> <style scoped lang="scss"> .pc-chat_room { @@ -54,6 +90,30 @@ width: 100%; padding: 18px; } +.retract_icon { + width: 20px; + height: 48px; + background: rgba(0, 0, 0, 0.2); + position: absolute; + top: 50%; + right: 0; + // -webkit-transform: translate(100%, -50%); + // -ms-transform: translate(100%, -50%); + // transform: translate(100%, -50%); + z-index: 9; + cursor: pointer; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding: 0 3px; + border-radius: 5px 5px 0px; +} .layout-logo-medium-img { width: 28px; margin-right: 7px; diff --git a/src/views/project/ch/home/component/waterRight/center.vue b/src/views/project/ch/home/component/waterRight/center.vue index 6f9f6bb..44c5f0d 100644 --- a/src/views/project/ch/home/component/waterRight/center.vue +++ b/src/views/project/ch/home/component/waterRight/center.vue @@ -29,233 +29,24 @@ </div> </div> </div> - <div class="custom-drawer"> - <el-drawer v-model="state.isShowAdvanceExample" direction="rtl" size="354"> - <template #header style="padding: 30px 20px 26px"> - <div class="box-border w100 bg-[#e0e7fb] relative flex items-center justify-center"> - <div - class="box-border flex w-[203px] h-[32px] rounded-md items-center justify-between cursor-pointer relative border border-solid border-[#2c2d33]" - > - <div - class="tabbar-item" - :class="state.activeName === item.ID ? 'set-tabbar-active' : ''" - @click="handleTabClick(item)" - v-for="item in state.tabNameList" - :key="item.ID" - > - {{ item.Name }} - </div> - </div> - </div> - </template> - <div class="box-border w-[354px] flex-1 min-h-0 bg-[#e0e7fb]" v-show="state.activeName == 1"> - <div class="flex flex-col w100 h100 pt-0 pr-[15px] pb-0 pl-[20px] overflow-auto"> - <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> - </div> - <div class="mt20 w100 relative"> - <div - class="overflow-hidden max-h-[36px] transition-[max-height 0.2s] w100 flex flex-wrap text-xs leading-[14px] m-[-5px]" - :class="{ 'set-expand-active': state.isShowExpand }" - > - <div - v-for="item in state.exampleTabList" - :key="item.ID" - :class="{ 'set-label-active': state.activeLabelName === item.ID }" - @click="handleLabelClick(item)" - class="cursor-pointer m-[5px] py-[5px] px-[10px] rounded-xl border border-solid border-[#b2b2b2] bg-[#e0e7f] text-[#4c4c4c] transition-[background-color .1s, color .1s, border-color .1s]" - > - {{ item.Title }} - </div> - </div> - <div class="bg-[#e0e7fb] absolute right-0 top-0 text-[#131313] w-[30px] h-[26px] cursor-pointer flex items-center"> - <i class="iconfont icon-bolangneng" title="灞曞紑" @click="handleExpandClick(1)" v-show="!state.isShowExpand"></i> - <i class="iconfont icon-zhongduancanshu" title="鏀剁缉" @click="handleExpandClick(2)" v-show="state.isShowExpand"></i> - </div> - <div class="mt20 w100"> - <div class="w100 pb-[20px]" v-for="item in queryData" :key="item.sample_id"> - <div - class="cursor-pointer flex box-border p-[12px] w100 rounded bg-[#f5f7fd] transition-[background-color .2s]" - @click="changeExample(item)" - > - <i - class="iconfont icon-chazhaobiaodanliebiao pl-[2px] w-[16px] h-[16px] font12 text-[#fff] transform-[scale(.85)] rounded-[50%]" - :style="`background-color:${item.BgColor}`" - ></i> - <div class="ml-6 flex-1 min-w-0"> - <div class="text-sm text-[#000] m-0 p-0 font-bold">{{ item.sample_title }}</div> - <div class="mt-[6px] text-[13px] text-[#666] h-[20px] whitespace-nowrap text-ellipsis overflow-hidden"> - {{ item.sample_question }} - </div> - </div> - </div> - </div> - </div> - </div> - </div> - </div> - <div class="box-border w-[354px] flex-1 min-h-0 bg-[#e0e7fb]" v-show="state.activeName == 2"> - <div class="flex flex-col w100 h100 pt-0 pr-[15px] pb-0 pl-[20px] overflow-auto"> - <div class="flex items-center w100 h-[30px] border border-solid border-[#b2b2b2] transition-[border-color 1s] rounded-2xl"> - <el-input - v-model="instructParams.template_title" - placeholder="鎼滅储鏇村" - class="set-input" - :prefix-icon="Search" - clearable - > - </el-input> - </div> - <div class="mt20 w100 relative"> - <div - class="overflow-hidden max-h-[36px] transition-[max-height 0.2s] w100 flex flex-wrap text-xs leading-[14px] m-[-5px]" - :class="{ 'set-expand-active': state.isShowExpand }" - > - <div - v-for="item in state.instructList" - :key="item.ID" - :class="{ 'set-label-active': state.activeInstructName === item.ID }" - @click="handleInstructClick(item)" - class="cursor-pointer m-[5px] py-[5px] px-[10px] rounded-xl border border-solid border-[#b2b2b2] bg-[#e0e7f] text-[#4c4c4c] transition-[background-color .1s, color .1s, border-color .1s]" - > - {{ item.Title }} - </div> - </div> - <div class="bg-[#e0e7fb] absolute right-0 top-0 text-[#131313] w-[30px] h-[26px] cursor-pointer flex items-center"> - <i class="iconfont icon-bolangneng" title="灞曞紑" @click="handleExpandClick(1)" v-show="!state.isShowExpand"></i> - <i class="iconfont icon-zhongduancanshu" title="鏀剁缉" @click="handleExpandClick(2)" v-show="state.isShowExpand"></i> - </div> - <div class="mt20 w100"> - <div class="w100 pb-[20px] flex overflow-auto flex-col" v-for="item in showInstructList" :key="item.template_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> - </div> - <div class="example-body ellipsis">{{ item.template_value }}</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> - </div> - </div> - </div> - </div> - </div> - </div> - </div> - </el-drawer> - </div> - <el-dialog v-model="state.useInstructDialog" :title="state.instructInfo?.template_title" width="500" :before-close="handleClose"> - <el-input v-model="state.inputInstruct" :rows="10" type="textarea"></el-input> - <template #footer> - <div class="dialog-footer"> - <el-button @click="handleClose">鍙栨秷</el-button> - <el-button type="primary" @click="submitInstruct"> 纭 </el-button> - </div> - </template> - </el-dialog> </div> </template> <script setup lang="ts"> -import { Search } from '@element-plus/icons-vue'; -import { computed, onMounted, reactive, ref, watch } from 'vue'; -import { getSelectSample, getUserTemplateList } from '/@/api/ai/chat'; -import { activeRoomId, activeSampleId, roomConfig, setRoomConfig } from '/@/stores/chatRoom'; +import { computed, onMounted, reactive, ref } from 'vue'; +import { getSelectSample } from '/@/api/ai/chat'; +import { activeRoomId, activeSampleId, setRoomConfig } from '/@/stores/chatRoom'; import emitter from '/@/utils/mitt'; -import { useSearch } from '/@/hooks/useSearch'; -import { debounce, getRecentDateRange } from '/@/utils/util'; - let state = reactive({ exampleContent: [], exampleRandomContent: [], - tabNameList: [ - { ID: 1, Name: '鎻愰棶绀轰緥' }, - { ID: 2, Name: '鎸囦护妯℃澘' }, - ], - isShowAdvanceExample: false, - activeName: 1, - exampleTabList: [ - { - ID: 1, - Title: '宸ヤ綔', - }, - { - ID: 2, - Title: '鑱屽満', - }, - { - ID: 3, - Title: '绉戝', - }, - { - ID: 4, - Title: '姹傝亴', - }, - { - ID: 5, - Title: '鏂拌兘婧�,姹借溅,鏁版嵁', - }, - { - ID: 6, - Title: '鍐欎綔', - }, - { - ID: 7, - Title: '瀛︿範', - }, - { - ID: 8, - Title: '鍒涗綔', - }, - ], - instructList: [ - { - ID: 1, - Title: '鏂囧鏋勬��', - }, - { - ID: 2, - Title: '璇█缈昏瘧', - }, - { - ID: 3, - Title: '楂樻晥绛栧垝', - }, - { - ID: 4, - Title: '椤鹃棶涓撳', - }, - { - ID: 5, - Title: '浠g爜缂栫▼', - }, - { - ID: 6, - Title: '鍔炲叕鍐欎綔', - }, - { - ID: 7, - Title: '鍋ュ悍绠″', - }, - { - ID: 8, - Title: '鍙戠幇鎺㈢储', - }, - ], - activeLabelName: 0, - activeInstructName: 0, - isShowExpand: false, - useInstructDialog: false, - instructInfo: {}, - inputInstruct: '', //鍙慨鏀规寚浠� }); const exampleList = ref([]); //妯$増鍒楄〃 -const instructContentList = ref([]); //鎸囦护鍒楄〃 - +const emits = defineEmits<{ + (event: 'advanceExampleClick', data): void; +}>(); onMounted(() => { getSelectListSample(); - getUserTemplate(); }); const groupedArray = computed(() => { const groups = []; @@ -287,94 +78,28 @@ const changeExample = (item) => { emitter.emit('updateChatInput', item.sample_question); - setRoomConfig(activeRoomId.value,'isAnswerByLLM',false); + setRoomConfig(activeRoomId.value, 'isAnswerByLLM', false); activeSampleId.value = item.sample_id; -}; -//鑾峰彇鐢ㄦ埛妯℃澘 -const getUserTemplate = async () => { - const res = await getUserTemplateList(); - instructContentList.value = res.templates; }; //鎹竴鎵� const batchChange = () => { const index = Math.floor(Math.random() * groupedArray.value.length); state.exampleContent = groupedArray.value[index]; }; -//楂樼骇绀轰緥 +//鎵撳紑楂樼骇绀轰緥 const advanceExampleClick = () => { - state.isShowAdvanceExample = true; -}; -//鍒囨崲鍒版寚浠�/鎻愰棶 -const handleTabClick = (item) => { - state.activeName = item.ID; -}; -//鏍囩鐐瑰嚮浜嬩欢(鎻愰棶绀轰緥) -const handleLabelClick = (item) => { - state.activeLabelName = item.ID; -}; -//鏍囩鐐瑰嚮浜嬩欢(鎸囦护妯℃澘) -const handleInstructClick = (item) => { - state.activeInstructName = item.ID; + emits('advanceExampleClick', true); }; -//灞曞紑鏀惰捣 -const handleExpandClick = (type) => { - if (type == 1) { - state.isShowExpand = true; - } else { - state.isShowExpand = false; - } -}; //闅忔満鐢熸垚棰滆壊 const randomHexColor = () => { return `#${Math.floor(Math.random() * 16777215) .toString(16) .padEnd(6, '0')}`; }; -//#region ====================== templateUseClick ====================== -const templateUseClick = (row) => { - state.useInstructDialog = true; - state.instructInfo = row; - state.inputInstruct = row.template_value; -}; -const handleClose = () => { - state.useInstructDialog = false; -}; -const submitInstruct = () => { - setRoomConfig(activeRoomId.value,'isAnswerByLLM',true); - emitter.emit('updateChatInput', state.inputInstruct); - handleClose(); -}; -//#endregion -//#region ====================== 鎼滅储妯℃澘/鎸囦护 ====================== -const queryParams = ref({ - sample_title: '', +defineExpose({ + getSelectListSample, }); -const { query, queryData } = useSearch(exampleList, queryParams); - -const debounceQuery = debounce(query); - -watch( - () => queryParams.value.sample_title, - (val) => { - debounceQuery(); - } -); -//鎸囦护 -const instructParams = ref({ - template_title: '', -}); -const { query: queryInstruct, queryData: showInstructList } = useSearch(instructContentList, instructParams); - -const instructQuery = debounce(queryInstruct); - -watch( - () => instructParams.value.template_title, - (val) => { - instructQuery(); - } -); -//#endregion </script> <style scoped lang="scss"> .pc-prompts { @@ -477,105 +202,7 @@ } } } -.tabbar-item { - width: 108px; - height: 30px; - font-size: 13px; - font-weight: 400; - line-height: 30px; - text-align: center; - cursor: pointer; - // position: absolute; - -o-transition: color 0.2s; - transition: color 0.2s; - &:nth-child(3) { - top: 0; - left: 0; - } -} -.tabbar-item-active { - color: #fff; -} -.set-tabbar-active { - left: 95px; - color: #fff; - background-color: #000; -} -.set-input { - :deep(.el-input__wrapper) { - border: none; - outline: none; - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; - min-width: 0; - height: 100%; - -webkit-box-sizing: border-box; - box-sizing: border-box; - padding: 5px 12px; - line-height: 20px; - border-radius: 15px; - color: #555; - font-size: 13px; - background-color: transparent; - box-shadow: unset; - } -} -.set-expand-active { - max-height: 180px; -} -.set-label-active { - border-color: #1c86ff; - background-color: #ccdcfb; - color: #1c86ff; -} -.example-body { - margin: 10px 0; - height: 40px; - font-weight: 400; - letter-spacing: 0; - line-height: 20px; - color: #8b939e; -} -.ellipsis { - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; - -o-text-overflow: ellipsis; - text-overflow: ellipsis; - font-size: 12px; -} -.example-bottom { - margin-top: 10px; - display: flex; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; - .example-item { - background-color: #f0f2f3; - color: #8b939e; - border: 1px solid #f5f5f5; - border-radius: 9px; - width: 58px; - height: 18px; - font-size: 12px; - line-height: 18px; - text-align: center; - cursor: default; - margin-left: 5px; - } - .set-button { - border: none; - width: 68px; - height: 24px; - color: #fff; - font-size: 12px; - background-color: #2a82e4; - border-radius: 4px; - cursor: pointer; - } -} + :deep(.el-drawer__header) { padding: 30px 20px 26px !important; box-sizing: border-box; -- Gitblit v1.9.3