包含关键字 typecho 的文章

本文由TinyPro中后台系统贡献者周泽龙原创。

在长达三个月的开发下,终于TinyPro的Springboot后端版本终于要问世了,在本期内容中我将带大家一步步去搭建整个后端的流程,也将带大家去探索对于最新版本的更改应该如何实现,以及如何使用本项目进行一个二次的开发和探索。
首先我们先要对于TinyPro项目进行一个整体的拉取,去到TinyPro的官方进行拉取,当我们获取到项目以后就可以进行开始今天的项目构建了。

接下来的流程就是对于前端i项目的搭建以及后端的springboot项目的搭建,最后再去介绍咱们新版本里面的一些特性和组件

1.前端部分的搭建

首先要确保咱们安装了Node.js、NPM、TinyCLI接下来就要正式初始化项目了首先我们进行初始化

(1)在命令行输入tiny init pro对项目进行一个初始化具体的流程可以看我的视频介绍

1.jpg
(2)接下来就让我们进入到我们的项目里面,tinyvue的前端代码里面我们首先进行一个项目的依赖的下载大家可以使用npm install进行项目依赖的下载。

(3)当我们项目依赖下载完成后就可以进入到一个启动流程了,使用npm start进行一个项目的启动启动后就会开启3031端口这样就可以看见项目的启动界面了!

2.png

到目前为止我们的前端项目就算正式启动成功了,接下来让我们一起开始启动后端项目

2.后端项目的搭建

首先我们需要确保自己的本地环境里面有jdk17,maven,mysql,redis以及一个自己喜欢的开发软件可以idea或者vscode

好了准备工作做好以后接下来就让我们进入后端的开发和后端二次开发的一个介绍并且我也将带着大家去了解springboot里面的一些设计和里面的一些函数的内容接下来开始吧

项目结构的介绍:
当进入到项目里面的时候我们最直观的可以看见项目的一个整体结构

3.png
(1)先介绍一下项目的一个配置文件,对于所有的springboot项目上来第一件事就算看配置文件application.properties文件这个文件里面包含了所有项目需要的配置比如:mysql,redis,Springjpa,mybatis-plus(项目里面没有使用,但是基本的配置都配置好了,也就兼容了喜欢使用mybatis-plus的同学)大家可以更具自己的数据库信息和redis进行配置,需要自己填写好数据库的用户名,端口和驱动地址,还有redis的配置信息比如主机地址和端口号

到这里的同学,那就恭喜大家数据服务的配置我们就是做好了,接下来就是对项目的依赖的下载,这块主要涉及到maven的使用,如果还,没有下载maven的同学记得赶快去下载

(2)接下来开始项目依赖的初始化过程,在项目启动的时候,我们需要先对项目的依赖包去官方的仓库里面下载(这块给大家一个提醒,如果下载过慢的同学记得去配置一下maven的国内镜像源进行下载和配置),敲入命令
mvn install进行一个项目依赖的下载。

如果到这里都执行成功,大家就可以正式的启动项目,正式启动项目之前我希望大家可以去查看自己jdk的配置是否是17,因为接下来的必须要使用jdk17了

(3)进入到TinyProApplication文件里面进行启动项目,在这之前需要确保启动了redis和mysql的服务,并且配置好了密码,然后启动项目以后我们就会看到一个提示:

4.png
这里就算证明项目的整体正式启动成功了,接下来就开始监听3000端口了。

项目启动成功以后就可以开始进行一个交互了,大家就可以进入到刚才启动的前端项目里面准备进行一个交互,账户和密码都是admin,这块是配置里面预先写好的,如果有人需要修改这个用户和角色名称,可以进到 DataInitializer文件里面找到user配置进行修改

3.二次开发的讲解

首选项目里面可以进行二次开发的地方就算,权限管理拒绝策略,以及用户的登录校验初始化配置

5.png

(1)首先就是项目的权限管理的问题大家可以看见代码里面首先需要权限校验的接口上面都会有一个

6.png
@PermissionAnnotation这个注解里面配置的就是当前接口需要用户所拥有的权限,然后这块里面底层的实现细节在aspect这个目录里面,然后里面就是对于apo的一个使用。如果大家需要给某一个接口增加新的权限大家就可以直接在接口的上面进行一个使用然后写入具体要限制的细节
比如可以写:

7.png
这块就是要求用户必须要有menu::query::list这个权限才能进入到这个接口里面进行查询操作如果大家想更进一步了解到权限管理的细节,可以去看aop的使用java里面的切面编程

(2)接下来可以看拒绝的策略,首先对于接口拒绝策略的具体控制在配置文件里面,大家可以看到

8.PNG
这块就是一个拒绝策略的开关,如果大家想开始拒绝策略就可以直接输入true这个然后就会开启拒绝策略进行项目模式,目前是默认在演示模式里面

这个里面主要分为一个演示模式和一个项目模式,在项目模式里面大家可以自由的进行控制但是在演示模式里面,有很多的功能都被禁止了,所以大家要是不能使用的话就需要先查看是否是因为在演示模式里面导致的

(3)接下来就是用户的登录校验,大家首先要明白的一个流程就是用户首先要登录,只有登录成功以后才会将token放到redis里面,然后用户登录的校验就会先去redis里面进行查询,如果查询的到就会通过校验,如果redis里面没有当前用户人的信息就会进行一个拒绝的返回,然后就会跳转到前端的登录界面里面进行一个登录。具体就是拿一个拦截器进行拦截然后对每一个请求都进行校验只有登录过的才能进行项目的操作
(4)项目的初始化整个项目的初始化都在DataInitializer.java这个文件里面,如果后续需要进行一个项目的初始化调整,比如更改初始化的顺序以及在初始化的过程中想再加载一些资源都可以在这个文件里面进行增加

9.png

在这个run方法里面进行添加,这样项目在启动的时候就会先去加载项目里面的内容然后生成一个data文件夹的,这就标志着项目以及初始化过了,不需要再进行初始化,接下来每次的项目初始化都会先去看项目里面是否有data的目录如果存在就不走初始化的逻辑了

好了讲解完二次开发以后,接下来就要进入到docker的一个部署流程,在这个之前,大家可以更具的自己的情况去看是去买一个云服务器还是自己搭建一个虚拟机环境,然后进行配置,我在视频里面给搭建演示的就是在自己的虚拟机里面进行一个docker的部署和调用

4.docker的部署讲解

首先要了解在进行docker部署的时候,自己的容器文件里面的内容是否创建好了,以及对应的docker-compose.yml的一个配置

再检查完这些内容以后就要进入到我们的一个docker的部署流程环节,其实本质上也很简单就是进入到项目的文件夹目录里面,然后直接执行docker compose up -d这个命令以后,等待下载,但是下载的过程里面会有很多的问题比如下载过慢问题

(1)将项目的文件上传到服务器上面

10.png

然后进入当前目录大家可以看见,项目里面有两个文件一个是Dockerfile另一个是docker-compose.yml着两个文件是我们必须要的文件,进入进去看见

11.png

里面就是一些配置比如mysql的地址以及redis的地址,都是对应着我们即将启动的容器名称

(2)接下来就开始正式的启动docker-compose.yml文件,使用命令docker compose up -d启动成功以后就可以进行前端端口的配置映射到线上的docker地址,方便未来的开发
12.png

这个就是启动成功了,大家可以看映射的地址进行修改前端的配置了

5.本次参加开源之夏的感受和收获

在参加完这次的开源之夏以后,我最大的感受就是第一次有一个整齐的计划和老师还有别的学校的同学们可以一起开发一个软件,让我还没出社会的时候就已经拥有了独立开发的经验和经历。其次就是老师的辅导和社区的教导让我真的成长了很多,我特别感谢开源之夏和+OpenTiny社区对我的帮助,最后谢谢我的导师(真的很牛),他也很耐心的教我,特别感谢名字的话就不说了,不然以后有人烦他去了

谢谢大家我真的很珍惜这次机会,谢谢开源之夏,谢谢OpenTiny社区,谢谢导师,那我的这次开源之旅就结束,但是我相信只是暂时,我以后还会继续投身到开源里面,也希望可以帮助更多的人

关于OpenTiny

欢迎加入 OpenTiny 开源社区。添加微信小助手:opentiny-official 一起参与交流前端技术~

OpenTiny 官网:https://opentiny.design
OpenTiny 代码仓库:https://github.com/opentiny
TinyPro 源码:https://github.com/opentiny/tiny-pro
欢迎进入代码仓库 Star🌟TinyEngine、TinyVue、TinyNG、TinyCLI、TinyEditor~
如果你也想要共建,可以进入代码仓库,找到 good first issue标签,一起参与开源贡献~

Homebox 的 QR Code 标签

本文分享如何通过 Homebox —— 一个自托管的家庭物品管理系统,重新整理我的 “杂物生活”,节省时间、减少焦虑,并让全家人都受益。如果你的第一反应是 “就家里那点东西要上系统,至于吗?” 那证明你是个正常人,我以前也是这样的反应。作为一名技术爱好者,我曾长期被家中不断增长的电子设备和零部件小工具所困扰。

作为一名软件工程师,我的生活始终游走在数字世界与现实世界之间。白天,我为大型企业设计复杂的系统架构,帮助它们管理庞大的数字资产、提升运转效率(Come on…… AI, 你不知道我已经失业了吗 🙄);到了晚上和周末,我就是 “折腾党”。无论是写脚本自动化家里的灯光系统,在 Homelab 搭建一组 Raspberry Pi 集群,还是亲手给汽车做一次 DIY 换灯,这些动手项目都让我乐在其中。

然而,我的这些爱好背后,渐渐笼罩上了一层阴影:东西实在太乱了。

注:本文由我写大纲,Gemini 协助完成润色和扩展。我也作了后期 review 和修改。其中绝大部分内容来自我自己的真实经历和感受。

image.png

“设备税”:看不见的精神负担

很多年里,我一直承受着一种挥之不去、却又说不清的低度焦虑感。家里到处都是“明明存在、却像消失了一样”的物品。我留着一堆早已不用设备的线缆,却偏偏找不到正在用的那根;抽屉里塞满了传感器、微控制器和汽车零件,因为没有整理,它们几乎等同于不存在。

真正让我崩溃的,通常是两种情况之一。第一种是“重复购买”:为了某个项目,我兴冲冲地买了一个 OBD‑II 扫描仪或一根高速 USB‑C 线,结果三个月后在一个盒子里,又发现了一模一样的东西。第二种是“家庭冲突”:我妻子问我备用电池或某个工具放在哪儿,而我只能指着车库或书房,给出一个模糊的方向——这显然无助于家庭和谐。

我终于意识到,自己正活成了那句老话的典型例子:“鞋匠的孩子没鞋穿。” 我在工作中帮公司把数据管理得井井有条,而自己的私人“资产管理”却一团糟。我必须开始自己吃自己做的狗粮(Eat My Own Dog Food)

发现 Homebox:自托管的答案

我接触自托管(self‑hosting)已经有一段时间了,从媒体服务器到家庭自动化系统都折腾过。但直到我发现 Homebox(homebox.software),才算找到了拼图中缺失的那一块。

Homebox 是一个开源、自托管的家庭物品管理系统,专为普通家庭设计。它不像工业级资产管理系统那样复杂笨重,而是轻量、快速、直观。使用 Go 编写,后端是 SQLite,资源占用极低,丢到一台 Raspberry Pi 上跑也毫无压力。

从“纸箱”到“比特”:搭建过程

安装本身非常简单,一个 docker-compose,几分钟内就能看到干净、响应迅速的 Web 界面。真正的挑战——任何数据工程师都懂——在于录入数据

一开始,说实话我有点想偷懒。面对多年积累下来的“技术囤货”,我差点在开始之前就放弃了。后来我决定套用一个最基本的管理原则:从小处开始,持续迭代

我只专注于书房——我的“指挥中心”,那里放着 homelab 设备、焊接工具以及各种零碎电子玩意。

首先是 位置(Locations) 的层级结构。Homebox 支持嵌套位置,于是我这样规划:

  • 书房

    • 储物柜 A

      • 第 1 层(微控制器)
      • 第 2 层(线缆)
    • 书桌抽屉

接下来是 物品(Items)。每一件硬件,我都会记录:

  • 名称与描述:清晰、可搜索。
  • 购买时间与价格:方便追踪我的“折腾预算”。
  • 保修信息:不再翻邮箱找 PDF 发票,直接附在物品记录里。
  • 标签(Tags):真正的威力所在,比如 #automotive#esp32#usb-c#raspberrypi

转折点:那串“消失的钥匙”

起初的几个星期,Homebox 对我来说更像是一个“理论工具”——我在录数据,但还没真正依赖它。直到某个周二早上,我开会已经迟到十分钟,车钥匙却怎么也找不到。

在沙发垫、外套口袋里疯狂翻找五分钟后,我突然灵光一闪:我是不是记过这个?
我掏出手机,打开 Homebox,搜索 “钥匙”。结果立刻跳了出来:我把它们作为一个“资产”记录过,位置是 书房 → 书桌抽屉(小收纳盒)

前一晚做项目时,我为了避免焊锡助焊剂沾到钥匙,把它们放到了那里。正是这个清晰、准确的位置记录,帮我省下了至少二十分钟的焦虑。那一刻,Homebox 从“业余项目”正式升级成了“生活必需品”。

真正改变体验的功能

一旦体会到实际价值,我就彻底“上头”了。下面这些功能,尤其打动技术爱好者:

  1. 二维码与标签
    Homebox 可以为每个物品和位置生成二维码。我给那些不透明的收纳箱都贴上了小标签。现在不需要再翻箱倒柜,只要一扫码,就能看到箱子里的完整清单。
  2. 维护与保养计划
    对于汽车相关的零件,我可以设置提醒。比如刹车片、机油滤芯,什么时候该用、库存还剩多少,一目了然。
  3. 家庭共享
    这是对我婚姻帮助最大的一点。我给妻子也开了访问权限。现在她想找某个工具,或者只是想知道家里还有没有备用 HDMI 线,都可以自己查。结果是,“那个东西在哪?”的问题大幅减少。
  4. 理性消费
    在 京东 点下“立即购买”之前,我会先在 Homebox 里搜一下。这已经帮我省下了不少钱——提醒我某个电阻包、转接头,其实就躺在某个“待整理”的箱子里。

结语

如果你是技术爱好者、DIY 玩家,或者只是厌倦了那种“东西到底放哪了?”的精神消耗,我真心推荐你试试 Homebox 。它不仅仅是一个数据库,而是一种重新掌控时间与空间的方式。

作为一名软件工程师,我越来越清楚:我们用来支撑企业系统稳定运行的那些原则——组织、有文档、易访问——在家里同样重要。
事实证明,我做的“Dog Food”味道还不错;而多亏了 Homebox,我的书房终于更像实验室,而不再是杂物堆了。

Homebox 这样的软件大概不会在国内流行。不是资产多少问题,是大家的习惯不同。大家的记忆力都特别好,国内的小工具小产品的价格又物美价廉,丢了买新的也大概不太心痛。而且管理风格上也不同,我们更注重人而非数据。而就算有这种需求,大概会选择 Excel 或大平台的云服务来解决。

微信图片_20260120151234_1904_102.jpg

1月20日,据《华尔街日报》报道,百度旗下文心助手月活用户数已突破2亿,与豆包、千问形成国内三大亿级AI入口。

此前国内报道,文心助手是百度APP推出的AI智能助手,依托文心大模型和“百度猎户座”AI引擎,实现了搜索与AI的深度重构,是集深度思考、多模态交互与全场景服务于一体的全能搭子

据悉,该助手具备强大的深度思考与长期记忆能力,能结合交互上下文,提供极具个性化的精准回应与推荐,并能深度思考和主动推荐,懂用户所想;同时具备多模态全能交互能力,支持视频通话、AI创作、拍照问答、打电话、拍题答疑等多项AI服务,让AI真正深入用户的实时生活与工作场景中;更为重要地是,文心助手充分发挥了百度搜索生态优势,支持MCP服务工具调用,实现从“提供信息”到“交付服务”。目前不仅接入了百度地图、百度健康等百度生态服务,而且链接了京东、美团、盈米基金等头部合作伙伴MCP服务,全面覆盖电商、健康、本地生活、学术教育、汽车、金融、法律、星座命理等多个领域,解决用户订票、出行、购物,理财与法律咨询等需求。

西北工业大学StereoMV2D突破3D物体检测深度难题,精度与效率兼得

论文标题:StereoMV2D: A Sparse Temporal Stereo-Enhanced Framework for Robust Multi-View 3D Object Detection

作者团队:西北工业大学苏州科技大学

发布时间:2025年12月19日

论文链接:

大模型实验室Lab4AI论文阅读

✔️研究背景

多视图3D物体检测需在检测精度和计算效率间取得平衡。稀疏查询基方法(如MV2D)通过2D检测结果初始化3D查询,提供了高效的端到端检测范式,但单帧2D检测存在深度模糊问题,导致3D查询初始化不准确。

现有融合时序立体建模的方法多依赖密集代价体构建,引入大量计算与内存开销,难以兼容稀疏查询类方法的高效特性,形成研究缺口。

✔️研究内容

针对单帧 2D 检测的深度模糊缺陷,以及现有时序立体建模方法计算开销大的问题,本研究旨在提出一种统一框架,将时序立体建模融入稀疏查询检测范式,在保持稀疏查询类方法高效性的同时,增强深度感知能力,提升多视图 3D 目标检测的精度与鲁棒性,实现精度与效率的良好平衡。

✔️核心思想

1️⃣匹配同一物体

汽车运动、场景变化时,系统需在前一帧与当前帧图像中匹配同一物体。
论文采用 “运动感知软匹配” 模块,结合物体外观与运动趋势,建立跨帧关联。

2️⃣物体区域内算深度

匹配到同一物体的跨帧图像后,StereoMV2D 仅在物体对应的感兴趣区域(RoI)内开展精细立体计算,减少计算量;通过对比物体在两帧图像中的细微位移,精准计算其真实距离。

3️⃣智能筛选有效信息

针对现实场景中物体新出现或被遮挡的动态情况,论文设计动态置信门控机制,自动判定采用立体测量结果,还是回退至单帧图像的推测结果。

现在互联网行业竞争这么激烈,网页界面设计得好不好,不光影响用户用着顺不顺手,还直接关系到产品能不能留住人。大厂设计师能做出让人眼前一亮的界面,除了自身本事硬,背后肯定少不了好用的设计工具帮忙。下面就给大家盘点 7 款 UI 设计师平时常用的网页设计软件,不管是新手还是老手,都能找到适合自己的。
一、UXbot:原型、交互、开发一条龙搞定
核心功能:

  • 多页面自动生成:你只要把想法用文字说清楚,它就能自动画出完整的用户使用流程,还会告诉你背后的设计思路。可以自己选要生成哪些页面,一次性做出整套界面,不用再一点点拼凑,大大节省时间。
    image.png
  • 自由编辑超灵活:既能用说话、打字的方式快速操作,也有专业的精细编辑器,能精准调整到每一个像素。不管是改页面布局、换设计风格,还是换图片文字,都能精准满足需求,创意和专业性都不耽误。
    image.png
  • 交互原型一键分享:马上就能生成能实际操作的演示原型,点一点、滑一滑都跟真的产品一样,还能直接分享给别人。不管是给客户演示、团队内部讨论,还是项目推介,都能让大家直观看到效果,更有说服力。
    image.png
  • 自动生成前端代码:界面设计一确定,它就会自动生成能直接用的前端代码,还能适配 vue.js 这种常用框架。设计效果和代码能无缝衔接,甚至能一键传到云服务器上,再也不用纠结设计和开发脱节的问题了。
    image.png
  • 多平台协作方便:能一键导出 HTML 或 Sketch 格式,还能设置不同人的查看、编辑权限,团队随时随地都能协作,设计和开发衔接更顺畅。

适用场景:
中小型企业、工作室做项目演示,能快速把商业想法变成可展示的原型;企业做数字化项目,跨部门一起做内部工具或客户产品;设计和开发团队合作,减少沟通误会,提高原型评审和代码转化效率;产品更新优化时,快速验证新功能的逻辑和用户体验。

二、Adobe Illustrator:矢量设计的王牌
核心功能:

  • 专门做矢量图形,用来设计网页里的图标、装饰图案、品牌插画再合适不过了,不管放大多少倍,画面都清晰锐利,不会出现模糊、边缘变形的情况。
  • 有钢笔工具、形状生成器这些强大的图形编辑功能,不管是复杂的几何形状,还是自定义的创意图形,都能轻松画出来,满足各种视觉设计需求。
  • 文字排版能精准调控,字体、字号、行间距、字间距都能细细调整,能做出整齐又好看的界面文字布局,让整个页面的视觉质感更棒。
    适用场景:
    主要用来设计网页里的矢量元素,比如企业官网的品牌 LOGO、导航栏的功能图标、页面里的装饰插画,还有需要精细排版的标题、说明文字等。
    image.png

三、Sketch:UI/UX 设计的高效小帮手
核心功能:

  • 就是为 UI/UX 设计量身做的,界面简单明了,新手也能快速上手,不用花好多时间学操作。
  • 有智能自适应布局功能,设计能适配不同屏幕的网页时,调整一个元素的大小,和它相关的其他元素会按照预设的规则自动调整,不用手动一个个改位置、调大小,省了好多事。
  • 支持装各种插件,比如切图、填充数据、生成标注的插件,能大大提高设计效率,和开发团队合作也更顺畅。
  • 有符号复用功能,把按钮、输入框这些常用元素设为 “符号”,后面只要改一下原始的 “符号”,所有用了这个 “符号” 的地方都会自动更新,能保证整个设计的一致性。
    适用场景:
    特别适合互联网创业公司快速做产品原型,比如开发新的网页应用时,设计师能用它高效完成界面设计和原型制作,快速验证产品思路,缩短项目周期。
    image.png

四、Adobe Photoshop:界面视觉精修神器
核心功能:

  • 经典的图像处理软件,功能特别全,调颜色、抠图、合成图片、修细节都能搞定,能给网页界面打造出精致的视觉效果。
  • 用图层来管理内容,导航栏、正文、背景图这些元素可以分别放在不同的图层上,能灵活控制每个图层的显示、隐藏和透明度,改一个元素的时候不会影响到其他内容。
  • 有各种滤镜和特效工具,能快速做出模糊、阴影、发光这些效果,让界面更有层次感和立体感,看起来更吸引人。
    适用场景:
    适合对视觉效果要求高、需要大量处理图片的网页项目。比如电商平台的首页设计,商品图片精修、促销海报制作、页面氛围渲染这些工作,用它都能高效完成。
    image.png

五、Axure RP:专业的交互原型工具
核心功能:

  • 是专门做原型设计的工具,不光能做出高还原度的界面,还能做可交互的产品原型。可以给元素加点击跳转、滑动切换这些交互效果,甚至能设置条件逻辑,完整模拟用户实际使用的流程。
  • 有丰富的元件库,还能自己做自定义元件,轻松做出表单、弹窗、导航菜单这些常见的界面组件,还能给元件改样式,贴合项目的整体设计风格。
  • 支持多人一起编辑,团队成员能共同管理原型项目,生成的 HTML 格式原型文件,开发、测试的同事不用装专门的软件,直接就能查看和体验。
    适用场景:
    在网页产品的前期规划和交互设计阶段特别有用。比如开发新的网页应用,或者给现有网站改版时,设计师和产品经理能用它快速搭建原型,做用户测试和方案验证,确保产品的交互逻辑符合用户需求。
    image.png

六、Adobe XD:设计到原型无缝衔接
核心功能:

  • 把设计、原型制作、动效设计三个功能整合到一起,设计师不用在好几个软件之间来回切换,在一个界面里就能完成从静态设计图到动态原型的全部工作。
  • 支持响应式设计布局,设置好断点和约束条件,就能快速适配电脑、平板、手机等不同屏幕尺寸,让设计更灵活、适用范围更广。
  • 有重复网格功能,设计新闻列表、产品列表这种界面时,只要做好一个列表项,一键就能生成多个相同样式的元素,不用重复设计,省了好多时间。
    适用场景:
    适合 UI/UX 设计师做网页界面设计和原型制作,尤其是需要给客户展示设计效果、给团队评审交互流程的时候。比如做方案汇报,用它生成的可交互原型,能让大家更直观地感受到产品的功能和操作体验。
    image.png

七、InVision:原型测试和团队反馈的高效平台
核心功能:

  • 专注于原型设计和团队协作,能导入 Sketch、Adobe XD 等多种格式的设计文件,方便整合不同来源的设计资源。
  • 有丰富的交互动画模板,设计师能轻松给原型加页面切换、元素弹出、下拉刷新这些动画效果,让原型更真实、更有吸引力。
  • 评论批注功能很方便,团队成员和客户能直接在原型上标注意见和建议,设计师能快速找到需要修改的地方,不用反复沟通确认,能加快项目推进速度。
    适用场景:
    在网页项目的后期测试和反馈阶段优势特别明显。比如完成界面设计和原型制作后,用这款工具能快速和开发团队、测试团队、客户对接,收集大家的意见,及时优化设计方案,确保最终的产品符合预期。
    image.png

总结
总的来说,这 7 款网页设计软件各有各的优势,UI 设计师可以根据项目的具体需求、团队的协作方式来灵活选择。对于做网页设计的从业者和爱好者来说,摸清这些工具的特点和适用场景,熟练用它们辅助设计,既能提高工作效率,也能让自己的作品更有竞争力,做出更优质的网页界面。

Mistral 近日发布了其光学字符识别(optical character recognition,OCR)模型的最新版本,Mistral OCR 3,该版本专注于在多种文档类型上实现更高的精度,包括手写笔记、表单、低质量扫描件以及结构复杂的表格。

 

据 Mistral 表示,OCR 3 相较于前一代产品是一次重大的飞跃。在基于真实客户文档工作流的内部评估中,新模型在整体表现上以 74%的胜率超越了 Mistral OCR 2,尤其在表单、手写内容和含大量表格的文档上优势更为显著。这些基准测试采用模糊匹配(fuzzy-match)指标与人工标注的真实结果进行比对,旨在反映实际业务场景,而非理想化的合成数据。

图片来源:Mistral 博客

 

从技术角度看,Mistral OCR 3 不仅能够提取文本,还能识别并保留嵌入的图像,同时完整保留原始文档的结构信息。它的输出格式为 Markdown,其中表格通过 HTML 标签(如 rowspan 和 colspan)重建,使下游系统不仅能获取纯文本,还能保留布局语义。这一特性使其非常适合需要结构化 JSON、可搜索档案的管道,或集成到智能体(agentic)和检索增强系统(RAG)中。

 

在以往通常依赖人工复核的场景中,该模型也展现出显著的进步。它能够高效处理手写内容,包括连笔的笔记和批注。在表单解析方面,对标签、复选框及混合输入项的识别更加准确。此外,OCR 3 对扫描档案中常见的倾斜、压缩伪影、低分辨率以及背景噪点等问题具备更强的健壮性。

 

早期用户特别强调了其性能提升和多语言方面的支持能力。ICT 安全负责人兼 AI 安全专家 Patrick Jacobs评论说:

在速度方面,真的令人印象深刻,而且它处理荷兰语毫无压力。

 

得益于准确率的大幅提升,Mistral OCR 3 的生产部署正在快速扩展。Techseria 创始人兼首席顾问 Niraj Bhatt分享了其实际应用的变化:

我们一直在生产环境中使用 Mistral OCR 处理销售和采购发票,实现 ERP 系统的零人工数据录入。现在 v3 在表单和手写内容上准确率提升了 74%,终于让我们能够将覆盖范围扩展到送货单、水电账单以及过去只能靠人工处理的遗留档案。

 

在定价方面,Mistral OCR 3 的标准费率为每 1000 页 2 美元;若使用 Batch API,成本可降至每 1000 页 1 美元,使其成为许多企业级 OCR 系统的高性价比替代方案。开发者可通过 API 直接集成模型(标识符为 mistral-ocr-2512),非技术用户则可通过拖放式的 Document AI Playground 界面轻松使用。

 

对于具有严格数据治理要求的组织,Mistral 提供了私有化的部署选项,确保 OCR 工作负载完全运行在客户可控的基础设施内。

 

如今,Mistral OCR 3 已经可以使用了,并完全向后兼容 OCR 2。

 

原文链接:

Mistral Releases OCR 3 With Improved Accuracy on Handwritten and Structured Documents

在 Ubuntu 的默认配置中,当系统检测到仅存在一个操作系统时,GRUB 启动菜单会被隐藏,系统会直接进入内核启动流程。这种“无感启动”在桌面用户场景下较为友好,但在 服务器、运维、开发和多内核管理场景 中,会带来一系列明显的痛点。

可通过配置grub控制默认是否显示grub界面以及倒计时相关的配置

配置文件路径

  1. ubuntu grub配置文件路径

/etc/default/grub

  1. centos grub配置文件路径

/etc/sysconfig/grub

默认配置文件内容

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

主要关注以下三个参数

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0

GRUB_DEFAULT

默认引导项,可以有以下几种值

  1. saved 代表上次启动时选择的引导项
  2. 从0开始的数字,第一个引导项是0,第二个引导项是1,以此类推

如上图Previous Linux Versions存在的子菜单可以用2>0或者2>1表示

  1. grub选项名

GRUB_TIMEOUT_STYLE

grub显示风格,默认值是menu

可选值有menu,hidden,countdown

如果该选项未设置或者值设为menu,启动时将显示grub,并开启GRUB_TIMEOUT倒计时。倒计时结束前可以按任意键中断倒计时,否则倒计时结束后会引导GRUB_DEFAULT启动项。

如果选项设置为hiddencountdown,在显示grub界面之前会开启GRUB_TIMEOUT倒计时。倒计时结束前按ESC键中断倒计会进入grub界面,如果没有按ESC键进行中断操作,倒计时结束后会引导GRUB_DEFAULT启动项。

hiddencountdown的区别在于,hidden不显示倒计时读秒,countdown显示倒计时读秒

GRUB_TIMEOUT

这个参数代表grub的超时时间,单位是秒,默认值为5,设置为0代表不显示grub界面,-1代表一直等待

例子

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5

修改后执行update-grub应用配置,重启后必定进入grub界面

GRUB_DEFAULT=1
GRUB_TIMEOUT_STYLE=countdown
GRUB_TIMEOUT=5

修改后执行update-grub应用配置,重启后在5秒倒计时结束前按ESC必定进入grub界面

GRUB_DEFAULT="2>1"
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5

修改后执行update-grub应用配置,重启后在5秒倒计时结束后会引导指定启动项,这个方法对于客户要求进入旧版本内核比较好用

清华联合字节刷新 3D 头像技术!FlexAvatar 实现 “少图输入 + 高保真动态” 双重突破

论文标题:FlexAvatar: Flexible Large Reconstruction Model for Animatable Gaussian Head Avatars with Detailed Deformation

作者团队:清华大学字节跳动

发布时间:2025年12月19日

论文链接

大模型实验室链接Lab4AI论文阅读

🔍背景

以前做 3D 头像,要么得用专业设备拍几十上百张不同角度的照片,普通人搞不定;要么做出来的头像假,侧面看变形,做表情时没细节;要么动起来卡顿,或者只能做几种固定表情,没法自然还原复杂动作;要么得花几小时甚至几天调教模型,没法快速得到自己的头像。

🔍研究目的

本研究旨在构建一个无需相机位姿与表情标注、支持单张或稀疏输入的高保真可驱动3D头部虚拟人生成框架。

无需相机姿态和表情标签,仅从单张或稀疏图像中生成高保真、几何一致的可动画 3D 头部头像,同时兼顾实时渲染效率与动态细节真实性,填补现有技术在灵活性、保真度与实时性之间的平衡缺口。

🔍本文核心贡献

1️⃣灵活的重建模型:提出首个免相机位姿、免表情标签、支持任意数量输入的3D高斯虚拟人框架,基于结构化头部查询令牌(Head Query Tokens)实现特征聚合;

2️⃣动态高斯变形解码:设计以UV位置图为条件的UNet解码器,在UV空间生成表情相关的高斯属性变化,实现实时高保真驱动;

3️⃣数据分布调整策略:通过锚点表情筛选与相似帧检索,平衡训练集表情分布,提升动态细节学习效率;

4️⃣高效微调机制:10秒级的测试时优化可增强身份细节,且不影响实时驱动性能。

在数据分析与报表制作场景中,透视表凭借强大的维度聚合能力成为开发者的核心工具。但传统透视表的排序功能往往受限于固定规则,当用户需要根据业务逻辑自定义调整字段项顺序时,操作繁琐、灵活性不足的问题尤为突出——比如想按业务优先级调整产品类别顺序,或按部门协作逻辑重组数据维度,都需要额外编写复杂代码或手动修改数据源,严重影响工作效率。

为解决这一痛点,SpreadJS V19.0 重磅推出透视表拖动(自定义)排序功能,让用户无需复杂配置,通过直观的拖拽操作即可实现字段项顺序的自由调整,彻底重构透视表数据整理的便捷性。下面,我们将深入解析这一特性的核心价值与使用细节。

核心功能解析:灵活拖拽,精准控序

SpreadJS V19.0 的透视表拖动排序功能,以“直观操作+全面兼容”为设计核心,覆盖多种使用场景,满足不同用户的排序需求:
在这里插入图片描述

1. 多维度拖拽选择,适配多样操作习惯

功能支持四种灵活的拖拽选择方式,无论用户习惯精准选择还是批量操作,都能快速上手:

  • 仅选择字段头(PivotField Header):精准调整单个字段的整体顺序,不影响字段下的值区域;
  • 选择字段头及部分值区域:针对字段下的特定数据项进行排序调整,保留其他项的原有位置;
  • 选择字段头及全部值区域:批量移动整个字段及下属所有数据项,实现维度整体迁移;
  • 点击字段头选择全部值区域:一键选中字段关联的所有数据,简化批量拖拽操作。

2. 可视化拖拽流程,操作直观无门槛

拖拽过程全程伴随清晰的视觉指引,降低操作学习成本:

  1. 鼠标移动到选中区域边缘时,光标自动切换为“移动状态”,明确提示当前区域可拖拽;
  2. 按下鼠标开始拖拽后,系统会显示动态拖拽指示器,实时标注目标插入位置,避免误操作;
  3. 拖拽过程中,指示器会根据鼠标坐标智能判断:列字段按水平(x坐标)定位插入点,行字段按垂直(y坐标)定位,精准匹配透视表结构;
  4. 若拖拽的是父字段,指示器会自动跳过所有子字段的数据区域,确保层级结构不混乱;
  5. 释放鼠标后,选中的字段项会自动插入到指示器标注的位置,排序结果即时生效。

3. 排序选项智能联动,状态同步不脱节

拖拽排序后,字段项的排序状态会自动同步到透视表的排序选项对话框:当用户打开排序设置时,排序方式会默认切换为“手动(manual)”,清晰标识当前为自定义拖拽排序结果,避免与系统自动排序规则冲突,也方便用户后续按需切换排序方式。

典型应用场景:让数据整理更贴合业务逻辑

这一特性的推出,让透视表排序彻底摆脱固定规则的束缚,在多个核心场景中发挥价值:

  • 业务优先级排序:在销售报表中,将重点推广的产品类别拖拽到靠前位置,直观突出核心数据;
  • 协作场景适配:跨部门协作分析时,按协作流程拖拽调整部门、项目等维度顺序,让报表更符合团队工作逻辑;
  • 个性化报表展示:根据汇报对象需求,自定义调整透视表字段顺序,让数据呈现更具针对性;
  • 临时数据重组:数据分析过程中,快速拖拽字段项进行多维度组合尝试,无需修改数据源即可探索不同数据视角。

操作指南:3步完成自定义拖拽排序

  1. 选中目标:在透视表中选择需要排序的字段项(支持前文提到的四种选择方式);
  2. 开始拖拽:鼠标移动到选中区域边缘,待光标变为移动状态后,按下鼠标并拖动;
  3. 确认插入:拖动过程中观察拖拽指示器,到达目标位置后释放鼠标,字段项自动完成排序调整。

注意事项:这些边界场景需留意

为确保功能使用顺畅,以下两类操作暂不支持,开发者需提前知晓:

  1. 不支持选中整行或整列进行字段项拖拽:仅能通过选中“字段头”或“字段头+值区域”的方式进行拖拽,全选行/列无法触发字段项排序;
  2. 不支持同时选择不同父字段下的同名子字段进行拖拽:SpreadJS 仅支持单个子字段的独立拖拽,避免多父字段下的子字段混淆。

总结与展望:让透视表更懂业务需求

SpreadJS V19.0 推出的透视表拖动自定义排序功能,以“直观操作、灵活适配、精准控制”为核心优势,彻底解决了传统透视表排序灵活性不足的痛点,让数据整理更贴合业务逻辑,大幅提升报表制作与数据分析效率。

作为一款面向企业级应用的纯前端表格控件,SpreadJS 始终聚焦开发者与终端用户的实际需求,持续优化透视表等核心功能的使用体验。除了拖动排序,V19.0 还为透视表带来了日期分组、受保护工作表中启用透视表等多项增强能力,全方位提升数据处理能力。

如需了解更多功能细节,可访问 SpreadJS 官网 查看产品文档,或通过 在线 Demo 直接体验新特性。SpreadJS V19.0 即将正式发布,敬请期待这款更强大、更灵活的前端表格控件,为你的业务系统注入新的活力!

当下全球智能化发展迅猛,企业和创作者对品牌线上平台的要求越来越高——不仅要搭建得快、能适配全球不同场景,质感还得够专业。传统建站方式受限于技术门槛高、多设备适配麻烦、开发周期长等问题,根本跟不上全球业务快速拓展的节奏。AI技术的突破,催生了一批智能又高效的建站工具,还能适配全球场景,彻底改变了大家搭建线上平台的思路。下面精选8款全球热门AI建站工具,包括UXbot、CodeWP、10Web、Unbounce、Hostinger、Jimdo、Framer、Shopify,从技术核心、全球适用场景、实际用法和适用范围四个方面详细说明,给全球用户提供靠谱的选型参考,帮大家快速做出高质量的数字化平台。
一、核心工具深度解析

  1. UXbot:自然语言驱动的零代码个性化建站标杆
    UXbot是青颖飞帆旗下的旗舰AI建站产品,基于自然语言操作,就能让不懂技术的人也轻松建站。借助成熟的AI语义理解技术,用户不用复杂操作,只需简单几句话说清品牌需求、想要的功能和视觉偏好,就能快速拿到专属的个性化网站方案。
    它最核心的价值就是打破了技术壁垒,集网页和应用界面设计、可交互原型制作、Web前端代码生成为一体。哪怕完全没有代码基础,也能把脑子里的想法,或是细致的产品需求,变成有完整使用流程、交互效果出色的多页面项目。
    不管是设计师打磨视觉效果、产品经理测试功能逻辑,还是前端开发实现设计和交互,UXbot都能帮上忙。全球的中小企业、创作者,不用懂代码就能快速做出有品牌特色、够专业的线上平台,不管是跨境电商、个人品牌展示,还是服务型企业拓客,都能适配。
    image.png
  2. CodeWP:WordPress生态的AI化主题转化引擎
    CodeWP专门针对全球常用的CMS平台WordPress打造,形成了“有设计想法→AI帮忙转化→生成可用主题”的完整流程。它通过学习大量WordPress主题的结构和设计标准,能把用户给的视觉设计稿、创意描述,精准转换成支持多设备适配的WordPress主题,在全球主流浏览器上都能正常显示。
    它的优势在于和WordPress生态深度契合,能直接搭配Yoast SEO、WooCommerce这些全球热门插件使用,帮做跨境业务的用户快速搭建符合不同区域搜索引擎规则的网站。但它也有不足:只针对WordPress平台,没法跨其他系统使用,而且设计稿和最终生成的主题,细节上偶尔会有偏差,需要手动微调。
    image.png
  3. 10Web:WordPress生态的轻量化智能建站解决方案
    10Web主打“AI辅助+快速复刻”,给全球WordPress用户提供轻便的建站服务。靠AI智能识别技术,短短几分钟就能把已有的网站完整复制下来,还能直接迁移到WordPress平台,大大节省了跨境建站的时间和成本。
    它自带的AI拖放编辑器,操作简单还能满足专业需求,再加上全球海量正版图片和多语言插件,能适配不同区域品牌的视觉和功能需求。这款工具很适合依赖WordPress、想快速建站的全球用户,但因为只支持这一个平台,部分小众插件可能不兼容,建议提前测试。
    image.png
  4. Unbounce:AI驱动的全球营销型着陆页优化利器
    Unbounce是全球营销建站领域的常用工具,核心目标就是提高页面转化率,打造了一套AI驱动的着陆页全流程管理功能。不用懂代码,用户就能通过AI编辑器做出符合全球审美、适配不同区域流量场景的高质量着陆页,内置的100多种行业模板,能覆盖跨境营销、全球活动推广、品牌获客等多种需求。
    它的实时AI数据分析功能,能动态跟踪全球访客的行为和转化路径,给出具体的优化建议,还能通过不断学习升级算法,帮全球营销人员提升跨区域流量的转化效果。缺点是高级优化功能不太好上手,新手需要花时间熟悉操作。
    image.png
  5. Hostinger:一体化AI建站与全球主机服务提供商
    Hostinger把“AI建站+全球主机运维”整合到一起,是跨境用户的常用选择。它的AI拖放编辑器支持用日常语言生成网站内容、调整页面布局,再加上Cloudflare全球CDN节点,能明显提升全球不同地区的网站访问速度,还能增强安全防护,解决了跨境建站的性能难题。
    工具自带的AI文本生成功能,能满足多语言创作需求,帮品牌快速在多个区域搭建线上平台。需要注意的是,它的共享主机没有专用IP,基础套餐的存储空间也比较有限,要根据跨境业务规模选合适的套餐。
    image.png
  6. Jimdo:Dolphin AI赋能的全球极速建站工具
    Jimdo靠自研的Dolphin AI系统,实现了三分钟快速建站,特别适合全球中小企业和个体创作者快速上线网站的需求。AI会自动分析用户的业务类型、品牌偏好和目标受众,生成专属网站方案,还能自动优化多设备适配,确保全球用户在手机、电脑等不同终端上,都能有一致的使用体验。
    它的简易电商模块,能快速搭建跨境线上店铺,完成商品上架、订单管理、支付对接等核心操作,流程简单易懂,对新手十分友好。但它的设计自由度不如专业工具,没法满足高端品牌的深度定制需求。
    image.png
  7. Framer:AI驱动的全场景Web应用设计开发平台
    Framer是全球AI建站领域的创新工具,靠先进的AI设计预测功能,能覆盖从简单品牌主页到复杂跨境Web应用的各种需求。它的优势是AI会实时给设计建议,帮用户做出符合全球审美趋势的页面,还能轻松添加悬停效果、多语言滑块、跨境表单等交互元素,提升全球用户的访问体验。
    它打通了设计和开发的全流程,做好的网站能直接对接全球服务器部署,适配不同区域的技术环境。不过丰富的AI功能对新手有一定难度,部分交互元素在不同浏览器上的显示效果也略有差异,需要留意。
    image.png
  8. Shopify:
    AI赋能的全球电商建站生态平台Shopify专注于全球电商场景,用AI技术优化了跨境电商的建站和运营方式,是行业内的标杆工具。它的AI功能能预测购物趋势、分析全球访客行为、自动处理多区域运营任务,给跨境商家提供数据支持,帮助做决策。用户能快速搭建有品牌感的跨境电商网站,配置专属全球域名,内置的AI智能客服还能支持多语言咨询,实时解答客户疑问、引导下单,提升全球用户的购物体验。平台生态完善,能对接全球主流支付渠道和物流服务商,帮商家快速布局全球市场。但高级AI运营功能比较复杂,中小商家需要慢慢摸索,前期学习成本不低。
    image.png

二、全球场景选型指南
以上8款工具覆盖了全球建站的各种场景,能精准匹配不同用户的需求:不懂技术、想快速落地跨境业务的创业者,优先选UXbot、Jimdo,零代码就能做出适配全球的网站;习惯用WordPress的跨境用户,CodeWP、10Web最适配,兼顾生态兼容性和建站效率;做跨境电商的商家,Shopify的全流程AI电商功能能满足全球运营需求;专注跨区域营销获客的,Unbounce的转化率优化功能很实用;追求专业设计与开发一体化的中高端用户,Framer的全场景适配能力更强;需要同时解决主机和建站问题的跨境用户,选Hostinger更省心高效。
在全球数字化转型的关键时期,AI建站工具已经成为品牌拓展全球市场的重要助力。选对适合自己业务、能适配全球场景的工具,既能大幅降低建站成本,又能提升线上平台的专业质感,为全球业务发展筑牢基础。

在Web界面设计领域,从创意构想到可交付原型的全链路,往往要经历繁琐流程,迭代速度慢,严重影响团队效率。而AI设计工具的不断升级,不仅支持智能生成可编辑的UI界面、快速搭建带交互的原型,还支持灵活迭代,大幅提升设计效率。下面就为大家梳理六款兼顾实用性与专业性的AI设计工具,帮助设计创意更快落地、创造价值。

  1. UXbot
    核心定位:国内AI原型设计的实用标杆工具,能打通“文字提需求-高保真原型-界面设计-Web前端开发”全环节,实现一站式智能协作。
    UXbot能精准理解文字需求、拆解业务逻辑,不管是网站、移动应用还是平板端界面,都能直接生成高保真设计稿,不用人工搭建基础框架。同时还能自动生成可视化PRD,不用再分开做设计和写文档,解决了两者脱节的问题,大大减少重复工作量。生成的界面还能直接设置复杂交互和页面跳转,完整还原用户使用流程。
    它有两种编辑方式可选:既能通过AI对话微调局部设计,也能用自带的专业编辑器精细化打磨,不管是快速验证想法,还是深度优化设计,都能满足需求,精准度能达到像素级控制。
    另外,还支持把高保真界面转换成Web前端代码,通过云端服务器完成全流程测试,生成的代码可导出为Vue格式,直接导入开发环境使用。
    这套“需求-设计-交互-开发”的完整流程,能帮中文语境下的产品和设计团队,高效推进网站开发落地。
    image.png
  2. Galileo AI
    核心定位:主打视觉美感的高保真UI生成工具,适合探索设计风格、制作视觉原型。
    Galileo AI的视觉渲染效果很出色,生成的界面既美观又有细节,用来做情绪板、快速尝试不同设计风格非常合适。设计好的内容可以直接同步到Figma里,进行可无限放大不失真的编辑,方便进一步优化打磨,精准落地设计想法。
    不过它也有不足:对中文指令的理解不够准,处理复杂业务逻辑时不如UXbot好用。所以更适合以视觉设计为主、常用英文指令的场景,要是涉及复杂中文需求或业务流程,还需要人工调整校准。
    image.png
  3. Uizard
    核心定位:能把手绘创意转成数字界面的工具,降低非设计人员做原型的门槛。
    Uizard最核心的功能就是识别手绘草图,把纸上的创意快速数字化。只要拍下手绘稿上传,AI就能自动识别按钮、输入框、图片等元素,生成可编辑的数字UI界面。工具操作特别简单,不用具备专业设计技能,就能把白板上的想法落地成原型,很适合创业者、跨部门团队在需求评审后,快速验证创意是否可行。
    image.png
  4. Relume
    核心定位:专注网页结构设计的AI工具,擅长快速搭建营销官网和SaaS产品着陆页。
    Relume做网页设计时,会先理清逻辑再动手:根据需求生成站点地图,梳理好网页层级和信息排布,再用海量Web组件拼装线框图,既能保证页面逻辑清晰,又能兼顾视觉统一。上千种组件可灵活组合,既不耽误设计效率,又能保留创意空间,能快速做出实用又美观的网页原型,为后续优化打下基础。
    image.png
  5. Vev AI
    核心定位:融合可视化编辑与AI生成功能的全流程网页工具,打通设计与开发的衔接瓶颈。
    只要用文字描述需求,Vev AI就能生成分图层、可编辑的网页界面,还自带基础交互效果,能快速验证用户体验。平台内置可视化编辑模块,可精准调整设计细节,同时支持一键导出HTML/CSS代码,直接交付开发使用,大幅缩短设计到开发的转化时间,很适合网页设计与前端开发协同工作的场景。
    image.png
  6. Framer AI
    核心定位:践行“设计即代码”理念,能把设计稿快速转成可访问的网页。
    Framer AI的代码生成能力很强,可直接把UI设计元素转换成HTML、CSS或React组件,让设计和开发无缝衔接。同时支持制作高保真动效和微交互,设计时就能预览实际呈现效果,让网页体验更生动。设计完成后,还能直接发布成可访问的网页链接,跳过中间转化步骤,加快产品上线速度,适合以前端开发为核心的高效落地项目。
    image.png

工具选型战略指南
上述六款工具覆盖了手绘转数字、视觉设计、代码输出等全场景设计需求,能满足不同团队的多样化需求。如果团队侧重中文语境下的全流程高效落地,想从文字需求直接做出可交付的交互原型,还能同步生成设计和产品资料,UXbot会是最优选择,它能打通全流程环节,帮团队高效实现从创意到落地的转化。

一、背景

得物经过10年发展,计算任务已超10万+,数据已经超200+PB,为了降低成本,计算引擎和存储资源需要从云平台迁移到得物自建平台,计算引擎从云平台Spark迁移到自建Apache Spark集群、存储从ODPS迁移到OSS。

在迁移时,最关键的一点是需要保证迁移前后数据的一致性,同时为了更加高效地完成迁移工作(目前计算任务已超10万+,手动比数已是不可能),因此比数平台便应运而生。

二、数据比对关键挑战与目标

关键挑战一:如何更快地完成全文数据比对

现状痛点:

在前期迁移过程中,迁移同学需要手动join两张表来识别不一致数据,然后逐条、逐字段进行人工比对验证。这种方式在任务量较少时尚可应付,但当任务规模达到成千上万级别时,就无法实现并发快速分析。

核心问题:

  • 效率瓶颈:每天需要完成数千任务的比对,累计待迁移任务达10万+,涉及表数十万张。
  • 扩展性不足:传统人工比对方式无法满足大规模并发处理需求。

关键挑战二:如何精准定位异常数据

现状痛点:

迁移同学在识别出不一致数据后,需要通过肉眼观察来定位具体问题,经常导致视觉疲劳和分析效率低下。

核心问题:

  • 分析困难:在比对不通过的情况下,比对人员需要人工分析失败原因。
  • 复杂度高:面对数据量庞大、加工逻辑复杂的场景,特别是在处理大JSON数据时,肉眼根本无法有效分辨差异。
  • 耗时严重:单次比对不通过场景的平均分析时间高达1.67小时/任务。

比数核心目标

基于以上挑战,数据比对系统需要实现以下核心目标:

  • 高并发处理能力:支持每天数千任务的快速比对,能够处理10万+待迁移任务和数十万张表的规模。
  • 自动化比对机制:实现全自动化的数据比对流程,减少人工干预,提升比对效率。
  • 智能差异定位:提供精准的差异定位能力,能够快速识别并高亮显示不一致的字段和数据。
  • 可视化分析界面:构建友好的可视化分析平台,支持大JSON数据的结构化展示和差异高亮。
  • 性能优化:将用户单次比对分析时间从小时级大幅缩短至分钟级别。
  • 可扩展架构:设计可水平扩展的系统架构,能够随着业务增长灵活扩容。

三、解决方案实现原理

快速完成全文数据比对方法

比数方法调研

待比对两表数据大小:300GB,计算资源:1000c


经过调研分析比数平台采用第二种和第三种相结合的方式进行比数。

先Union再分组数据一致性校验原理

假如我们有如下a和b两表张需要进行数据比对

表a:


表b:


表行数比较:

select count(1) from a ;
select count(1) from b ;

针对上面的查询结果,如果数量不一致则退出比对,待修复后重新比数;数量一致则继续字段值比较。

字段值比较:

第一步:union a 和 b

select 1 as _t1_count, 0 as _t2_count, `id`, `name`, `age`, `score`
from a
union all
select 0 as _t1_count, 1 as _t2_count, `id`, `name`, `age`, `score`
from b

第二步:sum(_t1_count),sum(_t2_count) 后分组

select sum(_t1_count) as sum_t1_count, sum(_t2_count) as sum_t2_count, `id`, `name`, `age`, `score`
from (
select 1 as _t1_count, 0 as _t2_count, `id`, `name`, `age`, `score`
from a
union all
select 0 as _t1_count, 1 as _t2_count, `id`, `name`, `age`, `score`
from b
) as union_table
group by `id`, `name`, `age`, `score`


第三步:把不一致数据写入新的表中(即上面表中sum_t1_count和sum_t2_count不相等的数据)

drop table if exists a_b_diff_20240908;
create table a_b_diff_20240908 as select * from (
select sum(_t1_count) as sum_t1_count, sum(_t2_count) as sum_t2_count, `id`, `name`, `age`, `score`
from (
select 1 as _t1_count, 0 as _t2_count, `id`, `name`, `age`, `score`
from a
union all
select 0 as _t1_count, 1 as _t2_count, `id`, `name`, `age`, `score`
from b
) as union_table
group by `id`, `name`, `age`, `score`
having sum(_t1_count) <> sum(_t2_count)
) as tmp

如果a_b_diff_20240908没有数据则两张表没有差异,比数通过,如有差异如下:

第四步:读取不一致记录表,根据主键(比如id)找出不一致字段并写到结果表中。

第五步:针对不一致字段的数据进行根因分析,如 json 、数组顺序问题、浮点数精度问题等,给出不一致具体原因。

哈希值聚合实现高效一致性校验

针对上面union后sum 再 group by 方式 在数据量大的时候还是非常耗资源和时间的,考虑到比数任务毕竟有70%都是一致的,所以我们可以先采用哈希值聚合比较两表的的值是否一致,使用这种高效的方法先把两表数据一致的任务过滤掉,剩下的再采用上面方法继续比较,因为还要找出是哪个字段哪里不一致。原理如下:

SELECT count (*),SUM(xxhash64(cloum1)^xxhash64(cloum2)^...) FROM tableA 
EXCEPT 
SELECT count(*),SUM(xxhash64(cloum1)^xxhash64(cloum2)^...) FROM tableB

如果有记录为空说明数据一致,不为空说明数据不一致需要采用上面提到union 分组的方法去找出具体字段哪里不一样。

通过哈希值聚合,单个任务比数时间从500s降低到160s,节省大约70%的时间。

找到两张表不一致数据后需要对两张的数据进行分析确定不一致的点在哪里?这里就需要知道表的主键,根据主键逐个比对两张表的其他字段,因此系统会先进行主键的自动探查,以及无主键的兜底处理。

精准定位异常数据实现方法

自动探查主键:实现原理如下

刚开始我们采用的前5个字段找主键的方式,如下:

针对表a的前5个字段 循环比对
select count(distinct id) from a 与 select count(1) from a 比较 ,如相等主键为id ,不相等继续往下执行
select count(distinct id,name) from a 与 select count(1) from a比较,如相等主键为id,name ,不相等继续往下执行
select count(distinct id,name,age) from a 与 select count(1) from a比较,如相等主键为id,name,age ,不相等继续往下执行,直到循环结束

采用上面的方法不一致任务中大约有49.6%任务自动探查主键失败:因此需重点提升主键识别能力。

针对以上主键探查成功率低的问题,后续进行了一些迭代,优化后的主键探查流程如下:

一、先采用sum(hash)高效计算方式进行探查:

1.先算出两张表每个字段的sum(hash)值  。

select sum(hash(id)),sum(hash(name)),sum(hash(age)),sum(hash(score)) from a 
union all 
select sum(hash(id)),sum(hash(name)),sum(hash(age)),sum(hash(score)) from b;

2.找出值相等的所有字段,本案例中为 id, name。

3.对id,name 可能是主键进一步确认,先进行行数校验,如 select count(distinct id,name) from a 的值等于select count(1) from a 则进一步校验,否则进入到第二种探查主键方式。

4.唯一性验证,如果值为0则表示探查主键成功,否则进入到第二种探查主键方式。

slect count(*) from ((select id,name from a ) expect (select id,name from b))

二、传统distinct方式探查:

针对表a的前N(所有字段数/2或者前N、后N等)个字段 循环比对:

1.select count(distinct id) from a与select count(1) from a比较 ,如相等主键为id ,不相等继续往下执行。

2.select count(distinct id,name) from a 与 select count(1) from a比较,如相等主键为id,name ,不相等继续往下执行。

3.select count(distinct id,name,age) from a 与 select count(1) from a比较,如相等主键为id,name,age ,不相等继续往下执行,直到循环结束。

三、全字段排序模拟:

如果上面两种方式还是没有找到主键则把不一致记录表进行全字段排序然后对第一条和第二条记录挨个字段进行分析,找出不一致内容,示例如下:

slect * from a_b_diff_20240908 order by id,name,age,score asc limit 10;


通过以上结果表可以得出两表的age字段不一致 ,score不一致(但按key排序后一致)。

如果以上自动化分析还是找不到不一致字段内容,可以人工确认表的主键后到平台手动指定主键字段,然后点击后续分析即可按指定主键去找字段不一致内容。

通过多次迭代优化找主键策略,找主键成功率从最初的50.4%提升到75%,加上全字段order by排序后最前两条数据进行分析,相当于可以把找主键的成功率提升到90%以上。

根因分析:实现原理如下

当数据不一致时,平台会根据主键找出两个表哪些字段数据不一致并进行分析,具体如下:

  • 精准定位: 明确指出哪条记录、哪个字段存在差异,并展示具体的源数据和目标数据值。
  • 智能根因分析: 内置了多种差异模式识别规则,能够自动分析并提示不一致的可能原因,例如:
  • 精度问题:如浮点数计算1.0000000001与1.0的差异。
  • JSON序列化差异:如{"a":1, "b":2}与{"b":2, "a":1},在语义一致的情况下,因键值对顺序不同而被标记为差异。同时系统会提示排序后一致。
  • 空值处理差异:如NULL值与空字符串""的差异判定。
  • 日期时区转换问题:时间戳在不同时区下表示不同。

  • 比对结果统计: 提供总数据量、一致数据量、不一致数据量及不一致率百分比,为项目决策提供清晰的量化依据。
  • 比数人员根据平台分析的差异原因,决定是否手动标记通过或进行任务修复。
  • 效果展示:

四、比数平台功能介绍

数据比对基本流程

任务生成:三种比对模式

  • 两表比对: 最直接的比对方式。用户只需指定源表与目标表,平台即可启动全量数据比对。它适用于临时比对的场景。
  • 任务节点比对: 一个任务可能输出多个表,逐一配置这些表的比对任务繁琐且易遗漏,任务节点比对模式完美解决了这一问题。用户只需提供任务节点ID,平台便会自动解析该节点对应的SQL代码,提取出所有输出表,并自动生成比对任务,极大地提升任务迁移比对效率。
  • SQL查询比对: 业务在进行SDK迁移只关心某些查询在迁移后数据是否一样,因此需要对用户提交的所有查询SQL进行比对,平台会分别在ODPS和Spark引擎上执行该查询,将结果集导出到两张临时表,再生成比对任务。

前置校验:提前发现问题

在启动耗时的全量比对之前,需要对任务进行前置校验,确保比对是在表结构一致、集群环境正常的情况下进行,否则一旦启动比数会占用大量计算资源,最后结果还是比数不通过,会影响比数平台整体的运行效率。因此比数平台一般会针对如下问题进行前置拦截。

  • 元数据一致性校验: 比对双方的字段名、字段类型、字段顺序、字段个数是否一致。
  • 函数缺失校验: 针对Spark引擎,校验SQL中使用的函数是否存在、是否能被正确识别,避免因函数不支持而导致的比对失败。
  • 语法问题校验: 分析SQL语句的语法结构,确保其在目标引擎中能够被顺利解析,避免使用了某些特定写法会导致数据出现不一致情况,提前发现语法层面问题,并对任务进行改写。

更多校验点如下:




通过增加以上前置校验拦截,比数任务数从每天3000+下降到1500+, 减少50% 的无效比数,其中UDF缺失最多,有效拦截任务1238,缺少函数87个(帮比数同学快速定位,一次性解决函数缺失问题,避免多次找引擎同学陆陆续续添加,节省双方时间成本)。

破解比数瓶颈:资源分配与任务调度优化

由于比数平台刚上线的时候只有计算迁移团队在使用,后面随着更多的团队开始使用,性能遇到了如下瓶颈:

1.资源不足问题: 不同业务(计算迁移、存储迁移、SDK迁移)的任务相互影响,基本比数任务与根因分析任务相互抢占资源。

2.任务编排不合理: 没有优先级导致大任务阻塞整体比数进程。

3.引擎参数设置不合理: 并行度不够、数据分块大小等高级参数。

针对以上问题比数平台进行了如下优化:

  • 按不同业务拆分成多个队列来运行,保证各个业务之间的比数任务可以同时进行,不会相互影响。
  • 根因分析使用单独的队列,与数据比对任务的队列分开,避免相互抢占资源发生“死锁”。
  • 相同业务内部按批次分时段、分优先级运行,保障重要任务优先进行比对。
  • 针对Spark引擎默认调优了公共参数、并支持用户自主设置其他高级参数。

通过以上优化达到到了如下效果:

  • 比数任务从每天22点完成提前至18点前,同时支持比数同学自主控制高优任务优先执行,方便比数同学及时处理不一致任务。
  • 通过优化资源队列使用方式,使系统找不到主键辅助用户自主找主键接口响应时间从58.5秒降到 26.2秒。

五、比数平台收益分享

平台持续安全运行500+天,每日可完成2000+任务比对,有效比数128万+次,0误判。

  • 助力计算迁移团队节省45+人日/月,完成数据分析、离线数仓空间任务的比对、交割。
  • 助力存储迁移团队完成20%+存储数据的迁移。
  • 助力引擎团队完成800+批次任务的回归验证,确保每一次引擎发布的安全及高效。
  • 助力SDK迁移团队完成80%+应用的迁移。

六、未来演进方向

接下来,平台计划在以下方面持续改进:

智能分析引擎: 针对Json复杂嵌套类型的字段接入大模型进行数据根因分析,找出不一致内容。

比对策略优化: 针对大表自动切分进行比对,降低比数过程出现因数据量大导致异常,进一步提升比对效率。

通用方案沉淀: 将典型的比对场景和解决方案能用化,应用到更多场景及团队中去。

七、结语

比数平台是得物在迁移过程中,为了应对海量任务、大数据量、字段内容复杂多样、异常数据难定位等挑战,确保业务迁移后数据准确而专门提供的解决方案,未来它不单纯是一个服务计算迁移、存储迁移、SDK迁移、Spark版本升级等需要的数据比对工具,而是演进为数据平台中不可或缺的基础设施。

往期回顾

1.得物App智能巡检技术的探索与实践

2.深度实践:得物算法域全景可观测性从 0 到 1 的演进之路 

3.前端平台大仓应用稳定性治理之路|得物技术

4.RocketMQ高性能揭秘:承载万亿级流量的架构奥秘|得物技术

5.PAG在得物社区S级活动的落地

文 /Galaxy平台

关注得物技术,每周更新技术干货

要是觉得文章对你有帮助的话,欢迎评论转发点赞~

未经得物技术许可严禁转载,否则依法追究法律责任。

如果你在做量化研究、实盘盯盘,或者高频信号监控,可能已经遇到过这样的问题:
港股、美股都要看,但行情接口分散在不同平台,字段不统一、时间规则不同,接入成本远高于预期。

一开始你可能会觉得这是“小问题”,多写几层适配就能解决。但真正跑起来后,会发现维护成本会持续放大,尤其是在高频或长时间运行的场景下。

多市场行情接入,难点并不在“拿到数据”

在实际开发中,真正消耗精力的通常是这些地方:

  • 港股、美股 API 结构差异大,需要额外做字段映射
  • tick 数据更新频繁,处理不当容易阻塞
  • 部分接口在行情活跃时延迟明显,甚至丢数据

这些问题往往不会立刻暴露,但会逐渐影响策略判断和系统稳定性。

一个更工程化的思路:统一数据入口

当你需要长期维护系统时,一个覆盖多市场、数据口径一致的行情源会明显降低复杂度。

在实时行情场景下,相比 REST 轮询,用 WebSocket 订阅的方式更接近“监听市场”而不是“反复查询状态”。
你只需要维护一条连接,就能持续接收行情变化,延迟和资源消耗都更可控。

像AllTick这类聚合型行情接口,本质上解决的是“多市场适配”这个工程问题:
同一套接入方式,同时覆盖港股和美股,不需要为不同市场维护多套逻辑。

实战示例:Python WebSocket 订阅港股+美股


下面是我用的一个简单示例,直接抓取港股腾讯(00700.HK)和美股苹果(AAPL.US):

import websocket
import json

# AllTick WebSocket URL
ws_url = "wss://api.alltick.co/realtime"

def on_message(ws, message):
    data = json.loads(message)
    # 简单打印最新行情
    print(f"{data['symbol']} - 最新价: {data['price']} 时间: {data['timestamp']}")

def on_open(ws):
    # 订阅港股和美股行情
    msg = {
        "action": "subscribe",
        "symbols": ["00700.HK", "AAPL.US"]
    }
    ws.send(json.dumps(msg))

ws = websocket.WebSocketApp(ws_url, on_message=on_message, on_open=on_open)
ws.run_forever()

几个要点:

  • symbols 字段可以自由组合港股、美股股票代码
  • WebSocket 推送省去了轮询的麻烦
  • 我通常会在回调里加一点数据缓存和异常处理,保证程序稳定

实际使用后的变化

在把港股和美股行情统一接入之后,几个变化非常直观:

  • 数据结构统一,策略层代码更干净
  • WebSocket 推送减少了延迟和轮询压力
  • 系统稳定性更好,排查问题更容易

很多之前看起来像“策略不稳定”的情况,实际上是数据层噪音造成的。

实战中需要注意的细节

即便使用统一接口,仍然有一些工程细节需要你自己把控:

  • 时间处理:不同市场交易时间不同,时间戳必须统一标准
  • 高频数据控制:tick 数据建议异步处理或限流,避免内存堆积
  • 调试方式:先订阅少量标的跑通流程,再逐步扩展

这些点不复杂,但直接影响系统是否能稳定运行。

总结

港股和美股的实时行情接入,本身并不是难题。
真正拉开效率差距的,是你是否在一开始就选对了数据接入方式。

统一的数据源、实时推送机制、可维护的结构设计,会让你把更多精力放在策略和逻辑本身,而不是反复处理接口差异。

如果你正在做跨市场行情相关的开发,这个方向值得你认真评估一次。

在图像生成领域,扩散模型因其训练稳定和泛化能力强已逐渐走入主流行列。然而,面对海报、PPT、科普图等需要准确传达复杂信息的「知识密集型」场景时, 传统模型存在指令理解与细节刻画难以兼顾的短板。 另一个长期存在的问题是生成图像中的文字经常出现笔画错误或难以辨识,严重影响实用价值。

基于此,智谱于 2026 年 1 月联合华为开源了新一代图像生成模型 GLM-Image。 该模型基于昇腾 Atlas 800T A2 和昇思 MindSpore AI 框架完成全流程训练。其核心特点是采用了创新的 「自回归+扩散解码器」混合架构(9B 自回归模型 + 7B DiT 解码器), 将语言模型的深度理解能力与扩散模型的高质量生成能力相结合。

此外,模型通过改进 Tokenizer 策略,原生支持从1024×1024 到 2048×2048 的任意比例图像生成,无需重新训练。 GLM-Image 的创新性还体现在以下两个方面:

*解决文字渲染难题: 在 CVTG-2K 和 LongText-Bench 权威评测中,其文字准确率等关键指标均位列开源模型第一,显著提升了图像中文字的生成准确性。

*定义高性价比应用: 在 API 调用模式下,生成单张图片的成本仅需 0.1 元,成本仅为主流闭源模型的 1/10 至 1/3,为商业化应用提供了高性价比选择。

目前,「GLM-Image 精准语义高保真图像生成模型」已上线 HyperAI 官网(hyper.ai)的教程版块, 快来输出无限创意吧!

在线体验: https://go.hyper.ai/2jcCU

效果示例:

Demo 运行

1.进入 hyper.ai 首页后,选择「GLM-Image 精准语义高保真图像生成模型」,或进入「教程」页面选择。页面跳转后,点击「在线运行此教程」。


2.页面跳转后,点击右上角「克隆」,将该教程克隆至自己的容器中。

注:页面右上角支持切换语言,目前提供中文及英文两种语言,本教程文章以英文为例进行步骤展示。

3.选择「NVIDIA RTX Pro 6000」以及「PyTorch」镜像,按照需求选择「Pay As You Go(按量付费)」或「Daily Plan/Weekly Plan/Monthly Plan(包日/周/月」,点击「Continue job execution(继续执行)」。

HyperAI 为新用户准备了注册福利,仅需 $1,即可获得 20 小时 RTX 5090 算力(原价 $7),资源永久有效。


4.等待分配资源,当状态变为「Running(运行中)」后,点击「Open Workspace」进入 Jupyter Workspace。

效果演示

页面跳转后,点击左侧 README 页面,进入后点击上方 Run(运行)。


待运行完成,即可点击右侧 API 地址跳转至 demo 页面


以上就是 HyperAI超神经本期推荐的教程,欢迎大家前来体验!

教程链接:

https://go.hyper.ai/2jcCU

前言

在数字化运维与业务监控的实践中,仪表板(Dashboard)与汽车的仪表盘同等重要,它不仅是数据可视化的载体,更是团队快速定位问题、洞察数据趋势的核心工具。观测云在平台中内置了大量通用组件、云服务的仪表板模板。但如果你希望从零开始构建个性化的仪表板,又或者对自己绘制的仪表板不够满意,那么这篇文章将教授你几个小技巧,帮助你有效提升仪表板的质量。

观测云简介

观测云是一个统一实时监测平台,它提供全面的系统可观测性解决方案,帮助用户快速实现对云平台、云原生、应用及业务的监控需求。观测云的核心功能包括:基础设施监测,日志采集和分析,用户访问监测(RUM),应用性能监测(APM),服务可用性监测(拨测),安全监测,智能监控等等。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用服务的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。更多信息可以访问观测云官网:https://www.guance.com

基础仪表板的绘制

让我们进入到观测云,创建一个属于您自己的仪表板。首先,你需要找到仪表板的入口「场景」-「仪表板」,点击「新建仪表板」-「新建空白仪表板」。

图片

其次,可以从侧滑窗口中选择适合展示数据的图表类型,拖拽到左边的空白画布中。

图片

以常用的「时序图」为例,拖动到画布中即可打开「新建图表」弹窗,此时通过数据筛选控件来选择需要展示的指标。

图片

如图所示,我们已经展示了一条指标曲线,它代表的含义为:指标集为 cpu,指标名为 usage_total,按照 host 进行分组并统计 Avg 平均值,只显示 host=DESKTOP-F9E75IG 的值(过滤条件),点击右下角的保存即可。

图片

此时你已经完成了第一张图表的制作,通过一张张图表的叠加,你很快能得到一个完整的仪表板,不过它看上去有些简陋,我们需要更多技巧对仪表板的美观程度和易读性进行优化。

图片

仪表板的优化

新增标题和描述

恰当的标题能让用户第一时间知道图表展示的指标及其含义,而图表的描述能够起到有效补充说明。我个人的习惯是将图表名设置为指标的英文名,然后在「描述」中补充该指标的中文含义。如下所示:

图片

保存生效的效果如下,图表左上角将展示标题,而鼠标 hover 到帮助按钮上则会悬浮显示描述。

图片

数据单位

一部分指标在采集到观测云后没有单位,因此在绘制仪表板时需要注意补充单位。

图片

别名

图表的曲线会显示对象的名称,并且对象名称会随着分组条件的增多而变得复杂。例如下图,由于添加了 namespace,pod_name 等多个分组条件,对象名称显得很长,很不直观。好在我们可以通过配置「别名」来简化对象名称的显示。

图片

在图表配置的「别名」处,我们选择对应的指标序列,并用 {{}} 将分组条件包起来作为变量,例如下图中的分组条件 pod_name 就写为 {{pod_name}} ,效果如下所示。

图片

我们也支持用多个变量作为别名,写法为 {{分组条件1}}-{{分组条件2}} ,例如 {{namespace}}--{{pod_name}} ,效果如下图所示:

图片

现在,曲线上显示的对象名称已经比原始的名称简洁、清晰了很多。

图例

图表默认没有带上图例,除非将鼠标 hover 上去,否则无法看到什么颜色的曲线代表哪一个对象,如下图的左侧所示。而「图例」则可以将对象的名称和统计值显示到图表中,如下图的右侧所示。

图片

添加图例的方式如下,可选择将图例放置在图表的底部或者右侧,并显示单个或者统计值,将 Avg、Max、Last 一起显示出来是个不错的选择。

图片

分组

当仪表板中需要展示很多张图表时,使用「分组」来将不同含义的图表分门别类地归类就十分有必要了,这会让仪表板的显示更具有条理,用户能通过分组快速找到自己关注的图表,如下图所示。

图片

给仪表板添加分组时,只需要在侧滑菜单中找到「分组」这个图表类型,拖动到左侧画布即可。

图片

取一个有意义的分组名称,选择一个与众不同的颜色,保存即可。

图片

下图即为新创建的分组,后续添加的图表即可拖动到该分组下。

图片

锁定时间

如果你希望每次进入到仪表板,都查看到固定时间区间(例如最近1天)的数据,应该如何实现呢?

我们很容易注意到仪表板的时间控件,可以在这里固定整个仪表板的时间。

图片

如果需要将单个图表的时间进行固定,而其他图表的时间则跟随仪表板的时间控件,也很好实现。我们进入单个图表的编辑窗口,打开「高级配置」,将时间锁定为指定区间即可。

图片

配置完成后,这个图表的右上角会出现你锁定的时间区间,该时间不受仪表板整体的时间区间控制,如下图所示。

图片

视图变量

视图变量允许用户通过下拉菜单来选择特定对象的监控数据,从而根据自身需求动态筛选和分析数据。如下图所示,该仪表板包括了 Cluster、Namespace 和 Node 三个视图变量,用户可以进行自由筛选。

图片

我们首先添加一个简单的视图变量,需求是通过选择 host_ip 来过滤单台主机的数据。在仪表板中点击「添加视图变量」。

图片

图片

host_ip 是 cpu 相关指标数据的一个标签,因此我们从指标类型- CPU指标集里面选择 host_ip 作为视图变量的来源,然后将「变量名」和「显示名」都与之保持一致,保存窗口即可。

图片

此时返回仪表板,就会看到刚才添加的 host_ip 视图变量,从下拉菜单中可以筛选主机 IP。如下图所示:

图片

你可能会发现筛选结果之后,对下方的图表没有任何作用,因为我们还需要在图表中的过滤条件配置变量,使仪表板的额视图变量与图表的过滤条件进行联动。再次进入图表编辑界面,添加一个过滤条件,字段选择为 host_ip,值选择「视图变量」,如下图所示。

图片

返回仪表板,这时仪表板的视图变量 host_ip 就可以与图表中的监控对象 host_ip 进行联动了。我们可以通过下拉菜单来筛选不同的主机,从而观察不同主机的监控指标。

图片

如果是有多个视图变量,且视图变量之间有依赖关系,例如我们针对 Pod 的监控是首先选择 namespace,再选 Pod,那我们又应该如何配置呢?这就要用到「级联」的写法,让我们来再来回顾一下刚才本章开头的那张图片。选择 Cluster 后,Namespace 的值随 Cluster 的取值而联动,Node 的值又随 Namespace 的取值而联动。

图片

我们研究一下这组视图变量的写法,不难发现规律是在 show_tag_value 函数的后面跟随了一个 {key=value} 的过滤条件,其固定写法为 {key='#{value}'} ,key 和 value 都取自上一级的变量名,表示该变量随上一级变量的值而联动。如下图所示,当用户在界面上选择了 cluster_name_k8s 的值后,该值就会传入 namespace 作为过滤条件,从而实现变量联动。

图片

图片

小结

通过上面的几个小技巧,相信你已经跃跃欲试将自己的仪表板更上一层楼了。在得到令自己满意的仪表板后,你可以选择将仪表板开放给团队、配置为定时报告、投放到大屏幕、关联到日志或链路查看器中,又或者在接收到告警时一键查看这张仪表板。我们非常期待你通过仪表板来向你的团队/客户呈现数据的价值。

在早期的Oracle数据库的版本中,一般情况下一个数据库服务器只创建一个数据库。当创建的数据库比较多的时候,就需要更多的数据库服务器。这对服务器资源(CPU、内存、存储)来说是一种浪费。从Oracle数据库 12c开始,Oracle数据库引入了多租户特性,即容器数据库。该特性可以在一个数据库服务器上创建容器数据库,并管理多个可插拔数据库。从而降低了成本并提高了服务器资源的利用率。视频讲解如下:
https://www.bilibili.com/video/BV1fXkeBAEh8/?aid=115920110358...

Oracle Multitenant Container Database(CDB),即多租户容器数据库是从Oracle 12c引入的一个新的特性。它指的是可以容纳一个或者多个可插拔数据库(Pluggable Database,简称PDB)的数据库,这个特性允许在CDB容器数据库中的体系架构创建并且维护多个数据库。在CDB容器数据库中创建的数据库就是PDB数据库,而每个PDB在CDB中是相互独立存在的。在单独使用PDB时,与普通数据库无任何区别。CDB容器数据库也叫作根数据库,其主要作用就是容纳并管理所有相关的PDB数据库及其元数据。CDB也可以单独使用,从操作使用上看,CDB也与普通数据库无任何区别。下图展示了多租户容器数据库的体系架构。
image.png

从图中可以看出,Oracle多租户容器数据库的体系架构由三个部分组成,它们分别是:Root、PDB Seed和PDBs。下表详细说明了每一部分的功能和作用。
image.png

从Oracle数据库 12c R2版本开始,Oracle对多租户容器数据库的功能进行了增强,在CDB root容器中可以创建一个叫做Application Root的容器,可在其内创建多个依赖于Application root的Application PDB。如下图所示。
image.png

要使用Oracle数据库提供的多租户容器数据库的功能,首先就必须要创建CDB的环境。其本质就是创建CDB的根数据库Root。创建CDB中的根数据库Root可以通过DBCA的图形工具来进行创建,也可以通过执行SQL的脚本来创建。

  • 使用DBCA创建根数据库Root
    image.png
  • 使用SQL脚本创建根数据库Root
SQL> create database cdb2  
      user sys identified by password user system identified by password
      logfile group 1 ('/u01/app/oradata/cdb2/redo1a.log',
                       '/u02/app/oradata/cdb2/redo1b.log') size 100m,
              group 2 ('/u01/app/oradata/cdb2/redo2a.log',
                       '/u02/app/oradata/cdb2/redo2b.log') size 100m 
      character set al32utf8 national character set al16utf16  
      extent management local datafile '/u01/app/oradata/cdb2/system01.dbf' size 325m 
      sysaux datafile '/u01/app/oradata/cdb2/sysaux01.dbf' size 325m 
      default temporary tablespace tempts1 tempfile '/u01/app/oradata/cdb2/temp01.dbf' size 20m 
      undo tablespace undotbs datafile '/u01/app/oradata/cdb2/undotbs01.dbf' size 200m
      enable pluggable database 
      seed   file_name_convert = ('/u01/app/oradata/cdb2',
                                  '/u01/app/oradata/cdb2/seed');

在成功创建了CDB环境后,就可以进一步基于根数据库Root来创建多个PDB数据库。

  • 使用DBCA创建PDB
    image.png
  • 使用SQL脚本创建PDB
SQL> create pluggable database cdb1pdb3 admin user pdb3sys identified by password 
     file_name_convert= ('/u01/app/oracle/oradata/CDB1/pdbseed',
                         '/u01/app/oracle/oradata/CDB1/cdb1pdb3'); 

一、什么是国密SSL证书?

国密SSL证书是基于中国自主研发的加密算法(SM2算法)  ,符合国家密码管理局、公安部和工信部的安全标准,旨在提高我国网络通信的安全性和自主可控性。

它的工作原理与传统SSL证书类似,主要用于加密网站通信,确保数据在传输过程中不被第三方窃取或篡改。不同的是,国密SSL证书使用的是国密算法,而非传统的RSA或ECC算法。

二、国密SSL证书的优势

更安全的加密算法

国密SSL证书采用SM2算法,基于椭圆曲线密码技术,相比RSA具有更高的安全性和计算效率。

SM3哈希算法替代SHA系列,避免国际算法的安全隐患。

符合国家政策要求

国密SSL证书由国家认可的机构颁发,符合国内合规要求,适用于政府、金融、医疗等对数据安全要求较高的行业。

双证书兼容性

部分国密SSL证书支持双算法模式(国际算法+国密算法),保证兼容传统国际算法的浏览器,同时在国密环境下运行时使用SM2算法,确保系统过渡平稳。

三、国密SSL证书的申请流程

打开JoySSL官网,注册时填写注册码230970,获取大额优惠跟技术支持。

1. 确定证书类型

根据需求选择合适的国密SSL证书,通常有以下几种类型:

  • 单域名证书(适用于单一网站)
  • 多域名证书(适用于多个站点)
  • 通配符证书(适用于同一主域名下的所有子域名)

2. 生成CSR文件

CSR(证书签名请求)是申请SSL证书时的必要文件,需要在服务器上生成。生成时,需选择SM2算法,并填写组织信息、域名等相关信息。

3. 提交企业认证信息

国密SSL证书需要验证申请者的合法身份,通常需要提供:

  • 企业营业执照或组织机构代码
  • 域名所有权证明
  • 联系人信息(电话、邮箱)

4. 证书颁发与安装

审核通过后,CA机构会签发国密SSL证书,申请者需要将证书安装到服务器上,并配置HTTPS访问。

5. 测试与优化

安装完成后,建议使用SSL检测工具检查证书是否正确安装,同时优化服务器的SSL/TLS配置,确保安全性和兼容性。

四、总结

国密SSL证书基于我国自主的加密算法。相比传统SSL证书,国密SSL证书在数据安全性、合规性和国产化兼容性方面具有明显优势。

申请流程包括选择证书类型、生成CSR文件、提交企业认证信息、证书签发与安装等步骤,整体流程与传统SSL证书类似,但需要确保服务器和应用支持国密算法。

基于YOLOv8的蚊蝇位置智能检测识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!

源码包含:完整YOLOv8训练代码+数据集(带标注)+权重文件+直接可允许检测的yolo检测程序+直接部署教程/训练教程

基本功能演示

https://www.bilibili.com/video/BV1zYrhBxEau/

源码在哔哩哔哩视频简介处

项目摘要

本项目基于 YOLOv8 深度学习检测模型,结合 PyQt5 图形界面,实现了对蚊子和苍蝇的自动检测与定位。项目核心特点包括:

  1. 多输入源支持:可处理单张图片、图片文件夹、视频文件以及实时摄像头输入。
  2. 高精度识别:利用定制蚊蝇数据集训练,准确识别蚊子与苍蝇,同时兼顾背景样本,降低误报率。
  3. 开箱即用:提供完整源码、训练数据、预训练权重及部署教程,用户可直接运行检测系统或继续训练自定义模型。
  4. 可视化界面:PyQt5 图形界面直观展示检测结果,支持边框显示、类别标注、置信度显示等功能。
  5. 灵活扩展:项目结构清晰,可快速扩展到其他小型生物检测任务或多分类目标检测场景。

通过本项目,用户可实现蚊蝇数量监测、位置统计及风险评估,为实验室、公共卫生、农业及城市环境管理提供智能化工具。

前言

随着智能视觉技术的发展,小型害虫检测在公共卫生、农作物管理及环境监测中具有重要意义。传统人工检测方法不仅耗时长、效率低,而且容易漏检或误判。借助 YOLO 系列目标检测算法,本项目提供了一种快速、准确、可扩展的蚊蝇检测解决方案。

项目基于无人机或固定摄像头拍摄的实验样本,通过训练专用数据集,使模型能够在复杂背景下自动识别蚊子和苍蝇位置。结合 PyQt5 图形界面,用户无需掌握深度学习底层技术即可完成检测、可视化及数据统计。

一、软件核心功能介绍及效果演示

核心功能

  1. 图片检测

    • 支持单张图片检测,自动标注蚊子和苍蝇位置。
    • 输出标注图与 YOLO 格式检测结果。
  2. 批量图片处理

    • 支持文件夹中所有图片的批量检测。
    • 自动生成检测报告,包括数量统计及置信度分析。
  3. 视频检测

    • 支持本地视频文件输入,实时识别视频中的蚊子与苍蝇。
    • 可选择保存检测后的视频,标注框清晰展示目标。
  4. 摄像头实时检测

    • 支持 USB 摄像头或笔记本内置摄像头实时捕捉并检测蚊蝇。
    • 界面显示实时检测帧,支持帧率与置信度调节。
  5. 检测结果可视化

    • 在 PyQt5 界面中显示目标框、类别及置信度。
    • 支持结果导出,包括图片、视频和 CSV 数据。
  6. 训练与模型管理

    • 提供完整训练代码与数据集标注示例。
    • 可加载自定义权重继续训练或微调模型。
    • 支持 YOLOv8 标准训练流程,包括训练集划分、超参数配置和结果可视化。

效果演示

  • 图片示例

    • 检测后每只蚊子与苍蝇都会被框出,类别和置信度清晰显示。
  • 视频示例

    • 视频播放时,模型实时标注移动的目标,统计目标数量并可导出检测数据。
  • 实时摄像头示例

    • 界面上可即时显示检测框与数量统计,操作简单,无需命令行操作。

二、软件效果演示

为了直观展示本系统基于 YOLOv8 模型的检测能力,我们设计了多种操作场景,涵盖静态图片、批量图片、视频以及实时摄像头流的检测演示。

(1)单图片检测演示

用户点击“选择图片”,即可加载本地图像并执行检测:

image-20260112012732195


(2)多文件夹图片检测演示

用户可选择包含多张图像的文件夹,系统会批量检测并生成结果图。

image-20260112012821538


(3)视频检测演示

支持上传视频文件,系统会逐帧处理并生成目标检测结果,可选保存输出视频:

image-20260112012846148


(4)摄像头检测演示

实时检测是系统中的核心应用之一,系统可直接调用摄像头进行检测。由于原理和视频检测相同,就不重复演示了。

image-20260112012858804


(5)保存图片与视频检测结果

用户可通过按钮勾选是否保存检测结果,所有检测图像自动加框标注并保存至指定文件夹,支持后续数据分析与复审。

image-20260112012943268

三、模型的训练、评估与推理

YOLOv8是Ultralytics公司发布的新一代目标检测模型,采用更轻量的架构、更先进的损失函数(如CIoU、TaskAlignedAssigner)与Anchor-Free策略,在COCO等数据集上表现优异。
其核心优势如下:

  • 高速推理,适合实时检测任务
  • 支持Anchor-Free检测
  • 支持可扩展的Backbone和Neck结构
  • 原生支持ONNX导出与部署

3.1 YOLOv8的基本原理

YOLOv8 是 Ultralytics 发布的新一代实时目标检测模型,具备如下优势:

  • 速度快:推理速度提升明显;
  • 准确率高:支持 Anchor-Free 架构;
  • 支持分类/检测/分割/姿态多任务
  • 本项目使用 YOLOv8 的 Detection 分支,训练时每类表情均标注为独立目标。

YOLOv8 由Ultralytics 于 2023 年 1 月 10 日发布,在准确性和速度方面具有尖端性能。在以往YOLO 版本的基础上,YOLOv8 引入了新的功能和优化,使其成为广泛应用中各种物体检测任务的理想选择。

image-20250526165954475

YOLOv8原理图如下:

image-20250526170118103

3.2 数据集准备与训练

采用 YOLO 格式的数据集结构如下:

dataset/
├── images/
│   ├── train/
│   └── val/
├── labels/
│   ├── train/
│   └── val/

每张图像有对应的 .txt 文件,内容格式为:

4 0.5096721233576642 0.352838390077821 0.3947600423357664 0.31825755058365757

分类包括(可自定义):

image-20260112013102185

image-20260112013042045

3.3. 训练结果评估

训练完成后,将在 runs/detect/train 目录生成结果文件,包括:

  • results.png:损失曲线和 mAP 曲线;
  • weights/best.pt:最佳模型权重;
  • confusion_matrix.png:混淆矩阵分析图。
若 mAP@0.5 达到 90% 以上,即可用于部署。

在深度学习领域,我们通常通过观察损失函数下降的曲线来评估模型的训练状态。YOLOv8训练过程中,主要包含三种损失:定位损失(box_loss)、分类损失(cls_loss)和动态特征损失(dfl_loss)。训练完成后,相关的训练记录和结果文件会保存在runs/目录下,具体内容如下:

image-20260112013024393

3.4检测结果识别

使用 PyTorch 推理接口加载模型:

import cv2
from ultralytics import YOLO
import torch
from torch.serialization import safe_globals
from ultralytics.nn.tasks import DetectionModel

# 加入可信模型结构
safe_globals().add(DetectionModel)

# 加载模型并推理
model = YOLO('runs/detect/train/weights/best.pt')
results = model('test.jpg', save=True, conf=0.25)

# 获取保存后的图像路径
# 默认保存到 runs/detect/predict/ 目录
save_path = results[0].save_dir / results[0].path.name

# 使用 OpenCV 加载并显示图像
img = cv2.imread(str(save_path))
cv2.imshow('Detection Result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

预测结果包含类别、置信度、边框坐标等信息。

image-20260112013207795

四.YOLOV8+YOLOUI完整源码打包

本文涉及到的完整全部程序文件:包括python源码、数据集、训练代码、UI文件、测试图片视频等(见下图),获取方式见【4.2 完整源码下载】:

4.1 项目开箱即用

作者已将整个工程打包。包含已训练完成的权重,读者可不用自行训练直接运行检测。

运行项目只需输入下面命令。

python main.py

读者也可自行配置训练集,或使用打包好的数据集直接训练。

自行训练项目只需输入下面命令。

yolo detect train data=datasets/expression/loopy.yaml model=yolov8n.yaml pretrained=yolov8n.pt epochs=100 batch=16 lr0=0.001

4.2 完整源码

至项目实录视频下方获取:https://www.bilibili.com/video/BV1zYrhBxEau/

image-20250801135823301

包含:

📦完整项目源码

📦 预训练模型权重

🗂️ 数据集地址(含标注脚本)

总结

本项目基于 YOLOv8 深度学习检测模型与 PyQt5 图形界面,实现了蚊子与苍蝇的高效、智能化检测与定位。通过专用数据集训练,系统能够在复杂背景下准确识别目标,同时提供图片、视频及摄像头多种输入方式。

项目核心优势包括:

  1. 高精度识别:模型在小型目标和复杂背景下表现稳定,误报率低。
  2. 多场景适用:支持单张图片、批量图片、视频和实时摄像头输入。
  3. 可视化与易用性:界面直观,标注清晰,用户无需深度学习经验即可使用。
  4. 可扩展性:源码结构清晰,可快速应用于其他小型生物检测任务或扩展目标类别。
  5. 开箱即用:提供完整训练流程、权重文件和部署教程,用户可直接上手或自定义训练。

整体而言,本项目为公共卫生监测、实验室研究和环境管理提供了一个 快速、可靠、可视化的智能检测解决方案,降低人工检测成本,提高数据收集效率,为小型害虫监控提供了可落地的技术工具。

继上次微软免费的 Microsoft 365 E3 全局 https://v2ex.com/t/1172827

看到隔壁有人发,我想起了去年也验证过,方法很简单,当然前提你有 edu 邮箱,没有的话去 google 搜个社区大学注册。

去年起微软针对教育用户(学生)免费提供 2 年的 Microsoft 365 Premium 订阅。按微软价格的话,大概人民币 3000 多。

Microsoft 365 Premium 以每月 19.99 美元的价格,同时提供微软 Office 套件的使用权限与 Copilot Pro 的功能。该订阅包含更高的功能使用限额,以及 Copilot Labs 、Actions 等 Copilot Pro 专属功能的访问权限等。同时你可以通过电子邮件邀请最多 5 个人加入你的 Microsoft 365 家庭版订阅。

截图

具体方法

必备条件 edu 邮箱。
邮箱

登录你的微软个人账号,依次点击下面链接,进入验证,填写你的大学 edu 邮箱。
邮箱
个人版:
https://checkout.microsoft365.com/acquire/purchase?language=EN-US&market=HK&requestedDuration=Month&scenario=microsoft-365-student&client=poc&campaign=StudentFree12M

高级版:
https://checkout.microsoft365.com/acquire/purchase?language=EN-US&market=HK&requestedDuration=Month&scenario=microsoft-365-premium&client=poc&campaign=StudentPremiumFree12M
我的订阅

支付方式支持 paypal ,支付宝等,验证订阅后,你可以直接取消自动续费,就不会扣费风险!

本文梳理了一套通过 6 个步骤清晰展示系统设计思维的应对框架,包括澄清需求、定义成功标准、画出高层架构、设计数据层,到扩展性与可靠性,最后考虑权衡取舍。

系统设计面试并不是考你会不会背各种技术名词,而是看你能不能在有限时间里,有条理的拆解问题、做出合理的架构决策,并把自己的思路讲清楚

面试的评分标准其实是“思考方式”,而不是“系统有多炫酷”。因此需要一套可重复执行的流程,把几十分钟的面试时间拆分成若干阶段,每一阶段回答一个明确的问题。

接下来就介绍这套能够帮助你顺利通过各种系统设计面试的框架。


50 分钟作战计划

下面是一份 50 分钟时间切片路线图:

- 0–5 分钟:澄清需求
- 6–12 分钟:定义成功标准
- 13–22 分钟:画出高层架构
- 23–32 分钟:设计数据层
- 33–42 分钟:讨论扩展性与可靠性
- 43–50 分钟:收尾与权衡总结

路线图可以按阶段展开,每个阶段都对应面试过程中呈现在白板或文档上的“可见成果”。

阶段 1:先澄清再设计(0–5 分钟)

永远不要直接开始画图。第一步应该是:用问题把“题目”变成“需求”。

可以围绕以下维度澄清:

  • 用户与规模:有多少用户、日活?是 100 万还是 10 亿?
  • 核心用例:最重要的 1~2 个场景是什么?例如仅做照片分享,还是要包含完整的社交功能?
  • 客户端形态:只考虑移动端,还是移动 + Web?
  • 地理分布:是否是全球分布,是否有多区域部署需求?
  • 时延要求:例如“Feed 打开时间需要控制在 500ms 以内”。

对于面试官抛出的“设计 Instagram”之类的问题,可以先反问:

“我们是只关注图片流(Photo Feed),还是要覆盖整个产品?是否支持视频?大致用户量级是多少?”

这一阶段的目标:用 2–3 分钟让双方对“要构建的东西”达成共识,让后面的设计有清晰边界。

阶段 2:写下什么叫“成功”(6–12 分钟)

在澄清了范围之后,第二步是明确定义功能性和非功能性需求,包括:

  • 功能性需求:比如“用户可以上传图片、关注他人、看到关注对象的动态流、对内容点赞与评论”等;
  • 非功能性需求:比如“高可用性(High Availability)达到 99.9%”、“Feed 加载延迟(Latency)小于 500ms”、“可以扩展到 1 亿日活用户”、“允许最终一致性(Eventual Consistency)”。

把这些需求点写在白板上或共享文档中,就相当于和面试官形成了“设计合约”:后续所有架构选择,都要能解释清楚“这是为了满足哪条需求”。

这一阶段的目标:让面试官看到你不是在“凭感觉设计”,而是在对齐“什么设计是成功的”。

阶段 3:先画大图,再补细节(13–22 分钟)

到了真正画架构图的时候,强调一个原则:先画大块(High-Level Components),再深入具体实现,而不是一开始就纠结字段、索引或具体中间件。

典型高层架构可以包括:

┌─────────┐
│  Users  │
└────┬────┘
     │
     ↓
┌─────────────┐
│  CDN/Cache  │
└─────┬───────┘
      │
      ↓
┌──────────────┐      ┌──────────────┐
│ Load Balancer│─────→│ Load Balancer│
└──────┬───────┘      └──────┬───────┘
       │                     │
       ↓                     ↓
┌─────────────┐      ┌─────────────┐
│ API Servers │      │Media Service│
└──────┬──────┘      └──────┬──────┘
       │                    │
       ↓                    ↓
┌─────────────┐      ┌─────────────┐
│  Database   │      │Object Storage│
└─────────────┘      └─────────────┘
  • 客户端(Mobile / Web);
  • CDN(Content Delivery Network)和缓存(Cache),用于分发静态资源与热门内容;
  • 负载均衡(Load Balancer),把流量分发到后端服务;
  • API 服务(API Servers),承载业务逻辑;
  • 媒体服务(Media Service),负责图片/视频的处理与存储;
  • 数据库(Database),保存用户、关系、元数据;
  • 对象存储(Object Storage),保存实际的图片/视频文件。

在讲解数据流时,可以用一句简短的“端到端路径”来串起来,例如:

用户上传图片 → API 服务处理请求 → 媒体服务转码与压缩 
                            ↓
                        写入对象存储
                            ↓
                        在数据库中记录元数据
                            ↓
                        返回可访问 URL

这一阶段的目标:让面试官在脑中形成清晰的“系统鸟瞰图”,知道所有关键组件长什么样、怎么互相连接。此时还不必深入到每个组件内部实现。

阶段 4:谈数据,而不是只谈服务(23–32 分钟)

后半段时间建议重点放在“数据层设计”上,因为这最能体现工程判断力。

可以从以下几个维度展开:

  1. 关系型数据库(SQL)还是非关系型数据库(NoSQL)?

    • 用户资料与关注关系这类强一致(ACID)需求高的场景,更适合用 SQL;
    • 时间线 / Feed 这类读多写少、允许最终一致性的场景,更适合用可横向扩展的 NoSQL。
  2. 数据模型与访问模式:

    • 例如关注关系可以用 follows 表建复合主键,避免重复关注;
    • Feed 可以预计算并按用户保存为去范式(Denormalized)结构,加快读取。
  3. 缓存策略:

    • 缓存哪些内容:用户资料、热门内容、活跃用户 Feed 等;
    • 为什么要缓存:相比直接查数据库,内存缓存(如 Redis)能把几十毫秒的查询压缩到几毫秒,在每秒上万请求的场景下能“挽救”大量数据库资源。
-- SQL 适用于用户与关注关系
CREATE TABLE users (
    user_id BIGINT PRIMARY KEY,
    username VARCHAR(50) UNIQUE,
    created_at TIMESTAMP
);

CREATE TABLE follows (
    follower_id BIGINT,
    followed_id BIGINT,
    created_at TIMESTAMP,
    PRIMARY KEY (follower_id, followed_id)
);
// NoSQL (比如 Cassandra) 更适合
{
  user_id: "user_123",
  feed: [
    {post_id: "post_456", timestamp: 1634567890},
    {post_id: "post_789", timestamp: 1634567850}
  ]
}

这一阶段的目标:展示你能够根据访问模式选择合适的存储,并且讲清楚“为什么这样选”以及“放弃了什么”。

阶段 5:把系统放进真实世界(33–42 分钟)

系统上线后会面对流量波动、节点故障、网络抖动等各种现实问题。这个阶段要重点回答两个问题:

  • 当流量变成 10 倍时,系统如何扩展?
  • 当部分组件失败时,系统如何优雅降级?

可以从以下角度展开:

  • 水平扩展:

    • 应用服务前增加更多无状态实例,通过负载均衡分发;
    • 数据库通过读写分离与只读副本承压。
  • 容错与高可用:

    • 复制:关键数据多副本存储;
    • 熔断器:下游服务异常时快速失败并降级到缓存结果;
    • 限流:防止恶意或异常流量;
    • 优雅降级:尽量提供“部分可用”的体验,例如主功能可用、部分统计或推荐暂时不可用。

熔断器示例代码:

class CircuitBreaker:
    def __init__(self, threshold=5):
        self.failures = 0
        self.threshold = threshold
        self.state = "CLOSED"  # CLOSED, OPEN, HALF_OPEN
    
    def call(self, func):
        if self.state == "OPEN":
            return cached_response()
        
        try:
            result = func()
            self.failures = 0
            return result
        except Exception:
            self.failures += 1
            if self.failures >= self.threshold:
                self.state = "OPEN"
            raise

上面用简短的伪代码演示了熔断器(Circuit Breaker)如何在失败次数超过阈值时“打开”并立即返回缓存数据,面试中不必照搬代码,但可以用语言说明:自己理解“失败隔离”与“自我恢复”的重要性

这一阶段的目标:让面试官看到你不仅会“搭系统”,还能放到高并发、高故障率的真实环境里去思考。

阶段 6:干净利落的收尾(43–50 分钟)

最后 5~7 分钟,重点不是继续加新组件,而是:

  1. 用 30~60 秒复述你的整体方案:

    • 系统主干架构;
    • 关键技术选择(例如 SQL 用在用户与关系,NoSQL 用在 Feed,与 CDN 配合做全局分发);
    • 如何扩展与保证可靠性。
  2. 主动点出几项关键权衡:

    • 比如“用 NoSQL 做 Feed,换来快速读取与易扩展,但牺牲了一些查询灵活性与强一致性”;
    • “预计算 Feed 提升打开速度,但增加了存储开销以及可能短时间内呈现旧数据的风险”。
  3. 抛出开放性问题:

    • 例如:“如果需要,我可以进一步深入某个组件,比如 Feed 生成策略或多区域容灾,您更希望听哪一块?”

这一阶段的目标

  • 把零散的讨论收拢成结构清晰的故事;
  • 让面试官感到“即使时间到了,这个人依然在有条理的思考权衡,而不是随意堆砌技术名词”。

真正的秘诀

系统设计面试中不需要做的事情

  • 不必一上来就报一堆云服务的品牌名;
  • 不必急着切成复杂的微服务;
  • 不必在一开始就画出所有细节;
  • 不必给出“这个就是最佳方案”的结论。

相反,更重要的是:

  • 从澄清问题开始,而不是从方案开始;
  • 按阶段逐步搭建系统,而不是一口气抛出完整架构图;
  • 所有选择都有理由,能讲出“为什么这样设计”;
  • 诚实面对权衡,承认每个选择都有利有弊;
  • 保持对话,主动和面试官互动,而不是独角戏式的画完就走。

这也是为什么同一套技术栈,在不同候选人嘴里,呈现出的“成熟度”会完全不同:真正拉开差距的是“解释方案的方式”和“面对不确定性的态度”。


行动清单

下面是一份非常务实的练习建议,简要整理成可执行清单:

  1. 选 5 个不同的系统设计题,用这套框架完整走一遍;
  2. 给自己计时,习惯在压力下也能按阶段推进;
  3. 录下自己的讲解过程,回看时关注“哪里讲得不清楚、哪里跳步太快”;
  4. 在练习中刻意练习“讲清楚权衡”的能力,而不是背标准答案;
  5. 面试时记住:对方要看的,是思考路径与沟通能力,而不是一张完美无缺的架构图。

要点回顾

  • 系统设计面试考察的是结构化思维与沟通,而不是技术名词堆砌。
  • 在面试过程中,可以用“澄清需求 → 定义成功 → 画大图 → 设计数据层 → 讨论扩展性与可靠性 → 收尾与权衡”这六个阶段来组织自己的输出。
  • 数据层设计是展现工程判断的关键环节,要能结合访问模式解释 SQL / NoSQL、缓存与预计算等选择。
  • 讨论扩展性与可靠性时,应从水平扩展、复制、限流、熔断与优雅降级等角度说明“系统如何在真实世界中生存”。
  • 收尾阶段用简短复盘与权衡总结,把整场讨论串成一个完整故事,并主动邀请面试官选择可以进一步深入的部分。

Hi,我是俞凡,一名兼具技术深度与管理视野的技术管理者。曾就职于 Motorola,现任职于 Mavenir,多年带领技术团队,聚焦后端架构与云原生,持续关注 AI 等前沿方向,也关注人的成长,笃信持续学习的力量。在这里,我会分享技术实践与思考。欢迎关注公众号「DeepNoMind」,星标不迷路。也欢迎访问独立站 www.DeepNoMind.com,一起交流成长。

本文由mdnice多平台发布