记录一次全栈之旅(1)

485 阅读3分钟

前言

在这之前一直想要打通自己的全栈之路,初心并不是要走全栈开发的道路,而是为了一探后端世界的奥秘,同时也可以减少以后业务开发中的沟通问题。这里选择的技术栈为vue + elmentUI + koa2 + sequelize + mysql + jwt。本文为我项目中的一个demo缩影。话不多说,开干

前期准备(服务端)

koa2 + sequelize + mysql + jwt

  1. 一个自己的mysql
  2. node环境
  3. 安装淘宝镜像
  4. vscode编辑器
  5. 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 projectnpm 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个章节,第二章节展开来写前端部分,第三章节展开来写第一章节和第二章节的结合部分...
文中有不对的地方还请各位看官及时指出,我们一起探讨摸索