5959 class =" chat-record-list"
6060 :class =" { 'hide-sidebar': !isAssistant && !chatListSideBarShow }"
6161 >
62- <div v-if =" computedMessages.length == 0" class =" welcome-content-block" >
62+ <div v-if =" computedMessages.length == 0 && !loading " class =" welcome-content-block" >
6363 <div class =" welcome-content" >
64- <div class =" logo" >SQLBot</div >
65- <div >{{ t('qa.greeting') }}</div >
66- <div class =" sub" >{{ t('qa.description') }}</div >
64+ <div class =" greeting" >
65+ <el-icon size =" 32" >
66+ <logo _fold />
67+ </el-icon >
68+ {{ t('qa.greeting') }}
69+ </div >
70+ <div class =" sub" >{{ t('qa.hint_description') }}</div >
6771 <el-button
6872 v-if =" currentChatId === undefined"
6973 size =" large"
7074 type =" primary"
7175 @click =" createNewChat"
7276 >
7377 <el-icon >
74- <Plus />
78+ <icon _new_chat_outlined />
7579 </el-icon >
76- {{ t('qa.new_chat ') }}
80+ {{ t('qa.start_sqlbot ') }}
7781 </el-button >
7882 </div >
7983 </div >
84+ <div v-else-if =" computedMessages.length == 0 && loading" class =" welcome-content-block" >
85+ <logo />
86+ </div >
8087 <el-scrollbar v-if =" computedMessages.length > 0" ref =" chatListRef" >
81- <template v-for =" (message , _index ) in computedMessages " :key =" _index " >
82- <ChatRow :current-chat =" currentChat" :msg =" message" :hide-avatar =" message.first_chat" >
83- <RecommendQuestion
84- v-if =" message.role === 'assistant' && message.first_chat"
85- :questions =" message.recommended_question"
86- :first-chat =" message.first_chat"
87- @click-question =" quickAsk"
88- />
89- <UserChat v-if =" message.role === 'user'" :message =" message" />
90- <template v-if =" message .role === ' assistant' && ! message .first_chat " >
91- <ChatAnswer
92- v-if ="
93- message?.record?.analysis_record_id == undefined &&
94- message?.record?.predict_record_id == undefined
95- "
96- :message =" message"
97- >
98- <template v-if =" message .record ?.chart " >
99- <div style =" padding : 0 22px ; display : flex ; justify-content : flex-end " >
100- <el-button
101- text
102- type =" primary"
103- :disabled =" isTyping || isPredictTyping || isAnalysisTyping"
104- @click =" clickAnalysis(message.record?.id)"
105- >
106- {{ t('chat.data_analysis') }}
107- </el-button >
108- <el-button
109- text
110- type =" primary"
111- :disabled =" isTyping || isPredictTyping || isAnalysisTyping"
112- @click =" clickPredict(message.record?.id)"
113- >
114- {{ t('chat.data_predict') }}
115- </el-button >
116- </div >
117- </template >
118- </ChatAnswer >
119-
120- <div
121- v-if ="
122- message?.record?.analysis_record_id != undefined ||
123- message?.record?.predict_record_id != undefined
124- "
125- class =" analysis-container"
126- >
127- <template v-if =" message .record ?.analysis || isAnalysisTyping " >
128- <MdComponent :message =" message.record?.analysis_thinking" />
129- <MdComponent :message =" message.record?.analysis" />
130- </template >
131-
132- <el-divider
133- v-if ="
134- (message.record?.analysis || isAnalysisTyping) &&
135- (message.record?.predict || isPredictTyping)
136- "
137- />
138- <template v-if =" message .record ?.predict || isPredictTyping " >
139- <MdComponent :message =" message.record?.predict" />
140- <MdComponent :message =" message.record?.predict_content" />
141- <!-- <PredictChartBlock-->
142- <!-- :id="message.record?.id + '-predict'"-->
143- <!-- :data="message.record?.predict_data ?? '[]'"-->
144- <!-- :message="message"-->
145- <!-- :chart-type="data.chartType"-->
146- <!-- />-->
147- </template >
148- </div >
149- </template >
150- <template v-if =" message .role === ' assistant' " #footer >
88+ <div class =" chat-scroll" :class =" { 'no-sidebar': !isAssistant && !chatListSideBarShow }" >
89+ <template v-for =" (message , _index ) in computedMessages " :key =" _index " >
90+ <ChatRow :current-chat =" currentChat" :msg =" message" :hide-avatar =" message.first_chat" >
15191 <RecommendQuestion
92+ v-if =" message.role === 'assistant' && message.first_chat"
15293 :questions =" message.recommended_question"
15394 :first-chat =" message.first_chat"
15495 @click-question =" quickAsk"
15596 />
156- </template >
157- </ChatRow >
158- </template >
97+ <UserChat v-if =" message.role === 'user'" :message =" message" />
98+ <template v-if =" message .role === ' assistant' && ! message .first_chat " >
99+ <ChatAnswer
100+ v-if ="
101+ message?.record?.analysis_record_id == undefined &&
102+ message?.record?.predict_record_id == undefined
103+ "
104+ :message =" message"
105+ >
106+ <template v-if =" message .record ?.chart " >
107+ <div style =" padding : 0 22px ; display : flex ; justify-content : flex-end " >
108+ <el-button
109+ text
110+ type =" primary"
111+ :disabled =" isTyping || isPredictTyping || isAnalysisTyping"
112+ @click =" clickAnalysis(message.record?.id)"
113+ >
114+ {{ t('chat.data_analysis') }}
115+ </el-button >
116+ <el-button
117+ text
118+ type =" primary"
119+ :disabled =" isTyping || isPredictTyping || isAnalysisTyping"
120+ @click =" clickPredict(message.record?.id)"
121+ >
122+ {{ t('chat.data_predict') }}
123+ </el-button >
124+ </div >
125+ </template >
126+ </ChatAnswer >
127+
128+ <div
129+ v-if ="
130+ message?.record?.analysis_record_id != undefined ||
131+ message?.record?.predict_record_id != undefined
132+ "
133+ class =" analysis-container"
134+ >
135+ <template v-if =" message .record ?.analysis || isAnalysisTyping " >
136+ <MdComponent :message =" message.record?.analysis_thinking" />
137+ <MdComponent :message =" message.record?.analysis" />
138+ </template >
139+
140+ <el-divider
141+ v-if ="
142+ (message.record?.analysis || isAnalysisTyping) &&
143+ (message.record?.predict || isPredictTyping)
144+ "
145+ />
146+ <template v-if =" message .record ?.predict || isPredictTyping " >
147+ <MdComponent :message =" message.record?.predict" />
148+ <MdComponent :message =" message.record?.predict_content" />
149+ <!-- <PredictChartBlock-->
150+ <!-- :id="message.record?.id + '-predict'"-->
151+ <!-- :data="message.record?.predict_data ?? '[]'"-->
152+ <!-- :message="message"-->
153+ <!-- :chart-type="data.chartType"-->
154+ <!-- />-->
155+ </template >
156+ </div >
157+ </template >
158+ <template v-if =" message .role === ' assistant' " #footer >
159+ <RecommendQuestion
160+ :questions =" message.recommended_question"
161+ :first-chat =" message.first_chat"
162+ @click-question =" quickAsk"
163+ />
164+ </template >
165+ </ChatRow >
166+ </template >
167+ </div >
159168 </el-scrollbar >
160169 </el-main >
161170 <el-footer
200209
201210<script setup lang="ts">
202211import { computed , nextTick , onMounted , ref } from ' vue'
203- import { Plus , Position } from ' @element-plus/icons-vue'
212+ import { Position } from ' @element-plus/icons-vue'
204213import { Chat , chatApi , ChatInfo , type ChatMessage , ChatRecord , questionApi } from ' @/api/chat'
205214import ChatRow from ' ./ChatRow.vue'
206215import ChatAnswer from ' ./ChatAnswer.vue'
@@ -213,6 +222,8 @@ import { useI18n } from 'vue-i18n'
213222import { endsWith , find , startsWith } from ' lodash-es'
214223import icon_new_chat_outlined from ' @/assets/svg/icon_new_chat_outlined.svg'
215224import icon_sidebar_outlined from ' @/assets/svg/icon_sidebar_outlined.svg'
225+ import logo_fold from ' @/assets/LOGO-fold.svg'
226+ import logo from ' @/assets/LOGO.svg'
216227
217228import { useAssistantStore } from ' @/stores/assistant'
218229const assistantStore = useAssistantStore ()
@@ -876,6 +887,19 @@ defineExpose({
876887 }
877888 }
878889
890+ .chat-scroll {
891+ width : 100% ;
892+ display : flex ;
893+ flex-direction : column ;
894+ align-items : center ;
895+ padding-left : 56px ;
896+ padding-right : 56px ;
897+
898+ & .no-sidebar {
899+ padding-left : 96px ;
900+ }
901+ }
902+
879903 .chat-footer {
880904 --ed-footer-height : 120px ;
881905
@@ -929,22 +953,26 @@ defineExpose({
929953 padding : 12px ;
930954
931955 width : fit-content ;
956+ max-width : 800px ;
932957 display : flex ;
933958 gap : 16px ;
934959 align-items : center ;
935960 flex-direction : column ;
936961
937- .logo {
938- line-height : 60px ;
939- font-size : 3em ;
940- font-weight : bold ;
941- color : var (--el-color-primary );
942- text-align : left ;
962+ .greeting {
963+ display : flex ;
964+ align-items : center ;
965+ gap : 16px ;
966+ line-height : 32px ;
967+ font-size : 24px ;
968+ font-weight : 600 ;
969+ color : rgba (31 , 35 , 41 , 1 );
943970 }
944971
945972 .sub {
946973 color : grey ;
947- font-size : 0.8em ;
974+ font-size : 16px ;
975+ line-height : 24px ;
948976 }
949977 }
950978}
0 commit comments