所需软件:

vscode,官网链接下载:https://code.visualstudio.com/;(也可以用自己习惯的编辑器)
node.js,官网链接下载:http://nodejs.cn/;
mysql,官网链接下载:https://dev.mysql.com/downloads/file/?id=503267;
workbench(一款mysql数据库可视化软件),官网下载:https://downloads.mysql.com/archives/workbench/。
安装自己电脑的合适版本即可。
安装这些一般直接点击下一步即可,对于一些国外的软件注意安装目录中最好不要有中文路径,以免出现问题。

我们在上一章用脚手架创建了koa2的项目目录,大家可以先去那边看看《node.js后端koa2框架koa-generator脚手架代码详解快速创建项目入门(一)

1.安装并启动mysql

相信大家已经安装并开启了mysql了吧,我们接下来进入项目目录终端进行安装mysql和xss(为防攻击插件)插件,输入:npm install mysql xss --save

2.创建文件夹

进入项目根目录创建db文件夹里面创建mysql.js代码如下:

const mysql = require('mysql') // 引用mysql

const con = mysql.createConnection({ // 创建mysql
	host: 'localhost', // //ip或域名
    user: 'root', // 登陆名
    password: 'laikevin', // 输入我们刚开启数据库的密码
    port: '3306', // 默认端口
    database: 'myblog' // 输入我们创建的数据库名
})

con.connect() // 然后连接,断开连接con.end(),一般不需要断开连接

function exec (sql) { // 创建查询mysql的方法,传入一个sql语句
  return new Promise((resolve, reject) => { // 返回promise
    con.query(sql, (err, result) => { // 通过query方法传入sql来获取数据库内容,第二个为回调函数第一个参数为错误代码,第二个为数据库获取到的值
      if (err) { // 判断err是否有错误,则返回reject
        reject(err)
      }
      resolve(result) // 如果没有则返回成功并将从数据库获取来的值返回
    })
  })
}

module.exports = {
  exec, // 最后将方法返回
  escape: mysql.escape // 该方法是保护sql语句插件,一起返回
}

3.workbench来创建数据库数据

以简单的博客内容来演示,我们可以通过workbench来新建一些数据库表,字段以及一些内容,在workbench导航栏部分都有一些创建数据库表格的图标。我们创建了一个myblog数据库,然后在里面的tables创建了一个blogs表格,内容的话自己稍微添加几个即可。
在这里插入图片描述

4.创建controller文件夹

接下来我们在根目录再创建controller文件夹里面放访问数据库的方法,我们在里面创建blog.js文件,代码如下:

const { exec } = require('../db/mysql') // 之前导出出去的访问数据库方法
const xss = require('xss') // 引用xss防xss攻击

const getList = async (author, keyword) => { // 创建getList方法来获取博客数据
  let sql = `select * from blogs where 1=1 ` // 创建sql语句记得有些空格也要添加上不然会报错,该语句意思是查询blogs表的所有字段条件是1=1 因为如果有author或者keyword需要连接上才不会报错。
  if (author) { // 判断传来的author是否有值
    sql += `and author='${author}' ` // 添加到sql语句中,记得后面有空格
  }
  if (keyword) { // 判断传来的keyword是否有值
    sql += `and title like '%${keyword}%' ` // 该语句表示标题中必须包含keyword值
  }
  sql += `order by createtime desc;` // sql最后我们以createtime倒序排序
  return await exec(sql) // 把sql语句传入exec方法,因为该方法返回的是一个promise所有可以使用await(使用await必须再该函数体前面添加async),await的意思简单来说就是能把异步的变成同步,会等待exec的执行并返回数据,最后将exec返回来的数据再返回出去。

}

const getDetail = async (id) => { // 获取内容
  const sql =`select * from blogs where id='${id}'`
  const resArr = await exec(sql)
  return resArr[0]
}

const newBlog = async (newblog = {}) => { // 新建博客
  let { title, content, createtime, author } = newblog
  title = xss(title) // xss包裹是为了防止在内容中添加了sql语句
  content = xss(content)
  const sql = `insert into blogs (title, content, createtime, author) values ('${title}','${content}',${createtime},'${author}')` // 创建sql语句
  const blognewdata = await exec(sql)
  return blognewdata.insertId // 如果新建成功则返回blognewdata的insertId
}

const upDatablog = async (id, updatablog) => { // 更新博客
  const { title, content } = updatablog
  title = xss(title)
  content = xss(content)
  const sql = `update blogs set title='${title}',content='${content}' where id=${id}`
  const blognewdata = await exec(sql)
  return blognewdata.affectedRows > 0 ? true : false // 如果成功更新则返回blognewdata.affectedRows大于0
}

const delBlog = async (id, author) => { // 删除博客
  const sql = `delete from blogs where id=${id} and author='${author}'` // 需要在传入author以防误删
  const blognewdata = await exec(sql)
  return blognewdata.affectedRows > 0 ? true : false
}

module.exports = { // 最后将全部访问数据库方法返回出去。大家可以先试试第一个简单的访问数据库能否连接成功再进行后面的编码
  getList,
  getDetail,
  newBlog,
  upDatablog,
  delBlog
}

5.router文件夹中创建blog.js文件

然后我们进入根目录的router文件夹中创建blog.js文件,代码如下:

const router = require('koa-router')() // 引用路由
const { getList, getDetail, newBlog, upDatablog, delBlog } = require('../controller/blog') // 返回我们刚刚创建的访问数据库方法

router.prefix('/api/blog') // 前端访问后端api必须包含/api/blog
router.get('/list', async (ctx, next) => { // get方法访问链接为:http://localhost:3000/api/blog/list
  const author = ctx.query.author // 从ctx中获取传来的author值
  const keyword = ctx.query.keyword
  const dataList = await getList(author, keyword) // 调用执行getList传入author,keyword,因为它的返回值也是promise所以也可以用await
  ctx.body = { // ctx.body的值为返回给前端的值
  	errno: 0,
  	dataList // 把获取到数据返回给前端
  }
})

router.get('/detail', async (ctx, next) => { // 剩下的方法基本一致,大家可以自己动手写写
  const dataDetail = await getDetail(ctx.query.id) // 传入id,get的方法传给后端的参数都在ctx.query
  ctx.body = {
  	dataDetail,
  	errno: 0
  }
})

router.post('/new', async (ctx, next) => { // 
  let blog = ctx.request.body // post请求全部内容都在ctx.request.body
  blog.createtime = new Date().getDate()
  const data = await newBlog(blog)
  ctx.body = {
  	errno: 0,
  	data
  }
})

module.exports = router // 最后把路由返回回去

6.进入app.js文件

创建完路由后需要在app.js中进行注册才行,代码如下:

const blogs = require('./routes/blog') // 先进行引入。
// 随后找到router路由位置添加上
app.use(blogs.routes(), blogs.allowedMethods()) // 即可完成注册,记得位置要添加到模版一致。
// 

最后我们在浏览器输入:http://localhost:3000/api/blog/list 即可访问到数据库的内容。
最后提供一些mysql的常用简单语句:

-- use myblog; -- 选择myblog数据
-- show tables; -- 显示全部表
-- insert into users (username, `password`, realname) values ('lisi','123','里斯'); -- 添加新建users表格里面有三个字段(列),注意password为系统字段需要加``,values后面为创建的值,每执行一次为添加一条数据
-- select * from users; -- 查询显示users表的全部内容,*表示全部字段
-- select id, username from users; -- 查询显示users表的id,username这两个字段的数据
-- select username, realname from users where username = 'lisi'; -- 查询显示username、realname字段的users表,条件为username = 'lisi'
-- select * from users where username like '%zhang%'; -- 查询显示所有字段的users表条件为username字段内容包含zhang
-- select * from users where username like '%s%'order by id desc; -- -- 查询显示所有字段的users表条件为username字段内容包含zhang,并且倒序排序

-- SET SQL_SAFE_UPDATES = 0; -- 如果sql更新失败则执行此条语句提升权限。
-- update users set password='321' where username='zhangshang'; -- 更新users表的password为321,条件为username等于zhangshang的数据,只有满足条件的数据才会被更新
-- delete from users where username='lisi' -- 删除users表条件为username等于lisi的数据
-- 基本常用的语句都在这,如需更高级的语句还请搜索。

本文章是我一个字一个字的打出来,图也是我自己做, 代码中每一行基本都有解释讲解,也是按照我一个初学者的理解思维去写的,本人也是正在看各种视频学习进步中,发现一些好的会写出来也算给自己加深印象吧,顺便记录一下代码,如果有说的不对的地方还望指出,万分感激!
谢谢


一只正在成长的狮子!大家一起努力。


Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐