videojs v10 源代码系列解读:22 · 无头 UI Core:纯逻辑组件范式

Rocky Linux 手动部署 Hermes Agent 与 Web UI 完整指南 在服务器环境中部署智能体运行时与图形管理界面,容器化虽能快速启动,但手动部署可以带来更可控的资源占用和更短的排障链路。以 Linux 服务器为例,从系统初始化、Python 虚拟环境搭建到服务托管与反向代理,逐步实现一套可交互的 Agent 操作平台。通过 systemd 守护进程确保服务自启,结合 Nginx 代理解决端口暴露问题,并针对高频出现的“会话丢失”现象,从存储、超时与代理配置等维度给出根因分析与持久化方案。本文以 Rocky Linux 9 为示例,完整走通 Hermes Agent 与 He 阅读详情

03 篇用 PlayButtonCore 介绍过「无头 Core」的概念,这篇深入它的全貌。我会用三个代表性 Core 做对比:PlayButtonCore(03 篇讲过,简单按钮)、SliderCore(滑块,纯计算型)、CaptionsRadioGroupCore(列表型,内部有响应式状态)。看完你会发现这个「纯逻辑组件」范式有清晰的分层规则。

范式的统一契约

先看 core/src/core/ui/types.ts(36 行)定义的共享类型:

// types.ts:4-6 — 所有 *-data-attrs.ts 的约束来源
export type StateAttrMap<State> = { [Key in keyof State]?: string };

// types.ts:9-13 — UI 组件的最小契约
export interface UIComponent<State> {
  getState(): State;
  setProps?(props): void;
  getAttrs?(state): object;
}

// types.ts:16-18 — 媒体感知的组件加一个 setMedia
export interface MediaUIComponent<State> extends UIComponent<State> {
  setMedia(media: object): void;
}

// types.ts:25-29 — 按钮型再加响应式状态和 getLabel
export interface MediaButtonComponent<...> extends MediaUIComponent<...> {
  readonly state: State<ComponentState>;
  getLabel(state): Text | string;
}

一个梯度递进的契约族:UIComponent(getState/setProps/getAttrs)→ MediaUIComponent(+setMedia)→ MediaButtonComponent(+响应式 state/getLabel)。

还有类型抽取器(L32-35):InferMediaState(从 setMedia 参数提取)、InferComponentState(从 getState 返回值提取)——平台层包装时用它们拿到精确类型,不用手写。

三种 Core 形态

我读完多个 Core 类后发现,它们分成三种形态,复杂度递增。

形态一:纯逻辑按钮(PlayButtonCore)

03 篇讲过:createState 持有状态、getAttrs 产出 ARIA、toggle 是动作。内部有响应式状态(readonly state = createState(...)),但状态由外部推入(getState() 里 patch)。

形态二:纯计算器(SliderCore)

core/src/core/ui/slider/slider-core.ts(194 行)是另一种形态——完全无状态计算。

它的输入输出分离得很干净:

// slider-core.ts:31-42 — 输入由外部 DOM controller 推入
export interface SliderInput {
  pointerPercent: number;   // 指针位置百分比
  dragPercent: number;      // 拖拽位置
  dragging: boolean;
  pointing: boolean;
  focused: boolean;
}
// 注释 L30:"typically provided by a DOM controller"

键盘语义在 props 层声明(L12-14 的 JSDoc 明确写 “arrow keys”/“Page Up/Down keys”),DOM 层执行——Core 只算,不收事件。

核心全是纯函数(我挑几个):

// slider-core.ts:145-149 — 百分比转值,带步长取整
valueFromPercent(percent) {
  const raw = min + (percent / 100) * (max - min);
  return roundToStep(clamp(raw, min, max), step, min);
}

// slider-core.ts:157-161 — 值转百分比,防除零
percentFromValue(value) {
  if (max === min) return 0;   // L159
  return ((value - min) / (max - min)) * 100;
}

还有一对「取整/不取整」的函数:valueFromPercent(L145,吸附步长——释放时用)和 rawValueFromPercent(L152,只 clamp 不取整——拖动跟手时用)。拖动中要实时跟随(不吸附),释放才吸附到步长。这种细节就是好交互的来源。

adjustPercentForAlignment(L177-186)处理 thumb 对齐:thumbAlignment === 'edge' 模式下,把百分比映射进 [thumbHalf, 100 - thumbHalf] 区间——保证拇指不越出轨道。

getAttrs(L131-143)产出 role: 'slider'、tabIndex: disabled ? -1 : 0、aria-valuemin/max/now——键盘可达性全靠 ARIA 声明,键盘事件在 DOM 层。

形态三:内部持有 slice 的列表组件(CaptionsRadioGroupCore)

core/src/core/ui/captions-radio-group/captions-radio-group-core.ts(147 行)最复杂——内部有 createState,还要从 media 派生列表。

// captions-radio-group-core.ts:56-63 — 内部响应式状态
readonly state = createState<...>({ value: 'off', availability: 'unavailable', /* ... */ });

它的 getState()(L98-120)做派生:

// 简化
const showingIndex = captionTracks.findIndex((track) => track.mode === 'showing');  // L101
// 每项 value: track.id || String(index)   L103 — id 缺失回退索引
// availability: 有轨道即 available       L107-108
// disabled: props.disabled || length === 0   L114
this.state.patch({ /* 数据 */ });          // L110-116
this.state.patch({ label: resolveText(...) });  // L117 — i18n 文本此刻定稿

注意两次 patch 的分离:先 patch 数据,再 patch 解析后的 label——因为 label 依赖刚 patch 进去的数据。

标签回退链(L35-39)也很实用:track.label → track.language → kind === 'captions' ? captionsText : subtitlesText——轨道没名字时用语言码,连语言都没有就用「字幕」默认文案。

select(media, value)(L122-136)的处理链:props disabled return → 空列表 return → 'off' → media.selectSubtitlesTrack('off') → 值不存在 return → media.selectSubtitlesTrack(value)。

三种形态的选型规则

形态代表内部状态适用
纯逻辑按钮PlayButtonCorecreateState(外部推)简单开关型控件
纯计算器SliderCore无(#input 外部设)数值映射型控件
持状态列表CaptionsRadioGroupCorecreateState + media 派生需要从 media 派生列表的控件

共同点:零 DOM。三种形态都不 import DOM API,都能在 html 和 react 两个平台复用。

label 解析的四态压缩

core/src/core/ui/utils/resolve-label.ts(13 行):

export function resolveLabel<State>(label, state) {
  if (isFunction(label)) return label(state) || undefined;  // L8-10
  return label || undefined;                                 // L11
}

把 Text | string | ((state) => Text | string) | undefined 四态压成 Text | string | undefined。label 可以是常量、i18n Text、或根据状态计算的函数(如播放按钮的 label 根据 paused 返回播放/暂停)。SliderCore 和 CaptionsRadioGroupCore 的 getLabel 都先走它,再各自回退默认文案。

和平台层的分工

回忆 04 篇的渲染链:平台元素在 update() 里调 core.setMedia(media) → core.getState() → 把结果写到 DOM。Core 只负责「算」,平台负责「画」。

  • html(44 篇详讲):PlayButtonElement extends MediaButtonElement<PlayButtonCore>,update 里 applyStateDataAttrs。
  • react(49 篇详讲):createMediaButton 工厂包装同一个 Core。

这篇先埋个引子,卷六卷七展开。

小结

无头 UI Core 是「哲学一」(03 篇)的落地。带走几个点:

  1. 契约族递进——UIComponent → MediaUIComponent → MediaButtonComponent。
  2. 三种形态——纯逻辑按钮 / 纯计算器 / 持状态列表,按需选择。
  3. 输入输出分离——SliderCore 的 SliderInput 由 DOM controller 推入,Core 不收事件。
  4. 取整/不取整分离——拖动跟手用 raw,释放吸附用 step。
  5. label 四态压缩——resolveLabel 统一处理。
  6. i18n 在 getState 定稿——patch 数据后再 patch 解析的 label。

下一篇讲 Core 和皮肤之间的桥——data-attrs 序列化和 CSS 变量。

地图打印与 GeoTIFF 导出:框选区域、矢量标绘、一键出图 空间智能实验室 Vol.19:地图打印与 GeoTIFF 导出:框选区域、矢量标绘、一键出图 「把这块区域导成一张带地理坐标的高清图」是个很朴素的需求,但朴素不等于简单。你要在浏览器里框一个框、画几个箭头标个文字、叠一层 阅读详情

相关推荐

Dify平台+Excel批量分析实战:5分钟搞定大模型数据处理(附完整代码)

本文详细介绍了如何利用Dify平台的数据集功能,结合Excel和Python脚本,快速构建大模型批量数据处理流水线。通过实战案例演示,读者可在5分钟内完成客户反馈情感分析、产品文案生成等任务,实现从原始数据到结构化洞察的高效转化,极大提升工作效率。

3a9bq4r8t2y的博客 316

Web 版翻译者资料库

本项目是桌面版《翻译者资料库》的 Web 移植版,基于 Spring Boot 3.3、Thymeleaf、Bootstrap 5.3 与 MySQL 8.0 构建。它面向翻译写作提供资料、词汇、句库、文本工具、对照制作、查找、备份恢复及旧库迁移等功能,完整继承桌面版核心业务规则,支持一键启动与离线访问。

howard2005的专栏 140

OpenWrt路由开启DDNS+端口转发进行外网访问

OpenWrt路由开启DDNS+端口转发进行外网访问(LuCI界面实现)--开篇一、准备工作二、开机!三、连接--结尾 –开篇 本篇适用于一切装有OpenWrt系统的路由器/软路由,只要你保证有WAN接口和一个光猫,甚至你不需要有LAN接口(当然前提是你能连接路由器的WIFI进后台,不然你只能通过LAN进后台咯)。所有的配置过程都是基于LuCI界面来的,当然大神们一般都通过SSH登陆路由使用命令配置,但我也不会啊,只能给个有GUI界面的教程了。 一、准备工作 一个装有OpenWrt系统的路由器/软路由并

秋之颂的博客 9万+

Jackson 序列化 / 反序列化注解 完整版笔记

Jackson 序列化 / 反序列化注解 完整版笔记

handsome_sai的博客 272

手把手搭建摄像头驱动(一):I2C设备树插件与OV5640实战

本文手把手指导如何搭建OV5640摄像头驱动,重点讲解I2C设备树插件的编写与实战应用。通过硬件连接验证、I2C驱动框架搭建、设备树插件编译及动态加载调试,系统介绍Linux驱动开发全流程,并提供常见问题解决方案,帮助开发者快速掌握摄像头驱动开发技术。

git9versioner的博客 754

自偏置电流镜设计实例

自偏置电流镜设计实例 一、概述 ​ 众所周知,电流镜属于模拟电路设计中的一个基本模块,可为其他模块提供偏置电流,例如在放大器中提供偏置电流以形成尾电流源并确定直流偏置点。本文将会介绍一种自偏置的电流镜,从原理出发,并以0.18um的工艺进行设计和仿真。 二、原理 ​ 如图一所示的电路,也称之为Beta-multiply reference电路,其中M2的尺寸是M1的k倍。M3复制M4的电流,M2和M1的漏极电流相同,但是VGS并不相等。其中 VGS=2IμnCoxW/...

aonuanjiang的博客 1万+

【项目推荐】基于 SpringBoot3 + Spring AI 的游泳馆管理系统:Agent + RAG + Function Calling 一次学全

它不是玩具 Demo,而是一个「业务 + AI」双主线交织的真实系统——预约业务在跑,AI 客服在旁边实时查库作答,两条线通过 Function Calling、RAG、站内消息串成一体。面试官问「你做过什么 AI 项目」时,你能从业务场景讲到架构取舍,从 RAG 切分参数讲到降级兜底——这和「我调了一下 ChatGPT 的 API」是完全不同的两个段位。项目已包含完整的建表 SQL、初始化数据、部署文档,克隆下来就能跑。获取方式:见文末说明 / 后台回复关键词获取。—— 完 ——

深耕开发,专注编程实战。分享源码解析、项目搭建、问题排查笔记,沉淀技术,持续更新。 347

基于wxWidgets框架,使用DialogBlocks建立OpenGL界面

前言 之前公司要求使用wxWidgets做GUI,基于OpenGL图形内核,开发三维可视化工具。目前初步开发工作基本已经完成,剩下都是完善了。这里记录一下最开始的框架搭建过程(当然是简化版啦)。wxWidgets结合OpenGL开发可以实现跨平台应用,再结合CMake和VS Code,整体开发工具用习惯了会感觉非常顺手。 界面编辑 首先,使用DialogBlocks新建一个工程,这里工程目录...

cyberobot的博客 2750

MCP 协议会成为前端 AI 工程的标准接口吗?

MCP(Model Context Protocol)正在成为连接 AI 模型与外部工具、数据源的一层通用协议。本文从 MCP 的核心机制出发,分析它在浏览器与前端工程中的落地边界,讨论它能否成为前端 AI 工程的标准接口,并给出当下更务实的架构选择建议。

m0_62937412的博客 336

道路缺陷检测实战指南:基于YOLOv11的深度学习系统从搭建到落地

道路缺陷检测项目的每一步,都是“理论→实践→反思→优化”的成长循环。当你看到自己开发的系统能精准识别出道路上的每一处裂缝、每一个坑洼时,那种“技术解决真实问题”的成就感,会让你明白深度学习不止是论文里的公式,更是改变行业的工具。如果过程中遇到模型不收敛、界面功能异常等问题,不妨把问题拆解成“数据是否标注准确?”“模型参数是否合理?”“界面逻辑是否有漏洞?”等小问题逐一排查。记住,每解决一个问题,你就离“能独立落地AI项目的工程师”更近一步。

LXY_LOVE36的博客 171

基于分水岭分割进行肺癌诊断

近年来,肺癌的发病率和病死率均迅速上升,目前已居所有癌症之首。随着肺癌病人数量的增加,医生对肺部 CT 图像进行研判的工作量也增加了不少,在这种情况下难免工作效率降低甚至会出现误诊。为了帮助医生减少重复性工作,对肺部 CT 图像进行计算机辅助检测的技术就被广泛应用于对肺癌的诊断和治疗过程中。医学 CT 图像处理主要是研究医学图像中的器官和组织之间的关系,并进行病理性分析。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1568

LangGraph 本地 build 频频翻车,最终在服务器跑通流式对话

先说结论:我本地那个,一次都没成功过。三次,三次,全挂在拉镜像上。而顺得像刚上过油。这就很像我高中那辆自行车:骑着能走,一上锁就坏。那天晚上我盯着终端里那行红字看了很久,想的不是技术方案,想的是——为什么同一个工具,可以一边让我觉得自己很行,一边让我觉得自己不太行。

人工智能AI技术 97

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

海外平台频繁弹验证?从 DNS、WebRTC 到浏览器指纹的环境异常排查清单

在运营多地区海外平台账号时,即使代理节点通畅、TCP 握手成功,仍可能遇到频繁人机验证、地区限制、播放失败等异常。核心结论是:这类问题往往不在网络传输层,而在浏览器环境参数与网络出口之间的逻辑自洽性。本文从 DNS 泄漏、WebRTC 穿透、时区与语言匹配、Canvas/WebGL 指纹、TLS 特征五个维度,给出一份可复现的环境异常排查清单,并对比个人手动配置与工程化环境管理方案的适用边界。适用于跨境运营、多账号运维团队。

P1Browser【p1指纹浏览器】的博客 183

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

智能问诊的流程

本文介绍基于FastAPI构建的医疗多Agent系统MediAgent,通过症状分析、诊断推理与治疗建议等模块协同,实现从问诊到报告生成的完整工作流。系统采用前后端分离架构,结合MySQL、RabbitMQ与Docker实现工程化部署,支持异步化验结果接入。虽当前状态暂存于内存,但已具备可扩展性,未来可通过Redis持久化、消息队列联动及医疗安全机制完善,应用于慢病管理、辅助决策等场景,推动AI在医疗流程中的落地应用。

Joey 的工作空间~ 773

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

信号链电路怎么选运放?奥特四款信号链运放解析【选型参考】

在模拟电路设计中,运放作为信号链的“第一道门槛”,其微小误差往往决定了整个系统的成败。

naNa_1120的博客 191

流式输出 SSE:实现 AI 对话打字机效果后端开发

摘要解决传统 HTTP 请求在 LLM 长文本生成时导致的客户端长时间阻塞与 TTFT 极高的问题。适用于需为 AI 应用提供打字机效果、优化交互体验的后端开发工程师。读完可获得基于 FastAPI 与 SSE(Server-Sent Events)技术的流式响应实现代码、协议规范及生产环境避坑指南。关键词SSE、流式输出、FastAPI、打字机效果、TTFT、大模型推理背景与问题大模型(LLM)生成完整回复通常耗时数秒至数十秒,传统请求-响应模型导致用户界面长时间无响应,体验极差。

2402_85729970的博客 181

基于 YOLOv8 的森林火灾检测系统(Web 版)

本项目面向林区早期火情识别场景,使用YOLOv8完成火焰(Fire)与烟雾(Smoke)两类目标的检测模型训练,并以FastAPI构建 Web 检测平台,把模型能力封装为可直接登录使用的系统。平台除常规的图片、批量、视频、摄像头检测外,还提供同图多权重对比、数据集浏览与标注核对、模型热切换,以及把训练搬到网页上的能力:可在浏览器配置超参数发起真实训练,训练中在线调整学习率、查看进度与动态曲线,训练完成后下载产物或直接应用到检测。

Michael_Jay的博客 62

身份验证漏洞专题(三):持久登录、密码重置与密码修改中的凭据绑定缺陷

密码登录与双因素认证是身份验证的主干流程,但一个完整的认证体系还依赖三类辅助机制:持久登录("记住我")、密码重置、密码修改。这三类机制的共同特征是:它们同样携带或验证凭据,同样直接决定认证状态的归属,但实现时获得的防护强度往往远低于登录页面本身。攻击者绕不开登录接口时,常常可以从这些辅助入口进入。

2401_85321170的博客 630

二进制木马免杀-Python 分离免杀与 Web 挂马

二进制木马免杀-Python 分离免杀与 Web 挂马

2503_94637398的博客 268

Vue 前端开发 AI 对话页面:流式消息渲染、文件上传

关键点是不能手动设置 Content-Type 为 multipart/form-data,必须由浏览器自动生成带有 boundary 的请求头,否则后端无法解析。思路:将对象序列化为 JSON 字符串,作为 FormData 的一个普通字段(如 formData.append(‘payload’, JSON.stringify(data))),后端接收该字段后再反序列化。若上传大文件(>10MB),需实现独立的分片上传接口,在提交对话前先获取文件 id 或 url,再随文本发送引用。移除输入框的禁用态;

2402_85729970的博客 388

在Open-WebUI中提升向量化速度

让Open-WebUI AI聊天的向量化过程不超过10秒,而不是默认的20+分钟……

xyzzklk的博客 574

Writeup 4 0xGame 2021 · command (WEB)

前端限制不可信:永远不要相信前端的任何限制(如disabled按钮、JS 验证等)。攻击者可以直接构造 HTTP 数据包绕过前端校验,所有的安全限制必须在后端实现。命令执行/注入(RCE):Web 应用如果直接调用系统命令且未对输入进行严格过滤,攻击者可以利用;||等符号拼接恶意命令。绕过技巧:在 CTF 中,如果遇到命令执行被过滤,常见的绕过方式包括:${IFS}$IFS$9等。。cat /fla?或cat /fl*。Linux 基础。

hengdonghui的博客 131

使用HTML+CSS+JavaScript实现文件上传弹窗

使用HTML+CSS+JavaScript实现文件上传弹窗

bjzhang75的博客 207

ArkWeb 混合开发的内存清理与桥接陷阱

起初我以为是 H5 内部的定时器没有清理,结果接了 DevEco Studio 的 Profiler 一看,全是 ArkTS 侧的原生对象没有释放。改用 RESIZE 后,键盘弹出只会压缩窗口高度,底部的输入框会自适应滚动到可视区域,页面顶部的元素则岿然不动。综上所述,混合开发绝不是简单的拼接,管好桥接的生命周期,做好跨域兜底,才是稳定运行的前提。如果不去主动干预,它会把你的原生内存吃得连骨头都不剩。在 H5 的输入框打字时,软键盘一弹出来,整个 Web 页面就被顶得飞起,连顶部的原生导航栏都不见了。

2502_91284977的博客 235

热工测点布线改造难题?IDCB 远程 I/O 采集前端简化现场布线

IDCB智能数据采集前端基于Modbus-RTU协议,支持热电偶、热电阻、直流信号多类型混采,单设备多通道接入,减少模块选型压力。双总线冗余设计保障数据连续性,适配锅炉、窑炉等高可靠性工况。采用总线式布线替代点对点接线,大幅减少电缆用量,配合组态软件或LCD面板,实现远程监控与现场调试便捷化。适用于脱硫脱硝、就地监控及系统改造项目,具备抗干扰、隔离保护、掉电存参等特性,有效提升热工测点采集系统的稳定性与运维效率。

wxyzzdh200988的博客 192
上一篇: videojs v10 源代码系列解读:21 · 逐个解析核心 Feature
下一篇: videojs v10 源代码系列解读:23 · 数据属性序列化与 CSS 变量桥接
逻辑玩家
博客等级 码龄19年 75粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值