尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
SpringBoot+Vue实验安全教育系统:从准入控制到在线考核的实现
做一个高校实验安全教育系统时我最初理解得太浅了以为就是“一套课程 一套试卷”的在线答题项目。直到跟食品学院的老师聊完需求才发现真正的痛点根本不在“答题”这个动作而在于“准入”两个字学生什么时候能进实验室有没有学习记录学了多久考了多少分证书有效期到什么时候谁负责复核——这些信息如果全靠 Excel 和纸质签字根本管不住。所以这个 springbootvue 实验安全教育系统的核心不是做一个“考试网站”而是把“安全教育—在线考核—准入授权—记录留痕—复训提醒”这条链路完整串起来。本文不聊那些假大空的设计稿直接从业务建模、后端实现、前端播放、常见坑位四个维度拆开讲项目场景以食品类实验室为主但换成化学、生物、医学实验室架构和逻辑几乎可以平移复用。1. 实验安全教育系统的业务设计与模块规划1.1 实验安全教育真正的核心准入控制不是考试很多第一次接触这个需求的人第一反应是“做一个在线考试系统”。这个方向不能算错但容易做成一个玩具。真正在学校或者科研单位里落过地就知道实验室安全教育最麻烦的不是出题和判分而是**“考完以后怎么办”**。传统流程大概是这样的开学初老师讲一节课发一份试卷学生做完交上来老师批改登记分数然后就没有然后了。纸质档案存放在某个柜子里三年后要检查或评估翻半天找不全。更实际的问题是学生补考没通过照样拿着校园卡刷卡进实验室谁也不知道。所以系统设计的第一原则是把“考试成绩”提升为“准入凭证”。在这个项目里我把它拆成四个状态未学习、学习中、待考核、已准入外加一个“准入过期”的兜底状态。学生必须看完全部必修安全视频、通过在线考核80 分及格系统才生成一个带有效期的准入标识默认有效期是一年。到期前 30 天自动触发复训提醒重新学一遍更新的内容才能续期。这套状态机是整个业务逻辑的骨架前后端所有功能都在围绕它转。1.2 食品方向实验室的特殊安全诉求为什么标题特意写“可做食品”因为食品类实验室的安全侧重点和纯化学、纯生物实验室差别非常大做系统之前必须先把这个业务差异理清楚否则做出来就是个大路货食品学院的老师不会认。食品实验室管理的风险点我梳理下来大概有这几类生物类风险致病菌沙门氏菌、大肠杆菌、金黄色葡萄球菌、霉菌毒素涉及接种、培养、灭活流程。化学类风险重金属标准溶液铅、镉、砷、亚硝酸盐、有机溶剂乙醚、石油醚、酸碱消解液。设备类风险高压灭菌锅属于特种设备、均质机、超低温冰箱、离心机。食品安全合规风险洗手消毒规范、工服口罩穿戴、生熟分区、过敏原交叉污染这些不是传统理工科实验室会强调的。所以题库和课程内容不能直接拿“通识版实验室安全”来糊弄。视频课程至少要有四章食品安全卫生规范、致病菌操作与生物安全、化学试剂安全使用、大型设备操作规范。考试题也要按这四类按比例抽题比如通识安全 30%、食品卫生 25%、生物安全 20%、化学与设备 25%。这样才能让系统在推广时站得住脚而不是一个换皮小程序。1.3 功能模块清单与角色权限设计权限模型我采用的是经典 RBAC但分得比较细一共四类角色角色核心权限典型操作超级管理员系统配置、角色管理、数据统计管理院系、设置及格线、查看全量数据安全员教师课程与题库维护、考试审批、准入复核上传视频、审核试题、查看班级通过率学生学习、考试、查看证书观看视频、在线考核、下载准入证明访客/临时人员只读学习不参与考核浏览安全手册、案例库后端的接口设计上所有接口都走 JWT 鉴权但权限判断不只是在 Controller 层写几个注解就完了我在 Service 层也做了二次校验。原因很简单这个系统涉及到“准入”这种比较严肃的结果万一有学生绕过前端直接调接口把自己改成“已准入”是要出安全事故的。所以更新准入状态的后端逻辑里必须校验当前登录用户的角色和操作来源。模块清单大概是系统管理用户、角色、院系、课程管理视频上传、章节编排、题库管理单选、多选、判断、案例题、考试管理组卷、批阅、成绩、准入管理状态流转、证书生成、学习记录进度、时长、数据统计通过率、学习时长、复训预警。每个模块都是独立的前端页面 后端接口但如果是从零开始做我建议先做“课程 考试 准入”这条主线其他模块后续再补。2. 后端 Spring Boot 核心实现解析2.1 技术栈选型与理由后端我选了 Spring Boot 2.7.x没有直接上 Spring Boot 3.x。不是 3.x 不好而是这个项目里有很多基础组件比如 MyBatis-Plus、某些视频处理工具跟 3.x 的 jakarta 命名空间切换还会打架一旦版本对不上排查成本远大于收益。如果这是新项目且团队对 3.x 很熟可以上 3.2但配合的 MyBatis-Plus 也要换到对应新版本否则会碰到ClassNotFoundException: javax.servlet这类低级问题。其他核心组件MyBatis-Plus单表 CRUD 不写 SQL省掉大量重复的 Mapper 方法。Redis存放验证码、登录 token 黑名单、考试过程中的防作弊标记。JWTjjwt 0.9.1或 io.jsonwebtoken 0.11.5登录后签发 token前端每次请求带上。MinIO 或本地存储视频文件存储开发环境用本地磁盘生产环境建议 MinIO。Hutool验证码生成、Excel 导出、随机数工具写起来很爽。这里要解释一下为什么用 JWT 而不是 Session。前后端分离部署后前端可能跑在 nginx后端可能跑在另一台服务器甚至以后要扩容多个实例。如果用 Session 就得引入 Spring Session 共享复杂度上来了JWT 是自包含的服务端不存登录态天然支持横向扩展。缺点是 token 没法主动失效所以我在 Redis 里加了一层黑名单机制用户改密码或管理员强制下线时把 token 的 jti唯一 ID扔进黑名单过期时间跟 token 剩余有效期一致。2.2 JWT 登录鉴权与准入状态机登录接口本身很简单就是用户名密码比对加上验证码校验。密码存的是 BCrypt 加密后的哈希不是明文也不是简单的 MD5。用户表里有一个status字段0 表示未激活、1 表示正常、2 表示锁定登录时先校验这个状态不放行被封禁账号。JWT 的结构可以拆成三段Header、Payload、Signature。项目里我放进去的信息只有用户 ID、用户名、角色编码、jti不塞太多业务数据进去token 会膨胀且不好排查。// JwtUtil 核心生成方法简化版 public String generateToken(LoginUser user) { String jti UUID.randomUUID().toString(); return Jwts.builder() .setId(jti) .setSubject(user.getUserId().toString()) .claim(username, user.getUsername()) .claim(role, user.getRoleCode()) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() 1000 * 60 * 60 * 2)) .signWith(SignatureAlgorithm.HS256, secretKey) .compact(); }token 过期时间我设的是 2 小时因为考虑到在线考试可能要连续做 45 分钟如果 30 分钟就过期确实尴尬。前端在 Axios 拦截器里统一带上Authorization: Bearer token后端用 OncePerRequestFilter 解析。准入状态更新是系统里最核心的一个事务逻辑不能简单地把状态字段改掉就完事。我把状态流转封装成一个服务方法里面做了四件事校验当前用户确实有考核记录且成绩80。校验必修课程的完成时长达到总时长 90% 以上这个很关键防止学生直接把视频拖到最后一秒。写入准入记录表包括开始时间、到期时间。生成准入编号规则是year schoolCode userId random4。2.3 考核模块实现要点题库设计时我把题目分为四种类型单选、多选、判断、案例分析。其中案例分析是食品实验室的特色题比如“某学生在操作高压灭菌锅时未检查排气阀导致灭菌失败且锅盖打不开请描述正确处理步骤”。这类题不适合机器判分我提供的是参考答案和关键词匹配给分管理员也可以人工复核。随机组卷是最容易出 bug 的地方之一。我之前见过有系统直接把所有题目查出来在内存里用Collections.shuffle再进行截取题目一多就卡顿。这个项目里的做法是-- 按知识点模块分组随机抽题示例 SELECT * FROM ( SELECT t.*, ROW_NUMBER() OVER (PARTITION BY category ORDER BY RAND()) rn FROM exam_question t WHERE t.status 1 AND t.type single ) tmp WHERE rn 15上面是 MySQL 8 的写法MySQL 5.7 不支持窗口函数我当时用的办法是先查出每个分类下的所有可用题目 ID然后在 Java 里用ThreadLocalRandom打乱再取前 N 条再查完整题目信息。数据量在几千条以内这个方案完全够用也方便后面给每类题目设置抽题数量。考试提交时判分逻辑要处理好“多选漏选”规则。我的规则是多选全对得满分漏选得一半分选错不得分。这个规则是跟老师确认过的不同的学校要求不一样建议做成系统参数别写死在代码里。还有一个细节考试开始后要记录“进入考试时间”和“最后交卷时间”后端要校验超时时间。前端倒计时结束会自动提交但后端不能依赖前端学生如果开着两个浏览器标签页绕过倒计时后端的时间戳判断会兜底拒绝超时提交。2.4 视频学习时长与文件上传细节视频学习这部分很多系统做得很糙只在前端调用video.addEventListener(ended)就认为学完了。学生直接把进度条拖到结尾或者挂个脚本自动播放学习记录全是假的。我做了两层校验前端每 15 秒向后端上报一次观看位置同时上报一个cumulativeWatchTime这个累计时间只在视频真实播放非静音、非暂停、不是拖拽状态时累加。后端把累计时长除以视频总时长达到阈值后才允许进入考试。为避免学生造假后端还会校验两次上报的时间间隔不能小于上报周期的一半如果间隔太短就说明是脚本伪造丢弃记录。视频处理方面我遇到过的最实际问题是浏览器原生播放器对 .mp4 格式支持良好但很多安全课程视频是从线下录制的格式五花八门常见的是 .avi、.rmvb 混在里面。我的做法是部署前用 FFmpeg 批量转成 H.264 AAC 的 MP4再切成 m3u8 分片方便流式播放和进度控制。# ffmpeg 转 m3u8 分片的参考命令 ffmpeg -i input.mp4 -c:v libx264 -c:a aac -hls_time 10 -hls_list_size 0 -f hls output.m3u8文件上传接口我拆成两个一个负责上传文件返回文件的存储路径另一个负责提交课程信息时绑定视频路径和时长。这样课程信息修改时不用重新传视频体验更好。3. 前端 Vue 项目实战3.1 项目搭建和环境配置前端我选用 Vue 3 Vite Pinia Element Plus 的组合。如果项目完全从零开始脚手架直接使用npm create vuelatest按需选择 TypeScript、Vue Router、Pinia。这里有个小建议Vite 项目默认的vitejs/plugin-vue版本要跟 Vue 版本匹配别用latest一把梭装完一启动报错再回退版本就比较难受。# 创建项目 npm create vuelatest safety-front # 进入项目并安装依赖 cd safety-front npm install # 额外安装常用依赖 npm install axios pinia vue-router element-plus element-plus/icons-vue npm install hls.js echarts开发环境的跨域问题Vite 配置 proxy 是最省事的做法。我在vite.config.js里配置所有/api开头的请求转发到http://localhost:8080并做了路径重写去掉/api前缀后端接口不需要额外处理前缀。server: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true, rewrite: (path) path.replace(/^\/api/, ) } } }如果你用的是 Vue 2 的旧项目可能还要解决 Node 版本兼容问题Vue 3 项目建议 Node 18老项目的依赖锁文件也不要轻易更新否则容易蹦出来一堆peerDependencies报错。3.2 m3u8 视频播放与学习进度记录m3u8 播放是热词里出现频率很高的点这个项目里也确实绕不开。理论上可以直接用video标签播放 m3u8但 Safari 支持原生 HLSChrome 和 Firefox 原生不支持必须引入 hls.js。import Hls from hls.js function initPlayer(videoSrc, videoElement) { if (Hls.isSupported()) { const hls new Hls({ // 关键配置允许越过 CORS 或鉴权时拼接 token xhrSetup: (xhr) { xhr.setRequestHeader(Authorization, Bearer getToken()) } }) hls.loadSource(videoSrc) hls.attachMedia(videoElement) hls.on(Hls.Events.MANIFEST_PARSED, () { videoElement.play() }) } else if (videoElement.canPlayType(application/vnd.apple.mpegurl)) { // 兼容 Safari videoElement.src videoSrc } }其中最容易踩的坑是m3u8 分片请求携带 token。如果你直接hls.loadSource(videoSrc)浏览器请求.ts分片时不会自动带上 Header 里的 Authorization而且大多数情况下这个接口不是模板渲染的没办法往 URL 后面拼 query。解决方案就是上面代码里的xhrSetup所有分片请求都经过这个回调把 token 加上。进度上报接口是POST /learning/progress传三个参数courseId、chapterId、watchSeconds。这里要注意watchSeconds是前端自己算出来的累计观看秒数后端不能完全信任这个值。我在后端还会判断如果某节课视频是 20 分钟学生 5 分钟就上报累计观看 1000 秒这肯定有问题直接拒绝记录。3.3 在线考试页面倒计时、防切屏、自动交卷考试页面跟普通表单最大的区别在于状态管理要非常细。我用 Pinia 存储整个考试状态包括题目列表、当前索引、每道题选择的答案、剩余时间、切屏次数。这个状态放在 Pinia 里而不是组件内部是因为考试页面包含了左侧题号导航、中间题目区、右侧倒计时三个大组件需要频繁共享状态。倒计时逻辑我用了 setInterval但要处理两个陷阱一是页面切到后台后 setInterval 会被浏览器节流倒计时不准二是在移动端锁屏后会直接暂停。解决办法是记录一个endTime时间戳倒计时显示的是Math.floor((endTime - Date.now()) / 1000)而不是每秒钟减一。const endTime Date.now() remainingSeconds * 1000 setInterval(() { const remain Math.floor((endTime - Date.now()) / 1000) if (remain 0) { autoSubmit() } else { remainSeconds.value remain } }, 250)防切屏方案市场上没有 100% 的完美方案但至少能挡住绝大多数“考试中途查资料”的行为。我用的是visibilitychangewindow.blur双重监听切换标签页或最小化窗口就记录一次切屏超过三次弹窗警示超过五次直接交卷。这个规则的松紧程度我建议做成参数不同老师容忍度不一样。考试中途刷新页面前端不丢失数据。做法是每次切换题目时把答案同步保存到 sessionStorage页面加载时先检测 sessionStorage 里有未交卷的记录提示“检测到未完成的考试是否继续”。后端也会在考试开始时生成一个考试记录 ID前端重新进入时带着这个 ID 继续答题倒计时继续按原来的结束时间走。3.4 学习记录与数据可视化管理员首页最关心的三个数据总学习人数、当前通过率、预警名单即将过期的准入名单。我使用 ECharts 做了三张图饼图展示各院系统计、折线图展示近 7 天学习趋势、表格展示准入门即将到期的学生列表。ECharts 在 Vue 3 里的使用很简单核心是echarts.init之后setOption记得组件卸载时dispose释放实例不然页面来回切换会内存泄漏。选 ECharts 而不是其他图表库主要考虑它生态成熟、中文文档多遇到特殊需求比如雷达图展示八类安全技能得分也能直接找到示例。雷达图用在这个场景很合适学生考完试后可以按“化学试剂安全、生物安全、设备操作、消防应急、食品安全卫生、个人防护、废物处置、应急救护”八个维度给他画一张能力画像这比一个冷冰冰的总分更有说服力老师看了也能针对性地安排补学内容。4. 常见问题与排查技巧实录4.1 Spring Boot 版本过高引发的兼容性问题如果你现在去 Spring Initializr 下拉默认已经是 3.x 了很多新手直接默认配置拉下来然后整合旧教程里的代码就报错。最典型的是javax.servlet全部变成了jakarta.servlet自己写的过滤器或拦截器直接编译不通过。我的建议是如果这个项目是要稳妥交付的直接选 Spring Boot 2.7.18这是 2.x 的最后一个版本生命周期够长网上绝大多数教程都基于这一代。如果一定要用 3.x那 MyBatis-Plus 必须用 3.5.5mybatis-plus-spring-boot3-starter这个依赖别搞错否则启动直接报找不到SqlSessionFactory。另外还有一个容易被忽略的版本坑JDK 版本。Spring Boot 2.7 用 JDK 8 和 JDK 11 都能跑Spring Boot 3 强制要求 JDK 17。如果服务器上只装了 JDK 8别硬上 3.x。开发机是 JDK 17部署机是 JDK 8这种环境不一致问题建议直接用 Docker 打包镜像避免“我本地能跑服务器上不行”的尴尬。4.2 循环依赖与自动装配问题Spring Boot 项目里循环依赖是个经典问题我这个项目就踩过。场景是这样JWT 过滤器需要调用 UserService 查询用户状态而 UserService 里又需要注入一个 RedisUtilRedisUtil 要用到 Jackson 序列化配置这个配置类里又调用了 JWT 过滤器里的一个工具方法。看着很绕其实本质是我把工具类写成了 Spring Bean 并且互相注入结果启动时报了The dependencies of some of the beans in the application context form a cycle。解决办法不是改Lazy糊弄过去而是重新梳理依赖关系。我的做法是把 JWT 相关的纯工具方法抽成静态方法不依赖 Spring 容器。过滤器里不再注入 service改为直接调用静态工具类 查 Redis 缓存。需要查数据库动态权限的地方放行到 Controller 层再校验。这样调整之后启动时间从“偶尔报错反复重启”变成了“一次通过”。如果你改完代码仍然循环依赖先检查一下是不是在构造器里互相 new 了或者 AOP 切面不小心包了自身。4.3 m3u8 播放常见问题CORS 跨域与鉴权m3u8 播放最坑的一个现象是index.m3u8能请求到但.ts分片全部 403 或跨域报错。排查方向主要有三个第一个是CORS 配置。如果前端页面在localhost:5173视频接口在localhost:8080属于不同源后端需要对视频相关接口允许跨域。如果你用了 Spring Security 或拦截器注意 CORS 配置要放在最外层过滤器链里否则拦截器先返回了跨域头根本没加上。第二个是鉴权 Headers。上面提到过HLS 的分片请求默认不带自定义 Headers如果没有配置xhrSetup你在页面上能看到index.m3u8返回成功但每个.ts请求都因为没带 token 被后端拒绝。这个问题在浏览器里表现为视频播放几秒后卡住控制台一堆 403。第三个是m3u8 文件里的相对路径。FFmpeg 生成的 m3u8 文件里分片路径默认是相对路径比如output0.ts。如果前端用https://domain/video/xxx/output.m3u8加载浏览器会自动拼接为https://domain/video/xxx/output0.ts这是正常的。但如果你把 m3u8 文件下载到本地再放到 CDN 上路径就全错了。建议生成时用-hls_segment_filename指定分片命名并且保持 m3u8 和 ts 在同一目录。4.4 大文件上传超时与断点续传安全视频动不动就是几百 MB项目里最初用普通表单上传传大视频经常遇到 nginx 的client_max_body_size限制或者后端spring.servlet.multipart.max-file-size默认 1MB 直接报错。这三处配置要同时改缺一不可# application.yml spring: servlet: multipart: max-file-size: 2048MB max-request-size: 2048MB# nginx 反向代理配置 client_max_body_size 2048m; proxy_read_timeout 600s; proxy_send_timeout 600s;如果视频超过 1GB我建议还是做分片上传不要头铁硬传。前端用file.slice(start, end)切分每片 5MB-20MB后端提供一个接收分片接口和合并接口。分片方案的工作量约半天但效果立竿见影而且能支持断点续传网络中断后只需要重传未完成的分片。// 前端分片上传简化版 const CHUNK_SIZE 10 * 1024 * 1024 // 10MB for (let start 0; start file.size; start CHUNK_SIZE) { const chunk file.slice(start, start CHUNK_SIZE) const formData new FormData() formData.append(file, chunk) formData.append(fileName, file.name) formData.append(chunkIndex, String(Math.floor(start / CHUNK_SIZE))) formData.append(totalChunks, String(Math.ceil(file.size / CHUNK_SIZE))) // 逐个上传记录已完成分片 await uploadChunk(formData) }文件最后合并时要注意磁盘空间和并发控制。串行合并比并行合并稳定得多合并完校验文件大小跟原始文件是否一致不一致就提示重新上传。4.5 高频出现的其他小问题接口返回 401 但前端不跳转登录页Axios 响应拦截器里要统一处理 401 状态清除本地 token 并跳转/login。数据库时间字段差了 8 小时连接字符串加serverTimezoneAsia/ShanghaiJackson 序列化加time-zone: GMT8。Vue 打包后刷新 404这是前端路由 history 模式的经典问题nginxtry_files配置改成try_files $uri $uri/ /index.html;。Element Plus 表单校验不触发检查是否在el-form上绑定了:model和rules而且el-form-item的prop必须与表单字段名一致。写在最后的几点体会这个系统从需求确认到上线我最大的感悟是技术只占一半另一半是跟实验室安全管理员反复对齐业务规则。比如食品实验室的“高压灭菌锅操作”这个题目到底算设备类还是生物类不同老师理解不同题库分类如果不提前定清楚后面抽题比例就会出现偏差。另外就是准入有效期设多久、复训提前多少天提醒这些参数一定要做成可配置的别写死在代码里因为学校可能每个学期的安全管理要求都在调整。如果后面你还想继续扩展这个系统比较有价值的方向有两个一是对接门禁闸机把准入状态作为刷卡进实验室的前置条件真正做到“未通过考核门都刷不开”二是加一个事故案例库模块把真实发生的实验室安全事故做成图文或视频复盘比干巴巴的规章制度有用得多。技术本身不复杂把这些业务细节想透系统才真正能用起来。
RELATED

相关推荐

CANN/ge Triton算子入图指南

CANN/ge Triton算子入图指南

Triton入图 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端…

📅 2026/9/10 2:03:56
I2C时序配置不再靠猜:从tHD到寄存器值的实用计算法

I2C时序配置不再靠猜:从tHD到寄存器值的实用计算法

简介:一份源自ST官网的STM32F0硬件I2C时序配置工具,面向使用STM32F0/F3系列开展I2C外设开发的嵌入式工程师,用于快速计算I2C时序参数并生成对应配置值,解决标准外设库下手动查表、反复调整时序余量的痛点。压缩包共3个文件&#x…

📅 2026/9/10 2:03:56
2026团队AI编程协作指南:TRAE、Cursor、Copilot等8款工具深度对比

2026团队AI编程协作指南:TRAE、Cursor、Copilot等8款工具深度对比

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

📅 2026/9/10 2:03:56
MORE NEWS

更多资讯

📰

mise 的 GitLab Backend 使用指南:从 GitLab Release 安装预编译工具、配置认证与资产匹配

mise 的 GitLab Backend 使用指南:从 GitLab Release 安装预编译工具、配置认证与资产匹配 【免费下载链接】mise dev tools, env vars, task runner 项目地址: https://gitcode.com/GitHub_Trending/mi/mise 本篇技术指南围绕 mise 的 gitlab backend 展开&…

📰

Starship No Runtime Versions 预设:在容器与虚拟化环境中隐藏语言运行时版本

Starship No Runtime Versions 预设:在容器与虚拟化环境中隐藏语言运行时版本 【免费下载链接】starship ☄🌌️ The minimal, blazing-fast, and infinitely customizable prompt for any shell! 项目地址: https://gitcode.com/GitHub_Trending/st/s…

📰

Agno × SurrealDB 记忆管理实战:从零实现 Agent 持久化记忆的完整指南

Agno SurrealDB 记忆管理实战:从零实现 Agent 持久化记忆的完整指南 【免费下载链接】agno Build, run, and manage agent platforms. 项目地址: https://gitcode.com/GitHub_Trending/ag/agno Agno(原 Phidata)将 SurrealDB 作为 Ag…

📰

kitty transfer kitten 完全指南:通过 TTY 在任意两台计算机之间传输文件

kitty transfer kitten 完全指南:通过 TTY 在任意两台计算机之间传输文件 【免费下载链接】kitty If you live in the terminal, kitty is made for you! Cross-platform, fast, feature-rich, GPU based. 项目地址: https://gitcode.com/GitHub_Trending/ki/kitt…

📰

ECC 的 Go 测试规则:go test 表驱动测试、-race 竞态检测与 80% 覆盖率要求

ECC 的 Go 测试规则:go test 表驱动测试、-race 竞态检测与 80% 覆盖率要求 【免费下载链接】ECC The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, C…

📰

CopilotKit React 的 Agent 访问层:useAgent 与 useAgentContext 完整接入与避坑指南

CopilotKit React 的 Agent 访问层:useAgent 与 useAgentContext 完整接入与避坑指南 【免费下载链接】CopilotKit The Frontend Stack for Agents & Generative UI. React, Angular, Mobile, Slack, and more. Makers of the AG-UI Protocol 项目地址: https…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬