feat: application

This commit is contained in:
wangdan-fit2cloud 2025-06-19 14:38:27 +08:00
parent af61494779
commit 03ec0f3fdf
13 changed files with 190 additions and 171 deletions

View File

@ -5,15 +5,12 @@
<LogoFull /> <LogoFull />
</div> </div>
<el-divider
direction="vertical"
class="ml-24 mr-24"
v-if="hasPermission(EditionConst.IS_EE, 'OR')"
/>
<!-- 企业版: 工作空间下拉框-->
<WorkspaceDropdown v-if="hasPermission(EditionConst.IS_EE, 'OR')" />
<div class="flex-between w-full"> <div class="flex-between w-full">
<div></div> <div class="ml-24 flex align-center">
<!-- 企业版: 工作空间下拉框-->
<el-divider class="mr-16" direction="vertical" v-if="hasPermission(EditionConst.IS_EE, 'OR')" />
<WorkspaceDropdown v-if="hasPermission(EditionConst.IS_EE, 'OR')" />
</div>
<TopMenu></TopMenu> <TopMenu></TopMenu>
<TopAbout></TopAbout> <TopAbout></TopAbout>
</div> </div>

View File

@ -38,7 +38,7 @@ export default {
showSourceLabel: 'Show Knowledge Source', showSourceLabel: 'Show Knowledge Source',
clientQueryLimitLabel: 'Query Limit per Client', clientQueryLimitLabel: 'Query Limit per Client',
authentication: 'Authentication', authentication: 'Authentication',
authenticationValue: 'Access Password', authenticationValue: 'Password Access',
timesDays: 'queries per day', timesDays: 'queries per day',
whitelistLabel: 'Allowed Domains', whitelistLabel: 'Allowed Domains',
whitelistPlaceholder: whitelistPlaceholder:

View File

@ -48,7 +48,7 @@ export default {
clientQueryLimitLabel: '每个客户端提问限制', clientQueryLimitLabel: '每个客户端提问限制',
timesDays: '次/天', timesDays: '次/天',
authentication: '身份验证', authentication: '身份验证',
authenticationValue: '验证密码', authenticationValue: '密码验证',
whitelistLabel: '白名单', whitelistLabel: '白名单',
whitelistPlaceholder: whitelistPlaceholder:
'请输入允许嵌入第三方的源地址,一行一个,如:\nhttp://127.0.0.1:5678\nhttps://dataease.io' '请输入允许嵌入第三方的源地址,一行一个,如:\nhttp://127.0.0.1:5678\nhttps://dataease.io'

View File

@ -38,7 +38,7 @@ export default {
clientQueryLimitLabel: '每個用戶端提問限制', clientQueryLimitLabel: '每個用戶端提問限制',
timesDays: '次/天', timesDays: '次/天',
authentication: '身份驗證', authentication: '身份驗證',
authenticationValue: '驗證密碼', authenticationValue: '密碼驗證',
whitelistLabel: '白名單', whitelistLabel: '白名單',
whitelistPlaceholder: whitelistPlaceholder:
'請輸入允許嵌入第三方的來源位址,一行一個,如:\nhttp://127.0.0.1:5678\nhttps://dataease.io' '請輸入允許嵌入第三方的來源位址,一行一個,如:\nhttp://127.0.0.1:5678\nhttps://dataease.io'

View File

@ -135,13 +135,13 @@
color: var(--app-text-color); color: var(--app-text-color);
} }
:deep(.el-radio__label) { .el-radio__label {
padding-left: 30px; padding-left: 24px;
width: 100%; width: 100%;
} }
:deep(.el-radio__input) { .el-radio__input {
position: absolute; position: absolute;
top: 16px; top: 5px;
} }
.active { .active {
border: 1px solid var(--el-color-primary); border: 1px solid var(--el-color-primary);

View File

@ -230,6 +230,7 @@
.el-form-item__label { .el-form-item__label {
font-weight: 400; font-weight: 400;
width: 100%; width: 100%;
color: var(--el-text-color-primary);
} }
.el-form-item__error { .el-form-item__error {

View File

@ -376,10 +376,6 @@
$t('views.applicationOverview.appInfo.SettingDisplayDialog.showExecutionDetail') $t('views.applicationOverview.appInfo.SettingDisplayDialog.showExecutionDetail')
" "
/> />
<el-checkbox
v-model="xpackForm.show_history"
:label="$t('views.applicationOverview.appInfo.SettingDisplayDialog.showHistory')"
/>
<el-checkbox <el-checkbox
v-model="xpackForm.show_guide" v-model="xpackForm.show_guide"
:label="$t('views.applicationOverview.appInfo.SettingDisplayDialog.displayGuide')" :label="$t('views.applicationOverview.appInfo.SettingDisplayDialog.displayGuide')"

View File

@ -1,12 +1,14 @@
<template> <template>
<el-dialog <el-drawer v-model="dialogVisible" size="60%">
:title="$t('views.applicationOverview.appInfo.accessControl')" <template #header>
v-model="dialogVisible" <h4>{{ $t('views.applicationOverview.appInfo.accessControl') }}</h4>
:close-on-click-modal="false" </template>
:close-on-press-escape="false" <el-form
width="650" label-position="top"
> ref="limitFormRef"
<el-form label-position="top" ref="limitFormRef" :model="form"> :model="form"
require-asterisk-position="right"
>
<el-form-item <el-form-item
:label="$t('views.applicationOverview.appInfo.LimitDialog.clientQueryLimitLabel')" :label="$t('views.applicationOverview.appInfo.LimitDialog.clientQueryLimitLabel')"
> >
@ -28,42 +30,81 @@
<el-form-item :label="$t('views.applicationOverview.appInfo.LimitDialog.authentication')"> <el-form-item :label="$t('views.applicationOverview.appInfo.LimitDialog.authentication')">
<el-switch size="small" v-model="form.authentication" @change="firstGeneration"></el-switch> <el-switch size="small" v-model="form.authentication" @change="firstGeneration"></el-switch>
</el-form-item> </el-form-item>
<el-form-item <el-radio-group v-if="form.authentication" v-model="form.method" class="card__radio">
prop="authentication_value" <el-card shadow="never" class="mb-16" :class="form.method === 'replace' ? 'active' : ''">
v-if="form.authentication" <el-radio value="replace" size="large">
:label="$t('views.applicationOverview.appInfo.LimitDialog.authenticationValue')" <p class="mb-4 lighter">
> {{ $t('views.applicationOverview.appInfo.LimitDialog.authenticationValue') }}
<el-input </p>
class="authentication-append-input" </el-radio>
v-model="form.authentication_value" <el-form-item class="ml-24">
readonly <el-input
style="width: 268px" class="authentication-append-input"
disabled v-model="form.authentication_value"
> readonly
<template #append> style="width: 268px"
<el-tooltip :content="$t('common.copy')" placement="top"> >
<el-button <template #append>
type="primary" <el-tooltip :content="$t('common.copy')" placement="top">
text <el-button
@click="copyClick(form.authentication_value)" type="primary"
style="margin: 0 4px !important" text
> @click="copyClick(form.authentication_value)"
<AppIcon iconName="app-copy"></AppIcon> style="margin: 0 0 0 4px !important"
>
<AppIcon iconName="app-copy"></AppIcon>
</el-button>
</el-tooltip>
<el-tooltip :content="$t('common.refresh')" placement="top">
<el-button
@click="refreshAuthentication"
type="primary"
text
style="margin: 0 4px 0 0 !important"
>
<el-icon><RefreshRight /></el-icon>
</el-button>
</el-tooltip>
</template>
</el-input>
</el-form-item>
</el-card>
<el-card shadow="never" class="mb-16" :class="form.method === 'complete' ? 'active' : ''">
<el-radio value="complete" size="large">
<p class="mb-16 lighter">
{{ $t('views.system.authentication.title') }}
<el-button type="primary" link @click="router.push({ path: '' })">
{{ '去配置对话用户' }}
</el-button> </el-button>
</el-tooltip> </p>
<el-tooltip :content="$t('common.refresh')" placement="top"> </el-radio>
<el-button <el-form-item
@click="refreshAuthentication" label="登录方式"
type="primary" :rules="[
text {
style="margin: 0 4px 0 0 !important" required: true,
> message: $t('请选择登录方式'),
<el-icon><RefreshRight /></el-icon> trigger: 'change',
</el-button> },
</el-tooltip> ]"
</template> prop="checkList"
</el-input> class="ml-24 border-t"
</el-form-item> style="padding-top: 16px"
>
<el-checkbox-group v-model="form.checkList">
<el-checkbox label="账号登录" value="账号登录" />
<el-checkbox label="LDAP" value="LDAP" />
<el-checkbox label="OIDC" value="OIDC" />
<el-checkbox label="CAS" value="CAS" />
<el-checkbox label="企业微信" value="企业微信" />
<el-checkbox label="钉钉" value="钉钉" />
<el-checkbox label="飞书" value="飞书" />
</el-checkbox-group>
</el-form-item>
</el-card>
</el-radio-group>
<el-form-item <el-form-item
:label="$t('views.applicationOverview.appInfo.LimitDialog.whitelistLabel')" :label="$t('views.applicationOverview.appInfo.LimitDialog.whitelistLabel')"
@click.prevent @click.prevent
@ -80,24 +121,25 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <div>
<el-button @click.prevent="dialogVisible = false">{{ $t('common.cancel') }} </el-button> <el-button @click.prevent="dialogVisible = false">{{ $t('common.cancel') }} </el-button>
<el-button type="primary" @click="submit(limitFormRef)" :loading="loading"> <el-button type="primary" @click="submit(limitFormRef)" :loading="loading">
{{ $t('common.save') }} {{ $t('common.create') }}
</el-button> </el-button>
</span> </div>
</template> </template>
</el-dialog> </el-drawer>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, watch } from 'vue' import { ref, watch } from 'vue'
import { useRoute } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import type { FormInstance, FormRules } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus'
import applicationApi from '@/api/application/application' import applicationApi from '@/api/application/application'
import { MsgSuccess } from '@/utils/message' import { MsgSuccess } from '@/utils/message'
import { t } from '@/locales' import { t } from '@/locales'
import { copyClick } from '@/utils/clipboard' import { copyClick } from '@/utils/clipboard'
const router = useRouter()
const route = useRoute() const route = useRoute()
const { const {
params: { id }, params: { id },
@ -178,7 +220,7 @@ defineExpose({ open })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.authentication-append-input { .authentication-append-input {
.el-input-group__append { :deep(.el-input-group__append) {
padding: 0 !important; padding: 0 !important;
} }
} }

View File

@ -6,7 +6,7 @@
<div class="set-rules__right"> <div class="set-rules__right">
<el-scrollbar> <el-scrollbar>
<div class="left-height" @click.stop> <div class="left-height" @click.stop>
<el-radio-group v-model="radio" class="set-rules__radio"> <el-radio-group v-model="radio" class="card__radio">
<el-card shadow="never" class="mb-16" :class="radio === '1' ? 'active' : ''"> <el-card shadow="never" class="mb-16" :class="radio === '1' ? 'active' : ''">
<el-radio value="1" size="large"> <el-radio value="1" size="large">
<p class="mb-4">{{ $t('views.document.setRules.intelligent.label') }}</p> <p class="mb-4">{{ $t('views.document.setRules.intelligent.label') }}</p>
@ -218,7 +218,7 @@ function splitDocument() {
} }
const initSplitPatternList = () => { const initSplitPatternList = () => {
documentApi.listSplitPattern(id,patternLoading).then((ok) => { documentApi.listSplitPattern(id, patternLoading).then((ok) => {
splitPatternList.value = ok.data splitPatternList.value = ok.data
}) })
} }
@ -247,32 +247,6 @@ defineExpose({
max-height: calc(var(--create-knowledge-height) - 110px); max-height: calc(var(--create-knowledge-height) - 110px);
overflow-x: hidden; overflow-x: hidden;
} }
&__radio {
width: 100%;
display: block;
.el-radio {
white-space: break-spaces;
width: 100%;
height: 100%;
line-height: 22px;
color: var(--app-text-color);
}
:deep(.el-radio__label) {
padding-left: 30px;
width: 100%;
}
:deep(.el-radio__input) {
position: absolute;
top: 16px;
}
.active {
border: 1px solid var(--el-color-primary);
}
}
&__form { &__form {
.title { .title {
font-size: 14px; font-size: 14px;

View File

@ -37,6 +37,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, watch } from 'vue' import { ref, watch } from 'vue'
import knowledgeApi from '@/api/knowledge/knowledge' import knowledgeApi from '@/api/knowledge/knowledge'
import { MsgSuccess } from '@/utils/message'
const emit = defineEmits(['refresh']) const emit = defineEmits(['refresh'])
const loading = ref<boolean>(false) const loading = ref<boolean>(false)
@ -59,6 +60,7 @@ const open = (id: string) => {
const submit = () => { const submit = () => {
knowledgeApi.putSyncWebKnowledge(knowledgeId.value, method.value, loading).then((res: any) => { knowledgeApi.putSyncWebKnowledge(knowledgeId.value, method.value, loading).then((res: any) => {
emit('refresh', res.data) emit('refresh', res.data)
MsgSuccess(t('views.knowledge.tip.syncSuccess'))
dialogVisible.value = false dialogVisible.value = false
}) })
} }

View File

@ -224,10 +224,7 @@
<template #mouseEnter> <template #mouseEnter>
<div @click.stop> <div @click.stop>
<el-dropdown trigger="click"> <el-dropdown trigger="click">
<el-button <el-button text @click.stop>
text
@click.stop
>
<el-icon> <el-icon>
<MoreFilled /> <MoreFilled />
</el-icon> </el-icon>
@ -237,13 +234,29 @@
<el-dropdown-item <el-dropdown-item
icon="Refresh" icon="Refresh"
@click.stop="syncKnowledge(item)" @click.stop="syncKnowledge(item)"
v-if="item.type === 1 || v-if="
hasPermission([RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_SYNC.getWorkspacePermission],'OR') item.type === 1 ||
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_SYNC.getWorkspacePermission,
],
'OR',
)
" "
>{{ $t('views.knowledge.setting.sync') }} >{{ $t('views.knowledge.setting.sync') }}
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item @click.stop="reEmbeddingKnowledge(item)" <el-dropdown-item
v-if="hasPermission([RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_VECTOR.getWorkspacePermission],'OR')" @click.stop="reEmbeddingKnowledge(item)"
v-if="
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_VECTOR.getWorkspacePermission,
],
'OR',
)
"
> >
<AppIcon iconName="app-vectorization"></AppIcon> <AppIcon iconName="app-vectorization"></AppIcon>
{{ $t('views.knowledge.setting.vectorization') }} {{ $t('views.knowledge.setting.vectorization') }}
@ -252,7 +265,15 @@
<el-dropdown-item <el-dropdown-item
icon="Connection" icon="Connection"
@click.stop="openGenerateDialog(item)" @click.stop="openGenerateDialog(item)"
v-if="hasPermission([RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_PROBLEM_CREATE.getWorkspacePermission],'OR')" v-if="
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_PROBLEM_CREATE.getWorkspacePermission,
],
'OR',
)
"
>{{ $t('views.document.generateQuestion.title') }} >{{ $t('views.document.generateQuestion.title') }}
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item <el-dropdown-item
@ -260,29 +281,65 @@
@click.stop=" @click.stop="
router.push({ router.push({
path: `/knowledge/${item.id}/${currentFolder.value}/setting`, path: `/knowledge/${item.id}/${currentFolder.value}/setting`,
})" })
v-if="hasPermission([RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_EDIT.getWorkspacePermission],'OR')" "
v-if="
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_EDIT.getWorkspacePermission,
],
'OR',
)
"
> >
{{ $t('common.setting') }} {{ $t('common.setting') }}
</el-dropdown-item </el-dropdown-item>
> <el-dropdown-item
<el-dropdown-item @click.stop="exportKnowledge(item)" @click.stop="exportKnowledge(item)"
v-if="hasPermission([RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_EXPORT.getWorkspacePermission],'OR')" v-if="
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_EXPORT.getWorkspacePermission,
],
'OR',
)
"
> >
<AppIcon iconName="app-export"></AppIcon <AppIcon iconName="app-export"></AppIcon
>{{ $t('views.document.setting.export') }} Excel >{{ $t('views.document.setting.export') }} Excel
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item @click.stop="exportZipKnowledge(item)" <el-dropdown-item
v-if="hasPermission([RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_EXPORT.getWorkspacePermission],'OR')" @click.stop="exportZipKnowledge(item)"
v-if="
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_EXPORT.getWorkspacePermission,
],
'OR',
)
"
> >
<AppIcon iconName="app-export"></AppIcon <AppIcon iconName="app-export"></AppIcon
>{{ $t('views.document.setting.export') }} ZIP</el-dropdown-item >{{ $t('views.document.setting.export') }} ZIP</el-dropdown-item
> >
<el-dropdown-item icon="Delete" @click.stop="deleteKnowledge(item)" <el-dropdown-item
v-if="hasPermission([RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,PermissionConst.KNOWLEDGE_EXPORT.getWorkspacePermission],'OR')" icon="Delete"
@click.stop="deleteKnowledge(item)"
v-if="
hasPermission(
[
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_EXPORT.getWorkspacePermission,
],
'OR',
)
"
>
{{ $t('common.delete') }}</el-dropdown-item
> >
{{$t('common.delete')
}}</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
</el-dropdown> </el-dropdown>
@ -300,6 +357,7 @@
<component :is="currentCreateDialog" ref="CreateKnowledgeDialogRef" /> <component :is="currentCreateDialog" ref="CreateKnowledgeDialogRef" />
<CreateFolderDialog ref="CreateFolderDialogRef" @refresh="refreshFolder" /> <CreateFolderDialog ref="CreateFolderDialogRef" @refresh="refreshFolder" />
<GenerateRelatedDialog ref="GenerateRelatedDialogRef" /> <GenerateRelatedDialog ref="GenerateRelatedDialogRef" />
<SyncWebDialog ref="SyncWebDialogRef" />
</LayoutContainer> </LayoutContainer>
</template> </template>
@ -308,6 +366,7 @@ import { onMounted, ref, reactive, shallowRef, nextTick } from 'vue'
import CreateKnowledgeDialog from './create-component/CreateKnowledgeDialog.vue' import CreateKnowledgeDialog from './create-component/CreateKnowledgeDialog.vue'
import CreateWebKnowledgeDialog from './create-component/CreateWebKnowledgeDialog.vue' import CreateWebKnowledgeDialog from './create-component/CreateWebKnowledgeDialog.vue'
import CreateLarkKnowledgeDialog from './create-component/CreateLarkKnowledgeDialog.vue' import CreateLarkKnowledgeDialog from './create-component/CreateLarkKnowledgeDialog.vue'
import SyncWebDialog from './component/SyncWebDialog.vue'
import CreateFolderDialog from '@/components/folder-tree/CreateFolderDialog.vue' import CreateFolderDialog from '@/components/folder-tree/CreateFolderDialog.vue'
import GenerateRelatedDialog from '@/components/generate-related-dialog/index.vue' import GenerateRelatedDialog from '@/components/generate-related-dialog/index.vue'
import KnowledgeApi from '@/api/knowledge/knowledge' import KnowledgeApi from '@/api/knowledge/knowledge'

View File

@ -6,7 +6,7 @@
<div class="set-rules__right"> <div class="set-rules__right">
<el-scrollbar> <el-scrollbar>
<div class="left-height" @click.stop> <div class="left-height" @click.stop>
<el-radio-group v-model="radio" class="set-rules__radio"> <el-radio-group v-model="radio" class="card__radio">
<el-card shadow="never" class="mb-16" :class="radio === '1' ? 'active' : ''"> <el-card shadow="never" class="mb-16" :class="radio === '1' ? 'active' : ''">
<el-radio value="1" size="large"> <el-radio value="1" size="large">
<p class="mb-4">{{ $t('views.document.setRules.intelligent.label') }}</p> <p class="mb-4">{{ $t('views.document.setRules.intelligent.label') }}</p>
@ -247,32 +247,6 @@ defineExpose({
max-height: calc(var(--create-knowledge-height) - 110px); max-height: calc(var(--create-knowledge-height) - 110px);
overflow-x: hidden; overflow-x: hidden;
} }
&__radio {
width: 100%;
display: block;
.el-radio {
white-space: break-spaces;
width: 100%;
height: 100%;
line-height: 22px;
color: var(--app-text-color);
}
:deep(.el-radio__label) {
padding-left: 30px;
width: 100%;
}
:deep(.el-radio__input) {
position: absolute;
top: 16px;
}
.active {
border: 1px solid var(--el-color-primary);
}
}
&__form { &__form {
.title { .title {
font-size: 14px; font-size: 14px;

View File

@ -6,7 +6,7 @@
<div class="set-rules__right"> <div class="set-rules__right">
<el-scrollbar> <el-scrollbar>
<div class="left-height" @click.stop> <div class="left-height" @click.stop>
<el-radio-group v-model="radio" class="set-rules__radio"> <el-radio-group v-model="radio" class="card__radio">
<el-card shadow="never" class="mb-16" :class="radio === '1' ? 'active' : ''"> <el-card shadow="never" class="mb-16" :class="radio === '1' ? 'active' : ''">
<el-radio value="1" size="large"> <el-radio value="1" size="large">
<p class="mb-4">{{ $t('views.document.setRules.intelligent.label') }}</p> <p class="mb-4">{{ $t('views.document.setRules.intelligent.label') }}</p>
@ -248,32 +248,6 @@ defineExpose({
max-height: calc(var(--create-dataset-height) - 110px); max-height: calc(var(--create-dataset-height) - 110px);
overflow-x: hidden; overflow-x: hidden;
} }
&__radio {
width: 100%;
display: block;
.el-radio {
white-space: break-spaces;
width: 100%;
height: 100%;
line-height: 22px;
color: var(--app-text-color);
}
:deep(.el-radio__label) {
padding-left: 30px;
width: 100%;
}
:deep(.el-radio__input) {
position: absolute;
top: 16px;
}
.active {
border: 1px solid var(--el-color-primary);
}
}
&__form { &__form {
.title { .title {
font-size: 14px; font-size: 14px;