vue+mysql实现前端对接数据库

news2025/1/20 19:25:27

下载引入相关依赖

1、cnpm install --save mysql

2、cnpm install --save axios

3、cnpm install --save body-parser

4、cnpm install --save express

5、cnpm install --save crypto

在main中引入axios

import Axios from 'axios'

Vue.prototype.$axios = axios

配置连接

在src下新建文件夹server,在其中新建db.js文件,index.js文件,其中db是数据库配置,index是node后端服务配置

db.js内容

module.exports = {
  mysql: {
    host: 'localhost', // 新建数据库连接时的 主机名或ID地址 内容
    user: 'name', // 连接的数据用户名
    password: '***', // 密码
    database: 'apitest', // 数据库名
    port: '3306'
  }
}

index.js内容

// node 后端服务器
const UserApi = require('./api/SysUser')
const bodyParser = require('body-parser')
const express = require('express')
const app = express()
//采用设置所有均可访问的方法解决跨域问题
app.all("*", function(req, res, next) {
  //设置允许跨域的域名,*代表允许任意域名跨域
  res.header("Access-Control-Allow-Origin", "*");
  //允许的header类型
  res.header("Access-Control-Allow-Headers", "content-type");
  //跨域允许的请求方式
  res.header("Access-Control-Allow-Methods", "DELETE,PUT,POST,GET,OPTIONS");
  if (req.method.toLowerCase() == 'options')
    res.send(200); //让options尝试请求快速结束
  else
    next();
})

// 以json格式返回出去
app.use(bodyParser.json()) 
app.use(bodyParser.urlencoded({ extended: false }))

// 后端api路由
app.use('/api/sysuser', UserApi)


// 监听端口
app.listen(3000)
console.log('success listen at port:3000......')

创建api

在新建文件夹api,在api下新建文件SysUser.js文件,这个就是之后需要使用到的接口api

const models = require('../server/db')
const express = require('express')
const router = express.Router()
const mysql = require('mysql')
const crypto = require('crypto')

// 连接数据库
const conn = mysql.createConnection(models.mysql)
conn.connect()
const jsonWrite = function (res, ret) {
  if (typeof ret === 'undefined') {
    res.json({
      code: '1', msg: '操作失败'
    })
  } else {
    res.json(
      ret
    )
  }
}

// 接口:增加信息sql,编辑修改信息sql1
router.post('/save', (req, res) => {
  const md5 = crypto.createHash('md5')
  const params = req.body
  const sql = `insert into sys_user(sys_id,sys_username,sys_pwd,sys_nickname,sys_phone,sys_head_protrait,sys_usertype,sys_userlevel) 
  select 0,?,?,?,?,?,?,? FROM DUAL WHERE NOT EXISTS(SELECT sys_username FROM sys_user WHERE  sys_username = ?)`
  const sql1 = `update sys_user set sys_nickname = ?,sys_phone = ?,sys_userType = ? where sys_id = ?`
  md5.update(params.pwd)
  // params.pwd = md5.digest('hex')
  if(params.id==0){
    conn.query(sql, [params.username, md5.digest('hex'), params.nickname, params.phone, params.headProtrait, params.userType, params.level,params.username], function (err, result) {
      if (err) {
        console.log(err)
      }
      if (result) {
        jsonWrite(res, result)
      }
    })
  }else{
    conn.query(sql1, [params.nickname, params.phone, params.userType, params.id], function (err, result) {
      if (err) {
        console.log(err)
      }
      if (result) {
        jsonWrite(res, result)
      }
    })
  }
})

// 接口:用户管理分页接口查询
router.get('/getlist', (req, res) => {
  const params = req.query
  const sql = `SELECT * FROM sys_user WHERE sys_username LIKE '%${params.keyword}%' 
  OR sys_phone LIKE '%${params.keyword}%' OR sys_nickname LIKE '%${params.keyword}%' 
  limit ${(params.pageIndex-1) * params.pageSize},${params.pageSize}`
  const sql2 = `SELECT COUNT(*) as total FROM sys_user`
  conn.query(sql, function (err, result) {
    if (err) {
      console.log(err)
    }
    if (result) {
      conn.query(sql2,function(err, result2) {
        if(err){
          console.log(err)
        }
        if(result2){
          let ret = {
            data:result,
            total:result2[0].total
          }
          jsonWrite(res, ret)
        }
      })
    }
  })
})

// 接口:删除单条数据
router.post('/del', (req, res) => {
  const params = req.body
  const sql = `DELETE FROM sys_user WHERE sys_id=${params.id}`
  conn.query(sql, params, function (err, result) {
    if (err) {
      console.log(err)
    }
    if (result) {
      jsonWrite(res, result)
    }
  })
})

// 接口:登录
router.post('/login', (req, res) => {
  const md5 = crypto.createHash('md5')
  const params = req.body
  md5.update(params.password)
  const sql = `SELECT * FROM sys_user WHERE sys_username=? AND sys_pwd=?`
  conn.query(sql, [params.username, md5.digest('hex')], function (err, result) {
    if (err) {
      console.log(err)
    }
    if (result) {
      jsonWrite(res, result)
    }
  })
})

// 接口:查询用户信息
router.get('/get',(req, res) => {
  const params = req.query
  const sql= `select * from info_user a RIGHT JOIN (select sys_id from sys_user where sys_username = ?) b on a.sys_id = b.sys_id`
  conn.query(sql,[params.username],function(err, result){
    if(err){
      console.log(err)
    }
    if(result){
      jsonWrite(res,result)
    }
  })
})

// 接口:编辑修改更新用户信息
router.post('/alterinfo',(req,res)=>{
  const params = req.body
  const sql = `insert into info_user(info_id,sys_id,info_real_name,info_sex,info_age,info_addr,info_phone,info_education) value (0,?,?,?,?,?,?,?)`
  const sql1 = `update info_user set info_real_name = ?,info_sex = ?,info_age = ?,info_addr = ?,info_phone = ?,info_education = ? where info_id = ?`
  if(params.id==0||params.id==null){
    conn.query(sql, [params.sid, params.realname, params.sex, params.age, params.addr, params.phone,params.education], function (err, result) {
      if (err) {
        console.log(err)
      }
      if (result) {
        jsonWrite(res, result)
      }
    })
  }else{
    conn.query(sql1, [params.realname, params.sex, params.age, params.addr, params.phone,params.education,params.id], function (err, result) {
      if (err) {
        console.log(err)
      }
      if (result) {
        jsonWrite(res, result)
      }
    })
  }
})

// 接口:修改密码
router.post('/modifypwd',(req,res)=>{
  const md5 = crypto.createHash('md5')
  const mdx = crypto.createHash('md5')
  const params = req.body
  const sql = `UPDATE sys_user SET sys_pwd=? WHERE sys_id = ? AND sys_pwd = ?`
  md5.update(params.oldPassword)
  mdx.update(params.newPassword)
  conn.query(sql,[mdx.digest('hex'),params.userId,md5.digest('hex')],function(err,result){
    if (err) {
      console.log(err)
    }
    if (result) {
      jsonWrite(res, result)
    }
  })
})

module.exports = router

api使用

在需要使用的界面调用api接口

<template>
  <div>
    <el-table :data="tableData">
      <el-table-column prop="sys_username" label="登录账号" align="center"></el-table-column>
      <el-table-column prop="sys_nickname" label="昵称" align="center"></el-table-column>
      <el-table-column prop="sys_phone" label="手机号码" align="center"></el-table-column>
      <el-table-column prop="sys_usertype" label="账号类型" align="center">
        <template slot-scope="scope">
          <span>{{scope.row.sys_usertype==1?'超级管理员':(scope.row.sys_usertype===2?'管理员':'用户')}}</span>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        keyword: '',
        pageIndex: 1,
        pageSize: 10,
        tableData: [],
        total: 0
      }
    },
    created() {
      this.getlist();
    },
    methods: {
      getlist() {
        let params = {
          keyword: this.keyword,
          pageIndex: this.pageIndex,
          pageSize: this.pageSize
        }
        // 这里使用http://localhost:3000是因为配置地方监听的3000端口
        // /api/sysuser 这一部分也是在index.js中引入配置的
        // /getlist 是在api接口里面的方法
        // 整个三部分组合成立通常使用的接口
        // 其中 前面地址部分可以自己全局去定义,同样$http(axios)也可以封装
        this.$http.get('http://localhost:3000/api/sysuser/getlist', { params: params })
          .then(response => {
            console.log(response);
            if (response.status == 200) {
              let datas = response.data
              this.tableData = datas.data
              this.total = datas.total
            } else {
              console.log(response)
            }
          })
          .catch(error => {
            console.log(error)
          })
      },
    }
  }
</script>

<style scoped>

</style>

以上就是整个内容,但要运行起来,除了运行vue项目外,还需要将配置的node后端运行起来,可以cmd或者用vscode的内置终端运行之前配置的server文件,进入到server文件夹位置,运行:node index出现以下内容即运行成功

 获取数据效果展示:

 

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

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

相关文章

使用python搭建一个简易的Web服务

介绍 简单的说&#xff0c;web服务器就是机器上监听了本地的IP和端口的一个进程&#xff0c;当有客户的请求进来时&#xff0c;它会响应客户的请求并返回相应的信息。客户端和服务端之间的通信基于HTTP协议&#xff0c;客户端可以是浏览器或者任何支持HTTP的应用。我们平时访问…

vue+element ui完成头像上传功能(文件转base64)以及自定义布局。

1、自定义布局 查阅element ui的头像上传功能&#xff0c;发现是点击头像位置才可以上传&#xff0c;那我们可不可以点击头像外部的按钮来上传头像呢&#xff1f; element ui效果图&#xff1a; 目标效果&#xff1a; 在实…

OpenAI 成近期顶流团队?如何使用 OpenAI 和 Node.js 构建 AI 图像生成器?

摘要: 12月7号&#xff0c;知名人工智能研究机构 Open AI 在Youtub上发布视频介绍使用OpenAI 和 DALL-E 模型创建一个网络应用程序&#xff0c;该应用程序将根据输入的文本从头开始生成图像。https://www.youtube.com/watch?vfU4o_BKaUZE 前言&#x1f496; 大家好&#xff0…

全网多种方法解决Invalid Host header(无效的主机头)服务器域名访问出现的错误

文章目录1. 复现错误2. 分析错误3. 解决错误4. 其他方法解决该错误1. 复现错误 在搭建vue-cli环境&#xff0c;用nginx做代理服务器&#xff0c;访问时却显示&#xff1a;Invalid Host header。 2. 分析错误 知其然&#xff0c;知其所以然&#xff0c;我们在解决该问题之前&am…

支付宝手机网站H5支付

手机网站支付产品介绍 &#xff5c; 网页&移动应用 为方便商家在移动端网页应用中集成支付宝支付功能&#xff0c;支付宝提供了手机网站支付能力。 流程简介&#xff1a;商家在网页中调用支付宝提供的网页支付接口调起支付宝客户端内的支付模块&#xff0c;商家网页会跳转…

【报错】npm install --save core-js/modules/es.array.push.js

代码写着写着&#xff0c;一运行突然就报了下面这么个错误 一开始没细看&#xff0c;以为是自己代码逻辑哪里写错&#xff0c;但是检查了一遍下来&#xff0c;好像没啥问题呀 然后后面就跟着执行了一下npm install --save core-js/modules/es.array.push.js 哦豁&#xff0c;还…

【自学前端】我只学这些够吗?好难

表弟也终于到了马上要大学毕业的时间&#xff0c;然后听说我在做前端开发工作&#xff0c;就想着能不能和我一起搞一搞。 我说这又不是小时候一起去地里抓兔子&#xff0c;说走就一起走&#xff0c;拿上工具一起走了&#xff0c;这得学啊。看着表弟期待的眼神&#xff0c;他问了…

【CTF】buuctf web 详解(持续更新)

buuctf web[HCTF 2018]WarmUp[极客大挑战 2019]EasySQL[极客大挑战 2019]Havefun[强网杯 2019]随便注[ACTF2020 新生赛]Include[SUCTF 2019]EasySQL[极客大挑战 2019]Secret File[ACTF2020 新生赛]Exec[极客大挑战 2019]LoveSQL[GXYCTF2019]Ping Ping Ping[极客大挑战 2019]Kni…

从零开始的「校园商铺」毕设全栈开发—开题报告

☕前言&#xff1a; 不知不觉已经在大学中度过了四年时光&#xff0c;春暖花开、桃红柳绿&#xff0c;又到了一年毕设季&#xff0c;恰逢〖新星计划2023〗活动正好有毕设相关的创作方向&#xff0c;号称两小时带我搞定毕设&#xff0c;像我这样喜欢白嫖&#xff08;&#x1f61…

【小程序从0到1】宿主环境|WXML|WXSS|JS逻辑交互

欢迎来到我的博客 &#x1f4d4;博主是一名大学在读本科生&#xff0c;主要学习方向是前端。 &#x1f36d;目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 &#x1f6e0;目前正在学习的是&#x1f525;React/小程序React/小程序React/小程序&am…

cropperjs的简单使用

前言 最近发现了cropperjs&#xff0c;可以用于裁剪图片&#xff0c;特点来踩一下坑。 官方文档 参考文章&#xff1a; cropper.js 裁剪图片并上传&#xff08;文档翻译demo&#xff09; 1小时搞定cropper.js制作头像/图片上传、裁剪、并发送至后端 可以仿gitee的头像上传…

JavaScript WebAPI

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录DOM 基本概念选中页面元素事件初识事件三要素操作元素获取/修改元素内容获取/修改元素属性获取/修改表单元素属性valuetype获取…

JS小知识,如何将 CSV 转换为 JSON 字符串

大家好&#xff0c;今天和大家聊一聊&#xff0c;在前端开发中&#xff0c;我们如何将 CSV 格式的内容转换成 JSON 字符串&#xff0c;这个需求在我们处理数据的业务需求中十分常见&#xff0c;你是如何处理的呢&#xff0c;如果你有更好的方法欢迎在评论区补充。一、使用 csvt…

手写防抖和节流函数

一、认识防抖debounce函数 我们用一副图来理解一下它的过程&#xff1a; 当事件触发时&#xff0c;相应的函数并不会立即触发&#xff0c;而是会等待一定的时间&#xff1b;当事件密集触发时&#xff0c;函数的触发会被频繁的推迟&#xff1b;只有等待了一段时间也没有事件触…

【前端进阶】-TypeScript高级类型 | 交叉类型、索引签名类型、映射类型

前言 博主主页&#x1f449;&#x1f3fb;蜡笔雏田学代码 专栏链接&#x1f449;&#x1f3fb;【TypeScript专栏】 上篇文章讲解了TypeScript部分高级类型 详细内容请阅读如下&#xff1a;&#x1f53d; 【前端进阶】-TypeScript高级类型 | 类的初始化、构造函数、继承、成员可…

nvm安装node,配置npm 、cnpm

nvm 是什么&#xff1f; nodejs的版本管理工具&#xff0c;为了解决node.js各种版本存在不兼容现象可以通过它安装和切换不同版本的node.js 重要&#xff1a;完全卸载本地node&#xff0c; 下载链接 卸载完成之后&#xff0c;点击nvm-setup.exe安装版&#xff0c;直接运行n…

不是吧,阿sir,还有人不会制作影院订票系统前端页面吗?(拿来就用)

影院订票系统前端页面&#x1f389;案例分析&#x1f389;详细设计✨座位数据与样式定义✨座位的事件处理及相关的代码✨监听与数据格式化✨电影信息展示&#x1f389;动态操作演示图&#x1f389;源码&#xff08;附图片素材&#xff09;引言&#xff1a;大家好&#xff0c;欢…

npm和cnpm下载安装及VUE的创建

npm和cnpm下载安装及VUE的创建 1. node.js下载 node.js官网&#xff1a; http://nodejs.cn/download/ 下载安装后cmd输入以下命令查看版本 2. 配置npm 打开node.js的安装目录&#xff0c;我这里是D:\nodejs&#xff0c;在此目录下创建两个文件夹”node_global“和”node_ca…

【申请加入New Bing遇到的问题:当前无法使用此页面,cn.bing.com 重定向次数过多】

目录一.前言二.问题描述三.解决方案解决方案1:解决方案2:四.总结一.前言 前面的文章我们详细的讲解了如何加入New Bing&#xff0c;之前我们直接加入还可以直接访问&#xff0c;但是现在访问过多就会出现当前无法使用此页面&#xff0c;cn.bing.com 重定向次数过多的问题&…

eslint常见报错及解决

eslint常见报错问题1&#xff1a;Component name "index" should always be multi-word问题2&#xff1a;Newline required at end of file but not found问题3&#xff1a;Strings must use singlequote问题4&#xff1a;Expected indentation of 2 spaces but foun…