基于SSM与MySQL的网上选课系统设计与实现
1. 网上选课系统的核心需求与设计思路先说结论网上选课系统的本质就是把传统教务场景里的人工选课流程搬到线上让课程资源分配这件事变得更透明、更高效。听起来简单但真正动手写代码之前如果不对需求做一次彻底的拆解后期十有八九要返工——这是我在多个项目里踩出来的经验。1.1 业务痛点与场景还原传统选课是什么样子学生拿着纸质选课单或者挤在机房同一时间点刷新网页教务老师手工核对名额、处理退改。这里面至少有四个明确痛点一是选课时间窗口集中访问量大系统容易卡死二是名额统计靠人工容易出现超选或漏选三是学生看不到实时余量只能盲目投递四是排课、选课、成绩之间的数据割裂维护成本太高。网上选课系统要解决的就是这几个问题。具体到本项目角色划分非常清晰学生负责浏览课程、选课、退课、查看自己的课表教师负责发布课程、维护课程信息、查看选课名单管理员负责用户管理、课程审核、统计选课数据。三个角色之间的权限边界必须先界定清楚这直接决定了后续数据库表怎么设计、拦截器在哪里配、JSP页面怎么分目录。我在设计时特别强调了一个原则选课并发要可控。真实场景里热门课程开放后头几秒可能会有几百人同时点击如果扣减课容量的逻辑不做事务处理和条件校验就会出现余量明明还剩1个却有3个学生选成功的脏数据。这种问题不是靠加个if判断就能解决的必须在数据库层面配合事务隔离机制来兜底。1.2 核心功能模块清单一个能真正落地运行、拿去答辩或交付使用的选课系统功能模块至少要覆盖下面这六块用户认证模块登录、登出、Session管理、密码加密存储、拦截器放行规则。课程管理模块课程信息的增删改查、教师对所属课程的维护、管理员审核上下架。选课/退课模块核心业务包含余量校验、事务处理、选课记录唯一性约束。课表查询模块学生按学期查看已选课程按周次或时间线展示。用户管理模块管理员维护学生/教师账号支持批量导入、重置密码。统计报表模块选修人数统计、课程热度排行、学生选课明细导出。这里第六个模块很多初学者会忽略但实际它是答辩加分项和教务管理刚需。哪怕不做复杂的图表用JSP加一个简单的表格展示每门课程选课人数TOP10就够了。2. 技术选型背后的取舍逻辑项目标题里把技术栈写得非常明白javaweb mysql ssm maven jsp。这套组合乍一看像老技术但在教学场景、课程设计、中小型教务系统里它恰恰是最稳妥的搭配。我分析一下它为什么能打。2.1 SSM框架分层架构的黄金搭档SSM是Spring、SpringMVC、MyBatis三个框架的组合它们各司其职Spring负责对象管理和事务SpringMVC负责请求分发和视图控制MyBatis负责数据库操作。用生活类比解释就是Spring像公司的后勤部门统一管理所有员工的入职、社保、报销你不用一个个对象去newSpringMVC像前台所有访客HTTP请求先到前台前台再根据访客要办什么事URL映射带到对应办公室ControllerMyBatis就是专门跑腿的人它自己不写SQL但你需要什么数据它就拿着SQL去数据库里查查完打包回来。这套组合最大的优势是职责边界清晰。Service层写业务逻辑Controller层只做参数接收和视图跳转Mapper层写SQL和结果映射JSP做展示。出了问题定位非常快数据不对查Mapper流程不对查Service页面跳转不对查Controller。2.2 为什么还在用JSP而不是前后端分离现在企业里SpringBoot Vue前后端分离是主流但选课系统用JSP仍然合理这是很多人的认知误区。前后端分离适合多团队协作、接口复用要求高的场景但对于单体教务系统JSP带来的好处非常实在页面和Java代码在同一个应用里开发部署简单单体应用直接打成War包扔进Tomcat就能跑不需要额外配Nginx做静态资源转发和跨域处理。另外JSP有一个隐藏优势JSTL标签和EL表达式可以直接操作后端放入Model的数据省掉了JSON序列化和JavaScript解析的中间环节。有个学生的项目里光是把选课结果从Controller传到JSP再显示在页面上用JSTL只需三行标签而用Vue要引入CDN、写axios请求、定义data和methods复杂度完全不在一个量级。2.3 Maven的不可替代性Maven在整个项目里扮演的角色经常被低估。不夸张地说没有Maven光是把SSM框架的依赖包配置齐就是一场灾难。我算过一笔账一个SSM项目的基础依赖约40到50个jar包包括spring-core、spring-webmvc、mybatis、mybatis-spring、mysql-connector、druid、jstl、jackson等等还涉及版本兼容问题。手工去官网下载再往WEB-INF/lib里拷贝轻则花了几个小时找不到对应版本重则版本冲突导致运行时NoSuchMethodError。Maven用pom.xml声明依赖自动下载、自动传递依赖、自动打包五分钟就能把基础环境搭好。2.4 MySQL在选课场景中的适用性MySQL在这个项目里完全是杀鸡用牛刀反而合适的选择。选课系统的数据量级在万级到十万级之间MySQL单实例完全承载得了事务支持上InnoDB引擎提供了完整的ACID特性正好满足选课扣减名额这类需要强一致性的操作。数据库设计方面核心表四张就够user表存用户信息course表存课程信息student_course表存选课记录teacher_course表建立教师和课程的关联。配合role字段区分三种权限简单清晰后期扩展也不难。3. 环境准备与项目搭建实操很多同学卡在代码写了一半环境还没跑通这步所以我把环境准备和项目初始化单独拉出来讲清楚。这里每一步都是实际验证过的照着做基本不会出错。3.1 JDK、Maven、IDEA的版本匹配SSM项目对JDK版本要求不高JDK 8足够这也是目前教学环境最常用的版本。如果装的是JDK 17以上要注意Maven版本不能太老否则编译时容易报不受支持的类文件主要版本错误这个问题遇到过不止一次。我推荐的组合是组件推荐版本备注JDK1.8兼容性最好IDE识别无误Maven3.6.3或3.8.x3.8以上需要检查IDEA自带配置IDEA2021.x自带Maven插件配置方便Tomcat8.5或9.x支持Servlet 3.1规范MySQL5.7或8.05.7更稳8.0需注意驱动版本3.2 Maven安装与国内镜像配置Maven从官网下载压缩包后注意是Binary zip archive解压到指定目录。之后要配置两个东西环境变量新建MAVEN_HOME指向解压目录在Path里加入%MAVEN_HOME%\bin命令行执行mvn -v验证是否成功。镜像仓库打开conf/settings.xml在mirrors标签里加入阿里云镜像这一步在国内几乎必需否则下载依赖的速度会让你怀疑人生。配置内容如下mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/central/url /mirror顺手把本地仓库地址也改了默认在C盘项目多了容易撑爆系统盘。我在settings.xml里加了这样一行localRepositoryD:/maven-repo/localRepository后面各项目共用一套依赖省了不少磁盘空间。3.3 MySQL建库建表与初始数据打开MySQL终端或Navicat先建数据库注意字符集要指定utf8mb4不然存中文课程名容易乱码CREATE DATABASE IF NOT EXISTS course_select DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE course_select;用户表的设计我建议把角色、学号、姓名、密码拆开。密码绝不能明文存储用MD5加盐的方式加密工具类写好后在Service层调用。核心建表语句如下CREATE TABLE user ( id INT(11) NOT NULL AUTO_INCREMENT, username VARCHAR(50) NOT NULL COMMENT 登录账号, password VARCHAR(100) NOT NULL COMMENT 加密后的密码, realname VARCHAR(50) NOT NULL COMMENT 真实姓名, role TINYINT(1) NOT NULL DEFAULT 2 COMMENT 角色 0管理员 1教师 2学生, department VARCHAR(100) DEFAULT NULL COMMENT 院系, PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;课程表注意加一个selected_count字段用于记录已选人数配合max_count字段做余量判断。选课记录表要建联合唯一索引(student_id, course_id)从数据库层面杜绝重复选课这个细节在并发场景下很关键。3.4 项目目录结构与POM配置在IDEA里用Maven骨架创建Web项目后先手动补全标准的Web目录结构src/main/java Java源码 src/main/resources 配置文件Spring、MyBatis、JDBC等 src/main/webapp JSP页面、静态资源 src/test/java 测试代码重点提醒IDEA默认可能不创建java和resources目录需要自己右键Mark Directory as把它们分别标记为Sources Root和Resources Root。这个操作不做后面写Controller会找不到类。pom.xml的依赖配置是整个项目的基础核心依赖加上版本如下properties project.build.sourceEncodingUTF-8/project.build.sourceEncoding maven.compiler.source1.8/maven.compiler.source maven.compiler.target1.8/maven.compiler.target spring.version5.3.23/spring.version /properties dependencies !-- Spring核心 -- dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version${spring.version}/version /dependency !-- SpringMVC -- dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version${spring.version}/version /dependency !-- MyBatis核心 -- dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version3.5.13/version /dependency !-- MyBatis与Spring整合 -- dependency groupIdorg.mybatis/groupId artifactIdmybatis-spring/artifactId version2.1.0/version /dependency !-- 数据库驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.31/version /dependency !-- 连接池 -- dependency groupIdcom.alibaba/groupId artifactIddruid/artifactId version1.2.16/version /dependency !-- Servlet和JSP相关 -- dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependency dependency groupIdjavax.servlet/groupId artifactIdjstl/artifactId version1.2/version /dependency !-- 文件上传组件 -- dependency groupIdcommons-fileupload/groupId artifactIdcommons-fileupload/artifactId version1.4/version /dependency !-- JSON处理 -- dependency groupIdcom.fasterxml.jackson.core/groupId artifactIdjackson-databind/artifactId version2.14.1/version /dependency /dependenciesMaven的依赖版本选择有一条经验法则不要盲目追求最新版本选择同类项目验证过的稳定组合更靠谱。Spring 5.3.x配合MyBatis 3.5.x是我在多个SSM项目里验证过的稳定搭配直接照抄没问题。3.5 SSM三大配置文件的整合细节SSM项目最劝退初学者的地方是配置文件太多经常出现代码没错但容器起不来的问题。这里我把核心配置思路理清楚jdbc.properties存放数据库连接信息注意MySQL 8的驱动类名变成了com.mysql.cj.jdbc.DriverURL要加时区和SSL参数jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/course_select?useUnicodetruecharacterEncodingutf8mb4useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password你的密码applicationContext.xml是Spring的全局配置负责三件事扫描Service和Mapper接口、配置数据源、配置事务管理器。核心片段如下context:component-scan base-packagecom.course context:exclude-filter typeannotation expressionorg.springframework.stereotype.Controller/ /context:component-scan bean iddataSource classcom.alibaba.druid.pool.DruidDataSource property namedriverClassName value${jdbc.driver}/ property nameurl value${jdbc.url}/ property nameusername value${jdbc.username}/ property namepassword value${jdbc.password}/ /bean bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property namedataSource refdataSource/ property namemapperLocations valueclasspath:mapper/*.xml/ property nametypeAliasesPackage valuecom.course.entity/ /bean bean classorg.mybatis.spring.mapper.MapperScannerConfigurer property namebasePackage valuecom.course.mapper/ /beanspring-mvc.xml是SpringMVC的配置核心是控制器扫描、注解驱动和视图解析器context:component-scan base-packagecom.course.controller use-default-filtersfalse context:include-filter typeannotation expressionorg.springframework.stereotype.Controller/ /context:component-scan mvc:annotation-driven/ mvc:default-servlet-handler/ bean classorg.springframework.web.servlet.view.InternalResourceViewResolver property nameprefix value/WEB-INF/views// property namesuffix value.jsp/ /beanweb.xml负责启动Spring容器和配置DispatcherServlet注意配置SpringMVC的servlet-mapping为/这样所有请求都会经过前端控制器同时配置CharacterEncodingFilter放在最前面确保请求参数编码正确。SSM整合里最容易犯的错误是漏掉contextConfigLocation参数导致Spring容器里的Service没有被初始化Controller里注入会直接报空指针。4. 核心功能实现与实战细节框架配置完成后真正的业务代码才是重头戏。我从学生选课、退课、课程管理、登录鉴权四个角度复盘核心功能实现每个模块都附上关键代码和设计思路。4.1 登录鉴权与拦截器配置登录逻辑本身并不复杂但有两个点必须处理好密码加密验证和非法访问拦截。Service层登录的写法重点在于使用MyBatis按用户名查用户后对比密码Override public User login(String username, String password) { // 1. 先按用户名查 User user userMapper.findByUsername(username); if (user ! null) { // 2. 用MD5工具类加密传入的密码再和数据库密文比对 String md5Pwd MD5Util.md5(password user.getSalt()); if (md5Pwd.equals(user.getPassword())) { return user; } } return null; }拦截器这里一定不要在SpringMVC的配置里手工new对象而是把登录检查写成HandlerInterceptor接口实现类用mvc:interceptors标签注入。放行规则要把登录页、静态资源、验证码接口排除掉不然会出现死在登录页的死循环public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session request.getSession(); User user (User) session.getAttribute(loginUser); // 放行登录相关请求和静态资源 String uri request.getRequestURI(); if (uri.contains(/login) || uri.contains(static) || uri.contains(.css) || uri.contains(.js)) { return true; } if (user null) { response.sendRedirect(request.getContextPath() /login); return false; } return true; } }4.2 学生选课的事务处理与防超选选课是整个系统的核心处理的难点是并发下的余量一致性问题。我直接把Service方法加上Transactional注解让整个校验和扣减操作在同一个数据库事务中执行Transactional(rollbackFor Exception.class) public boolean selectCourse(Integer studentId, Integer courseId) { // 1. 查询课程信息 Course course courseMapper.selectById(courseId); if (course null) { throw new BusinessException(课程不存在); } // 2. 校验是否已选过 int count studentCourseMapper.countByStudentAndCourse(studentId, courseId); if (count 0) { throw new BusinessException(你已经选过这门课程); } // 3. 校验余量 if (course.getSelectedCount() course.getMaxCount()) { throw new BusinessException(课程名额已满); } // 4. 插入选课记录同时更新已选人数 // 注意这里要使用条件更新来做原子扣减而不是先查询再update int result courseMapper.increaseSelectedCount(courseId, course.getMaxCount()); if (result 0) { throw new BusinessException(课程名额已满请选择其他课程); } studentCourseMapper.insert(new StudentCourse(studentId, courseId)); return true; }这里有一个容易踩的坑高并发下先查再更新会产生竞态条件。如果两个请求同时查到余量为1然后同时执行insert就会出现超选。解决办法是在Mapper里写条件更新SQL让数据库自己保证原子性update idincreaseSelectedCount UPDATE course SET selected_count selected_count 1 WHERE id #{courseId} AND selected_count lt; max_count /update条件更新的本质是乐观锁思路。即使两个请求同时到达这条SQL在同一时间只会有一个事务能成功影响1行数据另一个返回0表示余量不足从根本杜绝了超选。4.3 退课逻辑与并发安全退课相对简单但同样要把删除记录和减少人数放在同事务里Transactional(rollbackFor Exception.class) public boolean cancelCourse(Integer studentId, Integer courseId) { // 1. 先检查是否选过这门课 int count studentCourseMapper.countByStudentAndCourse(studentId, courseId); if (count 0) { throw new BusinessException(你还没有选择这门课程); } // 2. 删除选课记录 studentCourseMapper.deleteByStudentAndCourse(studentId, courseId); // 3. 课程已选人数减一注意防止负数 courseMapper.decreaseSelectedCount(courseId); return true; }退课业务里隐藏的需求是退课之后名额要立刻释放并对候补学生可见。如果系统有等待列表功能退课操作之后还要触发一次候补通知或者自动分配但基础版先不做也对答辩时说明扩展方案即可。4.4 课程管理模块与分页查询管理员和教师端的课程管理核心是条件分页查询。我直接用PageHelper插件简化了手写Limit和总条数计算的麻烦。在pom里加一个依赖dependency groupIdcom.github.pagehelper/groupId artifactIdpagehelper/artifactId version5.3.2/version /dependency然后在Spring配置里给SqlSessionFactory加拦截器插件bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean !-- ... -- property nameplugins array bean classcom.github.pagehelper.PageInterceptor property nameproperties valuehelperDialectmysql/value /property /bean /array /property /bean查询时只需在Mapper调用前声明分页参数PageHelper.startPage(pageNum, pageSize); ListCourse courseList courseMapper.selectByCondition(courseName, teacherName); PageInfoCourse pageInfo new PageInfo(courseList);拿到PageInfo后在JSP里用JSTL循环渲染表格再用pageInfo.pages控制分页按钮的显示逻辑。分页参数pageNum至少从1开始否则会出现负数导致SQL报错。4.5 JSP页面的设计规范JSP页面虽然现在是老技术但写的时候依然有讲究。我的经验是布局用include标签拆分不要把所有代码塞进一个文件。把头部导航、尾部版权拆成header.jsp、footer.jsp这样每个功能页面只需要写核心内容区。页面之间跳转用${pageContext.request.contextPath}拼路径不要写死绝对路径否则部署到不同Tomcat上下文时所有链接全挂。选课页面拿到课程列表后展示的核心逻辑c:forEach items${pageInfo.list} varcourse tr td${course.courseName}/td td${course.teacherName}/td td${course.selectedCount} / ${course.maxCount}/td td !-- 已选过的显示已选否则显示选课按钮 -- c:choose c:when test${course.selected} span已选/span /c:when c:otherwise a href${pageContext.request.contextPath}/course/select?id${course.id}选课/a /c:otherwise /c:choose /td /tr /c:forEachEL表达式配合JSTL标签比在Java里拼接HTML字符串强一百倍这也是SSM时代前端没有分离时最主流的做法。页面上每门课程余量用一个百分比进度条来展示体验会好很多我在CSS里顺手写了个小样式选课高峰时学生一眼就能看出哪门课紧张。5. 常见问题与排查技巧实录最后这块是宝藏我把过去带着学生做SSM项目时遇到的真实坑全部列出来每条都有解决方案。5.1 数据库连接失败的三种姿势典型报错Cannot create PoolableConnectionFactory或Access denied for user rootlocalhost。第一类排查思路是先ping通、再测账号、再看URL。我一般让新手先直接在MySQL命令行里执行select 1能通说明数据库服务没问题再测账号密码是否正确。最容易踩的坑是MySQL 8的加密规则和驱动版本不匹配如果驱动是5.x的com.mysql.jdbc.Driver访问MySQL 8会直接报SSL和CachingSha2错误必须换成com.mysql.cj.jdbc.Driver版本。第二类是URL写错常见错误是少了serverTimezoneAsia/Shanghai。MySQL 8的驱动强制要求带时区参数不加就报The server time zone value Öйú±ê׼ʱ¼ä这是中文操作系统里的经典坑。5.2 Maven依赖下载失败的解法Maven下载依赖失败通常表现为pom里的坐标出现红色波浪线或者本地仓库里有一堆.lastUpdated文件。解决方法分步骤走先检查网络访问maven.aliyun.com是否流畅确认settings.xml里的镜像配置是否生效在IDEA里执行mvn clean install -U强制更新快照版本如果个别jar包一直下载不了手动去阿里云仓库的网页版搜索下载jar包直接扔进本地仓库对应目录也是可行方案。Maven的.lastUpdated文件删掉后重新构建多数情况下能解决。5.3 Tomcat启动报404的排查顺序项目部署到Tomcat后打开首页404新手容易慌。其实排查顺序很固定确认访问路径是否带上了项目上下文名默认是http://localhost:8080/项目名/检查IDEA的Artifacts配置是否把项目成功打成了War包看看Tomcat控制台日志有没有异常特别是ClassNotFoundException出现这个就是依赖没进入Artifacts里的lib目录需要在Project Structure里手动添加。我还遇到过一次奇葩情况JSP文件放在WEB-INF/views下面却在浏览器里直接访问该路径结果永远404问了一圈才知道WEB-INF目录下的资源不能直接通过URL访问必须由Controller转发。这是Servlet规范的限制不是项目配错了。5.4 中文乱码的全面解决方案中文乱码有三个入口需要同时处理请求参数乱码web.xml里的CharacterEncodingFilter必须配置且要放在所有Filter的最前面响应输出乱码SpringMVC的RequestMappingHandlerAdapter配置消息转换器确保JSON输出是UTF-8编码数据库乱码JDBC连接URL里加characterEncodingutf8mb4同时保证表结构是utf8mb4。这三处都处理好了中文基本不会出问题。实战中如果JSP页面本身乱码先检查JSP头部有没有% page contentTypetext/html;charsetUTF-8 languagejava %这是最容易被忽略的一行。5.5 Spring容器注入为空的常见场景Controller能访问但是Service或Mapper注入进来是null原因通常是Spring容器里的Bean没有成功扫描到applicationContext.xml里component-scan的base-package写错指向了一个不存在的包名Controller被SpringMVC的配置文件扫描Service被Spring的配置文件扫描两边扫描范围重叠或缺失导致Bean在两边各建了一份或者都没建忘了加Service、Repository等注解Spring根本不知道要管理这个类。我调试这类问题的神器是在启动时加debugtrue或者直接在Tomcat日志里看Bean xxx not found的提示快速定位是哪个Bean没被加载。不要等运行时才猜日志会告诉你答案。6. 项目扩展方向与个人心得6.1 六个可落地的扩展方向基础功能跑通之后这个选课系统还有很多值得打磨的方向增加Redis缓存把课程列表、选课热门数据缓存起来减少数据库压力选课高峰期响应能从秒级降到毫秒级引入消息队列用简单的Queue或MQ处理选课请求极端高并发下实现异步削峰权限粒度细化按角色、院系、年级做更细粒度权限控制引入Shiro或Spring Security成绩管理教师在选课系统里录入成绩学生查询成绩单让系统从选课平台升级为学分管理系统数据库分库分表课程表和选课记录表按学期分表历史数据归档保持主表性能前后端分离重构把Controller改成返回JSON的接口JSP换成Vue或React改造时业务Service层可以完全复用。6.2 踩坑后的几点实际体会做SSM项目最大的心得体会可以浓缩成两句配置一定要在动手写业务代码前整理清楚数据库约束能帮你兜底的就别全靠代码判断。第二个体会是关于老技术栈的。网上铺天盖地的SpringBoot教程让很多同学觉得SSM过时了但我带项目的体会是SSM逼着你把Spring的Bean管理、事务控制、MVC流程这些核心概念真正搞懂而SpringBoot把这些都自动配置掉了。面试官问SpringBoot自动配置原理时没有SSM底子的人根本答不上来。所以说教学项目选SSM本质上是让你先把地基打扎实。第三个体会是数据表设计一定要留扩展余地。我最初做的版本里选课记录表没加create_time字段后来要按时间统计选课热度时只能回头改表。建议从第一版就把create_time、update_time这两个公共字段加上哪怕暂时用不到也比后面改表轻松。用一个统一的BaseEntity类来处理这两个字段各实体继承即可。这个项目如果用于课程设计或毕业设计把并发安全、条件更新、权限拦截这几个亮点讲透答辩时绝对能拿高分。如果用于实际教务场景建议先从小规模试点开始选课高峰期配合运维监控逐步放开稳扎稳打比追求花哨技术更重要。

相关新闻

Spring @Required 注解废弃解析:依赖注入校验演进与构造器注入迁移

Spring @Required 注解废弃解析:依赖注入校验演进与构造器注入迁移

1. 一个被遗忘的注解,为什么还值得聊Required这个注解,如果你是从 Spring Boot 时代入行的,大概率没见过它,甚至在 IDE 里敲出来会发现它上面压着一道醒目的删除线。它属于那种"存在于文档里、消失在代码里"的元老级 AP…

2026/10/12 10:43:37 阅读更多 →
C++实战:课程安排中的约束建模与搜索优化

C++实战:课程安排中的约束建模与搜索优化

1. 从"排课"这个老问题说起:为什么值得用C认真做一遍课程安排这件事,看起来是个教务处的活儿,但真正动手写过的人都知道,它本质上是一个带约束的组合优化问题。每学期开始前,教务老师面对的是几十个班级、上…

2026/10/12 10:43:37 阅读更多 →
电磁场与电磁波教案:时变场与麦克斯韦方程组的课堂推导

电磁场与电磁波教案:时变场与麦克斯韦方程组的课堂推导

简介:面向电子信息类专业《电磁场与电磁波》课程的教案文档,适合高校教师备课、课后复盘及学生自学,内容覆盖法拉第电磁感应定律、位移电流、麦克斯韦方程组及不同介质交界面边界条件等核心知识点,强调积分形式与微分形式的对应转…

2026/10/12 10:43:37 阅读更多 →

最新新闻

彻底告别OpenClaw使用焦虑:我给他装上了“透视眼”和“批量克隆模组”

彻底告别OpenClaw使用焦虑:我给他装上了“透视眼”和“批量克隆模组”

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

2026/10/12 12:26:42 阅读更多 →
Spring AI + MCP Client 配置与使用详解:从 Base URL 改到 TaoToken 的完整实践

Spring AI + MCP Client 配置与使用详解:从 Base URL 改到 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/12 12:26:42 阅读更多 →
A股机器学习预测源码包实战:从数据落库到LSTM回测的完整流水线

A股机器学习预测源码包实战:从数据落库到LSTM回测的完整流水线

简介:这份资源面向对量化投资与机器学习感兴趣的开发者、金融数据分析学习者,提供一套完整的A股股票走势预测系统源码,帮助理解如何用算法从历史行情中挖掘价格变动规律。压缩包共12个文件,约2.53MB,包含6个ipynb交互式…

2026/10/12 12:26:42 阅读更多 →
Devin 全自动 AI 程序员上岗实测:TaoToken 统一 Key 接入值不值 500 美元?

Devin 全自动 AI 程序员上岗实测:TaoToken 统一 Key 接入值不值 500 美元?

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

2026/10/12 12:26:42 阅读更多 →
客户拜访记录散、乱、丢?企业级客户拜访沉淀的完整实操指南

客户拜访记录散、乱、丢?企业级客户拜访沉淀的完整实操指南

客户拜访结束后,很多人都会遇到同一个尴尬:明明聊了很多,回到公司却只记得零散几句。客户提过的预算、决策人、竞品情况、成交顾虑,散落在微信、纸质笔记、手机录音和个人记忆里。更麻烦的是,这些信息往往只留在销售个…

2026/10/12 12:26:42 阅读更多 →
AI漫剧工业化流水线:零基础量产的结构化工作流

AI漫剧工业化流水线:零基础量产的结构化工作流

1. 这不是“AI绘画课”,而是一套可复用的漫剧工业化流水线 “零基础 AI 漫剧智能量产创作营”——光看标题,很多人第一反应是:又一个教人用MidJourney画美女图的速成班?或者换个马甲的Stable Diffusion参数调优课?我最…

2026/10/12 12:25:42 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →