1.优化请求的Mock数据没设置导致bug问题
这两个模块的代码,使用的optionsApi,因为不涉及到比较复杂的功能.
function request(options) {
options.method = options.method || 'get'
if (options.method.toLowerCase() === 'get') {
options.params = options.data
}
let isMock = config.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)
}
2.填写api接口src/api/index.js
menuSubmit(params) {
return request({
url: '/menu/operate',
method: 'post',
data: params,
mock: true
})
}
3.添加静态路由src/router/index.js
{
name: 'menu',
path: '/system/menu',
meta: {
title: '菜单管理'
},
component: () => import('./../views/Menu.vue')
},
4.菜单管理页面构建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>
5.角色管理:页面构建,数据渲染src/views/Menu.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
})
},
{
name: 'role',
path: '/system/role',
meta: {
title: '角色管理'
},
component: () => import('./../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>
6.角色管理:角色创建,编辑,删除完成
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>
|