vue+express+mysql+elementUI实现前后端交互增删改查

news2024/11/25 19:38:58

简介:使用 Vue + koa + koa2-router + mySql + elementUI实现前后端交互

页面整体效果图:
前端页面 elementUI
编辑页面:

编辑页面

添加页面:

添加信息

删除操作:

在这里插入图片描述

数据库客户端使用Navicat for mysql 当然你需要下载安装

在数据库新建 stuInfo 表和表结构
在这里插入图片描述
stuInfo 表数据

在这里插入图片描述

在src目录下新建api/index.js中加入请求,响应拦截器和接口 api

import axios from 'axios'
const baseURL = './api'

// 添加请求拦截器
axios.interceptors.request.use(
  function(config) {
    // 在发送请求之前做些什么
    console.log('请求数据', config)
    config.url = baseURL + config.url
    return config
  },
  function(error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
axios.interceptors.response.use(
  function(response) {
    // 对响应数据做点什么
    console.log('响应数据', response)
    return response
  },
  function(error) {
    // 对响应错误做点什么
    return Promise.reject(error)
  }
)

// 查询
export const queryData = params => {
  return axios.get('/query', params)
}
// 添加
export const addData = params => {
  return axios.post('/add', params)
}
// 修改
export const updateData = params => {
  return axios.put('/updateData', params)
}
// 删除
export const delData = params => {
  return axios.delete(`/delete/${params.id}`) // 注意这里的路径要和后端的路径一直,不然会报 404
}

// 查询teach表
export const queryTeac = () => {
  return axios.get('/queryTeac')
}

nodejs 服务端核心代码:
db.js 模块中配置数据库连接mysql

// 引入 mysql 模块
const mysql = require('mysql')

// 配置数据
const dbConfig = mysql.createPool({
  host: 'localhost',
  port: '3306', // 端口
  user: 'root',
  password: 'Fyl123456',
  database: 'test', // 数据库名称
  multipleStatements: true, // 多语句查询
})

function query(sql, value) {
  return new Promise((resolve, reject) => {
    dbConfig.query(sql, value, (err, result) => {
      if (err) {
        reject(err)
      } else {
        resolve(result)
      }
    })
  })
}

module.exports = query

配置接口路由文件:

// 引入 koa 模块
const koa = require('koa')

// 实现接口的增删改查 get/post/put/delete
const Router = require('koa-router') // 引入接口路由
const db = require('./db.js') // 数据库配置
const cors = require('koa2-cors') // 跨域依赖
const bodyparser = require('koa-bodyparser') // 情趣提

// 实例化 koa, router对象
const app = new koa()
const router = new Router()

// 搭建服务
// app.use(async (ctx) => {
//   ctx.body = 'hello koa!'
// })

router.get('/index', async (ctx) => {
  ctx.status = 200
  ctx.body = 'hello koa'
})

// 查询
router.get('/query', async (ctx) => {
  ctx.status = 200
  const info = ctx.request.body
  try {
    // const sql = `select * from stuInfo where(name=name or name="") limit ?,?`
    const sql = `select * from stuInfo where(name=name or name="")`
    const value = [info.name]
    const _data = await db(sql, value)
    ctx.body = {
      errorMessage: '',
      result: true, // true 成功, false 失败
      data: _data,
      pageSize: 10,
      pageNum: 1,
    }
  } catch (error) {
    ctx.body = {
      errorMessage: '',
      result: false,
      data: null,
    }
  }
})

// 添加
router.post('/add', async (ctx) => {
  ctx.status = 200
  const info = ctx.request.body
  if (!info.id && !info.name) {
    ctx.body = {
      errorMessage: '数据添加失败学号和姓名是必填项',
      result: true, // true 成功, false 失败
      data: _data,
    }
    return
  }
  try {
    const sql =
      'insert into stuInfo(id, name, age, address, gender) values(?,?,?,?,?)'
    let param = [info.id, info.name, info.age, info.address, info.gender]
    await db(sql, param)
    ctx.body = {
      errorMessage: '',
      result: true,
      data: null, // 添加成功,后端不需要返回什么
    }
  } catch (error) {
    ctx.body = {
      errorMessage: '添加失败',
      result: false,
      data: null,
    }
  }
})

// 修改
router.put('/updateData', async (ctx) => {
  ctx.status = 200
  const infos = ctx.request.body
  if (!infos.id) {
    ctx.body = {
      errorMessage: '学号是必填项',
      result: fasle,
      data: null,
    }
    return
  }
  try {
    const sql = 'update stuInfo set name=?,gender=?,age=?,address=? where id=?'
    let params = [infos.name, infos.gender, infos.age, infos.address, infos.id]
    await db(sql, params)
    ctx.body = {
      errorMessage: '',
      result: true,
      data: null,
    }
  } catch (error) {
    ctx.body = {
      errorMessage: '修改失败',
      result: false,
      data: null,
    }
  }
})

// 删除
router.delete('/delete/:id', async (ctx) => {
  ctx.status = 200
  console.log(ctx)
  const param = ctx.params
  try {
    const sql = 'delete from stuInfo where id=?'
    let value = [param.id]
    await db(sql, value)
    ctx.body = {
      errorMessage: '',
      result: true,
      data: null,
    }
  } catch (error) {
    ctx.body = {
      errorMessage: '删除失败',
      result: false,
      data: null,
    }
  }
})

// 查询 teaInfo 表
router.get('/queryTeac', async (ctx) => {
  ctx.status = 200
  try {
    const sql = 'select * from teacInfo'
    const _data = await db(sql)
    ctx.body = {
      errorMessage: '',
      result: true, // true 成功, false 失败
      data: _data,
    }
  } catch (error) {
    ctx.body = {
      errorMessage: '',
      result: false,
      data: null,
    }
  }
})

// 注册接口路由
router.use('/api', router.routes())

// 配置路由
app
  .use(cors()) // 使用 nodejs cors 模块
  .use(bodyparser()) // 解析 body 请求体
  .use(router.routes()) // 接口路由
  .use(router.allowedMethods())

// 监听端口
app.listen(3000, () => {
  console.log('successfully listen at port 3000......')
})

搭建后台项目环境:

  • npm init 初始化项目
  • 文件夹下出现 package.json即初始化成功
  • npm i nodemon -g 全局安装 这样修改后文件就可以帮助我们自动重启项目
  • npm i koa koa-router koa2-cors mysql -s
  • 封装 db.js 对连接数据库的函数进行模块封装
  • 使用 koa-router + mysql来编写接口
  • 使用 postman 来测试接口

npm run dev 启动项目时会执行 package.json中 script 中 serve中的脚本

{
  "name": "server",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "serve": "nodemon index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "koa": "^2.13.4",
    "koa-bodyparser": "^4.3.0",
    "koa-router": "^12.0.0",
    "koa2-cors": "^2.0.6",
    "mysql": "^2.18.1"
  }
}

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

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

相关文章

Github点赞接近 100k 的Spring Boot学习教程+实战项目推荐

很明显的一个现象,除了一些老项目,现在 Java 后端项目基本都是基于 Spring Boot 进行开发,毕竟它这么好用以及天然微服务友好。不夸张的说,Spring Boot 是 Java 后端领域最最最重要的技术之一,熟练掌握它对于 Java 程序…

SpringBoot-快速入门

目录 SpringBoot 概念 Spring缺点 SpringBoot 功能 快速入门案例:需求 案例:实现步骤 示例 小结 快速构建SpringBoot工程 SpringBoot 概念 SpringBoot提供了一种快速使用Spring的方式基于约定优于配置的思想,可以让开发人员不必在配置…

QML地图Map中使用QPainterPath,并显示任意点经纬度位置

QML地图Map中提供了供绘制图形的组件,例如MapPolyline,MapCircle等,但是这些组件在绘制复杂轨迹时就显得功能不够全面,因此我将QPainterPath在Map中进行使用并进行绘制,并使用C和Qml中的函数进行相互调用计算获取点屏幕…

macOS 的「预览」有几种用法

如果要评选 macOS 最低调的 App ,「预览」可能就会位列其中之一。「预览」和 macOS 结合异常紧密,甚至让人都会遗忘它还是个 App。毕竟大多数的时候,提到「预览」就会想到操作系统的一部分。而实际上,「预览」那「瘦小」的身躯之内…

Unity3D赛车游戏+脚本基础

前言 游戏对象实例化 Scenes游戏场景 GameObject游戏对象 Component组件 Component使用方法 预制体 Unity事件函数 Instantiate():实例化对象 什么是Time.deltaTime Transform的移动,旋转和缩放 实战:赛车游戏 运行演示 具体步骤 游戏打包流程 前言 …

智慧教育解决方案-最新全套文件

智慧教育解决方案-最新全套文件一、建设背景二、思路架构三、建设方案四、获取 - 智慧教育全套最新解决方案合集一、建设背景 目前数字化校园现状: 各自为政 分散建设 各个学校组成的业务系统、网站五花八门,形式多样。形式单一 功能简单 学校网站主要…

为什么同一表情‘‘.length==5但‘‘.length==4?本文带你深入理解 String Unicode UTF8 UTF16

背景 为什么同样是男人,但有的男人🧔‍♂️.length 5,有的男人🧔‍♂.length 4呢? 这二者都是JS中的字符串,要理解本质原因,你需要明白JS中字符串的本质,你需要理解 String Unic…

vlan trunk stp攻防

目录 一、VLAN、Trunk面临的安全风险 trunk干道攻击DTP攻击(思科特有) VLAN跳跃攻击 STP根桥攻击 二、攻击防护 一、VLAN、Trunk面临的安全风险 trunk干道攻击DTP攻击(思科特有) 在华为设备中trunk链路是手工指定的&#xf…

A-LEVEL Chemistry考点分析

A-LEVEL化学其实不是一门很难的科目,并没有太多的内容,虽说包含十几章的内容但其实每章都是相互关联,一通百通,掌握元素周期表的实质,基本上就没有什么问题了,重在理解!知识点多而不碎&#xff…

如何一站式管理固定资产的全生命周期?

目前很多企业还在沿用之前传统的Excel表格来管理和盘点固定资产,不但加大了企业固定资产管理员的工作量,而且在实际的操作过程中容易出现错登记、漏盘点、无法查询操作履历等各种小插曲。而且随着企业固定资产数量、种类、分支机构以及人员的不断增加&am…

juc之常用4大并发工具类 (四)

CountDownLatch: 减少计数CyclicBarrier: 循环栅栏Semaphore: 信号量ExChanger: 交换器 文章目录1.CountDownLatch2.CyclicBarrier3.Semaphore4.Exchanger1.CountDownLatch CountDownLatch,俗称闭锁,作用是类似加强版的 Join,是让一组线程等待其他的线程完成工作以后才执行 就…

数仓开发之DWD层(四)

目录 十一:工具域优惠券领取事务事实表 11.1 主要任务: 11.2 思路分析: 11.3 图解: 十二:工具域优惠券使用(下单)事务事实表 12.1 主要任务: 12.2 思路分析: 12.3…

[附源码]Python计算机毕业设计 社区老人健康服务跟踪系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Java项目实战【超级详细】

软件开发流程 角色分工 开发环境搭建 创建普通Maven项目编写pom.xml导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

【MQ简单模式】

14天阅读挑战赛 MQ简单模式 1、模式介绍 需求&#xff1a;使用简单模式完成消息传递 步骤&#xff1a; ① 创建工程&#xff08;生成者、消费者&#xff09; ② 分别添加依赖 ③ 编写生产者发送消息 ④ 编写消费者接收消息 在上图的模型中&#xff0c;有以下概念&#xff1a; ⚫…

数据库索引的基本操作(sql语句)

表索引的增删改查&#xff08;sql语句&#xff09; 概念&#xff1a; 索引由表中的一列或多列组合而成&#xff0c;目的是优化数据库的查询速度。向索引表中插入数据时&#xff0c;数据库系统需要按照索引进行排序。有时&#xff0c;可以先将索引删除&#xff0c;然后向表插入…

Docker学习(1)—— 安装Docker

一. 安装Docker 1. 查看CentOS是否是7以上的版本 cat /etc/redhat-release 2. 安装gcc yum -y install gcc yum -y install gcc-c 3. 安装需要的软件包 yum install -y yum-utils 4. 设置stable镜像仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/doc…

p38 MAPK调控酶及转录因子

MAPK 与 p38 MAPK 作为对外界物理和化学性质变化的响应&#xff0c;哺乳动物细胞激活有丝分裂原激活蛋白激酶 (MAPK) 的四个特征性亚家族&#xff1a;ERK1/2、JNK、p38 和 ERK5。其中 p38 MAPKs 是一类保守的丝氨酸-苏氨酸蛋白激酶&#xff0c;可被多种细胞外炎症因子 (如TNF-α…

语义分割及DeeplabV3+模型

一、基本概念 将视觉输入分为不同的语义可解释类别&#xff1b;通俗点说就是区分不同部分。 分类&#xff1a; b)语义分割 c)实例分割 d)全景分割 语义分割一般以平均IOU(Intersection Over Union,并交比)来评价性能&#xff0c;其公式如下&#xff1a; 目的是使…

Python学习----Demo(pyecharts)

PyEcharts 就是百度的Echarts&#xff0c;针对Python有一款专门的&#xff0c;所以就叫PyEcharts 官方网站&#xff1a; 文档&#xff1a; https://pyecharts.org/#/zh-cn/ 示例&#xff1a; https://gallery.pyecharts.org/#/README 通过pip安装 pip install pyecharts 或者…