<template>
|
<div
|
id="dataease-v2-embedded-assistant-sqlbot"
|
class="dataease-v2-embedded-assistant-sqlbot"
|
></div>
|
</template>
|
|
<script lang="ts" setup>
|
import { createApp, onMounted, onUnmounted, reactive, ref } from 'vue'
|
import request from '@/config/axios'
|
import { useUserStoreWithOut } from '@/store/modules/user'
|
import SQDatasetSelect from '@/views/sqlbot/SQDatasetSelect.vue'
|
import AssistantHead from '@/views/sqlbot/AssistantHead.vue'
|
const userStore = useUserStoreWithOut()
|
const loading = ref(true)
|
const state = reactive({
|
domain: '',
|
id: '',
|
enabled: false,
|
valid: false,
|
historyShow: false,
|
sqlbotScript: null
|
})
|
const sqlbotExist = ref(false)
|
const timer = ref()
|
|
const loadSqlbotInfo = () => {
|
const url = '/sysParameter/sqlbot'
|
request.get({ url }).then(res => {
|
if (res && res.data) {
|
const { domain, id, enabled, valid } = res.data
|
if (!enabled) {
|
console.error('sqlbot embedded disabled')
|
}
|
if (!valid) {
|
console.error('sqlbot embedded invalid')
|
}
|
state.domain = domain
|
state.id = id
|
state.enabled = enabled
|
state.valid = valid
|
loadSqlbotPage()
|
}
|
})
|
}
|
|
const loadSqlbotPage = () => {
|
const scriptId = `sqlbot-assistant-float-script-${state.id}`
|
const exitsScript = document.getElementById(scriptId)
|
if (exitsScript && window['sqlbot_assistant_handler']) {
|
mountedEmbeddedPage()
|
return
|
}
|
const script = document.createElement('script')
|
script.defer = true
|
script.async = true
|
script.id = scriptId
|
let sqlbotDomain = state.domain
|
if (sqlbotDomain.endsWith('/')) {
|
sqlbotDomain = sqlbotDomain.slice(0, -1)
|
}
|
script.src = `${sqlbotDomain}/assistant.js?id=${state.id}&online=true&userFlag=${
|
userStore.getUid
|
}&t=${new Date().getTime()}`
|
script.onload = () => {
|
mountedEmbeddedPage()
|
}
|
document.head.appendChild(script)
|
state.sqlbotScript = script
|
}
|
const mountedEmbeddedPage = () => {
|
if (sqlbotExist.value) {
|
return
|
}
|
const tempTimer = setTimeout(() => {
|
if (window['sqlbot_assistant_handler']) {
|
const container = document.getElementById('sqlbot-assistant-chat-container')
|
if (container) {
|
// 数据集选择
|
const mountPoint = document.createElement('div')
|
mountPoint.id = 'chat-component-mount-point'
|
container.appendChild(mountPoint)
|
const chatApp = createApp(SQDatasetSelect, {
|
// 在这里传递 props
|
assistantId: state.id
|
})
|
chatApp.mount(mountPoint)
|
|
// 头部样式
|
const mountPointHead = document.createElement('div')
|
mountPointHead.id = 'chat-component-mount-point-head'
|
container.appendChild(mountPointHead)
|
const chatHeadApp = createApp(AssistantHead)
|
chatHeadApp.mount(mountPointHead)
|
}
|
loading.value = false
|
sqlbotExist.value = true
|
if (tempTimer) {
|
clearTimeout(tempTimer)
|
}
|
}
|
}, 2000)
|
}
|
|
onMounted(() => {
|
loadSqlbotInfo()
|
timer.value = setInterval(() => {
|
loadSqlbotInfo()
|
}, 30000)
|
})
|
|
onUnmounted(() => {
|
if (timer.value) {
|
clearInterval(timer.value)
|
timer.value = null
|
}
|
|
// 移除 script 标签
|
if (state.sqlbotScript && state.sqlbotScript.parentNode) {
|
state.sqlbotScript.parentNode.removeChild(state.sqlbotScript)
|
}
|
|
// 可选:清理全局变量
|
if (window['sqlbot_assistant_handler']) {
|
delete window['sqlbot_assistant_handler']
|
}
|
})
|
</script>
|
|
<style lang="less">
|
#sqlbot-assistant-chat-container {
|
z-index: 200;
|
}
|
</style>
|
|
<style lang="less" scoped>
|
.dataease-v2-embedded-assistant-sqlbot {
|
width: 20px;
|
height: 20px;
|
overflow: hidden;
|
position: absolute;
|
display: flex;
|
}
|
</style>
|