node_egg_验证码注册

目录结构
|__app
| |__controller
| | |__register.js
| | |__verifyCode.js
| |__service
| | |__registerTools.js
| | |__verifyTools.js
| |__public
| | |__test.txt/test.png/test.mp4 //存放的上传文件
| |__router.js
|__config
|__config.default.js

|__plugin.js

app/router.js

'use strict';

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  const { router, controller } = app;
  // 注册路由
  router.post('/register', controller.register.register);
  // 验证码路由
  router.get('/verifyCode', controller.verifyCode.verify);
};

app/controller/register.js

'use strict';

const Controller = require('egg').Controller;

// controller 层, 对请求参数进行处理(校验。拼接),然后调用相对应的service方法
class RegisterController extends Controller {
  // 注册模块
  async register() {
    const { ctx } = this;
    // 调用service文件下的registerTools.js的writeToDB方法
    const result = await ctx.service.registerTools.writeToDB();
    // 将数据返回给前端
    ctx.body = result;
  }
}
module.exports = RegisterController;

app/controller/verifyCode.js

'use strict';

const Controller = require('egg').Controller;

class VerifyCodeController extends Controller {
  // 验证模块, 分离模块,各有各的功能,
  async verify() {
    const { ctx } = this;
    // 调用验证模块的captcha方法
    const captcha = await ctx.service.verifyTools.captcha();
    // 返回的类型
    ctx.response.type = 'image/svg+xml';
    // 将数据返回前端
    ctx.body = captcha.data;
  }
}
module.exports = VerifyCodeController;

app/service/registerTools.js

'use strict';

const Service = require('egg').Service;

const fs = require('fs');

// service 层,复杂数据的处理,数据库的存取
class RegisterToolsService extends Service {
  async writeToDB() {
    const { ctx } = this;
    // 接收表单默认post请求的参数
    const data = ctx.request.body;
    // 使用前需要开启文件模式config.default.js配置
    // 上传的文件需通过ctx.request.files获取,返回的是一个数据,保存的上传文件的信息
    const files = ctx.request.files[0];
    // 将上传的缓存文件保存到本地服务器,fs.rename(oldPath, newPath, callback) newpath注意拼接文件的目录和名字
    // files.filepath: 保存的是上传文件的缓存地址,
    fs.rename(files.filepath, `${__dirname}/../public/upload/${files.filename}`, () => {});
    // 将文件的相对地址进行拼接
    data[files.field] = '/upload/' + files.filename;
    // 判断输入的验证是否正确,正确就保存到数据库中,否则就返回相关错误信息
    data.verifyCode = data.verifyCode.toLowerCase();
    // 框架内置了 Session 插件,给我们提供了 ctx.session 来访问或者修改当前用户 Session 。
    // verifyTools.js封装了验证码模块,将验证码text保存到全局ctx.session.code上,可以直接获取,经典的发布者订阅模式/观察者模式
    const result = ctx.session.code.toLowerCase() === data.verifyCode ?
      await this.app.mysql.insert('register', data) :
      { message: 'verifyCode Error' };
    return result;
  }
}

module.exports = RegisterToolsService;

app/service/verifyTools.js

'use strict';

const Service = require('egg').Service;

// npm install svg-captcha --save 下载第三方插件并引入
const svgCaptcha = require('svg-captcha');
// 验证码配置信息
const options = {
  size: 10,
  fontSize: 100,
  width: 500,
  height: 200,
  background: '#cc9966',
};
// size:        验证码长度(显示几个字符)
// fontSize:    验证码的字体大小
// width:       验证码的宽度
// height:      验证码的高度
// background:  验证码的背景颜色
class VerifyToolsService extends Service {
  async captcha() {
    // 第三方插件,实现验证码功能
    const captcha = svgCaptcha.create(options);
    // 将验证码text文本保存到session中
    this.ctx.session.code = captcha.text;
    return captcha;
  }
}
module.exports = VerifyToolsService;

config/config.default.js

// 数据库配置信息
  config.mysql = {
    client: {
      host: 'localhost',
      port: '3306',
      user: 'root',
      password: '123456',
      database: 'userdatabase',
    },
    app: true, // 是否加载到app上,默认开启
    agent: false, // 是否加载到agent上,默认关闭
  };

  // post请求安全规范
  config.security = {
    csrf: {
      enable: false,
    },
  };

  // 上传文件开启file模式
  config.multipart = {
    mode: 'file',
  };

config/plugin.js

//启用mysql插件
mysql: { enable:
true, package: 'egg-mysql', },

猜你喜欢

转载自www.cnblogs.com/JunLan/p/12541898.html