
后台管理系统项目总结(上)
发布日期:2021-05-07 11:59:00
浏览次数:22
分类:原创文章
本文共 30461 字,大约阅读时间需要 101 分钟。
项目架构
使用到vue框架
ElementUI
技术栈
vue组件化开发
proxy跨域
API封装
路由鉴权
VUEX
首先处理跨域问题
创建一个vue.config.js文件,配置一下proxy开发环境
//处理跨域module.exports = { publicPath: "./", devServer: { open: true, proxy: { '': { target: "http://39.100.7.70:81/", changeOrigin: true, pathRewrite: { '^/api': "" } } } }};
配置main.js文件
import Vue from 'vue'import App from './App.vue'import router from './router'// import './plugins/element'// axios引入配置import axios from 'axios' //导入进度条插件 import NProgress from 'nprogress' //导入进度条样式 // import 'nprogress/nprogress.css' //------- //文档提供基准接口 axios.defaults.baseURL='https://www.liulongbin.top:8888/api/private/v1/' axios.defaults.timeout = 5000; //当进入request拦截器,表示发送了请求,我们就开启进度条 NProgress.start() //设置请求头 axios.interceptors.request.use(config => { config.headers.Authorization=sessionStorage.getItem('token') return config; }); //-------- // TreeTableimport TreeTable from 'vue-table-with-tree-grid'Vue.component('tree-table', TreeTable)Vue.prototype.$http = axios // 时间戳 Vue.filter('dateFormat', function (originVal) { const dt = new Date(originVal) const y = dt.getFullYear() const m = (dt.getMonth() + 1 + '').padStart(2, '0') const d = (dt.getDate() + '').padStart(2, '0') const hh = (dt.getHours() + '').padStart(2, '0') const mm = (dt.getMinutes() + '').padStart(2, '0') const ss = (dt.getSeconds() + '').padStart(2, '0') return `${ y}-${ m}-${ d} ${ hh}:${ mm}:${ ss}` })Vue.config.productionTip = falsenew Vue({ router, render: h => h(App)}).$mount('#app')
配置axiosApi
// 单独封装根路径 import axios from 'axios'const request = axios.create({ baseURL:'https://www.liulongbin.top:8888/api/private/v1/', timeout : 5000,}) //设置请求头 request.interceptors.request.use(config => { config.headers.Authorization=sessionStorage.getItem('token') return config; });export default request
配置路由
import Vue from 'vue'import Router from 'vue-router'Vue.use(Router)export default new Router({ routes: [ { //登录 path: '/', name: 'login', component: () => import(/* webpackChunkName:"login_home_welcome" */ './views/Login.vue'), }, { path: '/home', name: 'Home', component: () => import(/* webpackChunkName:"login_home_welcome" */ './views/Home.vue'), children:[{ path: '/', redirect:'/home/welcome' },{ //默认展示welcome页 path:'welcome', name: 'Welcome', component: () => import(/* webpackChunkName:"login_home_welcome" */ './components/Welcome.vue'), }, { //用户列表 path:'Users', name: 'Users', component: () => import(/* webpackChunkName:"users" */ './components/user/Users.vue'), }, { //角色列表 path:'roles', name: 'roles', component: () => import(/* webpackChunkName:"roles" */ './components/roles/Roles.vue'), },{ //所有角色列表 path:'rights', name: 'rights', component: () => import(/* webpackChunkName:"roles" */ './components/roles/Right.vue'), },{ path:'Categories', name: 'Categories', component: () => import(/* webpackChunkName:"goods" */ './components/goods/Categories.vue'), },{ path:'params', name: 'params', component: () => import(/* webpackChunkName:"goods" */ './components/goods/parm.vue'), },{ path:'goods', name: 'goods', component: () => import(/* webpackChunkName:"goods" */ './components/goods/ProductList.vue'), children: [ { path: 'add', name: 'Add', component: () => import(/* webpackChunkName:"goods" */ './components/goods/Add.vue'), } ] },{ path:'orders', name: 'orders', component: () => import(/* webpackChunkName:"orders" */ './components/orders/Orders.vue'), },{ path:'reports', name: 'reports', component: () => import(/* webpackChunkName:"reports" */ './components/report/Report.vue'), } ] } ]})
封装面包屑导航
<template> <div> <el-breadcrumb separator-class="el-icon-arrow-right"> <el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item> <el-breadcrumb-item v-for="(item,index) in obj" :key="index">{ { item}}</el-breadcrumb-item> </el-breadcrumb> </div></template><script>export default { data(){ return{ obj:{ }, }},created(){ this.obj=JSON.parse(window.sessionStorage.getItem('breadName'));}}</script>
登录login
<template> <div class="home"> <div class="box"> <div class="pic"> <img src="../assets/logo.png" alt /> </div> <!-- 用户账号 --> <el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm" > <el-form-item label="账号" prop="username"> <el-input v-model="ruleForm.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input type="password" v-model="ruleForm.password"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submit">提交</el-button> </el-form-item> </el-form> </div> </div></template><script> import loginApi from './loginApi'export default { data(){ return { ruleForm: { username: 'admin', password: '123456', }, rules: { username: [ { required: true, message: '请输入登录名', trigger: 'blur' }, { min: 3,max: 10, message: '登录名长度在 3 到 6 个字符',trigger: 'blur'} ], password: [ { required: true, message: '请输入密码', trigger: 'blur' }, { min: 3,max: 10, message: '密码长度在 3 到 6 个字符', trigger: 'blur'} ], } } }, methods:{ //登录 submit(){ this.$refs.ruleForm.validate(async valid=>{ console.log(this.ruleForm); //判断用户舒输入账号是否有误 if(!valid) return //发送请求 const { data:res}=await loginApi.login(this.ruleForm) console.log(res); //根据请求到的状态 给用户对应的响应 if(res.meta.status!==200){ //请求失败 this.$message.error(res.meta.msg); } window.sessionStorage.setItem('token',res.data.token) this.$router.push('/home') }) }, }}</script>
用户管理模块
封装请求接口
import axios from '@/axiosApi/axios'export default{ //获取所有数据 users(queryInfo){ return axios.get('users',{ params: queryInfo }) }, //修改用户状态 userStateChange(id,msg){ return axios.put(`users/${ id}/state/${ msg}}`) }, //添加用户 addUserState(ruleForm){ return axios.post('users',ruleForm) }, //修改用户信息 showUserState(id){ return axios.get('users/'+id) }, //修改用户信息 showUserStates(id,email){ return axios.put(`users/${ id}`, email) }, //权限分配 settingUsers(){ return axios.get('roles') }, powerUsers(){ return axios.get(`users/${ id}/role`,rid) },}
用户管理页面布局+逻辑
<template> <div> <!-- 面包屑 --> <Bread></Bread> <!-- 功能区域 --> <el-card> <!-- 搜索 --> <el-row> <el-col :span="13"> <div style="margin-top: 15px;" class="searCh"> <el-input placeholder="请输入内容" v-model="queryInfo.query" clearable @clear="getUser"> <el-button slot="append" icon="el-icon-search" @click="getUser"></el-button> </el-input> <el-button type="primary" class="addUser" @click="addDialog = true">添加用户</el-button> </div> </el-col> </el-row> <!-- 用户列表 --> <el-table :data="getuse" border style="width: 100%"> <el-table-column type="index" label="#" width="60px"></el-table-column> <el-table-column prop="username" label="姓名"></el-table-column> <el-table-column prop="email" label="邮箱"></el-table-column> <el-table-column prop="mobile" label="电话"></el-table-column> <el-table-column prop="role_name" label="角色"></el-table-column> <el-table-column label="状态" width="80px"> <template slot-scope="scope"> <el-switch v-model="scope.row.mg_state" @change="userChange(scope.row)"></el-switch> </template> </el-table-column> <el-table-column label="操作" width="210px"> <template slot-scope="scope"> <!-- 修改 --> <el-button type="primary" icon="el-icon-edit" size="mini" @click="showDialogUser(scope.row.id)" ></el-button> <!-- 删除 --> <el-button type="danger" icon="el-icon-delete" size="mini"></el-button> <!-- 分配权限 --> <el-tooltip class="item" effect="dark" content="分配权限" placement="top"> <el-button type="warning" icon="el-icon-setting" size="mini" @click="settingUser(scope.row)" ></el-button> </el-tooltip> </template> </el-table-column> </el-table> <!-- 分页 --> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="queryInfo.pagenum" :page-sizes="[1, 3, 6, 9]" :page-size="queryInfo.pagesize" layout="total, sizes, prev, pager, next, jumper" :total="total" ></el-pagination> <!-- 添加用户--弹出框 --> <el-dialog title="提示" :visible.sync="addDialog" width="50%" @close="resetDialog"> <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm" > <el-form-item label="用户名称" prop="username"> <el-input v-model="ruleForm.username"></el-input> </el-form-item> <el-form-item label="用户密码" prop="password"> <el-input v-model="ruleForm.password"></el-input> </el-form-item> <el-form-item label="邮箱" prop="email"> <el-input v-model="ruleForm.email"></el-input> </el-form-item> <el-form-item label="手机号" prop="moblie"> <el-input v-model="ruleForm.moblie"></el-input> </el-form-item> </el-form> <span slot="footer" class="dialog-footer"> <el-button @click="addDialog = false">取 消</el-button> <el-button type="primary" @click="addDialogUser">确 定</el-button> </span> </el-dialog> <!-- 修改用户--弹出框 --> <el-dialog title="修改" :visible.sync="showDialog" width="50%" @close="resetShowDialog"> <el-form :model="showForm" :rules="rules" ref="showForm" label-width="100px"> <el-form-item label="用户名称"> <el-input v-model="showForm.username" disabled></el-input> </el-form-item> <el-form-item label="邮箱" prop="email"> <el-input v-model="showForm.email"></el-input> </el-form-item> <el-form-item label="手机" prop="mobile"> <el-input v-model="showForm.mobile"></el-input> </el-form-item> </el-form> <span slot="footer" class="dialog-footer"> <el-button @click="showDialog = false">取 消</el-button> <el-button type="primary" @click="showDialogUsers">确 定</el-button> </span> </el-dialog> <!-- 分配权限--弹出框 --> <el-dialog title="分配权限" :visible.sync="powerDialog" width="50%"> <p class="powerStyle">当前的用户:{ { userInfo.username }}</p> <p class="powerStyle">当前的角色:{ { userInfo.role_name }}</p> <el-form> <el-form-item label="分配新角色"> <el-select placeholder="请选择" v-model="selectedRoledId"> <el-option v-for="item in powerList" :key="item.id" :label="item.roleName" :value="item.id"> </el-option> </el-select> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="powerDialog = false">取 消</el-button> <el-button type="primary" @click="powerUser">确 定</el-button> </div> </el-dialog> </el-card> </div></template><script>import Bread from '../Bread.vue'import userApi from './userApi'export default { components: { Bread }, data() { const ckeEmail = (value, callback) => { const cb = /^[a-z0-9A-Z]+[- | a-z0-9A-Z . _]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-z]{2,}$/; if (!cb.test(value)) { callback(new Error("请输入正确的邮箱规则")); } else { callback(); } } const ckeMoabile = (value, callback) => { const hua = /^1\d{10}$|^(0\d{2,3}-?|\(0\d{2,3}\))?[1-9]\d{4,7}(-\d{1,8})?$/; if (!hua.test(value)) { callback(new Error("请输入正确的电话格式")); } else { callback(); } }; return { // 搜索 input3: '', //用户数据 getuse: [], queryInfo: { query: '', pagenum: 1, pagesize: 3 }, total: 0, addDialog: false,//控制添加用户对话框 showDialog: false,//控制修改用户对话框 powerDialog: false,//控制分配权限对话框 //已选择用户id selectedRoledId:'', userInfo: { },//需要分配权限 showForm: { }, powerList:{ }, showFormRules: { email: [ { required: true, message: '请输入用户email', trigger: 'blur' }, { validator: ckeEmail, trigger: 'blur' } ], mobile: [ { required: true, message: '请输入用户mobile', trigger: 'blur' }, { validate: ckeMoabile, trigger: 'blur' } ] }, value:true, //添加用户 ruleForm: { username: '', password: '', email: '', mobile: '' }, rules: { username: [ { required: true, message: '请输入用户名称', trigger: 'blur' }, { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' } ], password: [ { required: true, message: '请输入用户密码', trigger: 'blur' }, { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' } ], email: [ { required: true, message: '请输入email', trigger: 'blur' }, { validate: ckeEmail, trigger: 'blur' } ], mobile: [ { required: true, message: '请输入mobile', trigger: 'blur' }, { validate: ckeMoabile, trigger: 'blur' } ], } } }, methods: { //获取用户数据 async getUser() { const { data: res } = await userApi.users(this.queryInfo) // console.log(res); //如果数据获取失败 if (res.meta.status !== 200) { return this.$message.error('用户获取失败') } this.getuse = res.data.users // console.log(this.getuse); this.total = res.data.total console.log(res); }, //监听pagesize改变的事件 handleSizeChange(val) { console.log(`每页 ${ val} 条`); this.queryInfo.pagesize = val this.getUser() }, //监听页码 handleCurrentChange(val) { console.log(`当前页: ${ val}`); this.queryInfo.pagenum = val this.getUser() }, //可控制修改用户状态 async userChange(userStatus) { // console.log(userStatus); const { data: res } = await userApi.userStateChange(userStatus.id,userStatus.mg_state) if (res.meta.status !== 200) { //如果用户状态修改失败要保持操作前的原有状态(所以要做一次取反操作) userStatus.mg_state = !userStatus.mg_state return this.$message.error('用户状态修改失败') } this.$message.success('用户状态修改成功') }, //关闭对话框时重置input内容 resetDialog() { this.$refs.ruleForm.resetFields() }, //点击确定,添加新用户 addDialogUser() { this.$refs.ruleForm.validate(async valid => { // console.log(valid); if (!valid) return //通过就发起添加用户请求 const { data: res } = await userApi.addUserState(this.ruleForm) if (res.meta.status !== 200) { this.$message.success('添加用户成功') //隐藏添加用户的对话框 this.addDialog = false //刷新用户列表 this.getUser() } }) }, //修改用户信息 async showDialogUser(id) { // console.log(id); const { data: res } = await userApi.showUserState(id) if (res.meta.status !== 200) { return this.$message.error('查询用户信息失败') } this.showForm = res.data //展示修改框 this.showDialog = true }, //关闭对话框时重置修改input内容 resetShowDialog() { this.$refs.showForm.resetFields() }, // 提交修改内容 showDialogUsers() { this.$refs.showForm.validate(async val => { console.log(val); if (!val) return //请求修改 const { data: res } = await userApi.showUserStates(this.showForm.id, { email: this.showForm.email, mobile: this.showForm.mobile }) console.log(res); if (res.meta.status !== 200) { return this.$message.error('更新修改失败') } this.showDialog = false this.getUser() this.$message.success('更新修改成功') }) }, //权限分配 async settingUser(data) { this.userInfo = data console.log(this.userInfo); const { data: res } = await userApi.settingUsers('roles'); if (res.meta.status !==200) return this.$message.error("获取角色列表失败"); this.powerList=res.data this.powerDialog = true }, async powerUser(){ this.powerUser = true if(!this.selectedRoledId){ return this.$message.error("选择要分配的角色") } const { data:res}=await userApi.powerUsers(this.userInfo.id, { rid:this.selectedRoledId }) if(res.meta.status !==200){ return this.$message.error('更新角色失败') } this.$message.success("更新角色成功"); this.getUser(); this.powerDialog = false; } }, //确定分配权限 mounted(){ this.getUser(); }}</script>
权限管理模块
<template> <div> <!-- 面包屑导航 --> <Bread></Bread> <!-- 角色列表 --> <el-card> <el-row> <el-col> <el-button type="primary" @click="addRolesDialogVisible = true">添加角色</el-button> </el-col> </el-row> <el-table :data="rolelist" border stripe> <el-table-column type="expand"> <template slot-scope="scope"> <el-row :class="['bdbottom', i1 === 0 ? 'bdtop' : '', 'vcenter']" v-for="(item1, i1) in scope.row.children" :key="item1.id" > <!-- 一级 --> <el-col :span="5"> <el-tag>{ { item1.authName }}</el-tag> <i class="el-icon-caret-right"></i> </el-col> <!-- 二级+三级 --> <el-col :span="19"> <el-row :class="[i2 === 0 ? '' : 'bdtop', 'vcenter']" v-for="(item2, i2) in item1.children" :key="item2.id" > <el-col :span="6"> <el-tag type="success">{ { item2.authName }}</el-tag> <i class="el-icon-caret-right"></i> </el-col> <el-col :span="18"> <el-tag v-for="item3 in item2.children" :key="item3.id" type="warning" closable @close="removeRolesById(scope.row, item3.id)" >{ { item3.authName }}</el-tag> </el-col> </el-row> </el-col> </el-row> <!-- <pre>{ { scope.row }}</pre> --> </template> </el-table-column> <el-table-column type="index" prop="#"></el-table-column> <el-table-column label="角色名称" prop="roleName"></el-table-column> <el-table-column label="角色描述" prop="roleDesc"></el-table-column> <el-table-column label="操作"> <template slot-scope="scope"> <el-button type="primary" icon="el-icon-edit" size="mini" @click="showEditRolesDialog(scope.row.id)" >编辑</el-button> <el-button type="danger" icon="el-icon-delete" size="mini" @click="removeRoles(scope.row.id)" >删除</el-button> <el-button type="warning" icon="el-icon-setting" size="mini" @click="showSetRightDialog(scope.row)" >分配权限</el-button> </template> </el-table-column> </el-table> </el-card> <!-- 添加角色对话框 --> <el-dialog title="添加角色" :visible.sync="addRolesDialogVisible" width="50%" @close="addRolesDialogClosed" > <!-- :rules="addFormRules" --> <!-- :model="addForm" --> <el-form ref="addRolesRef" label-width="70px"> <!-- <el-form-item label="角色名" prop="Rolesname"> <el-input v-model="addForm.Rolesname"></el-input> </el-form-item> ---> </el-form> <!-- 底部 --> <span slot="footer" class="dialog-footer"> <el-button @click="addRolesDialogVisible = false">取 消</el-button> <el-button type="primary" @click="addRoles">确 定</el-button> </span> </el-dialog> <!-- 编辑角色的对话框 --> <el-dialog title="修改角色" :visible.sync="editRolesDialogVisible" width="50%" @close="editRolesDialogVisible" > <!-- 内容主体 --> <!-- :model="editRolesForm" --> <!-- :rules="editRolesFormRules" --> <el-form ref="editRolesFormRef" label-width="70px"> <!-- <el-form-item label="角色名"> <el-input v-model="editRolesForm.Rolesname" disabled></el-input> </el-form-item>--> </el-form> <!-- 底部 --> <span slot="footer" class="dialog-footer"> <el-button @click="editRolesDialogVisible = false">取 消</el-button> <el-button type="primary" @click="editRolesInfo">确 定</el-button> </span> </el-dialog> <!-- 分配权限的对话框 --> <el-dialog title="分配权限" :visible.sync="setRightDialogVisible" width="50%" @close="setRightDialogClosed" > <el-tree :data="rightslist" :props="treeProps" show-checkbox node-key="id" default-expand-all :default-checked-keys="defKeys" ref="treeRef" ></el-tree> <span slot="footer" class="dialog-footer"> <el-button @click="setRightDialogVisible = false">取 消</el-button> <el-button type="primary" @click="allotRights">确 定</el-button> </span> </el-dialog> </div></template><script>import Bread from '../Bread.vue';import rolesApi from './rolesApi'export default { components: { Bread }, // 组件状态值 data() { return { // 所有角色列表数据 rolelist: [], // 添加角色的对话框的显示隐藏 addRolesDialogVisible: false, // 编辑对话框的显示隐藏 editRolesDialogVisible: false, // 控制分配权限对话框的显示和隐藏 setRightDialogVisible: false, // 所有权限的数据 rightslist: [], // 树形控件的属性绑定对象 treeProps: { label: "authName", children: "children", }, // 默认选中的节点id值数组 defKeys: [], // 当前即将分配权限的角色id roleId: "", }; }, // 计算属性 computed: { }, // 侦听器 watch: { }, // 组件方法 methods: { // 获取所有的角色列表 async getRolesList() { const { data: res } = await rolesApi.getRoles(); if (res.meta.status !== 200) { return this.$message.error("获取角色列表失败"); } this.rolelist = res.data; console.log(this.rolelist); }, // 添加角色 addRoles() { this.$refs.addRolesRef.validate(async (valid) => { if (!valid) return; // 添加 const { data: res } = await rolesApi.addRole(this.addRolesForm); if (res.meta.status !== 200) { this.$message.error("添加角色失败"); } this.$message.success("添加角色成功"); // 隐藏对话框 this.addRolesDialogVisible = false; // 刷新角色列表 this.getRolesList(); }); }, // 关闭对话框 addRolesDialogClosed() { this.$refs.addRolesRef.resetFields(); }, // 编辑角色 async showEditRolesDialog(id) { console.log(id); this.editRolesDialogVisible = true; const { data: res } = await rolesApi.showEditRoles(id); if (res.meta.status !== 200) { return this.$message.error("查询角色失败"); } // this.editRolesForm = res.data; }, // 关闭对话框 editRolesDialogClosed() { this.$refs.editRolesFormRef.resetFields(); }, editRolesInfo() { this.$refs.editRolesFormRef.validate(async (valid) => { console.log(valid); if (!valid) return; // 发起修改角色的数据请求 const { data: res } = await rolesApi.editRoles(this.editRolesForm.id // { // email: this.editRolesForm.email, // mobile: this.editRolesForm.mobile, // } ); if (res.meta.status !== 200) { return this.$message.error("更新角色失败"); } // 关闭对话框 this.editRolesDialogVisible = false; // 刷新数据列表 this.getRolesList(); // 提示修改成功 this.$message.success("更新角色成功"); }); }, // 删除角色 async removeRoles(id) { console.log(id); // 确认删除弹框? const confirmResult = await this.$confirm("确定删除此角色吗?", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning", }).catch((err) => err); // 角色确认删除返回confirm 取消删除返回cancel console.log(confirmResult); if (confirmResult !== "confirm") { return this.$message.info("已取消删除"); } const { data: res } = await rolesApi.removeRol(id); console.log(res); if (res.meta.status !== 200) { this.$message.error("删除角色失败"); } this.$message.success("删除角色成功"); // 更新角色列表 this.getRolesList(); }, // 根据id删除对应的权限 async removeRolesById(role, rightId) { const confirmResult = await this.$confirm("确定删除此角色吗?", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning", }).catch((err) => err); if (confirmResult !== "confirm") { return this.$message.info("取消删除"); } // console.log('确认删除') const { data: res } = await rolesApi.removeRolesByIds(role.id,rightId); // console.log(res) if (res.meta.status !== 200) { return this.$message.error("删除权限失败"); } // this.getRolesList() role.children = res.data; }, // 分配权限 async showSetRightDialog(role) { //下一个函数的操作 this.roleId = role.id; // 获取所有权限的数据 const { data: res } = await rolesApi.SetRightDialog(); if (res.meta.status !== 200) { return this.$message.error("获取权限数据失败"); } // 把获取到的权限数据保存到data中 this.rightslist = res.data; this.getLeafKeys(role, this.defKeys); this.setRightDialogVisible = true; }, // 获取三级权限 getLeafKeys(node, arr) { if (!node.children) { return arr.push(node.id); } node.children.forEach((item) => { this.getLeafKeys(item, arr); }); }, // 监听分配权限对话框的关闭事件 setRightDialogClosed() { this.defKeys = []; }, // 分配权限 async allotRights() { const keys = [ ...this.$refs.treeRef.getCheckedKeys(), ...this.$refs.treeRef.getHalfCheckedKeys(), ]; // console.log(keys) const idStr = keys.join(","); const { data: res } = await rolesApi.allotRight(this.roleId,idStr); if (res.meta.status !== 200) { return this.$message.error('分配权限失败') } this.$message.success('分配权限成功') this.getRolesList() this.setRightDialogVisible = false }, }, // 以下是生命周期钩子 注:没用到的钩子请自行删除 beforeCreate() { }, created() { this.getRolesList(); }, beforeMount() { }, mounted() { }, beforeUpdate() { }, updated() { }, activated() { }, deactivated() { }, beforeDestroy() { }, destroyed() { },};</script>
发表评论
最新留言
不错!
[***.144.177.141]2025年03月21日 01时25分26秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
shell echo单行和多行文字定向写入到文件中
2019-03-06
cmp命令
2019-03-06
Linux 磁盘管理(df fu fdisk mkfs mount)
2019-03-06
jQuery的事件绑定与触发 - 学习笔记
2019-03-06
Linux上TCP的几个内核参数调优
2019-03-06
记一次讲故事机器人的开发-我有故事,让机器人来读
2019-03-06
seo 回忆录百度基本概念(一)
2019-03-06
netcore中使用session
2019-03-06
Android 开发学习进程0.25 自定义控件
2019-03-06
多媒体文件格式全解说(下)--图片
2019-03-06
淘宝WAP版小BUG分析
2019-03-06
asp.net打印网页后自动关闭网页【无需插件】
2019-03-06
【Maven】POM基本概念
2019-03-06
【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?
2019-03-06
【设计模式】单例模式
2019-03-06
远程触发Jenkins的Pipeline任务的并发问题处理
2019-03-06
entity framework core在独立类库下执行迁移操作
2019-03-06
Asp.Net Core 2.1+的视图缓存(响应缓存)
2019-03-06
【wp】HWS计划2021硬件安全冬令营线上选拔赛
2019-03-06