手牵手系列之node+koa2+mpvue全栈(后端)

前言

好记性不如烂笔头

 

开始

  • 新建mpvue-shop-node项目目录

初始化

npm init
  • 项目目录下新建app.js

下载koa

npm install koa

下载koa-router

npm install koa-router
  • 启动项目 
node app.js

注意:本项目使用koa@^2.11.0   koa-router@^8.0.6 请使用指定版本,不然会有意向不到的错误。

app.js

const Koa = require('koa')
const Router = require('koa-router')

const app = new Koa()
const router = new Router()

router.get('*', (ctx, next) => {
  ctx.body = 'hello world'
}) // 任何路由都输出hello world

app.use(router.routes()) // 启用这个路由

app.listen(3000, () => {
  console.log('server is started at port 3000')
})

备注:启动项目node app.js ,输出server is started at port 3000。在浏览器输入http://localhost:3000/ 页面展示hello world

  • 项目目录下新建routes路由文件夹
新建index.js文件

const router = require('koa-router')({
  prefix: '/lm'
})

const controllers = require('../controllers/home/index')

router.get('/index/index', controllers)

module.exports = router
  • 项目目录下新建controllers操作数据库文件夹
// 新建home文件夹index.js

const { mysql } = require('../../mysql')

module.exports = async ctx => {
  // 轮播图数据
  const banner = await mysql('nideshop_ad')
    .where({
      ad_position_id: 1
    })
    .select()

  ctx.body = {
    banner: banner
  }
}

 

数据库

  • 连接mysql
mysql -u root -p
psd:root

数据库常用命令:https://blog.csdn.net/saafdgvsdg/article/details/80465406

  • 项目目录下新建config.js文件
// 数据库基本配置
const CONF = {
  port: '5757',
  mysql: {
    host: 'localhost', // 地址
    port: 3306, // 端口号
    user: 'root', // 用户名
    db: 'nodemysql', // 数据库名称
    pass: 'root', // 密码
    char: 'utf8mb4' // 编号格式
  }
}

module.exports = CONF
  • 项目目录下新建mysql.js文件 
// 获取基础配置
const configs = require('./config')

var knex = require('knex')({
  client: 'mysql',
  connection: {
    host: configs.mysql.host,
    port: configs.mysql.port,
    user: configs.mysql.user,
    password: configs.mysql.pass,
    database: configs.mysql.db
  }
}) // 线程池

// 将基础配置和sdk.config 合并 导出初始化完成的sdk

module.exports = { mysql: knex }

下载knex:http://knexjs.org/     

npm install knex

下载mysql

npm install mysql

 

封装后

  • app.js
const Koa = require('koa')
const config = require('./config')

const app = new Koa()

const router = require('./routes')

app.use(router.routes()) // 启用这个路由

app.listen(config.port, () => {
  console.log(`server is started at port ${config.port}`)
})
  • controllers文件夹下index.js
const _ = require('lodash')
const fs = require('fs')
const path = require('path')

//映射 d 文件夹下的文件为模块

const mapDir = d => {
  const tree = {}

  //获取当前文件夹下的所有文件夹和文件,分为两组,文件夹一组,文件一组
  const [dirs, files] = _(fs.readdirSync(d)).partition(p => fs.statSync(path.join(d, p)).isDirectory())
  //映射文件夹
  dirs.forEach(dir => {
    tree[dir] = mapDir(path.join(d, dir))
  })
  //映射文件
  files.forEach(file => {
    //获取文件后缀名字
    if (path.extname(file) === '.js') {
      tree[path.basename(file, '.js')] = require(path.join(d, file))
    }
  })

  return tree
}

//默认导出当前文件夹下的映射
module.exports = mapDir(path.join(__dirname))
  •  routes文件夹index.js向前端暴露接口
const router = require('koa-router')({
  prefix: '/lm'
})

const controllers = require('../controllers')

router.get('/index/index', controllers.home.index)

module.exports = router
  • controllers文件夹下新增不同接口模块
// 新建home文件夹index.js

const { mysql } = require('../../mysql')

module.exports = async ctx => {
  // 轮播图数据
  const banner = await mysql('nideshop_ad')
    .where({
      ad_position_id: 1
    })
    .select()

  ctx.body = {
    banner: banner
  }
}

 

数据库常用命令

  • 查询语句
// 从nideshop_goods表中查找五条由category_id、goods_sn、name三个元素组成的数据

// mysql语句
SELECT category_id,goods_sn,name FROM nideshop_goods WHERE name='商品' LIMIT 5

// node中使用mysql
  const hotGoods = await mysql("nideshop_goods")
    .column("category_id", "name", "goods_sn")
    .where({
      name: '商品',
    })
    .limit(5)
    .select();
  •  插入语句
// 向user表中新增一条id:6、name:王大富、age:29、address:南京市高淳区、性别:女的数据

// mysql语句
INSERT INTO user (id,name,age,address,sex) VALUES (6,'王大富',29,'南京市高淳区','女')

// node中使用mysql
  const data = await mysql("user").insert({
      id: 6,
      name:'王大富',
      age: 29,
      address: '南京市高淳区',
      sex: '女',
    });
  • 删除语句
// 删除user表中id等于4的数据

// mysql语句
DELETE FROM user WHERE id='4'

// node中使用mysql
  const banner = await mysql('user')
    .where({
      id: 4
    })
    .delete()
  • 更新语句
// 更新id等于6的数据,将性别更新为男

// mysql语句
UPDATE user SET sex='男' WHERE id=6

// node中使用语句
const banner = await mysql('user')
    .where({
      id: 6
    })
    .update({
      sex: '女'
    })
  • 模糊查询
// 查询name中带有“活动”字眼的数据

// mysql语句
SELECT * FROM nideshop_ad WHERE name LIKE '%活动%';

// node中使用语句
const banner = await mysql('nideshop_ad').where('name', 'like', '%活动%')
  • 排序
//降序:desc、升序:asc

// mysql语句
select * from 'users' order by 'id' desc

// node中使用语句
const banner = await mysql('users').orderBy('id', 'desc')
// 重点:关联的两个表的数据会被重新合并成一个新的列返回

// MySQL中不支持 FULL OUTER JOIN

// 内关联,返回两张表中某个字段相等列,查询的是满足条件user_detail中的数据

// mysql语句
select * from `user` inner join `user_detail` on `user`.`id` = `user_detail`.`userId`

// node中使用语句
const data = await mysql('user').innerJoin('user_detail', 'user.id', 'user_detail.userId')

// 左关联,查询到的结果就是表 user 全部数据 和 user_detail 的交集
const data = await mysql('user').leftJoin('user_detail', 'user.id', 'user_detail.userId')

// 右关联,询到的结果就是表 user_detail 全部数据和 user 的交集
const data = await mysql('user').rightJoin('user_detail', 'user.id', 'user_detail.userId')

                                                                                                                 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值