推荐文章
热门文章
公告展示
最新发布
-
码支付:Thinkphp 框架个人不能支付新势力,个人收款开源革命 亲测可以使用感兴趣的同学可以下载研究下, 收款还是比较麻烦的线上,可以使用这个系统解决,实现个人码支付 支持个人微信赞赏码,微信支付二维码 还支付对接收钱吧的二维码 码支付[mPay]以其轻巧身姿,为个人收款领域带来一场开源革命。这不仅仅是一款工具,它是你步入便捷收款新纪元的钥匙。基于新款Thinkphp框架开发,[mPay]源码现已开放,为你的个人收款需求提供强大支持, 源码已经打包放在下面,可以自行获取 图片 图片 个人收款,从未如此简单 [mPay],一款专为个人免签收款设计的神器,通过普通收款码即可实现收款通知自动回调,无缝对接绝大多数商城系统。目前,[mPay]仅提供个人版,开源且免费使用,是你个人财务自由的得力助手。 源自源支付,超越源支付 [mPay]在源支付的设计思路上进行了革新,采用第四方聚合收款码,确保收款的稳定性与便捷性。个人申请聚合收款码无需资质,无需API接口,选择众多实力雄厚的收银服务平台(如拉卡拉、收钱吧等),让你的收款无后顾之忧。 特点突出,收款无忧 免监听 :告别挂机监听,[mPay]通过设置定时任务即可实现支付回调。 多环境支持 :全面支持微信、支付宝、云闪付的H5环境,长按识别扫码支付,域名防红。 稳定安全 :个人搭建的收款系统,收款稳定,安全可控,无需支付额外手续费。 多平台支持 :支持多平台(聚合码服务商)、多账号(聚合码商户)、多渠道(门店码/店员码/桌号码等),有效降低异地线上收款风控风险。 内置插件,即装即用 微信插件wxpay :默认安装,支持赞赏码、个人码|经营码|商家码,提供两个通道,需挂机监听。 支付宝插件alipay :默认安装,支持收钱码、经营码,两个通道,需挂机监听。 收钱吧聚合码插件sqbpay :默认安装,无需挂机,设置定时任务即可。 技术架构,前沿高效 [mPay]采用Thinkphp8框架,推荐PHP版本8.2,前端UI采用Layui 2.9+PearAdmin后台,为你提供一个既前沿又高效的技术架构。 码支付[mPay],不仅是技术的突破,更是个人收款自由的象征。现在就来体验[mPay],开启你的个人收款新篇章 功能 收款还是比较麻烦的线上,可以使用这个系统解决,实现个人码支付 支持个人微信赞赏码,微信支付二维码 还支付对接收钱吧的二维码 码支付[mPay]以其轻巧身姿,为个人收款领域带来一场开源革命。这不仅仅是一款工具,它是你步入便捷收款新纪元的钥匙。基于新款Thinkphp框架开发,[mPay]源码现已开放,为你的个人收款需求提供强大支持, 源码下载 隐藏内容,请前往内页查看详情
-
讲讲怎么规避脏东西的干扰 这几天帮人许愿,发现好几位的心愿都是远离鬼魅精怪呀,附体之类的脏东西。 这其实很简单,我讲一个实修层面的技术,不需要基础,人人都能做到。 我还是主张,多建设,少破坏,多给祖师爷添产业。可以掀桌,不能砸锅。 掀桌是为了平等吃饭,砸锅就都没饭吃了。 一句话概括重点,一个人会被脏东西干扰是因为不能正眼瞧它们。 最近几个月因为抽旱烟杆,装填清洗非常麻烦,就干脆设置在我卫生间的洗手台前。于是我每天抽烟的时候都必然会照镜子。 恰好最近在参我们净明道玉真祖师真诀中照心的问题。 我发现我看着镜子中的自己是不会起情绪的。 这是正常状态,大部分人看镜子中的自己或者自己的照片都不会起情绪。心态良好,一个人看自己的至亲,结婚多年的伴侣也不会起情绪,就像看自己一样。 俗话说中年夫妻手牵手,就像左手牵右手。指的就是这种情况。关系正常的,中年夫妻就应该把对方看得像自己一样。对方的手自然也就像自己的手一样。 有修为的人。这个范围可以继续扩大,看更多的人,甚至看所有人都像看自己一样不起情绪。 比如老师看所有的学生。王道偶像看所有的粉丝。神职人员看所有的信众。追求的目标和理想状态都是看所有人都一样。 反之不理想的状态就是会用情绪看别人,而不是像看自己一样看别人。 面对一个人,大概率或多或少会有一种情绪,喜欢,厌恶,尊重,鄙夷,谄媚,欺侮。 这都是用情绪看人。也就是不正眼看人。 我们再延伸到玄学领域。长期住庙的道友都知道,信众面对于神像,什么状态都有。有心生欢喜,控制不住笑出声的。有嚎啕大哭的。有恐惧害怕浑身发抖的。 有满地打滚的。有骂骂咧咧的。 这些都是最生动的例子,他们在拿情绪看神。 正常情况或者是住庙时间长的道友。天天看,看习惯了,自然心态平和,像看自己一样看神像,这就是正眼看神。 欢喜也不是什么好事,有欢喜必有厌恶,这是一体两面。 对脏东西也是一样。只不过受到困扰的人一定会用负面情绪看待脏东西,或者恐惧或者厌恶。如果遇到这脏东西,心生喜悦,那就不是困扰了。 吸引脏东西,给脏东西可乘之机的不是人,而是负面情绪。解决问题的根源是让自己正眼看脏东西,他们就没有可乘之机,你对他们也没有吸引力了。 把逻辑往前倒。凡是有这种困扰或者自己很容易招脏东西的人。你照照镜子试试,对着镜子里的自己看几分钟,内观其心,看自己对自己起不起情绪。 这样的人往往对自己都有一大堆情绪。而且是负面情绪,看自己不顺眼,看自己一大堆毛病。痛恨自己为什么不长这样,为什么不是那样?对自己恨铁不成钢。厌恶自己。厌恶自己与生俱来的很多属性。 看自己都带情绪的人,怎么可能不带情绪看别人。怎么可能不带情绪看神仙祖师。不带情绪看脏东西。 正道神仙属阳,脏东西属阴。正面情绪属阳,负面情绪属阴。阳这个抽象概念的本体就是太阳,阴这个抽象概念的本体就是月亮。 太阳是个等离子体,在古代没有这些概念,只能管它叫炁体。月亮就是个石头疙瘩。假设一个人无限接近太阳,他一定会在某一个距离气化,然后等离子化,然后他就会成为太阳的一部分,其中一部分光可能会照到地球上,那就是烧这个人产生的光。 但如果一个人无限接近月亮,那最后他会砸在月亮上,他不会成为月亮的一部分,只会成为月亮上的垃圾。 这就是阴阳的区别,所以亲近阳属性的人和事物会获取能量,而且对对方没有影响。一个人烤火和十个人烤火对于篝火来说是一样的。 亲近阴属性的人和事物,最后结果就是硬碰硬,谁弱谁受伤。 对于普通的人而言,最理想的状态是站在太阳和月亮中间,然后面朝太阳。 这是个比喻。 对于受到脏东西困扰的人,很多野生心理学家和灵修体系,会跟他强调,爱与光明之类的,甚至说多晒太阳。也是这个路子。 最简单最直接的方法就是从情绪下手,多照镜子,先把自己看顺眼。再把自己身边的至亲看顺眼。如果一个人能正眼看自己不起情绪,正眼看家人至亲伴侣不起情绪。就足够不受脏东西的困扰了。 只要看的时间长,刻意训练不起情绪,都能看顺眼的。对着镜子多找找自己的长处,多找找自己和大多数人一样的地方。 绝大多数人的禀赋都是相近的,都是普通人,各方面都是各有长短。 说相声的都跟郭德纲比,那早晚得气死。找到自己的艺术风格也可以说得很开心。 人都是这样。不要总想着斩妖除魔,请符做法护身,自己心态好一点,脏东西接近你的性价比低到一定程度,自然就会远离。这就是中医的思维方式,也是大道的思维方式。 这些年我发现一个有意思的规律,有很多直接或间接的关系,说好和我见面的,后来由于种种变故,而没有和我见面。过一段时间,大多能听说他被各式各样的脏东西困扰,或者给身边的人带来困扰。其实不是他不愿见我,而是脏东西结合负面情绪共同作用,生出变故来避免见我。 发展才是硬道理,烦请转发给需要的人吧。谢谢大家。
-
提升 PHP 代码质量:命名参数的最佳实践与示例 还在为PHP函数中繁多的参数和它们代表的含义而烦恼吗?还在费力数逗号以确保参数顺序正确吗?PHP 8.0 的命名参数将帮你解决这些问题!本指南将带你了解命名参数的概念、使用方法以及如何利用它们提升代码质量。 图片 什么是命名参数? 命名参数允许你通过指定参数名称,而不是依赖参数顺序,来向函数传递值。就像给每个参数都贴上了标签,代码因此更易读、更不易出错,避免了参数含义混淆不清的情况。 新旧方法对比 让我们来看一个电商应用中的实际例子,假设你正在构建一个创建新产品的功能: function createProduct( string $name, float $price, string $category, bool $inStock = true, int $quantity = 0, array $tags = [], string $description = '' ) { // 产品创建逻辑 } // 旧方法(位置参数) createProduct( '游戏鼠标', 49.99, '电子产品', true, 100, ['游戏', '配件'], '带 RGB 照明的高性能游戏鼠标' );如果不去查看函数定义,很难一眼看出上面代码中每个参数值的含义。现在,让我们看看命名参数是如何提高代码清晰度的: // 新方法(命名参数) createProduct( name: '游戏鼠标', price: 49.99, category: '电子产品', quantity: 100, tags: ['游戏', '配件'], description: '带 RGB 照明的高性能游戏鼠标' );命名参数的好处 提高代码可读性 命名参数本身就是一种代码文档。任何阅读代码的人都能立刻理解每个值的含义,无需再去查看函数定义。 跳过可选参数 使用命名参数,你可以跳过那些不需要设置的可选参数。 示例如下: function sendEmail( string $to, string $subject, string $body, ?string $replyTo = null, bool $isHtml = true, int $priority = 3 ) { // 电子邮件发送逻辑 } // 仅设置您需要的参数 sendEmail( to: 'customer@example.com', subject: 'Order Confirmation', body: $emailContent, priority: 1 // 跳过 replyTo和isHtml,使用其默认值 );参数顺序不再重要 使用命名参数时,参数的顺序不再重要。这种灵活性让代码维护更加轻松: // These are equivalent: sendEmail( body: $emailContent, subject: '订单确认', to: 'customer@example.com' ); sendEmail( to: 'customer@example.com', subject: '订单确认', body: $emailContent );混合使用命名参数和位置参数 你可以混合使用命名参数和位置参数,但需要注意:一旦开始使用命名参数,其后的所有参数也都必须使用命名参数: function createUser( string $username, string $email, string $password, bool $isAdmin = false, ?string $department = null ) { // 用户创建逻辑 } // Valid - positional arguments first, then named createUser( 'johnsmith', // username (位置) 'john@example.com', // email (位置) password: 'secure123', // 命名参数从这里开始 department: 'Sales' // 命名 );最佳实践 为了提高代码清晰度,当函数参数较多,或者参数的用途不容易从值本身判断时,请使用命名参数。 布尔值参数尤其适合使用命名参数,因为true或false本身并不能清晰地表达其含义。 // 不清楚 createUser('john', 'john@example.com', 'password123', true); // 更清楚 createUser( username: 'john', email: 'john@example.com', password: 'password123', isAdmin: true ); 保持一致性:如果在函数调用中使用命名参数,建议为所有参数命名以保持一致,除非开头几个参数的含义在上下文中非常清晰。 清晰的参数命名:由于参数名称现在是函数公共接口的一部分,请务必选择清晰且具有描述性的名称。 常见陷阱 避免在使用命名参数后混合使用位置参数:一旦开始使用命名参数,其后的所有参数也都必须使用命名参数。 // 将导致错误 createUser(username: 'john', 'john@example.com', password: 'secret'); // 正确 createUser(username: 'john', email: 'john@example.com', password: 'secret'); 注意参数名称的修改:重构代码时,如果修改了参数名称,那么使用旧参数名称的命名参数调用将会失效。请记住,参数名称现在是公共 API 的一部分。 结论 命名参数是 PHP 的一项强大功能,它能够显著提升代码的可读性、可维护性和正确性。当函数拥有多个可选参数,或者参数的含义不容易从值本身判断时,命名参数将尤为有用。 在你的 PHP 8+ 项目中积极采用命名参数,尤其是在它能够提升代码清晰度的地方。未来的你(以及你的同事)都会感激你写出了更具自解释性和可维护性的代码。 记住:优秀的代码不仅仅是能够正常工作,更要清晰易懂且易于维护。命名参数正是你编写高质量 PHP 代码的利器之一。
-
PHP自建MD5解密平台 使用 PHP 构建 MD5 彩虹表生成器的完整过程 在信息安全领域,彩虹表(Rainbow Table) 是一种通过预计算哈希值和对应原始值的方式来破解密码的工具。为了实现一个简单高效的 MD5 彩虹表生成器,我使用了 PHP 和 MySQL,本文将详细介绍整个实现过程,并深入探讨如何解决开发中遇到的问题。 项目背景和需求 在项目的初始阶段,我们需要一个自动化生成 MD5 彩虹表的工具,并将生成的数据存储在 MySQL 数据库中。主要功能包括: 批量生成 MD5 哈希和对应的原始字符串 去重处理,避免重复存储相同的 MD5 哈希 可扩展性,支持任意字符集和字符串长度。 高效插入数据,避免性能瓶颈。 然而,在实现的过程中遇到了两个关键问题: 每次刷新页面时,因没有去重导致重复数据大量生成。 设置批量生成的目标条数(如 10,000 条),但数据量却无法稳定在目标值。 接下来,我们将详细拆解整个解决方案和代码实现。 环境准备 确保开发环境的搭建,包括: PHP 7.x或更高版本 MySQL 5.x或更高版本 Apache或Nginx服务器 数据库设计 在生成彩虹表之前,我们需要设计存储数据的数据库表。 数据表结构 表名为 rainbow_table,包含以下字段: id: 自增主键,用于标识每条记录。s hash: 存储 MD5 哈希值。 original: 存储原始字符串。 unique_hash: 创建唯一约束,确保哈希值不重复。 SQL 表的创建代码如下: CREATE TABLE rainbow_table ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, hash VARCHAR(32) NOT NULL, original VARCHAR(255) NOT NULL, UNIQUE KEY unique_hash (hash) );如果表不存在,我们会在 PHP 脚本中动态创建它,确保代码的鲁棒性。 PHP 脚本实现 核心逻辑概述 字符集配置:可以自由定义生成字符串所使用的字符集,包括大小写字母、数字和特殊符号。 随机生成字符串:通过随机组合字符,生成指定长度的字符串。 MD5 哈希计算:将随机字符串计算为 MD5 哈希值。 数据插入与去重:使用 INSERT IGNORE 避免重复插入。 批量生成与页面自动刷新:每次生成一定数量的数据后自动刷新页面,持续生成。 完整 PHP 代码如下: <?php $servername = "localhost"; $username = "md5"; $password = "123456"; $dbname = "md5"; $tableName = "rainbow_table"; // 创建数据库连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检查连接是否成功 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 检查表是否存在,如果不存在则创建 $tableExists = $conn->query("SHOW TABLES LIKE '$tableName'")->num_rows > 0; if (!$tableExists) { $createTableSql = "CREATE TABLE $tableName ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, hash VARCHAR(32) NOT NULL, original VARCHAR(255) NOT NULL, UNIQUE KEY unique_hash (hash) )"; if ($conn->query($createTableSql) === TRUE) { echo "表 $tableName 创建成功<br>"; } else { die("创建表错误: " . $conn->error); } } // 彩虹表生成函数 function generateRainbowTable($charset, $batchSize, $conn, $tableName) { $charsetLength = strlen($charset); $count = 0; $maxLength = 18; // 设置随机字符串最大长度 while ($count < $batchSize) { // 随机生成字符串长度 $length = rand(1, $maxLength); $count += generateRandomCombination($charset, $length, $charsetLength, $conn, $batchSize - $count, $tableName); } echo "生成了 $count 条记录\n"; } function generateRandomCombination($charset, $length, $charsetLength, $conn, $remaining, $tableName) { if ($remaining <= 0) return 0; $currentString = ''; for ($i = 0; $i < $length; $i++) { $currentString .= $charset[rand(0, $charsetLength - 1)]; } $hash = md5($currentString); // 使用 INSERT IGNORE 避免重复插入 $stmt = $conn->prepare("INSERT IGNORE INTO $tableName (hash, original) VALUES (?, ?)"); $stmt->bind_param("ss", $hash, $currentString); $stmt->execute(); return $stmt->affected_rows > 0 ? 1 : 0; } // 配置 $charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.@#*?!$%^&()-_=+[]{}|;:,.<>~'; // 定义字符集 $batchSize = 2000; // 每次生成 2000 条 generateRainbowTable($charset, $batchSize, $conn, $tableName); $conn->close(); ?>关键点解析 1. 随机生成字符串 $length = rand(1, $maxLength); $currentString .= $charset[rand(0, $charsetLength - 1)];使用 rand() 随机生成字符串长度,再通过字符集随机组合字符,生成目标字符串。 2. 避免重复插入 $stmt = $conn->prepare("INSERT IGNORE INTO $tableName (hash, original) VALUES (?, ?)");使用 INSERT IGNORE 确保插入数据时,遇到重复哈希值会自动跳过,避免浪费资源。 3. 批量生成与计数 $count += generateRandomCombination($charset, $length, $charsetLength, $conn, $batchSize - $count, $tableName);每次生成一定数量的数据,直到达到目标批量数量。 前端自动刷新页面 为了实现自动化生成,我们在前端页面使用 JavaScript 设置定时刷新,每次刷新生成一批数据: <script> // 页面加载完成后自动刷新 window.onload = function() { setTimeout(function() { location.reload(); }, 1000); // 1秒后刷新页面 }; </script>通过这种方式,可以在页面刷新时持续调用生成函数,直到数据库存储满足预期需求。 问题与优化方案 问题 1:重复数据导致效率低下 最初代码未去重,每次刷新生成的大量数据包含重复项,浪费了存储和计算资源。通过添加 INSERT IGNORE 和数据库唯一索引,解决了此问题。 问题 2:生成数据量不足 由于生成逻辑中可能因重复数据导致插入失败,数据总量无法达到目标条数。通过调整随机生成逻辑,确保生成字符串更加分散,提高了数据覆盖率。 结论 本文通过详细介绍一个 PHP 实现的 MD5 彩虹表生成器,展示了从数据库设计到代码优化的完整流程。通过随机生成字符串、去重插入以及前端自动刷新机制,实现了高效的批量生成工具。 该工具不仅适用于 MD5,还可拓展为其他哈希算法生成器(如 SHA-1 或 SHA-256)。未来可进一步优化数据生成算法,提高生成速度和覆盖范围。 最后我的MD5解密平台:隐藏内容,请前往内页查看详情 图片 项目地址 隐藏内容,请前往内页查看详情
-
解决 Windows 宝塔面板报错 KeyError: ‘list’ Windows 宝塔面板 7.7.0 以上版本报错 KeyError: 'list' 是因为 7.7.0 以上的版本不再支持 Windows 家庭版的使用,并且根据我当时修复报错文件 panelPlugin.py 时发现 7.7.0 以上的版本时没有这个文件的,只有被编译好的不能反编译的 panelPlugin.pyd 文件,也就是说 Windows 宝塔 7.7.0 以上版本不再是开源面板,而宝塔官方给出的解决方案是安装 Windows 服务器版本虚拟机,但是这样不仅麻烦而且会占用电脑的性能,目前根据我在网上搜集到的信息结合自己的摸索总结出两个解决方案 图片 方案一 先使用 Shell 命令对宝塔面板进行降级到 7.7.0 版本 隐藏内容,请前往内页查看详情 降级到 7.7.0 版本后可以再使用 Shell 命令对宝塔面板升级到 8.1.0 版本,而后将不再会提示报错内容 隐藏内容,请前往内页查看详情 当然也可以只使用 7.7.0 版本 方案二 手动对宝塔面板进行降级到 7.7.0 版本,将文件 panel_7.7.0.zip 解压到宝塔安装目录的 panel 目录下 官方下载链接:隐藏内容,请前往内页查看详情 我自己备份的包:隐藏内容,请前往内页查看详情 然后再手动下载 8.1.0 版本的 panel_8.1.0.zip 文件解压到宝塔安装目录的 panel 目录下 官方下载链接:隐藏内容,请前往内页查看详情 我自己备份的包:隐藏内容,请前往内页查看详情
-
堡塔云监控 V2.3.0 开心版 花几分钟就能开始监控你的服务器安全性、一键扫描服务器集群病毒、漏洞、挖矿木马。 作为堡垒机批量管理你的服务器SSH终端、面板,操作录像回放,方便审计。 24小时监控,实时发送告警(支持飞书、钉钉、企业微信、邮件)帮助运维人员快速定位故障。 图片 简述: 云安全监控系统由云安全监控主控端与被监控端组成。 云安全监控主控端用于管理被监控端,查看、接收被监控端的数据,告警通知。 简称:主控 被监控端安装在被监控的服务器上采集数据。 简称:被控 云安全监控系统基本架构图: 图片 具体详细介绍请看官方帖子:https://techape.oss-cn-hangzhou.aliyuncs.combt.cn/bbs/thread-97800-1-1.html 安装云监控主控端 全新安装-云监控主控端执行以下命令安装云监控主控端开心版 隐藏内容,请前往内页查看详情 已安裝 – 官方雲監控主控端 執行以下命令 升級官方雲監控主控端(已安裝官方版升級爲開心版) 隐藏内容,请前往内页查看详情
-
HeyForm – 开源表单系统 可自托管 HeyForm 是一个开源的表单系统,可以用来收集调查、问卷、用户提交的数据等,比如在发现频道经常有开发者需要收集用户邮箱,使用回帖会对其他用户造成干扰,而使用表单就非常方便。 图片 这类工具还有腾讯文档的收集表功能,最终效果也是差不多的。只不过 HeyForm 可以自托管、支持逻辑跳转、可以添加变量、隐藏字段等,以及页面更加漂亮。非常适合高级用户及开发者。 HeyForm 能够通过 HeyForm 收集的数据非常多: 图片 你可以在后台通过拖拽,设置非常复杂的表单: 图片 你可以设置隐藏字段,变量,以及为每一个问题设置规则,比如设置一个评分规则,当分值大于5时,给另外一个变量「好评」加一,这样就能快速得到获得最多好评的数据。 另外这里也可以设置满足条件后直接跳转到另外一个问题。 图片 当然 HeyForm 的另外一个优势,就是自带的样式已经很漂亮了: 图片 所以,还是开头那句话,非常适合高级用户及开发者。不然很多平替,何必折腾。 获取 隐藏内容,请前往内页查看详情
-
一个兼容 OneBot 协议的非官方 QQ 客户端实现,支持网页及 electron 客户端 Stapxs-QQ-Lite-2.0 一个兼容 OneBot 协议的非官方 QQ 客户端实现,支持网页及 electron 客户端Github地址:隐藏内容,请前往内页查看详情 在线体验:隐藏内容,请前往内页查看详情 图片 ✨ 特性支持 ✅ 使用 Vue.js 全家桶开发,快乐前后端分离 🎨 自适应布局,竖版也能使用 🖥️ 支持 PWA(都有 Electron 了(小声)) 🌚 Light/Dark Mode 自动切换 🍱 该有的都有(虽然比不过官方端) 复杂消息显示、转发、回复、撤回 群文件、群公告、群设置(一小部分)、精华消息 图片、收藏表情、文件发送 📦️ 支持多种 bot,我就是要用! 🔥 水深火热但是更好看的 Electron 客户端 🥚 彩蛋!来更多的彩蛋! 🛠 更多特性开发中 💬 提醒和问题 > 关于不安全连接 当使用 https 页面连接 ws 服务(反之相同)的情况下,连接将会失败;这是由于其中某一者是不安全的。在这种情况下,你可以选择将 ws 提升为 wss 或者将 https 降级为 http(不安全)来解决问题,此处不提供解决方案。>> Stapxs-QQ-Lite#32 > 我能使用其他 QQ Http Bot 吗 如果它兼容 OneBot 11 协议, 你可以尝试连接它, 但是由于消息体格式和接口扩展的差异,大部分情况下都不能完全正常使用。 已经兼容的 Bot 都写在了文档里,可以去 这里 查看。 > 使用 Bot 是否有风险 如果你使用的是 oicq-http, 可以查看此处了解 如果你尝试使用其他 QQ Bot (参见上一条问题), 请自行参考它的文档。 使用风险:https://github.com/takayama-lily/oicq/wiki/98.%E5%85%B3%E4%BA%8E%E8%B4%A6%E5%8F%B7%E5%86%BB%E7%BB%93%E5%92%8C%E9%A3%8E%E6%8E%A7
-
不要过度使用 console.log 啦!我们有更好的调试方式! Hello,大家好,我是 Sunday。 在日常的工作中,我经常会帮同学【远程调试代码】。在远程时,我发现 很多同学会大量使用 console.log 进行打印调试。打印的数量之多,让同学自己都摸不清哪个打印对应哪个内容了😂。 毫无疑问,console.log 是一个很好的调试方式。但是 如果我们滥用它,效果反而会适得其反!大量打印信息堆积如山,反倒使得我们难以理清各条输出的对应逻辑! 因此,我们可以寻找可好的调试方案,来解决 console.log 过多而导致的混乱问题。 console 不止 log 没错!console 不止 log ,console 对象内部提供了很多的方法。在之前的文章中,我们提到过这一点:调试只会console.log?来看一看这 6 种惊艳的调试技巧! 使用更多的 console 方法配合可以帮助我们大幅提升调试的效率。 1. 使用 console.dir() 打印对象 console.dir() 是一个专门打印 对象 的 API。 console.dir() 方法可以显示指定 JavaScript 对象的属性列表,并以交互式的形式展现。输出结果呈现为分层列表,包含展开/折叠的三角形图标,可用于查看子对象的内容。因此,当我们打印对象时,可以使用 dir 代替 log 2. 使用 console.table() 打印数组 如果想要打印数组的话,那么 table() 是首选方法: const users = [ { id: 1, name: '张三', age: 25 }, { id: 2, name: '李四', age: 30 }, { id: 3, name: '王五', age: 35 }, ]; console.table(users);一句话:贼清晰! 图片 3. 使用 console.clear() 清理控制台 这个 API 可以帮我们解决控制台打印过多的问题。 如果我们要开启一轮新的调试,那么可以在开始前执行 console.clear(),清空之前的控制台打印。 这样,可以帮我们更加专注的针对本次的调试,而不需要被之前的打印信息所误导! 4. 使用 console.group() 控制打印组 这在 嵌套函数、递归 中非常有用,配合 console.groupEnd() 可以帮助我们完成分组打印。 比如下面的场景: function factorial(n) { console.group(`方法开始,长度(${n})`); if (n <= 1) { console.log("执行 1"); console.groupEnd(); return 1; } else { let result = n * factorial(n - 1); console.log(`执行 ${result}`); console.groupEnd(); return result; } } factorial(3);最终,打印结果如下: 图片 5. 使用 console.time() 完成计时 console.time() 配合 console.timeEnd() 经常用来处理 计时操作。 比如,我们想要测试一个函数的执行耗时,那么就可以通过这种方式完成: function processLargeData() { console.time("time"); // 模拟耗时操作 for (let i = 0; i < 1000000; i++) { Math.sqrt(i); } console.timeEnd("time"); } processLargeData();计时结果如下: 图片