接下来我们开始编写此系统的用户管理页面,这个页面分为一个大部分两个小部分,即一个主要的用户管理页面,新增用户弹窗和编辑用户弹窗。需要我们创建一个User.vue(主要的用户管理页面),User下的Add.vue(新增用户弹窗)、Edit.vue(编辑用户弹窗)。
一、Add.vue(新增用户弹窗)
1.1 Add.vue 页面html部分:
<template>
<el-dialog title="新增管理员" :visible.sync="showFlag" custom-class="dialog-small" @close="closeDialog">
<el-form ref="formData" :model="formData" :rules="formRules" label-width="80px">
<el-form-item label="账号" prop="name">
<el-input v-model="formData.name" placeholder="请输入管理员账号"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="formData.password" placeholder="请输入密码"></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="formData.email" placeholder="请输入管理员邮箱"></el-input>
</el-form-item>
<el-form-item class="dialog-footer" align="center">
<el-button type="primary" @click="onSave('formData')">保 存</el-button>
<el-button @click="onCancel('formData')">取 消</el-button>
</el-form-item>
</el-form>
</el-dialog>
</template>
1.2 Add.vue 页面js部分:
<script>
import { userAdd } from '../../config/interface'
export default {
data () {
const validate = (rule, value, callback) => {
const reg = /^[0-9a-zA-Z]*$/g
if (!value) {
callback(new Error('请输入内容'))
} else if (value.length < 3 || value.length > 6) {
callback(new Error('内容长度需在 3 到 6 个字符'))
} else if (!reg.test(value)) {
callback(new Error('内容需为字母或数字'))
} else {
callback()
}
}
return {
showFlag: false,
formData: {
name: null,
password: null,
email: null
},
formRules: {
name: [
{ validator: validate, trigger: 'blur' }
],
password: [
{ validator: validate, trigger: 'blur' }
],
email: [
{ type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur' }
]
},
reqFlag: {
add: true
}
}
},
components: {
},
created () {
},
methods: {
// 初始化
init () {
this.$nextTick(() => {
this.changeShowFlag()
})
},
changeShowFlag () {
this.showFlag = !this.showFlag
},
// 保存
onSave (formData) {
this.$refs[formData].validate((valid) => {
if (valid) {
const url = userAdd
if (this.reqFlag.add) {
this.reqFlag.add = false
let params = {
name: this.formData.name,
password: this.$md5(this.formData.password),
email: this.formData.email
}
this.$http(url, params)
.then(res => {
if (res.code == 1) {
this.$common.toast('添加成功', 'success', false)
this.$emit('addCallBack')
this.onCancel(formData)
}
this.reqFlag.add = true
})
}
} else {
console.log('error submit!!')
return false
}
})
},
// 取消
onCancel (formName) {
this.changeShowFlag()
this.$refs[formName].resetFields()
},
// 关闭弹出框
closeDialog () {
this.$refs['formData'].resetFields()
}
}
}
</script>
1.3 Add.vue 页面展示
二、Edit.vue(新增用户弹窗)
2.1 Edit.vue 页面html部分:
<template>
<el-dialog title="编辑管理员" :visible.sync="showFlag" custom-class="dialog-small" @close="closeDialog">
<el-form ref="formData" :model="formData" :rules="formRules" label-width="80px">
<el-form-item label="账号" prop="name">
<el-input v-model="formData.name" placeholder="请输入管理员账号"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="formData.password" placeholder="请输入密码"></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="formData.email" placeholder="请输入管理员邮箱"></el-input>
</el-form-item>
<el-form-item class="dialog-footer" align="center">
<el-button type="primary" @click="onSave('formData')">保 存</el-button>
<el-button @click="onCancel('formData')">取 消</el-button>
</el-form-item>
</el-form>
</el-dialog>
</template>
2.2 Edit.vue 页面js部分:
<script>
import { userDetail, userUpdateInfo } from '../../config/interface'
export default {
data () {
const validate = (rule, value, callback) => {
const reg = /^[0-9a-zA-Z]*$/g
if (!value) {
callback(new Error('请输入内容'))
} else if (value.length < 3 || value.length > 6) {
callback(new Error('内容长度需在 3 到 6 个字符'))
} else if (!reg.test(value)) {
callback(new Error('内容需为字母或数字'))
} else {
callback()
}
}
return {
showFlag: false,
formData: {
name: null,
password: null,
email: null
},
formRules: {
name: [
{ validator: validate, trigger: 'blur' }
],
password: [
{ validator: validate, trigger: 'blur' }
],
email: [
{ type: 'email', message: '请输入正确的邮箱地址', trigger: 'blur' }
]
},
reqFlag: {
edit: true
}
}
},
components: {
},
created () {
},
methods: {
// 初始化
init (id) {
this.$nextTick(() => {
this.id = id
this.getUserDetail()
console.log('this.id==' + this.id)
this.changeShowFlag()
})
},
changeShowFlag () {
this.showFlag = !this.showFlag
},
getUserDetail () {
const url = userDetail
let params = {
id: this.id
}
this.$http(url, params)
.then(res => {
if (res.code == 1) {
let data = res.data
this.formData = {
name: data.name,
password: null,
email: data.email
}
}
})
},
// 保存
onSave (formData) {
this.$refs[formData].validate((valid) => {
if (valid) {
const url = userUpdateInfo
if (this.reqFlag.edit) {
this.reqFlag.edit = false
let params = {
id: this.id,
name: this.formData.name,
password: this.$md5(this.formData.password),
email: this.formData.email
}
this.$http(url, params)
.then(res => {
if (res.code == 1) {
this.$common.toast('修改成功', 'success', false)
this.$emit('editCallBack')
this.onCancel(formData)
}
this.reqFlag.edit = true
})
}
} else {
console.log('error submit!!')
return false
}
})
},
// 取消
onCancel (formName) {
this.changeShowFlag()
this.$refs[formName].resetFields()
},
// 关闭弹出框
closeDialog () {
this.$refs['formData'].resetFields()
}
}
}
</script>
2.3 Edit.vue 页面展示:
三、User.vue(用户管理主页面)
2.1 User.vue 页面html部分:
<template>
<div class="user-wrap">
<!-- 搜索框 start -->
<el-form v-if="userPower" class="main-search" :inline="true" :model="keywords" ref="keywords" :rules="searchRules" label-position="left" label-width="85px" size="medium">
<el-row>
<el-col :span="6">
<el-form-item label="管理员ID" prop="id">
<el-input type="number" v-model.number="keywords.id" placeholder="请输入管理员ID"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="管理员名称" prop="name">
<el-input type="text" v-model="keywords.name" placeholder="请输入管理员名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="管理员邮箱" prop="email">
<el-input type="text" v-model="keywords.email" placeholder="请输入管理员邮箱"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item>
<el-button type="primary" @click="onSearch">搜索</el-button>
<el-button @click="onReset('keywords')">重置</el-button>
</el-form-item>
</el-row>
</el-form>
<!-- 搜索框 end -->
<!-- 分割线 start -->
<div v-if="userPower" class="hr-10"></div>
<!-- 分割线 end -->
<div class="main-content">
<div v-if="userPower" class="content-header">
<el-button type="primary" size="medium" @click="handleAdd">新增管理员</el-button>
</div>
<el-table v-loading="!this.reqFlag.search" :data="tableData" header-row-class-name="table-header" border>
<el-table-column prop="id" label="ID" align="center" width="120"></el-table-column>
<el-table-column prop="name" label="账号" align="center"></el-table-column>
<el-table-column prop="email" label="邮箱" align="center"></el-table-column>
<el-table-column prop="role" label="身份" align="center"></el-table-column>
<el-table-column prop="create_time" label="创建时间" align="center"></el-table-column>
<el-table-column prop="update_time" label="更新时间" align="center"></el-table-column>
<el-table-column v-if="userPower" label="状态" align="center">
<template slot-scope="scope">
<el-select size="mini" class="state-select" :class="{'text-danger': scope.row.state==2}" v-model="scope.row.state" :disabled="scope.row.type==1" placeholder="请选择" @change="updateState(scope.row.id,scope.row.state)">
<el-option
v-for="item in stateOptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="200">
<template slot-scope="scope">
<el-button :disabled="scope.row.type==1" size="mini" @click="handleEdit(scope.row.id)">编辑</el-button>
<el-button v-if="userPower" :disabled="scope.row.type==1" size="mini" type="danger" plain @click="handleDelete(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@current-change="handleCurrentChange"
:current-page.sync="currentPage"
:page-size="pageSize"
layout="total, prev, pager, next"
:total="totalCount">
</el-pagination>
</div>
<!-- 新增用户 start -->
<Add v-if="showFlag.add" ref="add" @addCallBack="callBackAdd"/>
<!-- 新增用户 end -->
<!-- 编辑用户 start -->
<Edit v-if="showFlag.edit" ref="edit" @editCallBack="callBackEdit"/>
<!-- 编辑用户 end -->
</div>
</template>
2.2 User.vue 页面js部分:
<script>
import { userList, userUpdateState } from '@/config/interface'
import Add from '@/components/User/Add'
import Edit from '@/components/User/Edit'
export default {
data () {
return {
keywords: {
id: null,
name: null,
email: null
},
keywordsParams: {}, // 搜索请求是的搜索入参
searchRules: {
},
reqFlag: { // 防止频繁点击,造成连续多次发请求
search: true,
state: true,
delete: true
},
pageNum: 1, // 请求第几页
pageSize: this.$store.state.pageSize, // 每页请求多少条
currentPage: 1, // 初始时在第几页
totalCount: 0, // 总共多少条数据
tableData: [],
showFlag: {
add: false,
edit: false
},
stateOptions: [{ // 下拉框-状态
value: '1',
label: '启用'
}, {
value: '2',
label: '禁用'
}]
}
},
components: {
Add,
Edit
},
computed: {
userType: function () {
let userType = this.$store.state.userInfo.type
return userType
},
userPower: function () {
let userType = this.$store.state.userInfo.type
return userType == 1
}
},
created () {
this.keywordsParams = JSON.parse(JSON.stringify(this.keywords))
this.queryUserList()
},
methods: {
queryUserList () {
const url = userList
if (this.reqFlag.search) {
this.reqFlag.search = false
let params = {
searchId: this.keywordsParams.id,
searchName: this.keywordsParams.name,
searchEmail: this.keywordsParams.email,
userType: this.userType,
pageNum: this.pageNum,
pageSize: this.pageSize
}
this.$http(url, params)
.then(res => {
if (res.code == 1) {
let data = res.data
this.tableData = data.list
this.totalCount = data.totalCount
this.currentPage = this.pageNum
}
this.reqFlag.search = true
})
}
},
onSearch () {
this.pageNum = 1
this.keywordsParams = JSON.parse(JSON.stringify(this.keywords))
this.queryUserList()
},
handleCurrentChange (val) {
this.pageNum = val
this.queryUserList()
},
onReset (formName) {
this.$refs[formName].resetFields()
this.pageNum = 1
this.keywordsParams = JSON.parse(JSON.stringify(this.keywords))
this.queryUserList()
this.curPage = 1
},
handleAdd () {
this.showFlag.add = true
this.$nextTick(() => {
this.$refs.add.init()
})
},
handleEdit (id) {
this.showFlag.edit = true
this.$nextTick(() => {
this.$refs.edit.init(id)
})
},
handleDelete (id) {
this.$common.msgBox('confirm', '操作提示', '是否确定删除此管理员?', () => {
const url = userUpdateState
if (this.reqFlag.delete) {
this.reqFlag.delete = false
let params = {
id: id
}
this.$http(url, params)
.then(res => {
if (res.code == 1) {
this.$common.toast('删除成功', 'success', false)
this.queryUserList()
}
this.reqFlag.delete = true
})
}
})
},
updateState (id, state) {
const url = userUpdateState
if (this.reqFlag.state) {
this.reqFlag.state = false
let params = {
id: id,
state: !state ? null : state
}
this.$http(url, params)
.then(res => {
if (res.code == 1) {
this.$common.toast('修改成功', 'success', false)
this.queryUserList()
}
this.reqFlag.state = true
})
}
},
// 新增管理员子组件回调
callBackAdd () {
this.onReset('keywords')
this.pageNum = 1
this.queryUserList()
this.curPage = 1
},
// 编辑管理员子组件回调
callBackEdit () {
this.queryUserList()
}
}
}
</script>
3.3 User.vue 页面展示:
四、项目链接
周报管理系统git仓库链接: nodeJs工作周报后台管理系统OA模板