VUE通用后台管理(2)

一、用户管理页面功能form页面编写

新增按钮:

在User.vue中引入element-ui中的dialog组件

<template>
    <div class="manage">
        <el-dialog
            title="提示"
            :visible.sync="dialogVisible"
            width="30%">
            <span>这是一段信息</span>
            <span slot="footer" class="dialog-footer">
                <el-button @click="dialogVisible = false">取 消</el-button>
                <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
            </span>
        </el-dialog>
        <div class="manage-header">
            <el-button @click="dialogVisible = true" type="primary">
                + 新增
            </el-button>
        </div>
    </div>
</template>
<script>
    export default {
        data(){
            return{
                dialogVisible:false
            }
        }
    }

</script>

制作新增按钮页面:

 通过incline=“true”使属性框横向显示

<el-option label="男" value="1"></el-option>
                        <el-option label="女" value="0"></el-option>
                    </el-select>
                </el-form-item>
                <el-form-item label="出生日期">
                    <el-date-picker
                        v-model="form.birth"
                        type="date"
                        placeholder="选择日期">
                    </el-date-picker>
                </el-form-item>
                <el-form-item label="地址">
                    <el-input placeholder="请输入地址" v-model="form.addr"></el-input>
                </el-form-item>
            </el-form>
            <span slot="footer" class="dialog-footer">
                <el-button @click="dialogVisible = false">取 消</el-button>
                <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
            </span>
        </el-dialog>
        <div class="manage-header">
            <el-button @click="dialogVisible = true" type="primary">
                + 新增
            </el-button>
        </div>
    </div>
</template>

 

二、用户管理页面功能form新增功能编写

添加未输入提示功能:

全部提示

rules:{
                    name:[
                        { required:true,message: '请输入姓名' }
                    ],
                    age:[
                        { required:true,message: '请输入年龄' }
                    ],
                    sex:[
                        { required:true,message: '请选择性别' }
                    ],
                    birth:[
                        { required:true,message: '请选择出生日期' }
                    ],
                    addr:[
                        { required:true,message: '请填写地址' }
                    ],

 <!-- 用户的表单信息 -->
            <el-form ref="form" :rules="rules" :inline="true" :model="form" label-width="80px">
                <el-form-item label="姓名" prop="name">
                    <el-input placeholder="请输入姓名" v-model="form.name"></el-input>
                </el-form-item>
                <el-form-item label="年龄" prop="age">
                    <el-input placeholder="请输入年龄" v-model="form.age"></el-input>
                </el-form-item>
                <el-form-item label="性别" prop="sex">
                    <el-select v-model="form.sex" placeholder="请选择">
                        <el-option label="男" value="1"></el-option>
                        <el-option label="女" value="0"></el-option>
                    </el-select>
                </el-form-item>
                <el-form-item label="出生日期" prop="birth">
                    <el-date-picker
                        v-model="form.birth"
                        type="date"
                        placeholder="选择日期">
                    </el-date-picker>
                </el-form-item>
                <el-form-item label="地址" prop="addr">
                    <el-input placeholder="请输入地址" v-model="form.addr"></el-input>
                </el-form-item>
            </el-form>

确定按钮: 

 

对表单数据处理: 

校验通过,拿到数据

 实现关闭弹窗并清空表单和取消按钮的功能:

 取消按钮

                                ​​​​​​​         

完整代码

     methods:{
            //提交用户表单
            submit() {
                this.$refs.form.validate((valid) => {
                    // console.log(valid,'valid')
                    if(valid){
                        //后续对表单数据的处理
                        console.log(this.form,'form')

                        //清空表单的数据
                        this.$refs.form.resetFields()

                        //关闭弹窗
                        this.dialogVisible = false 
                    }
                })
            },
            //弹窗关闭的时候
            handleClose() {
                // console.log(this.$refs.form)
                this.$refs.form.resetFields()
                this.dialogVisible = false
            },
            cancel() {
                this.handleClose()
            }
        }

三、用户管理页面table数据获取

引入element-ui中的table组件到User.vue中

 

<template>
    <div class="manage">
        <el-dialog
            title="提示"
            :visible.sync="dialogVisible"
            width="40%"
            :before-close="handleClose">
            <!-- 用户的表单信息 -->
            <el-form ref="form" :rules="rules" :inline="true" :model="form" label-width="80px">
                <el-form-item label="姓名" prop="name">
                    <el-input placeholder="请输入姓名" v-model="form.name"></el-input>
                </el-form-item>
                <el-form-item label="年龄" prop="age">
                    <el-input placeholder="请输入年龄" v-model="form.age"></el-input>
                </el-form-item>
                <el-form-item label="性别" prop="sex">
                    <el-select v-model="form.sex" placeholder="请选择">
                        <el-option label="男" value="1"></el-option>
                        <el-option label="女" value="0"></el-option>
                    </el-select>
                </el-form-item>
                <el-form-item label="出生日期" prop="birth">
                    <el-date-picker
                        v-model="form.birth"
                        type="date"
                        placeholder="选择日期">
                    </el-date-picker>
                </el-form-item>
                <el-form-item label="地址" prop="addr">
                    <el-input placeholder="请输入地址" v-model="form.addr"></el-input>
                </el-form-item>
            </el-form>
            <span slot="footer" class="dialog-footer">
                <el-button @click="cancel">取 消</el-button>
                <el-button type="primary" @click="submit">确 定</el-button>
            </span>
        </el-dialog>
        <div class="manage-header">
            <el-button @click="dialogVisible = true" type="primary">
                + 新增
            </el-button>
            <el-table
            :data="tableData"
            style="width: 100%">
                <el-table-column
                    prop="date"
                    label="日期"
                    width="180">
                </el-table-column>
                <el-table-column
                    prop="name"
                    label="姓名"
                    width="180">
                </el-table-column>
                <el-table-column
                    prop="address"
                    label="地址">
                </el-table-column>
            </el-table>
        </div>
    </div>
</template>

 在data数据中定义字段

 在mockServeData下新建文件user.js(通过mock模拟后端数据)

import Mock from 'mockjs'

//通过mock模拟后端数据

// get请求从config.url获取参数,post从config.body中获取参数
function param2Obj (url) {
  const search = url.split('?')[1]
  if (!search) {
    return {}
  }
  return JSON.parse(
    '{"' +
    decodeURIComponent(search)
      .replace(/"/g, '\\"')
      .replace(/&/g, '","')
      .replace(/=/g, '":"') +
    '"}'
  )
}

let List = []
const count = 200

for (let i = 0; i < count; i++) {
  List.push(
    Mock.mock({
      id: Mock.Random.guid(),
      name: Mock.Random.cname(),
      addr: Mock.mock('@county(true)'),
      'age|18-60': 1,
      birth: Mock.Random.date(),
      sex: Mock.Random.integer(0, 1)
    })
  )
}

export default {
  /**
   * 获取列表
   * 要带参数 name, page, limt; name可以不填, page,limit有默认值。
   * @param name, page, limit
   * @return {{code: number, count: number, data: *[]}}
   */
  getUserList: config => {
    const { name, page = 1, limit = 20 } = param2Obj(config.url)
    console.log('name:' + name, 'page:' + page, '分页大小limit:' + limit)
    const mockList = List.filter(user => {
      if (name && user.name.indexOf(name) === -1 && user.addr.indexOf(name) === -1) return false
      return true
    })
    const pageList = mockList.filter((item, index) => index < limit * page && index >= limit * (page - 1))
    return {
      code: 20000,
      count: mockList.length,
      list: pageList
    }
  },
  /**
   * 增加用户
   * @param name, addr, age, birth, sex
   * @return {{code: number, data: {message: string}}}
   */
  createUser: config => {
    const { name, addr, age, birth, sex } = JSON.parse(config.body)
    console.log(JSON.parse(config.body))
    List.unshift({
      id: Mock.Random.guid(),
      name: name,
      addr: addr,
      age: age,
      birth: birth,
      sex: sex
    })
    return {
      code: 20000,
      data: {
        message: '添加成功'
      }
    }
  },
  /**
   * 删除用户
   * @param id
   * @return {*}
   */
  deleteUser: config => {
    const { id } = JSON.parse(config.body)
    if (!id) {
      return {
        code: -999,
        message: '参数不正确'
      }
    } else {
      List = List.filter(u => u.id !== id)
      return {
        code: 20000,
        message: '删除成功'
      }
    }
  },
  /**
   * 批量删除
   * @param config
   * @return {{code: number, data: {message: string}}}
   */
  batchremove: config => {
    let { ids } = param2Obj(config.url)
    ids = ids.split(',')
    List = List.filter(u => !ids.includes(u.id))
    return {
      code: 20000,
      data: {
        message: '批量删除成功'
      }
    }
  },
  /**
   * 修改用户
   * @param id, name, addr, age, birth, sex
   * @return {{code: number, data: {message: string}}}
   */
  updateUser: config => {
    const { id, name, addr, age, birth, sex } = JSON.parse(config.body)
    const sex_num = parseInt(sex)
    List.some(u => {
      if (u.id === id) {
        u.name = name
        u.addr = addr
        u.age = age
        u.birth = birth
        u.sex = sex_num
        return true
      }
    })
    return {
      code: 20000,
      data: {
        message: '编辑成功'
      }
    }
  }
}

定义接口:在mock.js中

import Mock from 'mockjs'
import homeApi from './mockServeData/home'
import user from './mockServeData/user'

//定义mock请求拦截
Mock.mock('/api/home/getData', homeApi.getStatisticalData)

//用户列表的数据
Mock.mock('/api/user/add','post',user.createUser)
Mock.mock('/api/user/edit','post',user.updateUser)
Mock.mock('/api/user/del','post',user.deleteUser)
Mock.mock('/api/user/getUser',user.getUserList)

 定义前端相关api:在api中的index.js中

import http from '../utils/request'

//请求首页数据
export const getData = () => {
    //返回一个promise对象
    return http.get('/home/getData')
}

export const getUser = (params) => {
    //返回用户列表
    return http.get('/user/getUser',params)
}

export const addUser = (data) => {
    return http.post('/user/add',data)
}

export const editUser = (data) => {
    return http.post('/user/edit',data)
}

export const delUser = (data) => {
    return http.post('/user/del',data)
}

请求接口:在User.vue中

四、用户管理页面table列表编写 

结果并未获取到性别

引入element-ui中自定义列模板

还剩一列操作栏

五、用户管理页面新增编辑提交功能编写

在User.vue中

methods中submit提交表单中判断是新增弹窗还是编辑弹窗

 

 //提交用户表单
            submit() {
                this.$refs.form.validate((valid) => {
                    // console.log(valid,'valid')
                    if(valid){
                        //后续对表单数据的处理
                        if (this.modalType === 0) {
                            addUser(this.form).then(() => {
                                //重新获取列表的接口
                                this.getList()
                            })
                        } else {
                            editUser(this.form).then(() => {
                                //重新获取列表的接口
                                this.getList()
                            })
                        }
                        //清空表单的数据
                        this.$refs.form.resetFields()

                        //关闭弹窗
                        this.dialogVisible = false 
                    }
                })
            },

 新增按钮

 

编辑按钮

修改日期显示格式

 修改男女显示1和0问题

删除按钮 

在element-ui中引入MessageBox 弹框

 

 

handleDelete(row) {
                this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
                }).then(() => {
                    delUser({id:row.id}).then(() => {
                        this.$message({
                            type: 'success',
                            message: '删除成功!'
                        });
                        //重新获取列表的接口
                        this.getList()
                    })
                }).catch(() => {
                    this.$message({
                        type: 'info',
                        message: '已取消删除'
                    });          
            });
            },

新增

编辑

删除

​​​​​​​ 

六、用户管理页面剩余功能解决

1.分页功能

调整高度样式

在User.vue中

<style lang="less" scoped>
.manage {
    height:90%
}
</style>

将<el-table>标签移出<div> 

 

 <div class="manage-header">
            <el-button @click="handleAdd" type="primary">
                + 新增
            </el-button>
            <!-- form搜索区域 -->
        </div>
        <el-table
            height="90%"
            :data="tableData"
            style="width: 100%">
            <el-table-column
                    prop="name"
                    label="姓名">
            </el-table-column>
            <el-table-column
                    prop="sex"
                    label="性别">
                    <template slot-scope="scope">
                        <span>{{ scope.row.sex ===  1? '男' : '女'}}</span>
                    </template>
            </el-table-column>
            <el-table-column
                    prop="age"
                    label="年龄">
            </el-table-column>
            <el-table-column
                    prop="birth"
                    label="出生日期">
            </el-table-column>
            <el-table-column
                    prop="addr"
                    label="地址">
            </el-table-column>
            <el-table-column
                    prop="sex"
                    label="操作">
                    <template slot-scope="scope">
                        <el-button size="mini" @click="handleEdit(scope.row)">编辑</el-button>
                        <el-button type="danger" size="mini" @click="handleDelete(scope.row)">删除</el-button>
                    </template>
            </el-table-column>
        </el-table>

 分页组件

 

 

         

绑定total

 

每页获得20条数据

 

点击跳转页面 

 

 

 已经获取页码 

 

 

        ​​​​​​​         

 

 

 

 在api中的mock.js中

改写成正则表达式

 

 

调整样式

 

 

<style lang="less" scoped>
.manage {
    height:90%;
    .common-tabel {
        position:relative;
        height: calc(100% - 62px);
        .pager {
            position:absolute;
            bottom: 0;
            right: 20px;
        }
    }
}
</style>

 

 

二、右侧搜索区域 

 

 

 

 <!-- form搜索区域 -->
            <el-form :inline="true" :model="userForm">
                <el-form-item>
                    <el-input placeholder="请输入名称" v-model="userForm.name"></el-input>
                </el-form-item>
                <el-form-item>
                    <el-button type="primary" @click="onSubmit">查询</el-button>
                </el-form-item>
            </el-form>

 

 

 

调整布局

 

 ​​​​​​​

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值