Skip to content

Commit e73ace1

Browse files
committed
feat(user): user manage
1 parent d685280 commit e73ace1

File tree

7 files changed

+914
-265
lines changed

7 files changed

+914
-265
lines changed

frontend/src/api/user.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,14 @@ export const userImportApi = {
1414
request.get(`/user/clearErrorRecord/${key}`)
1515
},
1616
}
17+
18+
export const userApi = {
19+
pager: (params: any, pageNumber: number, pageSize: number) =>
20+
request.get(`/user/pager/${pageNumber}/${pageSize}${params}`),
21+
add: (data: any) => request.post('/user', data),
22+
edit: (data: any) => request.put('/user', data),
23+
clearErrorApi: (key: string) => request.get(`/user/clearErrorRecord/${key}`),
24+
delete: (key: string) => request.delete(`/user/${key}`),
25+
get: (key: string) => request.get(`/user/${key}`),
26+
pwd: (data: any) => request.put('/user/pwd', data),
27+
}
1.74 KB
Loading

frontend/src/i18n/en.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,12 +263,13 @@
263263
"remove": "Remove",
264264
"selected_2_members": "Do you want to remove the selected {msg} members?",
265265
"removed_successfully": "Removed successfully",
266-
"workspace:_de_workspace": "Do you want to delete the workspace: {msg}?",
267-
"member:_feng_yibudao": "Do you want to remove the member: {msg}?",
266+
"workspace_de_workspace": "Do you want to delete the workspace: {msg}?",
267+
"member_feng_yibudao": "Do you want to remove the member: {msg}?",
268268
"select_member": "Select member",
269-
"selected:_2_people": "Selected: {msg} people",
269+
"selected_2_people": "Selected: {msg} people",
270270
"clear": "Clear",
271-
"historical_dialogue": "No historical dialogue"
271+
"historical_dialogue": "No historical dialogue",
272+
"rename_a_workspace" : "Rename a workspace"
272273
},
273274
"chat": {
274275
"chart_type": {

frontend/src/i18n/zh-CN.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -266,12 +266,13 @@
266266
"remove": "移除",
267267
"selected_2_members": "是否移除选中的 {msg} 个成员?",
268268
"removed_successfully": "移除成功",
269-
"workspace:_de_workspace": "是否删除工作空间:{msg}?",
270-
"member:_feng_yibudao": "是否移除成员:{msg}?",
269+
"workspace_de_workspace": "是否删除工作空间:{msg}?",
270+
"member_feng_yibudao": "是否移除成员:{msg}?",
271271
"select_member": "选择成员",
272-
"selected:_2_people": "已选:{msg} 人",
272+
"selected_2_people": "已选:{msg} 人",
273273
"clear": "清空",
274-
"historical_dialogue": "暂无历史对话"
274+
"historical_dialogue": "暂无历史对话",
275+
"rename_a_workspace" : "重命名工作空间"
275276
},
276277
"chat": {
277278
"chart_type": {

frontend/src/views/system/user/User.vue

Lines changed: 107 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
style="width: 240px; margin-right: 12px"
99
:placeholder="$t('user.name_account_email')"
1010
@keyup.enter="handleSearch"
11+
@blur="handleSearch"
1112
>
1213
<template #prefix>
1314
<el-icon>
@@ -28,7 +29,7 @@
2829
</template>
2930
{{ $t('user.batch_import') }}
3031
</el-button>
31-
<el-button type="primary">
32+
<el-button type="primary" @click="editHandler(null)">
3233
<template #icon>
3334
<icon_add_outlined></icon_add_outlined>
3435
</template>
@@ -63,9 +64,9 @@
6364
</template>
6465
</el-table-column>
6566
<el-table-column prop="email" :label="$t('user.email')" width="280" />
66-
<el-table-column prop="phone" :label="$t('user.phone_number')" width="280" />
67-
<el-table-column prop="user_source" :label="$t('user.user_source')" width="280" />
68-
<el-table-column prop="workspace" :label="$t('user.workspace')" width="280" />
67+
<!-- <el-table-column prop="phone" :label="$t('user.phone_number')" width="280" /> -->
68+
<!-- <el-table-column prop="user_source" :label="$t('user.user_source')" width="280" /> -->
69+
<el-table-column prop="space_name" :label="$t('user.workspace')" width="280" />
6970

7071
<el-table-column prop="create_time" width="180" sortable :label="$t('user.creation_time')">
7172
<template #default="scope">
@@ -75,23 +76,29 @@
7576
<el-table-column fixed="right" width="150" :label="$t('ds.actions')">
7677
<template #default="scope">
7778
<div class="table-operate">
78-
<el-switch v-model="scope.row.checked" size="small" />
79+
<el-switch
80+
v-model="scope.row.status"
81+
:active-value="1"
82+
:inactive-value="0"
83+
size="small"
84+
@change="statusHandler(scope.row)"
85+
/>
7986
<div class="line"></div>
8087
<el-tooltip
8188
:offset="14"
8289
effect="dark"
8390
:content="$t('datasource.edit')"
8491
placement="top"
8592
>
86-
<el-icon class="action-btn" size="16" @click="editHandler(scope.row.id)">
93+
<el-icon class="action-btn" size="16" @click="editHandler(scope.row)">
8794
<IconOpeEdit></IconOpeEdit>
8895
</el-icon>
8996
</el-tooltip>
9097

9198
<el-tooltip
9299
:offset="14"
93100
effect="dark"
94-
:content="$t('datasource.edit')"
101+
:content="$t('user.change_password')"
95102
placement="top"
96103
>
97104
<el-icon class="action-btn" size="16" @click="handleEditPassword(scope.row.id)">
@@ -186,28 +193,26 @@
186193
autocomplete="off"
187194
/>
188195
</el-form-item>
189-
<el-form-item :label="$t('user.phone_number')">
196+
<!-- <el-form-item :label="$t('user.phone_number')">
190197
<el-input
191198
v-model="state.form.phoneNumber"
192199
:placeholder="
193200
$t('datasource.please_enter') + $t('common.empty') + $t('user.phone_number')
194201
"
195202
autocomplete="off"
196203
/>
197-
</el-form-item>
204+
</el-form-item> -->
198205

199206
<el-form-item :label="$t('user.workspace')">
200207
<el-select
201-
v-model="state.form.workspace"
208+
v-model="state.form.oid"
202209
:placeholder="$t('datasource.Please_select') + $t('common.empty') + $t('user.workspace')"
203210
>
204-
<el-option label="domain1" value="domain1" />
205-
<el-option label="domain2" value="domain2" />
206-
<el-option label="domain3" value="domain3" />
211+
<el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id" />
207212
</el-select>
208213
</el-form-item>
209214
<el-form-item :label="$t('user.user_status')">
210-
<el-switch v-model="state.form.status" />
215+
<el-switch v-model="state.form.status" :active-value="1" :inactive-value="0" />
211216
</el-form-item>
212217
</el-form>
213218
<template #footer>
@@ -282,7 +287,8 @@ import IconOpeDelete from '@/assets/svg/icon_delete.svg'
282287
import iconFilter from '@/assets/svg/icon-filter_outlined.svg'
283288
import ccmUpload from '@/assets/svg/icon_ccm-upload_outlined.svg'
284289
import icon_add_outlined from '@/assets/svg/icon_add_outlined.svg'
285-
import { userApi } from '@/api/auth'
290+
import { userApi } from '@/api/user'
291+
import { workspaceList } from '@/api/workspace'
286292
import { formatTimestamp } from '@/utils/date'
287293
288294
const { t } = useI18n()
@@ -294,7 +300,43 @@ const dialogVisiblePassword = ref(false)
294300
const isIndeterminate = ref(true)
295301
const drawerMainRef = ref()
296302
const userImportRef = ref()
297-
const filterOption = ref<any[]>([])
303+
const filterOption = ref<any[]>([
304+
{
305+
type: 'enum',
306+
option: [
307+
{ id: 1, name: t('user.enable') },
308+
{ id: 0, name: t('user.disable') },
309+
],
310+
field: 'status',
311+
title: t('user.user_status'),
312+
operate: 'in',
313+
},
314+
{
315+
type: 'enum',
316+
option: [
317+
{ id: '0', name: t('user.local_creation') },
318+
{ id: 1, name: 'LDAP' },
319+
{ id: 2, name: 'OIDC' },
320+
{ id: 3, name: 'CAS' },
321+
{ id: 9, name: 'OAuth2' },
322+
{ id: 4, name: t('user.feishu') },
323+
{ id: 5, name: t('user.dingtalk') },
324+
{ id: 6, name: t('user.wechat_for_business') },
325+
],
326+
field: 'origins',
327+
title: t('user.user_source'),
328+
operate: 'in',
329+
},
330+
{
331+
type: 'select',
332+
option: [],
333+
field: 'oidist',
334+
title: t('user.workspace'),
335+
operate: 'in',
336+
property: { placeholder: t('common.empty') + t('user.workspace') },
337+
},
338+
])
339+
const options = ref<any[]>([])
298340
const state = reactive<any>({
299341
tableData: [],
300342
filterTexts: [],
@@ -303,7 +345,7 @@ const state = reactive<any>({
303345
id: '',
304346
name: '',
305347
account: '',
306-
workspace: '',
348+
oid: '',
307349
email: '',
308350
status: '',
309351
phoneNumber: '',
@@ -417,8 +459,8 @@ const handleToggleRowSelection = (check: boolean = true) => {
417459
checkAll.value = i === state.tableData.length
418460
isIndeterminate.value = !(i === 0 || i === state.tableData.length)
419461
}
420-
const handleSearch = (e: any) => {
421-
console.log('search', e)
462+
const handleSearch = () => {
463+
search()
422464
}
423465
const fillFilterText = () => {
424466
const textArray = state.conditions?.length
@@ -439,62 +481,26 @@ const clearFilter = (params?: number) => {
439481
const searchCondition = (conditions: any) => {
440482
state.conditions = conditions
441483
fillFilterText()
442-
console.log(conditions)
484+
search()
443485
drawerMainClose()
444486
}
445487
const drawerMainOpen = async () => {
446-
filterOption.value = [
447-
{
448-
type: 'enum',
449-
option: [
450-
{ id: true, name: t('user.enable') },
451-
{ id: false, name: t('user.disable') },
452-
],
453-
field: 'statusList',
454-
title: t('user.user_status'),
455-
operate: 'in',
456-
},
457-
{
458-
type: 'enum',
459-
option: [
460-
{ id: '0', name: t('user.local_creation') },
461-
{ id: 1, name: 'LDAP' },
462-
{ id: 2, name: 'OIDC' },
463-
{ id: 3, name: 'CAS' },
464-
{ id: 9, name: 'OAuth2' },
465-
{ id: 4, name: t('user.feishu') },
466-
{ id: 5, name: t('user.dingtalk') },
467-
{ id: 6, name: t('user.wechat_for_business') },
468-
],
469-
field: 'originList',
470-
title: t('user.user_source'),
471-
operate: 'in',
472-
},
473-
{
474-
type: 'select',
475-
option: [{ id: '0', name: 'LOCAL' }],
476-
field: 'workspaceList',
477-
title: t('user.workspace'),
478-
operate: 'in',
479-
property: { placeholder: t('common.empty') + t('user.workspace') },
480-
},
481-
]
482-
483488
drawerMainRef.value.init()
484489
}
485490
const drawerMainClose = () => {
486491
drawerMainRef.value.close()
487492
}
488-
const editHandler = (id: any) => {
489-
console.log('editHandler', id)
493+
const editHandler = (row: any) => {
494+
if (row) {
495+
state.form = { ...row }
496+
}
490497
dialogFormVisible.value = true
491-
dialogTitle.value = id ? t('user.edit_user') : t('user.add_users')
498+
dialogTitle.value = row?.id ? t('user.edit_user') : t('user.add_users')
499+
}
492500
493-
// userApi.query(id).then((res: any) => {
494-
// console.log('term detail', res)
495-
// state.form = res
496-
// dialogFormVisible.value = true
497-
// })
501+
const statusHandler = (row: any) => {
502+
state.form = { ...row }
503+
editTerm()
498504
}
499505
500506
const cancelDelete = () => {
@@ -521,18 +527,15 @@ const deleteHandler = (row: any) => {
521527
cancelButtonText: t('common.cancel'),
522528
customClass: 'confirm-no_icon',
523529
autofocus: false,
524-
callback: (val: string) => {
525-
console.log(val)
526-
},
527530
})
528531
.then(() => {
529-
/* userApi.delete(id).then(() => {
532+
userApi.delete(row.id).then(() => {
530533
ElMessage({
531534
type: 'success',
532535
message: 'Delete completed',
533536
})
534537
search()
535-
}) */
538+
})
536539
})
537540
.catch(() => {
538541
ElMessage({
@@ -560,34 +563,54 @@ const onFormClose = () => {
560563
dialogFormVisible.value = false
561564
}
562565
563-
const search = () => {
564-
userApi.pager(state.pageInfo.currentPage, state.pageInfo.pageSize).then((res: any) => {
565-
state.tableData = res.items
566-
state.pageInfo.total = res.total
566+
const configParams = () => {
567+
let str = ''
568+
if (keyword.value) {
569+
str += `keyword=${keyword.value}`
570+
}
567571
568-
nextTick(() => {
569-
handleToggleRowSelection()
572+
state.conditions.forEach((ele: any) => {
573+
ele.value.forEach((itx: any) => {
574+
str += str ? `&${ele.field}=${itx}` : `${ele.field}=${itx}`
570575
})
571576
})
577+
578+
if (str.length) {
579+
str = `?${str}`
580+
}
581+
582+
return str
583+
}
584+
585+
const search = () => {
586+
userApi
587+
.pager(configParams(), state.pageInfo.currentPage, state.pageInfo.pageSize)
588+
.then((res: any) => {
589+
state.tableData = res.items
590+
state.pageInfo.total = res.total
591+
592+
nextTick(() => {
593+
handleToggleRowSelection()
594+
})
595+
})
572596
}
573597
const addTerm = () => {
574598
userApi.add(state.form).then(() => {
575599
dialogFormVisible.value = false
576600
search()
577601
ElMessage({
578602
type: 'success',
579-
message: 'Add completed',
603+
message: t('common.save_success'),
580604
})
581605
})
582606
}
583607
const editTerm = () => {
584-
userApi.edit(state.form).then((res: any) => {
585-
console.log('edit term', res)
608+
userApi.edit(state.form).then(() => {
586609
dialogFormVisible.value = false
587610
search()
588611
ElMessage({
589612
type: 'success',
590-
message: 'Edit completed',
613+
message: t('common.save_success'),
591614
})
592615
})
593616
}
@@ -607,6 +630,10 @@ const handleCurrentChange = (val: number) => {
607630
search()
608631
}
609632
onMounted(() => {
633+
workspaceList().then((res) => {
634+
options.value = res || []
635+
filterOption.value[2].option = [...options.value]
636+
})
610637
search()
611638
})
612639
</script>

0 commit comments

Comments
 (0)