当前位置: 首页 > news >正文

【鸿蒙心迹】7×24小时极限求生:当Origin_null遇上鸿蒙,我如何用100杯咖啡换一条跨域活路?

文章概要
大家好,我是那个把黑眼圈熬成华为工牌挂绳的倒霉蛋。过去100个夜晚,我在HarmonyOS NEXT的ArkWeb里被Origin:null反复按在地上摩擦——小程序白屏、OPTIONS 400、官方文档沉默三连击。最终,我用C++、libcurl、OpenSSL和一堆速溶咖啡,硬是在API12的深坑里凿出一条代理隧道。本文是我用头发换来的避坑实录:从DevEco Studio崩溃到证书闪退,从Nginx临时补丁到C++终极方案,一条都不藏私。读完它,你至少能少掉50根头发,多睡10个好觉。

图片

凌晨 2:17,我正讨论“为什么鸿蒙的动画比 iOS 还丝滑”,手机突然像被电击一样狂震——“所有小程序白屏了!”
那一刻,我差点把咖啡泼在测试机上。产品同学的声音带着哭腔:“用户一打开就空白,vConsole 干净得像刚出厂。”我心里咯噔一下:这不是普通 Bug,这是灾难级 P0

我冲进公司,发现同事们已经排成一排,像瞻仰遗容一样盯着屏幕。小程序容器里,页面骨架正常渲染,但接口请求像被黑洞吸走——axios 全军覆没,$.ajax 却活蹦乱跳。我当场懵圈:难道 axios 偷偷给自己加了「鸿蒙不兼容」buff?

图片

更魔幻的是,vConsole 居然一条报错都没有!我一度怀疑是不是测试机中了「前端沉默咒」。直到我祭出 ArkWeb 的 onConsole 钩子,才终于抓到真凶:

图片

Access to XMLHttpRequest at 'xxx' from origin 'null' has been blocked by CORS policy

看到 origin 'null' 那一刻,我血压直接飙到 180——跨域!又是跨域! 但等等,我们本地资源加载,Origin 怎么会是 null?
原来鸿蒙的 ArkWeb 默认把本地文件协议的 Origin 设成了 null,而我们的服务端宁死不接受 null,只认 file://
这一刻,我悟了:不是 axios 背叛了我,是 Origin:null 在背后捅刀!

图片

02 官方沉默:文档、工单、群聊的三重暴击

“凌晨三点,我盯着屏幕,感觉 Origin:null 像个幽灵,而官方文档、工单、群聊,成了三座沉默的墓碑。”


翻遍API12文档,setAllowUniversalAccessFromFileURLs依旧缺席

关键词:缺席文档黑洞希望落空

  1. 官方文档的“薛定谔状态”

    • 打开 HarmonyOS NEXT ArkWeb 指南,搜索 “CORS” → 0 条结果。
    • 再搜 “setAllowUniversalAccessFromFileURLs” → 直接 404。
    • 翻到 WebConfig 类,发现 Android WebView 的 setAllowUniversalAccessFromFileURLs 方法直接失踪
  2. 开发者的“考古现场”

    • 鸿蒙开发者论坛 挖坟到 2023 年的帖子,有人提问:“ArkWeb 如何允许 file 协议访问 http 资源?”
    • 官方回复:“当前版本不支持,建议后续关注。”
    • 后续是哪一版?没人知道,但我的头发知道——它先秃了
  3. 替代方案的“鬼打墙”

    • 尝试用 onInterceptRequest 拦截请求,结果只能读到 URL,POST 的 body 直接蒸发
    • 想用 @ohos.net.http 发请求绕过,但 ArkWeb 的 iframe 里无法调用系统 API

图片


工单回复模板:重启-清缓存-换电脑

关键词:模板化玄学三连时间黑洞

工单回合官方回复我的血压
第1回合“请确认 DevEco Studio 已升级至最新版。”120/80
第2回合“尝试清除缓存并重启 IDE。”140/90
第3回合“建议换一台测试机复现。”180/120
第4回合“问题已转交研发,请耐心等待。”直接爆表

彩蛋:有开发者贴出客服内部话术截图,发现 “重启-清缓存-换电脑” 是标准 SOP,跨域问题直接归类为 “用户环境问题”


图片

### 时间红线:6月上线,等不起下一个版本

关键词:deadline版本列车背水一战

  1. 倒计时的压迫感

    • 产品发布会定在 6 月 20 日,跨域问题必须在 5 月 31 日前解决
    • 官方路线图显示,API13 的 CORS 支持要到 Q3——直接错过上线。
  2. 老板的“灵魂拷问”

    “要么你解决,要么我换人。”——产品经理的原话。

  3. 开发者的“绝地求生”

    • 方案A:等官方更新 →
    • 方案B:自己写代理 → 头发-50,进度+1%
    • 方案C:降级用 API11 → 闪退+1,测试机变砖

结论:当官方沉默时,代码不会说谎,但人会秃头


下集预告
既然官方靠不住,那就 用 Nginx 和 Tomcat 打 10 分钟补丁——但 Origin:null 的隐患,真的只是权宜之计吗?

图片

03 临时止血:Nginx与Tomcat的10分钟救援

“凌晨 3:15,老板一句‘先跑起来再说’,比冰美式还提神。”
Origin:null 还在 ArkWeb 里蹦迪,我们只能先给演示环境打一针肾上腺素——让它活过今晚,再谈诗和远方


Nginx 204预检补丁:先让演示活下来

症状速记

  • ArkWeb 发起 OPTIONS 预检 → Nginx 405 → 前端白屏。
  • 产品经理眼神空洞:“客户 10 分钟后到,页面还是白板?”

速效处方:30 秒复制粘贴
/etc/nginx/conf.d/harmony_911.conf 里加三行魔法:

server {listen 80;location / {# 预检请求直接发糖if ($request_method = 'OPTIONS') {add_header 'Access-Control-Allow-Origin'   'null';add_header 'Access-Control-Allow-Methods'  'GET, POST, OPTIONS';add_header 'Access-Control-Allow-Headers'  'Authorization, Content-Type';return 204;  # 空包速回,浏览器闭嘴}proxy_pass http://backend;}
}

三步验证

  1. curl -I -X OPTIONS -H "Origin: null"204 No Content
  2. 真机扫码 → 小程序不再白屏 ✅
  3. 产品经理笑容回归 → 今晚不用通宵 ✅

图片

⚠️ 副作用:
一旦运维重启 Nginx,这行配置就可能被“顺手”删掉——记得写进部署脚本


Tomcat CORSFilter兜底:Java后端的倔强

场景:网关不归你管,Nginx 改不动?那就让 Tomcat 自己扛。
操作WEB-INF/web.xml 里 30 秒改完:

<filter><filter-name>CorsFilter</filter-name><filter-class>org.apache.catalina.filters.CorsFilter</filter-class><init-param><param-name>cors.allowed.origins</param-name><param-value>null</param-value>   <!-- 演示专用,线上请换成精确域名 --></init-param><init-param><param-name>cors.allowed.methods</param-name><param-value>GET,POST,OPTIONS</param-value></init-param><init-param><param-name>cors.allowed.headers</param-name><param-value>Content-Type,Authorization</param-value></init-param>
</filter>
<filter-mapping><filter-name>CorsFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

重启 Tomcat

./bin/shutdown.sh && ./bin/startup.sh

效果OPTIONS 200,前端 axios 不再报错,后端日志里终于不再出现 CORS policy: No 'Access-Control-Allow-Origin' header

小插曲:
如果你们的网关是 Spring Cloud Gateway,记得在 Gateway 层也加 CORS,否则 Tomcat 的 Filter 会被网关截胡,白忙活。


图片

Origin:null的安全隐患:为什么只是权宜之计

“null 不是‘空’,而是‘匿名’。”
——安全部同事路过时翻了个白眼,我假装没看见。

风险清单

场景潜在攻击后果
恶意本地 HTML直接调用你的 API数据泄露、CSRF
浏览器插件注入绕过同源策略用户隐私裸奔
企业内网钓鱼内网 API 被外网调用内网沦陷

公司安全规范三连击

  1. 禁止生产环境接受 null
  2. 禁止 * 通配符带 Cookie
  3. 必须校验 Access-Control-Allow-Credentials

一句话总结

Nginx 204 + Tomcat CORSFilter = 急诊室止血带,能救命,但不能当长期绷带
真正治愈,还得靠下一章的 C++ 代理隧道


彩蛋:演示结束当晚,我把 Nginx 配置回滚,顺手把 harmony_911.conf 重命名为 harmony_911_dont_touch.conf,并在注释里写下:
# 谁再敢开这个配置,就准备背锅到明年。

图片

04 ArkTS拦截器幻灭:onInterceptRequest的只读陷阱

“我以为拦截器是瑞士军刀,结果它只是把塑料叉子。”——凌晨3:42,我对着白屏骂骂咧咧。


WebResourceRequest拿不到body的绝望

故事开场

在 DevEco Studio 的 ArkTS 世界里,onInterceptRequest 看起来就像超级英雄——官方文档说它“可以拦截任何请求”。于是我兴冲冲地写下:

Web({...}).onInterceptRequest((event) => {const req = event.request;console.info("抓到请求:", req.getUrl());// 下一步:把 Origin:null 改成 file://return null;   // 先放它过去
});
现实打脸
  • req.getRequestHeader() 返回的是 只读数组,改完值再打印,Origin 还是 null
  • 想读 POST body?WebResourceRequest 压根没提供 getBody() 之类的方法。
  • 官方文档友情提示:“拦截器只能替换响应,不能修改请求头与 body”——等于直接判了死刑。

那一刻,我深刻体会到什么叫“看得见的坑,绕不过的坎”。


API12 C++示例只读本地文件?我要发网络!

走投无路,投奔 C++

官方给的示例代码长这样:

OH_ArkWeb_SetSchemeHandler("http", "ec-scheme-handler", handler);
// 在回调里……
std::ifstream in("local.html");   // 只读本地文件?

我当场裂开:我要发网络请求,你却让我读文件?

官方没说的事

翻遍文档,确认 C++ 层确实能:

  1. 拿到完整 URL、Method、Headers(包括自定义头)。
  2. 通过 OH_ArkWebResourceRequest_GetHttpBodyStream 把 POST body 读出来。
  3. 用自定义网络库(libcurl/httplib)重新发请求,再把结果喂回 ArkWeb。

官方示例只是“演示如何返回本地文件”,真正的玩法是“代理整个请求生命周期”——但文档里半个字都没提。


团队顾虑:升级API12会不会引发连环闪退

会议现场

当我把“升级 API12”的提案丢进群里,瞬间被 99+ 消息淹没:

担忧现实暴击
IDE 崩溃API12 的 DevEco Studio 必须同步升级,旧插件全军覆没。
真机闪退import 动态加载语法变了,一行代码没改直接黑屏。
回归测试爆炸动画引擎底层实现更新,UI 自动化脚本集体扑街。
为了说服老板,我做了三件事
  1. 连夜跑 Monkey:在 API12 真机上狂点 2 小时,统计 Crash 率 < 0.1%。
  2. 出一份风险清单:把已知兼容性问题全部列成表格,附解决方案。
  3. 立军令状:两周内搞不定,我自掏腰包请全组奶茶。

最终,老板拍了板:“升!出问题算我的。”
而我,默默把奶茶预算改成了咖啡——毕竟,后面还有 OpenSSL 的坑等着我跳。

图片

05 C++深坑:从libcurl编译失败到httplib单头救场

“凌晨 4:27,DevEco Studio 第 7 次蓝屏,我盯着 libcurl 的 2000 行报错,突然理解了什么叫‘代码即佛经’——每一个 unresolved symbol 都是对我灵魂的拷问。”


升级地狱:API11→API12的闪退连环坑

本来只想改一行配置,结果把整栋楼的地基都掀了。

  1. 一键升级按钮的甜蜜陷阱
    DevEco 的 Upgrade Assistant 会告诉你:“放心点,我帮你自动改。”
    实际上它只改了 oh-package.json5 里的版本号,真正的 Native 部分——CMakeLists.txtlibcurl.alibc++.so 全被放生。

  2. 闪退三连击现场还原

    • 第一次闪退libcurl.so__aarch64_ldadd4_acq_rel 未定义 → NDK 21 与 API12 的 原子操作符号 不兼容。
    • 第二次闪退libc++.so 版本冲突 → 系统自带 .so 与打包 .so 打架,Logcat 里全是 SIGABRT
    • 第三次闪退ArkWeb 白屏 → 因为 libcurl 初始化失败,导致 SchemeHandler 注册超时,渲染线程直接罢工。
  3. 逃生指南

    # 降级 NDK 到 20b(鸿蒙官方暗搓搓的推荐版本)
    ohpm config set @ohos/hvigor-ndk 20.1.5948944
    # 手动对齐 .so
    objdump -p libcurl.a | grep NEEDED   # 看它还想要谁
    

libcurl交叉编译崩溃,httplib单文件逆袭

当交叉编译开始报“undefined reference to __aarch64_ldadd4_acq_rel”,你就知道今晚又不用睡了。

优点在鸿蒙的结局
libcurl功能全、文档多NDK 找不到 openssl 3.0,编译产物闪退
Boost.Asio异步狂魔编译 30 分钟,链接 2 小时,最终体积 +5MB
Poco全家桶CMakeLists 写到怀疑人生
httplib只有一个 .h5 分钟集成,真香
  1. libcurl 的死亡三连

    # 1. 官方 NDK 找不到 openssl
    cmake .. -DOPENSSL_ROOT_DIR=/nonexistent/path
    # 2. 强行编译 1.1.1 版本
    ./Configure linux-aarch64 --prefix=/tmp/ssl
    # 3. 运行闪退:SSL_get1_peer_certificate 符号缺失
    

    结论:libcurl 卒

  2. httplib 单头文件救场

    • 把 httplib.h 拖进 cpp/ 目录。
    • 一行宏解决 https 校验:
      #define CPPHTTPLIB_OPENSSL_SUPPORT
      cli.enable_server_certificate_verification(false); // 羞耻但有效
      
    • 编译通过,运行不闪退,世界瞬间清净。

OpenSSL 1.1.1证书校验闪退:关闭校验的羞耻但有效方案

“生产环境关掉证书校验?别骂了,在改了。”——我面对安全同学时的卑微。

  1. 鸿蒙 NDK 的 OpenSSL 版本锁死 1.1.1
    想用 3.0?自己编!
    ./Configure 出来的 so 放到工程里直接 SIGILL 非法指令
    原因:NDK 的交叉工具链 ≠ 系统 cmake,必须用华为提供的

    ~/Huawei/Sdk/HarmonyOS-NEXT-DB1/base/native/build-tools/cmake/bin/cmake
    
  2. 关闭校验的羞耻补丁

    httplib::Client cli("https://api.xxx.com");
    cli.enable_server_certificate_verification(false); // 就是这一行
    

    风险:中间人攻击、老板骂街、用户数据裸奔。
    缓解:

    • 只对特定域名关闭校验;
    • 把服务器证书硬编码进 App,用 `SSL_CTX_use_certificate

图片

06 终极代理:拦截、转发、回包全链路打通

“当官方 API 不给力,我们就自己造一条暗网隧道。”——凌晨 4:27,第 97 杯美式下肚后的顿悟


OH_ArkWeb_SetSchemeHandler注册http/https/options

一句话总结:把 ArkWeb 的“默认网络栈”踢掉,换成我们自己写的 C++ 代理。

  1. 入口函数

    // native/cpp/web_scheme_handler.cpp
    void RegisterCustomSchemes() {// 注意:必须在主线程调用,且早于任何 Web 组件实例化OH_ArkWeb_SetSchemeHandler("http",  new HttpSchemeHandler());OH_ArkWeb_SetSchemeHandler("https", new HttpSchemeHandler());OH_ArkWeb_SetSchemeHandler("options", new HttpSchemeHandler()); // 预检也一起劫持
    }
    
  2. Handler 骨架

    class HttpSchemeHandler : public ArkWebSchemeHandler {
    public:void OnRequestStart(const std::shared_ptr<ArkWebRequest>& req) override {auto* raw = new RawRequest(req);   // 后面细讲生命周期raw->StartAsync();                 // 非阻塞}
    };
    
  3. ArkTS 侧零改动

    // 前端代码不用改一行,继续 axios.post(...) 就行
    

RawRequest生命周期管理:内存泄漏大逃杀

“C++ 不释放内存,就像熬夜不洗脸——早晚烂脸。”

阶段动作防坑要点
创建new RawRequest立即塞进 std::atomic<int> alive_count_,方便调试
网络libcurl/httplib 异步std::enable_shared_from_this 延长生命
回包OH_ArkWeb_SendResponse回调里再 delete this,确保最后一次引用后自杀
异常curl 超时/断网SetTimeout(15s) + OnError 统一 delete

内存泄漏检查脚本

# 在 hdc shell 里跑
watch -n1 "cat /proc/$(pidof com.example.app)/status | grep VmRSS"

如果 RSS 每 30s 涨 1 MB,就说明你忘了 delete


POST body分片读取:Callback地狱与线程安全

“body 太大一次读不完?那就边读边转发,像快递小哥拆箱。”

  1. ArkWeb 提供的读接口

    req->GetBody([](const uint8_t* chunk, size_t len, bool is_last) {// ⚠️ 回调在 IO 线程,不能直接操作 UIg_async_queue.Push({chunk, len, is_last});
    });
    
  2. 生产者-消费者模型

    std::mutex mtx_;
    std::condition_variable cv_;
    std::queue<Chunk> queue_;void WorkerThread() {while (true) {Chunk c;{std::unique_lock lock(mtx_);cv_.wait(lock, []{ return !queue_.empty(); });c = queue_.front(); queue_.pop();}curl_easy_setopt(curl_, CURLOPT_POSTFIELDS, c.data);curl_easy_setopt(curl_, CURLOPT_POSTFIELDSIZE, c.len);if (c.is_last) curl_easy_perform(curl_);}
    }
    
  3. 线程安全小贴士

    • ArkWeb 回调里只做 memcpy,绝不阻塞
    • std::atomic<bool> done_ 通知主线程可以 SendResponse

手动注入Access-Control-Allow-Origin:*的快感与风险

“加星号就像打肾上腺素,见效快,副作用也大。”

  1. 在回包阶段注入

    void OnResponseHeaders(ArkWebResponse* resp) {resp->AddHeader("Access-Control-Allow-Origin", "*");resp->AddHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS");resp->AddHeader("Access-Control-Allow-Headers", "Content-Type,Authorization");
    }
    
  2. 风险与兜底

    • 风险* 会让任何网页都能调你的接口,内测阶段可忍,上线必改
    • 兜底:维护一份 allow_list,只给可信域放行
      static const std::unordered_set<std::string> kSafeOrigins = {"https://app.example

07 熬夜生存指南:如何优雅地为鸿蒙加班

“凌晨 3 点 27 分,DevEco Studio 第 7 次闪退,我盯着屏幕里那句 BUILD FAILED 突然悟了:原来鸿蒙不是操作系统,是修行。”
——来自一位刚写完第 100 条工单备注的秃头选手


防猝死三连:IDE崩溃自动备份 / 测试机定时重启 / 客服话术模板

环节工具/脚本一句话口诀备注
IDE 崩溃自动备份File → Settings → Appearance & Behavior → System Settings → Autosave 打开 每 1 秒保存 + 本地 Git 每 10 分钟 git stash“Ctrl+S 救不了命,脚本才能。”搭配 inotifywait 做增量备份,闪退后 30 秒内恢复现场。
测试机定时重启crontab -e 加一行:
0 4 * * * hdc shell reboot
“每天 4 点让它重启,比女朋友还准时。”真机/模拟器通杀,避免内存泄漏把日志撑爆。
客服话术模板收藏夹常备三段:
1. “已按文档步骤操作,日志见附件。”
2. “复现路径 100%,设备型号、系统版本已标注。”
3. “如仍需补充信息,请明确具体字段,避免往返 48h。”
“把客服逼成复读机,你就赢了。”实测可把平均响应时间从 3 天压到 8 小时。

彩蛋脚本:把下面这段扔进 ~/.bashrc,一键进入“修仙模式”

alias hm='echo "$(date): 鸿蒙修仙第$(expr $(date +%j) - 173)天" >> ~/hm.log'

每次打开终端自动打卡,月底统计修仙时长。


图片

08 反思:跨域之外,鸿蒙生态的AB面

“当你把 Origin:null 按在地上摩擦到凌晨四点,才发现自己其实站在一座还在打地基的摩天楼顶上——风大,楼晃,没护栏。”


纯血鸿蒙的代价:兼容性、文档、社区的三重撕裂

兼容性:旧代码的坟场,新代码的雷区
维度官方 PPT凌晨 4 点的真实现场
API 升级“平滑过渡”API11 → API12,Web 容器把 Origin:null 写死,闪退率 +300%
设备适配“一次开发,多端部署”同一段 ArkTS,Mate60 白屏,Pura70 秒开,Nova 直接重启
回退通道“随时回滚”入口藏在“设置 → 关于手机 → 版本号连点 7 次 → 输入暗号”,堪比《头号玩家》彩蛋

血泪提示:
“平滑” 是官方用词,“平滑摔” 才是体感。

文档:写得像诗,读得像悬疑小说
  • 搜索体验
    输入 setAllowUniversalAccessFromFileURLs,返回 0 条;输入“跨域”,返回 17 条“敬请期待”。
  • 示例代码的量子态
    复制粘贴能跑,改一行就崩——后来发现示例偷偷用了内部 API,正式 SDK 根本没导出。
  • 工单模板三连击
    1. 重启 DevEco Studio
    2. 清缓存并 Invalidate Caches
    3. 换一台电脑试试
      如果都不行——恭喜你,成功解锁隐藏成就:“成为文档维护者”
社区:白天寂静如坟场,凌晨 4 点蹦迪
  • 微信群里的幽灵大佬
    ID 叫“HarmonyOS_内核扫地僧”,只在 03:17–03:42 出现,发一张截图又消失。
  • 官方论坛的激励金
    60 亿听起来像把北京二环买下来,实际到账率≈买彩票中 50 块——还得先写 2000 字测评。
  • 撕裂现场
    • A 群:“鸿蒙是国产之光!”
    • B 群:“求求你们先修修文档吧!”
      两群互踢,场面一度比跨域还跨。

分布式能力的诱惑与陷阱:2025 年值得 All in 吗?

诱惑陷阱防坑提示
一次开发,多端部署多端指手机、手表、电视,但不包括你老板的 iPad先在最低配手表上跑通,再谈“多端”
超级终端拖拽流转流转到一半对方设备锁屏,数据直接蒸发做好断点续传,否则用户会把你拖进“黑名单流转”
AI 加持的意图框架意图识别把“打车”识别成“打开发者”保留人工兜底按钮,防止 AI 把用户送去缅甸

小结:
分布式能力像 5G——没它也能活,有它更烧钱
2025 年如果你家产品没有“多设备协同”故事,融资 PPT 都凑不够 10 页;但真要做到丝滑,团队规模至少翻三倍。

http://www.dtcms.com/a/340800.html

相关文章:

  • IDM 下载失败排查全攻略
  • HT6881:重塑便携式音频体验的高效能功率放大器
  • 【运维进阶】Linux 正则表达式
  • 怎么确定mysql 链接成功了呢?
  • Electron开发的核心功能要点总结,旨在帮助快速掌握Electron开发核心逻辑
  • 淘宝电商大数据采集【采集内容||采集方法|工具||合规性||应用】
  • 【爬虫实战-IP代理的重要性一】 以urllib和request为例
  • 【React】评论案例列表渲染和删除功能
  • 【工具使用-Docker容器】构建自己的镜像和容器
  • GO环境变量中GO111MODULE到底是干啥的?
  • ES常用查询命令
  • HTML应用指南:利用POST请求获取全国刘文祥麻辣烫门店位置信息
  • 无人机图传 便携式5G单兵图传 HDMI图传设备 多卡5G单兵图传设备详解
  • 极其简单二叉树遍历JAVA版本
  • PDF如何在Adobe Acrobat 中用OCR光学识别文档并保存可编辑文档
  • 【开源项目】高效入门视觉强化学习,告别零散资料,一个开源项目搞定500+资源
  • Java 15 新特性及具体应用
  • 从导航工具到空间智能体,高德用AI寻找出路
  • 大数据毕业设计选题推荐-基于大数据的1688商品类目关系分析与可视化系统-Hadoop-Spark-数据可视化-BigData
  • ios开发 -- 八股 -- UI视图
  • 51单片机与stm32单片机,先学习哪一个?
  • 牛津大学xDeepMind 自然语言处理(3)
  • 翻译记忆库(TMX)与机器翻译的结合应用
  • 【国内电子数据取证厂商龙信科技】隐私增强技术
  • 论函数指针
  • 深入分析Linux kobject 的工作原理与实现机制
  • 【C语言16天强化训练】从基础入门到进阶:Day 4
  • K8S-Pod资源对象——Pod探针
  • 基于深度学习CenterPoint的3D目标检测部署实战
  • MySQL的简单介绍