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 />
</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></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>
<TopAbout></TopAbout>
</div>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -6,7 +6,7 @@
<div class="set-rules__right">
<el-scrollbar>
<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-radio value="1" size="large">
<p class="mb-4">{{ $t('views.document.setRules.intelligent.label') }}</p>
@ -218,7 +218,7 @@ function splitDocument() {
}
const initSplitPatternList = () => {
documentApi.listSplitPattern(id,patternLoading).then((ok) => {
documentApi.listSplitPattern(id, patternLoading).then((ok) => {
splitPatternList.value = ok.data
})
}
@ -247,32 +247,6 @@ defineExpose({
max-height: calc(var(--create-knowledge-height) - 110px);
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 {
.title {
font-size: 14px;

View File

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

View File

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

View File

@ -6,7 +6,7 @@
<div class="set-rules__right">
<el-scrollbar>
<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-radio value="1" size="large">
<p class="mb-4">{{ $t('views.document.setRules.intelligent.label') }}</p>
@ -247,32 +247,6 @@ defineExpose({
max-height: calc(var(--create-knowledge-height) - 110px);
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 {
.title {
font-size: 14px;

View File

@ -6,7 +6,7 @@
<div class="set-rules__right">
<el-scrollbar>
<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-radio value="1" size="large">
<p class="mb-4">{{ $t('views.document.setRules.intelligent.label') }}</p>
@ -248,32 +248,6 @@ defineExpose({
max-height: calc(var(--create-dataset-height) - 110px);
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 {
.title {
font-size: 14px;