wujingjing
2025-04-07 457cc6cf166d3b6c22be4f78c1db8802a7fbb4c7
src/views/project/ch/home/component/waterRight/top.vue
@@ -1,90 +1,90 @@
<template>
   <div class="flex items-center">
      <img src="/static/images/logo/logo-mini.svg" alt="logo" class="layout-logo-medium-img" />
      <p class="set-waterTitle"><strong>WI 水务智能专家</strong>智慧水务助手</p>
   <div class="flex items-center mb-8">
      <img src="/static/images/logo/logoWithNoName.png" alt="logo" class="layout-logo-medium-img" />
      <p class="set-waterTitle"><strong>WI水务智能平台</strong>智慧水务数据挖掘者</p>
   </div>
   <div class="flex items-center pc-roleList">
      <div v-for="(item, index) in state.roleList" :key="index" class="flex items-center pl-6" @click="handleClick(item)">
         <el-tooltip :content="item.Content" placement="top" effect="light" popper-class="my-pop">
            <div class="modelItem cursor-pointer flex items-center" :class="{ modelItemActive: item.ID === state.activeRole }">
               <img :src="item.Icon" alt="icon" class="set-icon box-border" />
               <span>{{ item.Title }}</span>
            </div>
         </el-tooltip>
      </div>
      <div class="flex items-center cursor-pointer pl-5">
         <div class="modelItem cursor-pointer flex items-center">
            <img src="/static/images/wave/More.png" alt="icon" class="set-icon-more box-border" />
            <span>更多</span>
         </div>
      </div>
   </div>
   <div class="playInput hl_input">
      <div class="assembly flex">
         <el-button title="插件菜单" class="label flex items-center cursor-pointer" link>
            <img src="/static/images/wave/PlugIn.png" class="set-icon box-border" />
         </el-button>
      </div>
      <div class="set-input">
         <el-input v-model="state.inputAnswer" placeholder="在这里输入您的问题开始和AI对话" class="set-inputAnswer" />
      </div>
      <div class="h100 flex items-center">
         <div class="upload_img space-y">
            <div class="imgbox cursor-pointer flex items-center">
               <el-button title="AI看图" class="cursor-pointer" link style="margin-left: unset">
                  <img src="/static/images/wave/LookImg.png" class="set-img-icon box-border" />
               </el-button>
               <el-button title="AI语音对话" class="cursor-pointer" link style="margin-left: unset">
                  <img src="/static/images/wave/HeadImg.png" class="set-img-icon box-border" />
               </el-button>
               <el-button title="发送" class="cursor-pointer" link @click="sendClick">
                  <div class="send">
                     <img src="/static/images/wave/QueryImg.png" />
                  </div>
               </el-button>
            </div>
         </div>
      </div>
   </div>
   <!-- <div class="flex items-center pc-roleList"></div> -->
   <PlayBar style="width: 760px" v-model="inputValue" @send-click="sendClick" :is-home="true" />
</template>
<script setup lang="ts">
import { reactive } from 'vue';
const emits = defineEmits(['sendClick']);
import { ElMessage } from 'element-plus';
import { ref } from 'vue';
import { GetLLMList, setHistoryGroupTitle } from '/@/api/ai/chat';
import PlayBar from '/@/components/chat/components/playBar/PlayBar.vue';
import router from '/@/router';
import { activeChatRoom, activeLLMId } from '/@/stores/chatRoom';
import { handleNormalAuth } from '/@/utils/request';
const sendClick = () => {
   emits('sendClick');
const emits = defineEmits(['sendClick']);
const inputValue = ref('');
const sendClick = async (cb) => {
   if (!inputValue.value.trim()) return;
   if (!handleNormalAuth()) {
      return;
   }
   const res = await setHistoryGroupTitle({
      history_group_id: activeChatRoom.value.id,
      title: inputValue.value,
   });
   if (!res.json_ok) {
      return ElMessage.error('修改聊天室名称失败');
   }
   activeChatRoom.value.title = inputValue.value;
   activeChatRoom.value.isInitial = false;
   router.push({
      name: 'AskAnswer',
      query: {
         id: activeChatRoom.value.id,
      },
   });
};
let state = reactive({
   roleList: [
      {
         ID: 1,
         Icon: '/static/images/wave/Glm.jpg',
         Title: '水务GLM',
         Content: '使用最为广泛的知名AI模型,响应速度快,智能化程度高,擅长多领域问题解决,包括创作、翻译、多语种百科知识、数学问题等。',
const llmList = ref([]);
const iconList = ['/static/images/wave/Glm.jpg', '/static/images/wave/Glm.jpg', '/static/images/wave/Glm.jpg'];
const getLLMList = async () => {
   const res = await GetLLMList();
   const resData = (res?.llm_list || []) as any[];
   llmList.value = resData.map((item, index) => ({
      get logicId() {
         return this.logicModel.id;
      },
      {
         ID: 2,
         Icon: '/static/images/wave/Glm.jpg',
         Title: '水务-3.5',
         Content:
            '目前业界最强大的模型,在需要高级推理、深度指令理解和更具创造力的任务中,表现比其他模型更强,例如复杂的文本和逻辑分析、复杂的数学问题等。',
      get logicTitle() {
         return this.logicModel.title;
      },
      {
         ID: 3,
         Icon: '/static/images/wave/Glm.jpg',
         Title: '水务-4.0',
         Content:
            '目前业界最强大的模型,在需要高级推理、深度指令理解和更具创造力的任务中,表现比其他模型更强,例如复杂的文本和逻辑分析、复杂的数学问题等。',
      icon: iconList[index],
      logicModel: {
         ...item,
      },
   ],
   activeRole: 0,
   inputAnswer: '',
});
   }));
   const first = llmList.value?.[0];
   first && setLLm(first.logicId);
};
const setLLm = async (llmId: string) => {
   // const res = await SetLLM({
   //    llm: llmId,
   // });
   activeLLMId.value = llmId;
   return true;
};
const handleClick = (item) => {
   state.activeRole = item.id;
   setLLm(item.logicId);
};
const updateChatInput = (val) => {
   inputValue.value = val;
};
defineExpose({
   updateChatInput,
});
</script>
<style scoped lang="scss">
.set-waterTitle {
@@ -135,77 +135,6 @@
   background-color: #1c86ff;
   border-color: #1c86ff;
   color: #fff;
}
.playInput {
   align-items: flex-start;
   width: 760px;
   position: relative;
   padding: 4px 4px 4px 12px;
   display: flex;
   -webkit-box-align: end;
   -ms-flex-align: end;
   align-items: flex-end;
   -webkit-box-sizing: border-box;
   box-sizing: border-box;
   border-radius: 22px;
   border: 1px solid #00000030;
   -webkit-box-shadow: 0 0 0 1px transparent, 0 3px 16px 0 #dee0f3;
   box-shadow: 0 0 0 1px transparent, 0 3px 16px 0 #dee0f3;
   -webkit-transition: border-color 0.1s ease-in-out, -webkit-box-shadow 0.1s ease-in-out;
   transition: border-color 0.1s ease-in-out, -webkit-box-shadow 0.1s ease-in-out;
   -o-transition: border-color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
   transition: border-color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
   transition: border-color 0.1s ease-in-out, box-shadow 0.1s ease-in-out, -webkit-box-shadow 0.1s ease-in-out;
   background-color: #fff;
   .assembly {
      position: relative;
      align-self: flex-end;
      margin-right: 12px;
      .label {
         height: 38px;
      }
   }
   .set-input {
      position: relative;
      vertical-align: bottom;
      font-size: 14px;
      display: inline-block;
      width: 100%;
      .set-inputAnswer {
         min-height: 36px;
         height: 36px;
         padding: 3px 0;
         line-height: 20px;
         border: none;
         background-color: transparent;
         color: #333;
         font-size: 15px;
      }
      :deep(.el-input__wrapper) {
         box-shadow: unset;
      }
   }
   .upload_img {
      .imgbox {
         height: 38px;
         .set-img-icon {
            width: 38px;
            height: 38px;
            border-radius: 5px;
            transition: background-color 0.1s ease-in-out;
         }
         .send {
            width: 36px;
            height: 36px;
            border-radius: 50%;
            background-color: #2c1e1d;
            img {
               margin: 4px 0 0 -2px;
            }
         }
      }
   }
}
</style>
<style lang="scss">