赞
踩
这两个模块的代码,使用的optionsApi,因为不涉及到比较复杂的功能.
/**
* 请求核心函数
* @param {*} options请求配置
*/
function request(options) {
options.method = options.method || 'get'
if (options.method.toLowerCase() === 'get') {
options.params = options.data
}
let isMock = config.mock; //防止我们多人开发的时候,有同事不屑mock:false,这样会导致还是去请求了Mock数据
if(typeof options.mock != 'undefined'){
isMock = options.mock;
}
if (config.env === 'prod') {
service.defaults.baseURL = config.baseApi
} else {
service.defaults.baseURL = config.mock ? config.mockApi:config.baseApi
service.defaults.baseURL = isMock ? config.mockApi:config.baseApi
}
return service(options)
}
src/api/index.js
menuSubmit(params) {
return request({
url: '/menu/operate',
method: 'post',
data: params,
mock: true
})
}
src/router/index.js
{
name: 'menu',
path: '/system/menu',
meta: {
title: '菜单管理'
},
component: () => import('./../views/Menu.vue')
},
src/views/Menu.vue
<template>
<div class="user-manage">
<div class="query-form">
<el-form ref="form" :inline="true" :model="queryForm">
<el-form-item label="菜单名称" prop="menuName">
<el-input v-model="queryForm.menuName" placeholder="请输入菜单名称" />
</el-form-item>
<el-form-item label="菜单状态" prop="menuState">
<el-select v-model="queryForm.menuState">
<el-option :value="1" label="正常"></el-option>
<el-option :value="2" label="停用"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getMenuList">查询</el-button>
<el-button @click="handleReset('form')">重置</el-button>
</el-form-item>
</el-form>
</div>
<div class="base-table">
<div class="action">
<el-button type="primary" @click="handleAdd(1)">新增</el-button>
</div>
<el-table
:data="menuList"
row-key="_id"
:tree-props="{ children: 'children' }"
>
<el-table-column
v-for="item in columns"
:key="item.prop"
:prop="item.prop"
:label="item.label"
:width="item.width"
:formatter="item.formatter"
>
</el-table-column>
<el-table-column label="操作" width="220">
<template #default="scope">
<el-button
@click="handleAdd(2, scope.row)"
type="primary"
size="mini"
>新增</el-button
>
<el-button @click="handleEdit(scope.row)" size="mini"
>编辑</el-button
>
<el-button
type="danger"
size="mini"
@click="handleDel(scope.row._id)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
</div>
<el-dialog title="用户新增" v-model="showModal">
<el-form
ref="dialogForm"
:model="menuForm"
label-width="100px"
:rules="rules"
>
<el-form-item label="父级菜单" prop="parentId">
<el-cascader
v-model="menuForm.parentId"
:options="menuList"
:props="{ checkStrictly: true, value: '_id', label: 'menuName' }"
clearable
/>
<span>不选,则直接创建一级菜单</span>
</el-form-item>
<el-form-item label="菜单类型" prop="menuType">
<el-radio-group v-model="menuForm.menuType">
<el-radio :label="1">菜单</el-radio>
<el-radio :label="2">按钮</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="菜单名称" prop="menuName">
<el-input v-model="menuForm.menuName" placeholder="请输入菜单名称" />
</el-form-item>
<el-form-item
label="菜单图标"
prop="icon"
v-show="menuForm.menuType == 1"
>
<el-input v-model="menuForm.icon" placeholder="请输入岗位" />
</el-form-item>
<el-form-item
label="路由地址"
prop="path"
v-show="menuForm.menuType == 1"
>
<el-input v-model="menuForm.path" placeholder="请输入路由地址" />
</el-form-item>
<el-form-item
label="权限标识"
prop="menuCode"
v-show="menuForm.menuType == 2"
>
<el-input v-model="menuForm.menuCode" placeholder="请输入权限标识" />
</el-form-item>
<el-form-item
label="组件路径"
prop="component"
v-show="menuForm.menuType == 1"
>
<el-input v-model="menuForm.component" placeholder="请输入组件路径" />
</el-form-item>
<el-form-item
label="菜单状态"
prop="menuState"
v-show="menuForm.menuType == 1"
>
<el-radio-group v-model="menuForm.menuState">
<el-radio :label="1">正常</el-radio>
<el-radio :label="2">停用</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="handleClose">取 消</el-button>
<el-button type="primary" @click="handleSubmit">确 定</el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
import utils from "../utils/utils";
export default {
name: "menu",
data() {
return {
queryForm: {
menuState: 1,
},
menuList: [],
columns: [
{
label: "菜单名称",
prop: "menuName",
width: 150,
},
{
label: "图标",
prop: "icon",
},
{
label: "菜单类型",
prop: "menuType",
formatter(row, column, value) {
return {
1: "菜单",
2: "按钮",
}[value];
},
},
{
label: "权限标识",
prop: "menuCode",
},
{
label: "路由地址",
prop: "path",
},
{
label: "组件路径",
prop: "component",
},
{
label: "菜单状态",
prop: "menuState",
width: 90,
formatter(row, column, value) {
return {
1: "正常",
2: "停用",
}[value];
},
},
{
label: "创建时间",
prop: "createTime",
formatter(row, column, value) {
return utils.formateDate(new Date(value));
},
},
],
showModal: false,
menuForm: {
parentId: [null],
menuType: 1,
menuState: 1,
},
action: "",
rules: {
menuName: [
{
required: true,
message: "请输入菜单名称",
trigger: "blur",
},
{
min: 2,
max: 10,
message: "长度在2-8个字符",
trigger: "blur",
},
],
},
};
},
mounted() {
this.getMenuList();
},
methods: {
// 菜单列表初始化
async getMenuList() {
try {
let list = await this.$api.getMenuList(this.queryForm);
this.menuList = list;
} catch (e) {
throw new Error(e);
}
},
// 表单重置
handleReset(form) {
this.$refs[form].resetFields();
},
// 新增菜单
handleAdd(type, row) {
this.showModal = true;
this.action = "add";
if (type == 2) {
this.menuForm.parentId = [...row.parentId, row._id].filter(
(item) => item
);
}
},
handleEdit(row) {
this.showModal = true;
this.action = "edit";
this.$nextTick(() => {
Object.assign(this.menuForm, row);
});
},
async handleDel(_id) {
await this.$api.menuSubmit({ _id, action: "delete" });
this.$message.success("删除成功");
this.getMenuList();
},
// 菜单操作-提交
handleSubmit() {
this.$refs.dialogForm.validate(async (valid) => {
if (valid) {
let { action, menuForm } = this;
let params = { ...menuForm, action };
let res = await this.$api.menuSubmit(params);
this.showModal = false;
this.$message.success("操作成功");
this.handleReset("dialogForm");
this.getMenuList();
}
});
},
// 弹框关闭
handleClose() {
this.showModal = false;
this.handleReset("dialogForm");
},
},
};
</script>
<style lang="scss">
</style>
src/views/Menu.vue
这里的api,把之前所有的allList改成List,因为之前的涉及到了分页,这里不需要分页
src/views/User.vue
// 初始化接口调用
onMounted(() => {
getUserList();
getRoleList();
getRoleAllList();
getDeptList();
});
// 获取角色
const getRoleList = async () => {
let res = await proxy.$api.getRoleList();
const getRoleAllList = async () => {
let res = await proxy.$api.getRoleAllList();
roleList.value = res;
};
下面是return
getRoleList,
getRoleAllList,
getRoleAllList(){
return request({
url:'/roles/allList',
method:'get',
mock:true
}),
getRoleList(){
return request({
url:'/roles/List',
method:'get',
data:{},
mock:true
})
},
src/router/index.js
{
name: 'role',
path: '/system/role',
meta: {
title: '角色管理'
},
component: () => import('./../views/Role.vue')
},
src/views/Role.vue
<template>
<div class="user-manage">
<div class="query-form">
<el-form ref="form" :inline="true" :model="queryForm">
<el-form-item label="角色名称" prop="roleName">
<el-input v-model="queryForm.roleName" placeholder="请输入角色名称" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getRoleList">查询</el-button>
<el-button @click="handleReset('form')">重置</el-button>
</el-form-item>
</el-form>
</div>
<div class="base-table">
<div class="action">
<el-button type="primary" @click="handleAdd(1)">创建</el-button>
</div>
<el-table
:data="roleList"
>
<el-table-column
v-for="item in columns"
:key="item.prop"
:prop="item.prop"
:label="item.label"
:width="item.width"
:formatter="item.formatter"
>
</el-table-column>
<el-table-column label="操作" width="240">
<template #default="scope">
<el-button
type="primary"
size="mini"
>编辑</el-button
>
<el-button size="mini"
>设置权限</el-button
>
<el-button
type="danger"
size="mini"
@click="handleDel(scope.row._id)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
class="pagination"
background
layout="prev, pager, next"
:total="pager.total"
:page-size="pager.pageSize"
@current-change="handleCurrentChange"
/>
</div>
<!-- <el-dialog title="用户新增" v-model="showModal">
<el-form
ref="dialogForm"
:model="menuForm"
label-width="100px"
:rules="rules"
>
<el-form-item label="父级菜单" prop="parentId">
<el-cascader
v-model="menuForm.parentId"
:options="menuList"
:props="{ checkStrictly: true, value: '_id', label: 'menuName' }"
clearable
/>
<span>不选,则直接创建一级菜单</span>
</el-form-item>
<el-form-item label="菜单类型" prop="menuType">
<el-radio-group v-model="menuForm.menuType">
<el-radio :label="1">菜单</el-radio>
<el-radio :label="2">按钮</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="菜单名称" prop="menuName">
<el-input v-model="menuForm.menuName" placeholder="请输入菜单名称" />
</el-form-item>
<el-form-item
label="菜单图标"
prop="icon"
v-show="menuForm.menuType == 1"
>
<el-input v-model="menuForm.icon" placeholder="请输入岗位" />
</el-form-item>
<el-form-item
label="路由地址"
prop="path"
v-show="menuForm.menuType == 1"
>
<el-input v-model="menuForm.path" placeholder="请输入路由地址" />
</el-form-item>
<el-form-item
label="权限标识"
prop="menuCode"
v-show="menuForm.menuType == 2"
>
<el-input v-model="menuForm.menuCode" placeholder="请输入权限标识" />
</el-form-item>
<el-form-item
label="组件路径"
prop="component"
v-show="menuForm.menuType == 1"
>
<el-input v-model="menuForm.component" placeholder="请输入组件路径" />
</el-form-item>
<el-form-item
label="菜单状态"
prop="menuState"
v-show="menuForm.menuType == 1"
>
<el-radio-group v-model="menuForm.menuState">
<el-radio :label="1">正常</el-radio>
<el-radio :label="2">停用</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="handleClose">取 消</el-button>
<el-button type="primary" @click="handleSubmit">确 定</el-button>
</span>
</template>
</el-dialog> -->
</div>
</template>
<script>
import utils from "../utils/utils";
export default {
name: "role",
data() {
return {
queryForm: {
roleName: '',
},
roleList: [],
columns: [
{
label: "角色名称",
prop: "roleName",
width: 150,
},
{
label: "备注",
prop: "remark",
},
{
label: "权限列表",
prop: "permissionList",
},
{
label: "创建时间",
prop: "createTime",
formatter(row, column, value) {
return utils.formateDate(new Date(value));
},
},
],
pager:{
total:0,
pageSize: 10,
}
};
},
mounted() {
this.getRoleList();
},
methods: {
// 菜单列表初始化
async getRoleList() {
try {
let {list ,pager}= await this.$api.getRoleList(this.queryForm);
this.roleList = list;
} catch (e) {
throw new Error(e);
}
},
// 表单重置
handleReset(form) {
this.$refs[form].resetFields();
},
},
};
</script>
<style lang="scss">
</style>
src/api/index.js
api和按钮
roleOperate(params) {
return request({
url: '/roles/operate',
method: 'post',
data: params,
mock: true
})
}
<template #default="{row}">
<el-button
type="primary"
size="mini"
@click="handleEdit(row)"
>编辑</el-button
>
<el-button
type="danger"
size="mini"
@click="handleDel(scope.row._id)"
@click="handleDel(row._id)"
>删除</el-button
>
<el-dialog title="角色创建" v-model="showModal">
<el-form
ref="dialogForm"
:model="roleForm"
label-width="100px"
:rules="rules"
>
<el-form-item label="角色名称" prop="roleName">
<el-input v-model="roleForm.roleName" placeholder="请输入角色名称" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
type="textarea"
:rows="2"
v-model="roleForm.remark"
placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="handleClose">取 消</el-button>
<el-button type="primary" @click="handleSubmit">确 定</el-button>
</span>
</template>
</el-dialog>
export default {
name: "role",
data() {
return {
queryForm: {
roleName: '',
},
roleList: [],
columns: [
{
label: "角色名称",
prop: "roleName",
width: 150,
},
{
label: "备注",
prop: "remark",
},
{
label: "权限列表",
prop: "permissionList",
},
{
label: "创建时间",
prop: "createTime",
formatter(row, column, value) {
return utils.formateDate(new Date(value));
},
},
],
pager:{
total:0,
pageSize: 10,
},
showModal:false,
roleForm:{},
rules: {
roleName: [
{
required: true,
message: "请输入菜单名称",
trigger: "blur",
},
],
},
action:''
};
},
mounted() {
this.getRoleList();
},
methods: {
// 菜单列表初始化
async getRoleList() {
try {
let {list ,pager}= await this.$api.getRoleList(this.queryForm);
this.roleList = list;
} catch (e) {
throw new Error(e);
}
},
// 表单重置
handleReset(form) {
this.$refs[form].resetFields();
},
handleAdd(){
this.action = 'add'
this.showModal=true
},
handleEdit(row){
this.action = 'edit'
this.showModal = true
this.$nextTick(()=>{
Object.assign(this.roleForm, row);
})
},
async handleDel(_id){
await this.$api.roleOperate({_id,action:'delete'})
this.$message.success('删除成功');
this.getRoleList();
},
handleClose(){
this.handleReset('dialogForm')
this.showModal=false
},
handleSubmit(){
this.$refs.dialogForm.validate(async valid=>{
if(valid){
let {roleForm,action} = this;
let params = {...roleForm,action};
await this.$api.roleOperate(params);
this.$message.success('创建成功');
this.handleClose();
this.getRoleList();
}
})
}
},
};
</script>
updatePermission(params) {
return request({
url: '/roles/update/permission',
method: 'post',
data: params,
mock: true
})
}
<!-- 设置权限 -->
<el-dialog title="设置权限" v-model="showPermission">
<el-form
label-width="100px"
>
<el-form-item label="角色名称" >
{{currentRoleName}}
</el-form-item>
<el-form-item label="选择权限" >
<el-tree
ref="tree"
:data="menuList"
node-key="_id"
:props="{label:'menuName'}"
show-checkbox
default-expand-all
>
</el-tree>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showPermission=false">取 消</el-button>
<el-button type="primary" @click="handlePermissionSubmit">确 定</el-button>
</span>
</template>
</el-dialog>
{
label: "权限列表",
prop: "permissionList",
formatter:(row,columns,value )=>{
let names = []
let list = value.halfCheckedKeys || [];
list.map(key=>{
if(key)names.push(this.actionMap[key])
})
return names.join(',')
}
},
下面是data参数
action:'',
showPermission:false,
currentRoleName:'',
currentId:'',
menuList:[],
actionMap:{}
mounted() {
this.getMenuList();
},
methods: {
// 菜单列表初始化
async getMenuList(){
try {
let list= await this.$api.getMenuList();
this.menuList = list;
this.getActionMap(list)
} catch (e) {
throw new Error(e);
}
handleCurrentChange(){
},
handleOpenPermission(row){
this.currentRoleName = row.roleName
this.currentId = row._id
this.showPermission = true
let {checkedKeys} = row.permissionList;
setTimeout(()=>{
this.$refs.tree.setCheckedKeys(checkedKeys)
})
},
handleCheckChange(){
},
async handlePermissionSubmit(){
let nodes = this.$refs.tree.getCheckedNodes();
let halfKey = this.$refs.tree.getHalfCheckedKeys();
let checkedKeys = []
let parentKeys = []
nodes.map(node=>{
if(!node.children){
checkedKeys.push(node._id)
}else {
parentKeys.push(node._id)
}
})
let params = {
_id:this.currentId,
permissionList:{
checkedKeys,
halfCheckedKeys:parentKeys.concat(halfKey)
}
}
await this.$api.updatePermission(params)
this.showPermission =false
this.$message.success('提交成功')
this.getRoleList()
},
getActionMap(list){
let actionMap = {}
const deep = (arr)=>{
while(arr.length){
let item = arr.pop()
if(item.children && item.action){
actionMap[item._id] = item.menuName
}
if(item.children&& !item.action){
deep(item.children)
}
}
}
deep(JSON.parse(JSON.stringify(list)))
this.actionMap = actionMap
}
},
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。