项目--用户管理(用户列表)(面包屑 搜索栏 表格 分页 全局过滤器 日期处理)

新建用户列表组件

<template>
  <div>
    yonhu
  </div>
</template>

<script>
  export default {
    name:'Users'
  }
</script>

<style scoped>

</style>

配置路由

在/ 路由下配置children子路由
 children: [
      	{
      		path: 'users',
          name:'users',
      		component: Users
      	}
          ]

在主页 main 添加路由渲染

<router-view/>

修改用户列表组件内容

添加容器 el-card class="box-card"  卡片 相当于div容器
  <el-card class="box-card">
    <!-- 面包屑-->
    
    <!-- 搜索-->

    <!-- 表格-->

    <!-- 分页-->

  </el-card>


样式
.box-card {
    height: 100%;
  }

在主页侧边导航栏(el-menu)标签开启路由模式

:router='true'

找到用户列表这个 修改index值

<el-menu-item index="users">
              <i class="el-icon-circle-check"></i>
              <span>用户列表</span>
            </el-menu-item>

添加面包屑

    <!-- 面包屑-->
    <el-breadcrumb separator-class="el-icon-arrow-right">
      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
      <el-breadcrumb-item>用户管理</el-breadcrumb-item>
      <el-breadcrumb-item >用户列表</el-breadcrumb-item>
    </el-breadcrumb>

添加搜索

<!-- 搜索-->
    <el-row class='searchRow'> <!-- row 一行显示-->
      <el-col>
        <!-- 搜索框 -->
        <el-input placeholder="请输入内容" v-model="query" class="inputSelect">
          <el-button slot="append" icon="el-icon-search"></el-button>
        </el-input>
        <!-- 添加用户按钮 -->
        <el-button type="success">添加用户</el-button>
      </el-col>
    </el-row>

样式
.inputSelect{ /* 搜索框样式*/
    width:300px;
  }
  .searchRow{ /* 行样式*/
  margin-top: 20px;
  }

添加表格

    <!-- 表格   :data=数据源  el-table-column(lable 表头  prop='数据')  -->
    <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>

添加数据源
  
data 绑定数据源
data() {
      return {tableData:[],  /* 表格绑定的数据*/}
      }

发送 axios 用户列表请求 获取用户列表数据

1.methos:{ getUserlist(发送请求)}
2.created(this.getuserlist())调用方法 
3.接口文档中 除了登录以外的所有请求都要进行授权 -> 设置请求头
    //设置请求头  让请求头带token 不带获取不了数据
    const AUTH_TOKEN = localStorage.getItem('token')
   	this.$http.defaults.headers.common['Authorization'] = AUTH_TOKEN;

methos:{ getUserlist(发送请求)}

data设置请求数据  以及获取的数据保存
data() {
      return {
        /* 用户列表请求数据
        query	查询参数	可以为空
        pagenum	当前页码	不能为空
        pagesize	每页显示条数	不能为空
        */
        getusersList: {
          query: '',
          pagenum: 1,
          pagesize: 2
        },
        tableData: [], //用户列表数据源
        total: -1, //用户数据总数

      }
    },
    methods: {
      //获取用户列表的请求
      async getUserList() {
              //设置请求头  让请求头带token 不带获取不了数据
              const AUTH_TOKEN = localStorage.getItem('token')
              this.$http.defaults.headers.common['Authorization'] = AUTH_TOKEN;
              
              //{params:this.usersList }这样params属性的对象都将会拼接到url上,成为url?a=1&b=2的形式。
              const res = await this.$http.get('/api/users', {
                params: this.getusersList
              })
              console.log(res)

              //对象解构赋值
              const {meta: {status,msg},data: {users,total}} = res.data
              if(status===200){
                 //1.给表格数据赋值
                 this.tableData=users
                 //2.给total赋值
                 this.total=total
                 //提示
                 this.$message.success(msg);
              }

      }
    }

在created调用方法
created() {
      this.getUserList()
    },

渲染用户表格一般数据

<!-- 表格   :data=数据源  el-table-column(lable 表头  prop='数据')  -->
   <el-table :data="tableData" style="width: 100%">
     <el-table-column type='index' label="#" width="180">
       <!-- type='index' 添加序号从1开始-->
     </el-table-column>
     <el-table-column prop="username" label="姓名" width="180">
     </el-table-column>
     <el-table-column prop="email" label="邮箱" width="180">
     </el-table-column>
     <el-table-column prop="mobile" label="电话" width="180">
     </el-table-column>
     <el-table-column prop="create_time" label="创建日期" width="180">
     </el-table-column>
     <el-table-column prop="mg_state" label="用户状态" width="180">
     </el-table-column>
     <el-table-column prop="a" label="操作">
     </el-table-column>
   </el-table>

处理日期格式 插件Moment.js 及全局过滤器

npm install moment --save  安装

在main导入
import moment from 'moment'

编写日期全局过滤器
Vue.filter('fmtdate',(v)=>{
	return moment(v).format('YYYY-MM-DD');
})

处理表格日期数据

      <el-table-column  label="创建日期" width="180">
        <!-- 如果单元格内显示的内容不是字符串  需要给被显示的内容外层包裹一个tenplate-->
        <!--
        templaten内部要使用数据  设置 slot-scope属性  作用传值 
        该属性的值要用数据的数据源  会自动找 el-table的数据源也就是tableData
   		tableData.row.create_time  使用要.row.属性名
		因为每个组件的数据不是共享的
        -->
        <template slot-scope='tableData'>
          {{tableData.row.create_time|fmtdate}}
        </template>
      </el-table-column>

用户状态开关

<el-table-column  label="用户状态" width="180">
        <template  slot-scope='tableData'>
          <el-switch v-model="tableData.row.mg_state" active-color="#13ce66" inactive-color="#ff4949" >
          </el-switch>
        </template>
      </el-table-column>

操作按钮 添加 删除 修改

<el-table-column  label="操作">
        <template slot-scope='tableData'>
          <el-button size='mini' plain  type="primary" icon="el-icon-edit" circle></el-button>
            <el-button size='mini' plain type="success" icon="el-icon-check" circle></el-button>
            <el-button size='mini' plain type="danger" icon="el-icon-delete" circle></el-button>
        </template>
      </el-table-column>

分页设置

<!-- 分页-->
    <!--
    @size-change 每页显示条数变化时 触发
    @current-change 当前页改变时 触发
    current-page 设置当前是第几页  绑定data的值
    page-sizes 每页多少条的数据组  
    page-size  设置显示多少条 绑定data的值
    total 数据总数 绑定data的值
    -->
    <!--
    -->
    <el-pagination
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          :current-page="getusersList.pagenum"
          :page-sizes="[2, 4, 6, 8]"
          :page-size="getusersList.pagesize"
          layout="total, sizes, prev, pager, next, jumper"
          :total="total">
        </el-pagination>

在methods绑定分页方法

//分页方法
        //每页显示多少条数据方法
       handleSizeChange(val) {
              console.log(`每页 ${val} 条`);
              this.getusersList.pagesize=val  //把每页显示条数重新设置 发送查询用户请求
              this.getUserList()
            },
       //切换页码方法
       handleCurrentChange(val) {
              console.log(`当前页: ${val}`);
              this.getusersList.pagenum=val //把当前页码重新设置 发送查询用户请求
              this.getUserList()
            },

搜索功能

搜索图标绑定点击事件

@click='searchuUser()'

methods 绑定方法

//搜索用户   因为之前已经预留了 query 属性 当用户输入时候 v-moder绑定了query  所以直接重新调用就可以了 
      searchuUser(){
        this.getUserList()
      },

输入框清空搜索框 重新获取数据

clearable  添加清空属性
@clear='loadUserList()'   点击清空时触发方法 绑定清空搜索框

  //清空搜索框  重新获取数据
      loadUserList(){
        this.getUserList()
      },

添加用户功能

添加弹层(对话框)

<!-- 对话框-->
     <!-- 添加用户对话框 弹层   dialogFormVisibleAdd属性控制弹出和关闭-->
     <el-dialog title="添加用户" :visible.sync="dialogFormVisibleAdd">
       <el-form :model="form">
         <el-form-item label="用户名" label-width="100px">
           <el-input v-model="form.username" autocomplete="off"></el-input>
         </el-form-item>
         <el-form-item label="密 码" label-width="100px">
           <el-input v-model="form.password" autocomplete="off"></el-input>
         </el-form-item>
         <el-form-item label="邮箱" label-width="100px">
           <el-input v-model="form.email" autocomplete="off"></el-input>
         </el-form-item>
         <el-form-item label="电话" label-width="100px">
           <el-input v-model="form.mobile" autocomplete="off"></el-input>
         </el-form-item>

       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button @click="dialogFormVisibleAdd = false">取 消</el-button>
         <el-button type="primary" @click="dialogFormVisibleAdd = false">确 定</el-button>
       </div>
     </el-dialog>

data添加需要的数据 form表单 dialogFormVisibleAdd 弹出控制开关

        dialogFormVisibleAdd : false ,//添加用户的弹出和关闭数据
        //添加用户的表单需要提交的数据
        /* 参数名	参数说明	备注
        username	用户名称	不能为空
        password	用户密码	不能为空
        email	邮箱	可以为空
        mobile	手机号	可以为空*/
        form:{
           username : '',
           password : '',
           email : '',
           mobile : ''
        }

用户添加按钮绑定方法 控制弹出和关闭

 @click='showAddUserDia()'

methods方法
     //添加用户弹层开关
      showAddUserDia(){
        this.dialogFormVisibleAdd = true
      },

修改弹层确定按钮点击确定时绑定方法 发送请求

@click="addUser()"

methods 方法
//添加用户提交方法-发送请求  users
      async addUser(){
         const res = await this.$http.post('/api/users',this.form)
         console.log(res)
         const {meta:{msg,status},data}=res.data
         if(status===201){
           //1 提示成功
           this.$message.success(msg);
           //2 更新视图数据
           this.getUserList()
           //3 清空文本框
           this.form = {}
         }else{
           //失败提示
           this.$message.error(msg);
         }
         //关闭弹层
         this.dialogFormVisibleAdd = false
      },

删除用户

this.$confirm.then().catch() 点击确认来到-then  点击取消来到 -catch  删除确认提示框

@click='showDeleUserMsgBox(tableData.row.id)' 删除按钮绑定方法 因为slot-scope 可以获取到id

methods 方法

      //删除用户  打开消息盒子(确认或取消删除提示)--发送请求
      showDeleUserMsgBox(userId){
        this.$confirm('删除用户?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(async () => {
          //发送删除的请求 id----用户id
          //1.data中找userId   X 第一种方法行不通
          //2.把userId以 tableData.row.id  参数形式传递进去
          const res=await this.$http.delete(`/api/users/${userId}`)
          console.log(res)
          //删除成功提示
          if(res.data.meta.status===200){
            this.$message({
              type: 'success',
              message: res.data.meta.msg
            });
          }else{
            this.$message({
              type: 'error',
              message: res.data.meta.msg
            });
          }
          //更新视图
          this.getusersList.pagenum=1 //返回第一页
          this.getUserList()
        }).catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
      },

更新用户信息

更新按钮绑定事件 并绑定data数据的值传输 方便表单显示 slot-scope='tableData'获取数据
@click='showEditUser(tableData.row)'  

methods
showEditUser(user) 方法

      //更新用户弹出和关闭 user通过 slot-scope 绑定了用户的数据
      showEditUser(user){
        this.form = user //赋值给data form的数据源 就可以显示在弹窗了  因为v-moder 绑定了 form
        this.dialogFormVisibleEditUser = true //打开弹窗属性
      },

修改提交按钮 发送更新请求

@click="editUser()" 提交按钮绑定事件

methods方法
      //更新用户发送请求
     async editUser(){
        //因为打开更新时候已经打数据赋值给form 所以可以直接获取id
        const res= await this.$http.put(`/api/users/${this.form.id}`,this.form)
        //提示
         if(res.data.meta.status===200){
           this.$message.success(res.data.meta.msg);
         }else{
           this.$message.error(res.data.meta.msg);
         }
        //关闭对话框
        this.dialogFormVisibleEditUser = false //关闭弹窗属性
      },

用户状态修改

绑定会调函数 change
@change='changMsState(tableData.row)'

methods方法
//修改用户状态  因为v-moder 绑定了用户状态  每当点击会调用@change='changMsState(tableData.row)'函数
      async changMsState(user){
        //发送请求
        const res =await this.$http.put(`/api/users/${user.id}/state/${user.mg_state}`)
        //提示
         if(res.data.meta.status===200){
           this.$message.success(res.data.meta.msg);
         }else{
           this.$message.error(res.data.meta.msg);
         }
      },

分配用户角色

1.给按钮添加点击事件
@click='showSetUserRole(tableData.row)'
2.methods方法
async showSetUserRole(user){
        this.currUsername=user.username
        this.currUserid=user.id
        const res1 =await this.$http.get(`/api/roles`)  //获取角色列表
        this.roles= res1.data.data

        const res =await this.$http.get(`/api/users/${user.id}`)//获取当前用户的角色id
        console.log(res)
        this.currRoleId=res.data.data.rid    //赋值显示当前角色权限
        this.dialogFormVisibleSetUserRole=true //角色分配弹出
      },

data数据
        dialogFormVisibleSetUserRole : false ,//角色分配弹出和关闭
        currRoleId : -1, //下拉框绑定的值
        currUsername:'',//角色用户名
        currUserid : '',//当前用户的id值
        roles:[],//保存所有的角色数据

弹层

    <!-- 分配角色对话框 弹层-->
     <el-dialog title="角色分配" :visible.sync="dialogFormVisibleSetUserRole">
       <el-form :model="form">
         <el-form-item label="用户名" label-width="100px">
           {{currUsername}}
         </el-form-item>

         <!--如果外层 select 绑定的值 和option的value相等  当前就会显示该option的lakel的值-->
         <!-- -->
         <el-form-item label="角色" label-width="100px">
           <!-- 绑定currRoleId值 会显示对应的角色-->
           <el-select v-model="currRoleId">
             <el-option label="请选择" :value="-1"></el-option>
             <!-- methods方法获取角色列表赋值给roles  roles循环遍历出角色列表-->
             <el-option :label="item.roleName" :value="item.id" v-for="(item,i) in roles" :key=i>
             </el-option>
           </el-select>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button @click="dialogFormVisibleSetUserRole = false">取 消</el-button>
         <el-button type="primary" @click="dialogFormVisibleSetUserRole = false">确 定</el-button>
       </div>
     </el-dialog>
给提交按钮绑定事件
@click="setRole()"

methods 方法
 //分配角色权限方法
     async setRole(){
       //rid	角色 id	不能为空参数body参数
       // :id 要修改用户的id值
       // 请求体中的rid  修改的新角色id
        const res = await this.$http.put(`/api/users/${this.currUserid}/role`,{rid : this.currRoleId})
        console.log(res)
        if(res.data.meta.status===200){
          this.$message.success(res.data.meta.msg);
        }else{
           this.$message.error(res.data.meta.msg);
         }
        this.dialogFormVisibleSetUserRole=false //角色分配关闭
      },


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值