Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions ui/src/api/chat-user/chat-user-auth.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import {Result} from '@/request/Result'
import {get, post, put} from '@/request/index'
import {type Ref} from 'vue'

const prefix = '/chat_user/auth'
/**
* 获取认证设置
*/
const getAuthSetting: (auth_type: string, loading?: Ref<boolean>) => Promise<Result<any>> = (auth_type, loading) => {
return get(`${prefix}/${auth_type}/detail`, undefined, loading)
}

/**
* ldap连接测试
*/
const postAuthSetting: (data: any, loading?: Ref<boolean>) => Promise<Result<any>> = (
data,
loading
) => {
return post(`${prefix}/connection`, data, undefined, loading)
}

/**
* 修改邮箱设置
*/
const putAuthSetting: (auth_type: string, data: any, loading?: Ref<boolean>) => Promise<Result<any>> = (
auth_type,
data,
loading
) => {
return put(`${prefix}/${auth_type}/info`, data, undefined, loading)
}

const platformPrefix = '/chat_user/auth/platform'
const getPlatformInfo: (loading?: Ref<boolean>) => Promise<Result<any>> = (loading) => {
return get(`${platformPrefix}/source`, undefined, loading)
}

const updateConfig: (data: any, loading?: Ref<boolean>) => Promise<Result<any>> = (
data,
loading
) => {
return post(`${platformPrefix}/source`, data, undefined, loading)
}

const validateConnection: (data: any, loading?: Ref<boolean>) => Promise<Result<any>> = (
data,
loading
) => {
return put(`${platformPrefix}/source`, data, undefined, loading)
}

export default {
getAuthSetting,
postAuthSetting,
putAuthSetting,
getPlatformInfo,
updateConfig,
validateConnection
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,13 @@
v-click-outside="handleClickOutside"
class="default-model-setting-menu workflow-dropdown-menu border border-r-6 white-bg"
>
<div class="title">{{ $t('workflow.setting.defaultModelSetting') }}</div>
<el-alert :title="$t('workflow.setting.defaultModelSettingTip')" type="info" :closable="false" />
<div class="title">
<h4 class="mb-4">{{ $t('workflow.setting.defaultModelSetting') }}</h4>
<p class="mb-8">
<el-text type="info">{{ $t('workflow.setting.defaultModelSettingTip') }}</el-text>
</p>
</div>

<el-scrollbar max-height="calc(100vh - 220px)">
<el-form label-position="top" class="p-12">
<el-form-item v-for="item in defaultModelTypes" :key="item.type" :label="item.label">
Expand Down Expand Up @@ -78,11 +83,22 @@ const defaulTypeLabels: Record<string, string> = {
ITV: t('workflow.setting.modelType.ITV'),
RERANKER: t('workflow.setting.modelType.RERANKER'),
}
const defaultModelTypes = ['LLM', 'TTS', 'STT', 'IMAGE', 'TTI', 'TTV', 'ITV', 'RERANKER'].map((type) => ({
type,
label: defaulTypeLabels[type] || type,
}))
const EMPTY_SETTING = { LLM: {}, TTS: {}, STT: {}, IMAGE: {}, TTI: {}, TTV: {}, ITV: {}, RERANKER: {} }
const defaultModelTypes = ['LLM', 'TTS', 'STT', 'IMAGE', 'TTI', 'TTV', 'ITV', 'RERANKER'].map(
(type) => ({
type,
label: defaulTypeLabels[type] || type,
}),
)
const EMPTY_SETTING = {
LLM: {},
TTS: {},
STT: {},
IMAGE: {},
TTI: {},
TTV: {},
ITV: {},
RERANKER: {},
}

const modelSetting = ref<any>({ ...EMPTY_SETTING })
const defaultModelOptions = ref<Record<string, any>>({})
Expand Down Expand Up @@ -149,7 +165,8 @@ const hasChanges = computed(
const base = (props.modelValue || {})[type] || {}
return (
(cur.model_id || '') !== (base.model_id || '') ||
JSON.stringify(cur.model_params_setting || {}) !== JSON.stringify(base.model_params_setting || {})
JSON.stringify(cur.model_params_setting || {}) !==
JSON.stringify(base.model_params_setting || {})
)
}),
)
Expand All @@ -172,11 +189,12 @@ function handleSave() {
}

function applyDefaultModelToAll() {
MsgConfirm(
t('workflow.setting.applyToAll'),
t('workflow.setting.applyToAllConfirmMsg'),
{ type: 'warning', customClass: 'apply-to-all-confirm', center: true, confirmButtonText: t('workflow.setting.apply') },
).then(() => {
MsgConfirm(t('workflow.setting.applyToAll'), t('workflow.setting.applyToAllConfirmMsg'), {
type: 'warning',
customClass: 'apply-to-all-confirm',
center: true,
confirmButtonText: t('workflow.setting.apply'),
}).then(() => {
const graph = props.workflowRef?.getGraphData()
let count = 0
// 栈式遍历,循环节点内嵌 graph(loop_body)也入栈覆盖,与发布校验 validate_workflow_default_models 保持一致
Expand Down
43 changes: 1 addition & 42 deletions ui/src/views/login/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -425,48 +425,7 @@ function changeMode(val: string, needMessage: boolean = true) {
loginFormRef.value?.clearValidate()
}

// onBeforeMount(() => {
// loading.value = true
// user.asyncGetProfile().then((res) => {
// // 企业版和专业版:第三方登录
// if (user.isPE() || user.isEE()) {
// login
// .getAuthType()
// .then((res) => {
// //如果结果包含LDAP,把LDAP放在第一个
// const ldapIndex = res.indexOf('LDAP')
// if (ldapIndex !== -1) {
// const [ldap] = res.splice(ldapIndex, 1)
// res.unshift(ldap)
// }
// modeList.value = [...modeList.value, ...res]
// })
// .finally(() => (loading.value = false))
// login
// .getQrType()
// .then((res) => {
// if (res.length > 0) {
// modeList.value = ['QR_CODE', ...modeList.value]
// QrList.value = res
// QrList.value.forEach((item) => {
// orgOptions.value.push({
// key: item,
// value:
// item === 'wecom'
// ? t('views.system.authentication.scanTheQRCode.wecom')
// : item === 'dingtalk'
// ? t('views.system.authentication.scanTheQRCode.dingtalk')
// : t('views.system.authentication.scanTheQRCode.lark'),
// })
// })
// }
// })
// .finally(() => (loading.value = false))
// } else {
// loading.value = false
// }
// })
// })

declare const window: any

onMounted(() => {
Expand Down
47 changes: 25 additions & 22 deletions ui/src/views/system/user-manage/component/UserDrawer.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
<template>
<el-drawer v-model="visible" size="600">
<el-drawer
v-model="visible"
size="600"
:close-on-click-modal="false"
:close-on-press-escape="false"
>
<template #header>
<h4>{{ title }}</h4>
</template>
Expand All @@ -11,8 +16,6 @@
label-position="top"
require-asterisk-position="right"
@submit.prevent
:close-on-click-modal="false"
:close-on-press-escape="false"
>
<el-form-item
:prop="isEdit ? '' : 'username'"
Expand Down Expand Up @@ -115,21 +118,21 @@
</el-dialog>
</template>
<script setup lang="ts">
import {computed, onBeforeMount, reactive, ref, watch} from 'vue'
import type {FormInstance} from 'element-plus'
import { computed, onBeforeMount, reactive, ref, watch } from 'vue'
import type { FormInstance } from 'element-plus'
import userManageApi from '@/api/system/user-manage'
import {MsgSuccess} from '@/utils/message'
import {t} from '@/locales'
import type {FormItemModel} from '@/api/type/role'
import { MsgSuccess } from '@/utils/message'
import { t } from '@/locales'
import type { FormItemModel } from '@/api/type/role'
import WorkspaceApi from '@/api/workspace/workspace'
import MemberFormContent from '@/views/system/role/component/MemberFormContent.vue'
import {AuthorizationEnum, RoleTypeEnum} from '@/enums/system'
import { AuthorizationEnum, RoleTypeEnum } from '@/enums/system'
import useStore from '@/stores'
import {hasPermission} from '@/utils/permission'
import {EditionConst} from '@/utils/permission/data.ts'
import JSEncrypt from "jsencrypt";
import { hasPermission } from '@/utils/permission'
import { EditionConst } from '@/utils/permission/data.ts'
import JSEncrypt from 'jsencrypt'

const {user} = useStore()
const { user } = useStore()
const props = defineProps({
title: String,
})
Expand Down Expand Up @@ -289,7 +292,7 @@ onBeforeMount(async () => {
}
formItemModel.value = [...roleFormItem.value, ...workspaceFormItem.value]
}
list.value = [{role_id: '', workspace_ids: []}]
list.value = [{ role_id: '', workspace_ids: [] }]
})

const rules = reactive({
Expand Down Expand Up @@ -361,7 +364,7 @@ watch(visible, (bool) => {
nick_name: '',
}
isEdit.value = false
list.value = [{role_id: '', workspace_ids: []}]
list.value = [{ role_id: '', workspace_ids: [] }]
userFormRef.value?.clearValidate()
}
})
Expand Down Expand Up @@ -405,12 +408,12 @@ const submit = async (formEl: FormInstance | undefined) => {

// 如果是管理员角色,则设置为 ['None']
if (isAdminRole) {
return {...item, workspace_ids: ['None']}
return { ...item, workspace_ids: ['None'] }
}

// 如果是普通用户且是 PE 类型,则设置为 ['default']
if (user.isPE()) {
return {...item, workspace_ids: ['default']}
return { ...item, workspace_ids: ['default'] }
}

// 其他情况保持原样
Expand All @@ -431,10 +434,10 @@ const submit = async (formEl: FormInstance | undefined) => {
})
} else {
params.defaultPermission = defaultPermission.value
const JSEncryptCtor = (JSEncrypt as any)?.default ? (JSEncrypt as any).default : JSEncrypt;
const js = new (JSEncryptCtor as any)();
js.setPublicKey(user.rsaKey);
params.password = js.encrypt(params.password);
const JSEncryptCtor = (JSEncrypt as any)?.default ? (JSEncrypt as any).default : JSEncrypt
const js = new (JSEncryptCtor as any)()
js.setPublicKey(user.rsaKey)
params.password = js.encrypt(params.password)
params.encrypted = true
userManageApi.postUserManage(params, loading).then((res) => {
return user.profile(loading).then(() => {
Expand All @@ -461,7 +464,7 @@ const submitDialog = () => {
closeDialog()
}

defineExpose({open})
defineExpose({ open })
</script>
<style lang="scss" scoped>
.dialog-header {
Expand Down
Loading