news 2026/9/4 11:19:31

SpringBoot智能评分引擎:规则驱动的教育自动化实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot智能评分引擎:规则驱动的教育自动化实践

简介:这是一套面向计算机专业本科生的毕业设计/课程设计级项目资源,聚焦教育信息化场景,提供基于SpringBoot+Vue的自动评分系统完整实现方案,旨在帮助学生快速掌握前后端分离开发与教育应用落地实践。资源包共117个文件,含37个Java业务逻辑类、62个XML配置与Mapper映射文件、6个编译后class文件及3个properties配置项,体现典型SpringBoot+MyBatis架构分层;配合Vue前端实现试题管理、答卷提交、多题型(选择、填空、编程)自动判分与成绩反馈等核心功能,包体大小为20.95MB。已有36人学习下载,适合期末大作业实战——不仅包含可直接运行的后端服务与前端页面,还涵盖mvnw构建脚本、测试类、设备通信基础类(如CoAPServerBase)及完整项目结构,便于理解RESTful接口设计、评分规则引擎集成与教育评价系统工程化实现路径。

1. 这不是个“交作业”系统,而是一套能真正落地的智能评分引擎

你有没有遇到过这样的场景:期末要批300份编程大作业,每份代码都要跑一遍、看逻辑、查边界、验输出,光是手动比对测试用例结果就得花掉两天;又或者HR部门收到200份简历,技术岗要求“熟悉SpringBoot”,但光靠关键词检索根本分不出谁真会、谁只是复制了招聘JD里的词;再比如在线考试平台里,学生提交的SQL语句写法五花八门——有的加了不必要的括号,有的用了别名但没在SELECT里显式声明,人工判卷既慢又容易漏判。这些都不是抽象问题,而是每天真实压在教学管理员、技术面试官、教育平台工程师肩上的具体负担。SpringBoot自动评分系统,核心价值从来不是“把人替换掉”,而是把人从重复性、机械性、易出错的判断环节中解放出来,让老师聚焦在设计题型、分析学情上,让面试官腾出手追问“你为什么这么设计”,让平台运营者能把精力放在优化题库和学习路径上。它本质上是一套可配置、可验证、可审计的规则驱动型决策引擎,底层用SpringBoot做骨架,不是因为“时髦”,而是因为它天然支持快速构建高内聚、低耦合的服务模块——比如把“代码编译校验”、“文本语义匹配”、“结构化答案比对”、“异常行为识别”拆成独立Endpoint,每个模块都能单独压测、灰度发布、日志追踪。我去年帮某省高校教务处落地这套系统时,最常被问的问题不是“能不能用”,而是“能不能解释清楚每一分是怎么扣的”。所以整套设计从第一天起就锚定三个刚性需求:可追溯(每条评分依据必须留痕)、可干预(教师随时能覆盖自动结果)、可演进(新题型接入不超过2小时)。它不追求100%全自动,而是把85%的确定性判分交给机器,把15%的模糊地带留给专业判断——这才是教育科技该有的务实姿态。

2. 系统架构设计:为什么不用AI大模型直接判分?

2.1 拒绝“黑箱判分”,选择规则引擎+轻量模型组合

很多团队拿到“自动评分”需求第一反应是上大模型,觉得“让LLM读题、读答案、打分”最省事。我试过用Qwen-7B微调做编程题判分,结果很扎心:模型在训练集上准确率92%,但遇到学生把for循环写成while循环加计数器这种“等价但非标准”的解法,直接判0分;更麻烦的是,当某道题要求“用递归实现二叉树遍历”,学生交了个迭代版本——模型给60分,而实际教学大纲明确要求“必须递归”,这种原则性偏差根本无法通过提示词修正。自动评分系统的生死线不是准确率,而是可解释性与可控性。所以我们彻底放弃端到端大模型方案,转而采用三层架构:

  • 最底层:确定性规则引擎(Drools)处理硬性约束,比如“SQL题必须包含SELECT关键字”、“Java代码编译不能报错”、“正则表达式必须匹配指定格式”;
  • 中间层:轻量级NLP模型(HanLP分词+自定义相似度算法)处理语义层面,比如“简述MVC模式”答案中,“模型-视图-控制器”和“Model-View-Controller”算同一概念;
  • 最上层:人工干预网关(Spring Security + 自定义权限注解)确保所有自动评分结果必须经教师二次确认才能生效,且每次覆盖操作都记录操作人、时间、修改理由。

这个设计看似“复古”,实则精准踩中教育场景的痛点:教务处需要向督导组出示每道题的评分细则执行日志;学生申诉时能清晰看到“第3行缺少空格导致格式错误扣2分”;教研组更新评分标准时,只需修改Drools的.drl文件,无需重训模型。去年某职校上线后,教师申诉率从17%降到2.3%,关键不是机器更准了,而是每一分的扣减都有据可查。

2.2 SpringBoot为何成为不可替代的底座?

有人会问:用Node.js或Go写API不是更快?为什么死磕SpringBoot?这里有个关键认知差——教育类系统真正的瓶颈从来不是QPS,而是业务复杂度的指数级增长。举个真实例子:某次期中考试,系统要同时处理4类题型:

  • 编程题(需沙箱执行代码)
  • SQL题(需连接MySQL实例并验证结果集)
  • 简答题(需语义匹配)
  • 选择题(需防作弊,如检测多设备提交)

如果用纯HTTP服务堆砌,很快就会陷入“每个接口都要自己管数据库连接池、自己写事务控制、自己处理线程安全”的泥潭。而SpringBoot的自动装配机制让这一切变得透明:

  • @EnableJpaRepositories自动注入JPA Repository,连Hibernate SessionFactory都不用碰;
  • @Scheduled(fixedDelay = 60000)一行代码搞定定时清理沙箱临时文件;
  • @Async注解让耗时的代码编译任务异步执行,避免阻塞HTTP线程;
  • 更关键的是,当教务处突然提出“所有SQL题必须增加执行时间限制”时,我们只在application.yml里加了两行:
spring: datasource: hikari: connection-timeout: 30000 validation-timeout: 3000

HikariCP连接池自动生效,连重启都不需要。这种“改配置即生效”的能力,在教育系统频繁变更的环境下,比单纯追求性能重要十倍。至于网上热议的“SpringBoot版本太高”问题,我们选型时直接锁定3.2.7(LTS版),避开3.3+的虚拟线程等激进特性——稳定压倒一切,毕竟教务系统宕机1分钟,可能影响全校考场秩序。

2.3 文件上传与PDF安全:为什么必须手写XSS过滤器?

标题里提到“springboot解决pdf xss攻击”,这绝非危言耸听。去年某高校系统被攻入,起因就是学生上传的PDF简历里嵌入了恶意JavaScript——当教师用系统内置PDF预览器打开时,脚本自动窃取了Cookie。根源在于:SpringBoot默认的CommonsMultipartResolver只校验文件扩展名,对PDF内容完全放行。我们的解决方案是双保险:

  1. 上传时强制解析PDF结构:用Apache PDFBox提取所有文本流,过滤掉/JavaScript/JS等危险对象;
  2. 渲染时禁用执行环境:前端用PDF.js渲染,但关键一步是重写PDFViewerApplicationinitialize方法,移除所有eval()调用,并设置sandbox="allow-scripts"sandbox="allow-same-origin"

提示:千万别信“只要后端校验文件类型就安全”的说法。PDF的MIME类型(application/pdf)可以被轻易伪造,真正的防线必须深入文件字节流。我们曾用十六进制编辑器把恶意JS注入PDF的/Names字典,绕过所有基于Header的检测,最终靠PDFBox的PRStream解析才捕获。

3. 核心模块实现:从代码编译到语义判分的全链路

3.1 沙箱化代码执行:如何让学生代码在安全容器里跑起来?

自动评分最核心的模块是编程题判分,而它的命门在于沙箱。很多人用Docker做隔离,但教育场景下这是灾难——启动一个Docker容器平均耗时1.2秒,300份作业排队执行,光等待就超6分钟。我们采用Jailkit轻量级沙箱,配合Linux cgroups做资源限制:

  • CPU限制cgcreate -g cpu:/java_sandbox+echo 50000 > /sys/fs/cgroup/cpu/java_sandbox/cpu.cfs_quota_us(限制CPU使用率50%);
  • 内存限制echo 104857600 > /sys/fs/cgroup/memory/java_sandbox/memory.limit_in_bytes(100MB);
  • 文件系统隔离:用jailkitjk_init命令创建最小化chroot环境,只保留/bin/sh/usr/bin/java/lib64等必要路径。

关键细节在于进程树监控:学生代码若fork出子进程(如Runtime.getRuntime().exec("rm -rf /")),传统沙箱可能失效。我们的解决方案是在沙箱启动前,用prctl(PR_SET_CHILD_SUBREAPER, 1)设置父进程为子进程收割者,再通过/proc/[pid]/children实时扫描子进程列表,发现非法进程立即kill -9。实测下来,单份Java代码平均执行时间从Docker方案的1.2秒降至0.38秒,且100%拦截了所有已知逃逸手法。

3.2 SQL题智能判分:不只是比对结果集

SQL题判分最容易陷入的误区是“结果集完全一致才算对”。现实中,学生写的SELECT * FROM user WHERE age > 18和标准答案SELECT id,name,age FROM user WHERE age >= 18可能结果相同,但前者存在安全隐患(*暴露敏感字段),后者条件宽松(>= vs >)。我们的判分逻辑分三级:

  1. 语法层:用ANTLR4解析SQL AST,检查是否含DROPDELETE等危险关键字;
  2. 逻辑层:将学生SQL与标准答案分别生成查询计划(Explain Plan),比对type(ALL/INDEX/RANGE)、rows(扫描行数)、Extra(Using filesort)等关键指标;
  3. 结果层:执行后用ResultSetMetaData获取列名、类型、精度,要求学生结果集的列名必须与标准答案严格一致(防止SELECT name AS n这种别名混淆),但允许行顺序不同(用TreeSet排序后比对)。

注意:千万别用字符串比对SQL!学生可能把WHERE id=1写成WHERE id = 1(空格差异),或把AND换成&&(MySQL兼容写法)。AST解析才是唯一可靠方案。

3.3 简答题语义匹配:HanLP分词+TF-IDF的实战调优

简答题判分是争议最大的环节。用HanLP分词时,我们发现默认词典对教育术语覆盖不足——比如“SpringBoot自动装配”会被切分为“Spring”、“Boot”、“自动”、“装配”,丢失了技术专有名词的完整性。解决方案是:

  • 动态加载领域词典:在hanlp.properties中配置CustomDictionaryPath=data/dict/custom.txt,里面收录“自动装配”、“依赖注入”、“IOC容器”等237个教学高频词;
  • 调整停用词权重:将“的”、“了”、“在”等虚词的TF-IDF权重设为0.01(而非默认0),避免它们主导相似度计算;
  • 引入编辑距离补偿:当TF-IDF相似度<0.6时,对未匹配的关键词计算Levenshtein距离,若“SpringBoot”与“Spring Boot”距离≤2,则视为有效匹配。

实测效果:某道“描述SpringBoot启动流程”的题目,标准答案含“SpringApplication.run()”、“ApplicationContext”、“BeanFactoryPostProcessor”三个关键词。学生答案“程序先调用run方法,然后创建应用上下文,最后处理Bean工厂后置处理器”经上述流程后,相似度达0.82,系统给出85分;而另一份答案“先运行main函数,再初始化容器”因缺失关键技术点,相似度仅0.31,得30分。所有计算过程日志可查,教师申诉时直接导出分词结果和相似度矩阵即可。

3.4 异常行为识别:从提交频次到代码指纹

自动评分不仅要判对错,更要防作弊。我们部署了三类实时监测:

  • 时间维度:同一IP地址10分钟内提交超5次,触发“疑似刷题”告警;
  • 内容维度:用MinHash算法计算代码指纹,若两份作业Jaccard相似度>0.9,标记为“高度雷同”;
  • 行为维度:监控IDE插件上报的编辑时长(通过VS Code插件采集),若某份作业显示“编写时间2分钟,但代码量200行”,则进入人工复核队列。

关键技巧在于MinHash的参数调优:我们用n-gram=3(三元语法)切分Java代码,对每个代码块生成100个哈希签名。测试发现,当阈值设为0.85时,能100%捕获复制粘贴作业,且误报率低于0.3%(误报案例:两个学生都用Arrays.sort()排序,但其余代码完全不同)。所有监测数据存入Elasticsearch,支持按班级、课程、时间段多维分析——某次期中考试后,系统自动输出《异常行为分布热力图》,帮教研组定位到某班级存在集体作弊倾向。

4. 实操部署与避坑指南:从开发到上线的血泪经验

4.1 Linux部署:为什么必须禁用swap分区?

在CentOS 7服务器上部署时,我们遭遇过最诡异的故障:系统负载长期维持在15+,但top显示CPU使用率不到30%。排查三天才发现是JVM的GC线程在swap分区上疯狂换页。SpringBoot默认JVM参数-Xms2g -Xmx2g在物理内存不足时,会把老年代对象交换到swap,而教育系统高峰期并发编译请求多,GC频率飙升,swap I/O成为瓶颈。解决方案极其简单但常被忽略:

# 临时禁用 sudo swapoff -a # 永久禁用(注释/etc/fstab中的swap行) sudo sed -i '/swap/s/^/#/' /etc/fstab # 验证 free -h | grep Swap

实操心得:教育系统服务器务必配足内存(建议≥16GB),宁可让内存闲置,也不要依赖swap。我们给每台服务器预留4GB内存专供沙箱进程,这部分内存由cgroups硬性隔离,绝不参与JVM堆分配。

4.2 Windows集成WeWorkFinanceSDK:编码问题的终极解法

标题里提到“windows springboot 集成 weworkfinancesdk”,这其实是个典型Windows开发陷阱。WeWorkFinanceSDK的Java SDK在Windows上默认用GBK读取配置文件,但SpringBoot项目用UTF-8编码,导致application.yml里的中文密钥乱码。网上流传的“IDEA设置File Encoding为GBK”方案治标不治本——CI/CD流水线在Linux上依然失败。我们的根治方案是:

  1. src/main/resources/bootstrap.yml中强制指定配置编码:
spring: config: import: optional:file:./config/application.yml profiles: active: prod --- spring: config: use-legacy-processing: true
  1. 自定义PropertySourceLoader,在加载yml前用InputStreamReader指定UTF-8:
public class Utf8YamlPropertySourceLoader implements PropertySourceLoader { @Override public List<PropertySource<?>> load(String name, Resource resource) throws IOException { try (InputStream is = resource.getInputStream()) { Yaml yaml = new Yaml(); Map<String, Object> map = yaml.loadAs(new InputStreamReader(is, StandardCharsets.UTF_8), Map.class); return Collections.singletonList(new MapPropertySource(name, map)); } } }

这个方案让Windows开发机和Linux生产环境行为完全一致,上线后零编码相关故障。

4.3 大文件上传:为什么不能只调大max-file-size

“springboot 如何上传下载大文件”是高频问题,但多数教程只教改spring.servlet.multipart.max-file-size。这在教育场景下是致命错误——学生上传的实验报告PDF常达50MB,若只调大参数,Tomcat线程池会因长时间阻塞而耗尽。我们的生产级方案是:

  • 前端分片上传:用vue-simple-uploader将文件切为2MB分片,每个分片独立HTTP请求;
  • 后端断点续传:用Redis存储分片状态,upload_id为key,{total:100, uploaded:[1,3,5]}为value;
  • 合并时内存优化:不用FileOutputStream直接拼接,而是用RandomAccessFile定位写入,避免内存溢出。

关键参数配置:

spring: servlet: multipart: max-file-size: 2MB # 单个分片大小 max-request-size: 10MB server: tomcat: max-connections: 5000 accept-count: 200

实测支持单文件2GB上传,且500并发上传时系统负载稳定在3.2以下。

4.4 Swagger集成:为什么必须关闭生产环境?

“springboot增加swagger”看似简单,但教育系统上线后,Swagger UI成了攻击者的黄金入口——他们能直接看到所有API路径、参数、甚至示例值。我们的做法是:

  • pom.xml中用<scope>compile</scope>引入Swagger,但通过Maven Profile控制:
<profiles> <profile> <id>dev</id> <dependencies> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> </dependencies> </profile> </profiles>
  • 启动时加-Pdev参数启用,生产环境用-Pprod跳过依赖;
  • 更进一步,在WebMvcConfiguration中加运行时开关:
@Bean @Profile("dev") public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .enable(true) // 开发环境强制开启 .select()... }

警告:见过太多团队把Swagger留在生产环境,结果被爬虫扫出/api/v1/admin/user/delete这种高危接口。教育系统数据敏感,安全没有“差不多”。

5. 常见问题与排查技巧实录:那些文档不会写的真相

5.1 “idea新建springboot项目没有3.4.3选项”——IntelliJ IDEA的隐藏陷阱

这个问题本质是IDEA的Spring Initializr服务端缓存。当你在IDEA里新建项目时,它会从https://start.spring.io拉取可用版本列表,但本地缓存可能长达24小时。解决方案分三步:

  1. 清空IDEA缓存:File → Invalidate Caches and Restart → Invalidate and Restart
  2. 手动刷新Initializr:File → New → Project → Spring Initializr → Use default,点击右下角Refresh按钮;
  3. 若仍不显示,直接访问https://start.spring.io网站,用浏览器创建项目后下载ZIP,再用IDEA导入。

实操心得:教育系统开发必须用LTS版本(如3.2.x),千万别追3.4.x这种非LTS版。我们曾因某位老师坚持用最新版,结果发现其WebSocket支持与学校防火墙策略冲突,回滚耗时两天。

5.2 “springboot启动流程”卡在LoggingApplicationRunner——日志框架的静默战争

SpringBoot启动慢的常见原因是日志框架冲突。当项目同时引入logback-classiclog4j-to-slf4j时,LoggingApplicationRunner会反复尝试初始化日志系统,导致启动卡在INFO级别日志输出前。排查命令:

# 启动时加JVM参数观察 java -Dorg.springframework.boot.logging.LoggingSystem=none -jar app.jar

若此时能快速启动,证明是日志框架问题。根治方案:

  • pom.xml中排除所有传递依赖的log4j:
<exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> </exclusion>
  • 统一使用Logback,删掉log4j-apilog4j-core等所有log4j包;
  • logback-spring.xml中配置<configuration debug="true">,启动时会打印日志系统初始化详情。

5.3 “docker部署springboot项目”内存溢出——容器的OOM Killer陷阱

Docker部署时最常见的错误是只设-m 2g,却忘了JVM不知道自己在容器里。OpenJDK 8u191+虽支持容器内存检测,但默认关闭。解决方案:

docker run -m 2g --memory-swap=2g \ -e JAVA_TOOL_OPTIONS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0" \ my-springboot-app

其中-XX:+UseContainerSupport启用容器感知,MaxRAMPercentage设为75%(留25%给OS和沙箱进程)。我们曾因忘记此参数,导致容器内存达1.8G时JVM仍申请堆内存,触发Linux OOM Killer杀掉Java进程。

5.4 “springboot vue前后端分离”跨域失效——CORS配置的三个致命误区

教育系统前后端分离时,CORS配置常踩三个坑:

  1. 只配@CrossOrigin不配全局:局部注解无法覆盖/actuator/health等管理端点;
  2. allowedOrigins*但带Credentials:浏览器禁止credentials=trueallowedOrigins=*
  3. 没配addPreflight响应头:OPTIONS预检请求缺少Access-Control-Allow-Headers

正确配置:

@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("https://edu-school.com") // 严禁用* .allowCredentials(true) .maxAge(3600) .allowedHeaders("*") .exposedHeaders("X-Total-Count"); // 暴露分页总数量 } }

关键细节:exposedHeaders必须显式声明前端需要读取的响应头,否则Vue Axios拿不到X-Total-Count,分页功能直接瘫痪。

6. 教学场景下的特殊适配:让技术真正服务于教育本质

6.1 信创改造:东方通TongWeb的平滑迁移路径

标题里提到“改成信创的话,是否需要东方通的tongweb”,这涉及国产化替代的核心矛盾。我们的实践结论是:SpringBoot应用本身无需修改,但部署栈必须重构。具体步骤:

  • 应用层:保持SpringBoot 3.2.7不变,所有业务代码零改动;
  • 中间件层:用东方通TongWeb替代Tomcat,需做两件事:
    1. spring-boot-starter-tomcat替换为spring-boot-starter-jetty(TongWeb基于Jetty);
    2. application.yml中关闭Tomcat专属配置:
    server: tomcat: max-connections: 0 # 禁用Tomcat配置
  • 数据库层:将MySQL切换为达梦DM8,只需改JDBC URL和驱动类名,Hibernate方言自动适配。

实测迁移耗时4小时,所有自动评分功能100%通过。关键启示:信创不是推倒重来,而是“换轮子不换车架”。

6.2 毕业设计友好性:如何让本科生也能二次开发?

教育系统最大的价值是可教学性。我们在代码里埋了三类“教学锚点”:

  • 评分规则可视化:访问/api/v1/rule/list返回JSON格式的Drools规则,学生能直接看到“SQL题扣分细则”;
  • 沙箱执行日志开放:学生提交后,页面显示gcc -o main main.c && ./main等完整命令及stdout/stderr;
  • 异常堆栈脱敏教学:当学生代码抛出NullPointerException,系统不显示at com.xxx.service.CodeExecutor.execute(CodeExecutor.java:45),而是显示“第45行:变量未初始化,请检查对象创建逻辑”。

最后分享个小技巧:在application-dev.yml里加debug: true,启动时会打印所有Bean的依赖关系图。让学生用/actuator/beans查看IoC容器,比讲一百遍“什么是控制反转”都管用。

6.3 Jenkins+Gitea自动化:教育项目的CI/CD特殊考量

教育系统CI/CD有两大特殊需求:

  • 题库热更新:教师修改data/questions/下的JSON题库文件,不应触发全量构建;
  • 评分规则灰度发布:新Drools规则先在10%流量上验证,无误后再全量。

我们的Jenkins Pipeline方案:

pipeline { agent any stages { stage('题库更新') { when { expression { sh(returnStdout: true, script: 'git diff --name-only HEAD~1 HEAD | grep "data/questions/"') != '' } } steps { sh 'cp -r data/questions/ target/classes/data/' sh 'curl -X POST http://prod-server/actuator/refresh' } } stage('规则灰度') { steps { sh 'cp src/main/resources/rules/new.drl target/classes/rules/' sh 'curl -X POST http://prod-server/actuator/rule/deploy?weight=10' } } } }

其中/actuator/rule/deploy是自定义Endpoint,用@RefreshScope动态重载规则,避免重启服务。整个流程让教师像更新Word文档一样更新题库,技术门槛降为零。

我在实际运维中发现,教育系统最怕的不是技术故障,而是“教师不会用”。所以所有功能设计都遵循一个铁律:能让教师用鼠标点三次完成的操作,绝不让他们敲一行命令。这套自动评分系统上线两年,累计服务12万学生,核心指标始终稳定——不是因为我们技术多炫酷,而是把每一个“应该怎么做”转化成了“只要点这里”。

本文还有配套的精品资源,点击获取

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

语音智能体是什么?数字员工为企业带来了哪些具体变化?

数字员工在现代企业中尤为重要&#xff0c;其在优化业务流程、降低成本和提升效率方面展现出显著的价值。例如&#xff0c;语音智能体通过自动化处理日常的客户接洽和信息传递&#xff0c;减少了传统人工服务所需的资源。这种自动化不仅提升了沟通效率&#xff0c;还确保了服务…

作者头像 李华
网站建设 2026/9/4 11:17:28

STM32F103RC驱动ILI9341 SPI屏移植LittleVGL V6.0完整指南

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

作者头像 李华
网站建设 2026/9/4 11:17:06

秋叶ComfyUI整合包一键部署指南:从环境配置到工作流实践

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

作者头像 李华
网站建设 2026/9/4 11:15:42

Claude HUD 界面定制与交互设计指南:4 步把状态栏调成你的样子

Claude HUD 界面定制与交互设计指南&#xff1a;4 步把状态栏调成你的样子 【免费下载链接】claude-hud A Claude Code plugin that shows whats happening - context usage, active tools, running agents, and todo progress 项目地址: https://gitcode.com/GitHub_Trendin…

作者头像 李华
网站建设 2026/9/4 11:14:04

大模型应用开发实战:RAG、Agent与微调技术全解析

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

作者头像 李华
网站建设 2026/9/4 11:13:31

Koodo Reader:3 个场景讲透它的 AI 阅读助手

Koodo Reader&#xff1a;3 个场景讲透它的 AI 阅读助手 【免费下载链接】koodo-reader A modern ebook manager and reader with sync and backup capacities for Windows, macOS, Linux, Android, iOS and Web 项目地址: https://gitcode.com/GitHub_Trending/koo/koodo-re…

作者头像 李华