From 457cc6cf166d3b6c22be4f78c1db8802a7fbb4c7 Mon Sep 17 00:00:00 2001 From: wujingjing <gersonwu@qq.com> Date: 星期一, 07 四月 2025 17:53:19 +0800 Subject: [PATCH] DigitalHuman --- src/views/project/ch/home/component/waterRight/center.vue | 473 ++++++++++------------------------------------------------ 1 files changed, 84 insertions(+), 389 deletions(-) diff --git a/src/views/project/ch/home/component/waterRight/center.vue b/src/views/project/ch/home/component/waterRight/center.vue index 83a5a97..7542aa9 100644 --- a/src/views/project/ch/home/component/waterRight/center.vue +++ b/src/views/project/ch/home/component/waterRight/center.vue @@ -6,328 +6,91 @@ <span class="split"></span> <span class="change cursor-pointer" @click="advanceExampleClick">楂樼骇绀轰緥 ></span> </div> - <div class="cursor-pointer"> - <span class="mr-1 changeBatch" @click="batchChange">鎹竴鎵�</span> - <i class="iconfont icon-shuaxin"></i> + <div class="cursor-pointer" @click="batchChange"> + <span class="mr-1 changeBatch">鎹竴鎵�</span> + <i class="myiconfont icon-shuaxin"></i> </div> </div> - <div class="main"> - <div - class="main_item flex items-center cursor-pointer" - v-for="(item, index) in state.exampleContent" - :key="index" - :class="{ main_item_active: item.sample_id === state.exampleIndex }" - @click="changeExample(item)" - > - <div class="left flex items-center justify-center" :class="['color' + index]"> - <img :src="item.Icon" alt="" /> - </div> - <div class="right"> - <h4>{{ item.sample_title }}</h4> - <p>{{ item.sample_question }}</p> - </div> - </div> - </div> - <el-drawer v-model="state.isShowAdvanceExample" direction="rtl" size="354"> - <div class="box-border w100 bg-[#e0e7fb] relative flex items-center justify-center" style="padding: 30px 20px 26px"> - <div - class="box-border flex w-[203px] h-[32px] rounded-md items-center justify-between cursor-pointer relative border border-solid border-[#2c2d33]" - > + <el-carousel height="80" :interval="6000" indicator-position="none"> + <el-carousel-item v-for="(group, index) in state.m_groupArr" :key="index" class="set-carousel-item"> <div - class="tabbar-item" - :class="state.activeName === item.ID ? 'set-tabbar-active' : ''" - @click="handleTabClick(item)" - v-for="item in state.tabNameList" - :key="item.ID" + class="main_item flex items-center cursor-pointer" + v-for="(item, index) in group" + :key="index" + :class="{ main_item_active: item.sample_id === activeSampleId }" + @click="changeExample(item)" > - {{ item.Name }} - </div> - </div> - </div> - <div class="box-border w-[354px] flex-1 min-h-0 bg-[#e0e7fb]" style="height: calc(100% - 88px)" 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="state.searchInput" placeholder="鎼滅储鏇村" class="set-input" :prefix-icon="Search"> </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 class="left flex items-center justify-center" :class="['color' + index]"> + <img :src="item.Icon" alt="" /> </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 state.exampleContentList" :key="item.sample_id"> - <div class="cursor-pointer flex box-border p-[12px] w100 rounded bg-[#f5f7fd] transition-[background-color .2s]"> - <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 class="right"> + <h4>{{ item.sample_title }}</h4> + <p>{{ item.sample_question }}</p> </div> </div> - </div> - </div> - <div class="box-border w-[354px] flex-1 min-h-0 bg-[#e0e7fb]" style="height: calc(100% - 88px)" 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="state.searchInput" placeholder="鎼滅储鏇村" class="set-input" :prefix-icon="Search"> </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 state.instructContentList" :key="item.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.Title }}</span> - </div> - <div class="example-body ellipsis">{{ item.Content }}</div> - <div class="example-bottom"> - <div class="flex w-[190px] items-center flex-nowrap"> - <div v-for="exampleItem in item.exampleBottomList" :key="item.ID"> - <span class="example-item">{{ exampleItem }}</span> - </div> - </div> - <el-button type="primary" class="set-button">浣跨敤</el-button> - </div> - </div> - </div> - </div> - </div> - </div> - </div> - </el-drawer> + </el-carousel-item> + </el-carousel> + </div> </div> </template> <script setup lang="ts"> -import { Search } from '@element-plus/icons-vue'; -import { onMounted, reactive, computed } from 'vue'; -import { getSelectSample } from '/@/api/ai/chat'; -import emitter from '/@/utils/mitt'; +import { reactive } from 'vue'; +import { activeRoomId, activeSampleId, exampleSceneList, setRoomConfig } from '/@/stores/chatRoom'; let state = reactive({ exampleContent: [], - exampleRandomContent: [], - tabNameList: [ - { ID: 1, Name: '鎻愰棶绀轰緥' }, - { ID: 2, Name: '鎸囦护妯℃澘' }, - ], - exampleIndex: 0, - isShowAdvanceExample: false, - activeName: 1, - searchInput: '', - 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: '鍙戠幇鎺㈢储', - }, - ], - exampleContentList: [], - instructContentList: [ - { - ID: 1, - Title: '璇█妫�娴嬪櫒', - Content: - '鎴戝笇鏈涗綘鍏呭綋璇█妫�娴嬪櫒銆傛垜浼氱敤浠讳綍璇█杈撳叆涓�涓彞瀛愶紝浣犱細鍥炵瓟鎴戯紝鎴戝啓鐨勫彞瀛愭槸鐢ㄥ摢绉嶈瑷�鍐欑殑銆備笉瑕佸啓浠讳綍瑙i噴鎴栧叾浠栨枃瀛楋紝鍙渶鍥炲璇█鍚嶇О鍗冲彲', - exampleBottomList: ['鏂囧鏋勬��', '璇█缈昏瘧', '楂樻晥绛栧垝'], - }, - { - ID: 2, - Title: '澶栬缁冧範', - Content: '鎴戜細鐢ㄨ嫳璇拰浣犺璇濓紝浣犱細鐢ㄨ嫳璇洖澶嶆垜鏉ョ粌涔犳垜鐨勮嫳璇彛璇�傛垜甯屾湜鎮ㄧ殑鍥炲', - exampleBottomList: ['鏂囧鏋勬��', '鑹烘湳鍒涗綔', '鍙戠幇鎺㈢储'], - }, - { - ID: 3, - Title: '鎴戞兂璁╀綘鍏呭綋鑻辫', - Content: '鎴戜細鐢ㄤ换浣曡瑷�涓庝綘浜よ皥锛屼綘浼氭娴嬭瑷�锛岀炕璇戝畠骞剁敤鎴戠殑鏂囨湰鐨勬洿姝e拰鏀硅繘鐗堟湰鐢ㄨ嫳璇洖绛斻�傛垜甯屾湜浣犵敤', - exampleBottomList: ['鏂囧鏋勬��', '椤鹃棶涓撳', '鑱屽満鍔╂墜'], - }, - { - ID: 4, - Title: '澶氳缈昏瘧', - Content: - '鎴戣姹備綘鎵紨涓�鍚嶄笓涓氱殑璇戣�呫�佹嫾鍐欑籂姝h�呮垨鏂囨湰浼樺寲鑰呯殑瑙掕壊銆傛垜灏嗙敤鍚勭璇█涓庝綘浜ゆ祦锛屼綘鍒欓渶瑕佺敤瀵瑰簲鐨勮瑷�鍦ㄦ垜鐨勬枃鏈繘琛屼慨姝e拰浼樺寲鐗堟湰銆備綘鐨勫洖绛斾粎闄愪簬淇鍜屼紭鍖栵紝涓嶅寘鎷叾浠栧唴瀹癸紝涔熶笉闇�瑕佹彁渚涜В閲娿�傚湪淇濊瘉缈昏瘧璐ㄩ噺鐨勫墠鎻愪笅锛屼綘鐨勫洖绛斿簲灏藉彲鑳界畝娲併�傛垜鐨勯鍙ヨ瘽鏄細', - exampleBottomList: ['鏂囧鏋勬��', '璇█缈昏瘧'], - }, - ], - - activeLabelName: 0, - activeInstructName: 0, - isShowExpand: false, + isShowExample: false, + m_groupArr: [], }); -onMounted(() => { - getSelectListSample(); -}); -const groupedArray = computed(() => { +const emits = defineEmits<{ + (event: 'advanceExampleClick', data): void; + (event: 'updateChatInput', val): void; +}>(); +const initGroupedArr = () => { const groups = []; let i = 0; - while (state.exampleRandomContent.length > i) { - groups.push(state.exampleRandomContent.slice(i, (i += 4))); + while (state.exampleContent.length > i) { + groups.push(state.exampleContent.slice(i, (i += 4))); } - return groups; -}); -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); - } - }); - state.exampleContentList = res.samples; - state.exampleContent = array; + state.m_groupArr = groups; }; const changeExample = (item) => { - state.exampleIndex = item.sample_id; - emitter.emit('updateChatInput',item.sample_question) - + emits('updateChatInput', item.sample_question); + setRoomConfig(activeRoomId.value, 'isAnswerByLLM', false); + activeSampleId.value = item.sample_id; }; //鎹竴鎵� const batchChange = () => { - const index = Math.floor(Math.random() * groupedArray.value.length); - state.exampleContent = groupedArray.value[index]; - // console.log(state.exampleContent, 341); -}; -//楂樼骇绀轰緥 -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; -}; -//鎼滅储 -//灞曞紑鏀惰捣 -const handleExpandClick = (type) => { - if (type == 1) { - state.isShowExpand = true; - } else { - state.isShowExpand = false; + let groups = state.m_groupArr; + // 鎵撲贡鎵规椤哄簭 + for (let i = groups.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [groups[i], groups[j]] = [groups[j], groups[i]]; } + state.m_groupArr = groups; }; -//闅忔満鐢熸垚棰滆壊 -const randomHexColor = () => { - return `#${Math.floor(Math.random() * 16777215) - .toString(16) - .padEnd(6, '0')}`; +//鎵撳紑楂樼骇绀轰緥 +const advanceExampleClick = () => { + emits('advanceExampleClick', true); }; +const tagListClick = (tagList) => { + let result = []; + tagList.forEach((tag) => { + exampleSceneList.value.forEach((sample) => { + if (tag == sample.group_id) { + result.push(sample); + } + }); + }); + state.exampleContent = result; + initGroupedArr(); +}; +defineExpose({ + tagListClick, +}); </script> <style scoped lang="scss"> .pc-prompts { @@ -370,6 +133,7 @@ width: calc(50% - 16px); margin: 8px; padding: 12px; + height: 84px; border: 1px solid #d9dbde; border-radius: 5px; background-color: transparent; @@ -404,6 +168,9 @@ font-weight: 500; height: 16px; transition: background-color 0.2s; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } p { font-size: 12px; @@ -428,105 +195,33 @@ } } } + .set-carousel-item { + display: flex; + flex-wrap: wrap; + } } } -.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; - } + +:deep(.el-drawer__header) { + padding: 30px 20px 26px !important; + box-sizing: border-box; + width: 100%; + background-color: #e0e7fb; + + position: relative; + + height: unset !important; + margin-bottom: unset !important; + border-bottom: unset !important; } -.tabbar-item-active { - color: #fff; +:deep(.el-drawer__body) { + overflow-x: hidden; } -.set-tabbar-active { - left: 95px; - color: #fff; - background-color: #000; +:deep(.el-carousel--horizontal) { + width: 100%; } -.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-carousel__container) { + width: 100%; + height: 200px !important; } </style> -- Gitblit v1.9.3