神仙都没用 1cfac24175 优化
2024-11-16 11:27:22 +08:00

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>