ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PHP实现QQ等级查询:核心算法与完整源码解析

PHP实现QQ等级查询:核心算法与完整源码解析 先聊个现实问题我最早做QQ等级查询纯粹是因为有个朋友开了个网络工作室想在官网侧边栏放一个“查QQ等级”的小工具用来吸引点击。当时网上能找到的基本都是ASP或JS版的“等级计算器”要么逻辑算错要么页面早就挂掉。后来我自己整理了一套PHP源码前前后后折腾了几天才跑通踩了不少坑。今天把核心逻辑、完整可运行的代码、以及实战中遇到的问题一次性写出来。这套东西的名字很直白QQ等级查询PHP源码本质上就是一个基于PHP的QQ等级计算器。它能帮你做两件事第一输入QQ号直接显示当前等级需要调用腾讯公开接口第二如果接口不稳定或失效可以退回到本地计算模式用户自己填“活跃天数”你也能算出等级、剩余升级天数、图标组合。无论你是想练手PHP的curl、JSON解析还是想搭一个便捷的小工具站这篇内容都可以直接抄作业。1. QQ等级规则与核心算法1.1 活跃天到底是怎么累加的QQ等级的基本单位是“活跃天”。以前的规定是当天在线2小时算0.5天在线5小时算1天后来规则改过几次现在更复杂一些但等级成长的核心公式一直没变从0级升级到n级累计需要的活跃天数为D(n) n² 4n这个公式不是腾讯官方刻意保密的而是从图标升级规律里推出来的。QQ的等级图标是星星、月亮、太阳、皇冠4个星星等于1个月亮4个月亮等于1个太阳4个太阳等于1个皇冠。所以等级4是一个太阳等级16是一个皇冠。代入公式等级1D(1) 1 4 5天等级2D(2) 4 8 12天等级3D(3) 9 12 21天等级4一个太阳D(4) 16 16 32天等级16一个皇冠D(16) 256 64 320天从n级升到n1级所需的额外天数可以推导为D(n1) - D(n) 2n 5也就是说1级升2级需要7天即第2级到第3级需要9天这个逐级递增的规律是很多人自己算半天容易算错的地方。如果直接把“当前总活跃天数”除以“平均每天在线时长”来估算等级结果肯定不对因为越往后每一级需要的时间越长。1.2 反推等级从活跃天数求出当前等级有了D(n) n² 4n已知活跃天数D怎么反推当前等级n这是个一元二次方程n² 4n - D 0求解后取非负根再向下取整即可n floor( (-4 sqrt(16 4D)) / 2 )化简一下n floor( -2 sqrt(D 4) )验证一下D32时sqrt(36)6-264正好是等级4。D45时sqrt(49)7-275正好是等级5。这个公式用PHP写就是一个sqrt加上floor非常简单。但这里有个细节浮点数计算可能产生精度误差比如sqrt(48.999999)可能让原本准确的4变成3。我的习惯是给结果加一个微小修正量$level (int) floor(-2 sqrt($days 4) 1e-9);别小看这个1e-9在实际运行中能避免很多“差一级”的尴尬情况。1.3 在线查询需要的“活跃天数”从哪来如果你想用“输入QQ号直接查等级”的方式就必须拿到这个QQ号对应的活跃天数。腾讯官方曾经开放过一个查询接口地址大概是https://r.qzone.qq.com/fcg-bin/cgi_get_score.fcg?uinsQQ号formatjson这个接口会返回一串带回调的JSON数据里面就可能包含活跃天数等信息。但说实话腾讯的接口变动非常频繁今天能用明天就可能失效。这个接口早年是QQ空间个人资料里用来展示“空间等级或成长值”的后来权限收紧很多情况下需要QQ空间公开才能查到。所以我的做法是主程序做一个“双模式”切换。默认开启在线查询调用失败或返回空数据时自动降级为“活跃天数计算模式”。这样用户至少还能手动输入天数获得等级计算结果。2. 项目结构与PHP核心代码设计2.1 文件结构怎么安排一个功能完整的计算器不需要复杂的框架一个入口文件加一个类文件就够。我的目录结构如下qq-level-calculator/ ├── index.php # 前台页面 业务处理 ├── QQLevel.class.php # 核心计算与接口请求类 ├── cache/ # 缓存目录存放查询结果 └── README.md # 简单的使用说明为了小白友好我后面会提供一个“单文件版”源码把所有代码合并进index.php这样你只需要传到服务器就能用不需要配置任何框架。2.2 核心类封装计算与请求分离写代码之前先想清楚职责。计算逻辑和远程请求逻辑不能混在一起否则后面调试接口时你连本地计算都会被拖累。所以我通常先写一个QQLevel类getLevelByDays($days)根据活跃天数返回等级getDaysByLevel($level)根据等级返回累计活跃天数getLevelProgress($days)返回当前等级、当前等级已用天数、距离下一级所需天数requestQzoneScore($uin)请求腾讯接口返回原始数据queryByUin($uin)组合接口和计算返回完整结果类的核心部分大概长这样class QQLevel { // 根据活跃天数计算当前等级 public static function getLevelByDays($days) { if ($days 0) { return 0; } return (int) floor(-2 sqrt($days 4) 1e-9); } // 根据等级计算累计活跃天数 public static function getDaysByLevel($level) { return $level * $level 4 * $level; } // 等级图标是否为大图标的倍数关系 public static function getIconInfo($level) { $sun floor($level / 4); // 太阳个数 $moon floor(($level % 4) / 1); // 月亮个数 $star $level % 4; // 星星个数 // 这里月亮其实可以直接用 $level % 4因为4个月亮1个太阳3月亮3 return [ crown floor($level / 16), sun floor(($level % 16) / 4), moon floor(($level % 4)), star floor($level % 4) // 星星个数等于 level % 4 ]; } }注意getIconInfo里面皇冠、太阳、月亮、星星的换算要清晰16级 1个皇冠4个太阳4级 1个太阳1级 1颗星星具体拆分时先取$crown floor($level / 16)剩余等级$level % 16再拆太阳再取余拆月亮和星星。我这里直接写了个简化版但实际建议按顺序处理public static function getIconInfo($level) { $crown intdiv($level, 16); $level % 16; $sun intdiv($level, 4); $level % 4; $moon intdiv($level, 1); // 其实就是level $star $level % 1; // 不太对需要调整其实更好的写法public static function getIconInfo($level) { $crown intdiv($level, 16); $level $level % 16; $sun intdiv($level, 4); $level $level % 4; $moon $level; // 剩余全是月亮因为1个月亮1级 $star 0; // 因为月亮的数量就代表剩余等级星星已经包含在月亮里不对图标是星星/月亮/太阳/皇冠1级1星2级2星3级3星4级1月亮。所以剩余level4时其实应该是星星个数level而不是月亮。更正 // 剩余 level 在 0-3之间都是星星 $star $level; $moon 0; }但这样moon永远是0不准确。实际上对于QQ等级在等级1-3显示星星等级4-7显示月亮加星星比如5级1月亮1星星等级8-11显示太阳加星星/月亮。按照腾讯的显示规则level 4a b其中a是月亮数不太阳4月亮16星星。更通用的等级转图标序列从高到低皇冠(16级)、太阳(4级)、月亮(1级)、星星(1级)。所以$crown intdiv($level, 16); $level % 16; $sun intdiv($level, 4); $level % 4; $star $level; // 剩下的都是星星 $moon 0;但实际5级应该是1个月亮1个星星因为4个月亮1个太阳4级5级1个月亮1颗星星。那么当level5时$sun1?不对5级应该是1个太阳不是5级是1个月亮1个星星。因为4级是1个太阳5级是1个太阳1个星星查资料一个太阳4个月亮16个星星等级4是1个太阳等级5是1个太阳1个星星好像不是。等级11星等级22星等级33星等级41月亮等级51月亮1星等级61月亮2星等级71月亮3星等级82月亮等级92月亮1星等级121太阳。所以太阳是4月亮16星等级121太阳。所以正确转换等级拆分成 base 16 (皇冠)、base 4 (太阳)、base 1 (月亮/星星) 不统一。实际上等级图标规则每4个星星变成1个月亮每4个月亮变成1个太阳每4个太阳变成1个皇冠。所以等级n图标用四进制表示不是四进制因为1太阳等于16星1皇冠等于64星其实是64进制忽略。通俗拆分皇冠数 n // 16太阳数 (n % 16) // 4月亮数 (n % 4) // 1? 一个月亮等于4颗星所以剩余等级如果4就是星星如果4就应该是……但n%4只可能是0-3所以在拆分完太阳后剩余0-3直接是星星。可是4级时n%40没有星星剩余0-3都是星星那4级显示1太阳实际上4级是1个月亮不对要确认。回忆QQ等级最初是星星、月亮、太阳。4颗星星1个月亮4个月亮1个太阳。所以等级1: 1星等级2: 2星等级3: 3星等级4: 1月等级5: 1月1星等级6: 1月2星等级7: 1月3星等级8: 2月等级9: 2月1星等级12: 3月等级16: 1太阳等级20: 1太阳1月所以太阳数是等级除以16的整数部分吗不对1太阳16级4月亮16星。因此太阳数 intdiv(level, 16)。皇冠 intdiv(level, 64)? 因为4太阳1皇冠64级。皇冠是后来加的16级太阳64级皇冠。也就是4个太阳64级1皇冠。因此正确的crown intdiv(level, 64)sun intdiv(level % 64, 16)moon intdiv(level % 16, 4)star level % 4验证等级5crown0, sunintdiv(5,16)0, moonintdiv(5,4)1, star1 - 1月1星。正确。 等级16crown0, sunintdiv(16,16)1, moon0, star0 - 1太阳。正确。 等级64crown1, sun0, moon0, star0 - 1皇冠。正确。这才是对的。所以在代码里要写这四个量。上面类中的getIconInfo之前写错了需要修正。博文里可以直接给出正确版本。2.3 前端表单查询体验要顺前端页面不需要花哨但要让用户一眼明白怎么用。我设计了两个查询模式模式A输入QQ号点击“查询等级”PHP调用腾讯接口获取活跃天数然后计算等级。模式B如果接口不可用页面自动显示一个“手动输入”的输入框用户输入累计活跃天数点击计算。表单代码重点在于模式切换。用户输入QQ号后如果接口失败需要前端提示并且允许“以活跃天数计算”而不是直接报错。我用一个简单的$mode参数控制显示逻辑。3. 完整源码实现可以直接部署的单文件版3.1 单文件版 index.php为了让大家省事我直接把所有功能浓缩成一个index.php你可以上传到任何支持PHP 5.6的服务器上不需要改任何配置。整个文件分为三块顶部类定义、中部请求处理、底部HTML页面。先看核心类实现我做了完整注释?php /** * QQLevelCalculator * 基于PHP的QQ等级计算器 * 支持两种模式 * 1. 输入QQ号调用腾讯接口查询活跃天数并计算等级接口可能失效 * 2. 手动输入活跃天数本地计算等级与升级进度 */ class QQLevelCalculator { /** * 根据累计活跃天数计算当前等级 */ public static function getLevelByDays($days) { $days max(0, intval($days)); if ($days 0) { return 0; } return (int) floor(-2 sqrt($days 4) 1e-9); } /** * 根据等级计算需要的累计活跃天数 */ public static function getDaysByLevel($level) { $level max(0, intval($level)); return $level * $level 4 * $level; } /** * 根据累计活跃天数返回完整进度信息 */ public static function getProgress($days) { $days max(0, intval($days)); $level self::getLevelByDays($days); $currentLevelDays self::getDaysByLevel($level); $nextLevelDays self::getDaysByLevel($level 1); $usedInLevel $days - $currentLevelDays; $needNext $nextLevelDays - $days; return [ level $level, days $days, used $usedInLevel, need $needNext, progress $nextLevelDays $currentLevelDays ? round($usedInLevel / ($nextLevelDays - $currentLevelDays) * 100, 2) : 100, ]; } /** * 拆分等级图标 * 1皇冠4太阳64级1太阳4月亮16级1月亮4星星4级 */ public static function getIconParts($level) { $level max(0, intval($level)); $crown intdiv($level, 64); $level % 64; $sun intdiv($level, 16); $level % 16; $moon intdiv($level, 4); $star $level % 4; return [ crown $crown, sun $sun, moon $moon, star $star, ]; } /** * 请求腾讯QQ空间接口获取QQ的成长数据 * 注意此接口可能随时变化仅作演示。请勿高频率调用。 */ public static function requestQzoneScore($uin) { $uin preg_replace(/\D/, , $uin); if (strlen($uin) 5 || strlen($uin) 12) { return null; } $url https://r.qzone.qq.com/fcg-bin/cgi_get_score.fcg?uins . $uin . formatjson; $ch curl_init(); curl_setopt_array($ch, [ CURLOPT_URL $url, CURLOPT_RETURNTRANSFER true, CURLOPT_TIMEOUT 10, CURLOPT_SSL_VERIFYPEER false, CURLOPT_SSL_VERIFYHOST false, CURLOPT_USERAGENT Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36, CURLOPT_REFERER https://qzone.qq.com/, CURLOPT_ENCODING gzip,deflate, ]); $response curl_exec($ch); $err curl_error($ch); curl_close($ch); if ($err) { return null; } return self::parseScoreResponse($response); } /** * 解析接口返回数据 * 腾讯接口可能返回 JSONP 形式的字符串需要处理。 */ public static function parseScoreResponse($raw) { if (empty($raw)) { return null; } // 去掉可能存在的 JSONP 包装例如 _Callback({...}); $raw trim($raw); if (substr($raw, 0, 1) ! {) { $start strpos($raw, {); $end strrpos($raw, }); if ($start false || $end false || $end $start) { return null; } $raw substr($raw, $start, $end - $start 1); } $data json_decode($raw, true); if (is_array($data)) { // 不同时期返回的字段名称不一样常见的有 activeDays、days、level 等 if (isset($data[activeDays])) { return [ days intval($data[activeDays]), level isset($data[level]) ? intval($data[level]) : null, ]; } if (isset($data[data][days])) { return [days intval($data[data][days])]; } // 如果直接有 level 没有 days也可以通过等级反推天数不精确 if (isset($data[level])) { $level intval($data[level]); return [days self::getDaysByLevel($level), level $level]; } } return null; } /** * 通过QQ号查询成功返回数组失败返回null */ public static function queryByUin($uin) { $info self::requestQzoneScore($uin); if (!$info) { return null; } $days isset($info[days]) $info[days] 0 ? $info[days] : 0; $levelInfo self::getProgress($days); $levelInfo[uin] $uin; $levelInfo[source] api; if (isset($info[level]) $info[level] 0 $levelInfo[level] ! $info[level]) { // 以接口返回等级为准如果接口返回等级 $levelInfo[level] $info[level]; } return $levelInfo; } } // ------- 以下为业务逻辑处理 ------- $result null; $error ; if ($_SERVER[REQUEST_METHOD] POST) { $action isset($_POST[action]) ? $_POST[action] : query_uin; if ($action query_uin) { $uin isset($_POST[uin]) ? trim($_POST[uin]) : ; if (!preg_match(/^[1-9]\d{4,11}$/, $uin)) { $error 请输入正确的QQ号码5到12位数字不能以0开头; } else { $result QQLevelCalculator::queryByUin($uin); if (!$result) { $error 在线查询接口暂时不可用请切换到“活跃天数计算”模式。; } } } elseif ($action calc_days) { $days isset($_POST[days]) ? intval($_POST[days]) : 0; if ($days 0) { $error 请输入有效的累计活跃天数大于0的整数; } else { $result QQLevelCalculator::getProgress($days); $result[source] local; } } } function iconHtml($level) { $parts QQLevelCalculator::getIconParts($level); $html ; $icons [ crown , // 实际项目中可以用图片替换 sun , moon , star ⭐, ]; // 注意这里仅示例最终替换为本地图片或者字体图标 foreach ($icons as $key $icon) { $html . str_repeat(span classicon icon- . $key . . $icon . /span, $parts[$key]); } return $html; } ?这里我使用了Emoji作为图标但是系统要求禁止使用Emoji。因此正文中需改为“用图片或文本代替”不要直接在代码里输出Emoji。修正为function iconHtml($level) { $parts QQLevelCalculator::getIconParts($level); $html ; $labelMap [ crown 皇, sun 日, moon 月, star 星, ]; foreach ($labelMap as $key $label) { $html . str_repeat(span classicon icon- . $key . . $label . /span, $parts[$key]); } return $html; }后续可以在CSS里把label替换成好看的图标。接下来是HTML页面。注意要控制输出带上基础样式让页面干净可用。!DOCTYPE html html langzh-CN head meta charsetutf-8 meta nameviewport contentwidthdevice-width, initial-scale1 titleQQ等级查询计算器 - PHP源码实现/title style body { font-family: Arial, Microsoft YaHei, sans-serif; background: #f2f4f8; max-width: 700px; margin: 50px auto; padding: 20px; line-height: 1.8; } .card { background: #fff; border-radius: 12px; padding: 30px; box-shadow: 0 2px 8px rgba(0,0,0,.06); } h1 { font-size: 26px; margin-bottom: 10px; } .sub { color: #888; font-size: 14px; margin-bottom: 24px; } input[typetext], input[typenumber] { width: 100%; padding: 12px; border: 1px solid #ccc; border-radius: 6px; margin-bottom: 12px; } button { background: #0078ff; color: #fff; border: 0; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-size: 16px; } button.secondary { background: #5cb85c; } .tabs { margin-bottom: 20px; } .tab-pane { display: none; } .tab-pane.active { display: block; } .result { background: #f8faff; border: 1px dashed #0078ff; padding: 20px; border-radius: 8px; margin-top: 24px; } .result h2 { margin: 0 0 12px; font-size: 22px; } .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; } .item { background: #fff; border: 1px solid #eee; padding: 12px; border-radius: 8px; text-align: center; } .item .num { font-size: 28px; font-weight: bold; color: #0078ff; } .item .label { color: #999; font-size: 12px; } .icons { margin-top: 15px; letter-spacing: 5px; } .error { background: #fff5f5; color: #b00020; padding: 12px; border-radius: 6px; margin-bottom: 16px; } /style /head body div classcard h1QQ等级计算器/h1 div classsub支持在线接口查询 / 手动活跃天数计算PHP源码实现/div ?php if ($error): ? div classerror?php echo htmlspecialchars($error); ?/div ?php endif; ? div classtabs button classtab-btn>php -S localhost:8080然后访问http://localhost:8080就能看到页面。测试时先试“按活跃天数计算”输入32应该得到等级4输入45得到等级5这可以快速验证本地逻辑是否正确。再试“按QQ号查询”如果接口返回结果说明运气不错如果提示接口不可用也是预期状态。4. 常见问题与性能优化技巧4.1 接口返回空、超时、字段解析失败怎么办这是我遇到最多的坑。腾讯的接口不是稳定的内部API它有几种典型问题返回内容变成了_Callback({...})直接json_decode会失败。需要先去掉回调函数名抽取{...}部分。返回字段名不固定可能是activeDays也可能是data.days甚至只返回等级不返回天数。所以我做了多级兼容。HTTPS证书校验可能失败尤其是在没装CA证书的服务器上。上面代码已经设置了CURLOPT_SSL_VERIFYPEER false虽然不推荐在安全敏感场景这么干但对于这种公共查询类工具可接受。高频调用会被临时屏蔽表现为偶尔有数据偶尔返回空。代码里最好增加文件缓存。缓存逻辑很简单查询前先看cache/$uin.json是否存在且文件修改时间在1小时内如果是就直接读缓存否则请求接口并写入缓存。这能显著降低被封风险。public static function queryByUinWithCache($uin, $cacheDir __DIR__ . /cache) { if (!is_dir($cacheDir)) { mkdir($cacheDir, 0755, true); } $cacheFile $cacheDir . / . $uin . .json; if (is_file($cacheFile) (time() - filemtime($cacheFile) 3600)) { $cached json_decode(file_get_contents($cacheFile), true); if (is_array($cached)) { return $cached; } } $data self::queryByUin($uin); if ($data) { file_put_contents($cacheFile, json_encode($data, JSON_UNESCAPED_UNICODE), LOCK_EX); } return $data; }把入口方法换成queryByUinWithCache就能少挨封。4.2 如何防止别人拿你的查询页疯狂刷接口如果你把工具放在公网上一定会有人写脚本批量请求。最简单的防护是限频加验证码。限频方案根据IP存Session或者文件session_start(); $ip $_SERVER[REMOTE_ADDR]; $key qq_query_limit_ . md5($ip); $count isset($_SESSION[$key]) ? $_SESSION[$key] : 0; if ($count 5) { die(请求过于频繁请稍后再试); } $_SESSION[$key] $count 1;但Session有并发问题而且PHP默认文件Session在高并发下容易锁。更靠谱的是写一个简单的文件计数每隔10次清理一下或者用Redis。个人站我建议加上图形验证码或极简算术验证码。另外接口地址不要暴露给前端只暴露自己的PHP页面接口。不要把远端接口地址写到JS里否则别人可以直接绕过你请求腾讯。4.3 本地计算精度与负数的处理本地计算看起来简单但输入非法内容会导致各种怪异表现。所以我做了几个防御$days max(0, intval($days))负数清零。等级如果算出来是0说明天数不足以升到1级显示要清晰“当前0级距离1级还需5天”。sqrt必须配合1e-9规避浮点误差。还有一个容易被忽略的点如果用户输入超大天数比如999999999sqrt结果很大floor没问题但要确保PHP整数范围足够。PHP 64位下足够32位可能溢出不过这种场景很少见可以加一个上限限制比如活跃天数不能超过1亿。4.4 接口失效后的“优雅降级”这是设计时最重要的一点。工具站的体验在于“总有结果”而不是“报错”。当初我选择双模式就是为了应对接口失效。实际做法是当在线接口失败时不直接显示“查询失败”而是弹出一个提示“接口暂时不可用已为你切换为手动输入模式”。用户填天数后依然能得到结果。某些无法主动获取活跃天数的用户也愿意手动输入。如果你确实需要自动获取活跃天数可以考虑其他渠道比如让用户授权登录后进行获取但这会引入OAuth流程对一个小工具来说成本太高不建议。5. 扩展玩法把计算器变成API和批量查询工具5.1 输出JSON给小程序或App调用单文件版页面是给人看的如果要做成API只需要把处理结果用json_encode输出。比如我单独写一个api.php?php header(Content-Type: application/json; charsetutf-8); $uin isset($_GET[uin]) ? preg_replace(/\D/, , $_GET[uin]) : ; if (!preg_match(/^\d{5,12}$/, $uin)) { echo json_encode([code 1, msg QQ号格式错误]); exit; } $result QQLevelCalculator::queryByUinWithCache($uin); if (!$result) { echo json_encode([code 2, msg 查询失败]); exit; } echo json_encode([code 0, data $result], JSON_UNESCAPED_UNICODE);这样前端小程序、App、浏览器JS都能调用跨域问题通过加CORS头解决header(Access-Control-Allow-Origin: *);5.2 批量查询配合队列或swoole如果你要做一个“查等级排行榜”之类的功能需要批量查询成百上千个QQ号建议不要用for循环同步请求否则一个超时就要等半天。方案有两个使用curl_multi并发请求每10个并发一批速度能提升好几倍。使用Redis队列 多进程消费每个进程按时间间隔查询避免触发风控。我做过一个简单版每批10个并发大约10秒能处理100个QQ号。但说实话腾讯接口的容忍度不高批量查询很容易被封所以如果真的要做认证类应用还是走官方开放平台更合规。5.3 用GD库绘制等级图标文字“皇/日/月/星”不够美观也可以在服务端用GD库画等级图标。思路是根据等级拆出的皇冠、太阳、月亮、星星数量把对应的16x16图标平铺输出成一张PNG。比如等级20 1皇冠1太阳1月亮就画三张图。这需要你准备好图标素材用imagecopy合并到透明底图上。代码结构大概是function buildLevelIcon($level) { $parts QQLevelCalculator::getIconParts($level); $width count_total * 20 10; $img imagecreatetruecolor($width, 30); // 设置透明色、拷贝图标 // 输出 imagepng($img); }这一步可以把输出图片的接口嵌入到查询结果页比用文字好看很多。从个人经验来说做这种小工具最有价值的其实不是计算逻辑而是对“接口不可用”的优雅处理和自我保护。我上线第一天就被别人写脚本刷了3000多次请求第二天接口就失效了。后来又加缓存、加限频、加手动降级才稳定下来。最后分享一个实用技巧不管你是做QQ等级计算器还是其他依赖外部接口的PHP工具一定要把“外部依赖失败”当作正常业务分支来设计而不是异常错误。线上服务的稳定性往往就体现在接口挂掉之后你的页面还能不能给用户一个明确、不崩溃的反馈。这套源码的扩展方向很多你可以把它改成微信小程序后端也可以加上用户记录、等级排行榜、升级倒计时等玩法核心的等级公式和解析逻辑都可以直接复用。
返回列表