JSP+SQL实验教学管理系统源码实战:从环境搭建到二次开发避坑指南
简介本资源为基于JavaWeb技术栈实现的JSPSQL实验教学管理系统面向计算机相关专业的毕业设计、课程设计学生及JavaWeb初学者帮助解决从选题到落地实现的全流程需求。压缩包为zip格式整体约3.66MB内含前后端源码、数据库脚本、说明文档及配套论文覆盖系统开发的核心环节。资源标签聚焦Java、javaweb与实战项目适合需要完整项目参考或二次开发的学习者。已有88人学习下载说明其具备一定的实用参考价值。读者可获得一套可运行的教学管理系统源码理解JSP页面与SQL数据库的交互逻辑掌握JavaWeb项目的目录结构与分层设计同时借助说明文档快速完成环境搭建与功能调试为毕业设计答辩或课程设计提交提供扎实的项目基础。1. 从一份 JSPSQL 实验教学管理系统源码包说起它到底能跑出什么如果你正在找一份能直接跑起来、带论文和数据库脚本的 JavaWeb 课程设计或毕业设计这份「基于 JSPSQL 的实验教学管理系统」大概率会出现在你的候选清单里。它不是那种只有几个页面的演示 Demo而是一套完整的实验教学业务闭环管理员管实验室、管设备、管排课教师申请实验、提交实验报告学生选实验、查成绩背后用 JSP 做视图层、Servlet 做控制层、JDBC 直连 MySQL 或 SQL Server 做数据层。整套资源里除了前后端源码还塞了数据库建表脚本、运行说明文档和一篇成型的论文对需要交课程设计或毕业设计的人来说省掉的不只是写代码的时间还有「论文怎么凑字数、系统怎么截图」的焦虑。我拿到这类包的习惯是先看三件事数据库脚本能不能一次执行通过、web.xml 里的 Servlet 映射有没有缺、JSP 页面里有没有硬编码的绝对路径。这三处只要有一处翻车后面调起来就是无底洞。这份包在这三点上做得算规矩建表语句带注释、外键约束完整Servlet 用的是注解加 web.xml 双配置路径基本走的是相对路径。适合谁适合 JavaWeb 刚学完、需要一份能讲清楚 MVC 分层的中等规模项目练手的人也适合时间紧、需要快速搭出可演示系统的毕业生。下面我按「先跑通、再拆解、后避坑」的顺序把这份资源从解压到二次开发的路子走一遍。2. 环境搭建与数据库初始化把 JSPSQL 项目从压缩包跑到浏览器2.1 选 JDK、Tomcat 和数据库版本的现实考量这份资源的技术栈是经典三件套JSP Servlet JDBC没有上 Spring 那套所以环境依赖很轻。JDK 用 8 或 11 都行我一般选 JDK 8因为老项目里有些 JSP 标签库和 Tomcat 版本对高版本 JDK 的模块化限制比较敏感用 8 能少踩一半玄学问题。Tomcat 选 8.5 或 9.0别上 Tomcat 10因为 Tomcat 10 把 javax.servlet 包名换成了 jakarta.servlet这份源码里的 import 语句全是 javax 开头换 Tomcat 10 直接编译报错这是血泪经验。数据库方面源码里通常给的是 MySQL 脚本但关键词里也出现了 SQL Server说明有些版本可能配的是 SQL Server。你拿到包先看sql文件夹里的脚本文件名如果是.sql且开头有CREATE DATABASE基本就是 MySQL。MySQL 用 5.7 或 8.0 都可以8.0 要注意连接串里加serverTimezoneAsia/Shanghai否则日期字段会报时区错误。SQL Server 的话用 2008 R2 或 2019 都行但记得把 TCP/IP 协议启用否则 JDBC 连不上。提示不要用最新版 Tomcat 和最新版 JDK 去跑老 JSP 项目版本匹配比性能重要。2.2 数据库脚本导入与连接配置修改先把数据库跑起来。以 MySQL 为例用命令行或 Navicat 都行我习惯用命令行因为能看到每一步的报错。# 登录 MySQL输入密码 mysql -u root -p # 创建数据库字符集用 utf8mb4避免中文乱码 CREATE DATABASE lab_teaching DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 切换到该数据库 USE lab_teaching; # 导入建表脚本路径换成你解压后的实际路径 source D:/lab_teaching/sql/lab_teaching.sql;执行完source后用SHOW TABLES;看一眼表是不是都建出来了。常见情况是脚本里写了DROP TABLE IF EXISTS但外键顺序不对导致删表失败这时候把脚本里外键约束那段先注释掉建完表再单独加。接下来改数据库连接配置。JSP 项目一般会把连接信息放在一个工具类里比如src/com/lab/util/DBUtil.java或者放在db.properties里。找到这几行// DBUtil.java 里的典型写法 private static final String URL jdbc:mysql://localhost:3306/lab_teaching?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai; private static final String USER root; private static final String PASSWORD 你的密码;把USER和PASSWORD改成你本机的。如果用的是 SQL ServerURL 格式不一样// SQL Server 的 JDBC URL 写法 private static final String URL jdbc:sqlserver://localhost:1433;databaseNamelab_teaching;encryptfalse;encryptfalse在 SQL Server 2008 R2 上必须加否则驱动会尝试加密连接然后超时。改完配置后把 MySQL 或 SQL Server 的 JDBC 驱动 jar 包放进WEB-INF/lib目录MySQL 用mysql-connector-java-8.0.x.jarSQL Server 用mssql-jdbc-7.4.x.jre8.jar。2.3 在 IDEA 里部署到 Tomcat 并验证登录IDEA 导入项目时选「Existing Maven Project」或直接「Open」文件夹如果项目没有 pom.xml就按普通 Web 项目导入。关键一步是配置 Artifacts打开 Project Structure在 Artifacts 里新增一个 Web Application Exploded把项目的 Web 目录或src/main/webapp加进去输出目录指向 Tomcat 的 webapps 或者一个临时目录。然后配置 Tomcat Server在 Deployment 标签页里把刚才的 Artifact 加进去Application context 设成/lab。启动 Tomcat浏览器访问http://localhost:8080/lab/login.jsp。如果看到登录页说明 JSP 编译和数据库连接都通了。用管理员账号登录账号密码一般在论文或说明文档里写着常见的是admin/123456或admin/admin。如果登录报 500先看 Tomcat 控制台的异常栈。最常见的是ClassNotFoundException: com.mysql.cj.jdbc.Driver说明驱动 jar 没放进WEB-INF/lib或者放进去但没在 Artifact 里勾选。另一个常见的是Access denied for user rootlocalhost那就是密码没改对。把这两个坑过了系统基本就能跑起来了。3. 源码结构拆解JSP 视图层、Servlet 控制层与 JDBC 数据层的分工3.1 包结构与 MVC 分层逻辑这份源码的目录结构是典型的 JavaWeb 分层写法我拆过好几个类似的包结构大同小异src/ com/lab/ dao/ // 数据访问层直接写 JDBC entity/ // 实体类和数据库表一一对应 servlet/ // 控制层处理请求和跳转 util/ // 工具类DBUtil、分页工具等 WebContent/ 或 webapp/ css/ // 样式 js/ // 脚本 jsp/ // 视图页面 WEB-INF/ web.xml // 部署描述符 lib/ // 依赖 jarentity包里每个类对应一张表比如Student.java对应student表字段名和列名基本一致getter/setter 齐全。dao包里是StudentDao.java这种里面用PreparedStatement拼 SQL没有用 ORM 框架。servlet包里是StudentServlet.java通过WebServlet(/student)注解映射路径doGet 里调 dao 拿数据然后request.setAttribute再forward到 JSP。这种结构的优点是清晰缺点是 dao 层代码重复度高每个实体都要写一遍增删改查。如果你要二次开发建议先抽一个BaseDao出来把getConnection、close、executeUpdate这些公共方法收进去后面加新模块能省不少事。3.2 一个典型 Servlet 的请求处理链路拿「学生选实验」这个功能举例从前端到数据库的链路是这样的学生在selectExperiment.jsp页面点击「选课」按钮表单提交到ExperimentServlet?actionselectServlet 的 doPost 方法里根据action参数判断操作类型调用ExperimentDao.selectExperiment(studentId, experimentId)dao 里执行INSERT INTO student_experiment语句返回影响行数Servlet 根据结果设置msg属性再response.sendRedirect回列表页。// ExperimentServlet.java 里的核心分支 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action request.getParameter(action); if (select.equals(action)) { int studentId Integer.parseInt(request.getParameter(studentId)); int experimentId Integer.parseInt(request.getParameter(experimentId)); // 调用 dao 层执行插入 boolean success experimentDao.selectExperiment(studentId, experimentId); if (success) { request.getSession().setAttribute(msg, 选课成功); } else { request.getSession().setAttribute(msg, 选课失败可能已选过); } response.sendRedirect(request.getContextPath() /experiment?actionlist); } }这段代码里action参数是控制层路由的关键所有操作都走同一个 Servlet靠action值区分。这种写法在课程设计里很常见好处是 web.xml 里不用配一堆 servlet-mapping坏处是单个 Servlet 会越来越臃肿。如果你要加新功能建议按业务拆成多个 Servlet比如ExperimentServlet、ScoreServlet、LabRoomServlet别全塞一个类里。参数说明studentId和experimentId都是从表单 hidden 字段或 URL 参数传过来的Integer.parseInt之前最好做空值判断否则用户直接访问不带参数的 URL 会抛NumberFormatException。sendRedirect之后浏览器地址栏会变如果不想变就用forward但forward之后刷新页面会重复提交选课这种写操作必须用sendRedirect。3.3 数据库表关系与核心 SQL 语句实验教学管理系统的表不多核心就七八张user用户、student学生、teacher教师、lab_room实验室、equipment设备、experiment实验项目、student_experiment选课关系、score成绩。关系上一个实验室有多台设备一个教师可以发布多个实验一个学生可以选多个实验选课关系表里记录选课时间和成绩。-- 查询某个学生已选的实验及成绩 SELECT e.exp_name, e.exp_date, se.select_time, s.score FROM student_experiment se JOIN experiment e ON se.experiment_id e.id LEFT JOIN score s ON s.student_id se.student_id AND s.experiment_id se.experiment_id WHERE se.student_id 1001 ORDER BY se.select_time DESC;这条 SQL 用了两次 JOINLEFT JOIN score是为了让没出成绩的实验也能显示出来成绩字段为 NULL。如果你在系统里看到某个学生选了实验但成绩栏空白不是 bug是成绩还没录入。ORDER BY se.select_time DESC让最近选的排前面符合使用习惯。注意student_experiment表最好加一个UNIQUE(student_id, experiment_id)约束防止同一个学生重复选同一个实验。源码里如果没加你自己补上否则后面统计人数会翻倍。4. 功能模块二次开发从实验预约到成绩统计的改造点4.1 实验预约模块的冲突检测逻辑原始系统里学生选实验基本是「先到先得」没有做时间冲突检测。如果你要把它改成一个像样的排课系统第一步就是加冲突判断同一个学生在同一时间段不能选两个实验。实现思路是在ExperimentDao.selectExperiment里先查该学生已选实验的时间段再和当前要选的实验时间段做重叠判断。// 冲突检测查询该学生已选实验的时间段 public boolean hasTimeConflict(int studentId, String newStart, String newEnd) { String sql SELECT e.exp_start, e.exp_end FROM student_experiment se JOIN experiment e ON se.experiment_id e.id WHERE se.student_id ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setInt(1, studentId); ResultSet rs ps.executeQuery(); while (rs.next()) { String existStart rs.getString(exp_start); String existEnd rs.getString(exp_end); // 时间段重叠判断新开始 旧结束 且 新结束 旧开始 if (newStart.compareTo(existEnd) 0 newEnd.compareTo(existStart) 0) { return true; } } } catch (SQLException e) { e.printStackTrace(); } return false; }这里的时间比较用的是字符串compareTo前提是时间格式统一为yyyy-MM-dd HH:mm否则比较结果不对。更稳妥的做法是把时间转成Timestamp或LocalDateTime再比。hasTimeConflict返回 true 时Servlet 里就不要执行插入直接提示「时间冲突请选择其他实验」。这个改造点很适合写进论文的「系统优化」章节因为它是真实业务需求不是硬凑的功能。4.2 成绩录入与统计报表的 SQL 优化成绩模块原始实现可能是逐条录入教师点一个学生录一个分。如果班级人数多这个操作很烦。我一般会加一个批量录入页面用表格展示所有选了该实验的学生教师填完一次性提交。后端接收数组参数用batchUpdate批量执行。// 批量录入成绩 public int batchInsertScore(int experimentId, int[] studentIds, double[] scores) { String sql INSERT INTO score (student_id, experiment_id, score) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE score VALUES(score); int count 0; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { for (int i 0; i studentIds.length; i) { ps.setInt(1, studentIds[i]); ps.setInt(2, experimentId); ps.setDouble(3, scores[i]); ps.addBatch(); } int[] results ps.executeBatch(); count results.length; } catch (SQLException e) { e.printStackTrace(); } return count; }ON DUPLICATE KEY UPDATE是 MySQL 的语法作用是新插入时如果唯一键冲突就更新成绩这样教师可以反复修改。SQL Server 里对应的写法是MERGE语句稍微复杂一点。addBatch和executeBatch把多条插入合并成一次网络往返比循环单条插入快很多这是慢 SQL 优化的基本操作。统计报表方面原始系统可能只显示平均分。你可以加一个「成绩分布」查询用CASE WHEN把分数分段SELECT SUM(CASE WHEN score 90 THEN 1 ELSE 0 END) AS excellent, SUM(CASE WHEN score 80 AND score 90 THEN 1 ELSE 0 END) AS good, SUM(CASE WHEN score 60 AND score 80 THEN 1 ELSE 0 END) AS pass, SUM(CASE WHEN score 60 THEN 1 ELSE 0 END) AS fail FROM score WHERE experiment_id 5;这条 SQL 一次返回四个分数段的人数前端用 ECharts 或简单的表格展示都行。注意SUM(CASE WHEN...)里不要漏掉ELSE 0否则 NULL 会让整列结果变成 NULL。4.3 分页查询与 JSP 页面渲染的配合数据量一上来列表页必须分页。原始系统可能用的是LIMIT硬编码比如LIMIT 0, 10。更好的做法是把页码和每页条数做成参数。// 分页查询实验列表 public ListExperiment getExperimentsByPage(int page, int pageSize) { ListExperiment list new ArrayList(); String sql SELECT * FROM experiment ORDER BY id DESC LIMIT ?, ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setInt(1, (page - 1) * pageSize); ps.setInt(2, pageSize); ResultSet rs ps.executeQuery(); while (rs.next()) { Experiment exp new Experiment(); exp.setId(rs.getInt(id)); exp.setExpName(rs.getString(exp_name)); // 其他字段省略 list.add(exp); } } catch (SQLException e) { e.printStackTrace(); } return list; }(page - 1) * pageSize是偏移量计算公式page 从 1 开始。JSP 页面里用 JSTL 的c:forEach遍历 list 渲染表格底部放上一页/下一页链接链接里带上page参数。注意 SQL Server 不支持LIMIT要用OFFSET ? ROWS FETCH NEXT ? ROWS ONLY这是数据库差异带来的坑换数据库时一定要检查。5. 避坑与常见问题排查JSPSQL 项目最容易翻车的五个地方5.1 中文乱码从数据库到 JSP 页面的全链路排查现象页面输入中文保存后变成???或乱码。原因通常有三层数据库字符集不是 utf8mb4、JDBC 连接串没加characterEncodingutf8、JSP 页面没声明pageEncoding。解决顺序是从底往上查先确认数据库和表的字符集再确认连接串最后确认 JSP 头部。% page contentTypetext/html;charsetUTF-8 languagejava pageEncodingUTF-8 %这三处都对了中文基本不会乱。如果还有问题检查 Tomcat 的server.xml里 Connector 有没有加URIEncodingUTF-8Tomcat 8 以上默认就是 UTF-8但老版本需要手动加。5.2 数据库连接池未关闭导致 Tomcat 启动越来越慢现象每次重启 Tomcat 越来越慢最后报Too many connections。原因dao 层里Connection、PreparedStatement、ResultSet没有在 finally 里关闭连接泄漏。解决用 try-with-resources 语法把资源声明在 try 的括号里自动关闭。try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql); ResultSet rs ps.executeQuery()) { // 处理结果集 } catch (SQLException e) { e.printStackTrace(); }如果项目里已经有很多地方没关全局搜getConnection逐个改成 try-with-resources。这个改动虽然机械但能根治连接泄漏。5.3 JSP 页面里 Java 代码过多导致编译报错难定位现象JSP 页面报 500异常栈指向_jspService方法行号对不上源码。原因JSP 里嵌了太多% %脚本片段编译后的 Servlet 行号和 JSP 行号不一致。解决把业务逻辑挪到 Servlet 或自定义标签里JSP 只负责渲染。如果必须写脚本用 JSTL 和 EL 表达式替代。!-- 不推荐脚本片段 -- % ListExperiment list (ListExperiment) request.getAttribute(list); % % for (Experiment exp : list) { % trtd% exp.getExpName() %/td/tr % } % !-- 推荐JSTL 标签 -- c:forEach items${list} varexp trtd${exp.expName}/td/tr /c:forEachJSTL 需要引入jstl.jar和standard.jar在 JSP 头部加% taglib prefixc urihttp://java.sun.com/jsp/jstl/core %。5.4 SQL 注入风险登录框里的万能密码现象登录框输入 or 11就能进系统。原因dao 层用Statement拼接 SQL 字符串没有用PreparedStatement。解决所有带参数的 SQL 一律用PreparedStatement用?占位符。// 危险写法 String sql SELECT * FROM user WHERE username username AND password password ; // 安全写法 String sql SELECT * FROM user WHERE username ? AND password ?; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password);这份源码里如果还有拼接 SQL 的地方全部改掉。SQL 注入是课程设计里最容易被答辩老师挑出来的安全问题改起来不费事但能避免尴尬。5.5 论文与源码功能对不上导致答辩被追问现象论文里写了「支持实验预约冲突检测」但源码里根本没这个功能。原因论文是模板改的功能描述和实际代码脱节。解决答辩前把论文里的功能点逐个在系统里点一遍对不上的要么补代码要么改论文。我一般会列一个功能对照表左边是论文里的功能名右边是系统里的菜单路径和操作截图确保一一对应。提示答辩老师最喜欢问「这个功能你是怎么实现的」论文里写了但代码里没有一问就露馅。6. 从能跑到能讲把这份源码变成你自己的项目经验跑通系统只是第一步真正让这份资源产生价值的是你能把它讲清楚。我一般会做三件事第一画一张系统架构图把 JSP、Servlet、DAO、数据库四层的关系标出来每个箭头代表一次请求或一次查询第二挑一个核心功能比如「学生选实验」把从前端点击到数据库写入的完整链路写成一段话面试或答辩时直接讲第三准备三个「如果让我改我会怎么改」的点比如加连接池、加事务控制、加日志。连接池这块原始项目用的是DriverManager每次新建连接性能很差。你可以引入 Druid 或 HikariCP改DBUtil的getConnection方法// 用 HikariCP 替换 DriverManager private static HikariDataSource dataSource; static { HikariConfig config new HikariConfig(); config.setJdbcUrl(jdbc:mysql://localhost:3306/lab_teaching?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai); config.setUsername(root); config.setPassword(你的密码); config.setMaximumPoolSize(10); config.setMinimumIdle(2); dataSource new HikariDataSource(config); } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); }maximumPoolSize设 10 对课程设计来说够用了minimumIdle设 2 保证池里始终有可用连接。改完之后Tomcat 启动时只初始化一次连接池后续请求复用连接响应速度会明显提升。这个改动写进论文的「性能优化」章节比空谈理论有说服力。事务控制也是加分项。比如「学生选实验」和「扣减实验容量」应该在一个事务里要么都成功要么都回滚。原始代码里可能是两条独立的 SQL中间出错就会数据不一致。改成手动事务Connection conn null; try { conn DBUtil.getConnection(); conn.setAutoCommit(false); // 关闭自动提交 // 第一条 SQL插入选课记录 // 第二条 SQL更新实验已选人数 conn.commit(); // 两条都成功才提交 } catch (SQLException e) { if (conn ! null) conn.rollback(); // 出错回滚 e.printStackTrace(); } finally { if (conn ! null) conn.close(); }setAutoCommit(false)之后必须显式commit或rollback否则连接关闭时未提交的操作会丢失。这个模式在 JDBC 里是标准写法面试问「JDBC 怎么控制事务」直接答这个就行。最后说一个我自己的习惯每次拿到一份别人的源码跑通之后第一件事是写一个README.md记录环境版本、数据库账号、启动步骤和已知问题。这份资源本身带了说明文档但文档里不一定写全你踩过的坑。我把自己遇到的 Tomcat 版本问题、时区问题、驱动包问题都补进去下次换电脑或者换环境照着 README 走一遍就能跑起来不用重新回忆。从那以后我每次部署这类 JSP 项目都强制走一遍「建库、导脚本、改配置、放驱动、配 Artifact、启动验证」这六步一步不跳。希望这份拆解能帮你少走点弯路顺利把系统跑起来、讲清楚。本文还有配套的精品资源点击获取

相关新闻

superpowers工具链实战:从模板化项目生成到AI辅助开发

superpowers工具链实战:从模板化项目生成到AI辅助开发

很多开发者朋友第一次看到“superpowers”这个名字,可能会觉得它是个宣传噱头。但如果你把它拆开看,会发现这其实是一个很务实的定位:用一套统一的工具链,把日常开发里那些繁琐、重复、容易出错的环节自动化,让程序员能…

2026/10/9 7:05:52 阅读更多 →
Selenium ActionChains原理与实战:从鼠标事件到复杂交互自动化

Selenium ActionChains原理与实战:从鼠标事件到复杂交互自动化

搞自动化测试这几年,我越来越觉得ActionChains是个被严重低估的工具。大多数人提到它,第一反应就是“用来做鼠标悬停和拖拽的API”,然后写两行move_to_element就完事了。但真到了复杂业务场景——多级菜单联动、画布拖拽绘制、右键菜单操作、…

2026/10/9 7:05:52 阅读更多 →
C++容器选型:vector、list、deque底层原理与性能对比

C++容器选型:vector、list、deque底层原理与性能对比

1. 内容整体设计与核心思路拆解做C开发这些年,跟容器打交道的时间可能比跟对象打交道的时间还多。vector、list、deque这三个标准库容器,几乎出现在每一段业务代码里,但真正能说清楚它们底层到底怎么干活、什么时候该选谁的人,其实…

2026/10/9 7:04:51 阅读更多 →

最新新闻

DiPlay 侧边面板实现解析:让 CarPlay 与车载信息分屏共享主屏幕

DiPlay 侧边面板实现解析:让 CarPlay 与车载信息分屏共享主屏幕

移动开发智能硬件音视频 【免费下载链接】DiPlay Independent CarPlay receiver for compatible Android head units. Wired and wireless public preview. 项目地址: https://gitcode.com/gh_mirrors/di/DiPlay 点击查看 免费下载 DiPlay 的「CarPlay 旁侧边面板」…

2026/10/9 7:33:11 阅读更多 →
Waza Write 长文模式:先做结构手术,再做行级去 AI 味

Waza Write 长文模式:先做结构手术,再做行级去 AI 味

【免费下载链接】Waza 🥷 Engineering habits you already know, turned into skills Claude can run. 项目地址: https://gitcode.com/gh_mirrors/cl/Waza 点击查看 免费下载 这篇技术指南围绕 Waza 插件中 write 技能的 mode-long-form.md&#xff08…

2026/10/9 7:33:11 阅读更多 →
douyin-downloader 实战:一次配置,抖音作品批量下载长期自动同步

douyin-downloader 实战:一次配置,抖音作品批量下载长期自动同步

douyin-downloader 实战:一次配置,抖音作品批量下载长期自动同步 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and b…

2026/10/9 7:33:11 阅读更多 →
2026年软件测试面试:面试官真正在意的就这几件事

2026年软件测试面试:面试官真正在意的就这几件事

2026年软件测试面试:别再背题了,面试官真正在意的就这几件事每年到这个时间点,就会有一大批朋友开始疯狂刷题。网上各种“2026最新软件测试面试题(带答案)”满天飞,有些确实是好东西,但更多的只…

2026/10/9 7:33:11 阅读更多 →
【AIGC】AI大模型选型丛林指南:从API Key到TaoToken的接入实践

【AIGC】AI大模型选型丛林指南:从API Key到TaoToken的接入实践

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

2026/10/9 7:33:11 阅读更多 →
开源多模态视频模型 MiniMax H3 部署与推理优化实践

开源多模态视频模型 MiniMax H3 部署与推理优化实践

搞视频AI的人大概都有一个共同的痛点:生成一段视频要抽帧、分析画面、转换文本、对齐音频、再加字幕,每一步都要接不同的模型,管线长到怀疑人生。上个月我在处理一个内部需求时,把开源多模态视频模型 MiniMax H3 视频工作室整套流…

2026/10/9 7:32:10 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/9 6:17:20 阅读更多 →