User.vue
~~~<template>
<div>
<!-- 面包屑导航 -->
<el-breadcrumb separator-class="el-icon-arrow-right">
<el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item>
<el-breadcrumb-item>用户管理</el-breadcrumb-item>
<el-breadcrumb-item>用户列表</el-breadcrumb-item>
</el-breadcrumb>
<!-- 卡片视图区域 -->
<el-card>
<!-- 搜索与添加区域 layou布局 之间间隔 row-->
<el-row :gutter="100">
<el-col :span="7">
<el-input placeholder="请输入内容" v-model="queryInfo.query" clearable @clear="getUserList">
<el-button slot="append" icon="el-icon-search" @click="getUserList"></el-button>
</el-input>
</el-col>
<el-col :span="4">
<el-button type="primary" @click="addDialogVisible=true">添加用户</el-button>
</el-col>
</el-row>
<!-- 用户列表(表格)区域 -->
<el-table :data="userList" border stripe>
<el-table-column type="index"></el-table-column>
<el-table-column label="姓名" prop="username"></el-table-column>
<el-table-column label="邮箱" prop="email"></el-table-column>
<el-table-column label="电话" prop="mobile"></el-table-column>
<el-table-column label="角色" prop="role_name"></el-table-column>
<el-table-column label="状态">
<template slot-scope="scope">
<el-switch v-model="scope.row.mg_state" @change="userStateChanged(scope.row)"></el-switch>
</template>
</el-table-column>
<el-table-column label="操作" width="180px">
<template slot-scope="scope">
<!-- 修改 -->
<el-button type="primary" icon="el-icon-edit" size='mini' @click="showEditDialog(scope.row.id)"></el-button>
<!-- 删除 -->
<el-button type="danger" icon="el-icon-delete" size='mini' @click="deleteUser(scope.row.id)"></el-button>
<!-- 分配角色 -->
<el-tooltip class="item" effect="dark" content="分配角色" placement="top" :enterable="false">
<el-button type="warning" icon="el-icon-setting" size='mini' @click="showRolesDialog(scope.row)"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<!-- 分页导航区域
@size-change(pagesize改变时触发)
@current-change(页码发生改变时触发)
:current-page(设置当前页码)
:page-size(设置每页的数据条数)
:total(设置总页数) -->
<el-pagination @size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="queryInfo.pagenum"
:page-sizes="[1, 2, 5, 10]"
:page-size="queryInfo.pagesize" layout="total, sizes, prev, pager, next, jumper"
:total="total">
</el-pagination>
</el-card>
<!-- 添加用户对话框组件 :visible.sync(设置是否显示对话框) width(设置对话框的宽度)
:before-close(在对话框关闭前触发的事件) -->
<el-dialog title="添加用户" :visible.sync="addDialogVisible" width="50%" @close="addDialogClosed">
<!-- 对话框主体区域 -->
<el-form :model="addForm" :rules="addFormRules" ref="addFormRef" label-width="70px">
<el-form-item label="用户名" prop="username">
<el-input v-model="addForm.username"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="addForm.password"></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="addForm.email"></el-input>
</el-form-item>
<el-form-item label="电话" prop="mobile">
<el-input v-model="addForm.mobile"></el-input>
</el-form-item>
</el-form>
<!-- 对话框底部区域 -->
<span slot="footer" class="dialog-footer">
<el-button @click="addDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="addUser" >确 定</el-button>
</span>
</el-dialog>
<!-- 修改用户组件 -->
<el-dialog title="修改用户" :visible.sync="editDialogVisible" width="50%" @close="editDialogClosed">
<!-- 对话框主体区域 disabled禁用状态-->
<el-form :model="editForm" :rules="editFormRules" ref="editFormRef" label-width="70px">
<el-form-item label="用户名">
<el-input v-model="editForm.username" disabled></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="editForm.email"></el-input>
</el-form-item>
<el-form-item label="电话" prop="mobile">
<el-input v-model="editForm.mobile"></el-input>
</el-form-item>
</el-form>
<!-- 对话框底部区域 -->
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="editUser" >确 定</el-button>
</span>
</el-dialog>
<!-- 分配角色对话框 -->
<el-dialog
title="分配用户角色"
:visible.sync="setRolesDialogClosed"
width="50%" @close="setRolesDialog">
<div>
<p>当前的用户:{{userInfo.username}}</p>
<p>当前的角色:{{userInfo.role_name}}</p>
<p>分配新角色:
<template>
<el-select v-model="selectedRoleId" placeholder="请选择">
<el-option
v-for="item in roleList"
:key="item.id"
:label="item.roleName"
:value="item.id">
</el-option>
</el-select>
</template>
</p>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="setRolesDialogClosed = false">取 消</el-button>
<el-button type="primary" @click="saveRoleInfo">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
data() {
var checkEmail = (rule, value, cb) => {
const regEmail = /^\w+@\w+(\.\w+)+$/
if (regEmail.test(value)) {
return cb()
}
cb(new Error('请输入合法的邮箱'))
}
var checkMobile = (rule, value, cb) => {
const regMobile = /^1[34578]\d{9}$/
if (regMobile.test(value)) {
return cb()
}
cb(new Error('请输入合法的手机号码'))
}
return {
queryInfo: {
query: '',
pagenum: 1,
pagesize: 2
},
userList: [],
total: 0,
addDialogVisible: false,
addForm: {
username: '',
password: '',
email: '',
mobile: ''
},
addFormRules: {
username: [
{ required: true, message: '请输入用户名称', trigger: 'blur' },
{
min: 3,
max: 10,
message: '用户名在3~10个字符之间',
trigger: 'blur'
}
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{
min: 6,
max: 15,
message: '用户名在6~15个字符之间',
trigger: 'blur'
}
],
email: [
{ required: true, message: '请输入邮箱', trigger: 'blur' },
{ validator:checkEmail, message: '邮箱格式不正确,请重新输入', trigger: 'blur'}
],
mobile: [
{ required: true, message: '请输入手机号码', trigger: 'blur' },
{ validator:checkMobile, message: '手机号码不正确,请重新输入', trigger: 'blur'}
]
},
editDialogVisible: false,
editForm: [],
editFormRules: {
email: [
{ required: false, message: '请输入邮箱', trigger: 'blur' },
{ validator:checkEmail, message: '邮箱格式不正确,请重新输入', trigger: 'blur'}
],
mobile: [
{ required: false, message: '请输入手机号码', trigger: 'blur' },
{ validator:checkMobile, message: '手机号码不正确,请重新输入', trigger: 'blur'}
]
},
setRolesDialogClosed: false,
userInfo: {},
roleList: [],
selectedRoleId: ''
}
},
created() {
this.getUserList()
},
methods: {
async getUserList() {
const {data: res} = await this.$http.get('users', {
params: this.queryInfo
})
if (res.meta.status !== 200)
return this.$message.error('获取用户列表失败')
this.userList = res.data.users;
this.total = res.data.total;
},
handleSizeChange(newSize) {
this.queryInfo.pagesize = newSize;
this.getUserList();
},
handleCurrentChange( current ) {
this.queryInfo.pagenum = current;
this.getUserList();
},
async userStateChanged(row) {
const { data: res } = await this.$http.put(
`users/${row.id}/state/${row.mg_state}`
)
if (res.meta.status !== 200) {
row.mg_state = !row.mg_state
return this.$message.error('修改状态失败')
}
this.$message.success('更新状态成功')
},
addDialogClosed(){
this.$refs.addFormRef.resetFields();
},
addUser(){
this.$refs.addFormRef.validate( async valid => {
if(!valid) return this.$message.error("请填写完整用户信息");
const {data:res} = await this.$http.post("users",this.addForm)
if (res.meta.status !== 201)
return this.$message.error('添加用户失败')
this.$message.success("添加用户成功")
this.addDialogVisible = false
this.getUserList()
} )
},
async showEditDialog(id) {
const {data: res} = await this.$http.get('users/'+ id)
if(res.meta.status !== 200){
return this.$message.error('查询用户失败')
}
this.editForm = res.data;
this.editDialogVisible = true;
},
editUser(){
this.$refs.editFormRef.validate( async valid => {
if(!valid) return this.$message.error('请填写完整的修改后的用户信息');
const {data: res} = await this.$http.put('users/'+this.editForm.id,
{email:this.editForm.email, mobile:this.editForm.mobile})
if(res.meta.status !== 200){
return this.$message.error('修改用户失败')
}
this.$message.success('修改用户成功');
this.editDialogVisible = false;
this.getUserList();
})
},
editDialogClosed() {
this.$refs.editFormRef.resetFields();
},
async deleteUser(id){
const confirmResult = await this.$confirm('此操作将永久删除该用户, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).catch(err => err);
if(confirmResult !== 'confirm'){
return this.$message.info('已取消删除')
}
const {data: res} = await this.$http.delete('users/' + id)
if(res.meta.status !== 200) return this.$message.error('删除用户失败')
this.$message.success('删除用户成功');
this.getUserList();
},
async showRolesDialog (userInfo) {
this.userInfo = userInfo
const { data:res } = await this.$http.get("roles")
if(res.meta.status !== 200){
return this.$message.error('获取用户列表失败');
}
this.roleList = res.data;
this.setRolesDialogClosed = true;
},
async saveRoleInfo() {
if(!this.selectedRoleId){
return this.$message.error('请选择要分配的角色')
}
const {data:res} = await this.$http.put(`users/${this.userInfo.id}/role`, {
rid: this.selectedRoleId
})
console.log(res);
if(res.meta.status !== 200){
return this.$message.error('更新角色失败')
}
this.$message.success('更新角色成功')
this.getUserList();
this.setRolesDialogClosed = false;
},
setRolesDialog() {
this.selectedRoleId = ''
this.userInfo = {}
}
}
}
</script>
<style lang="less" scoped>
</style>