فهرست منبع

新增短信图片验证码

nihao 5 سال پیش
والد
کامیت
6044c09938
11فایلهای تغییر یافته به همراه224 افزوده شده و 9 حذف شده
  1. 2 2
      app/controller/.site.js
  2. 2 2
      app/controller/site.js
  3. 58 0
      app/controller/verify.js
  4. 1 1
      app/model/column.js
  5. 1 1
      app/model/menu.js
  6. 1 0
      app/model/site.js
  7. 4 2
      app/router.js
  8. 123 0
      app/service/tool.js
  9. 23 0
      config/config.default.js
  10. 4 0
      config/plugin.js
  11. 5 1
      package.json

+ 2 - 2
app/controller/.site.js

@@ -2,7 +2,7 @@ module.exports = {
   // 添加分站信息
   "create": {
     "parameters": {
-      "requestBody": ["!name", "!site", "!domain", "banner", "!copyright", "theme", "remark", "!content"],
+      "requestBody": ["!name", "!site", "!domain", "banner", "logo","!copyright", "theme", "remark", "!content"],
     },
   },
   // 修改分站信息
@@ -10,7 +10,7 @@ module.exports = {
     "parameters": {
       "params": ["!site"],
     },
-    "requestBody": ["name", "domain", "banner", "copyright", "theme", "remark","content"],
+    "requestBody": ["name", "domain", "banner", "logo","copyright", "theme", "remark","content"],
     "options": {
       "projection": "+content",
     },

+ 2 - 2
app/controller/site.js

@@ -52,8 +52,8 @@ class SiteController extends Controller {
     const site = this.ctx.tenant;
     if (!_.isString(site)) throw new BusinessError(ErrorCode.BADPARAM, '租户信息不存在');
 
-    const { name, domain, banner, copyright, theme, content, remark } = this.ctx.request.body;
-    const res = await this.service.update({ site }, { name, domain, banner, copyright, theme, content, remark }, { projection: '+content' });
+    const { name, domain, banner, logo,copyright, theme, content, remark } = this.ctx.request.body;
+    const res = await this.service.update({ site }, { name, domain, banner, logo, copyright, theme, content, remark }, { projection: '+content' });
     this.ctx.ok({ data: res });
   }
 }

+ 58 - 0
app/controller/verify.js

@@ -0,0 +1,58 @@
+'use strict';
+
+const Controller = require('egg').Controller;
+const stringRandom = require('string-random');
+class VerifyController extends Controller {
+  async index() {
+    const { ctx } = this;
+    ctx.body = { errcode: 0, errmsg: 'ok', data: { id: '1', name: '222' } };
+  }
+
+  // 生成验证码并存入到redis中
+  async verify() {
+    const { ctx, app } = this;
+    const captcha = await this.service.tool.captcha(); // 服务里面的方法
+    ctx.response.type = 'image/svg+xml'; // 返回的类型
+    await app.redis.set('randomcodeimg' + ctx.query.code, captcha.text.toLowerCase(), 'Ex', '1800');
+    // ctx.body = captcha.data; // 返回一张图片
+    this.ctx.ok({ data: captcha.data });
+  }
+
+  // 验证验证码是否正确
+  async check_verify() {
+    const { ctx, app } = this;
+    const body = ctx.request.body;
+    const code_id = body.code_id;
+    const randomcode = await app.redis.get('randomcodeimg' + code_id);
+    if (body.code.toLowerCase() === randomcode) {
+      ctx.ok({ data: [] });
+    } else {
+      ctx.body = { errcode: 1, errmsg: 'error', data: [] };
+    }
+  }
+
+  // 发送短信验证码
+  async sendmessage() {
+    const { ctx, app } = this;
+    const randomstr = stringRandom(6, { letters: false });
+    await this.service.tool.sendmessage(ctx, app, randomstr); // 服务里面的方法
+    await app.redis.set('randomcodephone' + ctx.query.mobile, randomstr, 'Ex', '1800');
+    ctx.ok({ data: [] });
+  }
+
+  // 验证短信验证码
+  async check_message() {
+    const { ctx, app } = this;
+    const body = ctx.request.body;
+    const mobile = body.mobile;
+    const randomcode = await app.redis.get('randomcodephone' + mobile);
+    if (body.code === randomcode) {
+      ctx.ok({ data: [] });
+    } else {
+      await app.redis.set('randomcodephone' + mobile, randomcode, 'Ex', '1500');
+      ctx.body = { errcode: 1, errmsg: 'error', data: [] };
+    }
+  }
+}
+
+module.exports = VerifyController;

+ 1 - 1
app/model/column.js

@@ -31,7 +31,7 @@ const SchemaDefine = {
 };
 const schema = new Schema(SchemaDefine, { 'multi-tenancy': true, toJSON: { virtuals: true } });
 schema.plugin(metaPlugin);
-schema.index({ column: 1 });
+schema.index({ site: 1 });
 schema.index({ 'meta.state': 1 });
 schema.index({ 'meta.createdAt': -1 });
 schema.index({ 'meta.createdAt': -1, top: -1, 'meta.state': 1 });

+ 1 - 1
app/model/menu.js

@@ -33,7 +33,7 @@ const SchemaDefine = {
 };
 const schema = new Schema(SchemaDefine, { 'multi-tenancy': true, toJSON: { virtuals: true } });
 schema.plugin(metaPlugin);
-schema.index({ column: 1 });
+schema.index({ site: 1 });
 schema.index({ 'meta.state': 1 });
 schema.index({ 'meta.createdAt': -1 });
 schema.index({ 'meta.createdAt': -1, top: -1, 'meta.state': 1 });

+ 1 - 0
app/model/site.js

@@ -9,6 +9,7 @@ const SchemaDefine = {
   status: { type: String, default: '0', maxLength: 64 }, // 站点状态:0-正常;1-未激活;2-注销
   domain: { type: String, required: true, maxLength: 128 }, // 域名
   banner: { type: String, required: false, maxLength: 256 }, // 网站Banner图片URL
+  logo: { type: String, required: false, maxLength: 256 }, // 网站logo图片URL
   copyright: { type: String, required: false, maxLength: 256 }, // 版权声明
   theme: { type: String, default: 'default', maxLength: 64 }, // 样式主题
   content: { type: String, required: true, maxLength: 102400, select: false }, // 站点介绍/联系方式

+ 4 - 2
app/router.js

@@ -56,7 +56,9 @@ module.exports = app => {
   router.post('/adminapi/site/delete/:site', controller.site.delete); // 删除分站信息
 
   // 暂定为验证码测试接口
-  // router.get('/adminapi/verify/verify', controller.verify.verify); // 生成验证码并保存
-  // router.get('/adminapi/verify/sendmessage', controller.verify.sendmessage); // 生成验证码并保存
+  router.get('/adminapi/verify/verify', controller.verify.verify); // 生成验证码并保存
+  router.post('/adminapi/verify/check_verify', controller.verify.check_verify); // 检测验证码
+  router.get('/adminapi/verify/sendmessage', controller.verify.sendmessage); // 发送手机验证码并保存
+  router.post('/adminapi/verify/check_message', controller.verify.check_message); // 检测手机验证码
 
 };

+ 123 - 0
app/service/tool.js

@@ -0,0 +1,123 @@
+/* eslint-disable strict */
+const Service = require('egg').Service;
+const svgCaptcha = require('svg-captcha');
+// const cheerio = require('cheerio');
+// const puppeteer = require('puppeteer');
+
+class ToolsService extends Service {
+
+  // 产生验证码
+  async captcha() {
+    const captcha = svgCaptcha.create({
+      size: 4, // 大小
+      fontSize: 50, // 字体大小
+      width: 100, // 宽
+      height: 40, // 高
+      bacground: '#cc9966', // 背景色
+    });
+    return captcha;
+  }
+
+  // 发送短信验证码
+  async sendmessage(ctx, app, randomstr) {
+    const message = '【吉林省就业中心】您的验证码为:' + randomstr + ',请在30分钟内完成输入,欢迎使用吉林省智慧就业企业服务平台。';
+    const data = '?Id=300&Name=wwqcgh&Psw=jljyzx-wwqcgh&Message=' + message + '&Phone=' + ctx.query.mobile + '&Timestamp=0';
+    // const data = '?Id=300&Name=wwqcgh&Psw=jljyzx-wwqcgh&Message=' + message + '&Phone=' + phone + '&Timestamp=0';
+    const path = ctx.app.config.messageDir + data;
+    const result = await app.curl(path, {
+      method: 'GET',
+      dataType: 'text/xml',
+    });
+    return result;
+  }
+
+  async spider(ctx, app) {
+    const url = 'http://job.ccut.edu.cn/module/getindustry?start_page=1&k=&type_id=300025&count=15&start=1&_=1564563909055';
+    const result = await app.curl(url, {
+      method: 'GET',
+      dataType: 'json',
+    });
+    // const dataarray = result.data.data;
+    // for(let i = 0;i < dataarray.length; i++){
+    //   const dataInfo = dataarray[i];
+    //   const info_id = dataInfo.info_id;
+    //   const path = 'http://job.ccut.edu.cn/detail/industry?menu_id=&type_id=300025&id=' + info_id;
+    //   const res = await app.curl(path, {
+    //     method: 'GET',
+    //     dataType: 'json',
+    //   });
+    //   console.log(result.data);
+    //   const data = JSON.parse(response.data);
+    //   console.log(data);
+    //   // console.log(info_id);
+    //   // const browser = await puppeteer.launch({
+    //   //   headless: true, // 使用无头浏览器抓取
+    //   // });
+    //   // const page = await browser.newPage();
+    //   // // 设置客户端
+    //   // await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36');
+    //   // await page.goto('http://job.ccut.edu.cn/detail/industry?menu_id=&type_id=300025&id='+info_id, {
+    //   //   waitUntil: [ 'domcontentloaded' ],
+    //   // });
+    //   // await page.screenshot({ path: 'static.png' });
+    //   // const data = await page.evaluate(() => {
+    //   //   var storage = {};
+    //   //   // 单页爬取
+    //   //   var $div = $('#data_details');
+    //   //   storage = {
+    //   //     title: $div.find('.dh-tit').html(),
+    //   //     time: $div.find('.dh-info').html(),
+    //   //     content: $div.find('.details-content').html(),
+    //   //   };
+    //   //   return storage;
+    //   // });
+    //   //console.log(resultInfo.data.data);
+    // }
+    return result.data.data;
+    // console.log(result.data.toString('utf8',0,result.data.length));
+
+    // const data = JSON.parse(result.data);
+    // eslint-disable-next-line no-undef
+    // const $ = cheerio.load(result);
+    // const resultStr = [];
+    // $('#DivInfoList').find('table').find('tr').each(function(index,ele) {
+    //   console.log(111);
+    //   var obj = {};
+    //   obj.jobName = $(this).find('td').find('a').text();
+    //   //obj.salary = $(this).find('.red').text();
+    //   resultStr.push(obj);
+    // });
+    // const browser = await puppeteer.launch({
+    //   headless: true, // 使用无头浏览器抓取
+    // });
+    // const page = await browser.newPage();
+    // // 设置客户端
+    // await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36');
+    // await page.goto('http://job.ccut.edu.cn/module/getindustry?start_page=1&k=&type_id=300025&count=15&start=1&_=1564563909055', {
+    //   waitUntil: [ 'domcontentloaded' ],
+    // });
+    // await page.screenshot({ path: 'static.png' });
+    // const data = await page.evaluate(() => {
+    //   var storage = [];
+    //   // 单页爬取
+    //   var $table = $('#DivInfoList table tbody');
+    //   if ($table.length) {
+    //     $table.find('tr').each(function (index, item) {
+    //       if (index !== 0) {
+    //         var $td = $(item).find('td');
+    //         storage.push({
+    //           title: $td.eq(1).find('a').html(),
+    //           time: $td.eq(2).html(),
+    //         });
+    //       }
+    //     });
+    //   }
+    //   return storage;
+    // });
+    // console.log(data);
+    // await browser.close();
+    // return JSON.stringify(data);
+  }
+}
+
+module.exports = ToolsService;

+ 23 - 0
config/config.default.js

@@ -22,6 +22,16 @@ module.exports = appInfo => {
     details: true
   };
 
+  // add redis
+  config.redis = {
+    client: {
+      port: 6379,
+      host: '127.0.0.1',
+      password: '',
+      db: 0,
+    },
+  };
+
   // mongoose config
   config.mongoose = {
     url: 'mongodb://localhost:27017/cms',
@@ -35,5 +45,18 @@ module.exports = appInfo => {
     }
   };
 
+  // // base路径
+  // config.baseDir = 'http://smart.cc-lotus.info';
+  // // 企业信息url
+  // config.corpsDir = '/api/corp/corps/';
+  // // 学校信息url
+  // config.schsDir = '/api/sch/schs/';
+  // // 招聘简章url
+  // config.profilesDir = '/api/jobs/profiles/';
+  // // 双选会url
+  // config.fairsDir = '/api/jobs/fairs/';
+  // 短信验证码接口url
+  config.messageDir = 'http://sms.bdt360.com:8180/Service.asmx/SendMessageStr';
+
   return config;
 };

+ 4 - 0
config/plugin.js

@@ -6,3 +6,7 @@
 exports.multiTenancy = {
   enable: true,
 };
+exports.redis = {
+  enable: true,
+  package: 'egg-redis',
+};

+ 5 - 1
package.json

@@ -7,7 +7,11 @@
     "framework": "naf-framework-mongoose"
   },
   "dependencies": {
-    "naf-framework-mongoose": "^0.6.12"
+    "egg-redis": "^2.4.0",
+    "naf-framework-mongoose": "^0.6.12",
+    "redis": "^2.8.0",
+    "string-random": "^0.1.3",
+    "svg-captcha": "^1.4.0"
   },
   "devDependencies": {
     "autod": "^3.1.0",