vite+vue项目之后台系统写列表、分页、查询

321 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情


写在前面

上篇文章介绍了如何在vite+vue项目中编写后台标签页栏代码,本篇文章介绍如何在vite+vue项目的后台系统中写列表、分页、查询

完整源码:项目gitee地址

在线演示:演示地址

账号:admin
密码:admin

使用el-table显示列表

首先将侧边菜单和路由配置一下,我们模拟一般后台管理系统都有的菜单:系统设置,系统设置下配置一个子菜单:用户管理,在用户管理页面,我们要编写查询用户、新增用户、编辑用户、删除用户的代码(都由前端模拟数据,但是会写的很详细)。

打开写侧边菜单的文件:layout/Sidebar.vue,将其中定义menus的代码修改为以下代码:

const menus: { name: String, id: Number, title: String, children: any[] }[] = [
  {
    name: 'SystemSet', id: 1, title: '系统设置', children: [
      { name: 'UserManage', id: 11, title: '用户管理' }
    ]
  },
  {
    name: 'Menu2', id: 2, title: '菜单2', children: []
  },
]

再打开配置路由的文件:router/routes.ts,将其中菜单1-1的代码修改为如下代码:

            // 系统设置 - 用户管理
            {
                path: "/UserManage",
                name: 'UserManage',
                component: () =>
                    import("../views/SystemSet/UserManage/index.vue"),
                meta: { title: "用户管理" },
            },

接着我们在views文件夹下新建一个SystemSet文件夹,再在下面新建一个UserManage文件夹,在该文件夹下再新增一个index.vue文件,我们在views/SystemSet/UserManage/index.vue文件下编写用户列表页面代码,用户列表一般都有以下字段:

字段名说明
userName用户名
realName姓名
gender性别 0:男 1:女 2:未知
mobile手机号
post岗位
orgId所属部门id
orgName所属部门名称
roleIdList角色id数组
roleNameList角色名称数组
createTime创建时间

使用el-table组件展示列表,stripe表示列表斑马线显示,border表示显示表格边框,再给el-table一个height,用来固定高度。

使用el-pagination组件展示分页,handleSizeChange方法用来改变 handleCurrentChange。

然后在onMounted钩子函数中调用getTableData方法以获取tableData的数据,定义page、limit用来获取tableData数据的时候实现分页,定义keyWord用来进行关键字搜索,

相关代码如下,这里就不贴全部代码了:

<template>
    <div class="user_manage">
        <div class="search_bar">
            <div class="search_lt">
                <el-input v-model="keyWord" placeholder="请输入关键词" clearable />
                <el-button type="primary" @click="handleSearch">查询</el-button>
            </div>
            <div class="search_rt">
                <el-button type="primary" @click="handleAdd">新增</el-button>
            </div>
        </div>
        <el-table :data="tableData" stripe border :height="height">
            <el-table-column type="index" label="序号" width="55">
                <template #default="scope">
                    {{ ((page - 1) * limit + scope.$index + 1) }}
                </template>
            </el-table-column>
            <el-table-column prop="userName" label="用户名" />
            <el-table-column prop="realName" label="姓名" />
            <el-table-column prop="orgName" label="部门" />
            <el-table-column prop="mobile" label="手机号" />
            <el-table-column prop="gender" label="性别">
                <template #default="scope">
                    <span v-show="(scope.row.gender === 1)"></span>
                    <span v-show="(scope.row.gender === 0)"></span>
                </template>
            </el-table-column>
            <el-table-column prop="post" label="岗位" />
            <el-table-column prop="roleNameList" label="角色" />
            <el-table-column fixed="right" label="操作" width="180">
                <template #default="scope">
                    <el-button type="primary" link @click="handleLook(scope.row)">查看详情</el-button>
                    <el-button type="primary" link @click="handleEdit(scope.row)">编辑</el-button>
                    <el-button type="danger" link @click="handleDel(scope.row)">删除</el-button>
                </template>
            </el-table-column>
        </el-table>
        <div class="pagination">
            <el-pagination v-model:current-page="page" v-model:page-size="limit" :page-sizes="[20, 100, 300, 500]"
                layout="total, sizes, prev, pager, next" :total="total" @size-change="handleSizeChange"
                @current-change="handleCurrentChange" />
        </div>
    </div>
</template>

<script setup lang="ts">
import { computed, Ref } from '@vue/reactivity';
import { onMounted, ref } from 'vue'
import { getUser } from '@/api/SystemSet/UserManage'

const height = computed(() => window.innerHeight - 220)

const keyWord = ref('')

let page = ref(1)
let limit = ref(20)
let total = ref(0)

let tableData: Ref = ref([])

onMounted(() => {
    getTableData()
})

const getTableData = () => {
    getUser({ page: page.value, limit: limit.value, keyWord: keyWord.value }).then((res: any) => {
        tableData.value = res.list
        total.value = res.total
    })
}

const handleSearch = () => {
    page.value = 1
    getTableData()
}

const handleSizeChange = (val: number) => {
    limit.value = val
    page.value = 1
    getTableData()
}
const handleCurrentChange = (val: number) => {
    page.value = val
    getTableData()
}
</script>

然后在api/SystemSet/UserManage.ts文件中模拟接口,部分代码如下,完整代码可去码云上clone:

import Axios from "../request";

let userList = [
  ...
]
for (let i = 0; i < 200; i++) {
    userList.push({
        userName: 'wangwu',
        realName: '王五',
        gender: 0,
        mobile: '13965874512',
        orgId: 3,
        orgName: '销售2部',
        post: '销冠',
        roleIdList: [3],
        roleNameList: ['销售人员'],
        createTime: '2022-12-05 13:10:00'
    })
}

/**
 * 获取用户列表
 * @method getUser
 */
export const getUser = (params: any) => {
    //模拟接口
    return new Promise((resolve, reject) => {
        const { page, limit, keyWord } = params
        let filter = userList.filter(el => el.userName.includes(keyWord) || el.realName.includes(keyWord))
        resolve({
            list: filter.slice((page - 1) * limit, page * limit),
            total: userList.length
        })
    })
}

最终效果如下:

1670291644642.png

写在最后

以上就是在vite+vue项目的后台系统中写列表、分页、查询的所有代码和说明