JSP+Servlet手写成绩管理系统:从MVC架构到数据库设计与部署避坑指南
简介一套基于JSP与Servlet的Web成绩管理系统课程设计源码面向计算机专业学生与Java Web初学者覆盖学生、教师、管理员三类角色的完整业务闭环。学生端支持个人信息维护与成绩查询教师端提供成绩录入、修改、查看与分析管理员端包含学生、教师、班级、课程的增删改查以及课程安排、用户权限管理等后台功能适合作为毕业设计或课程设计的参考蓝本。压缩包内共870个文件以Java源码、JSP页面、JavaScript脚本、CSS样式表为主另含SQL数据库脚本及PNG、JPG图片资源整体大小约39.64MB目录结构清晰便于按模块定位代码。目前已有173人学习浏览体现出较高的参考价值。借助该资源读者可快速掌握JSPServlet开发模式下的权限分层设计与增删改查实现思路并可直接复用成绩统计、班级分配等模块代码为二次开发或功能扩展打下基础。1. 一个JSPServlet成绩系统为什么值得自己从头搭一遍成绩管理系统这种“老掉牙”的Web项目在课程设计、毕业设计里出现频率极高但很多同学只是把别人的代码下载下来改个数据库名就交差结果答辩时连Servlet生命周期都说不清。实际上这类项目恰恰是理解Java Web最扎实的载体没有Spring Boot帮你自动配置你必须亲手写Filter、写JDBC、处理中文乱码才能明白框架替你做了什么。这套基于JSPServlet的Web成绩管理系统核心就是教师录入成绩、学生查询成绩、管理员管理课程和学生信息适合想从底层把Java Web打通的人也适合需要一个能跑通、能演示、能讲清楚原理的项目作为起步。下面按我实际搭过一遍的路径把技术栈、数据库、权限、查询链路和踩坑点完整拆开。2. 先把技术栈和工程结构立住JSPServlet的MVC分工与选型理由2.1 Servlet负责“干活”JSP负责“显示”这套分工到底怎么切很多初学者会把Java代码直接写在JSP里结果一个页面几百行% %改一个SQL就要重新部署维护起来像拆炸弹。MVC的分工在这套系统里必须明确Controller是ServletModel是JavaBeanDAOView是JSP。Servlet接收HTTP请求、调用DAO查询数据库、把结果放到request域里再forward到JSPJSP只负责用EL和JSTL把数据渲染成HTML。我一般会再定一条硬规矩JSP里不允许出现import java.sql.*不允许直接写Connection谁违反谁重构。这样一来后面接Spring MVC时只需要把Servlet换成ControllerDAO层几乎原样迁移。你要理解这套系统不是为炫技而是为了让你看清请求是怎么被处理的。2.2 用Maven搭一个最省事的Web工程结构虽然很多人喜欢直接新建Dynamic Web Project但我更推荐Maven结构因为依赖管理能少一半麻烦。你只需要一个pom.xml加上Jetty或Tomcat插件就能启动。!-- pom.xml 关键片段 -- project xmlnshttp://maven.apache.org/POM/4.0.0 modelVersion4.0.0/modelVersion groupIdcom.example/groupId artifactIdgrade-manager/artifactId version1.0.0/version packagingwar/packaging properties maven.compiler.source1.8/maven.compiler.source maven.compiler.target1.8/maven.compiler.target project.build.sourceEncodingUTF-8/project.build.sourceEncoding /properties dependencies !-- Servlet API 由 Tomcat 提供scope 用 provided -- dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependency !-- JSP API -- dependency groupIdjavax.servlet.jsp/groupId artifactIdjavax.servlet.jsp-api/artifactId version2.3.3/version scopeprovided/scope /dependency !-- JSTL 标签库 -- dependency groupIdjavax.servlet/groupId artifactIdjstl/artifactId version1.2/version /dependency !-- MySQL 驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency /dependencies /project这里最需要注意的是scopeprovidedTomcat自带Servlet和JSP的jar如果你不设provided打出来的war会把这些jar也带进去部署时可能出现类冲突。MySQL驱动选择8.x是因为它兼容MySQL 5.7和8.0驱动类用的是com.mysql.cj.jdbc.Driver不再是com.mysql.jdbc.Driver后者在8.x里已经被标记为过时。工程目录按Maven标准来但把web.xml保留在src/main/webapp/WEB-INF下因为这套系统我打算用传统的web.xml注册Servlet而不是用注解。注解虽然省事但线上排查时web.xml里的映射关系一眼就能看全。2.3 数据库设计成绩管理最核心的三张表成绩系统看似简单但表结构设计不好后面写查询会很难受。我设计的核心就三张表加上一张关联表。-- 学生表 CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, student_no VARCHAR(20) NOT NULL UNIQUE COMMENT 学号, name VARCHAR(50) NOT NULL COMMENT 姓名, password VARCHAR(64) NOT NULL DEFAULT 123456 COMMENT 登录密码, class_name VARCHAR(50) COMMENT 班级 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 课程表 CREATE TABLE course ( id INT PRIMARY KEY AUTO_INCREMENT, course_no VARCHAR(20) NOT NULL UNIQUE COMMENT 课程编号, course_name VARCHAR(50) NOT NULL COMMENT 课程名称, credit DECIMAL(3,1) DEFAULT 2.0 COMMENT 学分 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 成绩表 CREATE TABLE score ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL, course_id INT NOT NULL, score DECIMAL(5,2) COMMENT 成绩, exam_date DATE COMMENT 考试日期, remark VARCHAR(255) COMMENT 备注, UNIQUE KEY uk_stu_course (student_id, course_id), CONSTRAINT fk_score_student FOREIGN KEY (student_id) REFERENCES student(id), CONSTRAINT fk_score_course FOREIGN KEY (course_id) REFERENCES course(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;三个细节你可能注意不到第一score表里的成绩用DECIMAL(5,2)因为成绩可能有平时分和卷面分加权计算后的小数用INT会丢失精度第二学生表里的password不存明文先用MD5或BCrypt加密再入库虽然作业项目没人攻击你但养成这个习惯不亏——不过要说明如果只是课程演示MD5够用真正上线要换BCrypt第三uk_stu_course唯一约束保证同一个学生同一门课只有一条成绩如果老师重复录入要么更新要么拒绝。查询时看这条唯一键就能快速判断“这条成绩是覆盖还是新增”。表建好后我用一个db.properties文件保存连接信息通过静态代码块读取不把用户名密码写死在代码里// db.properties jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/grade_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.passwordyour_passwordJDBC URL里最容易漏的是serverTimezone不写的话MySQL 8.x会直接报“CST”时区识别异常。useSSLfalse是因为本地开发不需要SSL加密省去证书警告。这些参数写清楚比遇到报错再瞎猜强。3. 登录与权限从Filter到Session的落地写法3.1 用Session保存登录态用Filter拦所有页面成绩系统的页面必须按角色隔离学生只能看自己的成绩教师能录入成绩管理员能管账号。如果只在每个JSP里判断session散落的代码会让你漏掉某个页面。正确做法是写一个统一的AuthFilter拦截所有.jsp和.do请求。// AuthFilter.java WebFilter(/*) public class AuthFilter implements Filter { Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) resp; String uri request.getRequestURI(); // 放行登录相关资源和静态资源 if (uri.endsWith(/login.jsp) || uri.endsWith(/login.do) || uri.endsWith(.css) || uri.endsWith(.js) || uri.endsWith(.png)) { chain.doFilter(req, resp); return; } // 未登录则重定向到登录页 Object user request.getSession().getAttribute(user); if (user null) { response.sendRedirect(request.getContextPath() /login.jsp); return; } // 已登录继续走原始请求 chain.doFilter(req, resp); } }这里的“放行”逻辑是踩过坑的登录页本身也是JSP如果不放行就会死循环重定向。静态资源放行是因为项目里用了CSS和图片不让加载页面会很丑。留意到WebFilter(/*)匹配所有请求包括login.do所以在放行条件里必须包含它。以后要加权限区分就在这个Filter里继续判断角色而不是写第二个Filter。Session里存一个对象在里面放role字段Filter读出角色后对URL进行前缀匹配/student/*只允许rolestudent访问/teacher/*只允许roleteacher/admin/*只允许roleadmin。这套机制虽然简单但足够应付99%的课程设计场景。3.2 登录逻辑密码校验和Session写入登录页提交到LoginServlet核心逻辑是查库比对密码成功后把用户信息写进Session并跳转到对应的首页。// LoginServlet.java 关键方法 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username request.getParameter(username); String password request.getParameter(password); UserDao dao new UserDao(); User user dao.findByUsernameAndPassword(username, password); if (user ! null) { request.getSession().setAttribute(user, user); // 按角色跳转到不同首页 String role user.getRole(); if (admin.equals(role)) { response.sendRedirect(admin/index.jsp); } else if (teacher.equals(role)) { response.sendRedirect(teacher/index.jsp); } else { response.sendRedirect(student/index.jsp); } } else { request.setAttribute(error, 用户名或密码错误); request.getRequestDispatcher(login.jsp).forward(request, response); } }这里的SendRedirect和Forward是有讲究的登录成功后必须用sendRedirect否则刷新页面会重复提交表单登录失败用forward并把错误信息放到request域里这样页面能回显错误且URL不会变成login.do刷新也安全。很多人在这里混用导致“登录成功但刷新一下成绩就没了”或者“后退能回到登录前页面”的诡异bug。另外密码比对不要用明文where password...在DAO里把MD5加密后的密码拼进SQL或者干脆在SQL里调用MD5(?)。我建议用PreparedStatement的setString传参不然用户输入单引号就可能被拼出SQL注入。浏览器端只能拿到session里的user对象密码字段不要放进去或者取的时候忽略避免通过页面源码泄露hash。4. 成绩录入与查询ServletJDBC的完整链路4.1 从表单到数据库POST请求怎么走完一遍成绩录入页面是教师最常用的功能。表单提交到ScoreServletServlet先取值、做简单校验再调用DAO写入。这里把每一步拆开看。// ScoreServlet.java doPost 片段 String studentNo request.getParameter(studentNo); String courseNo request.getParameter(courseNo); String scoreStr request.getParameter(score); // 校验数字防止SQL报错 BigDecimal score; try { score new BigDecimal(scoreStr); if (score.compareTo(BigDecimal.ZERO) 0 || score.compareTo(new BigDecimal(100)) 0) { throw new NumberFormatException(); } } catch (NumberFormatException e) { request.setAttribute(msg, 成绩必须是0-100之间的数字); request.getRequestDispatcher(teacher/addScore.jsp).forward(request, response); return; } ScoreDao dao new ScoreDao(); boolean ok dao.insertScore(studentNo, courseNo, score); if (ok) { response.sendRedirect(listScores.do?studentNo studentNo); } else { request.setAttribute(msg, 录入失败该学生或课程不存在或已存在成绩); request.getRequestDispatcher(teacher/addScore.jsp).forward(request, response); }这里展示了一个容易被忽略的点查询参数直接拼在重定向URL里。如果再跳转到列表页studentNo的值必须手动编码因为如果学号里有中文或特殊字符浏览器可能截断。更稳妥的做法是跳回一个不依赖参数的列表页或者在Session里保存“最近查询条件”。我在实际项目里会用前一种简单但能跑。BigDecimal而不是double去接收成绩原因前面提过——浮点计算0.10.2不等于0.3成绩如果作为浮点存数据库算绩点时会出现莫名其妙的小尾巴。这一层校验放Servlet里而不是JSP里是因为JSP适合显示不适合处理逻辑。4.2 成绩列表的分页查询为什么要用LIMIT而不是全量加载学生成绩列表可能几十条但全量加载不是个好习惯。尤其当系统运行几年后一次SELECT * FROM score可能拉回上万行JSP渲染直接卡死。分页是必做的我选的是最简单的MySQLLIMIT分页。// ScoreDao.listPage 方法 public ListScoreVO listPage(int pageNum, int pageSize, String keyword) { ListScoreVO list new ArrayList(); int offset (pageNum - 1) * pageSize; String sql SELECT s.student_no, s.name, c.course_name, sc.score FROM score sc JOIN student s ON sc.student_id s.id JOIN course c ON sc.course_id c.id WHERE s.name LIKE ? OR c.course_name LIKE ? ORDER BY sc.exam_date DESC LIMIT ?, ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, % keyword %); ps.setString(2, % keyword %); ps.setInt(3, offset); ps.setInt(4, pageSize); ResultSet rs ps.executeQuery(); while (rs.next()) { ScoreVO vo new ScoreVO(); vo.setStudentNo(rs.getString(student_no)); vo.setStudentName(rs.getString(name)); vo.setCourseName(rs.getString(course_name)); vo.setScore(rs.getBigDecimal(score)); list.add(vo); } } catch (SQLException e) { throw new RuntimeException(分页查询失败, e); } return list; }注意这里的SQL用了JOIN而不是子查询查出来的字段经过别名映射后直接封装到VO里。LIMIT ?, ?的两个参数必须用setInt绑定不能拼字符串——因为offset是前端传过来的恶意传个负数或巨大数字会造成性能问题。PreparedStatement绑定后MySQL会对参数做类型校验比字符串拼接安全得多。分页之后前端JSP要拿到总页数。通常用一个count查询SELECT COUNT(*) FROM score sc JOIN student s ON sc.student_id s.id JOIN course c ON sc.course_id c.id WHERE s.name LIKE ? OR c.course_name LIKE ?然后把totalPages (totalCount pageSize - 1) / pageSize。这个加pageSize再减1的写法是为了向上取整避免totalCount0时出现第0页。切记count查询里也要带JOIN和WHERE条件否则分页数量和总数对不上翻到最后几页会空。4.3 导出成绩单JSP页面用表格打印PDF的取舍成绩系统经常需要把成绩单打印出来或存成PDF。老项目里没有引入POI最简单的做法是用浏览器自带的打印功能JSP渲染一个适合打印的页面然后window.print()。我不建议在JSPServlet这种简单项目里强行集成PDF库因为字体、分页、中文编码的坑能把一个晚上耗光。!-- printScore.jsp 关键片段 -- %-- 用CSS控制打印区域和分页 --% style media print { body { font-family: SimSun, serif; } .no-print { display: none; } table { border-collapse: collapse; width: 100%; } td, th { border: 1px solid #000; padding: 6px; } tr { page-break-inside: avoid; } } /style div classno-print button onclickwindow.print()打印成绩单/button button onclickhistory.back()返回/button /div table trth学号/thth姓名/thth课程/thth成绩/th/tr c:forEach varsc items${scoreList} tr td${sc.studentNo}/td td${sc.studentName}/td td${sc.courseName}/td td${sc.score}/td /tr /c:forEach /tablepage-break-inside: avoid这一行能防止一个学生的多科成绩被分页拆开media print里的字体设为宋体是因为浏览器打印默认字体在Windows和Mac上完全不同中文宽度会乱跳。如果你要生成真正可编辑的Excel那再引入Apache POI但注意POI依赖众多war包会大一两倍课程设计阶段用打印功能完全足够。5. 避坑JSPServlet项目最常见的5个翻车现场5.1 页面和数据库全是问号中文乱码问题现象表单提交中文到Servlet存进数据库变成??或者页面显示一堆问号。原因三层编码不一致——浏览器提交用的是页面编码Servlet处理参数用的是容器默认编码Tomcat 8以前是ISO-8859-1数据库连接和表结构是latin1。最常见的是漏掉request.setCharacterEncoding(UTF-8)以及JDBC URL里没写characterEncodingutf8。解决第一在Servlet的doPost第一行写request.setCharacterEncoding(UTF-8)doGet则需要在Tomcat的server.xml里给Connector加URIEncodingUTF-8第二JDBC URL里带上useUnicodetruecharacterEncodingutf8第三建表时统一DEFAULT CHARSETutf8mb4不要用默认latin1。检查时按“页面→请求→Servlet→JDBC→MySQL”的顺序排查别一上来就改代码。还有个血泪经验JSP文件本身的编码必须是UTF-8文件头pageEncoding和contentType都写上用IDE新建时别漏。5.2 404还能理解500错得莫名其妙JDBC驱动没加载现象点击查询成绩控制台报ClassNotFoundException: com.mysql.cj.jdbc.Driver或No suitable driver found for jdbc:mysql://localhost:3306/grade_db。原因mysql-connector的jar没有打到war的lib目录。Maven默认打包会把依赖打进去但如果你用了provided scope或IDE的Deployment Assembly没加Maven依赖Tomcat运行时找不到驱动类。解决先把pom里mysql驱动的scope改成默认的compile然后检查Project Facets里的Runtime是否选了Tomcat再确认Deployment Assembly中有/WEB-INF/lib ← Maven Dependencies。本地用Tomcat启动时还可以看WEB-INF/lib下是否真有mysql-connector-java-8.0.33.jar。更懒的办法是直接用Tomcat的lib目录放驱动jar但不推荐因为换机器就完了。5.3 明明登录了却被踢回登录页Session丢失现象登录成功跳转首页后点任何一个链接马上回到login.jsp。原因第一种是Filter放行条件写错了把登录页、静态资源之外所有请求都判定为未登录而Session里存的对象名不对比如LoginServlet里存的是userFilter里取的是currentUser第二种是登录成功后用了forward而不是sendRedirect浏览器地址栏还是login.do刷新时又重新进了Filter此时session还在但逻辑顺序不对第三种是两台Tomcat之间负载均衡session没共享但单机部署不会出现。解决统一Session属性名最好定义一个常量类检查Filter里的放行路径登录成功后强制sendRedirect。另外要注意session的默认超时是30分钟web.xml里可以配如果调试时间太长会被自动清掉这不算bug但会让新手以为是代bug。5.4 页面路径总对不上Servlet映射乱写现象表单action写addScore.do但Servlet用WebServlet(/addScore)映射一提交就404。原因URL映射后缀对不上。WebServlet(/addScore)匹配的是/addScore而表单提交到/addScore.do。Tomcat 7以后默认会匹配精确路径不会自动加.do后缀。解决要么统一用/addScore.do前缀做映射要么统一用路径风格。我习惯在web.xml里写servlet servlet-namescoreServlet/servlet-name servlet-classcom.example.servlet.ScoreServlet/servlet-class /servlet servlet-mapping servlet-namescoreServlet/servlet-name url-pattern*.do/url-pattern /servlet-mapping这样所有*.do请求都进入同一个Servlet的service方法再根据参数分发。这个做法被Spring MVC的DispatcherServlet延续了。提醒一下用注解就不要再配web.xml两套同时配会重复执行。5.5 数据删不掉、查不全事务和外键的副作用现象删除学生时提示外键约束失败Cannot delete or update a parent row查询成绩时某些学生考了0分但列表里不显示。原因学生表被score表外键引用直接删学生违反约束。第二个问题是查询时用了WHERE sc.score ! 0或者WHERE sc.score 0把0分和NULL排除了。NULL成绩表示缺考或未录入和0分本质不同。解决删除学生前先把该生的成绩表记录删掉或者改用逻辑删除加一个is_deleted字段。查询成绩时把NULL单独处理要么显示为“缺考”要么用COALESCE(sc.score, 0)兜底但不要写死排除0分的条件。6. 把系统跑稳部署、日志与后续演进的一个小技巧项目写完后别急着提交。先用Maven打war包确认mvn clean package无报错再把war放到Tomcat的webapps目录。部署过程中有一个我反复中招的坑本地IDE跑得好好的扔到服务器上就报404原因往往是context path不同。IDE里访问是localhost:8080/grade服务器上是localhost:8080/ROOT所以JSP里所有绝对路径必须用${pageContext.request.contextPath}拼前缀否则换个部署名就全炸。排查问题时不要只看浏览器F12。把Tomcat的logs/catalina.out和localhost.*.log打开后者的异常堆栈比控制台完整得多。我一般会在DAO层打一条log.info记录每次查询的参数和耗时配合JSP页面底部显示的查询毫秒数能快速定位是SQL慢还是页面渲染慢。这个习惯帮我避开过一次经典翻车用户反馈“查询学生很慢”我以为SQL没索引其实是因为每次请求都重新创建数据库连接连接池没配。后来改成用Tomcat自带的JNDI连接池查询从800ms降到30ms。末了说一个我很坚持的收尾动作把Servlet的异常统一抛到一个ErrorServlet而不是在每个页面里塞try-catch。这样用户看到的是友好提示而完整异常只进日志既保护了信息也方便排查。可以把ErrorServlet理解成成绩系统的“防汛通道”——平时不起眼真出事时全靠它。如果你已经照着这套把系统跑起来试着加一个小功能把成绩按课程统计平均分和不及格人数。这个改动会逼你写出GROUP BY的SQL同时也要改列表页的展示逻辑正好检验你对前面所有知识的掌握程度。这是我的血泪经验当年我总想直接上Spring Boot后来静下心把Servlet手工接了一遍之后看框架源码再也不虚了。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

微信小程序图书管理系统项目实战:从架构到部署完整指南

微信小程序图书管理系统项目实战:从架构到部署完整指南

简介:这是一套基于微信小程序的图书管理系统完整项目,面向计算机专业毕业设计、课程设计及Java/小程序开发学习者,解决图书信息管理、借阅流程等典型业务需求。项目源码已在本地编译通过并成功运行,评审得分超过95分,助…

2026/10/9 17:31:45 阅读更多 →
从变量到类型转换:数据类型、精度丢失与工程避坑指南

从变量到类型转换:数据类型、精度丢失与工程避坑指南

开头直接用一个真实场景切入,带出变量、数据类型、类型转换这几个核心词,然后说明这篇内容讲什么、适合谁。1. 变量与数据类型:先搞清楚底层那点事1.1 变量到底是什么很多教程上来就告诉你“变量就是存数据的盒子”,这话没毛病&am…

2026/10/9 17:31:45 阅读更多 →
给旧幻灯片做微创手术:Frontend Slides增强模式的防溢出修改规则与技巧

给旧幻灯片做微创手术:Frontend Slides增强模式的防溢出修改规则与技巧

给旧幻灯片做微创手术:Frontend Slides增强模式的防溢出修改规则与技巧 【免费下载链接】frontend-slides Create beautiful slides on the web using a coding agents frontend skills 项目地址: https://gitcode.com/gh_mirrors/fr/frontend-slides Fronte…

2026/10/9 17:31:45 阅读更多 →

最新新闻

Access数据库实战讲义:从表设计到VBA开发

Access数据库实战讲义:从表设计到VBA开发

简介:这是与郝老师Access视频教程配套的讲义文档,面向Access零基础初学者,系统讲解数据库从创立到表设计、字段属性设置及数据类型选用的完整流程。资源包共1个doc文件,大小约206KB,文档结构清晰,适合对照视…

2026/10/9 18:01:34 阅读更多 →
MATLAB圆孔菲涅尔衍射仿真:从物理模型到FFT实现与精度验证

MATLAB圆孔菲涅尔衍射仿真:从物理模型到FFT实现与精度验证

1. 从一个圆孔说起:为什么偏偏选它做衍射仿真光学仿真这个领域,说大不大,说小也不小。但凡接触过物理光学课程或者做过光学系统设计的人,几乎都绕不开一个经典命题——圆孔菲涅尔衍射。这不是一个随便挑的例子,它几乎是…

2026/10/9 18:01:34 阅读更多 →
实验室排课系统JSP项目实战:从部署到冲突检测全解析

实验室排课系统JSP项目实战:从部署到冲突检测全解析

简介:这是一份面向计算机专业学生毕业设计与期末大作业的实验室排课系统项目,基于JSP技术开发,解决高校实验室资源排课管理的实际需求。压缩包仅22.18MB,共1062个文件,涵盖java后端源码、jsp动态页面、css/js前端样式脚…

2026/10/9 18:01:34 阅读更多 →
Python小游戏练手项目:30个经典游戏从入门到进阶

Python小游戏练手项目:30个经典游戏从入门到进阶

1. 从"玩一天"说起:为什么小游戏是Python入门的最优解很多人学Python卡在同一个地方:语法书翻了大半本,循环、函数、类都认识,但打开编辑器就不知道写什么。看教程的时候觉得"懂了",关掉视频脑子一…

2026/10/9 18:01:34 阅读更多 →
弹性模量相图法:COMSOL单轴压缩裂纹仿真开裂点定位与工程实践

弹性模量相图法:COMSOL单轴压缩裂纹仿真开裂点定位与工程实践

做岩土和建材断裂仿真的,单轴压缩大概是绕不开的第一道坎。试件规整、边界简单、加载也好控制,听起来是最好入手的算例;可真把裂纹放进去,问题就来了——应力应变曲线不收敛、损伤区宽度没法收敛、开裂点到底出现在哪个载荷步&…

2026/10/9 18:01:33 阅读更多 →
SQL Server数据库加固规范实战:账号权限、日志审计与协议加密

SQL Server数据库加固规范实战:账号权限、日志审计与协议加密

简介:面向数据库运维、安全管理人员及需要满足合规要求的政企IT团队,这份Sql Server数据库系统加固规范文档提供了一套可落地的安全配置基线。内容围绕账号管理、认证授权、日志配置、通信协议、设备安全等核心模块展开,细化到具体核查项与操…

2026/10/9 18:00:33 阅读更多 →

日新闻

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/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →