vue3+node.js+mysql+ant design实现表格的查询功能

news2025/4/20 5:21:55

今日主要分享如何运用vue、nodejs、mysql及ant design构建表格数据查询功能,这也是众多项目开发者关注的问题。最关键在于前端与后端的协作,后端数据则通过nodejs编写。尽管涉及多项技术,看似复杂,但实际操作却并非困难。当然,首要条件是熟悉并掌握各项技术。以下为详细步骤:

一、vue3+ant design画前端页面

利用vue3和ant design来实现表格,在使用ant design组件之前首先要安装此组件,具体的安装步骤请详见我的博客中的《Vue3+Ant Design表格排序》这篇文章,这里就不再过多详述。

(1)<template>部分

<template>
  <div class="user-tab">
    <!-- 查询、重置 -->
    <a-row justify="end" style="padding-top: 10px; padding-right: 15px">
      <a-col :span="1.5">
        <p class="user-admin">用户账号</p>
      </a-col>
      <a-col :span="4">
        <a-input v-model:value="submitForm.adminNick" placeholder="请输入账号" style="width: 200px" />
      </a-col>
      <a-col :span="1"></a-col>
      <a-col :span="1.5">
        <a-button type="primary" style="margin-right: 10px" size="middle" @click="search">查询</a-button>
      </a-col>
      <a-col :span="1.5">
        <a-button type="primary" size="middle" @click="resetSearch">重置</a-button>
      </a-col>
    </a-row>
    <!-- 表格 -->
    <div class="tab-body">
      <a-table
        :columns="columns"
        bordered
        :data-source="dataSource"
        :pagination="pagination"
        :loading="tableLoading"
        rowKey="id"
        :scroll="{ y: 'calc(100vh - 380px - 10px)', x: 200 }"
      >
        <template #index="{ index }">
            {{ index + 1 }}
        </template>
        <template #picture="{ record }">
          <img style="width: 100px; heigth: 100px" :src="record.picture" />
        </template>
      </a-table>
    </div>
  </div>
</template>

(2)<script>部分,注意:目前是还未进行获取数据的方式,后续有数据的详见下文

const submitForm = ref({
  adminNick: '',
})
//表格头部
const columns = [
  {
    title: '序号',
    dataIndex: 'index',
    key: 'id',
    width: 200,
    // ellipsis: true,
    slots: {
      customRender: 'index'
    },
    fixed: 'left',
    align: 'center'
  },
  {
    title: '用户账号',
    width: 200,
    dataIndex: 'adminName',
    key: 'name',
    align: 'center',
    fixed: 'left'
  },
  {
    title: '密码',
    width: 200,
    dataIndex: 'adminPwd',
    key: 'pwd',
    align: 'center'
    // fixed: 'left',
  },
  {
    title: '昵称',
    width: 200,
    dataIndex: 'adminNick',
    key: 'nick',
    align: 'center'
  },
  {
    title: '头像',
    width: 200,
    dataIndex: 'picture',
    key: 'pic',
    align: 'center',
    slots: { customRender: 'picture' }
  },
  {
    title: '手机号',
    width: 200,
    dataIndex: 'phoneNumber',
    key: 'number',
    align: 'center'
  }
]
const dataSource = ref([])
//表格分页情况
const pagination = {
  total: 0,
  current: 1,
  pageSize: 10, //每页中显示10条数据
  showSizeChanger: true,
  pageSizeOptions: ['10', '20', '50', '100'], //每页中显示的数据
  showTotal: total => `共有 ${total} 条数据` //分页中显示总的数据
}
//查询
const search = () => {}
//重置
const resetSearch = () => {}

二、利用数据库新建表

在数据库中新建一个名为user_list的表,并在其中插入几条数据。

三、nodejs写查询数据

对于nodejs如何使用、如何在项目中安装这里也不再多说,之前文章也都有详细的介绍,有不懂的可以查看我之前写过的文章。

(1)安装数据库

在项目中打开server文件夹,使用npm安装mysql

npm i mysql

(2)连接数据库

在server文件夹下新建一个名为db的文件夹,在其下新建一个名为sql.js的文件,然后写下面内容,

var mysql= require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '',//自己mysql的密码
  database : ''//自己在mysql建的数据库名
});
module.exports=connection;

接着在需要用到数据库的地方引入该文件即可。

(3)查询数据书写

操作完以上内容后,就可以在routes文件夹下的文件中写查询数据了

var express = require('express');
var router = express.Router();
//连接数据库
var connection=require('../db/sql.js');
//条件查找
router.get('/api/user/searchUserList/', (req, res) => {
  const name = req.query.name;
  // console.log(req.query,'shuju ')
  // console.log(name,'name')
  const sqlStr = "select * from user_list where nickName=?";
  connection.query(sqlStr, name,(err, results) => {
      if (err){
        console.log(err,'错误信息提示:')
        return res.json({
          code: 404,
          message: '数据不存在',
          affextedRows: 0
        });
      }
      res.json({
          code: 200,
          message: results,
          affextedRows: results.affextedRows
      });
  })
})

(4)获取数据

获取数据前,因为对axios进行了二次封装,所以需要在api文件夹中先获取数据地址,如下:

import { get, post} from "@/utils/http.js";
//查询用户信息数据
export const searchUserList = (params) => get('/api/user/searchUserList/',params);

接下来就可以在使用的组件中来获取了

<script setup>
import { searchUserList} from '@/api/userManage.js'
//查询
const search = () => {
  const reqparams = { name: submitForm.value.adminNick }
  searchUserData(reqparams)
}
//重置
const resetSearch = () => {
  submitForm.value.adminNick = ''
  getUserData()
}
//查询用户信息
const searchUserData = params => {
  return new Promise((resolve, reject) => {
    searchUserList(params)
      .then(res => {
        if (res.code === 200 && res.message) {
          console.log(res, 'shuju')
          dataSource.value = []
          const tablist = res.message
          // console.log(tablist,'messss')
          tablist.map((item, index) => {
            // console.log(item,'数据')
            dataSource.value.push({
              index: index + 1,
              adminName: item.userName,
              adminPwd: item.userPwd,
              adminNick: item.nickName,
              picture: item.imgUrl,
              phoneNumber: item.phone
            })
          })
        }
        resolve(res.message)
      })
      .catch(error => {
        reject(error)
      })
  })
}
</script>

四、详细代码

最后附上详细代码

<template>
  <div class="user-tab">
    <!-- 查询、重置 -->
    <a-row justify="end" style="padding-top: 10px; padding-right: 15px">
      <a-col :span="1.5">
        <p class="user-admin">用户账号</p>
      </a-col>
      <a-col :span="4">
        <a-input v-model:value="submitForm.adminNick" placeholder="请输入账号" style="width: 200px" />
      </a-col>
      <a-col :span="1"></a-col>
      <a-col :span="1.5">
        <a-button type="primary" style="margin-right: 10px" size="middle" @click="search">查询</a-button>
      </a-col>
      <a-col :span="1.5">
        <a-button type="primary" size="middle" @click="resetSearch">重置</a-button>
      </a-col>
    </a-row>
    <!-- 表格 -->
    <div class="tab-body">
      <a-table
        :columns="columns"
        bordered
        :data-source="dataSource"
        :pagination="pagination"
        :loading="tableLoading"
        rowKey="id"
        :scroll="{ y: 'calc(100vh - 380px - 10px)', x: 200 }"
      >
        <template #index="{ index }">
            {{ index + 1 }}
        </template>
        <template #picture="{ record }">
          <img style="width: 100px; heigth: 100px" :src="record.picture" />
        </template>
      </a-table>
    </div>
  </div>
</template>
<script setup>
import { searchUserList} from '@/api/userManage.js'
const submitForm = ref({
  adminNick: '',
})
//查询
const search = () => {
  const reqparams = { name: submitForm.value.adminNick }
  searchUserData(reqparams)
}
//重置
const resetSearch = () => {
  submitForm.value.adminNick = ''
  getUserData()
}
//表格头部
const columns = [
  {
    title: '序号',
    dataIndex: 'index',
    key: 'id',
    width: 200,
    // ellipsis: true,
    slots: {
      customRender: 'index'
    },
    fixed: 'left',
    align: 'center'
  },
  {
    title: '用户账号',
    width: 200,
    dataIndex: 'adminName',
    key: 'name',
    align: 'center',
    fixed: 'left'
  },
  {
    title: '密码',
    width: 200,
    dataIndex: 'adminPwd',
    key: 'pwd',
    align: 'center'
    // fixed: 'left',
  },
  {
    title: '昵称',
    width: 200,
    dataIndex: 'adminNick',
    key: 'nick',
    align: 'center'
  },
  {
    title: '头像',
    width: 200,
    dataIndex: 'picture',
    key: 'pic',
    align: 'center',
    slots: { customRender: 'picture' }
  },
  {
    title: '手机号',
    width: 200,
    dataIndex: 'phoneNumber',
    key: 'number',
    align: 'center'
  }
]
const dataSource = ref([])
//表格分页情况
const pagination = {
  total: 0,
  current: 1,
  pageSize: 10, //每页中显示10条数据
  showSizeChanger: true,
  pageSizeOptions: ['10', '20', '50', '100'], //每页中显示的数据
  showTotal: total => `共有 ${total} 条数据` //分页中显示总的数据
}
//查询用户信息
const searchUserData = params => {
  return new Promise((resolve, reject) => {
    searchUserList(params)
      .then(res => {
        if (res.code === 200 && res.message) {
          console.log(res, 'shuju')
          dataSource.value = []
          const tablist = res.message
          // console.log(tablist,'messss')
          tablist.map((item, index) => {
            // console.log(item,'数据')
            dataSource.value.push({
              index: index + 1,
              adminName: item.userName,
              adminPwd: item.userPwd,
              adminNick: item.nickName,
              picture: item.imgUrl,
              phoneNumber: item.phone
            })
          })
        }
        resolve(res.message)
      })
      .catch(error => {
        reject(error)
      })
  })
}
</script>
<style lang="less" scoped>
.user-tab {
  .user-admin {
    padding-right: 1vw;
    padding-top: 0.5vw;
  }
  ::v-deep .ant-row {
    align-items: center;
  }
  ::v-deep .ant-btn {
    line-height: 1vw;
  }
  .tab-body {
    // height: 300px; /* 设置表格的高度 */
    // height: calc(100% - );
    ::v-deep(.ant-table-tbody tr:nth-child(2n+1)) {
       background: #deeafb;
    }
    ::v-deep .ant-table-wrapper {
      height: calc(100% - 70px);
    }
    ::v-deep .ant-table {
      font-size: 16px !important;
      line-height: 2.6vw;
    }
    ::v-deep .ant-table-cell {
      vertical-align: middle;
    }
    ::v-deep .ant-table-thead > tr > th {
      background: #deeafb;
      font-size: 18px;
      color: #383838;
      font-weight: 600;
    }
    ::v-deep .ant-pagination.mini .ant-pagination-total-text {
      flex: 1;
    }
  }
  .tab-modal {
    .icon-jiahao {
      font-size: 30px;
      text-align: center;
    }
    .footButton {
      margin-top: 20px;
      display: flex;
      justify-content: center;
      justify-content: end;
      align-items: center;
      /* padding: px 0; */
      text-align: center;
    }
  }
}
::v-deep .ant-btn {
  line-height: 1vw;
}
</style>

五、结果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1623650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

区块链 | OpenSea 相关论文:Toward Achieving Anonymous NFT Trading(三)

&#x1f951;原文&#xff1a; Toward Achieving Anonymous NFT Trading VII 讨论&#xff1a;关于匿名性与市场平台的困境 在本文的这一部分&#xff0c;我们将讨论关于隐藏 NFT 所有者地址的困境&#xff0c;以及为什么像 OpenSea 这样的 NFT 市场平台几乎必须得到完全的信…

Redis中的Lua脚本(六)

Lua脚本 清空repl_scriptcache_dict字典 每当主服务器添加一个新的从服务器时&#xff0c;主服务器都会清空自己的repl_scriptcache_dict字典&#xff0c;这是因为随着新从服务器的出现&#xff0c;repl_scriptcache_字典里面记录的脚本已经不再被所有从服务器载入过&#xf…

mongodb 安装问题

1. mongodb启动时显示 Illegal instruction (core dumped) mongodb 5.0之后(包括5.0) 开始使用需要使用 AVX 指令集 2.启动时报错 ERROR: child process failed, exited with 1 通过指令 bin/mongod --repair 或 ./bin/mongod -f configs/mongodb.conf --repair查看报错信息…

电力系统IEC-104报文主要常用详解

文章目录 1️⃣ IEC-1041.1 前言1.2 报文分类1.3 U帧报文1.3.1 常见报文1.3.1 报文解析 1.4 S帧报文1.4.1 说明1.4.2 报文解析 1.5 I帧报文1.5.1 报文解析 1.6 控制域I帧报文S帧报文U帧报文介绍 1.7 ASDU1.7.1 常见类型标识1.7.2 常见结构限定词1.7.3 常见传送原因1.7.4 信息体…

主食冻干哪个国家的好?全网热销款品控好的主食冻干必买

主食冻干哪个国家的好&#xff1f;谈及主食冻干哪款好&#xff0c;进口的主食冻干总是能被提名。不论是在哪个电商平台搜索“主食冻干”&#xff0c;都会发现那些备受推崇是进口主食冻干。从销售数据上看&#xff0c;这些进口冻干在大型促销活动如双11、618中的销量一直居高不下…

ctfshow菜狗杯 web 无算力以及easyPytHon_P

web签到题 error_reporting(0); highlight_file(__FILE__);eval($_REQUEST[$_GET[$_POST[$_COOKIE[CTFshow-QQ群:]]]][6][0][7][5][8][0][9][4][4]);套娃传参 中文要编码 Cookies &#xff1a;CTFshow-QQ%E7%BE%A4:a POST:ab GET:?bc&c[6][0][7][5][8][0][9][4][4]syste…

eNSP学习——静态路由及默认路由基本配置

目录 知识背景 实验目的 实验步骤 实验内容 实验拓扑 实验编址 实验前期准备 实验步骤 1、基本配置&#xff08;按照实验编址设置好对应的IP地址&#xff09; 2、是实现主机之间的通信 3、实现全网全通来增强网络的可靠性 4、使用默认路由实现简单的网络优化 需要各…

ROS摄像机标定

文章目录 一、环境准备二、摄像头标定2.1 为什么要标定2.2 标定前准备2.2.1 标定板2.2.2 摄像头调焦 2.3 开始标定2.4 测试标定结果 总结参考资料 一、环境准备 安装usb_cam相机驱动 sudo apt-get install ros-noetic-usb-cam 安装标定功能包 sudo apt-get install ros-noet…

ERP系统直击模切企业痛点,提升企业供应链效率

随着全球化经济的不断发展&#xff0c;供应链管理越来越成为企业经营的核心竞争力之一。因此&#xff0c;越来越多的企业正在积极寻找转型升级之路&#xff0c;对于生产制造模切企业来说&#xff0c;ERP系统尤其关键。 尽管ERP系统解决了企业资源计划的问题&#xff0c;但在模…

【论文速读】|大语言模型(LLM)智能体可以自主利用1-day漏洞

本次分享论文&#xff1a; LLM Agents can Autonomously Exploit One-day Vulnerabilities 基本信息 原文作者&#xff1a;Richard Fang, Rohan Bindu, Akul Gupta, Daniel Kang 作者单位&#xff1a;无详细信息提供 关键词&#xff1a;大语言模型, 网络安全, 1-day漏洞, …

粤嵌—2024/4/24—删除有序数组中的重复项 ||

代码实现&#xff1a; 方法一&#xff1a;双指针 int removeDuplicates(int *nums, int numsSize) {int l 0, r 0;while (r < numsSize) {if (r > 1 && nums[r] nums[l - 1] && nums[r] nums[l - 2]) {r;} else {nums[l] nums[r];l;r;}}return l; }…

【面试题】java后端开发实习(含答案)

java后端开发实习生-常见面试题 1&#xff09;JDK,JRE,JVM的关系 JDK JRE java开发工具JRE JVM java核心类库 2&#xff09;String类的常用方法 1.关于字符串获取方面 length 获取长度charAt 获取指定索引的字符indexOf 获取字符所在的索引位置lastIndexOf 获取字符所在…

电脑自带dll修复在哪里打开?教你如何快速修复dll丢失问题

MSVCP140.dll文件作为Windows操作系统中不可或缺的一环&#xff0c;对众多基于C编译的应用程序的正常运行起着关键作用。在我深入研究和处理与该文件相关问题的过程中&#xff0c;积累了丰富的认知和实践经验。以下是我对MSVCP140.dll文件的总体介绍以及针对其丢失问题的解决方…

数据结构 - 链表详解(二)—— 带头双向循环链表

链表的介绍 链表的结构一共有八种&#xff1a;带头单向循环链表、带头单向非循环链表、带头双向循环链表、带头双向非循环链表、无头单向循环链表、无头单向非循环链表、无头双向循环链表、无头双向非循环链表。 今天我们来详解带头双向循环链表 带头双向循环链表是一种数据结…

融合公式调权思考

一般在多目标任务任务中有加法公式、乘法公式、混合加法、非线性公式等&#xff0c;通过业务特性和应用场景选择不同方式&#xff0c;线上调参也有很多方案&#xff0c;自动寻参&#xff08;成本较高&#xff0c;比如进化算法、网格搜索、随机搜索、贝叶斯优化、自动调参工具如…

南宁建筑模板供应商:贵港市能强优品木业有限公司

贵港市能强优品木业有限公司&#xff0c;作为南宁地区知名的建筑模板生产厂家&#xff0c;拥有25年的丰富生产经验。该公司生产的建筑覆膜板以其稳定的质量和高周转次数而闻名&#xff0c;多年来参与了国内各地区众多大型建筑项目&#xff0c;并获得广大客户的一致好评。 质量稳…

【前端】vue数组去重的3种方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、数组去重说明二、Vue数组去重的3种方法 前言 随着开发语言及人工智能工具的普及&#xff0c;使得越来越多的人会主动学习使用一些开发工具&#xff0c;本文…

昆明航空x-s3-s4e算法分析

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 这里只是我分析的分析过程,以及一些重要点的记录…

比亚迪海洋网再添实力爆款,海豹06DM-i、OCEAN-M、海狮07EV登陆北京车展

4月25日&#xff0c;比亚迪海洋网携海豹06DM-i、OCEAN-M、海狮07EV一齐亮相北京车展&#xff0c;引发关注热潮。其中&#xff0c;海洋网全新中型轿车海豹06DM-i价格区间12万-15万元&#xff0c;将于今年二季度上市&#xff1b;行业首款两厢后驱纯电钢炮OCEAN-M价格区间15万-20万…

【从浅学到熟知Linux】基础IO第四弹=>动静态库(含第三方动静态的使用、自制动静态库、关于动静态库加载调用原理)

&#x1f3e0;关于专栏&#xff1a;Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 静态库静态库的介绍及使用方法自制静态库使用第三方提供的静态库 动态库动态库的介绍及使用方法自制动态库…