Typora结合LightBox放大查看图片

在Typora中,图片一旦插入,最大宽度只能是页面宽度,而无法放大查看,有时,原图片比较大,放到Typora中,完全无法看清内容,比如要看截图中的代码,无法看清:

这里使用LightBox,来实现类似WPS放大预览图片的功能。

  • Typora版本:0.9.98
  • LightBox版本:2.11.3

下载LightBox

  • 可以从Github下载:https://github.com/lokesh/lightbox2

  • 也可以使用npm下载

    npm install lightbox2 --save
    

具体用法可以参考LightBox官网:https://lokeshdhakar.com/projects/lightbox2/

要使用的文件在dist目录中:

拷贝文件

将dist目录中的文件拷贝到Typora的安装目录下。

我在安装目录的resources\app文件夹下,新建了extend文件夹,用来存放扩展插件的,dist目录下的文件也放到了这。

修改window.html文件

位置:Typora安装目录\resources\app\window.html(这个文件实际就是Typora的主界面)

引入 css 文件

可以搜索<script type="text/x-mathjax-config">,在它的前面添加:

<!-- 在<head>标签里引入lightbox.min.css -->
<link rel="stylesheet" href="./extend/lightbox2/css/lightbox.min.css" crossorigin="anonymous">

引入 js 文件

可以搜索<script src="./app/window/frame.js" defer="defer"></script>,然后在它的后面添加:

<!-- 在文件的最后,引入lightbox.js -->
<script type="text/javascript" src="./extend/lightbox2/js/lightbox.js" defer="defer"></script>


修改完成,保存。

修改 lightbox.js 文件

因为lightbox需要有 a 标签包围着 img 标签,相应的点击事件是绑定在 a 标签上的,且需要 hrefdata-lightboxdata-alt 等属性,而Typora中的图片只有 img 标签,父级没有 a 标签,也没有相应要求的属性。因此需要改造一下 lightbox.js 文件。

为img标签绑定双击事件

修改enable函数,添加红色框中的代码

修改属性值获取

lightbox用到三个属性:althreftitle,这三个属性在img标签中均有对应的。

修改start函数,换成img对应属性:

还有另外一个属性data-lightbox,img没有该属性,因此这里不使用,lightbox中有一段判断是否有该属性的代码,修改不存在该属性时的逻辑代码(注释掉原有的,添加addToAlbum($link)):

修改完成,保存即可。

启动Typora,验证

双击要放到查看的图片,如放大上面的截图:

JS代码

多加了几个功能20210921:

  • 双击放大图片,再双击关闭放大的图片
  • 放大的图片,可使用滚轮另外进行缩放

(function (root, factory) {if (typeof define === 'function' && define.amd) {// AMD. Register as an anonymous module.define(['jquery'], factory);} else if (typeof exports === 'object') {// Node. Does not work with strict CommonJS, but// only CommonJS-like environments that support module.exports,// like Node.module.exports = factory(require('jquery'));} else {// Browser globals (root is window)root.lightbox = factory(root.jQuery);}
}(this, function ($) {function Lightbox(options) {this.album = [];this.currentImageIndex = void 0;this.init();// optionsthis.options = $.extend({}, this.constructor.defaults);this.option(options);}// Descriptions of all options available on the demo site:// http://lokeshdhakar.com/projects/lightbox2/index.html#optionsLightbox.defaults = {albumLabel: 'Image %1 of %2',alwaysShowNavOnTouchDevices: false,fadeDuration: 0,fitImagesInViewport: true,imageFadeDuration: 0,// maxWidth: 800,// maxHeight: 10,positionFromTop: 10,resizeDuration: 0,showImageNumberLabel: true,wrapAround: false,disableScrolling: false,/*Sanitize TitleIf the caption data is trusted, for example you are hardcoding it in, then leave this to false.This will free you to add html tags, such as links, in the caption.If the caption data is user submitted or from some other untrusted source, then set this to trueto prevent xss and other injection attacks.*/sanitizeTitle: false};Lightbox.prototype.option = function(options) {$.extend(this.options, options);};Lightbox.prototype.imageCountLabel = function(currentImageNum, totalImages) {return this.options.albumLabel.replace(/%1/g, currentImageNum).replace(/%2/g, totalImages);};Lightbox.prototype.init = function() {var self = this;// Both enable and build methods require the body tag to be in the DOM.$(document).ready(function() {self.enable();self.build();});};// Loop through anchors and areamaps looking for either data-lightbox attributes or rel attributes// that contain 'lightbox'. When these are clicked, start lightbox.Lightbox.prototype.enable = function() {var self = this;$('body').on('click', 'a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]', function(event) {self.start($(event.currentTarget));return false;});//为img绑定双击事件,但要排除本就是双击放大展示的图片$('body').on('dblclick', "img:not([class='lb-image'])", function(event) {self.start($(event.currentTarget));self.$image.css("zoom", "100%")return false;});};// Build html for the lightbox and the overlay.// Attach event handlers to the new DOM elements. click click clickLightbox.prototype.build = function() {if ($('#lightbox').length > 0) {// return;}var self = this;// The two root notes generated, #lightboxOverlay and #lightbox are given// tabindex attrs so they are focusable. We attach our keyboard event// listeners to these two elements, and not the document. Clicking anywhere// while Lightbox is opened will keep the focus on or inside one of these// two elements.//// We do this so we can prevent propogation of the Esc keypress when// Lightbox is open. This prevents it from intefering with other components// on the page below.//// Github issue: https://github.com/lokesh/lightbox2/issues/663$('<div id="lightboxOverlay" tabindex="-1" class="lightboxOverlay"></div><div id="lightbox" tabindex="-1" class="lightbox"><div class="lb-outerContainer" style="overflow:auto;"><div class="lb-container"><img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt=""/><div class="lb-nav"><a class="lb-prev" aria-label="Previous image" href="" ></a><a class="lb-next" aria-label="Next image" href="" ></a></div><div class="lb-loader"><a class="lb-cancel"></a></div></div></div><div class="lb-dataContainer"><div class="lb-data"><div class="lb-details"><span class="lb-caption"></span><span class="lb-number"></span></div><div class="lb-closeContainer"><a class="lb-close"></a></div></div></div></div>').appendTo($('body'));// Cache jQuery objectsthis.$lightbox       = $('#lightbox');this.$overlay        = $('#lightboxOverlay');this.$outerContainer = this.$lightbox.find('.lb-outerContainer');this.$container      = this.$lightbox.find('.lb-container');this.$image          = this.$lightbox.find('.lb-image');this.$nav            = this.$lightbox.find('.lb-nav');// Store css values for future lookupthis.containerPadding = {top: parseInt(this.$container.css('padding-top'), 10),right: parseInt(this.$container.css('padding-right'), 10),bottom: parseInt(this.$container.css('padding-bottom'), 10),left: parseInt(this.$container.css('padding-left'), 10)};this.imageBorderWidth = {top: parseInt(this.$image.css('border-top-width'), 10),right: parseInt(this.$image.css('border-right-width'), 10),bottom: parseInt(this.$image.css('border-bottom-width'), 10),left: parseInt(this.$image.css('border-left-width'), 10)};// Attach event handlers to the newly minted DOM elementsthis.$overlay.hide().on('click', function() {self.end();return false;});this.$lightbox.hide().on('click', function(event) {if ($(event.target).attr('id') === 'lightbox') {self.end();}});this.$outerContainer.on('click', function(event) {if ($(event.target).attr('id') === 'lightbox') {self.end();}return false;});this.$lightbox.find('.lb-prev').on('click', function() {if (self.currentImageIndex === 0) {self.changeImage(self.album.length - 1);} else {self.changeImage(self.currentImageIndex - 1);}return false;});this.$lightbox.find('.lb-next').on('click', function() {if (self.currentImageIndex === self.album.length - 1) {self.changeImage(0);} else {self.changeImage(self.currentImageIndex + 1);}return false;});/*Show context menu for image on right-clickThere is a div containing the navigation that spans the entire image and lives above of it. Ifyou right-click, you are right clicking this div and not the image. This prevents users fromsaving the image or using other context menu actions with the image.To fix this, when we detect the right mouse button is pressed down, but not yet clicked, weset pointer-events to none on the nav div. This is so that the upcoming right-click event onthe next mouseup will bubble down to the image. Once the right-click/contextmenu event occurswe set the pointer events back to auto for the nav div so it can capture hover and left-clickevents as usual.*/this.$nav.on('mousedown', function(event) {if (event.which === 3) {self.$nav.css('pointer-events', 'none');self.$lightbox.one('contextmenu', function() {setTimeout(function() {this.$nav.css('pointer-events', 'auto');}.bind(self), 0);});}});//给放大的图片另外绑定滚轮放大缩小事件this.$container.on('mousewheel', function(event) {event.delta = (event.originalEvent.wheelDelta) ? event.originalEvent.wheelDelta / 120 : -(event.originalEvent.detail || 0) / 3;var zoom = self.$image.css("zoom")zoom = zoom ? zoom * 100 : 100;zoom += event.delta*10;if(zoom > 0)self.$image.css("zoom",zoom + "%")console.log(self.$image.width(),self.$image.height())imageWidth = self.$image.width()imageHeight = self.$image.height()imageWidth = imageWidth*zoom*0.01imageHeight = imageHeight*zoom*0.01self.sizeContainer(imageWidth, imageHeight);return false;}); //给放大的图片另外绑定双击关闭事件this.$container.on('dblclick', function(event) {self.end();return false;}); this.$lightbox.find('.lb-loader, .lb-close').on('click', function() {self.end();return false;});};// Show overlay and lightbox. If the image is part of a set, add siblings to album array.Lightbox.prototype.start = function($link) {var self    = this;var $window = $(window);$window.on('resize', $.proxy(this.sizeOverlay, this));this.sizeOverlay();this.album = [];var imageNumber = 0;function addToAlbum($link) {self.album.push({alt: $link.attr('data-alt') || $link.attr('alt'),link: $link.attr('href') || $link.attr('src'),title: $link.attr('data-title') || $link.attr('title')});}// Support both data-lightbox attribute and rel attribute implementationsvar dataLightboxValue = $link.attr('data-lightbox');var $links;if (dataLightboxValue) {$links = $($link.prop('tagName') + '[data-lightbox="' + dataLightboxValue + '"]');for (var i = 0; i < $links.length; i = ++i) {addToAlbum($($links[i]));if ($links[i] === $link[0]) {imageNumber = i;}}} else {/*       if ($link.attr('rel') === 'lightbox') {// If image is not part of a setaddToAlbum($link);} else {// If image is part of a set$links = $($link.prop('tagName') + '[rel="' + $link.attr('rel') + '"]');for (var j = 0; j < $links.length; j = ++j) {addToAlbum($($links[j]));if ($links[j] === $link[0]) {imageNumber = j;}}} */addToAlbum($link);}// Position Lightboxvar top  = $window.scrollTop() || 0 + this.options.positionFromTop;var left = $window.scrollLeft();this.$lightbox.css({top: top + 'px',left: left + 'px'}).fadeIn(this.options.fadeDuration);// Disable scrolling of the page while openif (this.options.disableScrolling) {$('body').addClass('lb-disable-scrolling');}this.changeImage(imageNumber);};// Hide most UI elements in preparation for the animated resizing of the lightbox.Lightbox.prototype.changeImage = function(imageNumber) {var self = this;var filename = this.album[imageNumber].link;var filetype = filename.split('.').slice(-1)[0];var $image = this.$lightbox.find('.lb-image');// Disable keyboard nav during transitionsthis.disableKeyboardNav();// Show loading statethis.$overlay.fadeIn(this.options.fadeDuration);$('.lb-loader').fadeIn('slow');this.$lightbox.find('.lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption').hide();this.$outerContainer.addClass('animating');// When image to show is preloaded, we send the width and height to sizeContainer()var preloader = new Image();preloader.onload = function() {var $preloader;var imageHeight;var imageWidth;var maxImageHeight;var maxImageWidth;var windowHeight;var windowWidth;$image.attr({'alt': self.album[imageNumber].alt,'src': filename});$preloader = $(preloader);$image.width(preloader.width);$image.height(preloader.height);windowWidth = $(window).width();windowHeight = $(window).height();// Calculate the max image dimensions for the current viewport.// Take into account the border around the image and an additional 10px gutter on each side.maxImageWidth  = windowWidth - self.containerPadding.left - self.containerPadding.right - self.imageBorderWidth.left - self.imageBorderWidth.right - 20;maxImageHeight = windowHeight - self.containerPadding.top - self.containerPadding.bottom - self.imageBorderWidth.top - self.imageBorderWidth.bottom - self.options.positionFromTop - 70;/*Since many SVGs have small intrinsic dimensions, but they support scalingup without quality loss because of their vector format, max out theirsize.*/if (filetype === 'svg') {$image.width(maxImageWidth);$image.height(maxImageHeight);}// Fit image inside the viewport.if (self.options.fitImagesInViewport) {// Check if image size is larger then maxWidth|maxHeight in settingsif (self.options.maxWidth && self.options.maxWidth < maxImageWidth) {maxImageWidth = self.options.maxWidth;}if (self.options.maxHeight && self.options.maxHeight < maxImageHeight) {maxImageHeight = self.options.maxHeight;}} else {maxImageWidth = self.options.maxWidth || preloader.width || maxImageWidth;maxImageHeight = self.options.maxHeight || preloader.height || maxImageHeight;}// Is the current image's width or height is greater than the maxImageWidth or maxImageHeight// option than we need to size down while maintaining the aspect ratio.if ((preloader.width > maxImageWidth) || (preloader.height > maxImageHeight)) {if ((preloader.width / maxImageWidth) > (preloader.height / maxImageHeight)) {imageWidth  = maxImageWidth;imageHeight = parseInt(preloader.height / (preloader.width / imageWidth), 10);$image.width(imageWidth);$image.height(imageHeight);} else {imageHeight = maxImageHeight;imageWidth = parseInt(preloader.width / (preloader.height / imageHeight), 10);$image.width(imageWidth);$image.height(imageHeight);}}self.sizeContainer($image.width(), $image.height());};// Preload image before showingpreloader.src = this.album[imageNumber].link;this.currentImageIndex = imageNumber;};// Stretch overlay to fit the viewportLightbox.prototype.sizeOverlay = function() {var self = this;/*We use a setTimeout 0 to pause JS execution and let the rendering catch-up.Why do this? If the `disableScrolling` option is set to true, a class is added to the bodytag that disables scrolling and hides the scrollbar. We want to make sure the scrollbar ishidden before we measure the document width, as the presence of the scrollbar will affect thenumber.*/setTimeout(function() {self.$overlay.width($(document).width()).height($(document).height());}, 0);};// Animate the size of the lightbox to fit the image we are showing// This method also shows the the image.Lightbox.prototype.sizeContainer = function(imageWidth, imageHeight) {var self = this;var oldWidth  = this.$outerContainer.outerWidth();var oldHeight = this.$outerContainer.outerHeight();var newWidth  = imageWidth + this.containerPadding.left + this.containerPadding.right + this.imageBorderWidth.left + this.imageBorderWidth.right;var newHeight = imageHeight + this.containerPadding.top + this.containerPadding.bottom + this.imageBorderWidth.top + this.imageBorderWidth.bottom;//最大不超过屏幕宽高,若超过,滚动条出现windowWidth = $(window).width();windowHeight = $(window).height();if(newWidth > windowWidth){newWidth = windowWidth}if(newHeight+self.$lightbox.find('.lb-dataContainer').height() > windowHeight){newHeight = windowHeight - self.$lightbox.find('.lb-dataContainer').height()*2}function postResize() {self.$lightbox.find('.lb-dataContainer').width(newWidth);self.$lightbox.find('.lb-prevLink').height(newHeight);self.$lightbox.find('.lb-nextLink').height(newHeight);// Set focus on one of the two root nodes so keyboard events are captured.self.$overlay.focus();self.showImage();}if (oldWidth !== newWidth || oldHeight !== newHeight) {this.$outerContainer.animate({width: newWidth,height: newHeight}, this.options.resizeDuration, 'swing', function() {postResize();});} else {postResize();}};// Display the image and its details and begin preload neighboring images.Lightbox.prototype.showImage = function() {this.$lightbox.find('.lb-loader').stop(true).hide();this.$lightbox.find('.lb-image').fadeIn(this.options.imageFadeDuration);this.updateNav();this.updateDetails();this.preloadNeighboringImages();this.enableKeyboardNav();};// Display previous and next navigation if appropriate.Lightbox.prototype.updateNav = function() {// Check to see if the browser supports touch events. If so, we take the conservative approach// and assume that mouse hover events are not supported and always show prev/next navigation// arrows in image sets.var alwaysShowNav = false;try {document.createEvent('TouchEvent');alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false;} catch (e) {}this.$lightbox.find('.lb-nav').show();if (this.album.length > 1) {if (this.options.wrapAround) {if (alwaysShowNav) {this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1');}this.$lightbox.find('.lb-prev, .lb-next').show();} else {if (this.currentImageIndex > 0) {this.$lightbox.find('.lb-prev').show();if (alwaysShowNav) {this.$lightbox.find('.lb-prev').css('opacity', '1');}}if (this.currentImageIndex < this.album.length - 1) {this.$lightbox.find('.lb-next').show();if (alwaysShowNav) {this.$lightbox.find('.lb-next').css('opacity', '1');}}}}};// Display caption, image number, and closing button.Lightbox.prototype.updateDetails = function() {var self = this;// Enable anchor clicks in the injected caption html.// Thanks Nate Wright for the fix. @https://github.com/NateWrif (typeof this.album[this.currentImageIndex].title !== 'undefined' &&this.album[this.currentImageIndex].title !== '') {var $caption = this.$lightbox.find('.lb-caption');if (this.options.sanitizeTitle) {$caption.text(this.album[this.currentImageIndex].title);} else {$caption.html(this.album[this.currentImageIndex].title);}$caption.fadeIn('fast');}if (this.album.length > 1 && this.options.showImageNumberLabel) {var labelText = this.imageCountLabel(this.currentImageIndex + 1, this.album.length);this.$lightbox.find('.lb-number').text(labelText).fadeIn('fast');} else {this.$lightbox.find('.lb-number').hide();}this.$outerContainer.removeClass('animating');this.$lightbox.find('.lb-dataContainer').fadeIn(this.options.resizeDuration, function() {return self.sizeOverlay();});};// Preload previous and next images in set.Lightbox.prototype.preloadNeighboringImages = function() {if (this.album.length > this.currentImageIndex + 1) {var preloadNext = new Image();preloadNext.src = this.album[this.currentImageIndex + 1].link;}if (this.currentImageIndex > 0) {var preloadPrev = new Image();preloadPrev.src = this.album[this.currentImageIndex - 1].link;}};Lightbox.prototype.enableKeyboardNav = function() {this.$lightbox.on('keyup.keyboard', $.proxy(this.keyboardAction, this));this.$overlay.on('keyup.keyboard', $.proxy(this.keyboardAction, this));};Lightbox.prototype.disableKeyboardNav = function() {this.$lightbox.off('.keyboard');this.$overlay.off('.keyboard');};Lightbox.prototype.keyboardAction = function(event) {var KEYCODE_ESC        = 27;var KEYCODE_LEFTARROW  = 37;var KEYCODE_RIGHTARROW = 39;var keycode = event.keyCode;if (keycode === KEYCODE_ESC) {// Prevent bubbling so as to not affect other components on the page.event.stopPropagation();this.end();} else if (keycode === KEYCODE_LEFTARROW) {if (this.currentImageIndex !== 0) {this.changeImage(this.currentImageIndex - 1);} else if (this.options.wrapAround && this.album.length > 1) {this.changeImage(this.album.length - 1);}} else if (keycode === KEYCODE_RIGHTARROW) {if (this.currentImageIndex !== this.album.length - 1) {this.changeImage(this.currentImageIndex + 1);} else if (this.options.wrapAround && this.album.length > 1) {this.changeImage(0);}}};// Closing time. :-(Lightbox.prototype.end = function() {this.disableKeyboardNav();$(window).off('resize', this.sizeOverlay);this.$lightbox.fadeOut(this.options.fadeDuration);this.$overlay.fadeOut(this.options.fadeDuration);if (this.options.disableScrolling) {$('body').removeClass('lb-disable-scrolling');}};return new Lightbox();
}));

Typora结合LightBox放大查看图片相关推荐

  1. Android的实现既能相册选择,拍照选择,点击每张图片又能放大查看!

    最近很长一段时间没有更新博客了实在是比较忙最近需要使用一个功能:选择本机相册或者拍照返回图片显示到九宫格中,并且可以点击九宫格每一张放大查看,滑动等功能! 在网上也看到一些大神写的演示和第三方库,不过 ...

  2. 用html5 拍照+多图片上传、删除图片、查看图片

    用html5中的 file 调用手机拍照以及多图片上传功能,可进行删除图片.放大查看图片,网页版多文件上传也可以用. 代码如下: <!DOCTYPE html> <html>& ...

  3. apicloud图片放大和图片左右滑,查看图片很多张

    var UIPhotoViewer = api.require('UIPhotoViewer'); ... // 点击图片 放大查看fangBigTu(it) {UIPhotoViewer.open( ...

  4. android仿微信头像点击放大查看,仿微信查看图片(带大小图切换查看)

    之前一直想仿微信朋友圈那样做个图片查看,但是看了网上很多demo都觉得比较简单,少了从小图切换到大图的加载过程,都只是在所有预览里加载大图,点击进去也是加载大图,于是在网上下载了别人的demo自己修改 ...

  5. Markdown给图片添加超链接,点击图片后,跳转新页面。放大缩小图片。

    公司用Markdown写了个项目说明 有个需求,就是点击图片,跳转到图片的链接(因为markdown不能放大缩小图片) 下面是超链接用法: ![alt属性文本](图片地址 ''图片title'') a ...

  6. 弹出查看图片_报表工具如何实现“点击查看原图”

    在各种涉及图片的 Web 网站上,无论是搜图类.社交类.保险服务类,以及 ERP 或档案管理等内部系统,其中对于图片通常会提供一种点击图片查看原图的操作,也就是一开始呈现小图,点击后放大查看.这种操作 ...

  7. android+放大缩小图片+有jar嘛,Android相册支持点击放大图片,滑动切换图片,手势放大缩小...

    [实例简介] 项目使用了开源框架Universal-Image-Loader 显示本地图库所有照片 点击放大,单击退出 双击放大缩小 支持左右滑动查看图片 支持手势放大缩小图片 [实例截图] [核心代 ...

  8. ps如何修改图片大小尺寸_如何查看图片尺寸,大小及如何修改图片尺寸—淘宝美工入门课03...

    上一篇文章给大家分享了一下豆芽常用字体,也提供了下载链接,今天和大家聊聊有关图片尺寸和图片大小相关的问题,主要包含以下这3个方面. 一,如何查看图片的尺寸(像素px) 二,如何改变图片的尺寸 三,了解 ...

  9. minio搭建图床 配合typora实现写博客图片自动上传

    minio搭建图床 配合typora实现写博客图片自动上传 1.搭建minio 查看博客:http://www.weinigb.cn/#/info?blogOid=32 2.使用脚本(python) ...

  10. html 图片放大缩小轮播,jQuery左右滚动支持图片放大缩略图图片轮播代码分享

    本文实例讲述了jQuery左右滚动支持图片放大缩略图图片轮播效果.分享给大家供大家参考.具体如下: 这是一款基于jQuery实现的左右滚动支持图片放大缩略图图片轮播效果,常用的jQuery图片左右轮播 ...

最新文章

  1. ubuntu12.04默认gcc4.6.3,如何升级到gcc4.8
  2. 搞定全局ID生成器:SpringBoot2.x 集成百度 uidgenerator
  3. 字节序转换 oracle,Oracle10g同字节序跨平台迁移
  4. js中的DOM操作汇总
  5. 如何快速排查生产问题
  6. 学习web前端开发大半年,迷茫了,感觉什么都没学会怎么破?
  7. 速读水浒!108将的简介与结局
  8. Ant Design 实现表格合并
  9. js简单插件(饼形图)
  10. 智能客服选型产品选型比较:晓多、奇智、春松客服
  11. cmstop模板制作教程内容页变量
  12. 2019年就业前景最好的7大编程语言(内附python教程分享)
  13. 题目 1546: 班级排名
  14. LoRa网关/RAK831
  15. 看不懂!苏宁控股“卖身”淘宝,“盲盒第一股”市值破千亿,超过苏宁易购
  16. Nacos如何实现Raft算法与Raft协议原理详解
  17. ros2 foxy 设置publisher与subscription的qos
  18. Python计算0-100之内的奇数和
  19. 华为m2android怎么升级,【刷机指导】华为平板M2 8 EMUI4.0回退EMUI3.1指导教程
  20. 你以为SOPA 和PIPA 被打败了?

热门文章

  1. 三星手机使用应用沙盒动态修改sdk数据
  2. c语言文件中获取单词,从文本文件中读取单个单词并翻译 - C
  3. 物联网无线传输技术有哪些?
  4. julia集 matlab代码,Mandelbrot集和Julia集的分形图之matlab实现.docx
  5. Docker配置镜像加速器
  6. CwRsync实现文件同步(windows或linux服务器通用)
  7. Vivado synth 8-439 module““not found问题绝对解决,超简单,想解决问题就看这里。
  8. 【算法随记二】线卷积积分及其在图像增强和特效方面的应用(一)
  9. AN APPROACH OF VECTOR FIELD TEXTURE VISUALIZATION BASED ON FIELD DRIVEN STRENGTH算法实现
  10. 服务器主动向客户端发送信息机制