Rust 提供了多种内置方法和功能，涵盖了从基础数据类型操作到高级特性的一系列功能。一下是一些常见的Rust 方法和功能，分为不同类别：Rust 方法和特性1. 字符串操作push_str：追加一个字符串切片到字符串的末尾。push：向字符串末尾添加一个字符。to_string：将其他数据类型转换为字符串。trim：去除字符串两端的空白字符。split：按指定分隔符拆分字符串，返回迭代器。replace：将字符串中的指定子串替换为另一个子串。find：查找指定子串的起始索引，返回 Option<usize>。starts_with：判断字符串是否以指定子串开头。ends_with：判断字符串是否以指定子串结尾。len：返回字符串的字节长度。2. 向量（Vec）操作push：向向量中追加一个元素。pop：移除向量的最后一个元素并返回该元素。len：返回向量的长度（元素数量）。get：按索引获取元素，返回 Option<&T>。remove：移除并返回指定索引处的元素。contains：检查向量中是否包含指定元素。iter：返回一个不可变的迭代器。iter_mut：返回一个可变的迭代器。clear：清空向量。sort：对向量中的元素进行排序。extend：将另一个向量的元素追加到当前向量中。3. 数组操作len：返回数组的长度。get：按索引获取数组元素，返回 Option<&T>。iter：返回数组的迭代器。copy_from_slice：从另一个切片复制数据到数组。clone_from_slice：克隆另一个切片的内容到当前数组。4. 集合（HashMap、HashSet）4.1 HashMap 操作insert：将键值对插入哈希映射。get：根据键获取值，返回 Option<&V>。remove：根据键移除键值对。contains_key：检查是否存在指定键。len：返回哈希映射中的键值对数量。keys：返回哈希映射中的所有键的迭代器。values：返回哈希映射中的所有值的迭代器。4.2 HashSet 操作insert：向哈希集合中插入一个元素。remove：从哈希集合中移除指定元素。contains：检查哈希集合中是否包含某个元素。len：返回集合中的元素数量。5. 错误处理5.1 Result 类型Ok 和 Err：用于表示操作的结果枚举。unwrap：取出 Ok 值，若为 Err 则触发崩溃。expect：类似 unwrap，但允许自定义错误信息。map：对 Ok 值进行操作并返回新的 Result。and_then：链式操作，处理成功时的结果。unwrap_or：返回 Ok 值或提供的默认值。5.2 Option 类型Some 和 None：用于表示值可能存在或不存在。unwrap：取出 Some 值，若为 None 则崩溃。is_some 和 is_none：判断是否为 Some 或 None。map：对 Some 值进行操作并返回新的 Option。unwrap_or：返回 Some 值或提供的默认值。6. 迭代器next：获取迭代器中的下一个元素。filter：过滤迭代器中满足条件的元素。map：对迭代器中的每个元素进行操作，返回新的迭代器。collect：将迭代器转换为集合（如 Vec、HashMap）。fold：将迭代器中的元素累积到一个单一的结果中。enumerate：为迭代器中的元素附带索引。zip：将两个迭代器配对为一个新的迭代器。chain：将两个迭代器串联为一个新的迭代器。7. 并发编程std::thread：提供多线程支持。spawn：创建一个新线程并执行闭包。join：等待线程执行完成并获取其结果。std::sync::mpsc：用于线程之间的消息传递（单发送者，多接收者）。Mutex：提供线程间共享数据的安全访问。Arc：原子引用计数，允许在多线程间共享数据。8. 文件操作std::fs::File：用于文件的读写操作。read_to_string：读取文件内容并将其转换为字符串。write_all：将字节数组写入文件。create：创建一个新文件，若文件已存在则覆盖。open：打开现有文件。metadata：获取文件的元数据。9. 内存管理与所有权Box<T>：在堆上分配内存并返回一个指针。Rc<T>：引用计数智能指针，允许多个所有者。Arc<T>：线程安全的引用计数智能指针。RefCell<T>：提供运行时的内部可变性。Cow<T>：可以在只读和可变状态之间切换的智能指针。10. 常用工具10.1 cargo 命令cargo build：编译项目。cargo run：编译并运行项目。cargo test：运行测试。cargo doc：生成项目的文档。cargo clean：清理构建生成的文件。10.2 rustfmt 和 clippyrustfmt：格式化代码，保证代码风格一致。clippy：代码分析工具，提供改进建议。11. 特性与宏#[derive]：自动为结构体或枚举生成特定特性实现（如 Clone、Debug）。macro_rules!：定义宏以简化重复代码。#[test]：定义单元测试。#[cfg]：条件编译，允许在特定条件下编译代码。assert!：用于测试中检查条件是否为 true。
1. 生成Android 证书keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore-alias 别名 这边使用 testalias代替test.keystor输入密钥库口令: //输入证书文件密码，输入完成回车 再次输入新口令: //再次输入证书文件密码，输入完成回车 您的名字与姓氏是什么? [Unknown]: //输入名字和姓氏，输入完成回车 您的组织单位名称是什么? [Unknown]: //输入组织单位名称，输入完成回车 您的组织名称是什么? [Unknown]: //输入组织名称，输入完成回车 您所在的城市或区域名称是什么? [Unknown]: //输入城市或区域名称，输入完成回车 您所在的省/市/自治区名称是什么? [Unknown]: //输入省/市/自治区名称，输入完成回车 该单位的双字母国家/地区代码是什么? [Unknown]: //输入国家/地区代号（两个字母），中国为CN，输入完成回车 CN=XX, OU=XX, O=XX, L=XX, ST=XX, C=CN是否正确? [否]: //确认上面输入的内容是否正确，输入y，回车 正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 36,500 天): CN=XX, OU=XX, O=XX, L=XX, ST=XX, C=CN2.查看证书keytool -list -v -keystore test.keystore Enter keystore password: //输入创建证书时的密码，回车密钥库类型: PKCS12 密钥库提供方: SUN 您的密钥库包含 1 个条目 别名: testalias 创建日期: 2024年7月10日 条目类型: PrivateKeyEntry 证书链长度: 1 证书[1]: 所有者: CN=XX, OU=XX, O=XX, L=XX, ST=XX, C=CN 发布者: CN=XX, OU=XX, O=XX, L=XX, ST=XX, C=CN 序列号: efd7bcf99g462f13 生效时间: Wed Jul 10 14:11:38 CST 2024, 失效时间: Fri Jun 16 14:11:38 CST 2124 证书指纹: SHA1: EA:8C:F5:E1:26:0B:89:69:F9:04:E3:D9:78:8B:0B:B8:13:45:F8:DA SHA256: 63:28:66:94:6B:08:51:3B:D1:EA:5C:D9:F0:DA:83:DA:9D:0E:C4:D1:4B:30:47:40:B2:23:30:AD:C1:E0:2F:86 签名算法名称: SHA256withRAA 主体公共密钥算法: 2048 位 RSA 密钥 版本: 3 扩展: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: C9 06 CC 3F 9E B0 E7 58 88 DE 38 EA E3 65 42 0E ...?...X..8..eB. 0010: 69 23 BB 22 i#.. ] ]3.配置gradle.propertiesSYS_TEST_KEY_ALIAS=testalias SYS_TEST_KEY_PASSWORD=test2024 SYS_TEST_STORE_FILE=test.keystore SYS_TEST_STORE_PASSWORD=test20244.配置项目中的 build.gradle.ktsapp/buidl.gradle.ktssourceSets { getByName("main").res.srcDirs("src/main/res/font") } signingConfigs { create("release") { if (project.hasProperty("SYS_TEST_STORE_FILE")) { storeFile = file(project.property("SYS_TEST_STORE_FILE") as String) storePassword = project.property("SYS_TEST_KEY_PASSWORD") as String keyAlias = project.property("SYS_TEST_KEY_ALIAS") as String keyPassword = project.property("SYS_TEST_KEY_PASSWORD") as String } } } buildTypes { release { isMinifyEnabled = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) signingConfig = android.signingConfigs.getByName("release") ndk { //noinspection ChromeOsAbiSupport abiFilters += listOf("arm64-v8a") } } debug { ndk { //noinspection ChromeOsAbiSupport abiFilters += listOf("arm64-v8a") } } }5.打包╭─[moodysiMac] as moody in ~/Desktop/MyProject/compose/TestAndroid on (main) ╰─(ﾉ˚Д˚)ﾉ ./gradlew aR //打包 ./gradlew assembleRelease ╭─[moodysiMac] as moody in ~/Desktop/MyProject/compose/TestAndroid on (main) ╰─(ﾉ˚Д˚)ﾉ adb install ./app/build/outputs/apk/release/app-release.apk //安装打包后的APK
步骤1：访问Microsoft官网，下载官方部署工具Office Deployment Tool 微软官方地址：工具链接步骤2：运行 Office Depolyment Tool步骤3：通过Microsoft Office 自定义工具制作配置文件 微软官方地址：配置链接步骤4：将导出的config 文件存放到 office 文件中步骤5：激活 打开PowerShell 或者CMD 管理员运行 建议使用PowerShell 下载安装office比如我工具运行之后东西在 f盘的ofcd F:\of .\setup.exe /download config.xml // 等待下载安装文件 .\setup.exe /configure config.xml // 安装激活 打开PowerShell 或者CMD 管理员运行 建议使用PowerShellcd "C:\\Program Files\\Microsoft Office\\Office16" // 进到c盘找一定能找到 cscript ospp.vbs /sethst:kms.03k.org cscript ospp.vbs /act
1. Homebrew 包管理工具安装什么是homebrewhomebrew 是 Mac'Os系统里面的包管理工具，主要解决软件或者包下载时的各种依赖包。homebrew 下载安装// 官方源 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" // 或者国内源 选择中科大的源安装完成后 终端中输入 [font color="orange"]brew -v[/font] 如出现版本号代表安装成功2. 安装 SDCCsdcc (Small Device C Compiler) 是一个应用于单片机的一个交叉编译器，其官网上的解释是这样的SDCC is a retargettable, optimizing Standard C (ANSI C89, ISO C99, ISO C11) compiler suite that targets the Intel MCS51 based microprocessors (8031, 8032, 8051, 8052, etc.), Maxim (formerly Dallas) DS80C390 variants, Freescale (formerly Motorola) HC08 based (hc08, s08), Zilog Z80 based MCUs (z80, z180, gbz80, Rabbit 2000/3000, Rabbit 3000A, TLCS-90), Padauk (pdk14, pdk15) and STMicroelectronics STM8. Work is in progress on supporting the Padauk (pdk13), Microchip PIC16 and PIC18 targets. It can be retargeted for other microprocessors.brew install sdcc sdcc -v3. 安装 python3 和 stcgalbrew install python3 // 安装stcgal 执行pip install stcgal即可安装4. 安装ttl下载器的驱动这边提供两种方式安装1.官网下载安装 [font color="orange"]CH340[/font] 下载地址2.brew 安装（推荐）brew install --cask wch-ch34x-usb-serial-driver // 验证 连接单片机 // ll /dev/cu.wchusbserial140 比如我的.一般之后后三位不一样 ll /dev/cu.xxxxxxxxxxx5.编译main.c 并且转成 hex 格式sdcc main.c // ihx 转换 hex packihx main.ihx > main.hex // 下载到单片机中 stc89 为单片机协议 如出现 [font color="green"]Waiting for MCU, please cycle power:[/font]代表成功 此时按下 单片机的电源开关 重新启动单片机程序就会下载到单片机中
一、是什么JWT（JSON Web Token），本质就是一个字符串书写规范，如下图，作用是用来在用户和服务器之间传递安全可靠的信息。在目前前后端分离的开发过程中，使用token鉴权机制用于身份验证是最常见的方案，流程如下：服务器当验证用户账号和密码正确的时候，给用户颁发一个令牌，这个令牌作为后续用户访问一些接口的凭证后续访问会根据这个令牌判断用户时候有权限进行访问Token，分成了三部分，头部（Header）、载荷（Payload）、签名（Signature），并以.进行拼接。其中头部和载荷都是以JSON格式存放数据，只是进行了编码header每个JWT都会带有头部信息，这里主要声明使用的算法。声明算法的字段名为alg，同时还有一个typ的字段，默认JWT即可。以下示例中算法为HS256{ "alg": "HS256", "typ": "JWT" }因为JWT是字符串，所以我们还需要对以上内容进行Base64编码，编码后字符串如下：eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9payload载荷即消息体，这里会存放实际的内容，也就是Token的数据声明，例如用户的id和name，默认情况下也会携带令牌的签发时间iat，通过还可以设置过期时间，如下：{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }同样进行Base64编码后，字符串如下：eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQSignature签名是对头部和载荷内容进行签名，一般情况，设置一个secretKey，对前两个的结果进行HMACSHA25算法，公式如下：Signature = HMACSHA256(base64Url(header)+.+base64Url(payload),secretKey)一旦前面两部分数据被篡改，只要服务器加密用的密钥没有泄露，得到的签名肯定和之前的签名不一致二、如何实现Token的使用分成了两部分：生成token：登录成功的时候，颁发token验证token：访问某些资源或者接口时，验证token生成 token借助第三方库jsonwebtoken，通过jsonwebtoken 的 sign 方法生成一个 token：第一个参数指的是 Payload第二个是秘钥，服务端特有第三个参数是 option，可以定义 token 过期时间const crypto = require("crypto"), jwt = require("jsonwebtoken"); // TODO:使用数据库 // 这里应该是用数据库存储，这里只是演示用 let userList = []; class UserController { // 用户登录 static async login(ctx) { const data = ctx.request.body; if (!data.name || !data.password) { return ctx.body = { code: "000002", message: "参数不合法" } } const result = userList.find(item => item.name === data.name && item.password === crypto.createHash('md5').update(data.password).digest('hex')) if (result) { // 生成token const token = jwt.sign( { name: result.name }, "test_token", // secret { expiresIn: 60 * 60 } // 过期时间：60 * 60 s ); return ctx.body = { code: "0", message: "登录成功", data: { token } }; } else { return ctx.body = { code: "000002", message: "用户名或密码错误" }; } } } module.exports = UserController;在前端接收到token后，一般情况会通过localStorage进行缓存，然后将token放到HTTP 请求头Authorization 中，关于Authorization 的设置，前面要加上 Bearer ，注意后面带有空格axios.interceptors.request.use(config => { const token = localStorage.getItem('token'); config.headers.common['Authorization'] = 'Bearer ' + token; // 留意这里的 Authorization return config; })校验token使用 koa-jwt 中间件进行验证，方式比较简单/ 注意：放在路由前面 app.use(koajwt({ secret: 'test_token' }).unless({ // 配置白名单 path: [/\/api\/register/, /\/api\/login/] }))secret 必须和 sign 时候保持一致可以通过 unless 配置接口白名单，也就是哪些 URL 可以不用经过校验，像登陆/注册都可以不用校验校验的中间件需要放在需要校验的路由前面，无法对前面的 URL 进行校验获取token用户的信息方法如下：router.get('/api/userInfo',async (ctx,next) =>{ const authorization = ctx.header.authorization // 获取jwt const token = authorization.replace('Beraer ','') const result = jwt.verify(token,'test_token') ctx.body = result注意：上述的HMA256加密算法为单秘钥的形式，一旦泄露后果非常的危险在分布式系统中，每个子系统都要获取到秘钥，那么这个子系统根据该秘钥可以发布和验证令牌，但有些服务器只需要验证令牌这时候可以采用非对称加密，利用私钥发布令牌，公钥验证令牌，加密算法可以选择RS256三、优缺点优点：json具有通用性，所以可以跨语言组成简单，字节占用小，便于传输服务端无需保存会话信息，很容易进行水平扩展一处生成，多处使用，可以在分布式系统中，解决单点登录问题可防护CSRF攻击缺点：payload部分仅仅是进行简单编码，所以只能用于存储逻辑必需的非敏感信息需要保护好加密密钥，一旦泄露后果不堪设想为避免token被劫持，最好使用https协议参考文献http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.htmlhttps://blog.wangjunfeng.com/post/golang-jwt/https://vue3js.cn/interview/
300+编程实用工具Javascript工具Underscore.js一套完善的函数式编程的接口，更方便地在JavaScript中实现函数式编程https://underscorejs.org/fastclick用于消除物理点击和click移动浏览器上事件触发之间的 300 毫秒延迟https://github.com/ftlabs/fastclickLodash一致性、模块化、高性能的 JavaScript 实用工具库https://lodash.com/crypto-js加密标准的 JavaScript 库。https://github.com/brix/crypto-jszxcvbnJavaScript密码强度估算库https://github.com/dropbox/zxcvbnzxcvbn-ts支持Typescript的密码强度估算库https://github.com/zxcvbn-ts/zxcvbnclipboard.js将文本复制到剪贴板的轻量级JS 库https://clipboardjs.com/tesseract.jsJavascript的OCR引擎，在浏览器离线识别图片中的文字https://tesseract.projectnaptha.com/number-precision小而快的库，用于精确地进行加法、减法、乘法和除法运算https://github.com/nefe/number-precisionfingerprintjs具有高准确度和稳定性的浏览器指纹库https://fingerprint.com/ViteShot基于Vite的快速简单的截图工具。https://viteshot.com/Valine快速、简洁且高效的无后端评论系统https://valine.js.org/cnpm淘宝提供的一个完整 npmjs.org 镜像，你可以用此代替官方版本(只读)，同步频率目前为 10分钟 一次以保证尽量与官方服务同步https://npmmirror.com/yarn快速、可靠和安全的依赖管理https://yarnpkg.com/responsively-app一种改进的 Web 浏览器，有助于响应式 Web 开发。Web 开发人员必须拥有开发工具https://responsively.app/javascript-obfuscator功能强大的免费 JavaScript 混淆器，包含多种功能，可为源代码提供保护https://obfuscator.io/Nano ID小巧的、安全的、URL 友好的、独特的 JavaScript 字符串 唯一 ID 生成器https://zelark.github.io/nano-id-cc/spy-debugger一站式页面调试、抓包工具。远程调试任何手机浏览器页面，任何手机移动端webview（如：微信，HybridApp等）。支持HTTP/HTTPS，无需USB连接设备https://responsively.app/fuite用于查找 Web 应用程序中的内存泄漏的工具https://github.com/nolanlawson/fuiteqs查询字符串解析和字符串化库https://github.com/ljharb/qsjs-cookie用于处理 cookie 的简单、轻量级 JavaScript APIhttps://github.com/js-cookie/js-cookietinymce排名第一的可定制、可扩展和灵活的富文本编辑器https://www.tiny.cloud/html2canvas允许在用户浏览器上对网页或其部分进行“截图”https://html2canvas.hertzen.com/shepherd引导用户浏览您的应用https://shepherdjs.dev/tinykeys极小的键盘事件监听库https://jamiebuilds.github.io/tinykeys/ag-grid用于构建企业应用程序的最佳 JavaScript 数据表https://www.ag-grid.com/tui.calendar功能齐全的 JavaScript 日程表https://ui.toast.com/tui-calendarscreenfull用于跨浏览器使用 JavaScript Fullscreen API 的简单包装器https://sindresorhus.com/screenfull/Fuse.jsJavaScript 中的轻量级模糊搜索https://fusejs.io/i18next用于浏览器或任何其他 javascript 环境（例如 Node.js、Deno）的国际化框架https://www.i18next.com/JsBarcode适用于 Web 和 Node.js 的易于使用但功能强大的条形码生成器https://lindell.me/JsBarcode/path-to-regexp将 /user/:name 等路径字符串转换为正则表达式https://github.com/pillarjs/path-to-regexpawait-to-js异步等待包装器，无需 try-catch 即可轻松处理错误https://blog.grossman.io/how-to-write-async-await-without-try-catch-blocks-in-javascript/md5用 MD5 散列消息的 JavaScript 函数https://github.com/pvorb/node-md5mitt.js它足够小，仅有200bytes，其次支持全部事件的监听和批量移除，替代EventBushttps://npm.im/mittjs-spark-md5MD5 算法的快速 md5 实现https://github.com/satazor/js-spark-md5nano小型（130 字节）、安全、URL 友好、唯一的 JavaScript 字符串 ID 生成器https://zelark.github.io/nano-id-cc/jsPDF用 JavaScript 生成 PDFhttps://parall.ax/products/jspdfua-parser-js从User-Agen中检测浏览器、引擎、操作系统、CPU 和设备类型/型号，占用空间相对较小（压缩后约 17KB，压缩后约 6KB），支持浏览器和 node.js 环境http://faisalman.github.io/ua-parser-js/togetherjs网站添加实时协作功能的JavaScript库，两个人可以在同一页面上进行交互，查看彼此的光标、编辑并一起浏览网站https://togetherjs.com/Clusterize.js开源的长列表渲染库，轻量级的原生大数据量展示https://clusterize.js.org/crypto-js-wasm加密标准的 javascript 库，比 crypto-js快16 倍https://github.com/originjs/crypto-js-wasmpdfkit用于 Node 和浏览器的 JavaScript PDF 生成库http://pdfkit.org/zx使用js编写更便捷shell脚本https://www.npmjs.com/package/zxNProgress.js适用于应用程序的进度条，受 Google、YouTube 和 Medium 的启发https://ricostacruz.com/nprogress/可视化highlight.jsJavaScript 语法高亮器，具有语言自动检测和零依赖项https://highlightjs.org/Drawflow创建简单的流程库https://jerosoler.github.io/Drawflow/tui.image-editorHTML5 Canvas 的全功能图像编辑器。它易于使用并提供强大的过滤器https://ui.toast.com/tui-image-editorviewerjsJavaScript 图像查看器https://fengyuanchen.github.io/viewerjs/prism.js轻量级、健壮、优雅的语法高亮库https://prismjs.com/fabric.js功能强大且简单的 Canvas库，轻松处理 HTML5 画布元素。是画布元素之上的交互式对象模型，也是一个SVG-to-canvas 解析器http://fabricjs.com/fullPage.js用于创建全屏滚动网站（也称为单页网站或一页网站），并在该网站的各个部分内添加横向滑块https://alvarotrigo.com/fullPage/opentype.jsOpenType 和 TrueType 字体解析器和编写器。它允许您从浏览器或 node.js访问文本的字母形式https://opentype.js.org/icones.js具有即时搜索功能的图标资源管理器，由 Iconify 提供支持https://icones.js.org/reveal.js创建功能齐全且精美的演示文稿https://revealjs.com/carbon创建和共享源代码的精美图像https://carbon.now.sh/lucky-canvas基于 TS + Canvas 开发的【大转盘 / 九宫格 / 老虎机】抽奖插件， 一套源码适配多端框架 JS / Vue / React / Taro / UniApp / 微信小程序等https://100px.net/Darkmode.js在几秒钟内为您的网站添加暗模式/夜间模式https://darkmodejs.learn.uno/?_360safeparam=8406218ECharts强大的交互式图表和浏览器数据可视化库https://echarts.apache.org/zh/index.htmlPixiJS使用最快，最灵活的2D WebGL渲染器创建精美的内容https://pixijs.com/AntV - G2数据驱动，高度易用，可扩展的可视化图形语法。https://g2plot.antv.vision/zh/ApexCharts.js基于SVG的JavaScript图表库，可使用简单的API构建交互式图表和可视化文件OpenLayers高性能，功能丰富的库，用于在Web上创建交互式地图。它可以显示从任何网页上的任何来源加载的地图图块，矢量数据和标记https://openlayers.org/Two.js面向现代Web浏览器的二维绘图api，渲染不可知实现相同的API在多种环境中得出：svg，canvas，和webglhttps://two.js.org/Paper.js基于HTML5 Canvas的矢量图形的图形库http://paperjs.org/Panolens.js事件驱动的基于WebGL的全景查看器。轻巧而灵活。它建立在Three.JS之上https://pchen66.github.io/Panolens/A-Frame用于构建 3D/AR/VR 体验的 Web 框架https://aframe.io/mermaid-js以与 Markdown 类似的方式从文本生成图表和流程图https://mermaid-js.github.io/mermaid/mo · js为网站添加基于JavaScript的动态图形https://mojs.github.io/trianglifyJavascript 库，用于创建独特的、美观的三角形图案http://qrohlf.com/trianglify/Babylon.js能强大、美观、简单、开放的游戏和渲染引擎https://www.babylonjs.com/Oasis Engine高性能 Web 蚂蚁图形引擎https://oasisengine.cn/Butterfly基于JS的数据驱动的节点式编排组件库https://butterfly-dag.gitee.io/butterfly-dag/homeimage-optimizer使用 Electron、Vue 和 Vite 用于优化图像和矢量图形的免费开源工具https://github.com/antonreshetov/image-optimizerSketchfab需任何插件即可在Web页面里嵌入交互式3D模型https://sketchfab.com/vConsole用于移动网页的轻量级、可扩展的前端开发工具https://github.com/Tencent/vConsoleswiper免费且最现代的移动触摸滑块，具有硬件加速过渡和惊人的原生行为https://swiperjs.com/Slidev面向开发人员的演示幻灯片https://sli.dev/konvaHTML5 Canvas JavaScript 框架，它支持桌面和移动应用程序的高性能动画、过渡、节点嵌套、分层、过滤、缓存、事件处理等等https://konvajs.org/p5.js开源的JavaScript可视化库，processing的js实现版本https://p5js.org/zh-Hans/cesium用于世界级 3D 地球仪和地图的开源 JavaScript 库https://cesium.com/platform/cesiumjs/driver.js一个轻量级、无依赖的用户引导组件https://kamranahmed.info/driver.js/vanilla-tilt.js平滑的 3D 倾斜 JavaScript 库https://micku7zu.github.io/vanilla-tilt.js/index.htmlparallax.js对智能设备的方向引擎响应的视差http://matthew.wagerfield.com/parallax/signature_pad基于 HTML5 canvas 的平滑签名绘制http://szimek.github.io/signature_pad/compressorjsJavaScript 图像压缩器https://fengyuanchen.github.io/compressorjs/eva.js用于创建交互式游戏项目的前端游戏引擎https://eva.js.org/d3基于数据来操作文档的JavaScript库https://d3js.org/动画插件countUp.js无依赖项的轻量级Javascript类，可用于快速创建以更有趣的方式显示数字数据的动画https://inorganik.github.io/countUp.js/impress.jsCSS3 转换和过渡的强大功能的演示框架https://impress.js.org/Anime.js轻量级的 JavaScript 动画库，具有简单而强大的 APIhttps://animejs.com/tween.js用于简单动画的 JavaScript 补间引擎，包含优化的 Robert Penner 方程http://tweenjs.github.io/tween.js/Popmotion制作数字、颜色和复杂字符串的动画。该库的主要动画功能只有5kb左右，整个库的容量在12kb左右https://popmotion.io/Typed.js打字动画库https://mattboldt.com/demos/typed-js/vivus.js在 SVG 上制作绘图动画的 JavaScript 库https://maxwellito.github.io/vivus/ScrollReveal在元素滚入或滚出视口时为其制作动画https://scrollrevealjs.org/canvas-confetti按需 五彩纸屑https://catdad.github.io/canvas-confetti/GSAP强大的 JavaScript 工具集，构建适用于所有主流浏览器的高性能动画。动画 CSS、SVG、画布、React、Vue、WebGL、颜色、字符串、运动路径、通用对象https://greensock.com/lax.js轻量级（<4kb gzipped）香草 JavaScript 库，可在您滚动时创建流畅美观的动画https://github.com/alexfoxy/lax.jsanimxyzAnimXYZ 可帮助您为您的网站创建、自定义和组合动画https://animxyz.com/svg.js用于操作和动画 SVG 的轻量级库https://svgjs.dev/docs/3.0/zdog用于画布和 SVG 的扁平、圆形、设计师友好的伪 3D 引擎https://zzz.dog/ProtonJavascript粒子动画库https://drawcall.github.io/Proton/文件操作SheetJS可读取和导出excel的工具库，功能强大，支持格式众多，支持xls、xlsx、ods(一种OpenOffice专有表格文件格式)等十几种格式https://sheetjs.com/revogrid具有高级定制功能的强大虚拟数据表格https://revolist.github.io/revogrid/FileSaver.js客户端保存文件的解决方案https://eligrey.com/blog/saving-generated-files-on-the-client-side/jszip使用 Javascript 创建、读取和编辑 .zip 文件https://stuk.github.io/jszip/Print.js帮助从网络打印的小型 javascript 库https://printjs.crabbly.com/mammoth.js将 Word 文档（.docx 文件）转换为 HTMLhttps://github.com/mwilliamson/mammoth.jsStreamSaver.js直接异步将流写入文件系统，适合大文件下载https://jimmywarting.github.io/StreamSaver.js/example.htmlPDF.js使用 HTML5 构建的可移植文档格式 (PDF) 查看器https://github.com/mozilla/pdf.jspdfmake用于服务器端和客户端的 PDF 文档生成库http://pdfmake.org/pdf-lib在任何 JavaScript 环境中创建和修改 PDF 文档https://pdf-lib.js.org/uppyJavaScript 文件上传器https://uppy.io/音视频meyda.jsJavaScript 音频特征提取库https://meyda.js.org/howler.jsJavascript 音频库https://howlerjs.com/flv.jsHTML5 FLV 播放器https://github.com/Bilibili/flv.js/plyrHTML5、YouTube 和 Vimeo 播放器https://plyr.io/xgplayer 西瓜播放器网络视频和音频播放器库https://h5player.bytedance.com/hls.js可在支持 MSE 的浏览器中播放 HLShttps://hls-js.netlify.app/demo/智能化tensorflow.js用于在浏览器和 Node.js 训练和部署机器学习模型https://tensorflow.google.cn/face-api.js用于在浏览器和 nodejs 中使用 tensorflow.js 进行人脸检测和人脸识别的 JavaScript APIhttps://github.com/justadudewhohacks/face-api.js/tracking.js将不同的计算机视觉算法和技术引入浏览器环境。通过使用现代HTML5规范，我们使您能够进行实时颜色跟踪，人脸检测等https://trackingjs.com/pose-animator识别出人类的表情变化和肢体动作，并将其映射到2D矢量图型上https://github.com/yemount/pose-animatorar-cutpaste手机上预装工具，对着目标物体拍摄，即可将图像复制粘贴进 Photoshophttps://github.com/cyrildiagne/ar-cutpasteimgcook专注以 Sketch、PSD、静态图片等形式的视觉稿作为输入，通过智能化技术一键生成可维护的前端代码https://www.imgcook.com/nsfwjs帮助快速识别不合时宜的图像https://nsfwjs.com/编辑器VditorMarkdown 编辑器，支持所见即所得、即时渲染（类似 Typora）和分屏预览模式，由 TypeScript 实现，支持原生 JavaScript、Vue、React、Angular，提供桌面版https://b3log.org/vditor/monaco-editor为VS Code提供支持的代码编辑器https://microsoft.github.io/monaco-editor/bytemd用 Svelte 构建的 Markdown 编辑器组件。它也可以用于其他库/框架，例如 React、Vue 和 Angularhttps://bytemd.netlify.app/wangEditorTypescript 开发的 Web 富文本编辑器， 轻量、简洁、易用、开源免费https://www.wangeditor.com/mavonEditorMarkdown 编辑器，支持多种个性化功能http://www.mavoneditor.com/quillAPI 驱动的富文本编辑器https://quilljs.com/codemirror5浏览器内代码编辑器https://codemirror.net/marked用于解析 Markdown 的编译器https://marked.js.org/tiptap完全控制文本编辑器体验。它是可定制的，带有大量扩展，是开源的，并且有大量的文档https://tiptap.dev/2D 3Ddat.gui在 JavaScript 中更改变量的轻量级图形用户界面https://github.com/dataarts/dat.guiThree.js易于使用、轻量级、跨浏览器的通用 3D 库https://threejs.org/Draco 3D缩和解压缩 3D 几何网格和点云。它旨在改进 3D 图形的存储和传输https://google.github.io/draco/stats.jsJavaScript 性能监视器http://mrdoob.github.io/stats.js/matter-js一个用于 web 的 JavaScript 2D 物理引擎https://brm.io/matter-js/Oimo.js用于 javascript 的轻量级 3d 物理引擎，是OimoPhysics的完整 javascript 转换http://lo-th.github.io/Oimo.js/#basicammo.js使用 Emscripten 将 Bullet 物理引擎直接移植到 JavaScripthttps://github.com/kripken/ammo.js其他常用Inquirer.js实现命令行交互式界面的工具集合https://github.com/SBoudrias/Inquirer.js/chalk命令行美化工具https://github.com/chalk/chalkTimer.js简单而轻量级的库，无需任何依赖项来创建和管理计时器https://github.com/husa/timer.jsday.js极简的 JavaScript 库，它使用与 Moment.js 兼容的 API 为现代浏览器解析、验证、操作和显示日期和时间https://day.js.org/Socket.io支持基于事件的实时双向通信https://socket.io/The AlgorithmsGitHub 最大的开源算法库https://the-algorithms.com/log-symbols各种日志级别的彩色符号https://github.com/sindresorhus/log-symbolsplop微型生成器框架，使整个团队可以轻松地创建具有一定一致性的文件https://plopjs.com/prompts轻量级、美观且用户友好的交互式提示https://github.com/terkelg/promptsshelljs基于 Node.js API 的 Unix shell 命令的可移植（Windows/Linux/macOS）实现https://www.npmjs.com/package/shelljsfiglet浏览器控制台个性化输出https://github.com/patorjk/figlet.jspicocolors终端修改输出字符样式的 npm 包，比 chalk 体积小 14 倍，速度快 2 倍https://github.com/alexeyraspopov/picocolorscac用于构建 CLI 应用程序的 JavaScript 库，体积数倍小于 commander 和 yargshttps://github.com/cacjs/cacnpm-run-all用于并行或顺序运行多个 npm 脚本的 CLI 工具https://github.com/mysticatea/npm-run-allnode-semver语义化版本号管理的 npm 库，比如 判断一个版本是否合法，判断版本号命名是否正确，两个版本谁大谁小之类 等https://github.com/npm/node-semverpuppeteer在浏览器中手动执行的大多数操作都可以使用 Puppeteer 完成生成页面的屏幕截图和 PDF。抓取 SPA（单页应用程序）并生成预渲染内容自动化表单提交、UI 测试、键盘输入等。https://pptr.dev/temir用vue组件来编写命令行界面应用的工具https://github.com/webfansplz/temirenquirer适用于 Node.js 的时尚、直观且用户友好的提示https://github.com/enquirer/enquirer跨平台框架uni-app使用 Vue.js 开发所有前端应用的框架，开发者编写一套代码，可发布到iOS、Android、Web（响应式）、以及各种小程序等13个平台https://uniapp.dcloud.io/react-native使用 React 构建移动应用程序https://reactnative.dev/FlutterGoogle 的开源框架，用于构建美观、本机编译的多平台应用程序https://flutter.dev/chameleon一套代码运行多端，一端所见即多端所见http://cml.didi.cn/Taro遵循 React 语法规范的多端统一开发框架https://taro.zone/Electron使用 JavaScript，HTML 和 CSS 构建跨平台的桌面应用程序https://www.electronjs.org/MicroApp京东零售推出的微前端框架。基于webcomponent-like渲染，从组件思维实现微前端，旨在降低上手难度，提高工作效率https://micro-zoe.github.io/micro-app/Tauri使用 Web 前端构建更小、更快、更安全的桌面应用程序https://tauri.studio/Hippy跨平台的开发框架，旨在帮助开发者编写一次，运行在三个平台（iOS、Android 和 Web）上https://hippyjs.org/#/无界基于 Web Components + iframe 微前端框架，具备成本低、速度快、原生隔离、功能强等一系列优点。https://wujie-micro.github.io/doc/qiankun微前端的实现，基于single-spa。它旨在使构建生产就绪的微前端架构系统变得更加容易和轻松。https://qiankun.umijs.org/zhFlutterpub.devDart和Flutter应用程序的官方包存储库https://pub.dev/awesome-flutter-plugins尽可能收集好用的Flutter插件以便更效率的开发https://github.com/jahnli/awesome-flutter-pluginsflutter-widget.live使用 Flutter for web 构建的网站，用于在线实时预览小部件示例。https://flutter-widget.live/basics/introductiongoogle IconsGoogle Material Design 图标https://fonts.google.com/iconsJson To Dart ModelJson 转 Dart Model类https://ashamp.github.io/jsonToDartModel/flutter awesome很棒的列表，其中包含优秀的 Flutter 库和工具https://flutterawesome.com/LottieFiles免费 Lottie 动画文件、工具和插件https://lottiefiles.com/Electronvue-cli-plugin-electron-builde使用Electron轻松构建用于桌面的Vue.js应用https://nklayman.github.io/vue-cli-plugin-electron-builder/electron-about-window为Electron 提供 “关于此应用程序” 窗口。https://github.com/rhysd/electron-about-windownativefier使任何网页成为桌面应用程序https://github.com/nativefier/nativefierUniappGrace UI兼容微信小程序及uni-app的优秀前端框架，以flex布局为基础，提供了丰富的组件及界面库GraceUIhttps://www.graceui.com/uView全面兼容nvue的uni-app生态框架，全面的组件和便捷的工具https://www.uviewui.com/ThorUI轻量、简洁、全面的移动端组件库https://thorui.cn/doc/CSS动画cssfx精美简单的点击复制 CSS 效果https://cssfx.netlify.app/UI SnippetsUI 片段的集合https://ui-snippets.dev/SpinKitCSS 动画的加载指示器https://tobiasahlin.com/spinkit/animate.css强大的预设css3动画库https://animate.style/犸良一站式动效制作平台，通过海量的动效素材以及可视化编辑能力，帮助零基础的用户轻松完成动效制作https://design.alipay.com/emotionanimistaCss 动画https://animista.net/lordicon功能强大的精心制作的动画图标库https://lordicon.com/svg-spinners24 x 24 dp的svg格式loading加载器https://github.com/n3r4zzurr0/svg-spinnersmagic具有炫酷效果的 CSS3 动画https://www.minimamente.com/project/magic/Hover.cssCSS3 驱动的悬停效果，可应用于链接、按钮、徽标、SVG、特色图像等http://ianlunn.github.io/Hover/eva-icons超过 480 个制作精美的开源图标。SVG、Sketch、Web 字体和动画支持https://akveo.github.io/eva-icons/#/工具normalize.cssCSS 重置的现代替代方案http://necolas.github.io/normalize.css/Squoosh对比 tinypng 有【更好的】压缩效果https://squoosh.app/UIManypixels收集无版权插图的网站，提供 SVG / PNG 格式下载，并且允许更改颜色https://www.manypixels.co/galleryU钙网免费的LOGO在线设计制作工具https://www.uugai.com/design-blocks一组 170 多个基于 Bootstrap 的设计块，可用于创建干净的现代网站https://froala.com/design-blocks/unDraw精美的 SVG 插画集https://undraw.co/illustrationsIra Design通过调配渐变色、搭配手绘组件定制插画https://iradesign.io/gallery/illustrationslukasz adam免费 SVG 插画https://lukaszadam.com/illustrationspixeltrue创建令人叹为观止的项目的插图https://www.pixeltrue.com/packs3dicons3d图标库https://3dicons.co/css-buttons100 个现代 CSS 按钮https://css-buttons.web.app/uiset优质免费的UI设计资源https://uiset.com/error404404插画页面https://error404.fun/ui85,745 个精选设计资源，为您的创意工作流程注入活力https://ui8.net/编程工具代码工具gitignore.io为项目创建有用的 .gitignore 文件https://www.toptal.com/developers/gitignoreany-rule常用正则大全, 支持web / vscode / idea / Alfred Workflow多平台https://any86.github.io/any-rule/30-seconds-of-code满足多种语言开发需求的简短代码片段https://www.30secondsofcode.org/github-readme-stats为 github 自述文件动态生成的统计信息https://github.com/anuraghazra/github-readme-statscz-cli规范提交说明的git工具http://commitizen.github.io/cz-cli/commitlintgit commit 校验工具https://commitlint.js.org/#/huskyGit hooks 工具，可以防止使用 Git hooks 的一些不好的 commit 或者 pushhttps://typicode.github.io/husky/#/lint-staged代码提交之前,进行代码规则检查并尝试修复，能够确保进入git库的代码都是符合代码规则https://github.com/okonet/lint-stagedanywhere随启随用的静态文件服务器https://github.com/JacksonTian/anywherecode996统计 Git 项目的 commit 时间分布，进而推导出这个项目的编码工作强度https://hellodigua.github.io/code996/#/图像工具bigjpg使用度卷积神经网络。它会将噪点和锯齿的部分进行补充，实现图片的无损放大https://bigjpg.com/jpghd使用人工智能 AI 超分模型和深度学习技术来将低清破损有噪点图片处理成高画质高分辨率图片同时支持破损老照片修复和老照片上色https://jpghd.com/bigmp4使用智能 AI 模型，能将视频无损高清放大、增强画质、智能补帧使画面丝滑流畅栩栩如生同时支持黑白视频上色和慢动作https://bigmp4.com/imglarger基于强大的机器学习可在不降低质量的情况下提高图像分辨率https://imglarger.com/unscreen智能AI去除视频背景在线神器https://www.unscreen.com/阿里妈妈创意中心阿里智能文案，智能抠图工具https://chuangyi.taobao.com/文件转换ALL TO ALL全类型的在线文件转换平台，免费、快速，无须下载安装任何软件https://www.alltoall.net/Convertio将文件转换成任意格式https://convertio.co/zh/Vue3生态工具1.Web UI库ElementUI Plus一套为开发者、设计师和产品经理准备的基于 Vue 3.0 的桌面端组件库https://element-plus.org/zh-CN/Ant Design of VueAnt Design 的 Vue 实现，开发和服务于企业级后台产品https://www.antdv.com/docs/vue/introduce-cnBalmUI基于谷歌的 Material Design，附带 Vue 插件和指令，以及从简单到复杂的高度可定制组件https://next-material.balmjs.com/Naive UI图森Vue3的组件库，文档完整，我项目中经常使用https://www.naiveui.com/zh-CN/os-themearco.design字节跳动企业级产品设计系统，支持React和Vue双版本https://arco.design/Quasar轻松构建高性能和高质量的Vue.js 3用户界面，好用，但没有中文文档https://quasar.dev/iDUXVue3.x 的 UI 组件库，完全使用 TypeScript 开发https://idux.site/TDesign腾讯业务团队在服务业务过程中沉淀的一套企业级设计体系https://tdesign.tencent.com/https://tdesign.tencent.com/vue-next/overviewPrimeVue易于使用、多功能、高性能的 Vue UI 组件库https://www.primefaces.org/primevue/DevUI华为基于 Vue3 和 DevUI 设计的 UI 组件https://vue-devui.github.io/vuestic-uiVue 3 的免费和开源 UI 库 ,UI非常好看，并且有可用后台管理界面。https://vuestic.dev/Headless UI完全无样式、完全可访问的 UI 组件，旨在与 Tailwind CSS 完美集成。https://headlessui.com/View UI Plus基于 Vue.js 3 的企业级 UI 组件库和前端解决方案https://www.iviewui.com/2.移动UI库Vant有赞轻量、可靠的移动端组件库https://vant-contrib.gitee.io/vant/#/zh-CNNutUI京东风格的轻量级移动端 Vue 组件库，非常适合移动端电商使用。https://nutui.jd.com/#/VarletMaterial 风格移动端组件库 ，文档非常齐全。https://varlet.gitee.io/varlet-ui/#/zh-CN/homenutui-bingo京东基于 NutUI 的抽奖组件库，助力营销活动和小游戏场景。https://nutui.jd.com/bingo/#/3.相关工具unplugin-vue-componentsantfu 按需组件自动导入，开箱即用地支持 Vue 2 和 Vue 3，Tree-shakable，只注册你使用的组件，附有流行UI 库的内置解析器。https://www.npmjs.com/package/unplugin-vue-componentsvuex-persistedstate在页面重新加载之间保持并重载您的 Vuex 状态https://github.com/robinvdvleuten/vuex-persistedstatevuex-persist支持 Typescript 的Vuex插件，它能够将应用程序的状态保存到持久存储中，例如 Cookies 或 localStoragehttps://championswimmer.in/vuex-persist/@vueuse/gesture手势库，使应用程序具有交互性https://gesture.vueuse.org/unplugin-auto-importantfu 自动导入 Vite、Webpack、Rollup 和 esbuild 的 API。支持 TypeScript。https://github.com/antfu/unplugin-auto-importpinia-plugin-persistedstatePinia 商店的可配置持久性https://github.com/prazdevs/pinia-plugin-persistedstatehttps://vue-termui.dev/一个基于 Vue.js 的终端 UI 框架，可让您轻松构建现代终端应用程序https://vue-termui.dev/4.可视化PdfvuerDF 查看器，使用 Mozilla 的 PDF.js，支持 Vue2 和 Vue3https://arkokoley.github.io/pdfvuer/vue3-marquee无缝滚动组件https://vue3-marquee.vercel.app/Vue-ECharts百度ECharts 的 Vue.js 组件。 配置参考Echarts官方 基于 ECharts v5+ 开发，适用于Vue.js 2/3。https://vue-echarts.dev/iconpark字节跳动出品，将一个SVG图标转化为多个主题，并生成React图标，Vue图标，svg图标https://iconpark.oceanengine.com/home5.插件vue-multiselect-nextVue.js 的通用选择/多选/标记组件https://vue-multiselect.js.org/vue-print-nb用于印刷、简单、快速、方便、轻便的指令包装器https://github.com/Power-kxLee/vue-print-nbvue-i18n-nextVue3的国际化插件https://vue-i18n.intlify.dev/vue-cropper简单的vue图片裁剪插件http://github.xyxiao.cn/vue-cropper/example/Grid LayoutVue.js 的网格布局系统https://jbaysolutions.github.io/Vue Qrcode Reader允许在不离开浏览器的情况下检测和解码二维码https://gruhn.github.io/vue-qrcode-reader/Makeit Captcha基于 Vue3 + Vite + Canvas 开发的滑块验证码，动态生成验证滑块，结合后端的二次校验，能有效的避免被抓取模拟验证https://admin.makeit.vip/components/captchavue3-clipboardVue 3 的 clipboard.jshttps://github.com/soerenmartius/vue3-clipboardvue.draggable基于Sortable.js的Vue 3拖放组件https://sortablejs.github.io/vue.draggable.next/#/simpleBetterScroll解决移动端（已支持 PC）各种滚动场景需求的插件。https://better-scroll.github.io/docs/zh-CN/6.相关生态Vue 插件库https://www.vue365.cn/Pinia轻量级状态管理库，API 设计更接近Vuex 5的提案https://pinia.vuejs.org/Nuxt ModulesNuxt 发现我们的模块列表以增强您的Nuxt 项目https://modules.nuxtjs.org/Nuxt 3轻量级应用框架,可用来创建服务端渲染 (SSR) 应用https://v3.nuxtjs.org/vuepressVue 驱动的静态网站生成器https://v2.vuepress.vuejs.org/zh/VueUse强大的 Vue 组合实用程序集合https://vueuse.org/7.动画vue-starport带有动画的跨路由共享组件https://vue-starport.netlify.app/@vueuse/motionVue Composables 让你的组件动起来https://motion.vueuse.org/8.音视频@vueuse/sound用于播放音效的 Vue 组合https://sound.vueuse.org/全栈-后端插件isomorphic-git用于节点和浏览器的 git 纯 JavaScript 实现https://isomorphic-git.org/jsonwebtokennode.js 的 JsonWebToken 实现https://github.com/auth0/node-jsonwebtokenQiniu SDK七牛资源（云）存储 SDK for Node.jshttps://developer.qiniu.com/kodo/sdk/nodejskoa-body功能齐全的koa正文解析器中间件，支持multipart、urlencoded和json请求正文，提供与 Express 的 bodyParser 相同的功能https://github.com/koajs/koa-bodykoa-json-error纯Koa JSON 应用程序的错误处理程序，显示堆栈跟踪https://github.com/koajs/json-errorkoa-jwt用于验证 JSON Web 令牌的 Koa 中间件https://github.com/koajs/jwtkoa-routerKoa 的路由器中间件https://github.com/koajs/routerkoa2-corskoa2 的 CORS 中间件https://github.com/zadzbw/koa2-corskoa-sslify为 Koa.js 实施 HTTPS 中间件https://github.com/turboMaCk/koa-sslifysuperagent-proxy允许您通过某种代理来代理 HTTP 请求https://github.com/TooTallNate/superagent-proxynode-http-proxy-agenHTTP 端点的 HTTP(s) 代理“http.Agent”实现https://github.com/TooTallNate/node-http-proxy-agenthttps-proxy-agentHTTPS 端点的 HTTP(s) 代理“http.Agent”实现https://github.com/TooTallNate/node-https-proxy-agentsocks-proxy-agent用于 HTTP 和 HTTPS 的 SOCKS (v4/v5) 代理“http.Agent”实现https://github.com/TooTallNate/node-socks-proxy-agentsimple-get发出 http get 请求的最简单方法。支持 HTTPS、重定向、gzip/deflate、小于 100 行的流https://github.com/feross/simple-getcommander.jsnode.js命令行界面的完整解决方案https://github.com/tj/commander.jsora命令行 loading 动效https://github.com/sindresorhus/oradotenv从 .env 为 nodejs 项目加载环境变量https://github.com/motdotla/dotenvFFCreator基于node.js的高速视频制作库https://tnfe.github.io/FFCreator/#/sharp高性能 Node.js 图像处理，调整 JPEG、PNG、WebP、AVIF 和 TIFF 图像大小的最快模块https://sharp.pixelplumbing.com/node-fs-extra强大的文件操作库， 是 Nodejs fs 模块 的增强版https://github.com/jprichardson/node-fs-extrachokidar用于文件监控的库，解决兼容性不好、无法监听、监听多次 等大量影响性能的问题https://paulmillr.com/fast-glob快速批量导入、读取文件的库https://github.com/mrmlnc/fast-globpeerflixnode.js 的流式 torrent 客户端https://github.com/mafintosh/peerflix工具Nginx高性能的HTTP和反向代理web服务器，同时也提供了IMAP/POP3/SMTP服务https://blog.redis.com.cn/doc/PM2Node进程管理工具，如性能监控、自动重启、负载均衡等https://pm2.keymetrics.io/docs/usage/process-management/nodemon监视 node.js 应用程序中的任何更改并自动重新启动服务器https://nodemon.io/RobotJSNode.js 桌面自动化，控制鼠标、键盘和阅读屏幕等http://robotjs.io/Jenkins领先的开源自动化服务器，Jenkins 提供了数百个插件来支持构建、部署和自动化任何项目https://www.jenkins.io/nexe将 node.js 应用程序中创建一个可执行文件https://github.com/nexe/nexedebug模仿 Node.js 核心调试技术的小型 JavaScript 调试实用程序。适用于 Node.js 和 Web 浏览器https://github.com/debug-js/debug数据库mongoose旨在在异步环境中工作的 MongoDB 对象建模https://mongoosejs.com/GraphQL用于 API 的查询语言也是一个满足你数据查询的运行时https://graphql.cn/lowdb数据库适用于Node，Electron和浏览器的小型JSON数据库。由Lodash驱动https://github.com/typicode/lowdbnedb适用于Node.js，nw.js，Electron和浏览器的嵌入式持久性数据库或内存数据库,API是MongoDB的子集https://github.com/louischatriot/nedbAPI网易云音乐 API全部接口已升级到最新，具备登录接口,多达200多个接口https://binaryify.github.io/NeteaseCloudMusicApi/#/Node-SpliderApi基于 Node+Express 网络爬虫 API 接口 包括前端开发日报、kugou 音乐、前端 top 框架排行、妹纸福利、搞笑视频、段子笑话、各类视频新闻资讯 热点详情接口数据,接口数据更新目标https://ecitlm.github.io/Node-SpliderApi/聚合数据免费向开发者提供全国车辆违章查询API,天气API,基站数据,移动联通基站,电信基站,覆盖国内外1000多个主要城市公共交通信息数据https://www.juhe.cn/极速数据提供各类生活数据API,方便开发者快速简单的开发APP、软件及其他服务平台https://www.jisuapi.com/京东万象供金融、电商、运营商数据,免费数据,热门数据,学籍数据,企业诉讼数据,实名认证,征信数据,质检等多种数据https://wx.jdcloud.com/apiQQ音乐API通过Web网页版请求QQ音乐接口数据https://rain120.github.io/qq-music-api/#/万维易源一站式全网API调用平台https://www.showapi.com/TP5 Splider Api基于Thinkphp5+phpQuery 网络爬虫抓取数据接口 统一输出接口数据apihttps://ecitlm.github.io/TP5_Splider/#/Roll API提供开发中常用数据的一个稳定聚合Api接口https://www.mxnzp.com/doc/listOpen API收集可用的Open APIshttps://www.wanandroid.com/openapis天行数据160多个免费接口，接口高度统一，简单易用，毫秒级响应https://www.tianapi.com/free-api免费API,收集免费的接口服务https://www.free-api.com/douban-imdb-api基于豆瓣、IMDB、烂番茄评分的电影电视剧双语(中英)数据api接口https://www.iqi360.com/p/douban-imdb-api框架Koa基于 Node.js 平台的下一代 web 开发框架https://koajs.com/Express用于Node.js 的快速、独立、简约的 Web 框架https://expressjs.com/egg.js为企业级框架和应用而生https://www.eggjs.org/Nest.js构建高效且可扩展的服务器端应用程序的渐进式Node.js框架https://nestjs.com/
一、组件设计组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念（组件）来实现开发的模式现在有一个场景，点击新增与编辑都弹框出来进行填写，功能上大同小异，可能只是标题内容或者是显示的主体内容稍微不同这时候就没必要写两个组件，只需要根据传入的参数不同，组件显示不同内容即可这样，下次开发相同界面程序时就可以写更少的代码，意义着更高的开发效率，更少的 Bug 和更少的程序体积二、需求分析实现一个Modal组件，首先确定需要完成的内容：遮罩层标题内容主体内容确定和取消按钮主体内容需要灵活，所以可以是字符串，也可以是一段 html 代码特点是它们在当前vue实例之外独立存在，通常挂载于body之上除了通过引入import的形式，我们还可通过API的形式进行组件的调用还可以包括配置全局样式、国际化、与typeScript结合三、实现流程首先看看大致流程：目录结构组件内容实现 API 形式事件处理其他完善目录结构Modal组件相关的目录结构├── plugins │ └── modal │ ├── Content.tsx // 维护 Modal 的内容，用于 h 函数和 jsx 语法 │ ├── Modal.vue // 基础组件 │ ├── config.ts // 全局默认配置 │ ├── index.ts // 入口 │ ├── locale // 国际化相关 │ │ ├── index.ts │ │ └── lang │ │ ├── en-US.ts │ │ ├── zh-CN.ts │ │ └── zh-TW.ts │ └── modal.type.ts // ts类型声明相关因为 Modal 会被 app.use(Modal) 调用作为一个插件，所以都放在plugins目录下组件内容首先实现modal.vue的主体显示内容大致如下<Teleport to="body" :disabled="!isTeleport"> ✕ <Content v-if="typeof content === 'function'" :render="content" /> <slot v-else> {{ content }} </slot> ❍ {{ t("r.confirm") }} {{ t("r.cancel") }} </Teleport>最外层上通过Vue3 Teleport 内置组件进行包裹，其相当于传送门，将里面的内容传送至body之上并且从DOM结构上来看，把modal该有的内容（遮罩层、标题、内容、底部按钮）都实现了关于主体内容 <Content v-if="typeof content==='function'" :render="content" /> <slot v-else> {{content}} </slot> 可以看到根据传入content的类型不同，对应显示不同得到内容最常见的则是通过调用字符串和默认插槽的形式// 默认插槽 <Modal v-model="show" title="演示 slot"> hello world~ </Modal> // 字符串 <Modal v-model="show" title="演示 content" content="hello world~" />通过 API 形式调用Modal组件的时候，content可以使用下面两种h 函数$modal.show({ title: '演示 h 函数', content(h) { return h( 'div', { style: 'color:red;', onClick: ($event: Event) => console.log('clicked', $event.target) }, 'hello world ~' ); } });JSX$modal.show({ title: '演示 jsx 语法', content() { return ( console.log('clicked', $event.target)} > hello world ~ ); } });实现 API 形式那么组件如何实现API形式调用Modal组件呢？在Vue2中，我们可以借助Vue实例以及Vue.extend的方式获得组件实例，然后挂载到body上import Modal from './Modal.vue'; const ComponentClass = Vue.extend(Modal); const instance = new ComponentClass({ el: document.createElement("div") }); document.body.appendChild(instance.$el);虽然Vue3移除了Vue.extend方法，但可以通过createVNode实现import Modal from './Modal.vue'; const container = document.createElement('div'); const vnode = createVNode(Modal); render(vnode, container); const instance = vnode.component; document.body.appendChild(container);在Vue2中，可以通过this的形式调用全局 APIexport default { install(vue) { vue.prototype.$create = create } }而在 Vue3 的 setup 中已经没有 this 概念了，需要调用app.config.globalProperties挂载到全局export default { install(app) { app.config.globalProperties.$create = create } }事件处理下面再看看看Modal组件内部是如何处理「确定」「取消」事件的，既然是Vue3，当然采用Compositon API 形式// Modal.vue setup(props, ctx) { let instance = getCurrentInstance(); // 获得当前组件实例 onBeforeMount(() => { instance._hub = { 'on-cancel': () => {}, 'on-confirm': () => {} }; }); const handleConfirm = () => { ctx.emit('on-confirm'); instance._hub['on-confirm'](); }; const handleCancel = () => { ctx.emit('on-cancel'); ctx.emit('update:modelValue', false); instance._hub['on-cancel'](); }; return { handleConfirm, handleCancel }; }在上面代码中，可以看得到除了使用传统emit的形式使父组件监听，还可通过_hub属性中添加 on-cancel，on-confirm方法实现在API中进行监听app.config.globalProperties.$modal = { show({}) { /* 监听 确定、取消 事件 */ } }下面再来目睹下_hub是如何实现// index.ts app.config.globalProperties.$modal = { show({ /* 其他选项 */ onConfirm, onCancel }) { /* ... */ const { props, _hub } = instance; const _closeModal = () => { props.modelValue = false; container.parentNode!.removeChild(container); }; // 往 _hub 新增事件的具体实现 Object.assign(_hub, { async 'on-confirm'() { if (onConfirm) { const fn = onConfirm(); // 当方法返回为 Promise if (fn && fn.then) { try { props.loading = true; await fn; props.loading = false; _closeModal(); } catch (err) { // 发生错误时，不关闭弹框 console.error(err); props.loading = false; } } else { _closeModal(); } } else { _closeModal(); } }, 'on-cancel'() { onCancel && onCancel(); _closeModal(); } }); } };其他完善关于组件实现国际化、与typsScript结合，大家可以根据自身情况在此基础上进行更改参考文献https://segmentfault.com/a/1190000038928664
设置 Git 用户先在终端执行一下 git config --global --list，看看当前设备的 git 有没有设置好相关的用户名跟邮箱。有的话就会正常显示user.name=Your Name user.email=your-name@example.com如果没有的话，就会出现类似这种错误fatal: unable to **read** config **file** **'\~/.gitconfig'**: No such **file** or directory既然没有那就设置一下git config --global user.name "Your Name" git config --global user.email "Your Email"设置完成后要想确认一下，就重新执行git config --global --list生成 SSH Key这个就比较容易，直接执行这条命令，主要是设置一下邮箱地址ssh-keygen -t rsa -C "your-email-address"一路回车就行，一般会显示下面这些内容，具体内容以自己的系统为准Generating public/private rsa key pair. Enter file in which to save the key (~/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in ~/.ssh/id_rsa. Your public key has been saved in ~/.ssh/id_rsa.pub. The key fingerprint is: SHA256:IuTZyVphdJVuRBBYBjCYtCTD1rJcgumXe0oXdErnUeo limitliu@qq.com The key's randomart image is: +---[RSA 2048]----+ |=o+oo.o+B*o. | |oOo+ =.*. o | |+ * = B..o | | + = B.+ o | | . = BES. | | o * . | | . = | | . | | | +----[SHA256]-----+生成后把内容拷贝到自己的剪贴板，public key 文件生成在哪可以看上面执行后的结果，里面有对应文件路径，我这里生成得文件是在 ~/.ssh/id_rsa.pub 这个路径，Mac 可以直接这样执行这条命令来复制生成后把内容拷贝到自己的剪贴板，public key 文件生成在哪可以看上面执行后的结果，里面有对应文件路径，我这里生成得文件是在 `~/.ssh/id_rsa.pub` 这个路径，**Mac** 可以直接这样执行这条命令来复制之后就可以在需要使用的地方直接粘贴了
1. 通过 uname -r 查看当前的内核系统版本uname -r2. 使用root权限登录Centos. 确保yum包更新到最新yum -y update3. 卸载旧版本(如果有安装过旧版本的话)sudo yum remove -y docker*4. 安装需要的软件包 yum-util 提供yum-config-manager功能, 另外两个是devicemapper的驱动依赖yum install -y yum-utils5. 设置yum源 更新 yum的包索引yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast6. 可以查看所有仓库中所有docker版本,并选择特定版本安装yum list docker-ce --showduplicates | sort -r7. 安装dockeryum install -y docker-ce-3:19.03.9-3.el7.x86_648. 启动并加入开机启动systemctl start docker && systemctl enable docker9. 验证安装是否成功docker --version10. 查看docker 本地镜像仓库docker images11.拉取远程镜像仓库内容docker pull nginx //比如nginx 默认最新 latest 版本 docker pull nginx:1.23.2-perl //选择版本拉取12. 查看本机运行的所有容器docker ps13 docker容器运行// -d 表示后台运行docker -p ==> port // 80 nginx 默认 90数组机映射端口 docker run -d -p 90:80 nginx docker run -d -p 90:80 nginx:1.23.2-perl //如果有版本14. 进入到docker容器内/退出容器docker exec -it 3ce35d262dac /bin/bash // 3ce35d262dac ==> 唯一 CONTAINER ID 通过 docker ps 查看 cd /usr/share/nginx exit // 退出15.查看容器ipdocker inspect 3ce35d262dac // 3ce35d262dac ==> 唯一 CONTAINER ID 通过 docker ps 查看 "IPAddress": "172.17.0.2", curl 172.17.0.2 //查看16.查看容器运行日志docker logs 3ce35d262dac -f17.停止容器docker stop 3ce35d262dac // 停止 docker kill 3ce35d262dac // 强制停止 docker start 3ce35d262dac // 启动已停止的容器18 容器与宿主机相互复制文件从容器里面拷贝文件到宿主机docker cp 容器id:要拷贝的问价你在容器里面的路径 宿主机的相应路径 如: docker cp 3ce35d262dac:/etc/nginx/nginx.conf /mydata/nginx从宿主机拷文件到容器里面docker cp 宿主机的相应路径 容器id:要拷贝的问价你在容器里面的路径19.DockerFile常用指令命令用途FROM基础镜像文件RUN构建镜像阶段执行的命令ADD 添加文件,从src目录复制文件到容器的dest, 其中src可以是Dockerfile所在目录的相对路径,也可以是一个URL,还可以是一个压缩包COPY拷贝文件,和ADD命令类似,但不支持URL和压缩包CMD容器启动后执行命令EXPOSE声明容器在运行时对外提供的服务端口WORKDIR指定的工作路径ENV指定的环境变量ENTRYPOINT容器入口 ENTRYPOINT 和CMD 指令的目的一样,都是指定Docker 容器启动时执行的命令,可以执行多次,但只有最后一次有效USER该指令用于设置启动镜像时的用户或者UID,写在该指令后的RUN CMD 以及 ENTRYPOINT 指令都将使用该用户执行命令VOLUME指定挂载点,该指令使容器中的一个目录具有持久化存储的功能,该目录可被本身使用,也可共享给其他容器. 当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令. 格式为: VOLUME["/data"]20. docker 打包docker build --platform linux/amd64 -f ./Docker/Dockerfile -t code3006/yuan . // 默认lastet 可加版本号 21. docker pushdocker push code3006/yuan21.CentOs 运行docker run -d --name yuan -p 5000:80 --restart=always code3006/yuan -d：后台运行 --m：容器名 -p映射端口号 ----restart=always：docker重启容器跟着重启 code3006/yuan：要运行的容器
vue权限管理之控制到按钮级别的权限
一、是什么权限是对特定资源的访问许可，所谓权限控制，也就是确保用户只能访问到被分配的资源而前端权限归根结底是请求的发起权，请求的发起可能有下面两种形式触发页面加载触发页面上的按钮点击触发总的来说，所有的请求发起都触发自前端路由或视图所以我们可以从这两方面入手，对触发权限的源头进行控制，最终要实现的目标是：路由方面，用户登录后只能看到自己有权访问的导航菜单，也只能访问自己有权访问的路由地址，否则将跳转 4xx 提示页视图方面，用户只能看到自己有权浏览的内容和有权操作的控件最后再加上请求控制作为最后一道防线，路由可能配置失误，按钮可能忘了加权限，这种时候请求控制可以用来兜底，越权请求将在前端被拦截二、如何做前端权限控制可以分为四个方面：接口权限按钮权限菜单权限路由权限接口权限接口权限目前一般采用jwt的形式来验证，没有通过的话一般返回401，跳转到登录页面重新进行登录登录完拿到token，将token存起来，通过axios请求拦截器进行拦截，每次请求的时候头部携带tokenaxios.interceptors.request.use(config => { config.headers['token'] = cookie.get('token') return config }) axios.interceptors.response.use(res=>{},{response}=>{ if (response.data.code === 40099 || response.data.code === 40098) { //token过期或者错误 router.push('/login') } })路由权限控制方案一初始化即挂载全部路由，并且在路由上标记相应的权限信息，每次路由跳转前做校验const routerMap = [ { path: '/permission', component: Layout, redirect: '/permission/index', alwaysShow: true, // will always show the root menu meta: { title: 'permission', icon: 'lock', roles: ['admin', 'editor'] // you can set roles in root nav }, children: [{ path: 'page', component: () => import('@/views/permission/page'), name: 'pagePermission', meta: { title: 'pagePermission', roles: ['admin'] // or you can only set roles in sub nav } }, { path: 'directive', component: () => import('@/views/permission/directive'), name: 'directivePermission', meta: { title: 'directivePermission' // if do not set roles, means: this page does not require permission } }] }]这种方式存在以下四种缺点：加载所有的路由，如果路由很多，而用户并不是所有的路由都有权限访问，对性能会有影响。全局路由守卫里，每次路由跳转都要做权限判断。菜单信息写死在前端，要改个显示文字或权限信息，需要重新编译菜单跟路由耦合在一起，定义路由的时候还有添加菜单显示标题，图标之类的信息，而且路由不一定作为菜单显示，还要多加字段进行标识方案二初始化的时候先挂载不需要权限控制的路由，比如登录页，404等错误页。如果用户通过URL进行强制访问，则会直接进入404，相当于从源头上做了控制登录后，获取用户的权限信息，然后筛选有权限访问的路由，在全局路由守卫里进行调用addRoutes添加路由import router from './router' import store from './store' import { Message } from 'element-ui' import NProgress from 'nprogress' // progress bar import 'nprogress/nprogress.css'// progress bar style import { getToken } from '@/utils/auth' // getToken from cookie NProgress.configure({ showSpinner: false })// NProgress Configuration // permission judge function function hasPermission(roles, permissionRoles) { if (roles.indexOf('admin') >= 0) return true // admin permission passed directly if (!permissionRoles) return true return roles.some(role => permissionRoles.indexOf(role) >= 0) } const whiteList = ['/login', '/authredirect']// no redirect whitelist router.beforeEach((to, from, next) => { NProgress.start() // start progress bar if (getToken()) { // determine if there has token /* has token*/ if (to.path === '/login') { next({ path: '/' }) NProgress.done() // if current page is dashboard will not trigger afterEach hook, so manually handle it } else { if (store.getters.roles.length === 0) { // 判断当前用户是否已拉取完user_info信息 store.dispatch('GetUserInfo').then(res => { // 拉取user_info const roles = res.data.roles // note: roles must be a array! such as: ['editor','develop'] store.dispatch('GenerateRoutes', { roles }).then(() => { // 根据roles权限生成可访问的路由表 router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表 next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record }) }).catch((err) => { store.dispatch('FedLogOut').then(() => { Message.error(err || 'Verification failed, please login again') next({ path: '/' }) }) }) } else { // 没有动态改变权限的需求可直接next() 删除下方权限判断 ↓ if (hasPermission(store.getters.roles, to.meta.roles)) { next()// } else { next({ path: '/401', replace: true, query: { noGoBack: true }}) } // 可删 ↑ } } } else { /* has no token*/ if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单，直接进入 next() } else { next('/login') // 否则全部重定向到登录页 NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it } } }) router.afterEach(() => { NProgress.done() // finish progress bar })按需挂载，路由就需要知道用户的路由权限，也就是在用户登录进来的时候就要知道当前用户拥有哪些路由权限这种方式也存在了以下的缺点：全局路由守卫里，每次路由跳转都要做判断菜单信息写死在前端，要改个显示文字或权限信息，需要重新编译菜单跟路由耦合在一起，定义路由的时候还有添加菜单显示标题，图标之类的信息，而且路由不一定作为菜单显示，还要多加字段进行标识菜单权限菜单权限可以理解成将页面与理由进行解耦方案一菜单与路由分离，菜单由后端返回前端定义路由信息{ name: "login", path: "/login", component: () => import("@/pages/Login.vue") }name字段都不为空，需要根据此字段与后端返回菜单做关联，后端返回的菜单信息中必须要有name对应的字段，并且做唯一性校验全局路由守卫里做判断function hasPermission(router, accessMenu) { if (whiteList.indexOf(router.path) !== -1) { return true; } let menu = Util.getMenuByName(router.name, accessMenu); if (menu.name) { return true; } return false; } Router.beforeEach(async (to, from, next) => { if (getToken()) { let userInfo = store.state.user.userInfo; if (!userInfo.name) { try { await store.dispatch("GetUserInfo") await store.dispatch('updateAccessMenu') if (to.path === '/login') { next({ name: 'home_index' }) } else { //Util.toDefaultPage([...routers], to.name, router, next); next({ ...to, replace: true })//菜单权限更新完成,重新进一次当前路由 } } catch (e) { if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单，直接进入 next() } else { next('/login') } } } else { if (to.path === '/login') { next({ name: 'home_index' }) } else { if (hasPermission(to, store.getters.accessMenu)) { Util.toDefaultPage(store.getters.accessMenu,to, routes, next); } else { next({ path: '/403',replace:true }) } } } } else { if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单，直接进入 next() } else { next('/login') } } let menu = Util.getMenuByName(to.name, store.getters.accessMenu); Util.title(menu.title); }); Router.afterEach((to) => { window.scrollTo(0, 0); });每次路由跳转的时候都要判断权限，这里的判断也很简单，因为菜单的name与路由的name是一一对应的，而后端返回的菜单就已经是经过权限过滤的如果根据路由name找不到对应的菜单，就表示用户有没权限访问如果路由很多，可以在应用初始化的时候，只挂载不需要权限控制的路由。取得后端返回的菜单后，根据菜单与路由的对应关系，筛选出可访问的路由，通过addRoutes动态挂载这种方式的缺点：菜单需要与路由做一一对应，前端添加了新功能，需要通过菜单管理功能添加新的菜单，如果菜单配置的不对会导致应用不能正常使用全局路由守卫里，每次路由跳转都要做判断方案二菜单和路由都由后端返回前端统一定义路由组件const Home = () => import("../pages/Home.vue"); const UserInfo = () => import("../pages/UserInfo.vue"); export default { home: Home, userInfo: UserInfo };后端路由组件返回以下格式[ { name: "home", path: "/", component: "home" }, { name: "home", path: "/userinfo", component: "userInfo" } ]在将后端返回路由通过addRoutes动态挂载之间，需要将数据处理一下，将component字段换为真正的组件如果有嵌套路由，后端功能设计的时候，要注意添加相应的字段，前端拿到数据也要做相应的处理这种方法也会存在缺点：全局路由守卫里，每次路由跳转都要做判断前后端的配合要求更高按钮权限方案一按钮权限也可以用v-if判断但是如果页面过多，每个页面页面都要获取用户权限role和路由表里的meta.btnPermissions，然后再做判断这种方式就不展开举例了方案二通过自定义指令进行按钮权限的判断首先配置路由{ path: '/permission', component: Layout, name: '权限测试', meta: { btnPermissions: ['admin', 'supper', 'normal'] }, //页面需要的权限 children: [{ path: 'supper', component: _import('system/supper'), name: '权限测试页', meta: { btnPermissions: ['admin', 'supper'] } //页面需要的权限 }, { path: 'normal', component: _import('system/normal'), name: '权限测试页', meta: { btnPermissions: ['admin'] } //页面需要的权限 }] }自定义权限鉴定指令import Vue from 'vue' /**权限指令**/ const has = Vue.directive('has', { bind: function (el, binding, vnode) { // 获取页面按钮权限 let btnPermissionsArr = []; if(binding.value){ // 如果指令传值，获取指令参数，根据指令参数和当前登录人按钮权限做比较。 btnPermissionsArr = Array.of(binding.value); }else{ // 否则获取路由中的参数，根据路由的btnPermissionsArr和当前登录人按钮权限做比较。 btnPermissionsArr = vnode.context.$route.meta.btnPermissions; } if (!Vue.prototype.$_has(btnPermissionsArr)) { el.parentNode.removeChild(el); } } }); // 权限检查方法 Vue.prototype.$_has = function (value) { let isExist = false; // 获取用户按钮权限 let btnPermissionsStr = sessionStorage.getItem("btnPermissions"); if (btnPermissionsStr == undefined || btnPermissionsStr == null) { return false; } if (value.indexOf(btnPermissionsStr) > -1) { isExist = true; } return isExist; }; export {has}在使用的按钮中只需要引用v-has指令<el-button @click='editClick' type="primary" v-has>编辑</el-button>小结关于权限如何选择哪种合适的方案，可以根据自己项目的方案项目，如考虑路由与菜单是否分离权限需要前后端结合，前端尽可能的去控制，更多的需要后台判断参考文献https://mp.weixin.qq.com/s/b-D2eH1mLwL_FkaZwjueSwhttps://segmentfault.com/a/1190000020887109https://juejin.cn/post/6844903648057622536#heading-6