news 2026/9/20 19:39:02

FineReport替代方案全解析:从选型对比到迁移校验实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FineReport替代方案全解析:从选型对比到迁移校验实战指南

1. 为什么2026年大家都在重新审视FineReport

做报表系统选型这件事,我最近已经帮三家公司评估过FineReport的替代方案了。坦白讲,到了2026年,真正让人头疼的问题已经不是“要不要换”,而是“怎么换不翻车、换完怎么证明它是对的”。FineReport这个产品本身不差,但授权费用、私有化部署方式、与云原生环境的适配,以及越来越定制化的前端交互需求,让很多团队在续费节点开始动摇。这篇文章就把替代方案、迁移路径、校验方法三块内容完整写出来,重点落在迁移和校验这两个最容易被低估的环节上。

1.1 先算账:商业授权与长期成本到底贵在哪

FineReport的计费方式按模块、按年订阅,还会限制并发数。很多企业买的时候觉得自己只要基础报表导出功能,买个专业版就够,结果报表越做越多,填报功能、移动端、大屏、定时调度全都是额外模块。到了续费节点一核算,一年下来几万到几十万不等的授权和维护费用,在研发预算里非常扎眼。特别是报表数量不多、但必须长期依赖商业产品的团队,往往会在这个节点开始物色替代品。

如果只是价格问题,那还好办,辛辛苦苦迁移过去,结果算总账发现迁移成本更高,就亏了。所以第一步不是看新工具卖多少钱,而是把以下几项成本都列出来:新旧方案的总拥有成本、模板重写工作量、双跑期人工成本、上线前后的数据校验成本、后续维护团队的技术门槛。我见过不少团队只盯着授权费切换,最后模板重写加数据口径核对花了三个月,隐性成本远高于省下的钱。算清楚这笔账,再继续看下面的方案。

1.2 云化、集成与定制:老报表系统被点名的地方

续费贵只是一个引子。真正让团队下决心换的,往往是架构层面的不匹配。现在的应用普遍往容器化、云原生方向走,而很多老报表系统还是传统的war包部署方式,依赖固定的应用服务器,迁移到容器环境时需要额外适配。前端集成也一样,业务系统要嵌报表,旧方案多半是iframe嵌入,页面之间来回跳转,交互上确实生硬;想自定义工具栏、加按钮、改样式,就得研究他家的二次开发接口,文档和社区往往跟不上需求。

另外还有移动端与大屏场景。FineReport不是做不到,只是很多企业只买了基础版,移动端和大屏模块是分开授权的,一张大屏的开发和维护成本也不低。把这些需求全部列出来,你会发现替代这件事解决的不只是“报表能不能画出来”,而是“报表能不能在业务系统里融入得更自然”。所以替代方案的评估维度,至少包括部署方式、嵌入方式、是否支持单点登录、填报回写能力、移动端适配、开发语言与团队熟悉度,这几项比单纯比画表格的样式要重要得多。

1.3 清醒一点:报表替代不是换软件,是迁移工程

很多人以为替代方案就是找另一个设计器,把原来那几十张模板重新画一遍。真做过一次就知道,报表系统的资产不光是模板文件,还有SQL口径、数据权限、调度任务、邮件推送、打印模板、填报流程,这些散落在系统的各个角落。把这些资产完整地搬过去,并且证明搬完之后的结果跟原来一致,这件事本身就是一个小型平台迁移工程。

做过系统迁移的朋友应该懂这种感觉:文件拷过去了,环境变量没配,一堆依赖报错;数据导过去了,编码格式不对,中文全是乱码。报表迁移比这更麻烦的地方在于,你还要验证“同一份数据,两张报表画出来是不是一样”,而且这种一致性的单位不是整包,是每个单元格、每个汇总值、每次导出。所以后面所有章节的落点都是两个词:迁移和校验。把这两件事做好,替代方案选哪个反而成了相对简单的问题。

2. 替代方案怎么选:开源报表、BI平台、自研横向对比

2.1 国内开源报表:积木报表与UReport2的取舍

先说我接触最多的两类开源方案。积木报表(JimuReport)是国内用得比较多的开源报表项目,类Excel的在线设计器、报表展示、填报、图表、打印这些基础能力都有,而且和主流Java框架集成起来很顺,很多团队在替换时会把积木报表作为第一优先级去验证。它比较适合做业务报表、表单、填报页面,上手速度快,开发能很快拖出一张能看的表。

UReport2是更早的纯Java开源报表引擎,设计器也是Web版类Excel操作,理解成本低,特别适合本来就用原生Java开发、希望报表引擎以库的方式嵌入到项目里的团队。但它的问题也很明显:项目维护频率这几年不算高,社区活跃度一般,遇到诡异bug时能查到的资料有限。这类开源项目选型时一定要做一次POC,把自己最复杂的几张报表拿过去跑一遍,别只听网上的对比结论,因为报表这行“看起来差不多”和“真实结果一样”是两回事。

2.2 BI类方案:DataEase、Superset能顶替多少场景

如果你们的报表主要是分析看板、数据大屏、业务自助分析,那么开源BI方向可以重点看DataEase和Apache Superset。DataEase是开源的BI工具,数据源、数据集、仪表板这套模型很清晰,也支持填报插件,部署相对简单,国内使用的人多,中文资料好找。Superset则是国际上用得比较广的BI平台,图表类型丰富,但是对中国式复杂报表的支持比较弱,多级表头、合并单元格、填报回写这些场景它不擅长。

我的判断是:BI工具适合替代“分析型报表”,不适合替代“类Excel复杂业务报表”。如果你的核心报表里大量出现交叉表、主子报表、复杂分组、按条件合并单元格,那纯BI方案大概率撑不住。很多团队的合理做法是“混合”:分析看板类报表用BI,复杂业务报表用开源报表或自研组件,而不是指望一个工具统一所有场景。

2.3 商业BI与低代码平台:不想折腾时的选择

如果团队不想在生产环境维护一堆开源组件的兼容性问题,商业方案依然存在,比如Smartbi、永洪BI、润乾报表这些国内产品。它们对类Excel报表、填报、移动端、大屏都有完整方案,有些产品在复杂报表和Java嵌入方面做得比FineReport还深入。商业方案的好处是出了问题有人响应,模板和数据权限体系相对成熟,缺点是同样要付授权费,迁移时同样要重做模板,所以本质上是用钱换时间和稳定性。

低代码平台(简道云、宜搭这类)也可以作为一种补充。它们适合业务部门自己搭简单的数据收集和查询页面,但一旦涉及复杂数据权限、超大结果集、严格的打印格式,低代码平台往往力不从心。在企业报表场景里,我更愿意把低代码平台看作“临时救火队员”,而不是核心报表系统的正式替代品。

2.4 自研报表引擎:什么情况下才值得自己做

自研是个很容易被低估工作量、也很容易被高估收益的方向。我的经验是:只有在“现有工具都满足不了”时才值得考虑。典型场景是报表形态高度定制,比如要在表格里做复杂的单元格合并、嵌套子表、和前端地图组件深度联动,而这种定制在现成报表工具里要写大量脚本。如果你有一支前端能力比较强的团队,核心报表数量又稳定在十张以内,用ECharts加表格组件加后端查询服务来定制看板,维护起来会比套一个报表工具更顺手。

反过来,如果历史报表有几十张上百张,团队没有专职前端,只是想省授权费,那自研就是最差选择。报表看起来简单,做起来全是细节:导出Excel要保持样式、打印要精确分页、大数据量要服务端分页、权限要行级过滤,这些一旦全部自己实现,开发周期能拖到你怀疑人生。

2.5 周边配套一起看:对象存储、中间件、Web服务器

做报表替代的时候,很多团队还会顺带做周边配套的替代升级。比如对象存储原来用商业存储,现在很多轻量方案可以平替,比较常见的包括MinIO,部署简单、S3协议兼容;再比如原来的报表服务挂在Tomcat上,如果整体在做容器化,可以用Spring Boot内嵌容器直接取代外部部署,省一个运维节点;Web服务器层面,很多替代工作其实是用统一网关配置来代替多台负载均衡。这些周边替换不会单独决定报表替代的成败,但会在整体架构升级时一起影响迁移复杂度,所以评估阶段最好放在一张表里看,避免后续反复动网络和数据源配置。

3. 迁移前的摸底与解析:把家底盘清楚再动手

3.1 四张清单:报表目录、模板文件、数据源、权限

真正开始迁移之前,第一步是把家底盘清楚。我习惯先建四张清单:报表目录清单、模板文件清单、数据源清单、权限清单。报表目录清单不是简单罗列名字,要包含每张报表的访问频率、最后使用时间、归属部门,这个数据能帮你筛掉大量僵尸报表——很多系统里一半报表半年没人打开过,这次迁移正好趁机清理掉。

模板文件清单要具体到文件路径、文件类型、文件大小、引用了哪些资源文件。FR的模板文件通常有固定扩展名,在服务器上可以整目录扫描,再结合数据库里的菜单表和权限表反查,基本就能得到全量清单。数据源清单要把数据库类型、连接串、JDBC驱动版本、涉及的表和字段都记下来,这一步做得细致,后面适配SQL时能省很多功夫。权限清单则要记录哪些角色能看哪些目录、哪些数据行,不要等迁移完了才发现某个角色看不到自己的报表。

3.2 模板结构化解析:从cpt文件里挖出SQL、参数和口径

这一步是整个迁移里最有技术含量、也最容易被跳过的环节。FineReport的cpt模板文件本质上是结构化文件,很多版本就是XML结构,或者是包含XML内容的压缩包,所以完全可以用脚本把模板当作文档来解析。我一般用Python的zipfile加ElementTree两层处理:先用zipfile解开模板包,再遍历里面的XML节点,提取数据集名称、SQL语句、参数名称、单元格引用的字段,最后汇总成一张“报表-数据集-SQL-参数”的映射表。

这份映射表的价值远超迁移本身。很多报表的取数口径没有任何文档,SQL里写了什么就是什么。解析完之后你会发现,原来两张同名报表的SQL口径居然不一样,原来某张报表引用的表已经被废弃了。把这些信息整理出来,等于把整个报表体系的数据口径审计了一遍,也给新系统的数据集设计提供了直接依据。网上有一些现成的FR模板解析工具,但版本差异大,建议直接自己写脚本,反正逻辑不复杂,解析一次后面还能复用。

3.3 数据源与SQL方言适配:老查询直接搬的三大坑

报表迁移中数据核对不一致,很大一部分问题出在SQL方言上。旧系统如果跑的是Oracle或SQL Server,新系统换到PostgreSQL或者其他数据库,SQL基本都要改。最常见的三大坑:空值函数不一样(nvl换coalesce、isnull换coalesce)、日期函数不一样(to_char两边都有但格式符可能不同、getdate要换成current_date或now)、分页语法不一样(top要换成limit或fetch first)。字符串拼接符号也有差异,Oracle用||,SQL Server用+,这个在动态报表参数拼接时特别容易踩。

我的做法是先把迁移涉及的SQL全部收集到一个目录里,写一个静态检查脚本,把常见方言函数名扫出来,逐个确认改写。然后不管看起来改得多顺,每一条SQL都要在目标库上真实跑一遍,确认行数、字段数、字段类型跟原库一致。这个环节不要图省事,宁可让脚本多跑几轮,也不要上线后再让用户在报表上发现数据不对。

3.4 分批迁移与回滚设计:业务不能断

迁移别指望一夜完成。合理的做法是把报表分成几个批次:第一批选低频、逻辑简单、几乎不变化的静态报表;第二批是普通查询类报表;第三批才是核心高频报表和填报业务。每个批次完成之后,新旧系统并行观察一个完整的业务周期,比如月度报表就至少观察一个月,用这段时间把差异暴露出来。

回滚设计要从第一天就做好。新系统上线后不要立刻关掉旧系统,至少保留旧系统的只读入口,模板源代码和数据源连接都不急着删。切换时间尽量选在业务低峰期,而且数据源连接要做到可快速切换:新系统出问题,一键指回旧数据源,用户还能照常用。很多团队把回滚想得太复杂,其实是配置里一个数据源地址的变量,提前把它准备好,心里就有底。

4. 迁移实施:模板转写、权限映射与文件一致性校验

4.1 模板转写策略:从单元格拖拽思维拆成数据、结构、样式三层

FineReport这类工具的核心操作方式是“单元格拖拽”,一个列表就是一行一行单元格往下摆,分组、过滤都写在单元格属性里。换到新平台后,如果还是照着老模板一格一格搬,你会发现两个问题:一是工作量大到无法承受,二是新平台的机制可能根本不一样。我的建议是把模板拆成三层来处理:数据层、结构层、样式层。数据层就是SQL和参数,这是最核心的资产,应该重写提炼而不是照搬;结构层指的是表头层级、扩展方式、分组逻辑,这部分要理解老报表的意图,在新平台里重新实现;样式层是字体、边框、颜色、冻结行列,这些可以放到最后,先保证数据正确再优化美观。

具体操作上,建议先选三到五张不同类型的报表做样本:一张列表报表、一张交叉分组报表、一张主子报表、一张填报报表,把整条迁移链路跑通。跑通之后你就能判断新平台哪些能力是现成的、哪些要写脚本补充,然后才进入批量复制阶段。一上来就批量迁移是大忌,很容易把设计缺陷放大到几十张报表里。

4.2 参数、权限与联动交互:最容易被低估的一环

模板画得再像,参数不对整张表就是废的。迁移时要把老系统里的每个查询控件的类型、默认值、级联关系、校验规则都记下来,新平台里重新实现。特别要注意参数名,新系统里参数一般有固定命名规则,老模板的单元格引用如果直接搬过来,很容易出现“报表打开就报参数不存在”的现象。表单校验规则也别漏,比如日期范围控制、金额非负校验,这些在老系统里可能写在了控件属性中,不在SQL里,迁移时容易被忽略。

权限映射同样要精细。报表目录权限、角色权限、行级数据权限三者要分开核对。行级权限最坑:同样是销售报表,A部门账号登录只能看到A部门数据,B部门看到B部门,这种权限如果没映射好,新系统上线第一天就可能出现越权事故。我的习惯是在迁移结束后,准备三四个测试账号,模拟不同角色登录,逐张报表查看能看到的目录和数据范围,远比在管理后台看权限配置截图可靠。

4.3 文件级校验:MD5与CRC32到底用在哪一步

模板文件在迁移过程中要经过打包、上传、解压、分发多个环节,这里就轮到文件级校验出场了。最简单的做法:迁移前把每个模板文件计算一次MD5值,生成清单;迁移后在新环境重新计算一遍,人工或脚本比对MD5是否一致。MD5虽然理论上存在碰撞,但在文件完整性校验这个场景下完全可以信任,速度也够快。CRC32更轻量、计算更快,适合大批量文件在本地快速比对,但碰撞概率比MD5高,我一般只在临时目录清理前后用,正式迁移清单还是以MD5为主。

文件级校验另一个用途是多节点分发。报表服务部署在多台机器上时,模板文件要在节点间同步,如果传输过程中某个文件损坏,报表打开就会报错或一片空白。写个脚本定时对模板目录做MD5扫描,把不一致的节点自动补发文件,这个操作很简单,但能省下大量排查时间。注意文件级校验只能证明文件“没坏”,不能证明报表“画得对”,真正的正确性还得靠下一章的结果集和渲染校验。

4.4 双跑与灰度:新旧系统并行期怎么安排

迁移实施的后半段是并行期。新系统上线后先做成“只读模式”,数据照常查询,但不开放填报回写,也不影响业务系统。接下来用定时任务把新旧两套系统的报表输出抓出来,自动对比关键指标,比如行数、合计值、最大值、最小值。灰度对象从小范围开始:先让一个业务部门试用,收集使用反馈;再把第二、第三个部门放开;最后才是全量切换。

双跑期最忌讳的是“两条腿同时跑但没人看”。报表对比数据一定要有人盯,至少前两周每天看一遍差异报表。别等业务同事来报告“这个数不对”,要靠自己的对账脚本先发现问题。灰度期间发现的每个问题都要记录到统一清单里,标明严重级别和修复时间,这些记录也是最终切换验收时的重要依据。

5. 迁移后的校验:能显示出来不等于正确

5.1 结果集对账:用SQL和导出CSV做数据基线

报表迁移里最需要较真的就是数据一致性。我习惯从两个层面做结果集对账:第一层是SQL基线法。把老报表里的SQL抽出来,在老数据源上执行一遍,记录行数、字段数、关键汇总值,形成基线;再用同一套SQL在新系统上执行,对比是否一致。如果迁移时SQL被改写过了,那就要先确认两条SQL的口径是否等价,再比对执行结果。

第二层是导出CSV对比法。新旧两套系统分别导出同一张报表的结果数据,用脚本按行比较,不仅比较每列的值,还要比较空值分布、日期格式、长度超限字段。格式差异虽然不影响“数据对不对”,但会影响后续用户拿到文件之后二次加工,所以也要记录。结果集对账是后面所有校验的基础,这一步过了,再去纠结显示样式才有意义。对账脚本建议直接写成项目的一个固定工具,每次发布报表变更时都跑一遍,形成回归基线。

5.2 渲染层校验:截图diff与单元格样本抽查

数据一致不代表用户看到的就是想要的。我见过结果集完全一致、但页面上表头错位、合并单元格错行、数字列被截断的情况。渲染层的校验,自动化可以做到的是截图对比:用Playwright或浏览器自动化分别打开新旧报表页面,在相同参数、相同分辨率下截图,再用pixelmatch这类工具做像素级差异比对,输出差异位置和比例。这个方法适合发现“大问题”,比如整列偏移、图表丢失。

但像素差异图和人工看到的“观感不对”还是有差距,所以还需要人工抽查。抽查时不要只看正常数据,要故意构造边界情况:空数据、超长文本、负数、极大量级、含NULL的字段。这些边缘场景最能暴露渲染逻辑的差异。每张报表建立一张“渲染差异清单”,把自动截图发现的差异和人工抽查发现的差异汇总起来,分门别类标记为“可接受的格式差异”和“必须修复的错位问题”,按优先级处理。

5.3 导出与打印校验:Excel、PDF、填报回写一个都不能少

企业报表的终点往往不在网页上,而在Excel导出和打印PDF里。Excel导出校验要关注行数、列数、合并单元格、日期序列号、数字精度、公式是否保留。很多新报表引擎默认导出的是纯数值,老系统导出的是带格式的单元格,用户拿到的体验差别很大。PDF校验要关注打印分页、纸张方向、标题行是否在每页重复、中文是否变成“口口”。开源报表引擎导出PDF时经常要单独配置中文字体,否则默认字体不支持中文。

填报回写是另一类容易被忽略的校验。新系统的填报页面提交数据后,要确认数据确实写入了正确的表和字段,而且写入后的数据在老系统或原数据库中也能看到(如果新旧系统共用数据源)。最好准备一套独立的测试数据来验证回写,避免在真实业务数据上试错。导出和打印这部分虽然琐碎,但用户感知最强,一旦出问题,几乎等于宣判迁移失败。

5.4 把校验脚本化:定时对账与增量核对

校验这件事不能靠上线前突击,要变成持续运行的机制。我常用的做法是写一个对账脚本,输入报表清单和SQL清单,自动跑三个阶段:文件完整性检查、结果集Diff、渲染截图基线对比。文件完整性用MD5扫描,结果集Diff用SQL拉取加CSV比较,渲染截图用浏览器自动化加像素对比,每一步都输出结果到指定目录并通知负责人。脚本不用写得非常复杂,先支持十张核心报表跑通,再逐步扩大覆盖范围。

校验脚本化和报表发布流程绑定在一起最好。后面任何一张报表做了改动,都触发一次自动对账,新旧结果集一致才允许上线。这样“迁移后的校验”就从一个一次性动作,变成了长期的质量保障机制。我个人的经验是,把校验脚本多花两天写细,后续维护能少熬两周的夜。

6. 常见问题与排查技巧实录

6.1 日期格式、数字精度与空值显示:老三样最容易翻车

报表迁移后最容易翻车的永远是这三样。日期格式:老系统可能默认输出yyyy-MM-dd HH:mm:ss,新系统默认输出时间戳或者只到天,时区设置不同还会导致日期偏移。解决办法是在数据集SQL里统一做格式化,并且把日期字段的显示格式在新平台里逐一确认,不要依赖全局默认值。

数字精度:数据库里decimal(18,4)的字段,老报表显示四位小数,新报表可能默认两位;大数值还可能因为浮点运算出现长尾小数。负数的格式、千分位分隔符、0值到底是显示0还是显示“-”,这些都要和业务确认清楚。空值显示也一样:NULL在旧系统里可能显示为空字符串,新系统显示成“null”或者“#”,用户一看就觉得出bug了。这三个问题的根源是“展示规则”,不是数据本身,所以在模板转写阶段就要把字段口径字典建立起来,而不是等用户报错再逐个改。

6.2 字体、斜线表头与分页打印:渲染差异的解法

渲染差异里最烦的是字体问题。同一套样式在不同操作系统上渲染结果不一样,中文字体缺失就直接变成方框。解法是先给新系统部署和旧系统一致的中文字体,并且从PDF导出文件里检查字体嵌入列表,确认字体真的生效了。斜线表头这种中国式报表的特色,很多开源工具需要特殊设置或写样式实现,不要想当然地以为所有报表引擎都能像FineReport那样右键画斜线。

打印更是细节地狱:纸张大小、页边距、缩放比例、每页重复标题行、强制分页位置,任何一项不一致都会导致报表“看起来没问题,打印出来就是不对”。我的建议是找一张包含很多列的报表当测试样例,把打印设置的每一项都调一遍,形成标准打印模板,后续所有报表复用,能省下大量重复配置时间。

6.3 参数丢失、联动失效与权限越权

参数问题在切换后两周内最集中:报表打开提示参数不存在、下拉框里没有数据、级联查询失效、日期控件无法选择。排查思路一般是先看参数定义和控件绑定关系,再看数据字典和SQL里的参数引用。特别要检查的是默认值,有些报表用户习惯打开就有默认数据,新系统默认值没配好,用户第一眼就是空表,立刻会觉得“坏了”。

联动失效通常是因为老系统的超链接、图表跳转、单元格钻取这些交互配置没有在新系统里重建。权限越权则是风险最高的问题,迁移后系统默认管理员权限很大,如果角色映射漏了,低权限用户可能看到高权限数据。上线前用测试账号做一遍权限巡检太重要了,宁可多花一天时间把权限矩阵核对清楚,也不能让越权问题发生在真实业务环境里。

6.4 一个真实迁移案例:60张报表替换的完整时间线

拿一个最近的案例来说,客户有60张报表,数据源是Oracle和MySQL混合,其中包含主子报表、填报、定时邮件推送。整个迁移周期排了12周:第1到2周做资产盘点加模板解析,把60张报表的SQL和参数全部提取出来;第3到4周做方案选型和小范围POC,验证了开源报表加BI混合方案;第5到8周是模板重写,先写了5张样本,跑通后批量推进;第9到10周是集中校验,结果集对账基本通过,但渲染问题暴露了不少,集中在字体和斜线表头;第11周找到两个部门做灰度,结果发现一个角色权限映射漏了一个部门,灰度期暴露出来,花了两天修复;第12周低峰切换,旧系统保留只读入口一个月。

这个案例最有价值的结论是:开发重写只占一半时间,另一半全花在盘点、校验、灰度上。权限问题不是在开发阶段暴露的,而是在灰度阶段被真实用户发现的,说明哪怕你自认为权限表做得再细,也一定要让真实账号到真实环境里走一遍。

7. 写在最后:我的几条实操建议

做了几次报表替代之后,我最大的体会是:替代失败很少是因为选型选错了,大多数时候是迁移和校验没做好。选型可以花两周慢慢对比,迁移和校验却要在上线前把所有问题暴露干净,这两件事都不存在捷径。给正在做规划的朋友几条建议:第一,从第一天就把校验脚本当成正式项目来做,不要等切换前再补;第二,把双跑期拉长一点,宁可多观察一个完整业务周期,也不要让用户在灰度阶段帮你找bug;第三,趁机把僵尸报表清理一遍,迁移是唯一一次有正当理由让业务确认“这张报表还要不要”的机会。最后再啰嗦一句:旧系统保留一段时间不要急着卸载,它既是回滚的底气,也是未来做数据口径审计时最可靠的参考资料。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 19:37:53

BrewUI:为macOS开发者打造的Homebrew可视化包管理仪表盘

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 19:37:53

Cursor Router 把模型路由当基础设施,Cursor 的模型接入层改走 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 19:35:52

AI Agent评估数据集:构建高质量回归测试体系的关键实践

1. 为什么评估数据集应该排在 agent 功能开发的前面我在好几个 agent 项目里吃过没有评估数据集的亏。上线前手动把核心用例点了一遍,觉得一切正常,结果灰度到一半,某个关键场景被改坏了,要等用户在工单系统里连续投诉之后才被察觉…

作者头像 李华