当前位置: 首页 > news >正文

山西中小学网站建设文登建设局网站

山西中小学网站建设,文登建设局网站,南京网站开发南京乐识专心,网站权重提升工具没有特别的幸运#xff0c;那么就特别的努力#xff01;#xff01;#xff01; 中间件#xff1a;页面生成图片 node-egg 涉及到技术node egg Puppeteer 解决文书智能生成多样化先看效果环境准备初始化项目 目录结构核心代码 完整代码https://gitee.com/hammer1010_ad…没有特别的幸运那么就特别的努力 中间件页面生成图片 node-egg 涉及到技术node egg Puppeteer 解决文书智能生成多样化先看效果环境准备初始化项目 目录结构核心代码 完整代码https://gitee.com/hammer1010_admin/node-egg 涉及到技术 node egg Puppeteer 官方网址 nodehttps://nodejs.org/dist/v16.17.0/ egg https://www.eggjs.org/zh-CN/ Puppeteer https://zhaoqize.github.io/puppeteer-api-zh_CN/#/ 本次使用node版本16.17.0 解决文书智能生成多样化 场景1 比如全国有34个省份每个省份文书模板不一样 场景2 条件不一样文书生成格式布局不一样 先看效果 以百度地址为例 — https://www.baidu.com 1. 启动项目后 http://192.168.XX.XX:7400/ (浏览器访问 端开以你本机为准)2. 通过postman测试接口地址http://192.168.XX.XX:7400/canvas/getImage post请求 参数 {url: https://www.baidu.com }效果图 环境准备 操作系统支持 macOSLinuxWindows 运行环境建议选择 LTS 版本最低要求 8.x。 初始化项目 $ mkdir node-egg $ cd node-egg $ npm init $ npm i egg --save $ npm i egg-bin --save-dev $ npm i sentry/node events generic-pool puppeteer -D添加 npm scripts 到 package.json {name: pdf,version: 1.0.0,description: ,main: app.js,scripts: {dev: egg-bin dev},author: hammer1010,license: ISC,dependencies: {sentry/node: ^7.60.1,egg: ^3.17.3,events: ^3.3.0},devDependencies: {egg-bin: ^6.4.1,generic-pool: ^3.9.0,puppeteer: ^20.9.0} }目录结构 egg-example ├── app │ ├── controller │ │ └── home.js │ │ └── XX.js │ ├── plugins │ │ └── puppeteer-pool.js │ ├── service │ │ └── canvas.js │ └── router.js ├── config │ └── config.default.js └── package.json主要就是一个puppeteer-pool 线程池新建一个puppeteer-pool.js文件 use strict; const puppeteer require(puppeteer); const genericPool require(generic-pool);/*** 初始化一个 Puppeteer 池* param {Object} [options{}] 创建池的配置配置* param {Number} [options.max10] 最多产生多少个 puppeteer 实例 。如果你设置它请确保 在引用关闭时调用清理池。 pool.drain().then(()pool.clear())* param {Number} [options.min1] 保证池中最少有多少个实例存活* param {Number} [options.maxUses2048] 每一个 实例 最大可重用次数超过后将重启实例。0表示不检验* param {Number} [options.testOnBorrow2048] 在将 实例 提供给用户之前池应该验证这些实例。* param {Boolean} [options.autostartfalse] 是不是需要在 池 初始化时 初始化 实例* param {Number} [options.idleTimeoutMillis3600000] 如果一个实例 60分钟 都没访问就关掉他* param {Number} [options.evictionRunIntervalMillis180000] 每 3分钟 检查一次 实例的访问状态* param {Object} [options.puppeteerArgs{}] puppeteer.launch 启动的参数* param {Function} [options.validator(instance)Promise.resolve(true))] 用户自定义校验 参数是 取到的一个实例* param {Object} [options.otherConfig{}] 剩余的其他参数 // For all opts, see opts at https://github.com/coopernurse/node-pool#createpool* return {Object} pool*/ const initPuppeteerPool (options {}) {const {max 10,min 2,maxUses 2048,testOnBorrow true,autostart false,idleTimeoutMillis 3600000,evictionRunIntervalMillis 180000,puppeteerArgs {},validator () Promise.resolve(true),...otherConfig} options;const factory {create: () puppeteer.launch(puppeteerArgs).then(instance {// 创建一个 puppeteer 实例 并且初始化使用次数为 0instance.useCount 0;return instance;}),destroy: instance {instance.close();},validate: instance {// 执行一次自定义校验并且校验校验 实例已使用次数。 当 返回 reject 时 表示实例不可用return validator(instance).then(valid Promise.resolve(valid (maxUses 0 || instance.useCount maxUses)));},};const config {max,min,testOnBorrow,autostart,idleTimeoutMillis,evictionRunIntervalMillis,...otherConfig,};const pool genericPool.createPool(factory, config);const genericAcquire pool.acquire.bind(pool);// 重写了原有池的消费实例的方法。添加一个实例使用次数的增加pool.acquire () genericAcquire().then(instance {instance.useCount 1;return instance;});pool.use fn {let resource;return pool.acquire().then(r {resource r;return resource;}).then(fn).then(result {// 不管业务方使用实例成功与否都表示一下实例消费完成pool.release(resource);return result;},err {pool.release(resource);throw err;});};return pool; };module.exports { initPuppeteerPool };核心代码 use strict;const Service require(egg).Service; const path require(path);const { mkdirSyncGuard, __Time, generateGuid } require(../../util);// const regx /^(?:http(s)?:\/\/)?[\w.-](?:\.[\w\.-])[\w\-\._~:/?#[\]!\$\*\,;.]$/; // 校验URL合法性 const regx /(^(http|https):\/\/([\w\-]\.)[\w\-](\/[\w\u4e00-\u9fa5\-\.\/?\\%\!\\{\}\\\[\]\\~\:\#\;\,]*)?)/;class CanvasService extends Service {// 截图async generateImage({ url, width, height, isMobile, deviceScaleFactor }) {const { app } this;const fileDir __Time(new Date()).substr(0, 10);// path.resolve() 拼接路径 __dirname 获取文件所在的绝对路径const fileTempPath path.resolve(__dirname, ../public/canvas, fileDir); // 文件临时路径mkdirSyncGuard(fileTempPath); // 递归检查目录if (!regx.test(url)) return null;try {const FileName ${generateGuid()}.png;const ImagePath path.join(fileTempPath, FileName);await app.pool.use(async puppeteerInstance {const page await puppeteerInstance.newPage();width height await page.setViewport({ width, height, isMobile, deviceScaleFactor });await page.goto(url, { waitUntil: networkidle2 });await page.screenshot({ path: ImagePath, type: png, fullPage: true, width: width || 768 });await page.close();});return canvas/${fileDir}/${FileName};} catch (e) {console.log(e);}}/*** 生成PDF* param {object} param 参数*/async generatePDF({ url, width undefined, height undefined, isMobile undefined, deviceScaleFactor 1, format undefined, margin undefined, printBackground true }) {const { app } this;const fileDir __Time(new Date()).substr(0, 10);const fileTempPath path.resolve(__dirname, ../public/canvas, fileDir); // 文件临时路径mkdirSyncGuard(fileTempPath); // 递归检查目录if (!regx.test(url)) return null;try {const FileName ${generateGuid()}.pdf;const FilePath path.join(fileTempPath, FileName);await app.pool.use(async puppeteerInstance {const page await puppeteerInstance.newPage();width height await page.setViewport({ width, height, isMobile, deviceScaleFactor });await page.goto(url, {waitUntil: networkidle2,});// I dontt no Whyformat await page.pdf({ path: FilePath, omitBackground: true, displayHeaderFooter: true, printBackground: Boolean(printBackground), width: width || 768, height: height || 1400, format: format || letter, margin: margin || 0 });!format await page.pdf({ path: FilePath, omitBackground: true, displayHeaderFooter: true, printBackground: Boolean(printBackground), width: width || 768, height: height || 1400, margin: margin || 0 });await page.close();});return canvas/${fileDir}/${FileName};} catch (e) {console.log(e);}} }module.exports CanvasService; 完整代码 https://gitee.com/hammer1010_admin/node-egg 希望能帮助到大家同时祝愿大家在开发旅途中愉快 拿着 不谢 请叫我“锤”
http://www.hkea.cn/news/14522108/

相关文章:

  • 四川省建设主管部门网站上海专业网站建站品
  • 优化网站浏览量怎么看深圳网页设计公司推荐
  • 论坛的网站制作简单网站建设的费用
  • 外国的免费网站网站松江网站设计
  • 教学网站知识库主题 wordpress
  • 影楼手机网站设计佛山专业的做网站
  • 公司网站建设方案书怎么写成都装修办公室公司
  • 建设软件网站哪里有做空包网站的
  • 男人和女人做羞羞的免费网站做试管婴儿的网站
  • 郑州防疫新闻seo搜索引擎优化课程
  • 企业要建设一个网站需要多少钱网站上做404页面怎样做
  • 企业网站推广外包万网制作网站
  • 贵州省住房和城乡建设厅网站报名网沈阳网站选禾钻科技
  • 中山市建设安全监督站网站qq短网址生成
  • 石家庄网站建设登录织梦网站模板源码php
  • 宁波专业网站定制制作服务qq轻聊版
  • 温州网站建设大全无锡百度正规公司
  • 网站设计制作费用同城做推广哪个网站好
  • 襄樊最好网站建设价格深圳手机网站建设价格
  • 花都营销型网站建设公司wordpress分类的id
  • 做网站的开题报告怎么写建设银行官方网站登录
  • 网站建设的难点网络营销与电子商务的区别
  • 山东建设厅执业资格注册中心网站好大夫网站开发单位
  • 做网站去哪找如何做企业网站建设
  • 网站开发 源代码2014网站设计
  • 苏州网站的优化找人做jsp网站
  • php网站建设实例黑龙江跃众品牌策划公司
  • 做旅游网站选什么空间怎样创建快捷方式
  • 站点传统的推广方式主要有什么公司网站建设做的好
  • 网站设计制作用软件中英文企业网站制作