mirror of
https://github.com/cool-team-official/cool-admin-vue.git
synced 2025-12-13 22:32:49 +00:00
331 lines
5.3 KiB
Vue
331 lines
5.3 KiB
Vue
<template>
|
|
<cl-view-group ref="ViewGroup">
|
|
<template #left>
|
|
<!-- 部门列表 -->
|
|
<dept-list @refresh="refresh" @user-add="onUserAdd" />
|
|
</template>
|
|
|
|
<template #right>
|
|
<cl-crud ref="Crud">
|
|
<cl-row>
|
|
<!-- 刷新按钮 -->
|
|
<cl-refresh-btn />
|
|
<!-- 新增按钮 -->
|
|
<cl-add-btn />
|
|
<!-- 批量删除按钮 -->
|
|
<cl-multi-delete-btn />
|
|
<!-- 用户转移 -->
|
|
<el-button
|
|
v-permission="service.base.sys.user.permission.move"
|
|
type="success"
|
|
:disabled="Table?.selection.length == 0"
|
|
@click="toMove()"
|
|
>
|
|
转移
|
|
</el-button>
|
|
<cl-flex1 />
|
|
<cl-search-key placeholder="搜索用户名、姓名" />
|
|
</cl-row>
|
|
|
|
<cl-row>
|
|
<cl-table ref="Table">
|
|
<!-- 单个转移 -->
|
|
<template #slot-btn="{ scope }">
|
|
<el-button
|
|
v-permission="service.base.sys.user.permission.move"
|
|
text
|
|
bg
|
|
@click="toMove(scope.row)"
|
|
>
|
|
转移
|
|
</el-button>
|
|
</template>
|
|
</cl-table>
|
|
</cl-row>
|
|
|
|
<cl-row>
|
|
<cl-flex1 />
|
|
<cl-pagination />
|
|
</cl-row>
|
|
|
|
<!-- 新增、编辑 -->
|
|
<cl-upsert ref="Upsert" />
|
|
|
|
<!-- 移动 -->
|
|
<user-move :ref="setRefs('userMove')" />
|
|
</cl-crud>
|
|
</template>
|
|
</cl-view-group>
|
|
</template>
|
|
|
|
<script lang="ts" name="sys-user" setup>
|
|
import { useTable, useUpsert, useCrud, setFocus } from '@cool-vue/crud';
|
|
import { useCool } from '/@/cool';
|
|
import DeptList from './components/dept-list.vue';
|
|
import UserMove from './components/user-move.vue';
|
|
import { useViewGroup } from '/@/plugins/view';
|
|
|
|
const { service, refs, setRefs } = useCool();
|
|
|
|
const { ViewGroup } = useViewGroup({
|
|
title: '用户列表'
|
|
});
|
|
|
|
// cl-crud
|
|
const Crud = useCrud({
|
|
service: service.base.sys.user
|
|
});
|
|
|
|
// cl-table
|
|
const Table = useTable({
|
|
columns: [
|
|
{
|
|
type: 'selection',
|
|
width: 60
|
|
},
|
|
{
|
|
prop: 'headImg',
|
|
label: '头像',
|
|
component: {
|
|
name: 'cl-avatar'
|
|
}
|
|
},
|
|
{
|
|
prop: 'username',
|
|
label: '用户名',
|
|
minWidth: 150
|
|
},
|
|
{
|
|
prop: 'name',
|
|
label: '姓名',
|
|
minWidth: 150
|
|
},
|
|
{
|
|
prop: 'nickName',
|
|
label: '昵称',
|
|
minWidth: 150
|
|
},
|
|
{
|
|
prop: 'departmentName',
|
|
label: '部门名称',
|
|
minWidth: 150
|
|
},
|
|
{
|
|
prop: 'roleName',
|
|
label: '角色',
|
|
headerAlign: 'center',
|
|
minWidth: 150,
|
|
dict: [],
|
|
formatter(row) {
|
|
return row.roleName?.split(',');
|
|
}
|
|
},
|
|
{
|
|
prop: 'status',
|
|
label: '状态',
|
|
minWidth: 120,
|
|
component: {
|
|
name: 'cl-switch'
|
|
}
|
|
},
|
|
{
|
|
prop: 'phone',
|
|
label: '手机号码',
|
|
minWidth: 150
|
|
},
|
|
{
|
|
prop: 'remark',
|
|
label: '备注',
|
|
minWidth: 150
|
|
},
|
|
{
|
|
prop: 'createTime',
|
|
label: '创建时间',
|
|
sortable: 'desc',
|
|
minWidth: 170
|
|
},
|
|
{
|
|
type: 'op',
|
|
buttons: ['slot-btn', 'edit', 'delete'],
|
|
width: 240
|
|
}
|
|
]
|
|
});
|
|
|
|
// cl-upsert
|
|
const Upsert = useUpsert({
|
|
dialog: {
|
|
width: '800px'
|
|
},
|
|
|
|
items: [
|
|
{
|
|
prop: 'headImg',
|
|
label: '头像',
|
|
component: {
|
|
name: 'cl-upload',
|
|
props: {
|
|
text: '选择头像'
|
|
}
|
|
}
|
|
},
|
|
{
|
|
prop: 'name',
|
|
label: '姓名',
|
|
span: 12,
|
|
required: true,
|
|
component: {
|
|
name: 'el-input'
|
|
}
|
|
},
|
|
{
|
|
prop: 'nickName',
|
|
label: '昵称',
|
|
required: true,
|
|
span: 12,
|
|
component: {
|
|
name: 'el-input'
|
|
}
|
|
},
|
|
{
|
|
prop: 'username',
|
|
label: '用户名',
|
|
required: true,
|
|
span: 12,
|
|
component: {
|
|
name: 'el-input'
|
|
}
|
|
},
|
|
() => {
|
|
return {
|
|
prop: 'password',
|
|
label: '密码',
|
|
span: 12,
|
|
required: Upsert.value?.mode == 'add',
|
|
component: {
|
|
name: 'el-input',
|
|
props: {
|
|
type: 'password'
|
|
}
|
|
},
|
|
rules: [
|
|
{
|
|
min: 6,
|
|
max: 16,
|
|
message: '密码长度在 6 到 16 个字符'
|
|
}
|
|
]
|
|
};
|
|
},
|
|
{
|
|
prop: 'roleIdList',
|
|
label: '角色',
|
|
value: [],
|
|
required: true,
|
|
component: {
|
|
name: 'el-select',
|
|
options: [],
|
|
props: {
|
|
multiple: true,
|
|
'multiple-limit': 3
|
|
}
|
|
}
|
|
},
|
|
{
|
|
prop: 'phone',
|
|
label: '手机号码',
|
|
span: 12,
|
|
component: {
|
|
name: 'el-input'
|
|
}
|
|
},
|
|
{
|
|
prop: 'email',
|
|
label: '邮箱',
|
|
span: 12,
|
|
component: {
|
|
name: 'el-input'
|
|
}
|
|
},
|
|
{
|
|
prop: 'remark',
|
|
label: '备注',
|
|
component: {
|
|
name: 'el-input',
|
|
props: {
|
|
type: 'textarea',
|
|
rows: 4
|
|
}
|
|
}
|
|
},
|
|
{
|
|
prop: 'status',
|
|
label: '状态',
|
|
value: 1,
|
|
component: {
|
|
name: 'el-radio-group',
|
|
options: [
|
|
{
|
|
label: '启用',
|
|
value: 1
|
|
},
|
|
{
|
|
label: '禁用',
|
|
value: 0
|
|
}
|
|
]
|
|
}
|
|
}
|
|
],
|
|
|
|
onSubmit(data, { next }) {
|
|
next({
|
|
departmentId: ViewGroup.value?.selected?.id,
|
|
...data
|
|
});
|
|
},
|
|
|
|
async onOpen() {
|
|
// 设置权限列表
|
|
service.base.sys.role.list().then(res => {
|
|
Upsert.value?.setOptions(
|
|
'roleIdList',
|
|
res.map(e => {
|
|
return {
|
|
label: e.name || '',
|
|
value: e.id
|
|
};
|
|
})
|
|
);
|
|
});
|
|
},
|
|
|
|
plugins: [setFocus('name')]
|
|
});
|
|
|
|
// 刷新列表
|
|
function refresh(params?: any) {
|
|
Crud.value?.refresh(params);
|
|
}
|
|
|
|
// 新增成员
|
|
function onUserAdd({ id }: Eps.BaseSysDepartmentEntity) {
|
|
Crud.value?.rowAppend({
|
|
departmentId: id
|
|
});
|
|
}
|
|
|
|
// 移动成员
|
|
async function toMove(item?: Eps.BaseSysDepartmentEntity) {
|
|
let ids: number[] = [];
|
|
|
|
if (item) {
|
|
ids = [item.id!];
|
|
} else {
|
|
ids = Table.value?.selection.map(e => e.id) || [];
|
|
}
|
|
|
|
refs.userMove.open(ids);
|
|
}
|
|
</script>
|