@ -15,27 +15,34 @@
< el-option v-for = "dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" / >
< / el-select >
< / el-form-item >
< el-form-item label = "创建时间" style = "width: 308px" >
< el-date-picker
v-model = "dateRange"
value -format = " YYYY -MM -DD HH : mm : ss "
type = "daterange"
range -separator = " - "
start -placeholder = " 开始日期 "
end -placeholder = " 结束日期 "
: default -time = " [ new Date ( 2000 , 1 , 1 , 0 , 0 , 0 ) , new Date ( 2000 , 1 , 1 , 23 , 59 , 59 ) ] "
> < / el-date-picker >
< / el-form-item >
< el-form-item >
< el-button type = "primary" icon = "Search" @click ="handleQuery" > 搜索 < / el -button >
< el-button type = "primary" icon = "Search" @click ="handleQuery" v-hasPermi = "['system:role:query']" >搜索 < / el -button >
< el-button icon = "Refresh" @click ="resetQuery" > 重置 < / el -button >
< / el-form-item >
< / el-form >
< / el-card >
< / div >
< / transition >
< el-row :gutter = "20" >
<!-- 部门树 -- >
< el-col :lg = "4" :xs = "24" style = "" >
< el-card shadow = "hover" >
< el-input v-model = "deptName" placeholder="请输入部门名称" prefix-icon="Search" clearable / >
< el-tree
ref = "deptTreeRef"
class = "mt-2"
node -key = " id "
:data = "deptOptions"
: props = "{ label: 'label', children: 'children' }"
:expand-on-click-node = "false"
:filter-node-method = "filterNode"
highlight -current
default -expand -all
@ node -click = " handleNodeClick "
/ >
< / el-card >
< / el-col >
< el-col :lg = "20" :xs = "24" >
< el-card shadow = "hover" >
< template # header >
< el-row :gutter = "10" >
@ -43,19 +50,19 @@
< el-button v-hasPermi = "['system:role:add']" type="primary" plain icon="Plus" @click="handleAdd()" > 新增 < / el -button >
< / el-col >
< el-col :span = "1.5" >
< el-button v-hasPermi = "['system:role:edit']" type="success" plain :disabled="single" icon="Edit" @click="handleUpdate()" > 修改 < / el -button >
< el-button v-hasPermi = "['system:role:edit']" type="success" plain :disabled="single" icon="Edit" @click="handleUpdate()"
> 修改 < / e l - b u t t o n
>
< / el-col >
< el-col :span = "1.5" >
< el-button v-hasPermi = "['system:role:delete']" type="danger" plain :disabled="ids.length === 0" @click="handleDelete()" > 删除 < / el -button >
< / el-col >
< el-col :span = "1.5" >
< el-button v-hasPermi = "['system:role:export']" type="warning" plain icon="Download" @click="handleExport" > 导出 < / el -button >
< el-button v-hasPermi = "['system:role:delete']" type="danger" plain :disabled="ids.length === 0" @click="handleDelete()"
> 删除 < / e l - b u t t o n
>
< / el-col >
< right-toolbar v -model :show-search = "showSearch" @ query -table = " getList " > < / right-toolbar >
< / el-row >
< / template >
< el-table ref = "roleTableRef" border v-loading = "loading" :data="roleList" @selection-change="handleSelectionChange" >
< el-table ref = "roleTableRef" v-loading = "loading" :data="roleList" @selection-change="handleSelectionChange" >
< el -table -column type = "selection" width = "55" align = "center" / >
< el-table-column v-if = "false" label="角色编号" prop="roleId" width="120" / >
< el-table-column label = "角色名称" prop = "roleName" :show-overflow-tooltip = "true" width = "150" / >
@ -98,9 +105,23 @@
@pagination ="getList"
/ >
< / el-card >
< / el-col >
< / el-row >
< el-dialog v-model = "dialog.visible" :title="dialog.title" width="500px" append -to -body >
< el-form ref = "roleFormRef" :model = "form" :rules = "rules" label -width = " 10 0px " >
< el-form ref = "roleFormRef" :model = "form" :rules = "rules" label -width = " 11 0px " >
< el-form-item label = "所属部门" prop = "deptId" >
< el-cascader
:options = "deptOptions"
v-model = "form.deptId"
placeholder = "请选择所属部门"
clearable
filterable
:show-all-levels = "false"
: props = "{ value: 'id', emitPath: false, checkStrictly: true }"
>
< / el-cascader >
< / el-form-item >
< el-form-item label = "角色名称" prop = "roleName" >
< el-input v-model = "form.roleName" placeholder="请输入角色名称" / >
< / el-form-item >
@ -124,7 +145,7 @@
< / el-radio-group >
< / el-form-item >
< el-form-item label = "菜单权限" >
< el-checkbox v-model = "menuExpand" @change="handleCheckedTreeExpand($event, 'menu')" > 展开 / 折叠 < / el -checkbox >
< el-checkbox v-model = "menuExpand" @change="handleCheckedTreeExpand(Boolean( $event) , 'menu')" > 展开 / 折叠 < / el -checkbox >
< el-checkbox v-model = "menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')" > 全选 / 全不选 < / el -checkbox >
< el-checkbox v-model = "form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')" > 父子联动 < / el -checkbox >
< el-tree
@ -135,9 +156,12 @@
node -key = " id "
:check-strictly = "!form.menuCheckStrictly"
empty -text = " 加载中 , 请稍候 "
: props = "{ label: 'label', children: 'children' } as any "
: props = "{ label: 'label', children: 'children' }"
> < / el-tree >
< / el-form-item >
< el-form-item label = "是否为特殊角色" >
< el-switch v-model = "form.isSpecial" active-value="1" inactive-value="0" active-text="是" inactive-text="否" > < / el -switch >
< / el-form-item >
< el-form-item label = "备注" >
< el-input v-model = "form.remark" type="textarea" placeholder="请输入内容" > < / el -input >
< / el-form-item >
@ -165,7 +189,7 @@
< / el-select >
< / el-form-item >
< el-form-item v-show = "form.dataScope === '2'" label="数据权限" >
< el -checkbox v-model = "deptExpand" @change="handleCheckedTreeExpand($event, 'dept')" > 展开 / 折叠 < / el -checkbox >
< el -checkbox v-model = "deptExpand" @change="handleCheckedTreeExpand(Boolean( $event) , 'dept')" > 展开 / 折叠 < / el -checkbox >
< el-checkbox v-model = "deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')" > 全选 / 全不选 < / el -checkbox >
< el-checkbox v-model = "form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')" > 父子联动 < / el -checkbox >
< el-tree
@ -177,7 +201,7 @@
node -key = " id "
:check-strictly = "!form.deptCheckStrictly"
empty -text = " 加载中 , 请稍候 "
: props = "{ label: 'label', children: 'children' } as any "
: props = "{ label: 'label', children: 'children' }"
> < / el-tree >
< / el-form-item >
< / el-form >
@ -196,6 +220,8 @@ import { addRole, changeRoleStatus, dataScope, delRole, getRole, listRole, updat
import { roleMenuTreeselect , treeselect as menuTreeselect } from '@/api/system/menu/index' ;
import { RoleVO , RoleForm , RoleQuery , DeptTreeOption } from '@/api/system/role/types' ;
import { MenuTreeOption , RoleMenuTree } from '@/api/system/menu/types' ;
import api from '@/api/system/user' ;
import { DeptTreeVO , DeptVO } from '@/api/system/dept/types' ;
const router = useRouter ( ) ;
const { proxy } = getCurrentInstance ( ) as ComponentInternalInstance ;
@ -214,8 +240,11 @@ const menuExpand = ref(false);
const menuNodeAll = ref ( false ) ;
const deptExpand = ref ( true ) ;
const deptNodeAll = ref ( false ) ;
const deptOptions = ref < DeptTreeOption [ ] > ( [ ] ) ;
const deptOptions = ref < DeptTreeV O [ ] > ( [ ] ) ;
const enabledDeptOptions = ref < DeptTreeVO [ ] > ( [ ] ) ;
const openDataScope = ref ( false ) ;
const deptName = ref ( '' ) ;
/** 数据范围选项*/
const dataScopeOptions = ref ( [
@ -232,8 +261,9 @@ const roleFormRef = ref<ElFormInstance>();
const dataScopeRef = ref < ElFormInstance > ( ) ;
const menuRef = ref < ElTreeInstance > ( ) ;
const deptRef = ref < ElTreeInstance > ( ) ;
const deptTreeRef = ref < ElTreeInstance > ( ) ;
const initForm : RoleForm = {
const initForm = {
roleId : undefined ,
roleSort : 1 ,
status : '0' ,
@ -244,17 +274,22 @@ const initForm: RoleForm = {
remark : '' ,
dataScope : '1' ,
menuIds : [ ] ,
deptIds : [ ]
deptId : '' ,
isSpecial : null ,
deptIds : [ ] ,
roleSource : '1'
} ;
const data = reactive < PageData < RoleForm , RoleQuery > > ({
const data = reactive ( {
form : { ... initForm } ,
queryParams : {
pageNum : 1 ,
pageSize : 10 ,
roleName : '' ,
roleKey : '' ,
status : ''
deptId : '' ,
status : '' ,
roleSource : '1'
} ,
rules : {
roleName : [ { required : true , message : '角色名称不能为空' , trigger : 'blur' } ] ,
@ -269,6 +304,18 @@ const dialog = reactive<DialogOption>({
title : ''
} ) ;
/** 通过条件过滤节点 */
const filterNode = ( value : string , data : any ) => {
if ( ! value ) return true ;
return data . label . indexOf ( value ) !== - 1 ;
} ;
/** 节点单击事件 */
const handleNodeClick = ( data : DeptVO ) => {
queryParams . value . deptId = data . id as string ;
handleQuery ( ) ;
} ;
/**
* 查询角色列表
*/
@ -293,6 +340,9 @@ const handleQuery = () => {
const resetQuery = ( ) => {
dateRange . value = [ '' , '' ] ;
queryFormRef . value ? . resetFields ( ) ;
queryParams . value . pageNum = 1 ;
queryParams . value . deptId = undefined ;
deptTreeRef . value ? . setCurrentKey ( undefined ) ;
handleQuery ( ) ;
} ;
/**删除按钮操作 */
@ -323,7 +373,7 @@ const handleSelectionChange = (selection: RoleVO[]) => {
/** 角色状态修改 */
const handleStatusChange = async ( row : RoleVO ) => {
cons t text = row . status === '0' ? '启用' : '停用' ;
le t text = row . status === '0' ? '启用' : '停用' ;
try {
await proxy ? . $modal . confirm ( '确认要"' + text + '""' + row . roleName + '"角色吗?' ) ;
await changeRoleStatus ( row . roleId , row . status ) ;
@ -340,17 +390,17 @@ const handleAuthUser = (row: RoleVO) => {
/** 查询菜单树结构 */
const getMenuTreeselect = async ( ) => {
const res = await menuTreeselect ( ) ;
const res = await menuTreeselect ( { menuSource : '1' } );
menuOptions . value = res . data ;
} ;
/** 所有部门节点数据 */
const getDeptAllCheckedKeys = ( ) : any => {
// 目前被选中的部门节点
cons t checkedKeys = deptRef . value ? . getCheckedKeys ( ) ;
le t checkedKeys = deptRef . value ? . getCheckedKeys ( ) ;
// 半选中的部门节点
cons t halfCheckedKeys = deptRef . value ? . getHalfCheckedKeys ( ) ;
le t halfCheckedKeys = deptRef . value ? . getHalfCheckedKeys ( ) ;
if ( halfCheckedKeys ) {
checkedKeys ? . unshift ( .. .halfCheckedKeys ) ;
checkedKeys ? . unshift . apply ( checkedKeys , halfCheckedKeys ) ;
}
return checkedKeys ;
} ;
@ -390,28 +440,28 @@ const handleUpdate = async (row?: RoleVO) => {
} ;
/** 根据角色ID查询菜单树结构 */
const getRoleMenuTreeselect = ( roleId : string | number ) => {
return roleMenuTreeselect ( roleId ) . then ( ( res ) : RoleMenuTree => {
return roleMenuTreeselect ( roleId , { menuSource : '1' } ). then ( ( res ) : RoleMenuTree => {
menuOptions . value = res . data . menus ;
return res . data ;
} ) ;
} ;
/** 根据角色ID查询部门树结构 */
const getRoleDeptTreeSelect = async ( roleId : string | number ) => {
const res = await deptTreeSelect ( roleId ) ;
const res = await deptTreeSelect ( roleId , { roleSource : '1' } );
deptOptions . value = res . data . depts ;
return res . data ;
} ;
/** 树权限(展开/折叠)*/
const handleCheckedTreeExpand = ( value : boolean , type : string ) => {
if ( type == 'menu' ) {
cons t treeList = menuOptions . value ;
le t treeList = menuOptions . value ;
for ( let i = 0 ; i < treeList . length ; i ++ ) {
if ( menuRef . value ) {
menuRef . value . store . nodesMap [ treeList [ i ] . id ] . expanded = value ;
}
}
} else if ( type == 'dept' ) {
cons t treeList = deptOptions . value ;
le t treeList = deptOptions . value ;
for ( let i = 0 ; i < treeList . length ; i ++ ) {
if ( deptRef . value ) {
deptRef . value . store . nodesMap [ treeList [ i ] . id ] . expanded = value ;
@ -438,11 +488,11 @@ const handleCheckedTreeConnect = (value: any, type: string) => {
/** 所有菜单节点数据 */
const getMenuAllCheckedKeys = ( ) : any => {
// 目前被选中的菜单节点
cons t checkedKeys = menuRef . value ? . getCheckedKeys ( ) ;
le t checkedKeys = menuRef . value ? . getCheckedKeys ( ) ;
// 半选中的菜单节点
cons t halfCheckedKeys = menuRef . value ? . getHalfCheckedKeys ( ) ;
le t halfCheckedKeys = menuRef . value ? . getHalfCheckedKeys ( ) ;
if ( halfCheckedKeys ) {
checkedKeys ? . unshift ( .. .halfCheckedKeys ) ;
checkedKeys ? . unshift . apply ( checkedKeys , halfCheckedKeys ) ;
}
return checkedKeys ;
} ;
@ -496,8 +546,28 @@ const cancelDataScope = () => {
form . value = { ... initForm } ;
openDataScope . value = false ;
} ;
/** 查询部门下拉树结构 */
const getDeptTree = async ( ) => {
const res = await api . deptTreeSelect ( { isShow : '1' } ) ;
deptOptions . value = res . data ;
enabledDeptOptions . value = filterDisabledDept ( res . data ) ;
} ;
/** 过滤禁用的部门 */
const filterDisabledDept = ( deptList : DeptTreeVO [ ] ) => {
return deptList . filter ( ( dept ) => {
if ( dept . disabled ) {
return false ;
}
if ( dept . children && dept . children . length ) {
dept . children = filterDisabledDept ( dept . children ) ;
}
return true ;
} ) ;
} ;
onMounted ( ( ) => {
getDeptTree ( ) ; // 初始化部门数据
getList ( ) ;
} ) ;
< / script >