diff --git a/frontend/src/api/user.ts b/frontend/src/api/user.ts index 723010d3..ded09a9f 100644 --- a/frontend/src/api/user.ts +++ b/frontend/src/api/user.ts @@ -14,3 +14,14 @@ export const userImportApi = { request.get(`/user/clearErrorRecord/${key}`) }, } + +export const userApi = { + pager: (params: any, pageNumber: number, pageSize: number) => + request.get(`/user/pager/${pageNumber}/${pageSize}${params}`), + add: (data: any) => request.post('/user', data), + edit: (data: any) => request.put('/user', data), + clearErrorApi: (key: string) => request.get(`/user/clearErrorRecord/${key}`), + delete: (key: string) => request.delete(`/user/${key}`), + get: (key: string) => request.get(`/user/${key}`), + pwd: (data: any) => request.put('/user/pwd', data), +} diff --git a/frontend/src/assets/workspace/avatar_personal.png b/frontend/src/assets/workspace/avatar_personal.png new file mode 100644 index 00000000..781f27b8 Binary files /dev/null and b/frontend/src/assets/workspace/avatar_personal.png differ diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json index a9cafb72..2ebe3367 100644 --- a/frontend/src/i18n/en.json +++ b/frontend/src/i18n/en.json @@ -263,12 +263,13 @@ "remove": "Remove", "selected_2_members": "Do you want to remove the selected {msg} members?", "removed_successfully": "Removed successfully", - "workspace:_de_workspace": "Do you want to delete the workspace: {msg}?", - "member:_feng_yibudao": "Do you want to remove the member: {msg}?", + "workspace_de_workspace": "Do you want to delete the workspace: {msg}?", + "member_feng_yibudao": "Do you want to remove the member: {msg}?", "select_member": "Select member", - "selected:_2_people": "Selected: {msg} people", + "selected_2_people": "Selected: {msg} people", "clear": "Clear", - "historical_dialogue": "No historical dialogue" + "historical_dialogue": "No historical dialogue", + "rename_a_workspace" : "Rename a workspace" }, "chat": { "chart_type": { diff --git a/frontend/src/i18n/zh-CN.json b/frontend/src/i18n/zh-CN.json index 986dada3..a08da126 100644 --- a/frontend/src/i18n/zh-CN.json +++ b/frontend/src/i18n/zh-CN.json @@ -266,12 +266,13 @@ "remove": "移除", "selected_2_members": "是否移除选中的 {msg} 个成员?", "removed_successfully": "移除成功", - "workspace:_de_workspace": "是否删除工作空间:{msg}?", - "member:_feng_yibudao": "是否移除成员:{msg}?", + "workspace_de_workspace": "是否删除工作空间:{msg}?", + "member_feng_yibudao": "是否移除成员:{msg}?", "select_member": "选择成员", - "selected:_2_people": "已选:{msg} 人", + "selected_2_people": "已选:{msg} 人", "clear": "清空", - "historical_dialogue": "暂无历史对话" + "historical_dialogue": "暂无历史对话", + "rename_a_workspace" : "重命名工作空间" }, "chat": { "chart_type": { diff --git a/frontend/src/views/system/user/User.vue b/frontend/src/views/system/user/User.vue index 9a6284d7..2f2387e3 100644 --- a/frontend/src/views/system/user/User.vue +++ b/frontend/src/views/system/user/User.vue @@ -8,6 +8,7 @@ style="width: 240px; margin-right: 12px" :placeholder="$t('user.name_account_email')" @keyup.enter="handleSearch" + @blur="handleSearch" > @@ -28,7 +29,7 @@ {{ $t('user.batch_import') }} - + @@ -63,9 +64,9 @@ - - - + + + @@ -75,7 +76,13 @@ - + - + @@ -91,7 +98,7 @@ @@ -186,7 +193,7 @@ autocomplete="off" /> - + - - - + - + @@ -282,7 +287,8 @@ import IconOpeDelete from '@/assets/svg/icon_delete.svg' import iconFilter from '@/assets/svg/icon-filter_outlined.svg' import ccmUpload from '@/assets/svg/icon_ccm-upload_outlined.svg' import icon_add_outlined from '@/assets/svg/icon_add_outlined.svg' -import { userApi } from '@/api/auth' +import { userApi } from '@/api/user' +import { workspaceList } from '@/api/workspace' import { formatTimestamp } from '@/utils/date' const { t } = useI18n() @@ -294,7 +300,43 @@ const dialogVisiblePassword = ref(false) const isIndeterminate = ref(true) const drawerMainRef = ref() const userImportRef = ref() -const filterOption = ref([]) +const filterOption = ref([ + { + type: 'enum', + option: [ + { id: 1, name: t('user.enable') }, + { id: 0, name: t('user.disable') }, + ], + field: 'status', + title: t('user.user_status'), + operate: 'in', + }, + { + type: 'enum', + option: [ + { id: '0', name: t('user.local_creation') }, + { id: 1, name: 'LDAP' }, + { id: 2, name: 'OIDC' }, + { id: 3, name: 'CAS' }, + { id: 9, name: 'OAuth2' }, + { id: 4, name: t('user.feishu') }, + { id: 5, name: t('user.dingtalk') }, + { id: 6, name: t('user.wechat_for_business') }, + ], + field: 'origins', + title: t('user.user_source'), + operate: 'in', + }, + { + type: 'select', + option: [], + field: 'oidist', + title: t('user.workspace'), + operate: 'in', + property: { placeholder: t('common.empty') + t('user.workspace') }, + }, +]) +const options = ref([]) const state = reactive({ tableData: [], filterTexts: [], @@ -303,7 +345,7 @@ const state = reactive({ id: '', name: '', account: '', - workspace: '', + oid: '', email: '', status: '', phoneNumber: '', @@ -417,8 +459,8 @@ const handleToggleRowSelection = (check: boolean = true) => { checkAll.value = i === state.tableData.length isIndeterminate.value = !(i === 0 || i === state.tableData.length) } -const handleSearch = (e: any) => { - console.log('search', e) +const handleSearch = () => { + search() } const fillFilterText = () => { const textArray = state.conditions?.length @@ -439,62 +481,26 @@ const clearFilter = (params?: number) => { const searchCondition = (conditions: any) => { state.conditions = conditions fillFilterText() - console.log(conditions) + search() drawerMainClose() } const drawerMainOpen = async () => { - filterOption.value = [ - { - type: 'enum', - option: [ - { id: true, name: t('user.enable') }, - { id: false, name: t('user.disable') }, - ], - field: 'statusList', - title: t('user.user_status'), - operate: 'in', - }, - { - type: 'enum', - option: [ - { id: '0', name: t('user.local_creation') }, - { id: 1, name: 'LDAP' }, - { id: 2, name: 'OIDC' }, - { id: 3, name: 'CAS' }, - { id: 9, name: 'OAuth2' }, - { id: 4, name: t('user.feishu') }, - { id: 5, name: t('user.dingtalk') }, - { id: 6, name: t('user.wechat_for_business') }, - ], - field: 'originList', - title: t('user.user_source'), - operate: 'in', - }, - { - type: 'select', - option: [{ id: '0', name: 'LOCAL' }], - field: 'workspaceList', - title: t('user.workspace'), - operate: 'in', - property: { placeholder: t('common.empty') + t('user.workspace') }, - }, - ] - drawerMainRef.value.init() } const drawerMainClose = () => { drawerMainRef.value.close() } -const editHandler = (id: any) => { - console.log('editHandler', id) +const editHandler = (row: any) => { + if (row) { + state.form = { ...row } + } dialogFormVisible.value = true - dialogTitle.value = id ? t('user.edit_user') : t('user.add_users') + dialogTitle.value = row?.id ? t('user.edit_user') : t('user.add_users') +} - // userApi.query(id).then((res: any) => { - // console.log('term detail', res) - // state.form = res - // dialogFormVisible.value = true - // }) +const statusHandler = (row: any) => { + state.form = { ...row } + editTerm() } const cancelDelete = () => { @@ -521,18 +527,15 @@ const deleteHandler = (row: any) => { cancelButtonText: t('common.cancel'), customClass: 'confirm-no_icon', autofocus: false, - callback: (val: string) => { - console.log(val) - }, }) .then(() => { - /* userApi.delete(id).then(() => { + userApi.delete(row.id).then(() => { ElMessage({ type: 'success', message: 'Delete completed', }) search() - }) */ + }) }) .catch(() => { ElMessage({ @@ -560,15 +563,36 @@ const onFormClose = () => { dialogFormVisible.value = false } -const search = () => { - userApi.pager(state.pageInfo.currentPage, state.pageInfo.pageSize).then((res: any) => { - state.tableData = res.items - state.pageInfo.total = res.total +const configParams = () => { + let str = '' + if (keyword.value) { + str += `keyword=${keyword.value}` + } - nextTick(() => { - handleToggleRowSelection() + state.conditions.forEach((ele: any) => { + ele.value.forEach((itx: any) => { + str += str ? `&${ele.field}=${itx}` : `${ele.field}=${itx}` }) }) + + if (str.length) { + str = `?${str}` + } + + return str +} + +const search = () => { + userApi + .pager(configParams(), state.pageInfo.currentPage, state.pageInfo.pageSize) + .then((res: any) => { + state.tableData = res.items + state.pageInfo.total = res.total + + nextTick(() => { + handleToggleRowSelection() + }) + }) } const addTerm = () => { userApi.add(state.form).then(() => { @@ -576,18 +600,17 @@ const addTerm = () => { search() ElMessage({ type: 'success', - message: 'Add completed', + message: t('common.save_success'), }) }) } const editTerm = () => { - userApi.edit(state.form).then((res: any) => { - console.log('edit term', res) + userApi.edit(state.form).then(() => { dialogFormVisible.value = false search() ElMessage({ type: 'success', - message: 'Edit completed', + message: t('common.save_success'), }) }) } @@ -607,6 +630,10 @@ const handleCurrentChange = (val: number) => { search() } onMounted(() => { + workspaceList().then((res) => { + options.value = res || [] + filterOption.value[2].option = [...options.value] + }) search() }) diff --git a/frontend/src/views/system/workspace/AuthorizedWorkspaceDialog.vue b/frontend/src/views/system/workspace/AuthorizedWorkspaceDialog.vue new file mode 100644 index 00000000..9ce704f4 --- /dev/null +++ b/frontend/src/views/system/workspace/AuthorizedWorkspaceDialog.vue @@ -0,0 +1,212 @@ + + + {{ $t('workspace.member_type') }} + + {{ $t('workspace.ordinary_member') }} + {{ $t('workspace.administrator') }} + + {{ $t('workspace.select_member') }} + + + + + + + + + + + + {{ $t('datasource.select_all') }} + + + + + + {{ space.name }} + + + + + + + + + {{ $t('workspace.selected_2_people', { msg: checkedWorkspace.length }) }} + + + + {{ $t('workspace.clear') }} + + + + + + {{ ele.name }} + + + + + + + + + + {{ $t('common.cancel') }} + {{ + $t('model.add') + }} + {{ $t('model.add') }} + + + + + + diff --git a/frontend/src/views/system/workspace/index.vue b/frontend/src/views/system/workspace/index.vue index a725cde9..c99a9632 100644 --- a/frontend/src/views/system/workspace/index.vue +++ b/frontend/src/views/system/workspace/index.vue @@ -1,70 +1,71 @@ @@ -153,7 +252,7 @@ const editField = (row: any) => { {{ $t('user.workspace') }} - + @@ -183,6 +282,33 @@ const editField = (row: any) => { {{ ele.name }} + + + + + + + + + + + + + {{ $t('datasource.edit') }} + + + + + + {{ $t('dashboard.delete') }} + + + {{ $t('workspace.historical_dialogue') }} @@ -192,22 +318,47 @@ const editField = (row: any) => { - {{ currentTable.name }} - - {{ $t('about.remark') }}: - {{ currentTable.custom_comment || '-' }} - - + + {{ currentTable.name }} + + + + {{ pageInfo.total }} + + + + + + + {{ $t('workspace.add_member') }} + + + + + + + + - + - - - + + + { - - - - + + + + + + + {{ scope.row.user_source }} + + + + + + + + + {{ ele.name }} + + + + + + + + + + - {{ scope.row.custom_comment }} - + + + + + + + + + + + + + {{ $t('datasource.select_all') }} + + + {{ $t('workspace.remove') }} + + {{ + $t('user.selected_2_items', { msg: multipleSelectionAll.length }) + }} + + + {{ $t('common.cancel') }} + - - - - {{ t('common.cancel') }} - {{ t('common.confirm') }} - - - + - + + + + + + {{ t('common.cancel') }} - {{ t('common.confirm') }} + {{ + t(workspaceForm.id ? 'common.save' : 'model.add') + }} - +
{{ $t('workspace.member_type') }}
{{ $t('workspace.select_member') }}