Browse Source

fix:1. 图片、内容增加loading效果;2. 增加联网会话页面;3. 普通会话增加联网字段为0,不联网;

dxj
李朋徽 1 year ago
parent
commit
cae0b79aa2
  1. 2
      .env.production
  2. 3
      src/api/base/message.ts
  3. 7
      src/assets/svg/net.svg
  4. 39
      src/components/AppMessage/index.vue
  5. 5
      src/enums/menuEnum.ts
  6. 10
      src/enums/messageEnum.ts
  7. 1
      src/hooks/useMqtt.ts
  8. 8
      src/layout/AppMenu/index.vue
  9. 8
      src/router/index.ts
  10. 2
      src/utils/mqtt.ts
  11. 5
      src/views/conversation/index.vue
  12. 464
      src/views/conversationNet/index.vue
  13. 2
      src/views/repository/index.vue
  14. 5
      src/views/role/index.vue
  15. 2
      src/views/visualAnalysis/index.vue

2
.env.production

@ -1,7 +1,7 @@
# 正式环境
# 公共地址
VITE_GLOB_BASE_URL = "https://ai.sinenux.com:19876"
VITE_GLOB_BASE_URL = "http://223.99.228.207:19872"
# 本地MQTT地址
VITE_GLOB_MQTT_HOST = "223.99.228.240"

3
src/api/base/message.ts

@ -1,6 +1,6 @@
import { defHttp } from '@/utils/axios/index'
import type { MenuTypeEnum } from '@/enums/menuEnum'
import type { ModelTypeEnum } from '@/enums/messageEnum'
import type { ModelTypeEnum, NetTypeEnum } from '@/enums/messageEnum'
/**
* @description
@ -87,6 +87,7 @@ export async function sendTextToText(data: {
question: string
modelType: ModelTypeEnum
roleId?: number
netType: NetTypeEnum
}) {
return defHttp.post({
url: `/open-chat/chat/session`,

7
src/assets/svg/net.svg

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="56" height="56" viewBox="0 0 56 56" enable-background="new 0 0 56 56" xml:space="preserve">
<image id="image0" width="56" height="56" x="0" y="0" href="data:image/png;base64,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"></image>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

39
src/components/AppMessage/index.vue

File diff suppressed because one or more lines are too long

5
src/enums/menuEnum.ts

@ -14,6 +14,11 @@ export enum MenuTypeEnum {
// 知识库
REPOSITORY,
// 联网会话
CONVERSATION_NET,
// ------------------以上与数据库一致
// 任务
TASK,

10
src/enums/messageEnum.ts

@ -42,3 +42,13 @@ export enum ModelTypeEnum {
// 知识库 QAnything
QANYTHING = 5,
}
/**
* @description:
* @param LOCAL ()
* @param REMOTE
*/
export enum NetTypeEnum {
LOCAL,
REMOTE,
}

1
src/hooks/useMqtt.ts

@ -40,6 +40,7 @@ export function useMqtt() {
if (message.conversationId !== messageStore.getConversationData.id) {
return
}
console.log(message.message_content.length)
if (message.message_type === MessageStatusEnum.ACTICON) {
// 这里主要是知识库的数据更新,因为知识库回答是每次都是一个字,并不是通常的不断叠加,需要前端手动叠加

8
src/layout/AppMenu/index.vue

@ -23,6 +23,12 @@ const menu = ref<MenuItem[]>([
path: '/conversation',
key: MenuTypeEnum.TEXT_TO_TEXT,
},
{
name: '联网会话',
icon: 'net',
path: '/conversationNet',
key: MenuTypeEnum.CONVERSATION_NET,
},
{
name: '文生图',
icon: 'wen_sheng_tu',
@ -74,7 +80,7 @@ const footMenu = ref([
watch(
() => router.currentRoute.value.path,
(toPath) => {
const menuIndex = menu.value.findIndex(item => toPath.startsWith(item.path))
const menuIndex = menu.value.findIndex(item => toPath === item.path)
if (menuIndex !== -1)
menuActive.value = menu.value[menuIndex].key
},

8
src/router/index.ts

@ -39,6 +39,14 @@ export const constantRoutes: Array<RouteRecordRaw> = [
title: '会话',
},
},
{
name: 'ConversationNet',
path: '/conversationNet',
component: () => import('@/views/conversationNet/index.vue'),
meta: {
title: '联网会话',
},
},
{
name: 'TextToPicture',
path: '/textToImage',

2
src/utils/mqtt.ts

@ -26,7 +26,7 @@ export class MqttService {
const connectUrl = `${protocol}://${host}:${port}/mqtt`
this.client = mqtt.connect(connectUrl, this.options)
this.client.on('connect', () => {
console.log('连接成功')
console.log('连接成功,connectUrl:', connectUrl)
resolve(true)
})

5
src/views/conversation/index.vue

@ -18,7 +18,7 @@ import { AppModelSelect } from '@/components/AppModelSelect'
import type { ModelSelect } from '@/components/AppModelSelect/index.d'
import { useMessageStore } from '@/store/moules/messageStore/index'
import { MenuTypeEnum } from '@/enums/menuEnum'
import { MessageStatusEnum, MessageTypeEnum, ModelTypeEnum } from '@/enums/messageEnum'
import { MessageStatusEnum, MessageTypeEnum, ModelTypeEnum, NetTypeEnum } from '@/enums/messageEnum'
import { addMessage, conversationList, conversationToTop, historyMessage, removeMessage, sendTextToText, stopMessage, updateMessage } from '@/api/base/message'
import { getAppList, getRole } from '@/api/base/role'
import { useMqtt } from '@/hooks/useMqtt'
@ -269,7 +269,7 @@ async function sendMessage(conversationId: string, question: string): Promise<vo
})
messageStore.setMessagePushItem({
messageType: MessageTypeEnum.AI,
content: '正在思考中...',
content: '',
time: String(new Date().getTime()),
avatar: '',
messageStatus: MessageStatusEnum.LOADING,
@ -279,6 +279,7 @@ async function sendMessage(conversationId: string, question: string): Promise<vo
conversationId,
question,
modelType: modelOptions[modelIndex.value].value,
netType: NetTypeEnum.LOCAL,
}).catch(() => {
messageStore.getMessageList.splice(-2)
messageStore.setMessageStatus(MessageStatusEnum.END)

464
src/views/conversationNet/index.vue

@ -0,0 +1,464 @@
<script setup lang="ts">
import { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue'
import { Button, Spin, message } from 'ant-design-vue'
import { AppContainerBox } from '@/components/AppContainerBox'
import { AppSubMenuTitle } from '@/components/AppSubMenuTitle'
import { AppSubMenuList } from '@/components/AppSubMenuList'
import { AppConversationDefault } from '@/components/AppConversationDefault'
import { AppUserInfo } from '@/components/AppUserInfo'
import { SubMenuActionEnum } from '@/components/AppSubMenuList/index.d'
import type { SubMenuItem } from '@/components/AppSubMenuList/index.d'
import type { PictureType } from '@/components/AppPicture/index.d'
import { AppNoviceBenefit } from '@/components/AppNoviceBenefit/index'
import { AppTextarea } from '@/components/AppTextarea'
import { AppMessage } from '@/components/AppMessage'
import type { MessageItem } from '@/components/AppMessage/index.d'
import type { TopPickItem } from '@/components/AppTopPicks/index.d'
import { AppModelSelect } from '@/components/AppModelSelect'
import type { ModelSelect } from '@/components/AppModelSelect/index.d'
import { useMessageStore } from '@/store/moules/messageStore/index'
import { MenuTypeEnum } from '@/enums/menuEnum'
import { MessageStatusEnum, MessageTypeEnum, ModelTypeEnum, NetTypeEnum } from '@/enums/messageEnum'
import { addMessage, conversationList, conversationToTop, historyMessage, removeMessage, sendTextToText, stopMessage, updateMessage } from '@/api/base/message'
import { getAppList, getRole } from '@/api/base/role'
import { useMqtt } from '@/hooks/useMqtt'
import { useMessage } from '@/hooks/useMessage'
const { createConfirm } = useMessage()
const messageStore = useMessageStore()
const sendBtnLoading = ref(false)
const subMenuActiveIndex = ref(-1) //
const subMenuActionIndex = ref(-1) //
const subMenuList = ref<SubMenuItem[]>([])
const subMenuInputValue = ref<string>('')
const appMessageRef = ref()
const modelOptions: ModelSelect[] = [
{
label: 'GPT-3.5-Turbo',
value: ModelTypeEnum.GPT3,
},
{
label: 'GPT-4',
value: ModelTypeEnum.GPT4,
},
]
const modelIndex = ref(0)
const roleList = ref<PictureType[]>([])
const applyList = ref<PictureType[]>([])
const messageList = computed(() => messageStore.getMessageList)
const messageStatus = computed(() => messageStore.getMessageStatus)
const conversationData = computed(() => messageStore.getConversationData)
const historyMessageParams = ref({
conversationId: '',
current: 1,
size: 10,
total: 0,
})
const conversationDefaultShow = ref(false)
const appMessageShow = ref(true)
const spinning = ref(true)
const elIndex = ref(0) //
watch(
() => messageStatus.value,
(val) => {
if (val === MessageStatusEnum.END) {
sendBtnLoading.value = false
}
},
)
/**
* @description: 点击会话操作项
*/
function handlesubMenuActionIndex(type: SubMenuActionEnum, item: SubMenuItem, index: number) {
subMenuActionIndex.value = index
const subMenuActionData = subMenuList.value[index]
if (type === SubMenuActionEnum.EDIT) {
subMenuList.value.forEach((item) => {
item.actionType = SubMenuActionEnum.NOT
})
subMenuList.value[index].actionType = SubMenuActionEnum.EDIT
subMenuInputValue.value = item.title
}
if (type === SubMenuActionEnum.DELETE) {
createConfirm({
title: '删除',
content: `确定要删除${item.title}会话吗?`,
iconType: 'warning',
onOk: () => {
removeMessage(item.id).then(async () => {
message.success('删除成功')
subMenuActiveIndex.value = -1
conversationDefaultShow.value = true
await getConversationList()
})
},
})
}
if (type === SubMenuActionEnum.TO_TOP) {
conversationToTop(item.id).then(async () => {
message.success('置顶成功')
await getConversationList()
const index = subMenuList.value.findIndex(item => item.id === subMenuActionData.id)
await handleSubMenuChange(index)
getHistoryMessage()
})
}
}
/**
* @description: 切换会话
*/
async function handleSubMenuChange(index: number, item?: SubMenuItem) {
if (messageStatus.value !== MessageStatusEnum.END) {
message.warn('请先结束对话')
return
}
if (!subMenuList.value.length) {
return
}
subMenuActiveIndex.value = index
historyMessageParams.value.current = 1
historyMessageParams.value.total = 0
messageStore.setConversationData(subMenuList.value[subMenuActiveIndex.value])
messageStore.setMessageClear()
const modelIdx = modelOptions.findIndex(v => v.value === Number(subMenuList.value[subMenuActiveIndex.value].modelType))
if (modelIdx === -1) {
message.warn('未找到该对话下的模型信息')
return
}
modelIndex.value = modelIdx
useMqtt().end()
useMqtt().connect()
// item
if (item) {
getHistoryMessage()
}
}
/**
* @description: 发送消息
*/
async function handleSend(value: string) {
sendBtnLoading.value = true
conversationDefaultShow.value = false
if (subMenuActiveIndex.value === -1) {
try {
spinning.value = true
messageStore.setMessageClear()
await addMessage({ type: MenuTypeEnum.CONVERSATION_NET, title: '新的对话', sort: subMenuList.value.length + 1, modelType: modelOptions[modelIndex.value].value })
await getConversationList()
await nextTick()
subMenuActiveIndex.value = subMenuList.value.length - 1
await handleSubMenuChange(subMenuActiveIndex.value)
if (!conversationData.value) {
message.error('对话发送,请稍后重试!')
return
}
sendMessage(conversationData.value.id, value)
spinning.value = false
}
catch (error) {
message.error('新建对话失败,请稍后重试!')
}
}
else {
if (!conversationData.value) {
return
}
sendMessage(conversationData.value.id, value)
}
}
/**
* @description: 获取会话列表
*/
async function getConversationList() {
const res = await conversationList(MenuTypeEnum.CONVERSATION_NET)
res.forEach((item: SubMenuItem) => {
item.actionType = SubMenuActionEnum.NOT
})
subMenuList.value = res
}
/**
* @description: 获取历史对话记录
*/
async function getHistoryMessage() {
if (!conversationData.value) {
spinning.value = false
conversationDefaultShow.value = true
return
}
spinning.value = true
historyMessageParams.value.conversationId = conversationData.value.id
const res = await historyMessage(historyMessageParams.value)
spinning.value = false
if (!res || !res.records || !res.records.length) {
if (!res.records.length && historyMessageParams.value.total === 0) {
conversationDefaultShow.value = true
}
return
}
res.records.forEach((item: any) => {
const itemData: MessageItem = {
messageType: item.roleType === MessageTypeEnum.USER ? MessageTypeEnum.USER : MessageTypeEnum.AI,
content: item.messageContent,
time: item.messageTime,
avatar: '',
messageStatus: MessageStatusEnum.END,
}
historyMessageParams.value.total = res.total
messageStore.setMessageUnshiftItem(itemData)
})
elIndex.value = res.records.length
conversationDefaultShow.value = false
}
/**
* @description: 滚动监听
*/
async function onScrollTop(scrollTop: number) {
if (scrollTop !== 0) {
return
}
if (historyMessageParams.value.current * historyMessageParams.value.size >= historyMessageParams.value.total) {
return
}
if (historyMessageParams.value.current < historyMessageParams.value.total) {
historyMessageParams.value.current++
await getHistoryMessage()
//
await appMessageRef.value.getElementOffsetTop()
await appMessageRef.value.seamlessScrollToTop()
}
}
/**
* @description: 发送消息hook
*/
async function sendMessage(conversationId: string, question: string): Promise<void> {
if (!messageStore.getConversationData) {
return
}
conversationDefaultShow.value = false
messageStore.setMessageStatus(MessageStatusEnum.LOADING)
messageStore.setMessagePushItem({
messageType: MessageTypeEnum.USER,
content: question,
time: String(new Date().getTime()),
avatar: '',
})
messageStore.setMessagePushItem({
messageType: MessageTypeEnum.AI,
content: '',
time: String(new Date().getTime()),
avatar: '',
messageStatus: MessageStatusEnum.LOADING,
})
sendTextToText({
conversationId,
question,
modelType: modelOptions[modelIndex.value].value,
netType: NetTypeEnum.REMOTE,
}).catch(() => {
messageStore.getMessageList.splice(-2)
messageStore.setMessageStatus(MessageStatusEnum.END)
})
}
/**
* @description: 重新回答
*/
function reloadMessage() {
if (!conversationData.value) {
return
}
const question = messageList.value[messageList.value.length - 2]?.content
sendMessage(conversationData.value.id, question)
}
/**
* @description: 停止回答
*/
async function stopMessageFun() {
if (!conversationData.value) {
return
}
await stopMessage({ conversationId: conversationData.value.id })
}
/**
* @description: 点击新建会话按钮
*/
function handleAddMessage() {
if (messageStatus.value !== MessageStatusEnum.END) {
message.warn('请先结束对话')
return
}
conversationDefaultShow.value = true
subMenuActiveIndex.value = -1
}
/**
* @description: 点击默认看板的精选话题
*/
function handlePick(_index: number, item: TopPickItem) {
handleSend(item.label)
}
/**
* @description: gpt模型切换
*/
function handleModel(index: number) {
modelIndex.value = index
}
//
function getRoleData() {
getRole(1).then((res) => {
roleList.value = res
})
}
//
function getAppData() {
getAppList().then((res) => {
applyList.value = res[0].roleInfoAppModelList
})
}
//
function handleSubMenuInputAffirm(index: number, item: SubMenuItem, inputValue: string) {
updateMessage({ ...item, title: inputValue }).then(() => {
message.success('修改成功')
subMenuList.value[index].title = inputValue
subMenuList.value[index].actionType = SubMenuActionEnum.NOT
})
}
function handleSubMenuInputClose(index: number) {
subMenuList.value[index].actionType = SubMenuActionEnum.NOT
}
function handleSubMenuInputBlur(index: number, item: SubMenuItem, inputValue: string) {
subMenuActionIndex.value = -1
handleSubMenuInputAffirm(index, item, inputValue)
}
onMounted(async () => {
await getConversationList()
if (subMenuList.value.length) {
subMenuActiveIndex.value = 0
}
await handleSubMenuChange(subMenuActiveIndex.value)
getHistoryMessage()
getRoleData()
getAppData()
})
onUnmounted(() => {
messageStore.setMessageClear()
messageStore.setConversationData(undefined)
useMqtt().end()
})
</script>
<template>
<AppContainerBox>
<template #subMenu>
<!-- 标题 -->
<AppSubMenuTitle></AppSubMenuTitle>
<!-- 按钮 -->
<div class="px-5 mb-5">
<Button type="primary" class="w-full" @click="handleAddMessage">
新建会话
</Button>
</div>
<!-- 会话列表 -->
<AppSubMenuList
v-model:input-value="subMenuInputValue"
:list="subMenuList"
:active-index="subMenuActiveIndex"
:action-index="subMenuActionIndex"
@change="handleSubMenuChange"
@handle-action="handlesubMenuActionIndex"
@input-affirm="handleSubMenuInputAffirm"
@input-close="handleSubMenuInputClose"
@input-blur="handleSubMenuInputBlur"
>
</AppSubMenuList>
<AppUserInfo />
<AppNoviceBenefit />
</template>
<template #content>
<Spin :spinning="spinning" wrapper-class-name="app-content-spin">
<AppModelSelect
v-if="conversationDefaultShow"
:active-index="modelIndex"
:options="modelOptions"
@change="handleModel"
>
</AppModelSelect>
<!-- 默认导语 -->
<AppConversationDefault
v-if="conversationDefaultShow"
:is-pick="true"
:is-hot="false"
:role-list="roleList"
:apply-list="applyList"
height="calc(100% - 148px)"
@handle-pick="handlePick"
>
</AppConversationDefault>
<div class="h-full flex flex-col">
<!-- 消息列表 -->
<AppMessage
v-if="!conversationDefaultShow && appMessageShow"
ref="appMessageRef"
:key="MenuTypeEnum.CONVERSATION_NET"
class="pl-27 pr-5"
:el-index="elIndex"
:list="messageList"
@on-scroll-top="onScrollTop"
@reload-message="reloadMessage"
>
</AppMessage>
<!-- 发送框 -->
<AppTextarea
class="pl-44 pr-24 mt-10"
:btn-loading="sendBtnLoading"
:is-stop="false"
@send="handleSend"
@stop-message="stopMessageFun"
></AppTextarea>
</div>
</Spin>
</template>
</AppContainerBox>
</template>
<style lang="scss" scoped>
</style>

2
src/views/repository/index.vue

@ -286,7 +286,7 @@ async function sendMessage(conversationId: string, question: string): Promise<vo
})
messageStore.setMessagePushItem({
messageType: MessageTypeEnum.AI,
content: '正在思考中...',
content: '',
time: String(new Date().getTime()),
avatar: '',
messageStatus: MessageStatusEnum.LOADING,

5
src/views/role/index.vue

@ -18,7 +18,7 @@ import type { RoleData, RoleInfoAppModel } from '@/components/AppRoleDefault/ind
import type { MessageItem } from '@/components/AppMessage/index.d'
import { useMessageStore } from '@/store/moules/messageStore/index'
import { MenuTypeEnum } from '@/enums/menuEnum'
import { MessageStatusEnum, MessageTypeEnum, ModelTypeEnum } from '@/enums/messageEnum'
import { MessageStatusEnum, MessageTypeEnum, ModelTypeEnum, NetTypeEnum } from '@/enums/messageEnum'
import { addMessage, conversationList, conversationToTop, historyMessage, removeMessage, sendTextToText, updateMessage } from '@/api/base/message'
import { getRoleDecs } from '@/api/base/role'
import { useMqtt } from '@/hooks/useMqtt'
@ -251,7 +251,7 @@ async function sendMessage(conversationId: string, question: string, roleId: num
})
messageStore.setMessagePushItem({
messageType: MessageTypeEnum.AI,
content: '正在思考中...',
content: '',
time: String(new Date().getTime()),
avatar: '',
messageStatus: MessageStatusEnum.LOADING,
@ -262,6 +262,7 @@ async function sendMessage(conversationId: string, question: string, roleId: num
question,
roleId,
modelType: modelOptions[modelIndex.value].value,
netType: NetTypeEnum.LOCAL,
}).catch(() => {
messageStore.getMessageList.splice(-2)
messageStore.setMessageStatus(MessageStatusEnum.END)

2
src/views/visualAnalysis/index.vue

@ -273,7 +273,7 @@ async function sendMessage(conversationId: string, question: string, fileUrl: st
})
messageStore.setMessagePushItem({
messageType: MessageTypeEnum.AI,
content: '正在思考中...',
content: '',
time: String(new Date().getTime()),
avatar: '',
messageStatus: MessageStatusEnum.LOADING,

Loading…
Cancel
Save