这个模块的功能还是比较好实现的,主要还是一些调用借口的增删改查,和之前组织架构的内容相比相差不大
实现角色管理静态页面搭建
views/setting/index.vue
新增角色
分配权限
编辑
删除
el-tabs和el-tab-pane的关系是什么?
答案
封装获取角色列表接口,需要添加一个文件,src/api/setting.js
内容如下:
// 导入axios实例
import request from '@/utils/request'
/**
* @description 获取所有角色信息
* @param {*} params {page, pagesize}
* @returns
*/
export function getRolesAPI(params) {
return request({
url: '/sys/role',
method: 'GET',
params: params
})
}
在 src/views/settings/index.vue
业务组件中调用接口
别忘了,在api/index.js, 引入导出settings.js接口方法
import { getRolesAPI } from '@/api'
export default {
// ...其他
created() {
// 调用获取角色列表的方法
this.getRolesList()
},
methods: {
// 获取角色列表
async getRolesList() {
// 发起请求
const res = await getRolesAPI(this.query)
// 根据返回的状态码进行业务处理
if (!res.success) return this.$message.error(res.message)
// 将返回的数据进行赋值
this.rolesList = res.data.rows
this.total = res.data.total
},
// ...其他
}
}
渲染表格
新增角色
分配权限
编辑
删除
预览效果
el-table表格如何使用?
答案
读取并渲染公司信息数据, 渲染当前登录用户的公司信息
封装获取公司信息数据的 API
/**
* @description 获取公司信息
* @param {*} companyId
* @returns
*/
export function getCompanyInfoAPI(companyId) {
return request({
url: `/company/${companyId}`
})
}
将 companyId 处理成 Getters 属性
const getters = {
companyId: state => state.user.userInfo.companyId // 公司 ID
}
在 src\views\setting\index.vue
组件中利用辅助函数导入 companyId
import { mapGetters } from 'vuex'
data(){
return {
// ...其他选项
formData: {} // 公司信息对象
}
},
computed: {
...mapGetters(['companyId'])
},
created() {
// ...其他
// 调用获取公司信息的方法
this.getCompanyInfo()
},
methods: {
// 获取的公司的信息
async getCompanyInfo() {
const res = await getCompanyInfoAPI(this.companyId)
if (!res.success) return this.$message.error(res.message)
this.formData = res.data
}
}
渲染页面
预览效果
当前登录的角色, 公司信息如何获取回来的?
答案
实现添加角色弹框的展示
对弹框的布局进行绘制
取消
确定
绑定页面需要使用的数据
data() {
return {
// ...其他选项
showDialog: false, // 控制弹框的隐藏和展示
// 添加角色
roleForm: {
name: '',
description: ''
},
// 添加角色验证
roleRules: {
name: [
{ required: true, message: '角色名称不能为空', trigger: 'blur' }
],
description: [
{ required: true, message: '角色描述不能为空', trigger: 'blur' }
]
}
}
}
绑定页面需要使用的事件
methods: {
// ...其他
// 角色弹框-> 确定按钮
roleSubmit() {
this.showDialog = false
},
// 角色弹框-> 取消按钮
cancleRoles() {
this.showDialog = false
}
}
点击添加角色按钮,显示弹框
新增角色
点击左上角新增角色看是否出现, 点击确定和取消看是否隐藏
el-form表单校验需要配置的是哪几项?
答案
完成添加角色的功能
封装添加角色功能的 API
点击确定按钮进行表单校验,校验通过以后,调用接口,成功调用之后要完成三件事情
在 src\api\setting.js
文件中封装添加角色功能的 API
/**
* @description: 新增角色
* @param {*} data {name,description}
* @return {*}
*/
export function addRoleAPI(data) {
return request({
url: '/sys/role',
method: 'post',
data
})
}
在 src\views\setting\index.vue
文件中导入 API 方法,并在确定的事件处理程序中调用
import { addRoleAPI } from '@/api'
// 角色弹框-> 确定按钮
roleSubmit() {
this.$refs.roleForm.validate(async valid => {
if (valid) {
// 调用新增角色的 API
const res = await addRoleAPI(this.roleForm)
// 根据状态码判断请求成功与否
if (!res.success) return this.$message.error(res.message)
// 添加成功,给用户进行提示
this.$message.success(res.message)
// 重新获取权限列表数据
this.getRolesList()
// 隐藏弹框
this.showDialog = false
}
})
}
业务问题, 这个角色功能到底有什么用?
答案
分析出编辑角色的基本步骤和思路
编辑
按钮要点
我们编辑角色的思路是?
答案
封装获取当前角色数据的 API 方法
/**
* @description: 获取某一个角色列表
* @param {*} id
* @return {*}
*/
export function getRoleIdAPI(id) {
return request({
url: `/sys/role/${id}`
})
}
点击编辑,获取当前这一行数据
编辑
// 编辑角色
async editRoles(dataObj) {
// 调用接口,获取需要编辑的角色数据
const res = await getRoleIdAPI(dataObj.id)
if (!res.success) return this.$message.error(res.message)
this.roleForm = res.data
// 让弹框展示
this.showDialog = true
},
数据赋值给 roleForm 以后,数据就会展示在弹框中
编辑角色数据传递的ID指的是什么?
答案
实现用户编辑功能的完成
判断是新增还是编辑角色
data() {
return {
// ...其他选项
isEdit: false // 是否处于编辑状态
}
}
methods: {
// 新增角色 - 按钮点击事件
addRoleBtn() {
this.isEdit = false // 现在不是编辑状态
this.showDialog = true // 弹窗出现
},
// 编辑角色
async editRoles(id) {
// 是否编辑状态
this.isEdit = true
// 调用接口,获取需要编辑的角色数据
const res = await getRoleId(id)
if (!res.success) return this.$message.error(res.message)
this.roleForm = res.data
// 让弹框展示
this.showDialog = true
}
}
封装编辑功能的 API
/**
* @description: 编辑角色
* @param {*} data
* @return {*}
*/
export function updateRoleAPI(data) {
return request({
url: `/sys/role/${data.id}`,
method: 'put',
data
})
}
在组件中导入 API,并调用
import { updateRoleAPI } from '@/api'
// 角色弹框-> 确定按钮
roleSubmit() {
this.$refs.roleForm.validate(async valid => {
if (valid) {
if (!this.isEdit) {
// 调用新增角色的 API
const res = await addRoleAPI(this.roleForm)
// 根据状态码判断请求成功与否
if (!res.success) return this.$message.error(res.message)
// 添加成功,给用户进行提示
this.$message.success(res.message)
} else {
// 调用编辑角色的 API
const res = await updateRoleAPI(this.roleForm)
// 根据状态码判断请求成功与否
if (!res.success) return this.$message.error(res.message)
// 编辑成功,给用户进行提示
this.$message.success(res.message)
}
// 重新获取权限列表数据
this.getRolesList()
// 隐藏弹框
this.showDialog = false
}
})
}
实现弹框提示改变
编辑和新增最大的区别在哪里?
答案
实现角色管理页面的分页功能
之前已经定义分页需要绑定的参数,并传递给请求角色列表的方法
methods: {
// 获取角色列表
async getRolesList() {
// 发起请求
const res = await getRolesAPI(this.query)
// 根据返回的状态码进行业务处理
if (!res.success) return this.$message.error(res.message)
// 将返回的数据进行赋值
this.rolesList = res.data.rows
this.total = res.data.total
}
}
监听页面显示的条数是否改变
methods: {
// 每页显示的条数发生改变时触发
handleSizeChange(newSize) {
this.query.pagesize = newSize
this.getRolesList()
},
}
监听页码是否发生改变
methods: {
// 当前页面发生改变时触发
handleCurrentChange(newPage) {
this.query.page = newPage
this.getRolesList()
},
}
分页功能实现的思路是?
答案
实现删除角色的功能
封装删除角色的 API,并在组件中导入
/**
* @description: 删除角色
* @param {*} id 角色id
* @return {*}
*/
export function deleteRoleAPI(id) {
return request({
url: `/sys/role/${id}`,
method: 'delete'
})
}
import { deleteRoleAPI } from '@/api'
显示确认对话框
// 删除角色
async deleteRole(dataObj) {
// 显示删除询问对话框
const delRes = await this.$confirm('此操作将永久删除该角色, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).catch(err => err)
console.log(delRes)
}
标签传递数据对象下来
删除
调用接口,实现删除功能
// 删除角色
async delRoles(dataObj) {
// 显示删除询问对话框
const delRes = await this.$confirm('此操作将永久删除该角色, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).catch(err => err)
// 用户点击了取消,给用户进行提示
if (delRes === 'cancel') return this.$message.info('您取消了删除')
// 调用删除的 API
const res = await deleteRoleAPI(dataObj.id)
// 根据返回的状态码进行错误提示
if (!res.success) return this.$message.error(res.message)
// 删除成功后的提示
this.$message.success(res.message)
// 重新获取数据
this.getRolesList()
},
删除功能实现的思路是?
答案
解决删除最后一页的最一条数据之后,页面会显示不正常
如果删除第最后一页 (假设是第2页) 的最一条数据之后,再发请求,还是求的第2页,而此时,后端已经求不到第2 页的数据了(被删除了)
在删除成功之后,去检测一下,是否当前删除的是当前页最后一条数据,如果是,就把页码-1,再发请求
methods: {
// 删除角色
async delRoles(id) {
// 显示删除询问对话框
const delRes = await this.$confirm('此操作将永久删除该角色, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).catch(err => err)
// 用户点击了取消,给用户进行提示
if (delRes === 'cancel') return this.$message.info('您取消了删除')
// 调用删除的 API
const res = await deleteRoleAPI(id)
// 根据返回的状态码进行错误提示
if (!res.success) return this.$message.error(res.message)
// 删除成功后的提示
this.$message.success(res.message)
// 判断当前数据的长度是否等于 1
if (this.rolesList.length === 1) {
this.query.page--
// 如果是第一页的第一条
if (this.query.page === 0) {
this.query.page = 1
}
}
// 重新获取数据
this.getRolesList()
}
为何最后一页, 删除最后一条会有问题?
答案
针对删除最后一页, 最后一条的bug如何解决?
答案
在弹框关闭以后,清空弹框中表格的数据
dialog身上绑定close事件
创建清除数据的方法, 在取消里
methods: {
// 关闭角色弹框
closeRoleDialog() {
this.$refs.roleForm.resetFields()
this.showDialog = false
}
}
先点击编辑, 后点击新增时, 为何表单里会有刚才的数据?
答案
如何处理上面的问题?
答案