Skip to content

Commit 14e13d1

Browse files
feat: Datasource Page Embed
1 parent 6c7fd8c commit 14e13d1

File tree

7 files changed

+127
-5
lines changed

7 files changed

+127
-5
lines changed

frontend/src/i18n/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -819,7 +819,8 @@
819819
"platform_disable": "{0} settings are not enabled!",
820820
"input_account": "Please enter account",
821821
"redirect_2_auth": "Redirecting to {0} authentication, {1} seconds...",
822-
"redirect_immediately": "Redirecting immediately"
822+
"redirect_immediately": "Redirecting immediately",
823+
"permission_invalid": "Authentication invalid [Current account has insufficient permissions]"
823824
},
824825
"supplier": {
825826
"alibaba_cloud_bailian": "Alibaba Cloud Bailian",

frontend/src/i18n/ko-KR.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -819,7 +819,8 @@
819819
"platform_disable": "{0} 설정이 활성화되지 않았습니다!",
820820
"input_account": "계정을 입력해 주세요",
821821
"redirect_2_auth": "{0} 인증으로 리디렉션 중입니다, {1}초...",
822-
"redirect_immediately": "지금 이동"
822+
"redirect_immediately": "지금 이동",
823+
"permission_invalid": "인증 무효 [현재 계정의 권한이 부족합니다]"
823824
},
824825
"supplier": {
825826
"alibaba_cloud_bailian": "알리바바 클라우드 바이리엔",

frontend/src/i18n/zh-CN.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -819,7 +819,8 @@
819819
"platform_disable": "{0}设置未开启!",
820820
"input_account": "请输入账号",
821821
"redirect_2_auth": "正在跳转至 {0} 认证,{1} 秒...",
822-
"redirect_immediately": "立即跳转"
822+
"redirect_immediately": "立即跳转",
823+
"permission_invalid": "认证无效【当前账号权限不够】"
823824
},
824825
"supplier": {
825826
"alibaba_cloud_bailian": "阿里云百炼",

frontend/src/router/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import SystemEmbedded from '@/views/system/embedded/Page.vue'
1616
import assistantTest from '@/views/system/embedded/Test.vue'
1717
import assistant from '@/views/embedded/index.vue'
1818
import EmbeddedPage from '@/views/embedded/page.vue'
19+
import EmbeddedCommon from '@/views/embedded/common.vue'
1920
import Member from '@/views/system/member/index.vue'
2021
import Professional from '@/views/system/professional/index.vue'
2122
import Training from '@/views/system/training/index.vue'
@@ -251,6 +252,11 @@ export const routes = [
251252
name: 'embeddedPage',
252253
component: EmbeddedPage,
253254
},
255+
{
256+
path: '/embeddedCommon',
257+
name: 'embeddedCommon',
258+
component: EmbeddedCommon,
259+
},
254260
{
255261
path: '/assistantTest',
256262
name: 'assistantTest',

frontend/src/router/watch.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const appearanceStore = useAppearanceStoreWithOut()
1111
const userStore = useUserStore()
1212
const { wsCache } = useCache()
1313
const whiteList = ['/login', '/admin-login']
14-
const assistantWhiteList = ['/assistant', '/embeddedPage', '/401']
14+
const assistantWhiteList = ['/assistant', '/embeddedPage', '/embeddedCommon', '/401']
1515
export const watchRouter = (router: Router) => {
1616
router.beforeEach(async (to: any, from: any, next: any) => {
1717
await loadXpackStatic()
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
<template>
2+
<div v-loading="divLoading" class="sqlbot--embedded-page">
3+
<ds-component
4+
v-if="!loading && isWsAdmin && busiFlag === 'ds'"
5+
ref="dsRef"
6+
:page-embedded="true"
7+
/>
8+
<page-401
9+
v-if="!loading && !isWsAdmin && busiFlag === 'ds'"
10+
:title="t('login.permission_invalid')"
11+
/>
12+
</div>
13+
</template>
14+
<script setup lang="ts">
15+
import DsComponent from '@/views/ds/Datasource.vue'
16+
import Page401 from '@/views/error/index.vue'
17+
import { computed, nextTick, onBeforeMount, onBeforeUnmount, ref, watch } from 'vue'
18+
import { useRoute } from 'vue-router'
19+
import { useAssistantStore } from '@/stores/assistant'
20+
import { useUserStore } from '@/stores/user'
21+
import { useI18n } from 'vue-i18n'
22+
const { t } = useI18n()
23+
const userStore = useUserStore()
24+
const assistantStore = useAssistantStore()
25+
assistantStore.setPageEmbedded(true)
26+
const route = useRoute()
27+
28+
const loading = ref(true)
29+
const divLoading = ref(true)
30+
const eventName = 'sqlbot_embedded_event'
31+
const busiFlag = ref('ds')
32+
33+
const isWsAdmin = computed(() => {
34+
return userStore.isAdmin || userStore.isSpaceAdmin
35+
})
36+
const communicationCb = async (event: any) => {
37+
if (event.data?.eventName === eventName) {
38+
if (event.data?.messageId !== route.query.id) {
39+
return
40+
}
41+
if (!event.data?.busiFlag) {
42+
busiFlag.value = ''
43+
return
44+
}
45+
busiFlag.value = event.data.busiFlag
46+
if (event.data?.busi == 'certificate') {
47+
const type = parseInt(event.data['type'])
48+
const certificate = event.data['certificate']
49+
assistantStore.setType(type)
50+
assistantStore.setToken(certificate)
51+
assistantStore.setAssistant(true)
52+
await userStore.info()
53+
loading.value = false
54+
return
55+
}
56+
if (event.data?.hostOrigin) {
57+
assistantStore.setHostOrigin(event.data?.hostOrigin)
58+
}
59+
}
60+
}
61+
62+
watch(
63+
() => loading.value,
64+
(val) => {
65+
nextTick(() => {
66+
setTimeout(() => {
67+
divLoading.value = val
68+
}, 1000)
69+
})
70+
}
71+
)
72+
73+
const registerReady = (assistantId: any) => {
74+
window.addEventListener('message', communicationCb)
75+
const readyData = {
76+
eventName: 'sqlbot_embedded_event',
77+
busi: 'ready',
78+
ready: true,
79+
messageId: assistantId,
80+
}
81+
window.parent.postMessage(readyData, '*')
82+
}
83+
84+
onBeforeMount(async () => {
85+
const assistantId = route.query.id
86+
if (!assistantId) {
87+
ElMessage.error('Miss embedded id, please check embedded url')
88+
return
89+
}
90+
assistantStore.setType(4)
91+
const now = Date.now()
92+
assistantStore.setFlag(now)
93+
assistantStore.setId(assistantId?.toString() || '')
94+
assistantStore.setAssistant(true)
95+
registerReady(assistantId)
96+
return
97+
})
98+
99+
onBeforeUnmount(() => {
100+
window.removeEventListener('message', communicationCb)
101+
})
102+
</script>
103+
104+
<style lang="less" scoped>
105+
.sqlbot--embedded-page {
106+
width: 100%;
107+
height: 100vh;
108+
position: relative;
109+
background: #fff;
110+
}
111+
</style>

frontend/src/views/embedded/page.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ import { useAppearanceStoreWithOut } from '@/stores/appearance'
2424
import { useI18n } from 'vue-i18n'
2525
import { request } from '@/utils/request'
2626
import { setCurrentColor } from '@/utils/utils'
27-
27+
import { useUserStore } from '@/stores/user'
28+
const userStore = useUserStore()
2829
const { t } = useI18n()
2930
const chatRef = ref()
3031
const appearanceStore = useAppearanceStoreWithOut()
@@ -64,6 +65,7 @@ const communicationCb = async (event: any) => {
6465
if (type === 4) {
6566
assistantStore.setToken(certificate)
6667
assistantStore.setAssistant(true)
68+
await userStore.info()
6769
loading.value = false
6870
return
6971
}

0 commit comments

Comments
 (0)