手牵手系列之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.jsconst 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 worldapp.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.jsconst { 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 合并 导出初始化完成的sdkmodule.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.jsconst { 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中使用mysqlconst 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中使用mysqlconst data = await mysql("user").insert({id: 6,name:'王大富',age: 29,address: '南京市高淳区',sex: '女',});
- 删除语句
// 删除user表中id等于4的数据// mysql语句
DELETE FROM user WHERE id='4'// node中使用mysqlconst 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.csdn.net/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')
手牵手系列之node+koa2+mpvue全栈(后端)相关推荐
- react apollo_Apollo GraphQL:如何使用React和Node Js构建全栈应用
react apollo Apollo Client is a complete state management library for JavaScript apps. It's a powerf ...
- Node.js(MEAN)全栈开发入门-安晓辉-专题视频课程
Node.js(MEAN)全栈开发入门-28082人已学习 课程介绍 本课程从Node.js切入,以实现一个Web管理系统为目标,以点带面地介绍MEAN技术栈(MongoDB+Expr ...
- node.js之全栈开发
node.js之全栈开发 1.为什么要学习Node.js Node.js是什么 Node能做什么 一些资源 学习到什么 2.Node 2.1起步 安装Node环境 解析执行JavaScript 2.2 ...
- Node.js API 全栈 开发框架
Node.js 框架 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Node ...
- kubectl查看node状态_全栈之路:使用pm2自动化部署node项目
相关前三篇 全栈之路:前端工程师如何从 0 开始了解 Docker 全栈之路:vue-cli3 项目从搭建优化到docker部署 全栈之路:从零搭建docker+jenkins+node.js自动化部 ...
- 手牵手系列之搭建Vue+Electron项目
https://blog.csdn.net/weixin_41549915/article/details/110931264 前言 electron:使用 JavaScript,HTML 和 CSS ...
- 手牵手系列之TypeScript开发环境搭建
新建项目 初始化 npm init 安装全局依赖 npm install typescript tslint -g 执行命令初始化,项目根目录生成tsconfig.json文件 tsc --init ...
- 手牵手系列之记录JavaScript高级程序设计(第3版)
背景 <JavaScript高级程序设计>可谓是前端工程师的圣典,全书比较基础讲述js的知识点.最初想要读这本书并做笔记的目的是巩固基础知识点,弥补不足,希望自己能坚持下来,争取每天都能有 ...
- vue2+node实现全栈多人视频会议
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 项目前言 一.前期准备 二.开发展示 三.开发过程 1.环境配置 2.源码目录 3.运行 4.部署上线 总结 项目前言 场景 ...
最新文章
- 程序员因开发速度太慢而遭公司起诉,索赔金额高达90万!
- python有时候没有智能提示_python没有报错提示
- c# redis hashid如何设置过期时间_Redis数据库实现原理(划重点)
- .net中怎样实现json转化时仅仅处理部分属性二?
- elementui 上传七牛_element ui使用上传组件上传文件到七牛(qiniu-js)
- axure命令行_Axure变量详解
- 文档安全管理系统服务器地址是什么,一种文档安全管理系统登录方法及装置
- [luoguP1005] 矩阵取数游戏(DP + 高精度)
- 计算机三级嵌入式系统考试之矩阵键盘
- 吴恩达神经网络和深度学习-学习笔记-29-卷积的基础知识
- 14、数 据 库:破解还原Access数据库密码
- c语言编fft算法程序,FFT算法的C语言编程
- html跳转页面携带数据
- 易中天:望子成人,而非望子成龙
- 使用C语言求斐波那契(Fibonacci)数列的第n项
- PAT乙级10019题——C语言
- 双堆1.数据流的中位数
- next主题搭建相册(无需安装插件,代码即可实现)
- Git及Github之入门到进阶
- 评标专家和评标专家库管理暂行办法:评标专家享有的权利