JavaWeb实战:黑马商城SSM项目部署、踩坑与优化
简介这是一份基于前后端分离架构的黑马商城小项目适合正在学习Java Web开发的初学者也适合需要完成课程设计或毕业设计的学生。项目完整实现了电商平台核心业务流程包括商品列表展示、商品详情、购物车增删改、订单提交与支付对接。压缩包内共425个文件大小44.22MB以Java源码、Servlet编译类、JSP页面、HTML页面、JavaScript脚本、样式表以及大量商品图片为主同时包含项目依赖的JAR包和数据库配置文件。通过阅读源码可以清晰看到浏览器通过异步请求对象向服务器发送请求服务器端Servlet处理业务后返回轻量级的JSON数据前端再动态更新页面的全过程。资源附带完整的工程结构、数据库脚本和部署说明便于直接导入开发工具运行调试。已有2806人学习下载适合对照代码逐模块理解电商常用功能的设计与实现。1. 黑马商城是什么项目一套能两周吃透的 JavaWeb 电商骨架很多自学 Java 的人都有这个阶段Servlet、JSP、Spring 都背得出来合在一起就不知道代码该往哪儿放。黑马商城小项目解决的就是这个卡点。它是很多培训班和自学者电脑里都会躺着的教学型电商工程解压后是一个完整的 SSMSpring SpringMVC MyBatis项目带有商品列表、登录注册、购物车、下单、模拟支付这几条电商主线。它能验证你学过的所有 JavaWeb 组件能不能真正串起来也能直接当课设或简历项目的底子。本文按最常见版本拆开讲Maven 聚合、JSP 前端、MySQL 存储并会说明 SpringBoot 版改起来差在哪。2. 动手之前先做三件事解压、环境核对、数据库脚本导入2.1 解压后的目录怎么读先看结构再写代码拿到 zip 之后别急着双击 IDEA 打开先在命令行里看一眼目录结构。常见做法是用tree命令Windows 下可以用tree /FmacOS/Linux 用tree -L 3。这个压缩包解压后通常是标准的 Maven 工程顶层目录大概长这样heima-shop/ ├── pom.xml # 父 POM统一管理依赖版本和模块 ├── heima-shop-dao/ # MyBatis Mapper 与实体类 ├── heima-shop-service/ # 业务逻辑层 ├── heima-shop-web/ # SpringMVC Controller JSP 页面 └── sql/ └── heima_shop.sql # 建库、建表、初始化数据脚本先看sql目录在不在再看pom.xml里的modules。如果modules里列了三个子模块说明这是多模块工程导入时要把父 POM 作为 Maven 工程打开而不是单独打开子模块。很多翻车案例都是第一次直接打开了 heima-shop-web结果 Maven 找不到 dao 和 service 的依赖整个项目标红。我一般会顺手检查pom.xml里 Spring、MyBatis 的版本号。常见的组合是 Spring 5.x MyBatis 3.5 MyBatis-Spring 2.x这个组合在 JDK 8 和 Tomcat 8.5 上兼容性最好。如果看到mybatis-spring版本是 1.x就要注意和 Spring 5 存在包名冲突启动时容易报NoSuchBeanDefinitionException。2.2 环境版本照这个配JDK、Maven、Tomcat、MySQL版本不匹配是这个项目第一天的头号杀手我踩过一次 JDK 8 编译的项目放到 JDK 11 上运行反射相关的代码直接抛异常。建议按下面这套来不折腾组件推荐版本说明JDK1.8项目编译目标基本都是 8换更高版本要改 pom 编译插件Maven3.6.x3.8 对中央仓库 HTTPS 更严格老项目的镜像配置可能失效Tomcat8.5.x支持 Servlet 3.1和 Spring 5 匹配MySQL5.7 或 8.05.7 零配置最稳8.0 需要处理驱动类名和时区问题先说为什么固定 JDK 8。老教学项目的pom.xml里经常写着source1.8/sourcetarget1.8/target你本地装的是 JDK 17 也能编译但运行期像 CGLIB 代理、JSP 编译这些环节在更高 JDK 上会出现兼容性告警对新手来说排错成本很高。装双 JDK 是常见做法IDEA 里每个工程单独指定 SDK 即可。MySQL 是另一个变量。5.7 不用改任何参数就能连上8.0 必须在 JDBC 连接串里带serverTimezoneAsia/Shanghai和allowPublicKeyRetrievaltrue否则启动就报时区错误或公钥检索错误。如果你和我一样主力 MySQL 是 8.0建议建一个专用库而不是复用生产库。2.3 导入数据库脚本手工建库再导入最省事把 SQL 脚本交给 Navicat 直接运行也没问题但我不太建议这样做因为脚本里如果没有CREATE DATABASE语句你在某个默认库里建出一堆表后面改连接串时容易对不上。手动建库再导入每一步都看得见mysql -uroot -p CREATE DATABASE heima_shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE heima_shop; SOURCE /your/path/to/heima-shop/sql/heima_shop.sql; SHOW TABLES;这段命令的逻辑先建库并指定字符集utf8mb4是为了让商品名称、用户昵称里如果有表情符号也不会乱码SOURCE是 MySQL 命令行执行 SQL 文件的指令路径不要带中文否则偶尔会碰到编码解析问题SHOW TABLES用来确认表建出来了正常应该能看到tb_user、tb_category、tb_product、tb_order、tb_order_item这五类核心表。导入完成后顺手查三张表的数据量判断初始化数据是否完整SELECT COUNT(*) FROM tb_product; SELECT COUNT(*) FROM tb_user; SELECT COUNT(*) FROM tb_order;如果tb_product只有几条记录说明脚本可能被改过或导入时中断了后面首页商品展示会非常空排查时容易误判是前端的问题。这一步相当于给项目做一次“体检”确保起点数据是对的。2.4 工程导入 IDEA改对数据源连接串再启动导入步骤不多但每步都有坑。先在 IDEA 里File - New - Project from Existing Sources选中解压目录里的pom.xmlMaven 会自动识别多模块结构。然后等依赖下载完检查右侧 Maven 面板里是否出现heima-shop-dao、heima-shop-service、heima-shop-web三个模块。启动前必须改的是数据库连接配置。老项目常见命名是jdbc.properties或db.properties位置在heima-shop-web/src/main/resources/下jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/heima_shop?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456参数说明driver在 MySQL 8.0 下要换成com.mysql.cj.jdbc.Driver5.7 用com.mysql.jdbc.Driver就行serverTimezone只针对 MySQL 8.0不加的话连接层直接报The server time zone value错误useSSLfalse是必须的因为教学项目的证书配置基本不存在开着 TLS 握手反而失败characterEncodingutf8保证中文写入不乱码。改完连接串启动 Tomcat 前还要确认 IDEA 的 Deployment 里Application context是/而不是/heima-shop-web_war否则浏览器里所有请求路径都要带项目名页面里写死的/product/list这种绝对路径会全部 404。这一步是新手最容易忽略的配置里改对了数据库却在访问路径上卡半小时。3. 拆解商城内部从登录到下单的完整调用链路3.1 分层架构怎么分工Controller、Service、Mapper 各自管到哪一层Spring 系的 Web 项目最核心的就是分层的边界感。黑马商城这样一个教学项目它的包结构本身就是答案controller只管收参数和返回视图service管业务规则和事务dao层只负责和数据库打交道。理解这个边界后面改造任何功能都知道代码该写在哪。层包名示例职责反面案例Controllercom.heima.shop.controller参数校验、调用 Service、跳转页面在 Controller 里写 SQLServicecom.heima.shop.service业务编排、事务控制、库存判断一个方法里写 200 行 SQLMappercom.heima.shop.dao单表 CRUD、复杂查询 SQL把分页逻辑写在 Service 里Domaincom.heima.shop.pojo实体映射、VO 对象实体类里写业务方法这个项目的 Controller 返回值通常是String配合 SpringMVC 的视图解析器跳到对应 JSP。如果你看代码时发现 Controller 里返回 JSON那多半是项目里某个接口单独加了ResponseBody或RestController。同一套项目里混用两种返回方式很常见别觉得奇怪前端页面用视图跳转异步接口用 JSON 返回。我建议你从“商品列表”这个最简单的功能入手读代码理由有三一是链路短从请求到 SQL 只有三个类二是覆盖了参数绑定、Service 调用、MyBatis 查询、数据回显这四大基本功三是它不涉及事务和状态流转读起来没有认知负担。3.2 商品列表的请求链路一个 URL 从浏览器到 SQL 的完整过程以/product/list?cid2这个地址为例一次请求经历了这些步骤Tomcat 把请求交给 DispatcherServlet它通过RequestMapping匹配到ProductController的list方法Controller 调用ProductService.listByCategory(cid)Service 调用ProductDao.selectByCategoryId(cid)Mapper XML 里执行真实 SQL 返回商品集合Controller 把集合放进Model视图解析器渲染product_list.jsp。下面两个关键代码片段是这套链路的前后两段Controller RequestMapping(/product) public class ProductController { Autowired private ProductService productService; RequestMapping(/list) public String list(Integer cid, Model model) { // 按分类查商品列表cid 为空时默认查全部 ListProduct products productService.listByCategory(cid); model.addAttribute(products, products); return product_list; } }代码逻辑Integer cid是参数绑定SpringMVC 自动把 URL 里的cid转成 Integer传空时又能拿 null 做兜底Model是 SpringMVC 的传参容器页面里用${products}就能遍历输出。这个类是最标准的 SSM 写法你看懂这一页后面订单、用户模块的 Controller 都是同一个套路。再往下看 Mapper 层这个项目用的是 XML 映射文件而不是注解 SQL。XML 的好处是 SQL 可以写复杂动态条件不用在 Java 代码里拼字符串select idselectByCategoryId parameterTypeint resultTypecom.heima.shop.pojo.Product SELECT id, name, price, image, stock, cid FROM tb_product where if testcid ! null AND cid #{cid} /if /where ORDER BY id DESC /selectwhere标签是 MyBatis 的动态 SQLcid为 null 时自动去掉AND避免 SQL 语法错误#{cid}是预编译占位符可以防 SQL 注入。Order By id DESC让新商品排在前面教学项目没有做商品上架时间字段用主键倒序是简化处理。你以后做真实项目这里基本会改成create_time DESC。3.3 登录状态和购物车数据放哪Session 方案与它的替代品这个项目的登录态用的是 Session购物车也是 Session 存的。逻辑很直接用户登录成功后session.setAttribute(user, user)每次请求从 Session 拿用户购物车用一个MapInteger, CartItem装进 Session加购就是往 Map 里 put。这是教学项目最常见的方案简单、好理解、代码量少。但它有两个天然的痛点一是用户关掉浏览器再打开购物车就没了——Session 的生命周期是会话级别的二是集群部署下 Session 不共享用户在服务器 A 登录请求被分发到服务器 B 就变成未登录。解决思路不复杂把购物车持久化到数据库表tb_cart登录状态换成 Token 或 Redis 共享 Session。后续章节我会给到改造方向这里先把它是什么看清楚。购物车 Service 的典型逻辑是这样一段public void addToCart(HttpSession session, Integer productId, Integer num) { // 从 Session 拿购物车没有就新建一个 MapInteger, CartItem cart (MapInteger, CartItem) session.getAttribute(cart); if (cart null) { cart new HashMap(); } CartItem item cart.get(productId); if (item null) { Item itemInfo productService.findById(productId); cart.put(productId, new CartItem(itemInfo, num)); } else { // 已存在则数量累加避免重复商品出现两行 item.setNum(item.getNum() num); } session.setAttribute(cart, cart); }代码逻辑外层用 Map 以商品 ID 为 key天然去重item null判断该商品是否已在购物车不存在就新建存在就累计数量。这里有个隐藏问题num没有做正整数校验如果前端传入-1购物车数量会变成负数结算金额也可能为负——真实项目里入参校验不能只靠前端。你可以在 Controller 层加一层Min(1)校验或者参考新版里的assert判断。3.4 下单事务为什么超卖问题会出现在这个教学项目里下单是商城项目里业务最重的一个方法它的完整事务链是查商品 → 扣库存 → 生成订单 → 生成订单明细 → 清空购物车。大多数教学项目把这五步放在同一个 Service 方法里方法上标注Transactional这个注解可以保证任何一步抛异常前面已经执行的 SQL 全部回滚。下面是这个项目里常见的下单核心代码骨架Transactional(rollbackFor Exception.class) public Order createOrder(Integer userId, Integer[] productIds, Integer[] nums) { // 1. 生成订单主表记录 Order order new Order(userId, totalPrice, OrderState.UNPAID); orderDao.insert(order); // 2. 循环扣减库存同时生成明细 for (int i 0; i productIds.length; i) { Product product productDao.selectByIdForUpdate(productIds[i]); if (product.getStock() nums[i]) { throw new BusinessException(库存不足); } productDao.decreaseStock(productIds[i], nums[i]); orderItemDao.insert(new OrderItem(order.getId(), productIds[i], nums[i])); } // 3. 清空购物车 cartDao.deleteByUserId(userId); return order; }代码逻辑selectByIdForUpdate里的FOR UPDATE是行级锁目的是防止两个用户同时下单时把库存扣成负数——这是教学项目里处理超卖最关键的一行SQLrollbackFor Exception.class表示捕获所有异常都回滚如果只写Transactional其实默认只回滚 RuntimeException业务异常BusinessException不会触发回滚这是个很阴间的细节。但这套写法在并发下并不是绝对安全的原因在于FOR UPDATE锁是数据库层的如果项目换了数据库或者锁被共享读覆盖超卖还是会发生。教学项目通常不会去压测并发但你在简历上写“解决超卖问题”时至少要知道两个进阶方案一个是用乐观锁版本号在UPDATE语句里加WHERE stock num条件另一个是预减库存下单先扣 Redis 里的库存支付成功后再真正落库。前者更简单后者更接近大型系统的做法。4. 让商城真正能用的关键配置连接池、静态资源、分页和订单状态4.1 数据库连接池的 4 个必调参数项目里数据源一般用 DBCP 或 C3P0教学项目里 DBCP 见到最多。配置都在jdbc.properties里你改数据库账号密码的同时建议顺手把连接池参数也改到位。默认配置经常是没写这些参数的跑通没问题接口一多就频繁卡顿。参数建议值作用initialSize5启动时预创建连接避免第一个请求现连数据库maxTotal20最大连接数超出后请求排队等待maxIdle10空闲连接上限超过会被回收testWhileIdletrue空闲时检测连接有效性防止拿到失效连接报 Connection closedDBCP 的配置写在applicationContext.xml的数据源 bean 里参数会通过${jdbc.initialSize}这类占位符引用 properties 文件。如果你发现启动时控制台打出一大段告警说连接池初始化失败多数是 maxTotal 与 MySQL 自带的 max_connections 冲突或者在连接串里没带useSSLfalse。4.2 静态资源放行与 JSP 路径解析页面 404 的一半原因在这SpringMVC 默认拦截所有请求包括.js、.css、.jpg。如果springmvc.xml里没有配置静态资源放行浏览器请求 CSS 会返回 404页面看起来就是裸的 HTML。很多新手以为是前端代码的问题其实后端根本没把资源放出去。配置是这样写的mvc:resources location/static/ mapping/static/** / bean classorg.springframework.web.servlet.view.InternalResourceViewResolver property nameprefix value/WEB-INF/jsp/ / property namesuffix value.jsp / /bean第一行把/static/**映射到/static/目录这样浏览器访问/static/css/style.css就能拿到真实文件第二行是视图解析器的标准配置Controller 里返回product_list时它会拼接成/WEB-INF/jsp/product_list.jsp。注意一个细节JSP 放在WEB-INF下面有个好处用户不能通过地址栏直接访问 JSP 源码必须经过 Controller这是项目里页面跳转都走后端的原因。很多人的 404 是这么来的Controller 返回值写错了大小写比如返回Product_List而文件名是product_list.jsp或者前缀配到了/WEB-INF/views/但 JSP 实际放在/WEB-INF/jsp/。排查时直接在浏览器访问转出的完整路径看 Tomcat 的日志里有没有Resource not found字样。4.3 分页查询PageHelper 的两个必填参数商品列表页一般不会把所有商品一次查出来教学项目里最常见的是 PageHelper 插件几行代码就能把分页逻辑接好。它是在 MyBatis 执行层通过拦截器改写的 SQL自动在尾部拼接LIMIT。配置如下bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property nameplugins array bean classcom.github.pagehelper.PageInterceptor property nameproperties props prop keyhelperDialectmysql/prop prop keyreasonabletrue/prop /props /property /bean /array /property /beanhelperDialect告诉插件数据库方言mysql 会生成LIMIT ?语句reasonable的作用是防止越界请求当pageNum小于 1 时自动置为 1大于最大页数时自动置为最后一页。这个参数在你做毕设演示时特别有用别人故意输入?pageNum999页面不会白屏。代码层面Service 里只在查询前调用一次PageHelper.startPage(pageNum, pageSize)后面紧跟的第一次查询就会被分页拦截public PageInfoProduct listByPage(Integer cid, Integer pageNum, Integer pageSize) { PageHelper.startPage(pageNum, pageSize); ListProduct list productDao.selectByCategoryId(cid); return new PageInfo(list); }一定要记住startPage只对紧接着执行的第一条查询生效。如果你在它和查询之间插入了别的数据库操作分页会被那个查询抢走结果商品列表永远查不到第二页数据。这也是这个插件最常见的误用姿势。4.4 订单状态怎么设计从待支付到已完成的状态机这个项目的订单表核心字段是status状态值一般是数字映射关系大概是0 待支付、1 已支付待发货、2 已发货、3 已完成、4 已取消。整个状态流转是单向的不允许从已支付跳回待支付。status含义触发方式0待支付下单成功创建订单时写入1已支付模拟支付接口回调后更新3已完成用户点击确认收货4已取消待支付状态下用户取消教学项目里的支付一般是模拟实现常见做法是点击“去支付”直接跳到一个mockPay接口接口内把订单状态从 0 改成 1不做真实资金流转。你在改造成简历项目时可以保留这个模拟接口并补一个说明文档写清楚真实支付替换方案是接第三方沙箱支付或本地支付网关。订单超时取消通常不在教学项目里实现但这是一个很好的加分功能。思路是下单时记录create_time用户查询订单时如果状态为 0 且创建时间超过 30 分钟自动置为 4 并释放库存。这个逻辑可以用 Spring 定时任务实现也可以只在查询时按条件更新后者对新手更友好不需要引入消息队列。5. 黑马商城跑不起来这 5 个坑我踩了不止一次5.1 数据库驱动报错Public Key Retrieval is not allowed 与时区异常现象项目启动或第一次查商品列表时控制台报Public Key Retrieval is not allowed或The server time zone value йʱ is unrecognized连接串在正常数据库客户端里又能连上。原因这两条都是 MySQL 8.0 的连接层校验问题前者是因为 8.0 默认用caching_sha2_password认证插件安全传输公钥需要客户端显式允许后者是驱动读到了 MySQL 服务器的系统时区但本地没有做映射。解决在jdbc.url后面加上allowPublicKeyRetrievaltrueserverTimezoneAsia/Shanghai并把驱动改成com.mysql.cj.jdbc.Driver。如果仍然报错检查你本地装的是不是 mysql-connector 5.1.x换成 8.0.x 再试。5.2 Tomcat 端口被占用启动后页面自动跳回 IDEA 首页现象启动 Tomcat 时日志显示Port 8080 was already in use或者浏览器访问 localhost:8080 打开的是 IDEA 的欢迎页。原因8080 被别的进程占了最常见的是之前残留的 Tomcat 实例或者另一个开发工具使用了默认端口。解决两个选择——关掉占用进程或者在 IDEA 的Edit Configuration里把 Tomcat 的 HTTP port 改成 8081并同步检查Application context是否还是/。改端口后如果页面样式全丢了十有八九是页面里的静态资源路径写死了 8080检查前端模板或全局配置里的端口相关常量。5.3 Maven 依赖全是红、下载慢、找不到本地仓库现象导入工程后 IDEA 里spring-webmvc、mybatis等坐标全部报红Maven 面板刷新后卡在下载不结束。原因国内直连中央仓库速度不稳定或者老项目的仓库地址是 http 协议新版 Maven 默认禁止非 HTTPS 仓库。解决在settings.xml的mirrors节点配置一个可用的镜像源并确认仓库地址是 https。改完镜像后记得在 IDEA 的 Maven 配置项里指定本地仓库地址和settings.xml路径然后执行一次clean install把依赖真正拉下来。这一步不需要改项目代码但没做对的话后面所有操作都动不了。5.4 页面能打开但图片全裂、CSS 完全裸奔现象商品列表页面能显示文字但所有图片都是裂图页面没有任何样式控制台一堆 404。原因多半是springmvc.xml里缺静态资源映射或者项目实际目录结构里静态文件根本不在/static/下。教学项目的 JSP 里常常用${pageContext.request.contextPath}/static/...拼路径如果项目部署名不是/这个路径会带上应用名后端放行配置又只匹配了/static/**的绝对路径就会匹配失败。解决先打开浏览器控制台看具体 404 的 URL再对照springmvc.xml的mvc:resources看是否匹配。还有一种隐蔽情况图片文件在WEB-INF下这属于安全目录容器不会对外暴露必须把图片挪到webapp/static或webapp/upload下。5.5 下单后库存没扣或扣了库存订单没生成现象提交订单提示成功但商品详情页库存数量没变或者库存变了订单列表里查不到记录。原因这两种情况本质是事务没有生效最常见是Transactional写在了私有方法上或是在同一个类里调用自己的方法导致事务代理没有介入。另一个常见原因是用try-catch包住了异常事务捕获不到抛出点默认就不会回滚。解决把事务注解放到 public 方法上并且通过注入的 Service 对象跨类调用不要在事务方法内部把异常吞掉要么向上抛出要么在 catch 后手动TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()。判断事务是否生效可以在运行时看日志里有没有Creating new transaction字样。6. 从跑通到变成你自己的项目三个改造方向与一个调试习惯如果你已经能正常跑起来并在浏览器完成一次下单接下来这几步值得做它们能让这个教学项目在简历上变得有辨识度。方向一是把 Session 购物车改成 Redis 存储。核心是把购物车的存取从 HttpSession 换成 Redis 的 Hash 结构用 userId 作为 key、商品 id 作为 field。改动点集中在购物车的 Service 和拦截器前端代码不用动。这一步要搞懂 Redis 的序列化和过期策略可以在项目里加一套 RedisConfig 来指定 key 的过期时间。方向二是把页面从 JSP 迁到前后端分离。这个工作量稍大但价值也最大。先把 Controller 返回值改成RestController返回 JSON再用 Vue 或原生 JS 重写页面。迁移过程中会踩到跨域问题可以直接在 SpringMVC 里配置 CORS 过滤器解决。这个改造做完项目就从“课设”变成了“接口项目”面试时聊起来也更贴近团队实际协作方式。方向三是在模拟支付接口里增加一个简单的回调校验。真实支付最重要的不是页面跳转而是后端回调时验签并更新订单状态。教学项目没有这一环你可以模拟一个回调地址在控制器里实现“校验参数 → 改变订单状态 → 返回 success”的完整闭环顺便把订单状态机的代码捋一遍。养成一个验证习惯会省掉后面很多调试时间每次改完订单相关逻辑跑一遍“加购→下单→支付→查库存”的闭环并在每个关键方法里加一条日志。我见过太多人以为页面跳转到了支付页就代表下单成功结果库存和订单对不上。给下单方法加一个 AOP 日志切面打印耗时和订单号能快速定位是哪个环节慢。这个习惯来自我自己的一次教训当时调了半天“订单丢失”最后发现是事务方法内部调用了自己代理没生效。如果你也遇到类似问题先别怀疑业务代码查声明式事务的边界。先跑通再拆开最后改成自己的样子这条路对每个学 JavaWeb 的人都是最快的成长路径。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Java并发编程核心知识详解:线程、锁与线程池实战

Java并发编程核心知识详解:线程、锁与线程池实战

1. 线程基础:先搞清楚线程到底是什么线程这块内容,可以说是Java面试里出场率最高的知识点,没有之一。不管是校招还是社招,只要是后端方向,几乎必问线程相关的概念。我这些年面试别人也被别人面试,发现线程八…

2026/10/13 14:42:54 阅读更多 →
知乎动态渲染数据采集:SSR快照与API复现实战指南

知乎动态渲染数据采集:SSR快照与API复现实战指南

1. 这不是“爬知乎”的教程,而是对一个失效接口的逆向解剖现场“puppeteer爬取知乎答案列表”——这个标题在2023年之前几乎等于“稳如老狗”,2024年之后却成了新手踩坑率最高的关键词之一。我最近帮某高校实验室调试一个课程设计项目时,发现…

2026/10/13 14:42:54 阅读更多 →
Windows沙箱运行AI模型崩溃根因:EPT页表竞争与GPU上下文丢失

Windows沙箱运行AI模型崩溃根因:EPT页表竞争与GPU上下文丢失

1. 项目概述:一次Windows沙箱环境崩溃背后的系统级真相“2026-10-08_Codex-Windows沙箱故障复盘报告”这个标题乍看像是一份内部运维日志,但拆开来看,它其实浓缩了一个高频、高痛、却极少被公开深挖的技术现场——Codex类AI辅助开发工具在Win…

2026/10/13 14:41:52 阅读更多 →

最新新闻

CFSFDP参考代码实战:密度峰值聚类原理、决策图与调参指南

CFSFDP参考代码实战:密度峰值聚类原理、决策图与调参指南

简介:资源内含CFSFDP算法的Python参考代码,面向数据挖掘与聚类分析方向的学习者与研究人员,适用于包含离散、连续及模糊属性的复杂数据集,主要解决模糊数据分区前的特征选择与降维问题。压缩包共7个文件,约12KB&#x…

2026/10/13 15:27:06 阅读更多 →
【血糖】患者血糖数据、PID反馈控制和食物的切换,模拟混合人工胰腺Matlab实现

【血糖】患者血糖数据、PID反馈控制和食物的切换,模拟混合人工胰腺Matlab实现

✅作者简介:热爱科研的Matlab仿真开发者,擅长数学建模、模型改进、算法创新、程序设计科研仿真。🍎 往期回顾关注个人主页:完整代码获取 定制创新 论文复现私信🍊个人信条:做科研,博学之、审问之…

2026/10/13 15:27:06 阅读更多 →
ROSTCM6中文分词与词频统计实操:从编码清洗到内容分析

ROSTCM6中文分词与词频统计实操:从编码清洗到内容分析

简介:这是由武汉大学沈阳教授研发的免费社会计算平台ROSTCM6,主要面向人文社科领域的师生与研究者,解决文本内容分析与量化研究中的分词、词频统计、情感挖掘等需求。工具覆盖微博分析、聊天分析、全网分析、网站分析、浏览分析、流量分析、聚…

2026/10/13 15:27:06 阅读更多 →
两级式单相光伏并网Simulink仿真:从Boost MPPT到SPWM逆变全解析

两级式单相光伏并网Simulink仿真:从Boost MPPT到SPWM逆变全解析

光伏并网仿真这条路,很多做电力电子的人都是从两级式拓扑起步的。MATLAB 2021a版本下搭建两级式单相光伏并网仿真模型,前级用DC-DC变换完成升压与最大功率点跟踪,后级用桥式逆变器实现直流到交流的转换和并网电流控制,这套架构不论…

2026/10/13 15:27:06 阅读更多 →
SQL Server人事管理系统课程设计:表结构、存储过程与事务实践

SQL Server人事管理系统课程设计:表结构、存储过程与事务实践

简介:面向高校数据库课程设计场景的SQL Server人事管理系统完整项目,适合需要掌握数据库建表、数据关系设计与Java GUI联调的在校学生,可直接作为课设参考模板或二次开发底座。系统核心围绕员工、部门、职位等数据表展开,涵盖查询…

2026/10/13 15:27:06 阅读更多 →
TokenTracker:轻量嵌入式LLM Token用量治理工具

TokenTracker:轻量嵌入式LLM Token用量治理工具

1. 这不是又一个“统计面板”,而是一套嵌入式 token 使用量治理闭环你有没有遇到过这样的场景:团队里三个项目共用一套大模型 API 接口,但没人知道谁在调用、调了多少、哪次请求耗 token 最狠?某天账单突然翻倍,排查时…

2026/10/13 15:26:05 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →