NVM
简述
NVM (Node Version Manager) Node 版本管理器
参考:
Github:nvm
Akamai:Installing and Using NVM
安装
nvm 可工作在任何 POSIX-compliant shell (sh, dash, ksh, zsh, bash), 特别是以下平台: unix, macOS, and windows WSL(Windows Subsystem for Linux).
需提前安装curl/wget
install.sh二选一执行:
1curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
1wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
安装完成后的NVM一般情况下会安装在~/.nvm
执行完成后会提示重新打开Shell或执行重载shell环境的命令,建议重新打开Shell
Arch ...
MongoDB
初识
我们可以将MongoDB看作是一个非常强大的文件存储器,类似于一个巨大的文件夹,可以存储各种各样的文档。这些文档可以是JSON格式的,就像我们在编程中使用的数据结构,其中包含键值对、数组和嵌套的子文档。
MongoDB适用于需要存储大量非结构化数据并具备高度灵活性和可扩展性的应用场景。
MongoDB的用途非常广泛,下面列举几个常见的应用场景:
Web应用程序的数据存储:MongoDB非常适合存储Web应用程序中的数据。它可以存储用户信息、文章、评论、日志等等。由于MongoDB具有灵活的数据模型,可以轻松地修改和扩展数据结构,这对于快速迭代和开发新功能非常有帮助。
实时分析和日志处理:MongoDB支持高度可扩展的数据处理能力,可以用于实时数据分析和日志处理。它可以存储大量的日志数据,并且可以使用强大的查询和聚合功能,从中提取有用的信息和统计数据。
物联网(IoT)应用程序:随着物联网的发展,越来越多的设备生成大量的数据。MongoDB可以作为物联网应用程序的数据存储解决方案,存储设备传感器数据、监控数据、设备状态等信息,并支持快速查询和实时数据处理。
缓存数据存储:Mon ...
浅谈Node-Vue-ES6-调试-编译-前端原理
引入话题
我在使用Vue2开发一个前端项目,由于在代码中经常使用console.log()打印输出某些重要的参数,不过有一个地方忘记注释掉console.log(),此时浏览器正处于开发者模式,打印输出以下数据,这些数据是前端请求后端,我进行了console.log()打印。上线环境中这种console.log()打印肯定是要注释掉的,因为浏览器打印出来的同时后面会标明
运行方式
console.log()打印输出
如果将相关index.vue:159 处的代码在VSCode中注释掉就会出现VM1634 94736:177,这是因为 index.vue:159 处的代码已经注释掉了,浏览器中的此处源代码也会注释,我还以为会剩下编译打包后的静态代码
为了验证VM1634 94736:177是否为编译打包后的静态代码,我重新打包为H5的方式,使用Python自带的HTTP服务器重新部署了一个服务
再次运行到之前的console.log()
点进pages-admin-set_conf-index.720cbcbe.js,此文件其实是由源码src/pages/admin/set_ ...
密码学
RSA
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。
加密解密原理
选取素数p、q,乘积为n
欧拉公式ꚩ(n)=n-1,由此ꚩ(p)=p-1,ꚩ(q)=q-1,z=ꚩ(pq)=ꚩ(p)ꚩ(q)=(p-1)(q-1)
选取e【公钥】,在1~z的范围选取公钥参数e,且e满足大公约数ged(ꚩ(n-1),e)=1,此时整数e用做加密钥(注意:e的选取是很容易的,例如,所有大于p和q的素数都可用)
(e*d)mod z=1,算得d【私钥】
公开整数n和e,秘密保存d【私钥】(常用作签名)
加密c=m^e mod n
解密m=c^d mod n
以上的fuding字符通过分段后一定是小于n的无符号整数类型
常见问题解答
非对称密码算法适用于哪种场合?
答:非对称 ...
Django Rest Framework
前言
Django REST Framework(简称DRF)是一个用于构建Web API的强大框架,基于Django开发。它提供了许多工具和库,使得构建和管理Web API变得简单和高效。DRF结合了Django的强大特性和灵活性,使开发人员能够轻松地创建功能强大、安全和可扩展的API。
Django REST Framework(DRF)是基于Django框架构建的,并且依赖于Django的核心功能。DRF扩展了Django,提供了用于构建Web API的额外功能和工具。要使用Django REST Framework,需要首先安装和配置Django。DRF是作为Django的一个扩展包提供的,可以在Django项目中引入DRF,以便利用其提供的API构建功能和特性。
以下是一些Django REST Framework的主要特性:
序列化:DRF提供了一个强大的序列化系统,用于将数据库模型和其他数据类型转换为JSON、XML或其他格式的数据。它使得数据的转换和传输变得简单,并且可以轻松地处理数据验证和反序列化。
视图:DRF提供了一组视图类,用于处理API请求和生成响应。它支 ...
WebSocket协议
WebSocket
WebSocket 是一种在Web应用程序中实现全双工通信的协议,建立在HTTP协议之上。
初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?
答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。
举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。
这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用“轮询”:每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。
轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。
WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。
参考:
W3Cschool:JavaScript WebSocket
How To Use WebSocket In Java ...
Vue3
Vue3简介
Vue3中对比Vue2最大的更新亮点就是组合式API(Composition API),但也保留了选项式API(Options API)
组合式&选项式选项式 API:
选项式 API 是 Vue 2 中使用的传统方式,它将组件的逻辑分散在不同的选项中,如 data、computed、methods、watch 等。
使用选项式 API 编写的组件代码相对较为分散,随着组件的复杂度增加,代码可读性和维护性可能会下降。
选项式 API 使用了基于对象的方式来定义组件,将数据和方法都声明在组件实例的选项中。
这种方式对于熟悉 Vue 2 的开发者来说更加熟悉和容易上手。
组合式 API:
组合式 API 是 Vue 3 中引入的一种新的组件编写方式,基于函数的组合,通过 setup 函数来组织组件的逻辑。
使用组合式 API 可以将相关的逻辑代码放在同一个函数内部,使代码更加集中和清晰,提高了代码的可维护性。
组合式 API 使用了基于函数的方式来定义组件,setup 函数返回一个对象,对象中包含组件的数据、方法等。
这种方式更加灵活,可以使用任何 JavaS ...
验证码
短信验证
需选择一家可靠的短信服务提供商,服务提供商通常提供API来集成短信功能到您的应用程序中,不同的提供商提供不同SDK或库。
后端实现
安装相应的短信SDK或库,以便与短信服务提供商的API进行通信。
创建一个后端API,接收来自前端的手机号码和其他必要的注册信息。
在后端API中,生成一个随机验证码并将其保存到数据库或缓存中,同时将手机号码和验证码发送到短信服务提供商的API。
验证短信服务提供商的响应,确认短信已成功发送。
协商接口
请求需校验信息(图形/数据库已有信息),响应成功后才可进行下一步
信息正确,请求提交手机号,后端生成发送短信的随机验证码,存储于缓存/数据库,调用短信提供商发送短信API携带手机号&验证码,提供商响应服务器成功与否,再响应客户端短信是否发送
客户端收到短信,填入所需信息,提交请求携带验证码&所需信息,后端对比验证码成功,才可完成注册/信息插入,响应结果
前后端交互
在注册页面或组件中,添加一个用于输入用户收到的验证码的字段。
通过AJAX或AXIOS方式,将用户输入的手机号码和验证 ...
PIP依赖管理
pip简介常用命令安装依赖包1pip install package_name
用于安装指定名称的依赖包。
安装指定版本的依赖包1pip install package_name==version_number
用于安装指定名称和版本号的依赖包。
升级依赖包1pip install --upgrade package_name
用于升级已安装的依赖包至最新版本。
列出已安装的依赖包1pip list
用于列出当前环境中已安装的所有依赖包及其版本号。
卸载依赖包1pip uninstall package_name
用于卸载指定名称的依赖包。
导出依赖包列表1pip freeze > requirements.txt
用于将当前环境中已安装的依赖包及其版本号导出到一个文本文件(一般命名为requirements.txt),方便在其他环境中重现相同的依赖包配置。
从requirements.txt文件安装依赖包:1pip install -r requirements.txt
用于从指定的requirements.txt文件中安装所有依赖包及其版本号。
搜索依赖包1pi ...