2026年1月

本周AI领域迎来密集进展,大模型在动漫生图(Niji V7)、端侧智能(AgentCPM-Explore)、医疗(Baichuan-M3)、多模态生图(GLM-Image)、视频生成(Veo 3.1、PixVerse R1)及机器人(1X World Model、LimX COSA)等垂直场景实现性能突破与场景适配;AI工具则聚焦电商、办公、音频处理等高频需求推出,Google UCP、Claude Cowork、Voice-Pro等高效解决方案,技术则在药物研发(DrugCLIP)、大模型部署(Engram模块)、生物研究(Stack模型)等领域实现跨学科赋能,一起来回顾本周的AI新鲜事儿吧!

AI 大模型

Midjourney联合推出动漫风格AI生图模型「Niji V7」

1月9日,Midjourney联合推出动漫风格AI生图模型「Niji V7」,核心更新包括图像质量提升(连贯性增强、细节如眼睛反射、花瓣更清晰,实现“高清升级”)、提示词遵循能力强化(精准理解位置/数量等具体请求,sref风格参考功能向前兼容,cref角色参考暂不支持)、设计美学突破(线条可传达更多形体质感信息,支持简约风格留白,线条与空间结合呈现更平面化效果),且个性化与情绪板功能即将上线。实测线条流畅、细节优化,但复杂场景和中式风格仍有不足。

OpenBMB开源社区联合发布4B「AgentCPM-Explore」端侧智能体模型

1月13日,OpenBMB开源社区联合清华大学自然语言处理实验室、中国人民大学及面壁智能发布4B参数的「AgentCPM-Explore」端侧智能体模型,是首个支持GAIA、Xbench等8个长难智能体任务的4B模型,可实现100+轮稳定环境交互,在主流评测基准上取得同尺寸SOTA表现,越级赶超8B级模型、比肩部分30B级以上及「Claude-4.5-Sonnet」等闭源大模型,还展现出“质疑”“求真”等类人思考逻辑,通过模型融合、信号去噪、信息精炼三大技术破解小模型训练难题,全流程开源AgentDock工具沙盒平台、AgentRL强化学习框架与AgentToLeaP一键测评平台支持复现与扩展。

Arc研究所开源单细胞基础模型「Stack」与「Perturb Sapiens」图谱

1月13日,Arc研究所宣布开源首个无需重新训练即可学习新任务的单细胞基础模型「Stack」及预测性细胞反应全景图谱「Perturb Sapiens」,「Stack」基于1.49亿个人类单细胞数据预训练、5500万个细胞后训练,通过表格化Transformer模块、基因模块表征符的架构创新及上下文学习的训练策略创新,能以细胞为“提示”预测目标细胞群在全新环境中的反应,在零样本下游任务中表现优于基线模型和现有方案;「Perturb Sapiens」则依托其能力生成约20000个“细胞类型-组织-扰动”预测组合,填补了相关实验空白,模型及图谱均已开源。

百川智能发布开源新一代医疗大模型「Baichuan-M3」,医疗幻觉率降至3.5

1月13日,百川智能正式开源新一代医疗大模型「Baichuan-M3」,在全球权威医疗AI评测HealthBench等多项权威评测中全面超越「GPT-5.2」,且以3.5的全球最低幻觉率刷新行业底线(通过将医学事实一致性融入训练实现)。该模型创新提出“严肃问诊范式”与SCAN原则,借助SPAR算法和SCAN-bench全流程动态评测体系,具备原生端到端严肃问诊能力,在安全分层、信息澄清等四大维度显著高于真人医生平均水平,同时其医疗应用「百小应」已同步接入该模型向医生与患者开放。

美团龙猫LongCat升级全新稀疏注意力机制「LoZA」,解码快10倍

1月13日消息,美团龙猫LongCat系列升级全新稀疏注意力机制「LoZA」(LongCat ZigZag Attention),通过给MLA模块配可学习权重α筛选50%低重要性模块替换为线性复杂度的SSA,形成ZigZag交错结构并设计1024 Token稀疏窗口,在中期训练阶段即可完成改造,使模型上下文窗口从256K扩展至1M,128K文本解码速度快10倍、256K预加载提速50%且解码省30%算力,日常任务性能持平原版,长文本任务表现更优,还计划支持动态稀疏比例及多模态长内容处理。

1X公司为家用人形机器人NEO推出全新世界模型「1X World Model」

1月13日,1X公司为家用人形机器人NEO推出全新世界模型「1X World Model」,相关内容浏览量超500万次。该模型基于视频预训练技术,通过“世界模型主干(文本条件扩散模型,经互联网视频预训练、人类第一视角中期训练、NEO专属微调)+逆动力学模型IDM”两阶段对齐,无需大规模机器人数据即可泛化到全新物体、动作与任务,能通过生成“成功完成任务”的视频倒推动作轨迹,支持抓取、双手协调、人机交互等任务且保持稳定成功率。

智谱与华为联合开源首个基于国产芯片训练的SOTA生图模型「GLM-Image」

1月14日,智谱与华为联合发布中国首个全程基于国产华为Ascend A2芯片及昇思MindSpore框架训练的SOTA多模态生图模型「GLM-Image」,采用“9B自回归模型+7B DiT扩散解码器”混合架构,擅长文字精准渲染,拿下CVTG-2K和LongText-Bench双榜单开源第一,原生支持1024x1024至2048x2048任意尺寸,API调用仅0.1元/张,可适配小红书封面、商业海报等多场景,已开源并提供多个平台接入地址,印证了国产算力底座支撑前沿模型训练的能力。

Google升级视频模型「Veo 3.1」,首次原生支持9:16竖屏视频

1月14日,Google升级视频模型「Veo 3.1」,首次原生支持9:16竖屏视频(适配YouTube Shorts等移动端平台,无需裁剪)并新增4K分辨率,同时提升创意能力(简单提示词可生成小剧场)、强化角色与背景物体一致性(跨场景保持元素完整)、改善元素融合能力(无缝组合多图元素),普通用户可通过YouTube Shorts、Gemini等体验,企业用户可借助Flow、Gemini API等使用;Google依托YouTube的平台、流量与生态优势,形成“创作-分发-反馈-优化”正向循环,而AI视频竖屏化已成趋势,OpenAI、迪士尼及国内可灵AI等均有相关布局。

爱诗科技发布全球首个通用实时世界模型「PixVerse R1」

1月14日,爱诗科技发布全球首个支持最高1080P分辨率实时生成的世界模型「PixVerse R1」,区别于传统AI视频的高延迟、固定时长与单向生成,凭借Omni原生多模态模型(统一多模态为连续Token流)、自回归流式生成机制(支持无限时长与长时序一致性)、瞬时响应引擎IRE(采样步骤1-4步,效率提升数百倍)三大技术创新,实现瞬时响应、实时共创,支持多模态交互与最高1080P输出,开启视频即交互、世界可共创的新范式,适用于游戏、电影、直播等场景。

生数科技Vidu AI开放平台发布「一键生成AI MV」功能

1月14日,生数科技Vidu AI开放平台发布「一键生成AI MV」功能,依托深度协同的多智能体系统,用户仅需提交音乐、1-7张参考图及文本指令,即可全自动实现分钟级输出(适配10-300 S主流流媒体时长),通过攻克角色与风格一致性、歌词驱动叙事、帧级音画融合等行业痛点,解决了传统“手工作坊”模式的效率与质量瓶颈,大幅降低创作门槛、压缩成本(刊例价为同行业50%),推动音乐视觉内容叙事权从主流机构向个体创作者转移,定义了AI原生MV的质量基线,重塑音乐产业生产与消费范式。

AI 工具

Google发布专为AI智能体设计的通用商业协议「UCP」及「Gemini CX」

1月12日,Google官宣发布Agentic电商解决方案,包括专为AI智能体设计的通用商业协议「UCP」(Universal Commerce Protocol)及企业端的「Gemini CX」(Gemini Enterprise for Customer Experience)。「UCP」接入Shopify、沃尔玛等伙伴,贯穿商品发现到售后全流程;「Gemini CX」具备复杂推理、多模态交互、执行授权操作能力,可覆盖客户服务全生命周期,已落地麦当劳等企业;国内阿里、1688、京东、抖音也纷纷推出电商相关AI工具与功能。

Anthropic基于Claude Code底层架构推出智能协作工具「Claude Cowork」

1月13日,Anthropic基于Claude Code底层架构推出智能协作工具「Claude Cowork」,核心定位是从“对话助手”转变为能理解任务、制定计划并持续执行的“数字同事”,支持用户授权访问指定本地文件进行分类、信息提取、报告整理等非编码工作,还具备内置虚拟机隔离、浏览器自动化支持等创新体验与安全功能。目前以研究预览版形式面向macOS平台的Claude Max订阅用户开放,后续计划加入跨设备同步、Windows版本及强化安全机制。

夸克AI浏览器上线千问划词「快捷指令」功能,划选即调用告别复制粘贴

1月13日,夸克AI浏览器上线千问划词「快捷指令」功能,用户只需三步(开启划词工具栏、添加自定义指令并命名保存)即可完成设置,浏览网页或文档时划选内容便能一键调用AI指令,无需复制粘贴,该功能提供了学术润色、种草文案撰写、情侣聊天支招、内容创作润色、代码优化、外语翻译、职场黑话解读等多场景指令模板,助力提升各类场景下的使用效率。

5.6K Star开源神器「Voice-Pro」,免费本地实现视频翻译+声音克隆

1月13日消息,GitHub上5.6K Star的开源工具「Voice-Pro」原是韩国创业团队的付费软件,现因新项目开发停止维护并完全开源,它整合WhisperX、F5-TTS等先进语音模型,在Windows等主流PC平台实现“视频下载-人声分离-字幕识别-文本翻译-声音克隆配音-视频合成”一站式本地运行,支持100多种语言处理、零样本语音克隆,无需代码,通过脚本即可轻松安装,免费无字符限制且不上传云端,是ElevenLabs等商业工具的优质替代方案,适配视频创作者和出海玩家需求。

Vercel Labs开源AI Agents浏览器自动化CLI工具「Agent-browser」

1月14日,Vercel Labs发布开源AI Agents浏览器自动化CLI工具「Agent-browser」,发布两天即获3.4k GitHub星,相比传统Playwright MCP可节省93%上下文,其中外层基于Rust编写,通过返回清洗后的可访问性树并为可交互元素打标签(Ref),让AI以简单指令精准操控浏览器,零配置且支持无头/有头模式,兼容多款AI工具,能降低Token消耗、提升AI注意力与稳定性,安装仅需两步命令。

技术突破

清华团队研发的AI药物虚拟筛选平台「DrugCLIP」登上Science

1月9日,清华大学联合团队研发的AI药物虚拟筛选平台「DrugCLIP」相关成果发表于《Science》,其通过语义检索技术实现筛选速度较传统方法提升百万倍,首次完成人类基因组规模虚拟筛选,实验验证对NET、TRIP12等靶点的筛选有效性,构建全球最大蛋白-配体筛选数据库并免费开放,配套服务平台已服务千余名用户,未来将助力抗癌、罕见病等领域新药研发。

逐际动力发布全球首个具身智能体系统「LimX COSA」

1月12日,逐际动力在深圳正式发布具身智能体系统「LimX COSA」,这是面向物理世界原生、深度融合高阶认知与全身运控的Agentic OS,采用自底向上的小脑基础模型、大小脑融合高阶技能层、自主认知决策层三层结构,赋予全尺寸人形机器人Oli高阶认知推理、语义记忆与主动感知、实时感知全身移动操作三大核心能力,实现“能想能动、知行合一”,标志着具身智能从Demo迈向产品落地,推动多领域的广泛应用。

DeepSeek V4核心技术「Engram」曝光:CPU替GPU存参,性能与降本双突破

1月13日,DeepSeek联合北京大学发布新论文,曝光「DeepSeek-V4」核心技术「Engram模块」,该模块基于N-gram改造,通过哈希函数映射与门控机制快速检索静态知识,以CPU内存替代GPU显存存储大规模参数(推理损耗<3%),相关模型在知识、推理、代码、长文本任务上显著优于现有模型,印证V4性能突破,降低超大规模模型部署成本。

在企业级表格应用场景中,排版规整度直接影响文档的专业质感与可读性——无论是财务报表、项目方案还是正式汇报材料,文本在单元格内的分布均匀性往往成为细节加分项。此前,面对“文本两端对齐”这一高频排版需求,开发者常需通过复杂自定义实现,且难以保证与Excel的兼容性。

SpreadJS V19.0 正式推出单元格两端对齐(Justify Alignment) 功能,完美复刻Excel排版逻辑,兼顾美学呈现与实用体验,为纯前端表格应用带来排版升级,让专业文档制作更高效、更精准。

在这里插入图片描述

一、核心功能:双向对齐,文本分布更均匀

两端对齐功能提供水平与垂直两个维度的精准排版能力,适配不同文本展示需求,实现“边界对齐、内部均匀”的视觉效果:

1. 水平两端对齐(Horizontal Justify)

  • 核心逻辑:每行文本的首字符紧贴单元格左边界,末字符对齐右边界,仅最后一行保持左对齐
  • 实现原理:通过智能调整字间距与行间距,让文本在水平方向均匀分布,避免单侧留白过多的问题
  • 适用场景:长文本段落展示(如项目说明、备注信息)、多列数据标签对齐

2. 垂直两端对齐(Vertical Justify)

  • 核心逻辑:文本首行紧贴单元格上边界,末行对齐下边界;若仅含一行文本,则保持顶部对齐
  • 实现原理:通过调整行间距优化垂直方向分布,解决多行文本垂直居中时上下留白不均的痛点
  • 适用场景:高单元格内多行文本书写(如产品描述、规格说明)、复杂表格布局中的文本适配

3. 组合对齐:水平+垂直双向优化

支持同时启用水平与垂直两端对齐,让文本在单元格内实现“上下左右全边界对齐、内部均匀分布”,适用于对排版精度要求极高的正式文档(如财务报表附注、合同条款)。

二、特性亮点:适配多元场景,兼顾兼容性与灵活性

1. 自动换行强制启用,无需手动配置

启用两端对齐时,系统将自动开启“自动换行”功能,文本将根据单元格宽度智能拆分换行,避免因手动设置遗漏导致的排版错乱,降低操作门槛。

2. 无缝适配合并单元格

针对合并后的大尺寸单元格,两端对齐功能可根据合并后的实际宽高自适应调整文本分布,无需额外设置适配规则,完美支持复杂表格布局(如报表标题、分类汇总区域)。

3. 普通文本与富文本全面支持

无论是基础纯文本,还是包含字体样式、颜色、链接的富文本,均可正常使用两端对齐功能。仅需注意:富文本在旋转文本场景下需遵循特殊适配逻辑,确保排版一致性。

4. 智能分词规则,适配多语言场景

针对不同语言文本的排版特性,两端对齐功能内置智能分词策略:

  • 普通文本:按空格分词,多个连续空格仅第一个用于分词,其余保留为文本一部分(例:"This a word" 分词为 ["This", " a", " word"])
  • CJK(中日韩)文本:整体视为一个“词”,但内部空格可作为分割依据(例:"这是Example サンプル예시" 分词为 ["这是", "Example", "サンプル", "예시"])
  • 支持自定义分词逻辑:通过 CultureManager 配置分词规则,满足特殊业务场景需求

三、使用场景:覆盖企业级文档核心需求

  1. 财务报表制作:会计科目说明、报表附注等长文本区域,通过水平两端对齐实现多列文本整齐排列,提升报表专业度
  2. 正式文档导出:需导出为PDF的合同、方案文档,通过双向两端对齐保证与Excel源文件排版一致,避免导出后格式错乱
  3. 复杂表格布局:合并单元格较多的仪表盘、数据看板,通过垂直两端对齐优化文本垂直分布,让界面更规整
  4. 多语言文档处理:支持中英文、中日韩等多语言文本的均匀排版,适配国际化业务场景

在这里插入图片描述

四、注意事项:这些细节让排版更精准

  1. 自动换行强制生效:启用两端对齐后,将忽略手动关闭的“自动换行”设置,优先保证排版效果
  2. 部分功能兼容限制:

    1. 缩小字体填充(shrink to fit):多行文本场景下不生效,两端对齐逻辑优先
    2. 显示省略号(ellipsis):两端对齐功能优先生效,省略号设置将被忽略
    3. 缩进(indent):水平两端对齐时,缩进设置无效,文本将紧贴左右边界
  3. 富文本特殊适配:旋转状态下的富文本需注意排版预览,建议结合实际效果调整单元格尺寸

五、总结:排版升级,效率与专业度双提升

SpreadJS V19.0 两端对齐功能的推出,不仅填补了纯前端表格在专业排版领域的空白,更通过“Excel兼容、智能适配、低操作门槛”的设计,让开发者无需编写复杂自定义代码,即可快速实现高质量排版效果。

无论是企业级报表制作、正式文档导出,还是复杂表格布局设计,这一功能都能有效提升文档质感与可读性,同时降低开发与维护成本。SpreadJS 始终以“复刻Excel体验、赋能前端开发”为核心,持续优化细节功能,让纯前端表格应用更贴合企业实际业务需求。

SpreadJS V19.0 即将正式发布,更多实用特性等待解锁,敬请期待!如需提前体验两端对齐功能,可访问 SpreadJS 官方Demo 或联系技术支持获取试用版本。

聊聊复制过滤的那些隐藏陷阱

适合读者:DBA / 后端架构师 / 运维工程师

关键词:MySQL 复制、binlog_do_db、replicate_do_db、数据不一致

一、背景

在许多 MySQL 体系的数据库环境中,为了降低 binlog / relay log 日志量、缓解从库复制压力或减少同步延迟,往往会引入 主库 binlog 过滤从库复制过滤 的配置方案。 这些手段在一定程度上能够缓解资源消耗,但如果对其工作机制理解不充分,使用了不合理的过滤策略,极易引入隐蔽且不可逆的数据不一致风险。更为危险的是,这类问题在系统运行过程中通常不会立刻暴露,当业务侧发现数据异常时,往往已经无法通过常规手段进行补救。

本文将从 主库与从库两种过滤方式的实现机制入手,分析它们各自的优缺点及潜在风险。

二、复制过滤的判断逻辑

明确主库和从库在处理 SQL 和 row event 时的判断逻辑存在差异。

2.1 主库:是否写 binlog

判断发生在 SQL 执行完成之后。

binlog_do_db / binlog_ignore_db 仅根据当前会话的 USE db 判断,而不关注 SQL 实际操作的目标表。

2.2 从库:是否执行 relay log

判断发生在 SQL Thread 回放阶段

判断依据包括:

  1. replicate_* 复制过滤参数
  2. row event 真实的 db / table
  3. 表是否存在
  4. GTID 执行状态

结论:当主库和从库判断条件不一致时,即使 binlog 已记录,从库也可能未执行对应 row event,从而导致数据不一致。

三、主库过滤参数及风险

3.1 binlog_do_db / binlog_ignore_db 的行为示例

主库参数设置:
binlog_do_db = db1

主库执行SQL:
USE db1;
INSERT INTO db2.t2 VALUES (1);

执行结果:

  1. 主库 binlog 会记录该事务。
  2. 记录的 row event 目标表为 db2.t2,与 USE db1 不一致。

3.2 相关风险

  1. binlog 语义与实际操作对象脱钩
  2. 新从库或延迟从库无法补全缺失数据
  3. binlog 回放、审计等可能出现语义错误

四、从库复制过滤参数及风险

4.1 常用复制过滤参数

从库复制过滤前提条件就是主库的binlog必须完整。

  1. Replicate_Do_DB:
  2. Replicate_Ignore_DB:
  3. Replicate_Do_Table:
  4. Replicate_Ignore_Table:
  5. Replicate_Wild_Do_Table:
  6. Replicate_Wild_Ignore_Table:

4.2 复制或忽略库参数

说明:

Replicate_Do_DB/Replicate_Ignore_DB 这两个参数一个是只同步某些库,另一个是只忽略某些库,判断依据是relay log中记录use的数据库,并不是SQL语句实际操作的库。

测试:

  1. 从库配置复制过滤
STOP SLAVE;
CHANGE REPLICATION FILTER Replicate_Do_DB = test1;
START SLAVE;
  1. 主库不配置过滤并执行操作
USE test;
CREATE TABLE TEST1.T1 LIKE TEST.T1;
INSERT INTO TEST1.T1 VALUES(1,'A');
  1. 验证数据

主库查看数据:

greatsql> SELECT * FROM TEST1.T1;
+----+-------+
| id | cname |
+----+-------+
|  1 | A     |
+----+-------+
1 row in set (0.00 sec)

从库查看数据:

greatsql> SELECT * FROM TEST1.T1;
ERROR 1146 (42S02): Table 'test1.t1' doesn't exist

结论:

从库报错表不存在,所以这样会导致从库同步数据失败,因为use的是test库。

风险:

多库写入(跨库SQL)、存储过程、触发器、应用层不指定USE库都会导致数据不同步的风险。

4.3 复制或忽略表参数

说明:

Replicate_Do_Table/Replicate_Ignore_Table 这两个参数一个是只同步指定表,另一个是只忽略指定表,两个参数都不支持通配符,可以精确到表但使用要确保库名表名正确。

测试:

  1. 从库配置复制过滤
STOP SLAVE;
CHANGE REPLICATION FILTER Replicate_Ignore_Table= (test1.t1_tmp);
START SLAVE;
  1. 主库不配置过滤并执行DDL操作
RENAME TABLE test1.t1 TO test1.t1_bak;
RENAME TABLE test1.t1_tmp TO test1.t1;
  1. 验证数据

主库查看数据:

greatsql> use test1
Database changed
greatsql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| t1              |
| t1_bak          |
+-----------------+
2 rows in set (0.01 sec)

从库查看数据:

greatsql> USE test1
Database changed
greatsql> SHOW tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| t1_bak          |
| t1_tmp          |
+-----------------+
2 rows in set (0.01 sec)

结论:

由于主库执行rename操作将t1表更为t1_bak,t1_tmp更为t1,而从库忽略了t1_tmp导致sql同步失败,如果业务往新t1表插入数据从库就会因表不存在而断开复制链路,这是典型的“表级过滤被 DDL 绕过”事故。

风险:

  1. 未匹配的表默认全部不复制
  2. 新增表需要人工维护配置
  3. 与 DDL 操作存在天然冲突
  4. 如果过滤表过多添加在配置文件中只能一个参数匹配一个表

4.4 指定复制或忽略库参数

说明:

Replicate_Wild_Do_Table/Replicate_Wild_Ignore_Table 这两个参数一个是同步指定表,另一个是忽略指定表,两个参数都支持通配符,使用要确保库名表名没有通配符的隐患存在。

匹配方式%_(LIKE 语义)

测试:

  1. 从库配置复制过滤

忽略日志类表,不需要同步到从库。

STOP SLAVE;
CHANGE REPLICATION FILTER Replicate_Wild_Ignore_Table = (test1.log%);
START SLAVE;
  1. 主库不配置过滤并执行DML操作

一年后业务上线新业务test1.log_important

  1. 验证表结构

主库查看数据:

greatsql> USE test1
Database changed
greatsql> SHOW tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| log_important   |
+-----------------+
1 row in set (0.00 sec)

从库查看数据:

greatsql> USE test1
Database changed
greatsql> SHOW tables;
Empty set (0.00 sec)

结论:

log_importantlog_% 命中新业务数据未同步到从库,主从复制正常但是从库数据丢失,如果主库故障切换到从库才发现数据不一致就会导致故障,这是典型的“通配规则忽略业务表”事故。

风险:

  1. 匹配范围过宽
  2. 新表“自动进入过滤范围”
  3. DDL 影响范围不可控

五、最常见的踩坑配置

主库从库风险是否推荐
binlog_do_dbReplicate_Do_DB/Replicate_Ignore_DB跨库静默丢数据不推荐
binlog_do_dbreplicate_wild_ignore从库失效不推荐
binlog_ignore_db无过滤永久不可补不推荐
无过滤Replicate_Do_DB/Replicate_Ignore_DB跨库静默丢数据不推荐
无过滤Replicate_Do_Table/Replicate_Ignore_Table与DDL操作存在冲突,人工维护成本高可用,前提是过滤表数量少
无过滤Replicate_Wild_Do_Table/Replicate_Wild_Ignore_Table匹配范围过宽,通配符需要转义可用,前提是确保通配符不会影响其他表

六、最终建议(可直接当规范)

  1. 如果可以不做过滤就不做,做了就会有数据风险。
  2. 主库禁止做库表忽略,主库的binlog必须完整。
  3. 从库Replicate_Do_DB/Replicate_Ignore_DB最好不使用,业务操作并非DBA可以控制,但数据不一致就是DBA的锅。
  4. 从库Replicate_Do_Table/Replicate_Ignore_Table看似精确,但对 DDL 极其敏感,一旦表结构或命名发生变化,复制语义就可能在无感知的情况下被破坏。
  5. 从库Replicate_Wild_Do_Table/Replicate_Wild_Ignore_Table可以使用,库表都可做过滤,前提是一定要做转义,规避不应该发生的数据问题。
  6. 有条件可以使用GreatSQL 的gt checksum工具定期做主从数据校验。

大家好,我是良许。

在嵌入式开发中,串口通信是我们最常用的通信方式之一。

但很多初学者经常会被 UART、RS232、RS485 这几个概念搞混,不清楚它们之间到底有什么区别和联系。

今天我就来详细聊聊这三者的区别,帮助大家彻底理解这些概念。

1. 基本概念解析

1.1 UART 是什么

UART(Universal Asynchronous Receiver/Transmitter)的中文名称是通用异步收发器,它本质上是一种通信协议和硬件电路

UART 定义了数据如何在设备之间进行串行传输,包括数据格式、传输速率、起始位、停止位等。

简单来说,UART 是一种逻辑层面的协议标准。

它规定了数据帧的格式,比如一个标准的 UART 数据帧通常包含:1 个起始位(低电平)、5 到 8 个数据位、可选的校验位、1 到 2 个停止位(高电平)。

在我们的 STM32 单片机中,UART 就是芯片内部集成的一个硬件模块,负责将并行数据转换为串行数据发送出去,或者将接收到的串行数据转换为并行数据。

UART 通信只需要两根线:TX(发送)和 RX(接收),再加上一根地线 GND。

1.2 RS232 是什么

RS232 是由美国电子工业协会(EIA)制定的一种物理层标准,全称是 EIA-RS-232。

它定义了数据终端设备(DTE)与数据通信设备(DCE)之间的物理接口标准,包括电气特性、机械特性、功能特性等。

RS232 最重要的特点是它的电平标准:逻辑 1(MARK)的电压范围是-15V 到-3V,逻辑 0(SPACE)的电压范围是 +3V 到 +15V。

注意,这个电平标准和我们单片机的 TTL 电平(0V 和 3.3V 或 5V)是完全不同的。

RS232 通常使用 DB9 或 DB25 接口,最大传输距离约为 15 米,最大传输速率一般不超过 20kbps(理论上可以更高,但实际应用中受限于线缆长度和质量)。

1.3 RS485 是什么

RS485 同样是一种物理层标准,它是 RS232 的改进版本。

RS485 采用差分信号传输方式,使用两根线(A 和 B)来传输数据,通过两根线之间的电压差来表示逻辑 0 和 1。

RS485 的主要优势包括:传输距离可达 1200 米,传输速率可达 10Mbps(短距离下),支持多点通信(最多可以连接 128 个设备),抗干扰能力强。由于采用差分信号,RS485 在工业环境中的应用非常广泛。

2. 三者之间的关系

理解了基本概念后,我们来看看它们之间的关系。

简单来说:

UART 是协议层,RS232 和 RS485 是物理层。

这就好比我们说话时,UART 定义了"说什么"(语言规则),而 RS232 和 RS485 定义了"怎么说"(声音的大小、传播方式)。

一个完整的串口通信系统,既需要 UART 协议来组织数据,也需要 RS232 或 RS485 这样的物理层标准来实际传输数据。

在实际应用中,我们的单片机 UART 输出的是 TTL 电平信号(比如 0V 和 3.3V),如果要通过 RS232 接口通信,就需要使用电平转换芯片(如 MAX232)将 TTL 电平转换为 RS232 电平;如果要通过 RS485 通信,就需要使用 RS485 收发器芯片(如 MAX485)进行转换。

3. 详细对比分析

3.1 电气特性对比

从电气特性来看,三者有明显的区别:

UART(TTL 电平):逻辑 1 通常是 3.3V 或 5V,逻辑 0 是 0V。这是单片机内部直接使用的电平标准,驱动能力弱,抗干扰能力差,只适合板级通信。

RS232:采用负逻辑,逻辑 1 是-3V 到-15V,逻辑 0 是 +3V 到 +15V。这种较大的电压摆幅提供了一定的抗干扰能力,但功耗相对较高。RS232 是单端信号传输,容易受到共模干扰的影响。

RS485:采用差分信号传输,两根线之间的电压差大于 +200mV 表示逻辑 1,小于-200mV 表示逻辑 0。差分传输的最大优势是抗共模干扰能力强,即使两根线同时受到相同的干扰,只要它们之间的电压差保持不变,就不会影响数据传输。

3.2 传输距离和速率对比

在实际应用中,传输距离和速率是我们选择通信方式的重要考虑因素:

UART(TTL 电平):传输距离非常有限,一般不超过 1 米,速率可以很高,但受限于线缆和驱动能力。在 PCB 板上的芯片间通信非常合适。

RS232:标准规定最大传输距离为 15 米,但在实际应用中,如果降低波特率,可以达到更远的距离。比如在 9600bps 的速率下,可以传输 30 米甚至更远。但随着距离增加,信号衰减和干扰会导致通信质量下降。

RS485:这是三者中传输距离最远的,标准距离可达 1200 米。而且 RS485 的传输速率和距离是可以权衡的:短距离下可以达到 10Mbps,而在最大距离 1200 米时,速率通常限制在 100kbps 左右。

3.3 通信方式对比

从通信拓扑结构来看:

UART/RS232:只支持点对点通信,即一个发送端对应一个接收端。如果需要连接多个设备,就需要多个串口,或者使用串口服务器等设备。

RS485:支持多点通信(也叫总线型通信),可以在同一条总线上连接多达 128 个设备(理论值,实际应用中需要考虑负载能力)。这使得 RS485 在工业控制系统中非常受欢迎,可以大大减少布线成本。

另外,RS485 支持半双工和全双工两种模式。半双工模式只需要两根线(A 和 B),但同一时刻只能有一个设备发送数据;全双工模式需要四根线,可以同时收发数据。

4. 实际应用场景

4.1 UART 的典型应用

在嵌入式开发中,UART 最常见的应用场景包括:

  1. 单片机与 PC 之间的调试通信,通过 USB 转 TTL 模块连接。
  2. 单片机与各种传感器模块的通信,比如 GPS 模块、蓝牙模块、WiFi 模块等。
  3. 单片机之间的短距离通信。

下面是一个 STM32 使用 HAL 库进行 UART 通信的简单示例:

// UART初始化
UART_HandleTypeDef huart1;
​
void MX_USART1_UART_Init(void)
{
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 115200;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    
    if (HAL_UART_Init(&huart1) != HAL_OK)
    {
        Error_Handler();
    }
}
​
// 发送数据
uint8_t txData[] = "Hello UART!\r\n";
HAL_UART_Transmit(&huart1, txData, sizeof(txData)-1, 1000);
​
// 接收数据
uint8_t rxData[100];
HAL_UART_Receive(&huart1, rxData, 10, 1000);

4.2 RS232 的典型应用

RS232 虽然是比较老的标准,但在很多场合仍然在使用:

  1. 工业设备的配置和调试接口,很多老设备都配备 RS232 接口。
  2. 一些专业设备如示波器、频谱分析仪的通信接口。
  3. PLC(可编程逻辑控制器)的编程和监控接口。

在使用 RS232 时,我们需要在单片机的 UART 和 RS232 接口之间加入电平转换芯片。

以 MAX232 为例,它可以将 TTL 电平转换为 RS232 电平,反之亦然。

电路连接非常简单,只需要几个外围电容即可。

4.3 RS485 的典型应用

RS485 在工业自动化领域应用极为广泛:

  1. 工业现场的传感器网络,比如温度、压力、流量等传感器的数据采集。
  2. 楼宇自动化系统,如门禁、照明、空调控制等。
  3. 智能电网的抄表系统。
  4. 工业机器人的控制系统。

使用 RS485 时,需要注意以下几点:

  1. 总线两端需要加 120 欧姆的终端电阻,以消除信号反射。
  2. 在没有数据传输时,需要将总线拉到确定的电平状态,通常使用上拉和下拉电阻。
  3. 在多主机通信时,需要设计好通信协议,避免总线冲突。

下面是一个使用 MAX485 进行 RS485 通信的示例代码:

// 定义RS485方向控制引脚
#define RS485_DE_GPIO_Port GPIOA
#define RS485_DE_Pin GPIO_PIN_8
​
// 设置为发送模式
void RS485_TX_Mode(void)
{
    HAL_GPIO_WritePin(RS485_DE_GPIO_Port, RS485_DE_Pin, GPIO_PIN_SET);
    HAL_Delay(1); // 等待芯片切换
}
​
// 设置为接收模式
void RS485_RX_Mode(void)
{
    HAL_GPIO_WritePin(RS485_DE_GPIO_Port, RS485_DE_Pin, GPIO_PIN_RESET);
    HAL_Delay(1);
}
​
// 发送数据
void RS485_SendData(uint8_t *data, uint16_t len)
{
    RS485_TX_Mode();
    HAL_UART_Transmit(&huart1, data, len, 1000);
    RS485_RX_Mode();
}
​
// 接收数据
void RS485_ReceiveData(uint8_t *data, uint16_t len)
{
    RS485_RX_Mode();
    HAL_UART_Receive(&huart1, data, len, 1000);
}

5. 如何选择合适的通信方式

在实际项目中,我们应该如何选择呢?可以参考以下原则:

  1. 短距离板级通信:直接使用 UART 的 TTL 电平即可,简单、成本低、速度快。比如单片机与传感器模块之间的通信。
  2. 中等距离点对点通信:如果距离在几米到十几米之间,并且只需要连接两个设备,可以选择 RS232。虽然 RS232 比较老,但它的兼容性很好,很多设备都支持。
  3. 长距离或多设备通信:如果传输距离超过 15 米,或者需要连接多个设备,那么 RS485 是最佳选择。特别是在工业环境中,RS485 的抗干扰能力和多点通信能力使它成为首选。
  4. 高速短距离通信:如果需要高速传输且距离不远,可以考虑使用 LVDS(低压差分信号)等其他技术。
  5. 无线通信需求:如果布线困难或需要移动通信,可以考虑使用蓝牙、WiFi、LoRa 等无线通信方式。

6. 总结

通过以上的详细分析,我们可以清楚地看到 UART、RS232、RS485 之间的区别和联系:

UART 是一种通信协议和硬件模块,定义了数据的组织方式;RS232 和 RS485 则是物理层标准,定义了信号的电气特性和传输方式。

它们不是互相替代的关系,而是协同工作的关系。

在实际应用中,我们通常是在单片机的 UART 基础上,根据具体需求选择合适的物理层标准。

如果是短距离通信,直接使用 UART 的 TTL 电平;如果需要更远的传输距离或更强的抗干扰能力,就通过电平转换芯片将 TTL 电平转换为 RS232 或 RS485 电平。

理解这些概念对于我们进行嵌入式系统设计非常重要,可以帮助我们在不同的应用场景中选择最合适的通信方式,设计出稳定可靠的系统。

希望这篇文章能够帮助大家彻底搞清楚这三者的区别,在以后的项目中能够灵活运用。

JDK 26

连续第二周,JDK 26 的早期访问版本仍为Build 29。更多详情请参阅其发布说明

JDK 27

同样,JDK 27 的早期访问版本当前仍为Build 3。详细信息可查阅其发布说明

 

对于JDK 26JDK 27,鼓励开发者通过Java Bug数据库报告缺陷。

Spring Framework

Spring Shell 4.0.0 正式发布GA版本,包含缺陷修复、文档改进、依赖项升级以及多项新特性,包括,命令编程模型重构,在使用 Spring Boot 时,不再需要@EnableCommand@CommandScan注解,并修复了@Command注解的意外行为;全新升级的 DSL,解决了CommandRegistration.Builder实例与 Spring Security 的SecurityFilterChain接口在新构建器格式下的匹配问题;与 Spring Framework 7.0 和 Spring Boot 4.0 对齐;新增对JSpecify的空安全(null safety)支持。更多细节请参见发布说明

JReleaser

JReleaser 1.22.0发布,这是一个用于简化 Java 项目发布流程的工具,本次更新包括缺陷修复、文档改进、依赖项升级以及新功能,包括,Signing模块全面重构,支持同时使用多种方法对构件(artifacts)进行签名;新增对Minisign(一个用于文件签名和验证的工具)的支持;支持在部署构件到 Maven Central 时跳过等待期。更多详细信息请见发布说明

TornadoVM

TornadoVM团队宣布,其开源 IntelliJ 插件TornadoInsight(旨在提升 TornadoVM 的开发体验)现已兼容最新发布的TornadoVM 2.0。相关配置指南也已同步更新。关于 TornadoInsight 的更多信息,可参考 InfoQ 的新闻报道

Apache Camel

Apache Camel 4.14.3发布,包含缺陷修复、依赖项升级及功能改进,包括,在使用Camel JBang时,可通过--repos命令为Camel Kamelet相关操作指定 Maven 仓库;Camel Neo4j组件改进了消息体的检测逻辑,避免内部错误;修复了Camel Netty中 SSL 客户端证书主题名称(subject name)从可读字符串表述被错误转换为晦涩的LDAP格式的问题。更多详情请查阅发布说明

 

原文链接:

Java News Roundup: Spring Shell, JReleaser, TornadoInsight, Apache Camel

事件背景

2026 年 1 月 16 日,OpenAI 通过官方 X(原 Twitter)账号正式宣布,将在未来数周内开始在 ChatGPT 的免费版和新推出的 ChatGPT Go($8/月)中测试广告投放。与此同时,Plus($20/月)、Pro($200/月)及企业版将继续保持无广告体验。这一决策迅速引发了科技圈的广泛关注和激烈讨论。

OpenAI官方公告推文

OpenAI 官方推文宣布广告计划,并发布广告原则说明 | 来源:X @OpenAI

值得注意的是,OpenAI 同时发布了一份详尽的"广告原则"(Our Ad Principles),试图向用户保证广告不会影响 ChatGPT 的回答质量和隐私保护。然而,这份承诺并未能平息用户的担忧——社交媒体上的反应呈现出高度两极分化的态势。

OpenAI 的广告原则解读

OpenAI广告原则详图

OpenAI 发布的广告原则框架:强调使命对齐、答案独立、对话隐私、用户控制与长期价值

📋 OpenAI 官方承诺清单

答案独立性:ChatGPT 的回答始终基于客观有用性,广告不会影响答案内容

对话隐私:不向广告商出售用户数据,对话内容保持私密

用户控制:用户可随时关闭个性化广告,清除广告相关数据

付费保护:Plus、Pro、Business、Enterprise 等高价层级永不显示广告

未成年保护:18 岁以下用户不会看到广告

敏感话题禁区:政治、健康、心理健康等敏感话题禁止广告投放

商业化背后的财务压力

从华尔街日报、彭博社等主流财经媒体的报道来看,OpenAI 此举并非心血来潮,而是面对真实财务压力的"不得已之举"。据公开数据显示:

在如此悬殊的付费转化率面前,广告变现被多家媒体评价为"不可避免"的选择。富国银行预测,ChatGPT 在搜索市场的占比将从 2025 年底的 17%增长到 2030 年的三分之一,这为广告业务提供了巨大的潜在市场空间。

社交媒体的激烈反应

公告发布后,X 平台上的评论区迅速沦陷。从截图可见,用户反应从嘲讽、愤怒到直接引用 Sam Altman 此前的反广告言论,形成了鲜明的对比和讽刺效果。

用户评论截图

X 平台用户对 OpenAI 广告公告的部分反应 | Grok 引用了 Altman 2024 年称广告是"反乌托邦"的言论

Sam Altman 在 2024 年曾称将广告嵌入 ChatGPT 回复是一种"反乌托邦"的想法:"很容易想象那种未来的反乌托邦场景——你问 ChatGPT 一个问题,它回答说'你应该考虑买这个产品'或者'你应该去这里度假'之类的。"

—— 来源:Grok @grok 引用 Altman 2024 年采访

这种前后矛盾的表态成为用户攻击的焦点。有用户直言:"直接说你们需要更多钱不就得了"(Just say you guys need more money),简洁而犀利地戳破了官方话术的包装。

四大核心担忧

1. 答案中立性与商业影响的矛盾

用户普遍担忧:一旦 AI 提供的建议与商业利益相关联,就很难保证答案仍然是纯粹基于"客观有用性"的判断。有用户形象地比喻:"感觉就像在心理咨询师办公室里竖起了广告牌。"

2. 数据隐私与"监听"恐惧

尽管 OpenAI 承诺"不会出售用户数据给广告商",但用户对此类承诺持谨慎态度。有 Reddit 用户反映,在 ChatGPT 中讨论特定话题后,很快在其他平台看到相关广告,这加深了数据被滥用的担忧。

3. 前科问题:App Recommendations 事件

2025 年 12 月,ChatGPT Plus 付费用户在对话中看到来自 Target、Peloton 等品牌的"推荐"。OpenAI 最初辩称这不是广告,只是应用发现功能,但最终在用户强烈反对下关闭了该功能。首席研究官 Mark Chen 道歉承认公司"做得不够好"。这一事件严重损害了用户对 OpenAI 承诺的信任。

4. Instagram 模式类比的逻辑悖论

CEO Sam Altman 提到欣赏 Instagram 的广告模式,但用户尖锐地指出:Instagram 之所以成功,正是因为 Meta 大规模收集和出售了用户的个人数据——这与 OpenAI 声称的"隐私优先"立场本质矛盾,形成了无法调和的逻辑悖论。

广告形态预览

根据 OpenAI 展示的概念图,广告将以"Sponsored"标签的形式出现在 ChatGPT 回复的底部,与回答内容明确分离。在下图的示例中,当用户询问墨西哥晚宴菜谱时,系统在给出食谱建议后,底部会显示相关食材的赞助商购买链接。

ChatGPT广告界面示例

ChatGPT 广告投放概念设计:广告以"Sponsored"标签形式出现在回复底部,与答案内容分离

这种设计理论上可以降低用户对答案被"污染"的担忧,但批评者指出,长期来看广告逻辑一旦被引入系统,算法污染可能是微妙且难以察觉的——即使不是故意为之。

前科回顾:信任的裂痕

  • 2024 年 Altman 公开反对广告

Sam Altman 在采访中称将广告嵌入 ChatGPT 回复是"反乌托邦"的想法,表示更倾向于订阅模式以避免用户成为产品。

  • 2025 年 12 月 App Recommendations 争议

ChatGPT Plus 付费用户发现对话中出现 Target、Peloton 等品牌推荐。OpenAI 先是否认为广告,后在舆论压力下关闭该功能并道歉。

  • 2026 年 1 月 16 日正式宣布广告测试

OpenAI 官宣在免费版和 Go 版本中测试广告,同时发布"广告原则"框架,承诺付费用户永远不会看到广告。

这一系列事件的累积效应是:用户现在不再轻易相信 OpenAI 关于"高价订阅永远不会有广告"的承诺。Reddit 社区中大量评论指出,这正是流媒体巨头采用过的老套路——"先在免费端试水,再慢慢侵入付费端"。

有条件的宽容声音

💡部分理性用户的接受条件

并非所有反应都是负面的。部分用户认为,如果 OpenAI 能够做到以下几点,免费用户看广告是一种合理的交换:

1. 透明性:广告必须明确标注为"Sponsored",不能伪装成自然回答

2. 相关性:广告应与当前对话相关,而非完全无关的干扰

3. 可控性:用户可以关闭个性化广告设置,或清除用于投放广告的对话记录

4. 底线:高价订阅(Plus/Pro)必须永远保持无广告体验

这类"有条件宽容"的声音提醒我们,用户并非完全不能接受商业化,关键在于执行的边界和信任的维护。

行业视角:竞争压力与战略转向

从更宏观的行业视角来看,OpenAI 的这一决策也反映了 AI 领域日益激烈的商业化竞争。谷歌的 Gemini 和 Meta 的 AI 产品已经内置广告机制,OpenAI 不想在市场份额争夺中落于下风。

Marketing AI Institute 的分析尤其指出,OpenAI 内部正面临巨大的商业化压力。公司聘请前 Facebook 和 Instacart 高管 Fidji Simo 担任应用业务 CEO,这一人事任命本身就暗示了公司的战略方向——从技术研究机构向消费级商业平台的全面转型。

OpenAI 的创新尝试在于"对话语境驱动的广告"(contextual ads triggered by current conversation),理论上这种做法可以降低隐私风险。但实践中,用户很难确信系统不会进行隐蔽的数据关联。

结论:信任与商业化的钢丝行走

社交媒体反应以担忧和怀疑为主,核心议题围绕信任、隐私和"前科"问题。用户普遍采取了"show me"的态度——可以测试,但任何迹象表明承诺被破坏就会转向竞品。

主流媒体的评价则务实与批判并存:认可这一决策的商业必然性,但广泛质疑其能否在不伤害信任的前提下成功。最尖锐的评论来自社区用户的讽刺——AGI 实际上是"Ads Generating Income"(广告创造收入)。这反映了一个更深层的焦虑:开放人工智能的使命(AGI 造福全人类)与商业化压力之间可能存在根本性冲突。

OpenAI 正在走钢丝——既要维持无广告体验的付费用户的付费意愿,又要通过免费/低价层的广告收入覆盖高昂的运营成本。这个平衡能维持多久,将决定 ChatGPT 是否会重蹈社交媒体平台从纯净到被商业完全入侵的老路。

ChatGPT 将上线广告

1 月 16 日,OpenAI 宣布计划在未来几周内,开始在 ChatGPT 中测试广告功能。首批测试将针对美国市场的用户展开,随后逐步推广至全球。广告将主要出现在免费版以及每月订阅费用为 8 美元的低价方案 Go(在印度测试数月后推广至更多市场)中,而 Plus、Pro 及企业版的高级订阅用户目前将不会看到广告。

OpenAI 承诺,广告不会干预或改变 ChatGPT 生成的答案内容。广告将以带有清晰标识的独立方框形式,出现在聊天机器人回复内容的下方。例如,当用户询问纽约的旅行建议时,ChatGPT 会先提供标准的行程规划,随后可能在下方展示当地酒店的广告。OpenAI 应用负责人表示,还将探索更具交互性的广告形式,例如未来用户可以直接向广告内容提问以辅助购买决策。

针对用户普遍关心的隐私问题,OpenAI 明确表示不会将用户数据出售给广告商,也不会向广告商泄露具体的对话内容。广告商仅能获得如展示次数、点击量等汇总后的效果数据。虽然系统会根据对话主题和部分个性化数据来匹配广告,但用户可以随时在设置中关闭用于广告投放的数据权限。此外,OpenAI 设定了严格的屏蔽机制,涉及健康、政治等敏感话题的对话,以及未成年用户的对话中,将不会展示广告。

OpenAI 面临着巨大的商业化压力。尽管 ChatGPT 目前已拥有超过 8 亿的周活跃用户,但其中绝大多数为不产生直接收益的免费用户。作为一家成立十年、累计融资约 640 亿美元的科技巨头,OpenAI 亟需在现有的订阅模式之外开辟新的收入来源,以支撑高昂的模型训练与运营成本,并应对来自 Google Gemini 等竞争对手日益激烈的挑战。


医保药品比价小程序全国上线

1 月 16 日,国家医保局宣布,已在全国完成「定点药店医保药品比价」小程序上线工作。该小程序整合了全国医保定点零售药店的实时数据资源,能够提供及时更新的药品价格、库存状态及生产企业等信息。

据介绍,参保人可通过微信、支付宝搜索进入本地医保服务平台,或直接使用国家医保服务平台 app,找到比价功能模块。输入药品名称后,系统便会显示所在区域内各定点药店的该药品价格区间、具体库存情况,并支持按照价格从低到高、距离由近及远等多种方式进行排序筛选。选定意向药店后,用户还可直接使用内置的导航功能前往,或一键拨打药店电话进行咨询,从而减少盲目奔波与不必要的支出。

在基础比价功能全面落地的基础上,各地医保部门结合群众在使用过程中的反馈,正持续拓展小程序的服务场景与应用功能。例如,针对老年群体可能存在的打字输入困难,多个省份的小程序已新增「拍照识药」功能,只需对准药盒拍照即可自动识别药品并查询比价信息;部分区域还对接了线上购药与配送上门服务,为行动不便或有紧急需求的居民提供便利。

此外,一些地区进一步探索了医用耗材价格查询、处方匹配寻药、药品价格波动趋势分析等特色服务,并同步展示药店基于医保药品「量价比较」的指数评级,辅助群众更全面地做出购药选择。


新规禁止在直播间销售 13 类食品

据新华社报道,市场监管总局于近日发布《直播电商经营者落实食品安全主体责任监督管理规定》,将于 2026 年 3 月 20 日起施行,其中明确了 13 类不得直播经营的食品,包括:用非食品原料生产、添加有毒有害物质的食品;致病性微生物、重金属超标食品;过期、腐败变质、霉变生虫食品;病死毒死或检疫不合格的畜禽水产肉类及其制品;无标签预包装食品;国家明令禁止生产经营的食品等。

《规定》将直播电商平台经营者、直播间运营者、直播营销人员、直播营销人员服务机构全部纳入监管范畴。这些主体都必须按照《规定》要求,履行相应的食品安全主体责任。其中,食品生产经营者开设直播间需要公示许可信息、查验供货资质,非食品生产经营者需要建立严格的选品制度;直播营销人员要加强选品把关;平台要建立审查登记、培训、风险管控等制度措施,配备食品安全管理人员,制定食品安全风险管控清单,建立「智能监测、排查调度、快速处置」的工作机制。

在强化监管措施、完善消费者权益保护方面,《规定》要求市场监管部门将直播经营食品纳入到日常监管和年度抽检计划中,明确技术监测记录可以作为电子数据证据;平台必须开通便捷的投诉举报功能,及时处置消费者诉求。


Setapp 放弃在欧洲开设第三方 iOS 应用商店

近日,乌克兰知名软件开发商 MacPaw 宣布,将于 2 月 16 日正式关闭其面向欧盟用户的第三方 iOS 应用商店 Setapp Mobile。MacPaw 在官方支持页面中解释称,做出这一决定是因为应用市场「仍在不断演变且复杂的商业条款」已不再契合公司当前的商业模式,暗示盈利困难。

Setapp Mobile 于 2024 年 9 月在欧盟地区启动公开测试,通过订阅制为用户提供 iOS 应用分发服务。服务正式关停后,用户通过该平台获取的所有应用将被移除。官方建议用户在截止日期前备份重要数据,以免服务终止后无法访问。Setapp 基于订阅制的 Mac 版将保持正常运营,不受此次移动端业务调整的影响。

Setapp Mobile 的诞生得益于欧盟《数字市场法案》(DMA)的生效,该法案强制 Apple 在欧盟地区开放第三方应用侧载。然而,这一新兴的分发渠道面临着严峻挑战。尤其是 Apple 引入的「核心技术费」(Core Technology Fee)规则,要求应用在超过一定安装阈值后,必须为每次年度首次安装向 Apple 支付费用。这极大地增加了第三方商店及其开发者的运营成本。

目前,欧盟市场仍有包括 Epic Games Store 在内的另外五家第三方商店在运营。Epic 曾多次抨击 Apple 的收费政策阻碍了竞争对手立足,但目前仍坚持运营并等待欧盟监管机构对 Apple 规则的进一步审查。


英伟达博客笔误写错单位,勘误后引起铜价波动

据财新报道,近日,英伟达于 2025 年 5 月发布的一篇博客文章重获市场关注。该文中,英伟达称 1 兆瓦(MW)的机架需要 200 公斤铜母线,1 吉瓦(GW)数据中心的机架母线需要 50 万吨(half a million tons)铜。

由于 1 吉瓦相当于 1000 兆瓦,按比例换算,1 吉瓦数据中心需要的铜应为 200 公斤的 1000 倍,即 20 万公斤。因此,英伟达原文所谓的「50 万吨」应为笔误。英伟达后来修订了该错误。

然而,这一数据已经被许多市场调研报告引用,而英伟达的勘误直接使国际铜价短线大跌:伦铜(LME)在 1 月 14 日创造每吨 13407 美元的历史新高后,连续两日回调,累计回撤约3.4%,暂时跌破了 10 天移动平均线(MA10)。

事实上,受美国关税套利、铜矿供应受限、AI 等新需求因素影响,2025 下半年铜价屡创新高,伦铜从 2025 年 9 月初的 9900 美元/吨,一路上涨,于 2026 年 1 月历史首次突破每吨 1.3 万美元。花旗预计铜价将在未来三个月升至每吨 1.4 万美元。


2025 华为手机出货量 5 年来重回中国第一

据日经新闻援引 IDC 发布的数据报道,从 2025 年中国手机出货量来看,华为时隔 5 年后再次重回首位。从绝对数字上看,华为 2025 年的手机出货量比 2024 年减少 1.9%,为 4670 万部。由于 2024 年位居首位的 vivo 大幅下降 6.6%,华为逆转升至首位。

此前,华为采购高性能半导体受限,无法实现 5G,导致消费者远离。而近年,华为借助麒麟芯片,重振了销售。2025 年 11 月发售最新机型 Mate80 提高了性能,具备 AI 自动处理各种工作的功能,同时相比前代产品降价。

出货量排在第 2 位的是美国苹果,增长 4%,达到 4620 万部。2025 年 9 月上市的 iPhone17 系列销售强劲。2025 年底苹果通过官方销售渠道对高端机型 Pro 和 Pro Max 提供 300 元优惠刺激了需求。

2025 年,中国的整体手机出货量减少 0.6%,为 2 亿 8460 万部,2 年来首次低于上年。虽然鼓励以旧换新的政府补贴起到了推动作用,但有些地区提前用完补贴额度,显得后继乏力。鉴于消费低迷,IDC 预测 2026 年的出货量为 2 亿 7800 万部,持续低于上年。


看看就行的小道消息

  • 1 月 16 日下午,西贝莜面村创始人贾国龙在个人微博宣布,将在晚上 10 点,就罗永浩对西贝的重大污蔑诽谤一一全面回应,并邀请媒体、网友和政府有关部门关注。罗永浩随即转发该微博,并表示自己会尽量忍耐。当日晚间 10 点,贾国龙的个人微博并未更新内容。目前,罗永浩、贾国龙两人的账号被禁言。贾国龙所说的回应最终在西贝集团的认证账号(@西贝人心声)上以图文形式发布。贾国龙称,罗永浩曾在发布的文章中暗示贾国龙联合相关部门对其实施了「跨省抓捕」,是恶意煽动公共情绪,要求罗永浩,必须将此事解释清楚,一起去政府部门查明有没有报警或要求抓捕。随后上述微博被删除。微博 CEO 王高飞(@来去之间)发微博援引网信办《网络名人账号行为负面清单》的规定,表示「以后想论战,应该还是需要通过媒体采访的方式来进行」。罗永浩后来承认被禁言 15 天,表示以后不会再评论西贝事件。
  • 1 月 15 日,中国内地的 App Store 已经无法查询到近期因名称特别而受关注的独居安全 app「死了么」;其他地区的 App Store 仍然可以下载。此前,1 月 13 日,「死了么」在官方微博宣布将于即将发布的新版本中,正式启用全球化品牌名 Demumu;1 月 14 日,其官方账号表示,之前的更名尝试未能尽如人意,在全网征集创意。


少数派的近期动态

如果你从浏览器访问少数派,可能已经注意到我们于近日优化了首页样式。

如你所见,我们此次主要优化了——

  1. 整体设计风格,使其更加现代、统一;
  2. 顶部横幅(banner)区域的版式,新增作者信息、活动信息等多项展示功能;及
  3. 内容流区域的布局,提供更灵活多变的内容展示栏位。

通过此次更新,我们希望以更清晰的层级关系,让不同类型的信息在同一视野中有序呈现,同时反映少数派立足内容而多元发展的面向。我们还将在此次更新建立的基础上,持续改进并增加更多功能,敬请期待。

我们鼓励各位读者积极探索、尝试新的版式、组件和交互功能,并提出问题和建议。如你有任何反馈,可以通过下方表单告知我们。

首页反馈收集


你可能错过的好文章


    疯狂投入了十几个周末进行优化,在一个 issue 里和用户共讨论了 150 多楼,每周末都开发出一个新的 RC 版本,从 RC1 干到 RC11 ,终于发布了一个稳定版。

    作为一个新项目,知道的人还不多,现在才 100 多的 star ,却比同类老项目( mosh: 13k 多的 star )的功能强大很多,详见 README 里的功能对比。支持 多平台低延迟保持连接切换网络SSH X11 转发SSH Agent 转发SSH 端口转发输出上下滚动OSC52 复制粘贴多级 ProxyJumptmux -CC 集成等。

    欢迎大家来试用,与同类老项目 mosh 比较比较。在服务器安装 tsshd,在本地安装 tssh,然后使用下面的命令登录服务器即可:

    tssh --udp <服务器 IP 或别名>
    

    注意 tsshd 默认随机监听 61001 - 61999 的 UDP 端口,防火墙要放开相应策略。支持在命令行指定 UDP 端口和 tsshd 安装路径,如下:

    tssh --udp --tsshd-path /path/on/server/tsshd --tsshd-port 10000-10010 xxx
    ( 和 ssh xxx 一样的效果,配置可写在 ~/.ssh/config 中,然后直接 tssh xxx 登录 )
    
    • 使用 tsshd ,你的 ssh 可以避免掉线(从此告别 ssh 在弱网环境下经常掉线的苦恼,无需经常重新登录)
    • 使用 tsshd ,你的 ssh 可以支持漫游(举例:你的笔记本在公司 ssh 登录后,带回到家还可以保持连接)
    • 使用 tsshd ,你的 ssh 可以获得低延迟(特别适用于海外服务器,避免 ssh 按键不跟手的情况)。tsshd 支持 KCP 协议(可以获得更稳定的更低的延迟),命令行通过 tssh --kcp xxx 启用,也支持配置指定 KCP 协议(默认使用传输吞吐量更高一些的 QUIC 协议)。

    作为 ssh 工具,tssh 和 tsshd 都很注重安全的,详见 README 里的安全介绍。欢迎各位大佬来分析评估其安全性。(说到安全,我周末基本都献给开源 了,CTF 界少了个 PWN 选手,开源界多了几个项目: trzsztsshtsshd 等)

    服务端开源(对标 mosh ,并提供相应 Client 库):tsshd https://github.com/trzsz/tsshd

    客户端开源(支持标准 ssh ,扩展了很多实用功能):tssh https://github.com/trzsz/trzsz-ssh

    本月初,腾讯法务向超过 30 个 GitHub 项目发出了 DMCA 通知,导致这些项目被迫下架。腾讯法务指控开发者们违反了 DMCA 绕过技术保护措施的条款、违反了微信禁止逆向工程条款、威胁用户隐私和安全,以及侵犯知识产权。

    TG 上的评论:让用户访问自己的微信数据是非法的

    https://www.solidot.org/story?sid=83334
    https://github.com/github/dmca/blob/master/2026/01/2026-01-08-tencent.md
    https://github.com/ellermister/wechat-clean

    前贴: https://www.v2ex.com/t/1186284

    看到贴文内容之后,我针对各个关键节点版本做了部署测试,得出如下结论:

    从 3.77.0 版本开始,组件数上限 10w ,日请求上限 20w 。从 3.87.0 版本开始,组件数上限降为 4w ,日请求数降为 10w 。

    版本详细介绍,以及上限验证结果,详见博文: https://wiki.eryajf.net/pages/b6b711/

    除了记录了对应版本,我还针对历史镜像做了归档,有需要的同学可以自取。

    如果你跟我一样,同时在用 Claude Code, Cursor, Windsurf, Copilot 等好几个工具,肯定被这件事折磨过:

    每改一次 Custom Instruction 或 Rule ,都要去四五个地方手动同步一遍。 只要漏掉一个,AI 的表现就打折扣。

    我撸了个小工具 AI Global ,核心逻辑只有一句话:一个中心化配置,全平台指令同步。

    🚀 核心功能:

    一键分发:支持自动识别并同步 30+ 种 AI 工具(几乎涵盖目前市面所有主流工具)。

    共享大脑:所有工具的指令自动合并到 global.md ,改一处,处处生效。

    模块化资源:你可以沉淀一套自己的 .md 技能库、规则库,所有 AI 助手瞬间共享你的“武器库”。

    极简且美观:全 256 色系着色的 CLI 输出,状态一目了然。

    安全第一:自带备份逻辑,支持一键 unlink 无痕还原。

    🛠️ 安装使用:

    npm install -g ai-global

    然后只需运行

    ai-global

    它会自动帮你把家里的活儿全干了。

    GitHub:

    https://github.com/nanxiaobei/ai-global

    欢迎大家体验,有喜欢的工具没适配的,欢迎提 Issue 或 PR !

    题主人在加拿大,混迹已有 5 年。我刚来的时候,对“免费医疗”这四个字是有滤镜的。心想:发达国家嘛,医疗一定又好又人性。后来真正用上了,才发现这事儿得慢慢听我说。

    先说个大前提:在加拿大,不管你看啥病,第一步几乎永远是“预约”。家庭医生要预约,专科要转诊再预约,时间单位通常是“周”起步。真要是紧急情况?那只有一个地方——急诊。

    听起来很清晰,对吧?但现实往往很骨感。

    我儿子有一次出水痘,症状挺明显的,我们也不敢拖,直接去了急诊。结果你猜怎么着?等了 11 个小时。那种感觉你应该能想象:孩子难受,大人焦虑,夜里灯光惨白,塑料椅子坐到怀疑人生。好不容易轮到医生了,医生看了两眼,说: “不是水痘。” 然后就让我们回去了。

    后来事实证明真的是水痘。就这么一句“不是”,硬生生耽误了病情。那一刻,我对加拿大医疗的第一层幻想,算是碎了。

    但话也不能只说一半。加拿大的医疗,也有让我挺感动的时候。

    有一次我太太在申请医保卡的过程中,医保还没正式生效(超过了官方说的处理时间但依然没处理完)。偏偏那天做饭切到了手,口子不小,只能去急诊。我们心里其实是有点慌的,因为没有医保,急诊费用至少一千多加币起。果不其然,医院也明确说了:先记账,账单随后会寄给你们。

    第二天我抱着试试看的心态,给医保部门打了个电话,把情况说明了一下。没想到对方效率极高,直接把我的申请加急处理,两个工作日后就确认生效,随后那次急诊费用全免。

    那一刻你会觉得:
    这个系统慢是慢,但它有它的规则感和人情味——只要你真的符合条件,它不会为难你。

    再说回整体感受。发达国家的“免费医疗”,本质上是很容易被挤兑的。大家都不用掏钱,结果就是:能拖就拖,能等就等,系统的优先级极其严格。你不“濒死”,在系统里就不算急。听说有个在加拿大得了肾结石的,排队排了几天看不上病,马上买票回国把石头打掉了。

    反过头看国内。

    国内的问题大家也都知道:人多、医院挤、医生累。但有个特别现实的优势——病人多,医生见得多,经验是真的被“堆”出来的。很多病,国内医生一眼就知道怎么回事。而且说句大实话:看病是真的方便。不舒服?挂号。想做检查?当天安排。想找专家?多花点钱,但路径清晰。

    这点在我自己身上体现得特别明显。

    我有一次痔疮发作,是真的惨。疼得坐立不安,还发烧,马应龙都已经压不住了。放在国内,基本就是一句话:“来,检查一下,该处理处理。”

    但在加拿大不一样。医生很冷静地告诉我:“不算紧急。”于是——不处理。

    给我开了个带抗生素的痔疮栓,说观察。就这么过去了。

    那一刻我内心其实已经做了决定:等哪天回国,彻底处理掉。

    加拿大医生的逻辑是:标准化、风险控制、避免过度医疗;
    国内医生的逻辑是:经验驱动、效率优先、先把你治舒服了再说。

    你说哪种好?真不好一刀切。

    说到底,这两套系统就像两种性格的人:

    • 加拿大医疗:
      慢、冷静、规则第一,但兜底能力强,不会让你破产。
    • 中国医疗:
      快、直接、经验值爆表,花钱,但解决问题。

    至于我这个痔疮患者,目前的状态是:人在加拿大,心在国内肛肠科。

    医疗这事儿,真不是“免费”和“不免费”那么简单,只有真正用过,才知道自己更适合哪一套。

    对了,加拿大的免费医疗是:看病免费,药不免费,全免是我以前的误解。

    GistLedger

    GistLedger 是一个基于 GitHub Gist 的极简个人记账应用。它利用 GitHub Gist 作为免费、私有的云端数据库,实现数据的安全存储与多端同步。

    体验地址: https://gist-ledger.knowsky404.com

    🌐 核心理念: Own your data (数据隐私) | Serverless (无后端) | Lightweight (轻量化)

    Deploy with Vercel

    📸 项目预览

    Transaction Form
    History View
    Statistics View

    ✨ 功能特性

    1. 📝 极简记账 (Journal)

    • 快速录入: 支持收入/支出切换,金额、分类、日期、备注一键录入。
    • 最近记录: 首页实时展示最近 5 笔交易,方便快速核对。
    • 完全私有: 数据仅存储在你的 GitHub Gist 中,无第三方服务器读取。

    2. 📊 统计报表 (Statistics)

    • 双重视图:
      • 月度视图: 聚焦本月收支,展示当年 12 个月的收支变化趋势,辅助判断本月消费水位。
      • 年度视图: 聚焦全年收支,展示近 5 年的长期收支变化趋势,掌握宏观财务健康状况。
    • 多维筛选: 支持按分类(可多选)筛选统计数据,例如查看“餐饮”+“交通”的年度支出趋势。
    • 动态图表: 交互式图表实时响应筛选和日期切换。

    3. 🔍 查询管理 (Query)

    • 多维筛选: 支持按类型(收入/支出)、日期范围、关键词(分类/备注)进行组合查询。
    • 数据管理: 支持对历史记录进行修改删除
    • 客户端分页: 即使数据量大也能流畅分页浏览。

    🛠 技术栈

    🚀 快速开始

    前置准备

    1. 拥有一个 GitHub 账号。
    2. 生成一个 GitHub Personal Access Token (Classic)
      • Scope 权限: 必须勾选 gist 权限。

    本地运行

    # 1. 克隆项目
    git clone https://github.com/KnowSky404/gist-ledger.git
    cd gist-ledger
    
    # 2. 安装依赖 (推荐使用 pnpm)
    pnpm install
    
    # 3. 启动开发服务器
    pnpm dev
    

    使用说明

    1. 打开应用后,在登录页输入你的 GitHub Personal Access Token
    2. 点击 **"连接数据库"**。
      • 如果是首次使用,应用会自动在你的 Gist 中创建一个名为 GistLedger-Data 的私有 Gist 和 ledger_data.json 文件。
      • 如果已有数据,会自动同步拉取。
    3. 开始记账!你的 Token 和 Gist ID 会保存在本地浏览器缓存中,下次访问无需重复输入(除非清除缓存或点击退出)。

    🔒 数据安全

    • 应用不会将你的 Token 发送给除 GitHub API 以外的任何服务器。
    • 数据存储在你的私有 Gist 中,只有拥有该 Token 的人才能访问。
    • 建议定期备份 Gist 数据或使用 GitHub 的版本历史功能回滚误操作。

    📄 License

    GNU General Public License v3.0 (GPL-3.0)

    1. 文档概述

    1.1 文档目的

    本文档为[系统名称]接口的标准沟通文档,旨在XXX。

    1.2 文档修订记录

    修订版本修订时间修订人修订内容
    V1.02024-01-01[姓名]初始版本,完成用户管理模块核心接口编写

    1.3 接口通用规则

    1.3.1 基础URL

    环境类型基础URL前缀使用说明
    开发环境http://dev-[系统域名]/api/v1供开发人员日常开发、调试使用
    测试环境http://test-[系统域名]/api/v1供测试人员执行功能测试、集成测试使用
    预发布环境https://uat-[系统域名]/api/v1模拟生产环境配置,用于上线前用户最终验证
    生产环境https://[系统域名]/api/v1正式对外提供服务的环境,需严格控制访问权限

    1.3.2 数据与编码规范

    • 数据格式:请求/响应默认均为JSON格式,请求头需指定Content-Type: application/json
    • 编码格式:统一采用UTF-8编码,避免出现乱码问题

    2. 接口详细说明

    2.1 接口列表总览

    接口名称接口路径请求方法核心功能
    用户认证/auth/loginPOST用户通过账号密码获取访问令牌(Token)

    2.2 用户认证接口(/auth/login)

    2.2.1 接口基础信息

    功能描述:用户通过输入账号、密码及验证码完成身份校验,校验通过后获取访问令牌(Token)和刷新令牌,访问令牌用于后续接口调用的身份认证。

    • 接口路径:/auth/login
    • 请求方法:POST
    • 认证方式:无(无需携带Token)

    2.2.2 请求头参数

    字段名字段值是否必填说明
    Content-Typeapplication/json指定请求数据格式为JSON

    2.2.3 请求参数(Body)

    字段名类型是否必填描述格式要求
    usernamestring用户账号长度为4-20位,支持字母、数字及下划线
    passwordstring用户密码长度为8-20位,需包含大小写字母、数字及特殊字符
    captchastring验证码长度为4位,区分大小写,需与前端展示的验证码一致

    请求示例:

    
    {
      "username": "admin",
      "password": "Admin@123456",
      "captcha": "8FzQ"
    }

    2.2.4 响应参数

    2.2.4.1 成功响应
    字段名类型描述补充说明
    codeinteger业务成功码固定为200,表示业务处理成功
    messagestring响应信息描述成功时默认返回"登录成功"
    dataobject响应数据主体包含认证相关的令牌信息
    data.tokenstring访问令牌有效时长为2小时,后续接口调用需携带此令牌
    data.refreshTokenstring刷新令牌有效时长为7天,用于访问令牌过期后刷新获取新令牌
    2.2.4.2 错误响应
    字段名类型描述补充说明
    codeinteger业务错误码不同错误场景对应不同的错误码,具体参考第3章节状态码说明
    messagestring错误信息明确提示错误原因,便于问题排查
    dataobject错误响应体错误场景下通常为null

    成功响应示例:

    {
      "code": 200,
      "message": "登录成功",
      "data": {
        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",
        "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
      }
    }

    错误响应示例:

    {
      "code": 4001,
      "message": "账号或密码错误",
      "data": null
    }

    3. 状态码说明

    本文档中状态码分为业务状态码(接口响应中的code字段)和HTTP状态码,本章节主要说明业务状态码的含义及对应解决方案。

    状态码错误类型错误描述解决方案
    200成功业务处理成功无需处理,正常后续流程即可
    400参数错误请求参数缺失、格式错误或不符合校验规则(具体见错误信息)根据错误信息提示,按接口请求参数要求修正参数格式、补充缺失参数
    401认证错误未携带认证令牌、令牌已过期或令牌无效重新调用登录接口获取有效令牌,在请求头中添加Authorization字段(格式:Bearer [Token])
    403权限错误当前用户无该接口的访问权限联系系统管理员申请对应接口的访问权限,权限开通后再进行调用
    404资源错误接口路径不存在或请求的资源不存在核查接口路径是否与文档一致,确认请求的资源标识(如用户ID)是否有效
    500系统错误服务器内部错误,无法正常处理请求记录完整的错误响应信息(含请求参数、时间戳),联系后端开发人员排查问题

    4. 附录

    4.1 数据类型说明

    类型说明
    string字符串类型
    integer整数类型
    long长整数类型
    boolean布尔类型识
    object对象类型
    array数组类型

    在 ArkUI 里,做主题和平时做样式是两件事:

    • 样式:某个组件单独改 fontColorbackgroundColor
    • 主题:一整块区域里的组件,整体按一套规则变色

    API Version 12 开始,ArkUI 提供了一个专门做「局部主题」的组件:WithTheme
    它不负责画 UI,只负责一件事:给作用域里的组件套一层主题/深浅色规则

    这篇文章就是一份可以直接上手的 WithTheme 自学指南,适合发社区、做笔记或带项目里落地。


    一、WithTheme 是什么?

    官方定义很简单:

    • WithTheme 是一个主题作用域容器
    • 只接受一个子组件(可以是 Column / Row / 自定义组件);
    • 只负责两件事:

      • 配置这一块区域用哪套 自定义主题颜色theme);
      • 控制这一块区域的 深色 / 浅色模式colorMode)。

    基础信息:

    • 支持版本:从 API Version 12 开始;
    • 系统能力SystemCapability.ArkUI.ArkUI.Full
    • 元服务:从 API 12 开始支持元服务 API;
    • 不支持通用属性、不支持通用事件(它只是“包裹容器”,样式写在子组件上)。

    二、WithTheme 能影响哪些组件?

    不是所有组件都会响应 WithTheme,这点很关键。当前支持的系统组件包括:

    • 输入类:TextInputSearch
    • 按钮 & 徽标:ButtonBadgeCounter
    • 轮播 & 选择类:SwiperSelectMenu
    • 文本类:Text
    • 选择器类:

      • TimePickerDatePickerTextPicker
      • CheckboxCheckboxGroupRadio
      • Slider
    • 状态展示类:

      • ProgressTogglePatternLockQRCode
    • 分隔类:Divider
    简单记:表单控件 + 按钮 + 文本 + 分隔线,大部分能跟着 WithTheme 一起变。

    三、核心接口与配置项

    3.1 WithTheme 基本接口

    WithTheme(options: WithThemeOptions) {
      // 只能有一个子组件
      // 这个子组件里面可以再写 Column/Row/自定义组件
    }
    注意:WithTheme 不支持通用属性和通用事件,需要把布局、点击等逻辑写在内部组件上。

    3.2 WithThemeOptions 结构

    interface WithThemeOptions {
      theme?: CustomTheme        // 自定义主题配色
      colorMode?: ThemeColorMode // 深浅色模式
    }
    • theme?: CustomTheme

      • 用于指定 WithTheme 作用域内组件的缺省配色
      • 默认:undefined,表示跟随系统 token 默认样式。
    • colorMode?: ThemeColorMode

      • 控制作用域内组件的深色/浅色模式
      • 默认:ThemeColorMode.SYSTEM(跟随系统)。

    3.3 CustomTheme 类型

    type CustomTheme = CustomTheme
    • CustomTheme 实际上是一个接口;
    • 搭配 CustomColors 一起使用,用来描述一整套颜色体系(比如一套绿色主题、一套红色主题)。

    四、局部深浅色:colorMode 实战

    很多页面希望做到:

    • 整体跟随系统;
    • 但某一块区域 强制深色(比如顶部 Banner)或 强制浅色(比如活动卡片)。

    这时可以用 WithTheme 搭配 colorMode

    4.1 深浅色资源准备:dark.json

    image.png

    要让深浅色生效,先准备深色资源文件 dark.json,例如:

    {
      "color": [
        {
          "name": "start_window_background",
          "value": "#000000"
        }
      ]
    }

    4.2 示例:同一页面展示默认、Dark、Light 三种区域

    image.png

    @Entry
    @Component
    struct Index {
      build() {
        Column() {
          // ① 系统默认区域
          Column() {
            Text('无WithTheme')
              .fontSize(40)
              .fontWeight(FontWeight.Bold)
          }
          .justifyContent(FlexAlign.Center)
          .width('100%')
          .height('33%')
          .backgroundColor($r('app.color.start_window_background'))
    
          // ② 局部强制深色模式
          WithTheme({ colorMode: ThemeColorMode.DARK }) {
            Column() {
              Text('WithTheme')
                .fontSize(40)
                .fontWeight(FontWeight.Bold)
              Text('DARK')
                .fontSize(40)
                .fontWeight(FontWeight.Bold)
            }
            .justifyContent(FlexAlign.Center)
            .width('100%')
            .height('33%')
            .backgroundColor($r('sys.color.background_primary'))
          }
    
          // ③ 局部强制浅色模式
          WithTheme({ colorMode: ThemeColorMode.LIGHT }) {
            Column() {
              Text('WithTheme')
                .fontSize(40)
                .fontWeight(FontWeight.Bold)
              Text('LIGHT')
                .fontSize(40)
                .fontWeight(FontWeight.Bold)
            }
            .justifyContent(FlexAlign.Center)
            .width('100%')
            .height('33%')
            .backgroundColor($r('sys.color.background_primary'))
          }
        }
        .height('100%')
        .expandSafeArea(
          [SafeAreaType.SYSTEM],
          [SafeAreaEdge.TOP, SafeAreaEdge.END, SafeAreaEdge.BOTTOM, SafeAreaEdge.START]
        )
      }
    }

    使用建议:

    • 想让某个模块始终深色:WithTheme({ colorMode: ThemeColorMode.DARK })
    • 想让底部工具条固定浅色:ThemeColorMode.LIGHT
    • 根节点跟系统,局部区域用 WithTheme 做反色/特殊效果,是比较推荐的实践。

    五、自定义主题:CustomTheme + CustomColors 实战

    除了深浅色,有时我们希望整块区域用一套品牌色,比如「绿色主题卡片」vs「红色活动卡片」。

    这时用 CustomTheme 来定义一套颜色,然后交给 WithTheme

    5.1 定义颜色集合 CustomColors

    import { CustomTheme, CustomColors } from '@kit.ArkUI';
    
    class GreenColors implements CustomColors {
      fontPrimary = '#ff049404';
      fontEmphasize = '#FF00541F';
      fontOnPrimary = '#FFFFFFFF';
      compBackgroundTertiary = '#1111FF11';
      backgroundEmphasize = '#FF00541F';
      compEmphasizeSecondary = '#3322FF22';
    }
    
    class RedColors implements CustomColors {
      fontPrimary = '#fff32b3c';
      fontEmphasize = '#FFD53032';
      fontOnPrimary = '#FFFFFFFF';
      compBackgroundTertiary = '#44FF2222';
      backgroundEmphasize = '#FFD00000';
      compEmphasizeSecondary = '#33FF1111';
    }
    实际项目里可以按照设计给的 token 表来映射,保持命名和 UI 视觉规范一致。

    5.2 封装成 CustomTheme

    class PageCustomTheme implements CustomTheme {
      colors?: CustomColors
    
      constructor(colors: CustomColors) {
        this.colors = colors
      }
    }

    5.3 使用 WithTheme 控制局部主题

    下面这个例子展示了一个典型的用法:
    上半部分使用系统默认按钮配色
    下半部分被 WithTheme 包裹,使用可切换的自定义主题

    @Entry
    @Component
    struct IndexPage {
      static readonly themeCount = 3;
    
      themeNames: string[] = ['System', 'Custom (green)', 'Custom (red)'];
    
      themeArray: (CustomTheme | undefined)[] = [
        undefined,                              // 系统默认主题
        new PageCustomTheme(new GreenColors()), // 绿色主题
        new PageCustomTheme(new RedColors())    // 红色主题
      ]
    
      @State themeIndex: number = 0;
    
      build() {
        Column() {
          // 区域一:未使用 WithTheme,系统默认配色
          Column({ space: '8vp' }) {
            Text('未使用WithTheme')
    
            // 点击切换下方 WithTheme 的配色
            Button(`切换theme配色:${this.themeNames[this.themeIndex]}`)
              .onClick(() => {
                this.themeIndex = (this.themeIndex + 1) % IndexPage.themeCount;
              })
    
            // 系统默认按钮配色
            Button('Button.style(NORMAL) with System Theme')
              .buttonStyle(ButtonStyleMode.NORMAL)
            Button('Button.style(EMP..ED) with System Theme')
              .buttonStyle(ButtonStyleMode.EMPHASIZED)
            Button('Button.style(TEXTUAL) with System Theme')
              .buttonStyle(ButtonStyleMode.TEXTUAL)
          }
          .margin({ top: '50vp' })
    
          // 区域二:使用 WithTheme,局部换肤
          WithTheme({ theme: this.themeArray[this.themeIndex] }) {
            Column({ space: '8vp' }) {
              Text('使用WithTheme')
              Button('Button.style(NORMAL) with Custom Theme')
                .buttonStyle(ButtonStyleMode.NORMAL)
              Button('Button.style(EMP..ED) with Custom Theme')
                .buttonStyle(ButtonStyleMode.EMPHASIZED)
              Button('Button.style(TEXTUAL) with Custom Theme')
                .buttonStyle(ButtonStyleMode.TEXTUAL)
            }
            .width('100%')
          }
        }
      }
    }

    效果:

    • 上半部分:始终采用系统默认主题;
    • 下半部分:随着按钮点击,在 System / Green / Red 三种主题间切换;
    • 完全局部生效,不影响其他页面和组件。

    六、常见使用场景

    结合上面的能力,WithTheme 很适合这些场景:

    1. 局部夜间模式

      • 例如:播放器底部控制条、评论区、侧边栏等;
      • 根页面跟系统,某个区域用深色:
      WithTheme({ colorMode: ThemeColorMode.DARK }) {
        // 播放控制区 / 评论列表
      }
    2. 卡片级换肤 / 品牌卡片

      • 营销活动卡片、会员卡片、小程序入口等:
      WithTheme({ theme: new PageCustomTheme(new GreenColors()) }) {
        // 活动卡片 / 会员卡片布局
      }
    3. 表单区域统一风格

      • 一个复杂表单里用到 Button / TextInput / Checkbox / Slider 等:
      • 全部丢在 WithTheme 里,做一套专门的表单主题。
    4. 多主题 Demo / 设置页

      • 设置页里提供「主题预览」;
      • 上方一个切换按钮,下面用了多个 WithTheme 区块分别展示效果。

    七、容易踩的点 & 调试建议

    1. 子组件只能一个

      • WithTheme 的子节点只能是一个组件;
      • 如果有多个,请用 Column/Row/自定义组件包一层。
    2. 不是所有组件都响应主题

      • 自绘组件(Canvas、Shape 等)不会自动跟主题;
      • 自定义组件如果内部没用系统控件,也看不到效果。
    3. 内部写死颜色会覆盖部分主题

      • 比如你在 Button 上手动设置了 backgroundColor('#FF0000')
      • 这可能会盖住主题里本来给它配置的一些颜色表现;
      • 建议:尽量用 buttonStylefontColor + 主题,让主题主导,而不是全部手写 Hex。
    4. 深浅色看起来没变化?

      • 检查是否已经配置 dark.json 等资源;
      • 检查是不是本身背景就接近黑/白,导致肉眼不明显;
      • 可以临时多放一些 Text / Button 观察效果。

    八、总结

    WithTheme 的定位可以一句话概括:

    内外解耦:全局主题搞整体,WithTheme 专门做“局部换肤 + 局部深浅色”。

    掌握它之后,你可以在 ArkUI 里轻松实现:

    • 某一块区域固定深色 / 浅色;
    • 某类卡片、一段区域统一走品牌主题色;
    • 在一个页面里同时展示多套主题效果,而不影响全局。

    之前我在 https://www.v2ex.com/t/1169016 的 append 中提到了 IP 送中这个事,想简单了解送中原理的可以看下那个帖子,最近因为 Gemini 和 Google Antigravity ,IP 送中这个事好像又被大家提及了,分享个也许是判断 IP 是否被送中的方法

    浏览器无痕模式下访问: https://maps.google.com/maps/timeline
    如果提示登录 Google 账号/唤醒 Google Map:至少你当前的 IP 没有被送中;
    如果访问报错 那么大概率这个 IP 被送中了。

    原理:
    这个网址就是 Google Map 的 timeline 时间线业务,CN 地区不属于服务范围,因此当被送中的 IP 访问该业务时就会报错,所以可以粗暴用来判断 IP 是否被送中。

    注意:
    Google 很多业务的服务地区范围不一样,例如 timeline 、YouTube Premium 是支持 HK 地区,而 gemini 不支持 HK 地区,所以这个方案只能确定 IP 是否被送中,不能确定该 IP 能 100%使用 Gemini ,如果需要使用 Gemini ,请还是选择 gemini 支持地区的 IP 。

    最近在对比语音输入工具,发现微信输入法的语音转文字竟然是最好用的。

    之前用过一个专门的桌面端语音工具,本地跑 LLM ,听起来很厉害。但实际体验:

    • 专有名词记不住,比如 inBox Notes 总是识别错
    • 中英混说时识别不准确
    • 经常需要手动修正

    结果微信输入法按住空格就能说话,识别还更准,查了一下,去年 12 月他们做了 AI 优化。

    更值得说的是产品思路:

    1. 没有账号体系,不用登录,不用云同步
    2. 没有广告,体验很轻量
    3. 跨设备复制,手机复制电脑直接贴(同局域网)

    在大家都想做"用户留存"的时候,它选择了"不粘人"。

    唯一遗憾是电脑端还没有语音输入。对于开发者和创作者来说,这个需求其实很强烈。


    大家都在用什么输入法?语音输入体验如何?

    周五了,利用摸鱼时间为 2Libra 打造了新的油猴脚本 - 2Libra Plus。

    ✨ 主要功能

    1. 通知中心增强

    • 未读消息高亮:自动检测通知列表中的未读条目,并在左侧添加醒目的橙色竖线标记,帮助你快速定位未处理的通知。
    • 自动已读(可选):支持进入通知页后自动将当前页消息标记为已读,减少重复点击操作(默认开启,可在设置中关闭)。

    screencapture

    2. 主题列表增强

    • 回复时间颜色渐变:根据你上次在首页查看时间,将最新回复显示得更醒目,较久之前的回复颜色更浅,帮助你一眼区分「最近更新」和「很久没动」的帖子。为了避免频繁刷新带来的视觉抖动,「上次查看时间」在 5 分钟内不会更新;最新回复会使用 --color-primary 颜色展示,更加醒目。

    screencapture

    3. 个性化设置

    • 提供可视化的设置面板,可随时开启或关闭特定功能,按需定制你的使用体验。

    !. 还会有更多功能...

    ⬇️ 安装方法

    相关链接

    建议反馈

    大家如有需要的功能,尽管提,觉得有用我会考虑加进去。

    FDM 全称 Free Download Manager,是个免费下载工具,支持 HTTP、FTP、BT 种子、磁力链,还能断点续传、加速下载,比浏览器自带下载器好用多了。

    fdm_x64_setup_6.14.2.3973.exe是 64 位系统的安装包,版本号 6.14.2.3973,安装完就能用,没啥复杂的设置。

    一、准备工作

    1. 下载安装包

    2. 关闭杀毒软件(可选)

      • 个别杀毒软件会误报,安装时可以先暂时关掉,装完再开。

    二、安装 FDM

    1. 双击 fdm_x64_setup_6.14.2.3973.exe运行。
    2. 选语言(默认 English,点下拉框选“简体中文”更方便)。
    3. 点  “Next” ​ 继续。
    4. 选安装位置:

      • 默认是 C:\Program Files\Free Download Manager,想改就点“Browse”选 D 盘或其他盘。
    5. 选组件:

      • 一般全选(包括浏览器扩展,能接管浏览器下载),点“Next”。
    6. 选附加任务:

      • 建议勾“创建桌面快捷方式”和“开机启动”(想省事就勾,不想要就取消),点“Next”。
    7. 点  “Install” ​ 开始安装,等进度条走完。
    8. 最后点  “Finish” ​ 完成安装,FDM 会自动启动。

    三、基本使用(下载文件)

    1. 普通下载(HTTP/FTP)

    • 复制文件下载链接(比如 https://example.com/file.zip)。
    • 打开 FDM,点左上角  “添加” ​ 按钮(或按 Ctrl+U)。
    • 粘贴链接,点“确定”,FDM 就开始下载了。
    • 在下载列表里能看到进度、速度、剩余时间,还能暂停/继续/限速。

    2. BT 种子/磁力链下载

    • 点  “添加” ​ → 选“Torrent 文件”,找到 .torrent种子文件打开;
    • 或者直接粘贴磁力链接(以 magnet:开头的),点“确定”;
    • FDM 会自动解析并开始下载 BT 任务。

    3. 浏览器接管下载

    • 安装时会提示安装浏览器扩展(Chrome、Edge、Firefox 都支持)。
    • 装好后,在浏览器里点下载链接,会自动跳转到 FDM 下载,不用手动复制链接。

    四、常用设置(优化体验)

    1. 限速设置

      • 右键下载任务 → “速度限制”,设最大下载速度和上传速度(不影响上网速度)。
    2. 更改下载目录

      • 点顶部  “选项”→“常规” ,改“默认下载文件夹”(比如 D:\Downloads)。
    3. 开机启动

      • 点  “选项”→“常规” ,勾“随 Windows 启动”,开机就能直接用。
    4. 批量下载

      • 点  “文件”→“批量下载” ,粘贴多个链接(每行一个),一次性添加多个任务。

    流量统计功能文档


    仓库地址:https://gitee.com/teanary/teanary_service

    目录

    功能概述

    流量统计功能用于统计网站前台的访问数据,包括真人访问和爬虫访问。系统会自动区分访问者类型,并记录详细的访问信息,帮助管理员了解网站的访问情况。

    主要功能

    • ✅ 自动统计前台访问流量
    • ✅ 区分真人访问和爬虫访问
    • ✅ 识别爬虫来源(Google、Bing、Baidu等)
    • ✅ 缓存数据,批量写入数据库(每5分钟)
    • ✅ 自动清理过期数据(默认保留90天)
    • ✅ 提供统计看板和详细列表页面

    功能特性

    1. 智能过滤

    系统会自动排除以下请求:

    • ❌ 管理后台(/manager/*
    • ❌ 个人中心(/user/*
    • ❌ API 路由(/api/*
    • ❌ 静态资源(.css, .js, .jpg, .png 等)
    • ❌ 非 GET 请求

    2. 爬虫识别

    系统能够识别以下类型的爬虫:

    搜索引擎爬虫:

    • Google (Googlebot)
    • Bing (Bingbot)
    • Baidu (Baiduspider)
    • Yandex (Yandexbot)
    • Yahoo (Slurp)
    • DuckDuckGo (Duckduckbot)
    • Sogou (Sogou)

    社交媒体爬虫:

    • Facebook (Facebookexternalhit)
    • Twitter (Twitterbot)
    • LinkedIn (Linkedinbot)
    • Pinterest (Pinterestbot)

    其他爬虫:

    • Semrush (Semrushbot)
    • Ahrefs (Ahrefsbot)
    • Majestic (Mj12bot)
    • Dotbot
    • 以及其他通用爬虫(bot、crawler、spider等)

    3. 数据记录

    每条流量记录包含以下信息:

    • 路径 (path): 访问的页面路径
    • 方法 (method): HTTP 方法(通常为 GET)
    • IP 地址 (ip): 访问者的 IP 地址
    • 用户代理 (user_agent): 浏览器或爬虫的用户代理字符串
    • 来源页面 (referer): 来源页面的 URL
    • 语言 (locale): 访问时使用的语言代码
    • 是否爬虫 (is_bot): 是否为爬虫访问
    • 爬虫来源 (spider_source): 爬虫的具体来源(如 google、bing 等)
    • 访问次数 (count): 同一分钟内相同路径的访问次数
    • 统计时间 (stat_date): 统计日期(精确到分钟)

    技术架构

    数据流程

    用户访问 → TrackTraffic 中间件 → 缓存数据 → 批量写入队列 → 数据库

    核心组件

    1. 中间件 (TrackTraffic)

      • 位置:app/Http/Middleware/TrackTraffic.php
      • 功能:拦截请求,记录流量数据到缓存
    2. 批量写入任务 (BatchWriteTrafficStatsJob)

      • 位置:app/Jobs/BatchWriteTrafficStatsJob.php
      • 功能:每5分钟批量将缓存数据写入数据库
    3. 数据清理命令 (CleanOldTrafficStats)

      • 位置:app/Console/Commands/CleanOldTrafficStats.php
      • 功能:清理超过指定天数的历史数据
    4. 数据模型 (TrafficStatistic)

      • 位置:app/Models/TrafficStatistic.php
      • 功能:定义数据结构和查询方法
    5. 管理界面

      • 统计看板:app/Filament/Manager/Pages/TrafficStatistics.php
      • 详细列表:app/Filament/Manager/Resources/TrafficStatisticResource.php

    缓存机制

    • 使用 Laravel Cache 存储临时流量数据
    • 缓存键格式:traffic:queue:Y-m-d-H-i
    • 缓存过期时间:1小时
    • 每5分钟批量写入一次数据库

    配置说明

    1. 中间件注册

    中间件已在 routes/web.php 中注册:

    Route::prefix('{locale}')->middleware([
        SetLocaleAndCurrency::class, 
        \App\Http\Middleware\TrackTraffic::class
    ])->group(function () {
        // 前台路由
    });

    2. 定时任务配置

    routes/console.php 中已配置:

    // 流量统计批量写入任务(每5分钟执行一次)
    Schedule::command('app:batch-write-traffic-stats --queue')
        ->everyFiveMinutes()
        ->withoutOverlapping()
        ->runInBackground();
    
    // 流量统计数据清理任务(每天凌晨2点执行,清理90天前的数据)
    Schedule::command('app:clean-old-traffic-stats')
        ->dailyAt('02:00')
        ->withoutOverlapping();

    3. 数据库表结构

    表名:traffic_statistics

    主要字段:

    • id: 主键(雪花ID)
    • path: 访问路径(索引)
    • method: HTTP 方法(索引)
    • ip: IP 地址(索引)
    • user_agent: 用户代理
    • referer: 来源页面
    • locale: 语言代码(索引)
    • is_bot: 是否为爬虫(索引)
    • spider_source: 爬虫来源(索引)
    • count: 访问次数
    • stat_date: 统计时间(索引,精确到分钟)

    使用方法

    1. 查看统计看板

    1. 登录管理后台
    2. 导航到 统计流量统计看板
    3. 可以查看:

      • 总访问量、页面浏览量、独立IP、独立页面
      • 真人访问和爬虫访问的对比
      • 热门页面 Top 20
    4. 支持筛选:

      • 日期范围:今天、昨天、最近7天、最近30天、最近90天
      • 访问者类型:全部、真人访问、爬虫访问

    2. 查看详细列表

    1. 登录管理后台
    2. 导航到 统计流量明细
    3. 可以查看每条访问记录的详细信息
    4. 支持筛选:

      • 访问类型(真人/爬虫)
      • 爬虫来源
      • 日期范围

    3. 手动触发批量写入

    如果需要立即将缓存数据写入数据库,可以执行:

    php artisan app:batch-write-traffic-stats

    4. 手动清理数据

    清理超过指定天数的数据:

    # 清理90天前的数据(默认)
    php artisan app:clean-old-traffic-stats
    
    # 清理30天前的数据
    php artisan app:clean-old-traffic-stats --days=30
    
    # 清理180天前的数据
    php artisan app:clean-old-traffic-stats --days=180

    数据管理

    数据保留策略

    • 默认保留时间:90天
    • 清理时间:每天凌晨2点自动执行
    • 清理方式:分批删除,每批1000条记录

    数据统计方法

    获取指定时间范围内的统计数据
    use App\Models\TrafficStatistic;
    use Illuminate\Support\Carbon;
    
    // 获取最近7天的所有数据
    $startDate = Carbon::today()->subDays(6);
    $endDate = Carbon::today()->endOfDay();
    $stats = TrafficStatistic::getStatsByDateRange($startDate, $endDate);
    
    // 只获取真人访问数据
    $humanStats = TrafficStatistic::getStatsByDateRange($startDate, $endDate, false);
    
    // 只获取爬虫访问数据
    $botStats = TrafficStatistic::getStatsByDateRange($startDate, $endDate, true);
    获取热门页面
    // 获取最近7天的热门页面 Top 10
    $topPages = TrafficStatistic::getTopPages($startDate, $endDate, 10);
    
    // 只获取真人访问的热门页面
    $topHumanPages = TrafficStatistic::getTopPages($startDate, $endDate, 10, false);
    
    // 只获取爬虫访问的热门页面
    $topBotPages = TrafficStatistic::getTopPages($startDate, $endDate, 10, true);

    常见问题

    Q1: 为什么有些访问没有被统计?

    A: 系统会自动排除以下请求:

    • 管理后台和个人中心的访问
    • API 路由
    • 静态资源文件
    • 非 GET 请求

    如果您的访问路径符合以上条件,将不会被统计。

    Q2: 数据多久写入一次数据库?

    A: 系统每5分钟自动批量写入一次。如果需要立即写入,可以手动执行 php artisan app:batch-write-traffic-stats 命令。

    Q3: 如何修改数据保留时间?

    A: 有两种方式:

    1. 修改定时任务:编辑 routes/console.php,修改 --days 参数
    2. 手动执行:执行 php artisan app:clean-old-traffic-stats --days=天数

    Q4: 爬虫识别不准确怎么办?

    A: 可以修改 app/Http/Middleware/TrackTraffic.php 中的 isBot()getSpiderSource() 方法,添加或修改爬虫识别规则。

    Q5: 如何查看缓存中的数据?

    A: 可以使用 Laravel Tinker:

    php artisan tinker

    然后执行:

    // 查看某个时间点的队列
    Cache::get('traffic:queue:2026-01-17-14-30');
    
    // 查看所有流量相关的缓存键(需要 Redis)
    Redis::keys('traffic:*');

    Q6: 数据量很大,会影响性能吗?

    A: 系统采用了以下优化措施:

    • 使用缓存暂存数据,减少数据库写入频率
    • 批量写入,每5分钟写入一次
    • 使用索引优化查询性能
    • 自动清理过期数据,控制数据量

    如果数据量仍然很大,可以考虑:

    • 缩短数据保留时间
    • 增加批量写入频率
    • 优化数据库索引

    Q7: 如何禁用流量统计?

    A:routes/web.php 中移除 TrackTraffic::class 中间件即可。

    Q8: 可以统计其他路径吗?

    A: 可以修改 app/Http/Middleware/TrackTraffic.php 中的 shouldTrack() 方法,调整过滤规则。

    相关文件

    • 中间件:app/Http/Middleware/TrackTraffic.php
    • 批量写入任务:app/Jobs/BatchWriteTrafficStatsJob.php
    • 清理命令:app/Console/Commands/CleanOldTrafficStats.php
    • 数据模型:app/Models/TrafficStatistic.php
    • 统计看板:app/Filament/Manager/Pages/TrafficStatistics.php
    • 详细列表:app/Filament/Manager/Resources/TrafficStatisticResource.php
    • 数据库迁移:database/migrations/2026_01_17_204550_create_traffic_statistics_table.php

    更新日志

    2026-01-17

    • ✅ 初始版本发布
    • ✅ 支持真人/爬虫区分
    • ✅ 支持爬虫来源识别
    • ✅ 自动批量写入和清理

    文档版本:1.0
    最后更新:2026-01-17