UnisKB/ui/src/views/system/user-manage/index.vue

336 lines
11 KiB
Vue
Raw Normal View History

2025-05-29 10:41:44 +00:00
<template>
<div class="p-16-24">
2025-06-05 03:28:18 +00:00
<h2 class="mb-16">{{ $t('views.userManage.title') }}</h2>
2025-05-29 10:41:44 +00:00
<el-card>
<div class="flex-between mb-16">
2025-07-03 08:29:14 +00:00
<el-button
type="primary"
@click="createUser"
v-hasPermission="[RoleConst.ADMIN, PermissionConst.USER_CREATE]"
>{{ $t('views.userManage.createUser') }}
2025-06-24 03:09:19 +00:00
</el-button>
2025-05-29 10:41:44 +00:00
<div class="flex-between complex-search">
<el-select
class="complex-search__left"
v-model="search_type"
style="width: 120px"
@change="search_type_change"
>
2025-07-03 08:29:14 +00:00
<el-option :label="$t('views.login.loginForm.username.label')" value="username" />
<el-option :label="$t('views.userManage.userForm.nick_name.label')" value="nick_name" />
<el-option :label="$t('views.login.loginForm.email.label')" value="email" />
2025-05-29 10:41:44 +00:00
</el-select>
<el-input
2025-06-25 10:39:06 +00:00
v-if="search_type === 'username'"
v-model="search_form.username"
@change="getList"
style="width: 220px"
clearable
2025-07-07 08:20:32 +00:00
:placeholder="$t('common.inputPlaceholder')"
2025-06-25 10:39:06 +00:00
/>
<el-input
v-else-if="search_type === 'nick_name'"
v-model="search_form.nick_name"
@change="getList"
style="width: 220px"
clearable
2025-07-07 08:20:32 +00:00
:placeholder="$t('common.inputPlaceholder')"
2025-06-25 10:39:06 +00:00
/>
<el-input
v-else-if="search_type === 'email'"
v-model="search_form.email"
2025-05-29 10:41:44 +00:00
@change="getList"
style="width: 220px"
clearable
2025-07-07 08:20:32 +00:00
:placeholder="$t('common.inputPlaceholder')"
2025-05-29 10:41:44 +00:00
/>
</div>
</div>
<app-table
class="mt-16"
:data="userTableData"
:pagination-config="paginationConfig"
@sizeChange="handleSizeChange"
@changePage="getList"
v-loading="loading"
>
2025-07-03 08:29:14 +00:00
<el-table-column
prop="nick_name"
:label="$t('views.userManage.userForm.nick_name.label')"
/>
<el-table-column prop="username" :label="$t('views.login.loginForm.username.label')" />
2025-05-29 10:41:44 +00:00
<el-table-column prop="is_active" :label="$t('common.status.label')">
<template #default="{ row }">
<div v-if="row.is_active" class="flex align-center">
2025-07-03 08:29:14 +00:00
<el-icon class="color-success mr-8" style="font-size: 16px">
<SuccessFilled />
2025-06-24 03:09:19 +00:00
</el-icon>
2025-05-29 10:41:44 +00:00
<span class="color-secondary">
{{ $t('common.status.enabled') }}
</span>
</div>
<div v-else class="flex align-center">
<AppIcon iconName="app-disabled" class="color-secondary mr-8"></AppIcon>
<span class="color-secondary">
{{ $t('common.status.disabled') }}
</span>
</div>
</template>
</el-table-column>
<el-table-column
prop="email"
2025-06-16 13:14:12 +00:00
:label="$t('views.login.loginForm.email.label')"
2025-05-29 10:41:44 +00:00
show-overflow-tooltip
>
<template #default="{ row }">
{{ row.email || '-' }}
</template>
</el-table-column>
2025-06-13 03:40:07 +00:00
<el-table-column prop="phone" :label="$t('views.userManage.userForm.phone.label')">
2025-05-29 10:41:44 +00:00
<template #default="{ row }">
{{ row.phone || '-' }}
</template>
</el-table-column>
2025-07-03 08:29:14 +00:00
<el-table-column
prop="role_name"
:label="$t('views.role.member.role')"
min-width="100"
v-if="user.isEE() || user.isPE()"
>
<template #default="{ row }">
2025-07-01 11:54:22 +00:00
<el-popover :width="400">
<template #reference>
2025-07-03 08:29:14 +00:00
<TagGroup
class="cursor"
style="width: fit-content"
:tags="row.role_name"
tooltipDisabled
/>
2025-07-01 11:54:22 +00:00
</template>
<template #default>
<el-table :data="row.role_workspace">
<el-table-column prop="role" :label="$t('views.role.member.role')">
</el-table-column>
<el-table-column prop="workspace" :label="$t('views.workspace.title')">
</el-table-column>
</el-table>
</template>
</el-popover>
</template>
</el-table-column>
2025-05-29 10:41:44 +00:00
<el-table-column prop="source" :label="$t('views.userManage.source.label')">
<template #default="{ row }">
{{
row.source === 'LOCAL'
? $t('views.userManage.source.local')
: row.source === 'wecom'
? $t('views.userManage.source.wecom')
: row.source === 'lark'
? $t('views.userManage.source.lark')
: row.source === 'dingtalk'
? $t('views.userManage.source.dingtalk')
: row.source === 'OAUTH2' || row.source === 'OAuth2'
? 'OAuth2'
: row.source
}}
</template>
</el-table-column>
<el-table-column :label="$t('common.createTime')" width="180">
<template #default="{ row }">
{{ datetimeFormat(row.create_time) }}
</template>
</el-table-column>
<el-table-column :label="$t('common.operation')" width="160" align="left" fixed="right">
<template #default="{ row }">
<span @click.stop>
<el-switch
2025-07-01 08:21:46 +00:00
:disabled="row.role === 'ADMIN' || row.id === user.userInfo?.id"
2025-05-29 10:41:44 +00:00
size="small"
v-model="row.is_active"
:before-change="() => changeState(row)"
2025-07-03 08:29:14 +00:00
v-if="hasPermission([RoleConst.ADMIN, PermissionConst.USER_EDIT], 'OR')"
2025-05-29 10:41:44 +00:00
/>
</span>
2025-07-03 08:29:14 +00:00
<el-divider direction="vertical" />
<el-tooltip effect="dark" :content="$t('common.edit')" placement="top">
<span class="mr-8">
<el-button
type="primary"
text
@click.stop="editUser(row)"
:title="$t('common.edit')"
v-if="hasPermission([RoleConst.ADMIN, PermissionConst.USER_EDIT], 'OR')"
>
<el-icon><EditPen /></el-icon>
</el-button>
</span>
</el-tooltip>
<el-tooltip
effect="dark"
:content="$t('views.userManage.setting.updatePwd')"
placement="top"
>
<span class="mr-8">
<el-button
type="primary"
text
@click.stop="editPwdUser(row)"
:title="$t('views.userManage.setting.updatePwd')"
v-if="hasPermission([RoleConst.ADMIN, PermissionConst.USER_EDIT], 'OR')"
>
<el-icon><Lock /></el-icon>
</el-button>
</span>
</el-tooltip>
<el-tooltip effect="dark" :content="$t('common.delete')" placement="top">
2025-05-29 10:41:44 +00:00
<el-button
2025-07-01 08:21:46 +00:00
:disabled="row.role === 'ADMIN' || row.id === user.userInfo?.id"
2025-05-29 10:41:44 +00:00
type="primary"
text
@click.stop="deleteUserManage(row)"
:title="$t('common.delete')"
2025-07-03 08:29:14 +00:00
v-if="hasPermission([RoleConst.ADMIN, PermissionConst.USER_DELETE], 'OR')"
2025-05-29 10:41:44 +00:00
>
2025-07-03 08:29:14 +00:00
<el-icon><Delete /></el-icon>
2025-05-29 10:41:44 +00:00
</el-button>
2025-07-03 08:29:14 +00:00
</el-tooltip>
2025-05-29 10:41:44 +00:00
</template>
</el-table-column>
</app-table>
</el-card>
2025-07-03 08:29:14 +00:00
<UserDrawer :title="title" ref="UserDrawerRef" @refresh="refresh" />
<UserPwdDialog ref="UserPwdDialogRef" @refresh="refresh" />
2025-05-29 10:41:44 +00:00
</div>
</template>
2025-05-28 11:03:28 +00:00
<script lang="ts" setup>
2025-07-03 08:29:14 +00:00
import { onMounted, ref, reactive, watch } from 'vue'
2025-05-29 10:41:44 +00:00
import UserDrawer from './component/UserDrawer.vue'
import UserPwdDialog from './component/UserPwdDialog.vue'
2025-06-20 19:14:59 +00:00
import userManageApi from '@/api/system/user-manage'
2025-07-03 08:29:14 +00:00
import { datetimeFormat } from '@/utils/time'
import { MsgSuccess, MsgConfirm } from '@/utils/message'
import { t } from '@/locales'
import { ValidCount, ValidType } from '@/enums/common.ts'
import useStore from '@/stores'
import { PermissionConst, RoleConst } from '@/utils/permission/data'
import { hasPermission } from '@/utils/permission/index'
2025-06-25 10:39:06 +00:00
2025-07-03 08:29:14 +00:00
const { user, common } = useStore()
2025-06-25 10:39:06 +00:00
const search_type = ref('username')
2025-05-29 10:41:44 +00:00
const search_form = ref<{
2025-07-03 08:29:14 +00:00
username: string
nick_name?: string
2025-06-25 10:39:06 +00:00
email?: string
2025-05-29 10:41:44 +00:00
}>({
2025-06-25 10:39:06 +00:00
username: '',
nick_name: '',
2025-07-03 08:29:14 +00:00
email: '',
2025-05-29 10:41:44 +00:00
})
const UserDrawerRef = ref()
const UserPwdDialogRef = ref()
const loading = ref(false)
const paginationConfig = reactive({
current_page: 1,
page_size: 20,
total: 0,
})
const userTableData = ref<any[]>([])
const search_type_change = () => {
2025-07-03 08:29:14 +00:00
search_form.value = { username: '', nick_name: '', email: '' }
2025-05-29 10:41:44 +00:00
}
2025-06-24 03:09:19 +00:00
2025-05-29 10:41:44 +00:00
function handleSizeChange() {
paginationConfig.current_page = 1
getList()
}
function getList() {
const params: any = {}
if (search_form.value[search_type.value as keyof typeof search_form.value]) {
2025-07-07 08:20:32 +00:00
params[search_type.value] =
search_form.value[search_type.value as keyof typeof search_form.value]
2025-06-25 10:39:06 +00:00
}
2025-07-03 08:29:14 +00:00
return userManageApi.getUserManage(paginationConfig, params, loading).then((res) => {
userTableData.value = res.data.records.map((item: any) => ({
...item,
role_workspace: Object.entries(item.role_workspace ?? {}).map(([role, workspaces]) => ({
role,
workspace:
(workspaces as string[])?.[0] === 'None' ? '-' : (workspaces as string[])?.join(', '),
})),
}))
paginationConfig.total = res.data.total
})
2025-05-29 10:41:44 +00:00
}
function changeState(row: any) {
const obj = {
is_active: !row.is_active,
}
const str = obj.is_active ? t('common.status.enableSuccess') : t('common.status.disableSuccess')
userManageApi
.putUserManage(row.id, obj, loading)
.then((res) => {
getList()
MsgSuccess(str)
return true
})
.catch(() => {
return false
})
}
const title = ref('')
2025-06-24 03:09:19 +00:00
2025-05-29 10:41:44 +00:00
function editUser(row: any) {
title.value = t('views.userManage.editUser')
UserDrawerRef.value.open(row)
}
function createUser() {
2025-06-30 02:12:45 +00:00
title.value = t('views.userManage.createUser')
UserDrawerRef.value.open()
2025-05-29 10:41:44 +00:00
}
function deleteUserManage(row: any) {
MsgConfirm(
2025-06-24 11:14:22 +00:00
`${t('views.userManage.delete.confirmTitle')}${row.nick_name} ?`,
2025-06-24 03:09:19 +00:00
t('views.userManage.delete.confirmMessage'),
2025-05-29 10:41:44 +00:00
{
confirmButtonText: t('common.confirm'),
2025-07-03 06:28:57 +00:00
confirmButtonClass: 'danger',
2025-05-29 10:41:44 +00:00
},
)
.then(() => {
loading.value = true
userManageApi.delUserManage(row.id, loading).then(() => {
MsgSuccess(t('common.deleteSuccess'))
getList()
})
})
2025-07-03 08:29:14 +00:00
.catch(() => {})
2025-05-29 10:41:44 +00:00
}
function editPwdUser(row: any) {
UserPwdDialogRef.value.open(row)
}
function refresh() {
getList()
}
2025-05-28 11:03:28 +00:00
2025-05-29 10:41:44 +00:00
onMounted(() => {
getList()
})
2025-05-28 11:03:28 +00:00
</script>
<style lang="scss" scoped></style>