前言
好记性不如烂笔头
开始
- 新建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.youkuaiyun.com/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')
- 内关联(inner join)
- 关于内关联、左关联、右关联的概念:https://blog.youkuaiyun.com/u014452812/article/details/85318300
// 重点:关联的两个表的数据会被重新合并成一个新的列返回
// 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')