分享 koa + mysql 的开发流程,构建 node server端,一次搭建个人博客
前言
由于一直在用 vue 写业务,为了熟悉下 react 开发模式,所以选择了 react。数据库一开始用的是 mongodb,后来换成 mysql 了,一套下来感觉 mysql 也挺好上手的。react-router、koa、mysql 都是从0开始接触开发的,期间遇到过很多问题,印象最深的是 react-router 参考官方文档配置的,楞是跑不起来,花费了好几个小时,最后才发现看的文档是v1.0, 而项目中是v4.3, 好在可参考的资料比较多,问题都迎刃而解了。
博客介绍
- 前端项目通过 create-react-app 构建,server端通过 koa-generator 构建
- 前后端分离,博客页、后台管理都在 blog-admin 里,对含有 /admin 的路由进行登录拦截
- 前端: react + antd + react-router4 + axios
- server端: koa2 + mysql + sequelize
- 部署:server端 运行在 3000 端口,前端 80 端口,nginx设置代理
喜欢或对你有帮助,欢迎 star
功能
- [x] 登录
- [x] 分页
- [x] 查询
- [x] 标签列表
- [x] 分类列表
- [x] 收藏列表
- [x] 文章列表
- [x] 发布文章时间轴
- [x] 文章访问次数统计
- [x] 回到顶部
- [x] 博客适配移动端
- [ ] 后台适配移动端
- [ ] 对文章访问次数进行可视化
- [ ] 留言评论
- [ ] 渲染优化、打包优化
效果
标签
分类
收藏
文章
编辑
博客页
响应式
运行项目
前端
git clone https://github.com/gzwgq222/blog-admin.git
cd blog-admin
npm install
localhost:2019
server 端
本地安装 mysql,新建 dev 数据库
git clone https://github.com/gzwgq222/blog-server.git
cd blog-server
npm install
server 端
前端 react + antd 开发,较为平缓,在此就不再叙述。主要记录下 koa + mysql 相关事宜
全局安装 koa-generator
npm install -g koa-generato
创建 node-server 项目
koa node-server
安装依赖
cd node-server
npn install
运行
npm dev
出现 Hello Koa 2! 表示运行成功
先看routes文件
index.js
const router = require('koa-router')()
router.get('/', async (ctx, next) => {
await ctx.render('index', {
title: 'Hello Koa 2!'
})
})
router.get('/string', async (ctx, next) => {
ctx.body = 'koa2 string'
})
router.get('/json', async (ctx, next) => {
ctx.body = {
title: 'koa2 json'
}
})
module.exports = router
users.js
const router = require('koa-router')()
router.prefix('/users')
router.get('/', function (ctx, next) {
ctx.body = 'this is a users response!'
})
router.get('/bar', function (ctx, next) {
ctx.body = 'this is a users/bar response'
})
module.exports = router
分别访问下列路由
localhost:3000/string
localhost:3000/users
localhost:3000/bar
大概你已经猜到了,koa-router 定义路由访问时返回相应的内容,那我们只需要把相应的 data 返回去就行了,只是我们的数据得从数据库查询出来。
本地安装 mysql
项目安裝 mysql
npm install mysql --save
项目安裝 sequelize
sequelize 是 ORM node框架,对SQL查询语句的封装,让我们可以用OOP的方式操作数据库
npm install --save sequelize
新建 sequelize.js,建立连接池
const Sequelize = require('sequelize');
const sequelize = new Sequelize('dev', 'root', '123456', {
host: 'localhost',
dialect: 'mysql',
operatorsAliases: false,
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
}
})
sequelize
.authenticate()
.then(() => {
console.log('MYSQL 连接成功......');
})
.catch(err => {
console.error('链接失败:', err);
});
// 根据模型自动创建表
sequelize.sync()
module.exports = sequelize
创建 model、controllers 文件夹 定义model:定义表结构;controller:定义对数据库的查询方法
以 tag.js 为例
model => tag.js
const sequelize = require('../sequelize ')
const Sequelize = require('sequelize')
const moment = require('moment') // 日期处理库
// 定义表结构
const tag = sequelize.define('tag', {
id: {
type: Sequelize.INTEGER(11), // 设置字段类型
primaryKey: true, // 设置为主建
autoIncrement: true // 自增
},
name: {
type: Sequelize.STRING,
unique: { // 唯一
msg: '已添加'
}
},
createdAt: {
type: Sequelize.DATE,
defaultValue: Sequelize.NOW,
get() {
// this.getDataValue 获取当前字段value
return moment(this.getDataValue('createdAt')).format('YYYY-MM-DD HH:mm')
}
},
updatedAt: {
type: Sequelize.DATE,
defaultValue: Sequelize.NOW,
get() {
return moment(this.getDataValue('updatedAt')).format('YYYY-MM-DD HH:mm')
}
}
},
{
// sequelize会自动使用传入的模型名(define的第一个参数)的复数做为表名 设置true取消默认设置
freezeTableName: true
})
module.exports = tag
controller => tag.s 定义了 create、findAll、findAndCountAll、destroy 方法
const Tag = require('../model/tag')
const Op = require('sequelize').Op
const listAll = async (ctx) => {
const data = await Tag.findAll()
ctx.body = {
code: 1000,
data
}
}
const list = async (ctx) => {
const query = ctx.query
const where = {
name: {
[Op.like]: `%${query.name}%`
}
}
const {rows:data, count: total } = await Tag.findAndCountAll({
where,
offset: (+query.pageNo - 1) * +query.pageSize,
limit: +query.pageSize,
order: [
['createdAt', 'DESC']
]
})
ctx.body = {
data,
total,
code: 1000,
desc: 'success'
}
}
const create = async (ctx) => {
const params = ctx.request.body
if (!params.name) {
ctx.body = {
code: 1003,
desc: '标签不能为空'
}
return false
}
try {
await Tag.create(params)
ctx.body = {
code: 1000,
data: '创建成功'
}
}
catch(err) {
const msg = err.errors[0]
ctx.body = {
code: 300,
data: msg.value + msg.message
}
}
}
const destroy = async ctx => {
await Tag.destroy({where: ctx.request.body})
ctx.body = {
code: 1000,
desc: '删除成功'
}
}
module.exports = {
list,
create,
listAll,
destroy
在 routers 文件夹 index.js 中引入定义好的 tag controller ,定义路由
const router = require('koa-router')()
const Tag = require('../controllers/tag')
// tag
router.get('/tag/list', Tag.list)
router.get('/tag/list/all', Tag.listAll)
router.post('/tag/create', Tag.create)
router.post('/tag/destroy', Tag.destroy)
module.exports = router
/* 如每个 route 是单独的文件,可以使用 router.prefix 定义路由前缀
router.prefix('/tag')
router.get('/list', Tag.list)
router.get('/list/all', Tag.listAll)
router.post('/create', Tag.create)
router.post('/destroy', Tag.destroy)
*/
因为 app 中 已经引入 routers 中的 index.js 调用了 app.use了,所以此处不需再引入
在浏览器里输入 localhost:3000/tag/list 就可以看到返回的数据结构了,只不过 data 为空数组,因为我们还没添加进去任何数据
到这里,model 定义表结构、sequelize操作数据库、koa-router 定义路由 这一套流程算是完成了,其他表结构,接口 都是一样定义的
总结
之前没有写过 node server 和 react,算是从零搭建该博客,踩了一些坑,也学到了很多东西,譬如react 开发模式、react-router、sequelize 操作mysql的crud、koa、nginx的配置等等。
麻雀虽小,也是一次完整的前后端开发体验,脱离了浏览器的限制,像海贼王一样,打开了新世界的大门,寻找 onepiece ......
后续会在个人博客中添加关于此次部署文章
Links
初尝 react + Node,错误之处还望斧正,欢迎提 issue
分享 koa + mysql 的开发流程,构建 node server端,一次搭建个人博客的更多相关文章
- SpringBoot技术栈搭建个人博客【后台开发】
前言:在之前,我们已经完成了项目的基本准备,那么就可以开始后台开发了,突然又想到一个问题,就是准备的时候只是设计了前台的RESTful APIs,但是后台管理我们同样也是需要API的,那么就在这一篇里 ...
- SpringBoot技术栈搭建个人博客【前台开发/项目总结】
前言:写前台真的是我不擅长的东西...所以学习和写了很久很久...前台页面大概开发了两天半就开发好了,采用的静态的html和bootstrap来写,写后台的时候纠结住了...怎么说呢,写页面真的是头疼 ...
- 使用Node.js+Hexo+Github搭建个人博客
一.为什么要花时间去搭建个人博客? 首先说说为什么我想要尝试着去搭建属于自己的Blog,古人云:“好记性不如烂笔头”.一开始我把笔记做在本子上.电脑上,发现要用的时候特别地不方便,而且越记越多.越多越 ...
- 基于Hexo+Node.js+github+coding搭建个人博客——基础篇
附上个人教程:http://www.ookamiantd.top/2017/build-blog-hexo-base/ 搭建此博客的动机以及好处在此就不多谈了,之前已经表达过,详情请看Start My ...
- 用Node.JS+MongoDB搭建个人博客(页面模板)(五)(结束)
<差不多先生> 我是差不多先生,我的差不多是天生.也代表我很天真,也代表我是个闲人.这差不多的人生,总是见缝插针. 求学的道路上总是孤独的,即使别人不理解我,认为我是奇葩!但没关系,我会坚 ...
- 使用Node.js+Hexo+Github搭建个人博客(续)
一.写在前面 在我的上一篇博客<使用Nodejs+Hexo+Github搭建个人博客>中,已经介绍了如何使用 Hexo 在 Github Pages 上搭建一个简单的个人博客.该篇博文将在 ...
- [Node.js] 3、搭建hexo博客
一.安装新版本的nodejs和npm 安装n模块: npm install -g n 升级node.js到最新稳定版 n stable 二.安装hexo note: 参考github,不要去其 ...
- 利用GitHub+Node.js+Hexo搭建个人博客
本篇是自己在搭建Hexo博客平台时的一个过程记录.(2019.9.13实测有效) GitHub 账号注册 因为此文所搭建的个人博客是基于GitHub平台服务的,所以首先是注册GitHub,当然已有账号 ...
- Vue、Node全栈项目~面向小白的博客系统~
个人博客系统 前言 ❝ 代码质量问题轻点喷(去年才学的前端),有啥建议欢迎联系我,联系方式见最下方,感谢! 页面有啥bug也可以反馈给我,感谢! 这是一套包含前后端代码的个人博客系统,欢迎各位提出建议 ...
随机推荐
- 关于css文字的扩展
1.不换行: .title{ white-space:nowrap; text-overflow:ellipsis; } 2.超出变三点 .title{ white-space:nowrap; tex ...
- Scrum7
冲刺阶段的总结 一.各个成员今日完成的任务 组员 任务分工 贡献 林泽宇 团队分工.撰写博客.修改完善需求规格说明书.整理代码规范 李涵 后端架构设计 尹海川 logo设计修改.数据库数据 郏敏杰 课 ...
- SSH新学,关于面向对象的看法
流程:model-->dao-->service-->impService-->action 如果只是操作单个的一个表,比如user表,则都写到user的流程中 如果要操作俩个 ...
- 石家庄铁道大学网站首页UI分析
今天的软件工程王老师讲了UI的设计,以前狭隘的认为只有移动设备上的界面叫UI,百度一下才发现UI其实有这么多含义:UI即User Interface的简称.泛指用户的操作界面,UI设计主要指界面的样式 ...
- myeclipse生成类的帮助文档
http://blog.csdn.net/tabactivity/article/details/11807233
- Web站点性能-微观手段
文章:网站性能优化 百度百科:高性能Web站点 文章:构建高性能WEB站点之 吞吐率.吞吐量.TPS.性能测试
- Java String简单知识点总结
1.字符串的比较 public void run(){ //str1在池中 String str1 = new String("String"); //str2,str3 存在于堆 ...
- PAT L1-015 跟奥巴马一起画方块
https://pintia.cn/problem-sets/994805046380707840/problems/994805124398956544 美国总统奥巴马不仅呼吁所有人都学习编程,甚至 ...
- 关于 Oracle Preinstallation RPM
About the Oracle Preinstallation RPM 来源 https://docs.oracle.com/en/database/oracle/oracle-database/1 ...
- 第119天:移动端:CSS像素、屏幕像素和视口的关系
移动前端中常说的 viewport (视口)就是浏览器显示页面内容的屏幕区域.其中涉及几个重要概念是 dip ( device-independent pixel 设备逻辑像素 )和 CSS 像素之间 ...