前言
在这之前一直想要打通自己的全栈之路,初心并不是要走全栈开发的道路,而是为了一探后端世界的奥秘,同时也可以减少以后业务开发中的沟通问题。这里选择的技术栈为vue + elmentUI + koa2 + sequelize + mysql + jwt。本文为我项目中的一个demo缩影。话不多说,开干
前期准备(服务端)
koa2 + sequelize + mysql + jwt
- 一个自己的mysql
- node环境
- 安装淘宝镜像
- vscode编辑器
- postman或者apipost
1. 安装mysql
由于win和mac版的配置不太一样,这里就不展开赘述了,可以在自行在网上搜索mysql的安装教程
2. 创建koa2服务
这里单纯的起个后台服务,暂时不涉及前端部分
2.1 全局安装koa-generator
cnpm install koa-generator -g类似vue-cli
2.2 创建项目
koa2 <project>
2.3 进入project目录
cd project
2.4 在project目录下安装项目依赖
cnpm install
2.5 运行项目
cnpm start project或npm run start
2.6 在浏览器中打开
http://localhost:3000
因为项目默认添加了日志打印,所以在浏览器打开该地址时,vscode终端中是这么显示的
3. 安装sequelize和mysql的依赖
使用sequelize操作数据库
3.1 安装依赖
cnpm install sequelize mysql mysql2 --save, 安装依赖
3.2 连接数据库
mkdir config && touch config/db.js, 在项目的根目录下创建config --> db.js,用来配置数据库连接
const Sequelize = require('sequelize');
// 数据库配置
const sqlConfig = {
host: "localhost", // host
database: "xxx", // 数据库表名
user: "xxx", // 数据库账号
password: "xxx", // 数据库密码
};
// sequelize配置
const sequelize = new Sequelize(sqlConfig.database, sqlConfig.user, sqlConfig.password,{
host: sqlConfig.host,
dialect: 'mysql', // 方言
pool: {
max: 5,
min: 0,
idle: 10000,
acquire: 30000
}
});
module.exports = {
sequelize
};
3.3 定义数据库模型
mkdir module && touch module/table.js,在根目录下创建module --> table.js,用来定义模型,并且通过sequelize和数据库中的table表格式相对应
module.exports = function (sequelize, DataTypes) {
// sequelize.define(数据库中的表名,{字段类型});
return sequelize.define(
'table', {
id: {
type: DataTypes.INTEGER(11),
allowNull: true, // 设置为false时,会给添加NOT NULL(非空)约束,数据保存时会进行非空验证
comment: 'ID', // 字段描述(自1.7+后,此描述不再添加到数据库中
autoIncrement: true, // 是否自增
primaryKey: true, // 指定是否是主键
unique: true, // 设置为true时,会为列添加唯一约束
},
first_name: {
type: DataTypes.STRING(50),
},
last_name: {
type: DataTypes.STRING(50),
},
email: {
type: DataTypes.STRING(254),
},
phone: {
type: DataTypes.STRING(31),
}
})
};
3.4 操作数据库和功能定义
mkdir controller && touch controller/table.js,在根目录下创建controller --> table.js,用来操作数据库的增、删、查、改和功能(权限)的处理
//引入db配置
const db = require('../config/db')
//引入sequelize对象
const Sequelize = db.sequelize
//引入数据表模型
const user = Sequelize.import('../module/table');
//自动创建表
user.sync({
force: false
});
//数据库操作类
class tableModule {
static async tableRegist(data) {
console.log(`tableRegist start ${JSON.stringify(data)}`)
return await user.create({
first_name: data.first_name,
last_name: data.last_name,
email: data.email,
phone: data.phone
})
}
}
// 1. 增 --> 创建新的application
class tableController {
static async create(ctx) {
const req = ctx.request.body; // 在这里直接打印ctx的话是在request里面看不到body信息的
console.log(`req: ${JSON.stringify(req)}`)
// TODO:
// jwt --> 权限功能处理
try {
console.log(`start`)
const param = {
first_name: req.first_name,
last_name: req.last_name,
email: req.email,
phone: req.phone
}
const data = await tableModule.tableRegist(param);
console.log(`data: ${JSON.stringify(data)}`)
ctx.response.status = 200; // 返回状态值
ctx.body = { // 返回对应的内容
code: 0,
desc: '添加成功',
data
}
} catch (error) {
ctx.response.status = 416;
ctx.body = {
code: -1,
desc: '添加失败'
}
}
}
}
module.exports = userController;
3.5 路由(接口)设置
touch routes/table.js,在根目录下创建routes --> table.js,用来创建路由(接口)
const Router = require('koa-router');
const tableController = require('../controller/table')
const router = new Router({
prefix: '/test' // 前缀
});
// 添加用户信息
router.post('/add',tableController.create)
// router.get('/add',tableController.create)
module.exports = router;
4. 配置app.js
const Koa = require('koa')
const app = new Koa()
const views = require('koa-views')
const json = require('koa-json')
const onerror = require('koa-onerror')
const bodyparser = require('koa-bodyparser')
const logger = require('koa-logger')
// 定义路由模块
const index = require('./routes/index')
const users = require('./routes/users')
// table
const table = require('./routes/table')
// error handler
onerror(app)
// middlewares
app.use(bodyparser({
enableTypes:['json', 'form', 'text']
}))
app.use(json())
app.use(logger())
app.use(require('koa-static')(__dirname + '/public'))
app.use(views(__dirname + '/views', {
extension: 'pug'
}))
// logger
app.use(async (ctx, next) => {
const start = new Date()
await next()
const ms = new Date() - start
console.log(`ctxdasdas: ${JSON.stringify(ctx)}`)
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
})
// routes
app.use(index.routes(), index.allowedMethods())
app.use(users.routes(), users.allowedMethods())
// table
app.use(table.routes(), table.allowedMethods())
// error-handling
app.on('error', (err, ctx) => {
console.error('server error', err, ctx)
});
module.exports = app
5. 跑起来,postman
npm run dev,在vscode终端运行,然后再打开postman测试接口http://localhost:3000/test/add
后续补上postman的操作图
结语
本文还有mysql、jwt、postman没有补上,后续增加。
该系列一共3个章节,第二章节展开来写前端部分,第三章节展开来写第一章节和第二章节的结合部分...
文中有不对的地方还请各位看官及时指出,我们一起探讨摸索