likes
comments
collection
share

【vue3+ts后台管理】用户列表

作者站长头像
站长
· 阅读数 5

获取数据

首先在 request 下的 api.ts 中增加

//用户列表
export function getUserList(){
    return service({
        url:'/getUserList',
        method:'get',
    })
}
//角色列表
export function getRoleList(){
    return service({
        url:'/getRoleList',
        method:'get',
    })
}

修改 UserView.vue,分别调用获取用户列表、获取角色列表,然后打印返回数据

export default defineComponent({
  name: 'HomeView',
  setup(){
    const getUser = ()=>{
      getUserList().then(res=>{
        console.log(res)
      })
    }
    const getRole = ()=>{
      getRoleList().then(res=>{
        console.log(res)
      })
    }
    onMounted(()=>{
      getUser()
      getRole()
    })
  },
  components: {},
});

【vue3+ts后台管理】用户列表 【vue3+ts后台管理】用户列表

规范数据

type 文件夹下新建 user.ts

export interface ListInt {
    id: number,
    nickName: string,
    userName: string,
    role:RoleInt[]
}

interface RoleInt{
    role: number,
    roleName: string
}

interface SelectDataInt{
    role:number,
    nickName: string
}

interface RoleListInt {
    authority: number[],
    roleId: number,
    roleName: string
}
export class InitData {
    selectData: SelectDataInt = {
        role:0,
        nickName:''
    }
    list: ListInt[] = []//接收用户列表
    roleList:RoleListInt[] = []//接收角色列表
}

页面展示

页面展示和商品列表是差不多的。头部有搜索和筛选,可以进行姓名搜索和角色筛选。其中角色筛选我们可以根据 Select 选择器 写就可以了。

在获取到用户列表和角色列表后赋值给 data。用于页面的数据展示

在展示用户列表时,角色 role 字段由于是个数组,在 table 中展示时可以根据 Table 表格流体高度 源码中的 插槽 来写

		<template #default="scope">
          <el-button
              type="primary"
              size="small"
              @click="deleteRow(scope.row)">
            Remove
          </el-button>
        </template>

我们可以增加 deleteRow 方法打印下 scope.row 的内容,点击按钮 【vue3+ts后台管理】用户列表 可以看到 scope.row 得到的是这一行的数据。按照这个思路完善代码如下:

<template>
  <div>
    <el-form :inline="true" :model="selectData" class="demo-form-inline">
      <el-form-item label="姓名">
        <el-input v-model="selectData.nickName" placeholder="请输入姓名"/>
      </el-form-item>
      <el-form-item label="角色">
        <el-select v-model="selectData.role" class="m-2" placeholder="请选择" size="large">
          <el-option
              label="全部"
              :value="0"/>
          <el-option
              v-for="item in roleList"
              :key="item.roleId"
              :label="item.roleName"
              :value="item.roleId"
          />
        </el-select>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="onSubmit">查询</el-button>
      </el-form-item>
    </el-form>

    <el-table :data="list" border style="width: 100%">
      <el-table-column prop="id" label="ID" width="180"/>
      <el-table-column prop="nickName" label="姓名" width="180"/>
      <el-table-column prop="introduce" label="角色">
        <template #default="scope">
          <el-button
              v-for="item in scope.row.role"
              :key="item.role"
              type="link"
              size="small">
            {{ item.roleName }}
          </el-button>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script lang="ts">
import {defineComponent, onMounted, reactive, toRefs} from 'vue';
import {getRoleList, getUserList} from "@/request/api";
import {InitData} from "@/type/user";

export default defineComponent({
  name: 'HomeView',
  setup() {
    const data = reactive(new InitData())

    const getUser = () => {
      getUserList().then(res => {
        data.list = res.data
      })
    }
    const getRole = () => {
      getRoleList().then(res => {
        data.roleList = res.data
      })
    }
    onMounted(() => {
      getUser()
      getRole()
    })

    return {
      ...toRefs(data),
    }
  },
  components: {},
});
</script>

运行: 【vue3+ts后台管理】用户列表

用户列表查询

用户列表查询和商品列表查询类似,我们稍作修改即可

const onSubmit = () => {
      let arr: ListInt[] = []
      //查询条件是否有值
      if (data.selectData.nickName || data.selectData.role) {
        if (data.selectData.nickName) {
          //将过滤出来的数组赋值给arr
          arr = data.list.filter((value) => {
            return value.nickName.indexOf(data.selectData.nickName) !== -1
          })
        }
        if (data.selectData.role) {
          //将过滤出来的数组赋值给arr
          arr = (data.selectData.nickName ? arr : data.list).filter((value) => {
            return value.role.find((item)=>{return item.role===data.selectData.role})
          })
        }
      } else {
        arr = data.list
      }
      data.list = arr
    }
    //监听筛选的两个属性
    watch([()=>data.selectData.nickName,()=>data.selectData.role],()=>{
      if(data.selectData.nickName == '' || data.selectData.role == 0){
        getUser()
      }
    })
    return {
      ...toRefs(data),
      onSubmit,
    }

【vue3+ts后台管理】用户列表

用户列表编辑

我们在列表最后增加编辑按钮,点击弹出 Dialog,所以我们修改 UserView.vue

先在 table 里增加编辑按钮

	<el-table-column prop="introduce" label="操作">
        <template #default="scope">
          <el-button
              type="primary"
              size="small"
              @click="changeUser(scope.row)">
              编辑
          </el-button>
        </template>
      </el-table-column>

然后把 Dialog 自定义内容中第二个对话框的代码复制过来,稍作修改

<el-dialog v-model="isShow" title="编辑信息">
    <el-form :model="active">
      <el-form-item label="姓名" label-width="50px">
        <el-input v-model="active.nickName" autocomplete="off" />
      </el-form-item>
      <el-form-item label="角色" label-width="50px">
        <el-select multiple v-model="active.role" placeholder="Please select a zone">
          <el-option
              v-for="item in roleList"
              :key="item.roleId"
              :label="item.roleName"
              :value="item.roleId"
          />
        </el-select>
      </el-form-item>
    </el-form>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="isShow = false">取消</el-button>
        <el-button type="primary" @click="updateUser">更新</el-button>
      </span>
    </template>
  </el-dialog>

其中 isShow 为是否展示 Dialog,我们可以在 type 下的 user.ts 中增加一个字段。同时增加 active 字段用来保存选中的对象

interface ActiveInt{
    id: number,
    nickName: string,
    userName: string,
    role:number[]
}

export class InitData {
    selectData: SelectDataInt = {
        role:0,
        nickName:''
    }
    list: ListInt[] = []//接收用户列表,用于展示
    roleList:RoleListInt[] = []//接收角色列表,用于搜索选择器
    isShow = false//是否展示Dialog
    active:ActiveInt = {//保存选中的对象
        id: 0,
        nickName: '',
        userName: '',
        role:[]
    }
}

其中 Dialog 中的 :model="active"为 Dialog 中要显示的数据。我们点击编辑按钮,我们修改 isShow 的值,让对话框显示出来,同时传入所点击的这一行的数据,赋值给 data.active,这样当 Dialog 显示出来的时候里边就会填充要编辑的数据

	const changeUser = (row:ListInt)=>{
      console.log(row)
      data.active = {
        id: row.id,
        nickName: row.nickName,
        userName: row.userName,
        role:row.role.map((value)=>value.role)
      }
      data.isShow = true
    }
	return {
      ......
      changeUser
    }

可以看到在对 active 赋值时,对 role 的赋值进行了一些处理。因为 active.role 的类型我们规定的是数字的数组,和我们传过来的row中的 role 格式不同,我们先将 传过来的row打印下 : 【vue3+ts后台管理】用户列表row.role我们进行了处理,map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理的后值。我们只把 role 返回即可,roleName 我们暂时不需要

然后我们对 Dialog 的按钮进行处理,点击更新执行 updateUser 方法

const updateUser = ()=>{
      console.log(data.active);
      let obj:any = data.list.find((value)=>value.id==data.active.id)
      obj.nickName = data.active.nickName
      //data.active.role --> [1,2]
      //roleList --> roleId --> 1,2
      obj.role = data.roleList.filter(value => data.active.role.indexOf(value.roleId) !== -1)
      //console.log(obj.role)
      data.isShow = false
    }

    return {
      ...toRefs(data),
      onSubmit,
      changeUser,
      updateUser
    }

最后我们处理bug,由于更新后 data.list 的 role 结构由 RoleInt 改为了 RoleListInt,所以还需要在展示 Dialog 时对其进行处理,否则编辑后,再打开 Dialog 角色这里就展示不出来了

const changeUser = (row:ListInt)=>{
      console.log(row)
      data.active = {
        id: row.id,
        nickName: row.nickName,
        userName: row.userName,
        role:row.role.map((value:any)=>value.role || value.roleId)
      }
      data.isShow = true
    }

最后运行结果: 【vue3+ts后台管理】用户列表