This commit is contained in:
tanyp 2023-04-12 16:23:59 +08:00
parent c76f1dbf0a
commit 4d5707e2ad
8 changed files with 274 additions and 191 deletions

File diff suppressed because one or more lines are too long

View File

@ -89,6 +89,19 @@ export function dataPermissions(data:any){
})
}
export function orgList(roleId:String){
return new Promise((resolve, reject) => {
request({
url: '/tansci/sysrole/orgList/' + roleId,
method: 'get'
}).then((res:any) => {
resolve(res.data)
}).catch((e:any) => {
reject(e)
})
})
}
// 菜单权限
export function menuPermissions(data:any){
return new Promise((resolve, reject) => {
@ -103,3 +116,16 @@ export function menuPermissions(data:any){
})
})
}
export function menuList(roleId:String){
return new Promise((resolve, reject) => {
request({
url: '/tansci/sysrole/menuList/' + roleId,
method: 'get'
}).then((res:any) => {
resolve(res.data)
}).catch((e:any) => {
reject(e)
})
})
}

View File

@ -19,9 +19,12 @@
type: Array,
default: []
},
operation: { //
type: Boolean,
default: false
operation: {
type: Object,
default: {
isShow: false,
width: '220'
}
},
tableHeight: {
type: Number,
@ -29,7 +32,7 @@
},
headerCellStyle: {
type: Object,
default:{color:'#606266', fontWeight: 700, background:'var(--bg1)'}
default:{color:'#606266', fontWeight: 700}
},
data: {
type: Array,
@ -67,7 +70,7 @@
}
//
function onFind(arr,val){
function onFind(arr:any,val:any){
if(!arr) return 'info';
let temp = arr.find(v=>{ return v.value == val});
@ -174,7 +177,7 @@
</el-table-column>
</template>
<!-- 自定义插槽 -->
<el-table-column v-if="operation" fixed="right" label="操作" align="center" width="220">
<el-table-column v-if="operation.isShow" fixed="right" label="操作" align="center" :width="operation.width">
<template #default="scope">
<slot name="column" v-bind:column="scope"></slot>
</template>

View File

@ -7,7 +7,10 @@
// 局部背景
// --el-bg-color: radial-gradient( white 0%, #FAFDFE 10%, #ddf8e7 50%, #FAFDFE 90%, white 100%);
--el-bg-color: radial-gradient(#d9f8e5 0%, #FAFDFE 80%, #e7fcef 100%);
// --el-bg-color: radial-gradient(#d9f8e5 0%, #FAFDFE 80%, #e7fcef 100%);
--el-bg-color: #FAFDFE;
// 背景色
--bg1: #FAFAFA;
// 操作颜色
--delete: #f56c6c;
@ -29,6 +32,15 @@ body {
overflow: hidden;
}
/**
* Dialog 对话框
*/
.el-dialog__header{
background-color: var(--el-color-primary);
margin-right: 0;
padding: 0.5rem 1rem;
}
/**
* table组件样式
*/
@ -36,7 +48,7 @@ body {
.search-wrap{
display: flex;
flex-wrap: wrap;
background: var(--bg1);
// background: var(--bg1);
}
.search-wrap>div{
line-height: 40px;

View File

@ -2,7 +2,7 @@
import {onMounted, reactive, ref, unref} from 'vue'
import {ElMessage, ElMessageBox} from 'element-plus'
import type {FormInstance} from 'element-plus'
import {page,save,update,del} from '@/api/system/role'
import {page,save,update,del,dataPermissions,orgList,menuPermissions,menuList} from '@/api/system/role'
import Table from '@/components/Table.vue'
const searchForm = reactive({
@ -16,6 +16,10 @@
size: 10,
total: 1,
},
operation:{
isShow: true,
width: '240'
},
tableTitle: [
{prop:'',label:'',fixed:'left'},
{prop:'code',label:'角色编码'},
@ -28,18 +32,6 @@
tableData:[],
})
const formRef = ref<FormInstance>();
const form = reactive({
roleVisible: false,
operate: 0,
roleForm:{
id:'',
name:'',
status: 0,
remarks: ''
},
})
onMounted(()=>{
onRolePage()
})
@ -73,11 +65,49 @@
onRolePage();
}
//
function onEdit(val){
const formRef = ref<FormInstance>();
const form = reactive({
roleVisible: false,
operate: 0,
permissionList :[
{label: '全部', value: '0'},
{label: '自定义', value: '1'},
{label: '本级级子级', value: '2'},
{label: '本级', value: '3'}
],
roleForm:{
id:'',
name:'',
permission: '',
sort: 0,
remarks: ''
},
})
//
function onAddRole(){
form.roleVisible = true
form.operate = 0
form.roleForm = {
id:'',
name:'',
permission: '',
sort: 0,
remarks: ''
}
}
//
function onEdit(val:any){
form.operate = 1
form.roleForm = {
id: val.column.row.id,
name: val.column.row.name,
permission: val.column.row.permission,
sort: val.column.row.sort,
remarks: val.column.row.remarks
}
form.roleVisible = true
}
//
function onDelete(val:any){
ElMessageBox.confirm('此操作将永久删除, 是否继续?', '提示', {
@ -95,26 +125,94 @@
console.log(e)
})
}
//
function onAddRole(){
const onSubmit = async (formEl: FormInstance | undefined) => {
if (!formEl) return;
await formEl.validate((valid)=>{
if(valid){
if(form.operate == 0){
save(form.roleForm).then(res=>{
if(res){
ElMessage.success("添加成功!");
onRolePage()
}
})
} else {
update(form.roleForm).then(res=>{
if(res){
ElMessage.success("更新成功!");
onRolePage()
}
})
}
form.operate = 0
form.roleVisible = false
}
})
}
async function onSubmit (){
const form = unref(formRef);
if (!form) return;
await form.validate();
//
const menuRef = ref()
const orgRef = ref()
const auth = reactive({
authVisible: false,
type: '',
menuList: [],
orgList: [],
selected: [],
roleId: ''
})
function onAuth(val:any, type:string){
auth.type = type
auth.roleId = val.column.row.id
if(auth.type == 'menu'){
menuList(val.column.row.id).then((res:any)=>{
auth.menuList = res.result.list
auth.selected = res.result.selected
})
} else{
orgList(val.column.row.id).then((res:any)=>{
auth.orgList = res.result.list
auth.selected = res.result.selected
})
}
auth.authVisible = true
}
function onAuthSubmit(){
if(auth.type == 'menu'){
const keys = unref(menuRef);
if(keys.getCheckedKeys().length == 0){
ElMessage.error("请先选择菜单!");
return false;
}
menuPermissions({id: auth.roleId, menuIds: keys.getCheckedKeys()}).then(res=>{
if(res){
ElMessage.success("操作成功!");
}
})
} else {
const keys = unref(orgRef);
if(keys.getCheckedKeys().length == 0){
ElMessage.error("请先选择组织!");
return false;
}
dataPermissions({id: auth.roleId, orgIds: keys.getCheckedKeys()}).then(res=>{
if(res){
ElMessage.success("操作成功!");
}
})
}
auth.authVisible = false
}
</script>
<template>
<el-card class="role-container" shadow="always">
<Table :data="table.tableData" :column="table.tableTitle" :operation="true" :page="table.page" :loading="table.loading"
<Table :data="table.tableData" :column="table.tableTitle" :operation="table.operation" :page="table.page" :loading="table.loading"
@onSizeChange="onSizeChange" @onCurrentChange="onCurrentChange" @onSwitchChange="onSwitchChange">
<template #search>
<div><el-button type="info" @click="onAddRole">添加</el-button></div>
<div><el-button type="primary" @click="onAddRole">添加</el-button></div>
<div><el-input v-model="name" placeholder="请输入名称"></el-input></div>
<div><el-button @click="onRefresh" icon="RefreshRight" circle></el-button></div>
<div><el-button @click="onSearch" type="primary" icon="Search">查询</el-button></div>
@ -122,19 +220,48 @@
<template #column="scope">
<el-button @click="onEdit(scope)" type='primary' text='primary' style="color:var(--edit); padding:0;">编辑</el-button>
<el-button @click="onDelete(scope)" type='primary' text='primary' style="color:var(--delete); padding:0;">删除</el-button>
<el-button @click="onMenuRole(scope)" type='primary' text='primary' style="color:var(--role); padding:0;">菜单权限</el-button>
<el-button @click="onMenuRole(scope)" type='primary' text='primary' style="color:var(--role); padding:0;">权限</el-button>
<el-button @click="onAuth(scope, 'menu')" type='primary' text='primary' style="color:var(--add); padding:0;">菜单权限</el-button>
<el-button @click="onAuth(scope, 'org')" type='primary' text='primary' style="color:var(--role); padding:0;">数据权限</el-button>
</template>
</Table>
<el-dialog title="权限信息" v-model="form.roleVisible" :show-close="false" width="40%">
<el-dialog title="角色信息" v-model="form.roleVisible" :show-close="false" width="40%">
<el-form :model="form.roleForm" ref="formRef" :rules="rules" label-width="80px" status-icon>
<el-form-item label="名称" prop="name" :rules="[{required: true,message:'请输入名称',trigger: 'blur'}]">
<el-input v-model="form.roleForm.name" placeholder="请输入名称" style="width: 100%"/>
</el-form-item>
<el-form-item label="权限" prop="permission" :rules="[{required: true,message:'请选择权限',trigger: 'change'}]">
<el-select v-model="form.roleForm.permission" placeholder="请选择权限" style="width: 100%">
<el-option v-for="item in form.permissionList" :key="item" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input-number v-model="form.roleForm.sort" :min="0" :max="999" controls-position="right" style="width: 100%"/>
</el-form-item>
<el-form-item label="描述" prop="remarks">
<el-input v-model="form.roleForm.remarks" type="textarea" placeholder="请输入描述" style="width: 100%"/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="roleVisible = false">取消</el-button>
<el-button @click="form.roleVisible = false">取消</el-button>
<el-button type="primary" @click="onSubmit(formRef)">提交</el-button>
</span>
</template>
</el-dialog>
<el-dialog title="权限信息" v-model="auth.authVisible" :show-close="false" width="30%">
<el-scrollbar height="400px">
<el-tree v-if="auth.type == 'menu'" :data="auth.menuList" node-key="id" ref="menuRef" :default-expand-all="true"
:props="{children: 'children',label: 'chineseName'}" :default-checked-keys="auth.selected" multiple show-checkbox />
<el-tree v-if="auth.type == 'org'" :data="auth.orgList" node-key="id" ref="orgRef" :default-expand-all="true"
:props="{children: 'children',label: 'name'}" :default-checked-keys="auth.selected" multiple show-checkbox />
</el-scrollbar>
<template #footer>
<span class="dialog-footer">
<el-button @click="auth.authVisible = false">取消</el-button>
<el-button type="primary" @click="onAuthSubmit(authRef)">提交</el-button>
</span>
</template>
</el-dialog>
</el-card>
</template>
<style scoped lang="scss">

View File

@ -80,6 +80,14 @@ public class SysRoleController {
return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, sysRoleService.dataPermissions(role));
}
@ApiOperation(value = "获取权限组织", notes = "获取权限组织")
@Log(modul = "角色管理-获取权限组织", type = Constants.UPDATE, desc = "获取权限组织")
@GetMapping("/orgList/{roleId}")
@SaCheckPermission("role:data")
public Wrapper<Object> orgList(@PathVariable String roleId) {
return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, sysRoleService.orgList(roleId));
}
@ApiOperation(value = "菜单权限", notes = "菜单权限")
@Log(modul = "角色管理-菜单权限", type = Constants.UPDATE, desc = "菜单权限")
@PostMapping("/menuPermissions")
@ -88,4 +96,12 @@ public class SysRoleController {
return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, sysRoleService.menuPermissions(role));
}
@ApiOperation(value = "获取权限菜单", notes = "获取权限菜单")
@Log(modul = "角色管理-获取权限菜单", type = Constants.UPDATE, desc = "获取权限菜单")
@GetMapping("/menuList/{roleId}")
@SaCheckPermission("role:menu")
public Wrapper<Object> menuList(@PathVariable String roleId) {
return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, sysRoleService.menuList(roleId));
}
}

View File

@ -28,6 +28,10 @@ public interface SysRoleService extends IService<SysRole> {
Object dataPermissions(SysRole role);
Object orgList(String roleId);
Object menuPermissions(SysRole role);
Object menuList(String roleId);
}

View File

@ -6,22 +6,17 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tansci.common.constant.Constants;
import com.tansci.domain.SysRole;
import com.tansci.domain.SysRoleMenu;
import com.tansci.domain.SysRoleOrg;
import com.tansci.domain.*;
import com.tansci.mapper.SysRoleMapper;
import com.tansci.service.SysRoleMenuService;
import com.tansci.service.SysRoleOrgService;
import com.tansci.service.SysRoleService;
import com.tansci.service.*;
import com.tansci.utils.UUIDUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
* @ClassName SysRoleServiceImpl.java
@ -37,7 +32,11 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
@Autowired
private SysRoleMenuService sysRoleMenuService;
@Autowired
private SysMenuService sysMenuService;
@Autowired
private SysRoleOrgService sysRoleOrgService;
@Autowired
private SysOrgService sysOrgService;
@Override
public IPage<SysRole> page(Page page, SysRole role) {
@ -64,7 +63,7 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
@Override
public Object insert(SysRole role) {
role.setCreator(String.valueOf(StpUtil.getLoginId()));
role.setCode(UUIDUtils.getUUID(10));
role.setCode("SR"+UUIDUtils.getUUID(10).toUpperCase());
role.setIsDel(Constants.NOT_DEL_FALG);
role.setUpdateTime(LocalDateTime.now());
role.setCreateTime(LocalDateTime.now());
@ -97,14 +96,37 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
return sysRoleOrgService.saveBatch(orgs);
}
@Override
public Object orgList(String roleId) {
Map<String, Object> map = new HashMap<>();
map.put("list", sysOrgService.list(SysOrg.builder().build()));
List<SysRoleOrg> orgs = sysRoleOrgService.list(Wrappers.<SysRoleOrg>lambdaQuery().eq(SysRoleOrg::getRoleId, roleId));
if (Objects.nonNull(orgs) && orgs.size() > 0) {
map.put("selected", orgs.stream().map(SysRoleOrg::getOrgId).collect(Collectors.toList()));
}
return map;
}
@Override
public Object menuPermissions(SysRole role) {
sysRoleMenuService.remove(Wrappers.<SysRoleMenu>lambdaQuery().eq(SysRoleMenu::getRoleId, role.getId()));
List<SysRoleMenu> menus = new ArrayList<>();
role.getOrgIds().forEach(item -> {
role.getMenuIds().forEach(item -> {
menus.add(SysRoleMenu.builder().roleId(role.getId()).menuId(item).build());
});
return sysRoleMenuService.saveBatch(menus);
}
@Override
public Object menuList(String roleId) {
Map<String, Object> map = new HashMap<>();
map.put("list", sysMenuService.tree(SysMenu.builder().build()));
List<SysRoleMenu> menus = sysRoleMenuService.list(Wrappers.<SysRoleMenu>lambdaQuery().eq(SysRoleMenu::getRoleId, roleId));
if (Objects.nonNull(menus) && menus.size() > 0) {
map.put("selected", menus.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList()));
}
return map;
}
}