找到
295
篇与
易航
相关的结果
- 第 21 页
-
🎁重磅资源!原价59880元,绝版中医课程资料大全【收藏版1.18TB】 中医是中国传统医学,距今已有千年历史。它基于阴阳五行理论,认为疾病是由于人体气血失调、阴阳失衡导致的。中医治疗方法包括中药、针灸、推拿、拔罐等。 资源内容 本资源大全涵盖了中医的各个方面,包括: 教学资源:中医基础理论、中医诊断方法、中医治疗方法、中药方剂、中医养生保健等。 偏方资源:民间流传的各种中医偏方,用于治疗各种常见疾病。 古籍资源:中医经典古籍,如《黄帝内经》、《伤寒论》、《金匮要略》等。 资源特点 内容全面:涵盖了中医的各个方面,满足不同用户的需求。 分类清晰:资源按照主题分类,方便用户查找。 格式多样:资源包括文本、图片、视频等多种格式,方便用户阅读和学习。 使用指南 可以根据自己的需求选择相应的资源进行学习和使用。 可以收藏自己喜欢的资源,方便以后查阅。 可以将资源分享给朋友,共同学习中医。 课程下载 隐藏内容,请前往内页查看详情 希望中医资源大全能够帮助大家学习中医
-
Aurora 4.6.2🔥第三方谷歌商店,无需谷歌框架 软件描述 Aurora Store是谷歌Play Store的一个非官方FOSS客户端,通常称为‘极光商店’,设计优雅。Aurora Store不仅可以下载、更新和搜索Play Store等应用程序,还为用户提供了新功能。应用提供范围广泛的游戏和应用程序,包括音乐流媒体、购物、书籍和漫画、电影、模拟器、定制等等。对于那些关心隐私的人,Aurora商店不需要谷歌的专有框架来操作。无论有没有Google Play Service或MicroG,它都能很好地工作。使用此应用程序,您可以下载和安装所有应用程序和游戏的apk文件,而无需 MicroG 或 Google Play 服务,从而避免谷歌间谍软件(跟踪)的麻烦。最终,用户能够绕过谷歌的追踪,让他们更好地控制他们共享的数据。注意自备科学工具。 软件截图 Aurora Store图片 软件下载 隐藏内容,请前往内页查看详情
-
Typecho 统一账号认证登录插件 序言 统一用户中心是一个集中管理用户身份信息、提供统一认证服务的系统。它通过整合不同应用系统的用户信息,实现单点登录、会话保持、单点退出等功能,从而节省了开发的周期。 登录界面图片 登录界面 扫码登录图片 扫码登录 验证码登录图片 验证码登录 找回密码图片 找回密码 用户中心图片 用户中心 登录授权图片 登录授权 支持性 支持密码登录 支持短信验证码登录 支持邮箱验证码登录 支持通行密钥PassKey登录 支持微信扫码登录 支持n个三方快捷登录 (具体支持需自己的探索) 支持密码登录2FA双因素安全认证 支持用户中心操作安全认证 使用方法 首先需要去 https://id.gumengya.com 注册一个账号 控制台图片 点击左侧导航栏 应用管理 创建一个应用 添加应用图片 其中回调地址填写为https://域名/id/callback 例如:https://blog.gumengya.com/id/callback 下载地址 隐藏内容,请前往内页查看详情 然后 下载之后把插件丢到 plugins 目录 目录名改成 GmSSO 随后登录后台开启插件并配置插件信息 插件配置图片 填写好Client ID 与 Client Secret 这个两个数据可在添加的应用看见复制粘贴进去保存即可 最后: <?php echo GmSSO_Plugin::login(); //获取登录链接 ?>以上代码可以输出一段授权的链接 可在网站任意地方写一个登录的按钮 奖用户引导到授权链接即可 系统基于Oauth2开发开放应用,可以按照所需自己开发对接其它网站等系统 OAuth 文档 ApiFox在线测试 1.认证接口 GET https://id.gumengya.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&state={state} 参数名描述类型数据类型client_id注册的客户端 IDquerystringredirect_uri授权后回调的urlquerystringstate随机字符串,用于防止跨站点请求伪造攻击querystring2.重定向 如果用户接受你的授权,会重定向回您的网站,携带code参数以及你在上一步中在参数中提供的状态state。如果状态不匹配,则说明是第三方创建了请求,需要中止该过程。 GET {redirect_uri}?code={code}&state={state} 3.获取授权access_token POST https://account.gumengya.com/api/oauth/access_token 参数名描述类型数据类型code授权码poststringclient_id注册的客户端 IDpoststringclient_secret注册的客户端密钥poststring响应 { "access_token ": "access_token ", "expires_in ": 7776000, "refresh_token ": "refresh_token ", }4使用访问令牌访问用户信息API POST https://account.gumengya.com/api/oauth/info 参数名描述类型数据类型access_tokenaccess_tokenpoststring5刷新access_token POST https://account.gumengya.com/api/oauth/refresh_token 参数名描述类型数据类型refresh_tokenrefresh_tokenpoststring
-
Windows11 中使用 Windows10 的文件资源管理器!速度立马起飞 前言 Windows 11 的文件资源管理器功能确实强大,新版加入了选项卡、现代化UI、预览窗格等元素,功能丰富了不少。但有不少用户反映,新功能虽然增加了便捷性,却拖慢了整体运行速度。相比之下,Windows 10 版本的文件资源管理器因为其简洁快速,仍然受到很多人的青睐,尤其是经典的 Ribbon 界面更是让人怀念。 好消息是,我们完全可以通过简单的注册表编辑,永久恢复 Windows 10 的文件资源管理器界面!这一调整适用于所有版本的 Windows 11,包括最新发布的 24H2 版。让你瞬间回到熟悉、流畅的操作体验,感兴趣的话,可以试试这个方法! 图片 操作步骤 1.在 Windows 11 中恢复旧文件资源管理器 首先打开记事本并粘贴以下文本代码: Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Classes\CLSID\{2aa9162e-c906-4dd9-ad0b-3d24a8eef5a0}] @="CLSID_ItemsViewAdapter" [HKEY_CURRENT_USER\Software\Classes\CLSID\{2aa9162e-c906-4dd9-ad0b-3d24a8eef5a0}\InProcServer32] @="C:\\Windows\\System32\\Windows.UI.FileExplorer.dll_" "ThreadingModel"="Apartment" [HKEY_CURRENT_USER\Software\Classes\CLSID\{6480100b-5a83-4d1e-9f69-8ae5a88e9a33}] @="File Explorer Xaml Island View Adapter" [HKEY_CURRENT_USER\Software\Classes\CLSID\{6480100b-5a83-4d1e-9f69-8ae5a88e9a33}\InProcServer32] @="C:\\Windows\\System32\\Windows.UI.FileExplorer.dll_" "ThreadingModel"="Apartment" [HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Toolbar\ShellBrowser] "ITBar7Layout"=hex:13,00,00,00,00,00,00,00,00,00,00,00,20,00,00,00,10,00,01,00,\ 00,00,00,00,01,00,00,00,01,07,00,00,5e,01,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00现在,你只需单击 文件 > 保存,然后在“保存类型”下拉菜单中选择 所有文件。给文件命名时随便取个你喜欢的名字,但记得在结尾添加 .reg,比如命名为 “file.reg”。 保存后,双击打开这个新创建的文件,确认应用注册表中的更改,接着重启电脑,你就会发现已经回到 Windows 10 的资源管理器界面了! 老实说,这样做能减少不少错误,性能也会更好。 如果你之后想关闭 Windows 10 的文件资源管理器,切换回 Windows 11,也很简单。再次打开记事本,把下面的文本粘贴进去,保存同样的 .reg 文件,双击执行即可。 Windows Registry Editor Version 5.00 [-HKEY_CURRENT_USER\Software\Classes\CLSID\{2aa9162e-c906-4dd9-ad0b-3d24a8eef5a0}] [-HKEY_CURRENT_USER\Software\Classes\CLSID\{6480100b-5a83-4d1e-9f69-8ae5a88e9a33}]单击文件 > 保存,选择所有项目并以 .reg 扩展名保存文件。打开文件,确认注册表中的更改并重新启动计算机。Windows 11 中的标准文件资源管理器就会恢复回来。
-
JavaScript代码的简洁之道 1、条件判断赋值布尔值 不推荐: if (a === 'a') { b = true; } else { b = false; }推荐: b = a === 'a';通过直接将条件判断的结果赋值给变量,可以简化代码,提高可读性。 2、使用三元运算符 不推荐: if (a > b) { c = a; } else { c = b; }推荐: c = a > b ? a : b;三元运算符是处理简单条件赋值的一种更简洁的方式。 3、合并重复的代码块 不推荐: function processValue(value) { if (value > 10) { console.log('Value is greater than 10'); // 其他操作 } else { console.log('Value is 10 or less'); // 其他操作 } // 重复的代码块 performAdditionalOperations(); }推荐: function processValue(value) { console.log(value > 10 ? 'Value is greater than 10' : 'Value is 10 or less'); performAdditionalOperations(); }将重复的代码块提取到条件判断之外,可以减少不必要的重复,提高代码的可读性。 4、使用数组方法代替循环 不推荐: let sum = 0; for (let i = 0; i < numbers.length; i++) { sum += numbers[i]; }推荐: let sum = numbers.reduce((acc, num) => acc + num, 0);使用数组的内置方法(如 reduce 、map 、filter 等)可以简化代码,同时提高性能,因为这些方法通常被高度优化。 5、使用模板字符串 不推荐: let greeting = 'Hello, ' + name + '!';推荐: let greeting = `Hello, ${name}!`;模板字符串(使用反引号 ` )允许嵌入变量和表达式,使字符串拼接更加简洁和直观。 6、避免不必要的全局变量 不推荐: let counter = 0; function incrementCounter() { counter++; }推荐: function createCounter() { let counter = 0; return { increment: function() { counter++; }, getValue: function() { return counter; } }; } let counterInstance = createCounter(); counterInstance.increment();通过模块或闭包来封装变量,可以避免全局命名空间的污染,提高代码的封装性和可维护性。 7、使用解构赋值 不推荐: let data = { name: 'Alice', age: 25 }; let name = data.name; let age = data.age;推荐: let { name, age } = data;解构赋值可以方便地提取对象中的属性,使代码更加简洁。 8、提前终止循环 不推荐: for (let i = 0; i < array.length; i++) { if (array[i] === target) { found = true; break; } }推荐: let found = array.includes(target);如果不需要在循环中执行其他操作,直接使用数组的内置方法(如 includes )可以提前终止搜索,提高性能。 9、使用箭头函数 不推荐: function add(a, b) { return a + b; }推荐: const add = (a, b) => a + b;箭头函数不仅语法简洁,还能避免 this 绑定的问题,使代码更加清晰。 10、避免使用 with 语句 不推荐: with (obj) { console.log(name); console.log(age); }推荐: console.log(obj.name); console.log(obj.age);with 语句会使代码难以优化,并可能导致性能问题,因此应避免使用。 11、使用 let 和 const 代替 var 不推荐: var count = 0;推荐: let count = 0; // 对于需要重新赋值的变量 const MAX_COUNT = 100; // 对于不需要重新赋值的常量let 和 const 提供了块级作用域(block scope),避免了 var 带来的函数级作用域(function scope)问题,使得代码更加清晰和可预测。 12、避免内联样式和脚本 不推荐: <div style="color: red;">This is red text</div> <script> console.log('Inline script'); </script>推荐: <link rel="stylesheet" href="styles.css"> <script src="script.js"></script>在HTML中,尽量将样式和脚本分离到外部文件,这有助于代码的组织和维护,同时也可能提高加载性能。 13、使用对象字面量进行属性赋值 不推荐: let obj = new Object(); obj.name = 'Alice'; obj.age = 25;推荐: let obj = { name: 'Alice', age: 25 };对象字面量语法更加简洁,易于阅读。 14、使用短路逻辑 不推荐: if (condition1) { doSomething(); } else if (!condition1 && condition2) { doSomethingElse(); }推荐: if (condition1) { doSomething(); } else if (condition2) { // 这里的!condition1已经被短路逻辑隐含 doSomethingElse(); }在第二个条件中,由于 else if 已经隐含了 !condition1 ,因此可以省略这部分判断,提高代码的可读性。不过,要注意这种优化仅在逻辑上确实可行时才进行。 15、避免不必要的计算 不推荐: for (let i = 0; i < array.length; i++) { // 每次循环都计算array.length console.log(array[i]); }推荐: for (let i = 0, len = array.length; i < len; i++) { console.log(array[i]); }将数组长度存储在一个变量中,避免在每次循环迭代时都重新计算它,这可以提高性能,尤其是在处理大型数组时。 16、使用 Object.assign 进行浅拷贝 不推荐: let newObj = {}; for (let key in oldObj) { if (oldObj.hasOwnProperty(key)) { newObj[key] = oldObj[key]; } }推荐: let newObj = Object.assign({}, oldObj);Object.assign 提供了一种更简洁和高效的方法来创建对象的浅拷贝。 17、使用默认参数和剩余参数 不推荐: function add(a, b) { b = b || 0; return a + b; } function sum() { let args = Array.prototype.slice.call(arguments); return args.reduce((acc, num) => acc + num, 0); }推荐: function add(a, b = 0) { return a + b; } function sum(...args) { return args.reduce((acc, num) => acc + num, 0); }默认参数和剩余参数是ES6中引入的语法糖,它们使得函数定义更加清晰和灵活。 18、避免魔法数字 不推荐: function calculateDiscount(price, discountRate) { return price * (1 - discountRate / 100); } // 调用时 let finalPrice = calculateDiscount(100, 20);推荐: const DISCOUNT_RATE_PERCENTAGE = 100; function calculateDiscount(price, discountRate) { return price * (1 - discountRate / DISCOUNT_RATE_PERCENTAGE); } // 或者使用命名参数 function calculateDiscount(price, discountPercentage) { return price * (1 - discountPercentage / DISCOUNT_RATE_PERCENTAGE); } // 调用时 let finalPrice = calculateDiscount(100, 20);通过定义常量或使用命名参数,可以避免在代码中使用难以理解的魔法数字,提高代码的可读性。 这些优化技巧可以帮助你编写出更加简洁、高效和可维护的JavaScript代码。记住,优化是一个持续的过程,随着你对语言和框架的深入理解,你会找到更多适合自己的优化方法。 我们继续深入讨论JavaScript代码优化的其他策略和最佳实践。 19、使用模板字符串 不推荐: let greeting = 'Hello, ' + name + '!';推荐: let greeting = `Hello, ${name}!`;模板字符串(Template Literals)允许你嵌入变量和表达式,使字符串拼接更加直观和易读。 20、使用解构赋值 不推荐: function getPersonInfo() { return { firstName: 'John', lastName: 'Doe' }; } let info = getPersonInfo(); let firstName = info.firstName; let lastName = info.lastName;推荐: function getPersonInfo() { return { firstName: 'John', lastName: 'Doe' }; } let { firstName, lastName } = getPersonInfo();解构赋值(Destructuring Assignment)允许你从数组或对象中提取数据,并将其赋值给不同的变量,使代码更加简洁。 21、使用箭头函数 不推荐: function add(a, b) { return a + b; } let numbers = [1, 2, 3]; let doubled = numbers.map(function(number) { return number * 2; });推荐: const add = (a, b) => a + b; let numbers = [1, 2, 3]; let doubled = numbers.map(number => number * 2);箭头函数(Arrow Functions)提供了更简洁的函数定义方式,并且没有自己的 this 绑定,这有助于避免在回调函数中常见的 this 问题。 22、使用 Promise 和 async/await 处理异步代码 不推荐: function fetchData(url, callback) { // 假设这里有一个异步的fetch操作 setTimeout(() => { callback(null, 'data'); }, 1000); } fetchData('some-url', function(err, data) { if (err) { console.error(err); } else { console.log(data); } });推荐: function fetchData(url) { return new Promise((resolve, reject) => { // 假设这里有一个异步的fetch操作 setTimeout(() => { resolve('data'); }, 1000); }); } // 使用Promise fetchData('some-url').then(data => { console.log(data); }).catch(err => { console.error(err); }); // 或者使用async/await async function getData() { try { let data = await fetchData('some-url'); console.log(data); } catch (err) { console.error(err); } } getData();Promise 和 async/await 提供了更优雅和强大的方式来处理异步代码,避免了回调地狱(Callback Hell)的问题。 23、使用 try...catch 进行错误处理 不推荐: if (someCondition) { // 可能会抛出错误的代码 } else { console.error('An error occurred'); }推荐: try { // 可能会抛出错误的代码 } catch (error) { console.error('An error occurred:', error); }try...catch 语句允许你捕获并处理在代码执行过程中抛出的错误,从而避免程序崩溃并提供更好的用户体验。 24、使用 Map 和 Set 不推荐: let obj = {}; let keys = ['a', 'b', 'c']; keys.forEach(key => { obj[key] = true; });推荐: let set = new Set(['a', 'b', 'c']);Map 和 Set 是ES6中引入的新的数据结构,它们提供了比传统对象更强大和灵活的功能,例如保持插入顺序和检测元素是否存在的时间复杂度更低。 25、避免全局变量污染 不推荐: let globalVar = 'This is a global variable';推荐: (function() { let localVar = 'This is a local variable'; // 你的代码逻辑 })();或者使用 let 和 const 在块级作用域内定义变量,以及使用模块系统(如ES6模块或CommonJS模块)来封装代码。 我们可继续探讨JavaScript代码优化的其他高级策略和最佳实践。以下是一些额外的建议: 26、使用 WeakMap 和 WeakSet WeakMap 和 WeakSet 是ES6中引入的两种新的集合类型,它们的主要特点是“弱引用”。这意味着它们不会阻止垃圾回收器回收其键(或成员)所引用的对象。这对于存储大量临时数据而不担心内存泄漏的情况非常有用。 示例: let obj = {}; let weakMap = new WeakMap(); weakMap.set(obj, 'some value'); // 当没有其他引用指向 `obj` 时,它可以被垃圾回收器回收27、使用 Symbol 类型 Symbol 是ES6中引入的一种新的原始数据类型,它表示唯一的标识符。使用 Symbol 可以避免属性名的冲突,并且可以作为对象的唯一键。 示例: let sym = Symbol('description'); let obj = {}; obj[sym] = 'value'; console.log(obj[sym]); // 输出: value28、优化循环 减少循环内的计算:将可以在循环外部计算的表达式移到外部。 使用 for...of 代替 for...in:当遍历数组时,for...of 通常比 for...in 更快,因为 for...in 还会遍历数组原型链上的属性。 使用 Array.prototype.every 、Array.prototype.some 、Array.prototype.find 等数组方法:这些方法提供了更简洁的语法,并且在某些情况下可能比传统的 for 循环更高效。 29、避免内存泄漏 清理定时器:确保在组件或页面销毁时清理所有的定时器(如 setInterval 和 setTimeout )。 取消事件监听:在不再需要时取消事件监听器。 避免全局变量:全局变量会一直存在于内存中,直到页面被关闭。尽量使用局部变量或模块作用域变量。 30、使用现代JavaScript框架和库的最佳实践 React: 使用纯函数组件和React Hooks来简化状态管理。 避免不必要的重新渲染,通过使用 React.memo 、useCallback 和 useMemo 等优化技术。 优化数据获取,使用React Query或Apollo Client等库来管理异步数据。 Vue: 使用计算属性和侦听器来优化响应式数据的处理。 避免在模板中进行复杂的计算,而是将它们放在计算属性或方法中。 使用Vuex或Pinia等状态管理库来管理全局状态。