8 changed files with 397 additions and 732 deletions
-
11src/views/AIAssistant/AIDigitalHuman/index.vue
-
294src/views/AIAssistant/AIIntelligentCoding/aiForm copy.vue
-
155src/views/AIAssistant/AIIntelligentCoding/aiForm.vue
-
262src/views/AIAssistant/AIIntelligentCoding/index.vue
-
35src/views/AIAssistant/AIknowledgeGraph/index.vue
-
7src/views/collectReorganizi/collectionLibrary/module/uploadOriginal/bigUpload.vue
-
185src/views/collectReorganizi/collectionLibrary/module/uploadOriginal/index.vue
-
180src/views/components/echarts/graph.vue
@ -1,294 +0,0 @@ |
|||
<template> |
|||
<el-row :gutter="12" class="demo-radius"> |
|||
<div |
|||
class="radius" |
|||
:style="{ |
|||
borderRadius: 'base' |
|||
}" |
|||
> |
|||
<div id="messgebox" ref="scrollDiv" class="messge"> |
|||
<ul> |
|||
<li |
|||
v-for="(item, index) in message" |
|||
:key="index" |
|||
style="list-style-type:none;" |
|||
> |
|||
<div |
|||
v-if="item.user == username" |
|||
class="mymsginfo" |
|||
style="float:right" |
|||
> |
|||
<div> |
|||
<el-avatar |
|||
style="float: right;margin-right: 30px;background: #01bd7e;" |
|||
> |
|||
<!-- {{ item.user.substring(0, 2) }} --> |
|||
<img :alt="item.user.substring(0, 2)" :src="userphoto"> |
|||
</el-avatar> |
|||
</div> |
|||
<div |
|||
style="float: right;margin-right: 10px;margin-top:10px;width:80%;text-align: right;" |
|||
> |
|||
{{ item.msg }} |
|||
</div> |
|||
</div> |
|||
<div v-else class="chatmsginfo"> |
|||
<div> |
|||
<el-avatar style="float: left;margin-right: 10px;"> |
|||
{{ item.user }} |
|||
</el-avatar> |
|||
</div> |
|||
<div style="float: left;margin-top:10px;width:80%;"> |
|||
<img |
|||
v-if="item.msg == ''" |
|||
alt="loading" |
|||
class="loading" |
|||
src="" |
|||
> |
|||
<MdPreview |
|||
style="margin-top:-20px;" |
|||
:auto-fold-threshold="9999" |
|||
:editor-id="id" |
|||
:model-value="item.msg + item.dot" |
|||
/> |
|||
<!-- {{ item.msg }} --> |
|||
</div> |
|||
</div> |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
<div class="inputmsg"> |
|||
<el-form :model="form"> |
|||
<el-form-item> |
|||
<el-avatar |
|||
style="float: left;background: #01bd7e;margin-bottom: -44px;margin-left: 4px;z-index: 999;width: 30px;height: 30px;" |
|||
> |
|||
<img alt="jin" :src="userphoto"> |
|||
</el-avatar> |
|||
<el-input |
|||
id="txt_suiwen" |
|||
v-model="form.desc" |
|||
:prefix-icon="userphoto" |
|||
resize="none" |
|||
autofocus="true" |
|||
:autosize="{ minRows: 1, maxRows: 2 }" |
|||
placeholder="说说你想问点啥....按Enter键可直接发送" |
|||
type="textarea" |
|||
@keydown.enter.native.prevent="startStreaming($event)" |
|||
/> |
|||
</el-form-item> |
|||
</el-form> |
|||
</div> |
|||
</div> |
|||
</el-row> |
|||
</template> |
|||
<script setup> |
|||
// import { MdPreview, MdCatalog } from 'md-editor-v3' |
|||
// import 'md-editor-v3/lib/preview.css' |
|||
// const id = 'preview-only' |
|||
</script> |
|||
<script> |
|||
export default { |
|||
data() { |
|||
return { |
|||
form: { |
|||
desc: "" |
|||
}, |
|||
message: [], |
|||
username: sessionStorage.name, |
|||
userphoto: sessionStorage.photo, |
|||
loadingtype: false, |
|||
controller: null, |
|||
arequestData: { |
|||
model: "qwen2", //"llama3.1", |
|||
messages: [] |
|||
} |
|||
}; |
|||
}, |
|||
mounted() {}, |
|||
methods: { |
|||
scrollToBottom() { |
|||
let elscroll = this.$refs["scrollDiv"]; |
|||
elscroll.scrollTop = elscroll.scrollHeight + 30; |
|||
}, |
|||
clearForm(formName) { |
|||
this.form.desc = ""; |
|||
}, |
|||
async startStreaming(e) { |
|||
if (e.ctrkey && e.keyCode == 13) { |
|||
this.form.desc += "\n"; |
|||
} |
|||
document.getElementById("txt_suiwen").disabled = "true"; |
|||
// 如果已经有一个正在进行的流式请求,则中止它 |
|||
if (this.controller) { |
|||
this.controller.abort(); |
|||
} |
|||
setTimeout(() => { |
|||
this.scrollToBottom(); |
|||
}, 50); |
|||
var mymsg = this.form.desc.trim(); |
|||
if (mymsg.length > 0) { |
|||
this.form.desc = ""; |
|||
this.message.push({ |
|||
user: this.username, |
|||
msg: mymsg |
|||
}); |
|||
this.message.push({ |
|||
user: "GPT", |
|||
msg: "", |
|||
dot: "" |
|||
}); |
|||
// 创建一个新的 AbortController 实例 |
|||
this.controller = new AbortController(); |
|||
const signal = this.controller.signal; |
|||
this.arequestData.messages.push({ role: "user", content: mymsg }); |
|||
try { |
|||
const response = await fetch("http://127.0.0.1:11434/api/chat", { |
|||
method: "POST", |
|||
headers: { |
|||
"Content-Type": "application/json" |
|||
}, |
|||
body: JSON.stringify(this.arequestData), |
|||
signal |
|||
}); |
|||
if (!response.body) { |
|||
this.message[this.message.length - 1].msg = |
|||
"ReadableStream not yet supported in this browser."; |
|||
throw new Error( |
|||
"ReadableStream not yet supported in this browser." |
|||
); |
|||
} |
|||
const reader = response.body.getReader(); |
|||
const decoder = new TextDecoder(); |
|||
let result = ""; |
|||
this.message[this.message.length - 1].dot = "⚪"; |
|||
while (true) { |
|||
const { done, value } = await reader.read(); |
|||
if (done) { |
|||
break; |
|||
} |
|||
result += decoder.decode(value, { stream: true }); |
|||
// 处理流中的每一块数据,这里假设每块数据都是完整的 JSON 对象 |
|||
const jsonChunks = result.split("\n").filter(line => line.trim()); |
|||
//console.log(result) |
|||
for (const chunk of jsonChunks) { |
|||
try { |
|||
const data = JSON.parse(chunk); |
|||
//console.log(data.message.content) |
|||
this.message[this.message.length - 1].msg += |
|||
data.message.content; |
|||
setTimeout(() => { |
|||
this.scrollToBottom(); |
|||
}, 50); |
|||
} catch (e) { |
|||
//this.message[this.message.length-1].msg=e; |
|||
// 处理 JSON 解析错误 |
|||
//console.error('Failed to parse JSON:', e); |
|||
} |
|||
} |
|||
// 清空 result 以便处理下一块数据 |
|||
result = ""; |
|||
} |
|||
} catch (error) { |
|||
if (error.name === "AbortError") { |
|||
console.log("Stream aborted"); |
|||
this.message[this.message.length - 1].msg = "Stream aborted"; |
|||
} else { |
|||
console.error("Streaming error:", error); |
|||
this.message[this.message.length - 1].msg = "Stream error" + error; |
|||
} |
|||
} |
|||
this.message[this.message.length - 1].dot = ""; |
|||
this.arequestData.messages.push({ |
|||
role: "assistant", //this.message[this.message.length-1].user,//"GPT", |
|||
content: this.message[this.message.length - 1].msg |
|||
}); |
|||
setTimeout(() => { |
|||
this.scrollToBottom(); |
|||
}, 50); |
|||
} else { |
|||
this.form.desc = ""; |
|||
} |
|||
document.getElementById("txt_suiwen").disabled = ""; |
|||
document.getElementById("txt_suiwen").focus(); |
|||
} |
|||
}, |
|||
beforeDestroy() { |
|||
// 组件销毁时中止流式请求 |
|||
if (this.controller) { |
|||
this.controller.abort(); |
|||
} |
|||
} |
|||
}; |
|||
</script> |
|||
<style scoped> |
|||
.radius { |
|||
margin: 0 auto; |
|||
} |
|||
.demo-radius .title { |
|||
color: var(--el-text-color-regular); |
|||
font-size: 18px; |
|||
margin: 10px 0; |
|||
} |
|||
.demo-radius .value { |
|||
color: var(--el-text-color-primary); |
|||
font-size: 16px; |
|||
margin: 10px 0; |
|||
} |
|||
.demo-radius .radius { |
|||
min-height: 580px; |
|||
height: 85vh; |
|||
width: 70%; |
|||
border: 1px solid var(--el-border-color); |
|||
border-radius: 14px; |
|||
margin-top: 10px; |
|||
} |
|||
.messge { |
|||
width: 96%; |
|||
height: 84%; |
|||
/* border:1px solid red; */ |
|||
margin: 6px auto; |
|||
overflow: hidden; |
|||
overflow-y: auto; |
|||
} |
|||
.inputmsg { |
|||
width: 96%; |
|||
height: 12%; |
|||
/* border:1px solid blue; */ |
|||
border-top: 2px solid #ccc; |
|||
margin: 4px auto; |
|||
padding-top: 10px; |
|||
} |
|||
.mymsginfo { |
|||
width: 100%; |
|||
height: auto; |
|||
min-height: 50px; |
|||
} |
|||
::-webkit-scrollbar { |
|||
width: 6px; |
|||
height: 5px; |
|||
} |
|||
::-webkit-scrollbar-track { |
|||
background-color: rgba(0, 0, 0, 0.2); |
|||
border-radius: 10px; |
|||
} |
|||
::-webkit-scrollbar-thumb { |
|||
background-color: rgba(0, 0, 0, 0.5); |
|||
border-radius: 10px; |
|||
} |
|||
::-webkit-scrollbar-button { |
|||
background-color: #7c2929; |
|||
height: 0; |
|||
width: 0px; |
|||
} |
|||
::-webkit-scrollbar-corner { |
|||
background-color: black; |
|||
} |
|||
</style> |
|||
<style> |
|||
.el-textarea__inner { |
|||
padding-left: 45px; |
|||
padding-top: 0.75rem; |
|||
padding-bottom: 0.75rem; |
|||
} |
|||
</style> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue