docsify 文章加密

docsify 文章加密

什么是docsify?

简单来说是一款便捷的文档网站

官网文档

docsify支持很多中部署方式,包括单独部署,Github部署,Gitee部署....对于没有前端能力固定样式非常友好

加密需求

对于部署上的文档在部分时候需要进行加密,加密方式有两种

  1. 文档整体加密

  2. 部分内容加密

探索加密

文档整体加密

搜索各大网站只有别人写的问题整体加密, 参考文章:docsify文档加密解密插件

需要文章整体加密的使用上面文档即可,写的很详细。

文档部分加密

针对文档部分加密并没有找到方案...实在忍不住只能自己写了。

思路开端:docsify会在加载md文件时会先转化为html,然后再加载到页面,思路来自于看到全文加密的源码中。

翻官方文档,在自定义插件中找到方法:

 hook.afterEach(function(html, next) {// 解析成 html 后调用。// beforeEach 和 afterEach 支持处理异步逻辑// ...// 异步处理完成后调用 next(html) 返回结果next(html);});

思路

转换md文件到html后解析自定义标签,我这里使用的是标签,如果url上的pwd密码参数等于标签中的value属性则展示标签包含的加密内容,否则展示另一端提示的html。

代码

定义解析html方法

function parsePwd(content) {// Get the URL parameterslet currentURL = window.location.href;const hashParams = currentURL.split('?')[1]; // 获取问号后面的部分var urlParams = new URLSearchParams(hashParams);var pwdParam = urlParams.get('pwd');// Replace <pwd> and <tip> tags based on password validationreturn content.replace(/<pwd\s+(.*?)>([\s\S]*?)<\/pwd>/g, function (match, attributes, pwdContent) {// 匹配 pwd 标签中的各个属性const regex = /(\w+)=['"](.*?)['"]/g;let attrMatch;let password = '';let pwd = '';let urlContent = '';// 提取属性值while ((attrMatch = regex.exec(attributes)) !== null) {const attrName = attrMatch[1];const attrValue = attrMatch[2];if (attrName === 'value') password = attrValue;if (attrName === 'pwd') pwd = attrValue;if (attrName === 'url') urlContent = attrValue;}if (pwdParam === password) {return pwdContent; // 如果 URL 参数匹配,则显示 <pwd> 标签内容} else {if (pwdParam){alert("密码错误,请重新输入")}let tipContent = '<p style="text-align: center;"><img src="' + urlContent + '" data-origin="http://niubility.cloud/image/rui.jpg" alt=""></p><p style="text-align: center;"><strong>人机验证,扫码回复:' + pwd + '</strong></p><p style="text-align: center;"><input id ="pwd" /> <button onclick="addParamAndRefresh()">验证</button></p>';return tipContent; // 否则显示提示内容}});}

定义按钮点击提交密码方法

// 点击按钮时执行的函数
function addParamAndRefresh() {// 获取输入框元素let inputElement = document.getElementById('pwd');// 获取输入框的值let inputValue = inputElement.value;if (!inputValue) {return}let currentURL = window.location.href;const hashParams = currentURL.split('?')[1]; // 获取问号后面的部分var urlParams = new URLSearchParams(hashParams);// 检查是否存在名为 'pwd' 的参数if (urlParams.has('pwd')) {// 修改 'pwd' 参数的值为 '1'urlParams.set('pwd', inputValue);} else {// 如果 'pwd' 参数不存在,则添加它urlParams.append('pwd', inputValue);}// 获取更新后的参数字符串var newParams = urlParams.toString();// 更新当前页面URL中的参数部分if (newParams) {currentURL = currentURL.split('?')[0] + '?' + newParams;} else {currentURL = currentURL.split('?')[0];}// 刷新页面并跳转到新的URL// 改变 hash 路由// 使用 Docsify 提供的 router.go() 方法进行路由导航//window.$docsify.router.go(currentURL);window.location.href = currentURL;
}

注册到插件回调调用

   // Parse <pwd> tags in the page contentfunction parseContent(content) {return parsePwd(content);}const afterEachHook = function (hook, vm) {hook.beforeEach(function (html, next) {next(parseContent(html))});}window.$docsify.plugins = [afterEachHook].concat(window.$docsify.plugins || []);

效果展示

问题

  1. 在parsePwd方法中我添加图片标签和输入框和按钮,可以根据自己具体实际需求调整展示

  2. 提交按钮这里使用的路由模式是history,如果是使用的hash模式,获取参数代码我贴在下下面

window.$docsify = {//通用设置// -----------------------------------------------------// 加载自定义导航栏,需要目录下有_navbar.md文件loadNavbar: false,// 路由模式routerMode: 'history',
}//不是路由模式获取参数代码
// 获取 URL 哈希部分
const hash = window.location.hash;// 如果哈希部分存在并且包含参数
if (hash.includes('?')) {const hashParams = hash.split('?')[1]; // 获取问号后面的部分const urlParams = new URLSearchParams(hashParams);// 获取名为 pwd 的参数值const pwdValue = urlParams.get('pwd');// 获取名为 a 的参数值const aValue = urlParams.get('a');console.log(pwdValue); // 输出: 123console.log(aValue); // 输出: 1
}

完整代码获取

docsify文章加密icon-default.png?t=N7T8http://niubility.cloud/record/docsify%E6%96%87%E7%AB%A0%E5%8A%A0%E5%AF%86

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/333733.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OV5640 摄像头的图像平滑处理

如图所示&#xff0c;这是整个视频采集系统的原理框图。 上电初始&#xff0c;FPGA 需要通过 IIC 接口对 CMOS Sensor 进行寄存器初始化配置。这些初始化的基本参数&#xff0c;即初始化地址对应的初始化数据都存储在一个预先配置好的 FPGA 片内 ROM中。在初始化配置完成后&…

过去半年信竞基础学习总结

当Richard同学从去年7月份&#xff0c;开始从YY班学习C和信息学竞赛时&#xff0c;他对C还一无所知&#xff0c;但对计算机和编程的兴趣让他一直都乐在其中。在过去的半年中&#xff0c;通过参加各个平台的月赛&#xff0c;让他更加热爱编程&#xff0c;也让Richard更加了解自己…

中国建设银行 关于解决微软升级导致插入网银盾无法自动打开企业网银的通知

关于解决微软升级导致插入网银盾无法自动打开企业网银的通知 发布时间&#xff1a;2023-10-18 尊敬的客户&#xff1a; 近期Windows操作系统升级会禁止使用IE浏览器&#xff0c;可能会导致您在插入网银盾后无法自动弹出企业网银登录页面&#xff0c;您可以通过以下方式解决&…

MODBUS转PROFINET网关与全数字交流伺服配置案例

MODBUS转PROFINET网关连接与全数字交流伺服驱动系统的配置案例&#xff0c;这一通信方式极大地简化了工业自动化系统中的数据传输和控制过程。变频器和伺服电机可以实现数据交流和控制指令的实时传输&#xff0c;从而实现更精确更高效的生产过程。 案例简介&#xff1a;本案例是…

NODE笔记 0

一些简单的node学习笔记记录&#xff0c;是Vue等前端框架的基础 入门学习备忘录 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 node.js 内置网络服务器&#xff0c;是前端框架学习的基础&#xff1a; 概念&#xff1a;…

【python爬虫开发实战 情感分析】利用爬虫爬取城市评论并对其进行情感分析

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a; python网络爬虫从基础到实战 带你学习爬虫从基础到实战 深度学习带你感受AI的魅力 &#x1f4a1;往期推荐&#xff1a; ⭐️前面比较重要的基础内容&#xff1a; 【Py…

安全远控如何设置?揭秘ToDesk、TeamViewer 、向日葵安全远程防御大招

写在前面一、远程控制&#xff1a;安全性不可忽略二、远控软件安全设置实测 ◉ ToDesk◉ TeamViewer◉ 向日葵 三、远控安全的亮点功能四、个人总结与建议 写在前面 说到远程办公&#xff0c;相信大家都不陌生。远程工作是员工在家中或者其他非办公场所上班的一种工作模式&am…

「PyMuPDF 专栏 」PyMuPDF创建PDF、拆分PDF

文章目录 一、本章前言二、使用PyMuPDF创建PDF文档1、实例代码2、过程详解①. 安装PyMuPDF②. 导入PyMuPDF模块③. 创建一个新的PDF文档④. 添加页面和内容⑤. 保存文档 三、使用PyMuPDF拆分PDF文档1、实例代码2、过程解析①. 导入模块②. 定义函数③. 打开源PDF文件④. 遍历页…

大模型笔记【2】 LLM in Flash

Apple最近发表了一篇文章&#xff0c;可以在iphone, MAC 上运行大模型&#xff1a;【LLM in a flash: Efficient Large Language Model Inference with Limited Memory】。 主要解决的问题是在DRAM中无法存放完整的模型和计算&#xff0c;但是Flash Memory可以存放完整的模型。…

大模型训练算力利用率达60%,蚂蚁开源分布式训练扩展库ATorch

近日&#xff0c;蚂蚁集团宣布开源大模型分布式训练加速扩展库ATorch。ATorch可针对不同模型和硬件资源&#xff0c;实现深度学习自动资源动态优化和分布式训练稳定性提升&#xff0c;帮助提升深度学习的智能性。据了解&#xff0c;在大模型训练中&#xff0c;ATorch千亿模型千…

第7章 DOM(下)

学习目标 熟悉节点的概念&#xff0c;能够说出节点的属性和层级 掌握节点操作&#xff0c;能够完成节点的获取、创建、添加、移除和复制操作 掌握事件的进阶操作&#xff0c;能够实现事件的监听和移除 熟悉DOM事件流&#xff0c;能够说出事件捕获和事件冒泡两种方式的区别 …

JavaScript版数据结构与算法(一)栈、队列、链表、集合、树

一、前言 为什么要学习数据结构与算法&#xff1f;最重要的就是面试要考算法&#xff0c;另外就是如果在实际工作当中&#xff0c;能够使用算法优化代码&#xff0c;会提升代码质量和运行效率&#xff0c;作为一名前端人员可能在实际中用的并不是特别多。数据结构与算法是分不…