SSM+JSP构建二手交易平台的实战落地与避坑指南
简介本资源是一套基于SSM框架SpringSpringMVCMyBatis与JSP/HTML5开发的二手交易平台完整毕业设计项目面向Java初学者及本科课程设计、毕业设计阶段的学生解决从技术选型、环境搭建到功能实现的一站式实践需求。压缩包共2000个文件涵盖298个JSP页面含首页、商品管理、用户中心等核心模块、290个CSS与716个JS文件支撑前端交互与响应式布局、238个编译后Class文件及119个Java源码含详细注释另有4个SQL脚本含建库建表与初始化数据、数据库配置XML与Maven依赖配置整体大小为53.33MB。目前已有112人学习下载项目经严格调试支持在IDEATomcat 7/8MySQL 5.7环境下一键部署运行配套提供SSM部署教学视频含环境配置、数据库导入、启动排错全流程并包含多套备份文件如.bak结尾的JSP/CSS/图片便于版本回溯与结构理解是Java Web实战入门与高分毕设落地的可靠参考。1. 为什么一个“238二手交易平台”还能用SSMJSP跑通——老架构在中小团队真实交付中的生存逻辑你点开这个压缩包看到“ssmjsphtml5”“238二手交易平台”第一反应可能是这玩意儿不是2016年就该进博物馆了吗但现实是某高校计算机系大三实训项目组、某地市级国企下属信息中心外包小队、还有三四家专注本地生活服务的小微IT公司过去两年里真正在用这套组合落地了至少17个类似平台——不是Demo是上线后日均300用户发帖、成交率稳定在11.3%的真实系统。它没用Spring Boot自动装配没上Vue组件化甚至没做前后端分离但数据库事务能兜住“发布商品→扣库存→生成订单”三步操作JSP页面在IE11里也能正常渲染图片缩略图Tomcat 8.5跑起来内存占用不到450MB。这不是怀旧是权衡当团队只有2名后端1名前端兼测试、交付周期压到6周、客户明确要求“能在他们那台Windows Server 2012 R2IE11的旧办公机上直接打开管理后台”时SSM的XML可追溯性、JSP的零构建部署、HTML5的离线缓存能力反而成了最短路径。本文不鼓吹技术复古只拆解如何用这套被低估的老组合在资源受限场景下把一个二手交易闭环真正跑稳、跑通、跑出可用性。2. 搭建SSM基础骨架从web.xml到MyBatis动态SQL的最小可行配置2.1 web.xml里藏着的三个生死开关ContextLoaderListener、CharacterEncodingFilter与UrlPattern陷阱SSM项目启动失败80%卡在web.xml。这不是过时配置而是Tomcat容器与Spring上下文握手的关键协议。下面这段看似平平无奇的配置实际控制着整个应用的生命线!-- web.xml -- context-param param-namecontextConfigLocation/param-name param-valueclasspath:spring-context.xml/param-value /context-param listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener filter filter-nameencodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filter filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping servlet servlet-namedispatcher/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namecontextConfigLocation/param-name param-valueclasspath:spring-mvc.xml/param-value /init-param load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namedispatcher/servlet-name url-pattern//url-pattern /servlet-mapping关键点说明ContextLoaderListener加载的是根应用上下文spring-context.xml负责Service、DAO、DataSource等非Web层Bean而DispatcherServlet加载的是Web上下文spring-mvc.xml只管Controller、ViewResolver等。两者父子关系不能颠倒否则Autowired注入会失败。CharacterEncodingFilter的forceEncodingtrue是硬性要求。二手平台用户上传的商品标题常含中文、emoji、甚至日韩字符若不强制MySQL插入时会出现?乱码且此Filter必须放在所有其他Filter之前靠前声明否则后续Filter读取的request已经是乱码流。url-pattern//url-pattern是现代写法替代老旧的*.do。它让DispatcherServlet接管所有请求静态资源除外为后续通过mvc:resources放行CSS/JS打下基础。若写成/*则静态资源也会被拦截导致页面白屏。提示Tomcat 8.5默认启用URIEncodingUTF-8但务必在conf/server.xml的Connector节点中显式声明否则URL路径参数如/item/detail?id123title手机中的中文仍会乱码。2.2 Spring MVC配置ViewResolver如何精准定位JSP又不污染静态资源路径JSP不是模板引擎是Servlet容器原生支持的视图技术。它的路径解析逻辑和Thymeleaf完全不同必须靠InternalResourceViewResolver硬编码规则!-- spring-mvc.xml -- mvc:annotation-driven / mvc:resources mapping/static/** location/static/ / bean classorg.springframework.web.servlet.view.InternalResourceViewResolver property nameprefix value/WEB-INF/jsp/ / property namesuffix value.jsp / property nameorder value1 / /bean !-- 静态资源放行CSS/JS/IMG -- mvc:resources mapping/css/** location/static/css/ / mvc:resources mapping/js/** location/static/js/ / mvc:resources mapping/img/** location/static/img/ /参数说明prefix/WEB-INF/jsp/是安全边界。所有JSP必须放在/WEB-INF/下外部无法直接URL访问如http://x.com/WEB-INF/jsp/admin.jsp会404防止源码泄露。suffix.jsp决定了Controller返回字符串index时实际渲染/WEB-INF/jsp/index.jsp。order1表示该ViewResolver优先级最高。若同时配置了JSON视图如MappingJackson2JsonView需设为更低order值如2否则JSP永远抢答。mvc:resources必须写在ViewResolver之前否则静态资源请求会被当成Controller路径处理返回404。实操验证启动后访问http://localhost:8080/static/js/main.js应返回JS文件内容访问http://localhost:8080/indexController返回index应渲染/WEB-INF/jsp/index.jsp。若前者404检查location路径是否对应src/main/webapp/static/若后者白屏用浏览器开发者工具Network面板看返回状态码——404是ViewResolver路径错500是JSP语法错误。2.3 MyBatis核心配置为什么用SqlSessionFactoryBean而不是直接new SqlSessionFactoryMyBatis与Spring整合不是简单加jar包而是通过SqlSessionFactoryBean完成生命周期托管。这是避免连接泄漏、事务失效的底层保障!-- spring-context.xml -- bean iddataSource classcom.alibaba.druid.pool.DruidDataSource init-methodinit destroy-methodclose property nameurl value${jdbc.url} / property nameusername value${jdbc.username} / property namepassword value${jdbc.password} / property nameinitialSize value5 / property nameminIdle value5 / property namemaxActive value20 / /bean bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property namedataSource refdataSource / property nameconfigLocation valueclasspath:mybatis-config.xml / property namemapperLocations valueclasspath:mapper/*.xml / /bean bean classorg.mybatis.spring.mapper.MapperScannerConfigurer property namebasePackage valuecom.example.dao / property namesqlSessionFactoryBeanName valuesqlSessionFactory / /bean关键设计逻辑DruidDataSource替代了老旧的BasicDataSource其init-methodinit确保连接池在Spring容器启动时预热避免首请求慢destroy-methodclose保证应用关闭时释放连接不残留TIME_WAIT。SqlSessionFactoryBean是FactoryBean接口实现类Spring会调用其getObject()方法获取真正的SqlSessionFactory实例并将其纳入IoC容器管理。若手动new SqlSessionFactory()事务注解Transactional将完全失效。MapperScannerConfigurer的basePackage扫描com.example.dao下所有接口自动生成代理对象。注意DAO层必须是接口不能是类且接口名需与Mapper XML文件名一致如ItemDao.java↔ItemMapper.xml。注意mapperLocations使用classpath:mapper/*.xml而非classpath*:mapper/*.xml。后者会扫描所有jar包内的同名文件导致多模块项目中Mapper重复加载抛出Invalid bound statement (not found)异常。3. 二手交易核心流程落地从商品发布到订单生成的四层事务控制3.1 商品发布HTML5 File API JSP表单 MyBatis批量插入的协同链路二手平台最频繁操作是用户发帖。这里不用富文本编辑器而用原生HTML5input typefile multiple实现多图上传既轻量又兼容IE11需polyfill。关键不在前端炫技而在后端如何把“1条商品记录最多9张图片路径”原子化写入// ItemService.java Transactional(rollbackFor Exception.class) public void publishItem(Item item, ListString imagePaths) { // 1. 插入商品主表 itemMapper.insert(item); // 获取item.id自增主键 // 2. 批量插入图片关联表item_image if (!CollectionUtils.isEmpty(imagePaths)) { ListItemImage images imagePaths.stream() .map(path - { ItemImage img new ItemImage(); img.setItemId(item.getId()); img.setPath(path); img.setSortOrder(imagePaths.indexOf(path)); return img; }) .collect(Collectors.toList()); itemImageMapper.insertBatch(images); // 自定义批量插入方法 } }对应的MyBatis Mapper XMLItemImageMapper.xmlinsert idinsertBatch parameterTypejava.util.List INSERT INTO item_image (item_id, path, sort_order, create_time) VALUES foreach collectionlist itemitem separator, (#{item.itemId}, #{item.path}, #{item.sortOrder}, NOW()) /foreach /insert参数说明Transactional(rollbackFor Exception.class)是生死线。若图片插入失败如磁盘满商品主表插入必须回滚否则出现“有商品无图”的脏数据。itemMapper.insert(item)后立即获取item.getId()依赖MyBatis的useGeneratedKeystrue配置见ItemMapper.xmlinsert idinsert parameterTypeItem useGeneratedKeystrue keyPropertyid INSERT INTO item (title, price, description, user_id, status) VALUES (#{title}, #{price}, #{description}, #{userId}, #{status}) /insertinsertBatch使用foreach标签生成单条INSERT语句比循环调用insert()快5倍以上。但注意MySQL默认max_allowed_packet4MB若一次插入超1000条需调大该值。3.2 订单生成基于数据库乐观锁的库存扣减防超卖二手商品是单件库存quantity1但并发场景下仍需防超卖。不用Redis分布式锁增加运维复杂度而用MySQL UPDATE的CAS机制// OrderService.java Transactional(rollbackFor Exception.class) public Order createOrder(Long itemId, Long userId) { // 1. 查询商品带版本号 Item item itemMapper.selectById(itemId); if (item null || item.getStatus() ! ItemStatus.ON_SALE.getCode()) { throw new BusinessException(商品不存在或已下架); } // 2. 尝试扣减库存乐观锁 int updated itemMapper.decreaseStock(itemId, item.getVersion()); if (updated 0) { throw new BusinessException(库存不足请刷新重试); } // 3. 创建订单 Order order new Order(); order.setItemId(itemId); order.setUserId(userId); order.setStatus(OrderStatus.UNPAID.getCode()); orderMapper.insert(order); return order; }对应的Mapper XMLItemMapper.xmlupdate iddecreaseStock parameterTypemap UPDATE item SET quantity quantity - 1, version version 1, update_time NOW() WHERE id #{itemId} AND version #{version} AND quantity 0 /update原理说明version字段是乐观锁版本号初始为0。每次更新成功version自增1。WHERE ... AND version #{version}确保只有持有最新版本号的请求才能更新。若两个请求同时查到version5第一个更新后version6第二个因WHERE version5不成立而updated0业务层捕获后提示“库存不足”。此方案无需额外中间件纯数据库能力且对单件商品极致高效。实测在Tomcat 8线程池200线程压测下超卖率为0。3.3 用户登录态JSP Session Filter权限拦截的极简RBAC实现不用Shiro或Spring Security学习成本高、配置繁杂用原生HttpSession 自定义Filter实现角色路由控制// AuthFilter.java public class AuthFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req (HttpServletRequest) request; HttpServletResponse resp (HttpServletResponse) response; String uri req.getRequestURI(); // 放行登录页、静态资源、验证码 if (uri.contains(/login) || uri.contains(/static/) || uri.contains(/captcha)) { chain.doFilter(request, response); return; } // 检查Session User user (User) req.getSession().getAttribute(user); if (user null) { resp.sendRedirect(req.getContextPath() /login.jsp); return; } // RBAC权限检查简化版管理员可访问所有普通用户仅限个人中心 if (uri.startsWith(/admin/) !user.getRole().equals(ADMIN)) { req.getRequestDispatcher(/403.jsp).forward(request, response); return; } chain.doFilter(request, response); } }在web.xml中注册filter filter-nameauthFilter/filter-name filter-classcom.example.filter.AuthFilter/filter-class /filter filter-mapping filter-nameauthFilter/filter-name url-pattern/*/url-pattern /filter-mapping关键点req.getSession().getAttribute(user)是JSP时代最朴素的登录态管理。HttpSession由Tomcat内存维护无需Redis集群适合单机部署。权限判断写在Filter而非Controller避免每个Controller都写if(!isAdmin()) return;符合AOP思想。403.jsp页面用JSTLc:if test${not empty errorMsg}显示友好提示不暴露后端错误堆栈。提示Session超时时间在web.xml中统一配置session-config session-timeout30/session-timeout !-- 单位分钟 -- /session-config4. 避坑指南SSMJSP项目上线前必须验证的5个血泪现场4.1 现象JSP页面中文显示为???但数据库查询结果正常原因JSP文件本身编码未声明为UTF-8或Tomcat对JSP编译器的编码设置缺失。解决在每个JSP顶部添加page指令% page contentTypetext/html;charsetUTF-8 %在web.xml中全局配置JSP编译器编码Tomcat 8.5必需jsp-config jsp-property-group url-pattern*.jsp/url-pattern page-encodingUTF-8/page-encoding /jsp-property-group /jsp-config确保IDE如IntelliJ的File Encoding设为UTF-8且Transparent native-to-ascii conversion关闭。4.2 现象MyBatis执行SELECT * FROM item WHERE title LIKE %手机%返回空但Navicat中能查到原因MySQL 8.0默认字符集为utf8mb4而JDBC URL未指定characterEncodingutf8mb4导致LIKE匹配时字符截断。解决修改jdbc.propertiesjdbc.urljdbc:mysql://localhost:3306/secondhand?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8mb4allowPublicKeyRetrievaltrue并确认MySQL服务端my.cnf中[client] default-character-set utf8mb4 [mysqld] character-set-server utf8mb4 collation-server utf8mb4_unicode_ci4.3 现象Tomcat启动报错java.lang.NoSuchMethodError: org.springframework.core.convert.support.DefaultConversionService.getSharedInstance()原因Spring版本冲突。常见于引入了spring-core-5.3.x.jar但spring-webmvc-4.3.x.jar也存在低版本jar覆盖了高版本方法。解决用Maven Helper插件IntelliJ分析依赖树执行mvn dependency:tree -Dverbose -Dincludesorg.springframework在pom.xml中用exclusions排除传递依赖dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version5.3.31/version exclusions exclusion groupIdorg.springframework/groupId artifactIdspring-core/artifactId /exclusion /exclusions /dependency统一锁定Spring版本推荐5.3.31兼容JDK8且无严重漏洞。4.4 现象用户上传图片后JSP页面img src${item.imagePath}显示404原因图片物理路径未映射到Web容器可访问路径。开发者常把图片存到D:/upload/却忘了在spring-mvc.xml中配置静态资源映射。解决在spring-mvc.xml中添加mvc:resources mapping/upload/** locationfile:D:/upload/ /JSP中引用改为img src${pageContext.request.contextPath}/upload/${item.imagePath}确保Tomcat进程对D:/upload/目录有读写权限Linux下为chmod 755 /path/to/upload。4.5 现象c:forEach items${items} varitem遍历为空但Controller中model.addAttribute(items, items)已赋值原因JSTL标签库未正确引入或web.xml中web-app版本声明过低。解决确认pom.xml引入JSTL 1.2dependency groupIdjstl/groupId artifactIdjstl/artifactId version1.2/version /dependencyweb.xml顶部声明必须为Servlet 3.0web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd version3.1JSP页面顶部声明% taglib prefixc urihttp://java.sun.com/jsp/jstl/core %。5. HTML5增强实战用localStorageCanvas实现二手商品图片本地预览与压缩5.1 不依赖后端的图片预览File API ObjectURL直出缩略图二手平台用户常在弱网环境如校园网、老旧小区宽带上传图片。若等后端返回URL再渲染体验极差。HTML5的FileReader可直接在浏览器内读取二进制并生成预览!-- publish.jsp -- input typefile idimageInput acceptimage/* multiple div idpreviewContainer/div script document.getElementById(imageInput).addEventListener(change, function(e) { const files e.target.files; const container document.getElementById(previewContainer); container.innerHTML ; // 清空旧预览 Array.from(files).forEach(file { if (!file.type.match(image.*)) return; const reader new FileReader(); reader.onload function(e) { const img document.createElement(img); img.src e.target.result; // ObjectURL img.style.maxWidth 120px; img.style.margin 5px; container.appendChild(img); }; reader.readAsDataURL(file); // 转为base64 DataURL }); }); /script原理说明readAsDataURL()将图片读为data:image/png;base64,...格式直接赋给img src即可显示全程不经过后端。ObjectURL是浏览器内存地址非真实URL安全性高且无跨域问题。此方案兼容IE10需msSaveOrOpenBlob降级实测在2G网络下1MB图片预览延迟200ms。5.2 前端图片压缩Canvas drawImage toDataURL控制体积用户手机拍的图动辄3-5MB直接上传浪费带宽且易超时。用Canvas压缩到500KB以内质量损失肉眼不可辨function compressImage(file, maxWidth 800, quality 0.8) { return new Promise((resolve, reject) { const reader new FileReader(); reader.onload function(e) { const img new Image(); img.onload function() { const canvas document.createElement(canvas); const ctx canvas.getContext(2d); // 计算缩放比例 let width img.width, height img.height; if (width maxWidth) { height Math.round((height * maxWidth) / width); width maxWidth; } canvas.width width; canvas.height height; ctx.drawImage(img, 0, 0, width, height); // 压缩为JPEG质量0.8 const compressedData canvas.toDataURL(image/jpeg, quality); resolve(compressedData); }; img.src e.target.result; }; reader.readAsDataURL(file); }); } // 使用示例 document.getElementById(imageInput).addEventListener(change, async function(e) { const files Array.from(e.target.files); const compressedUrls await Promise.all( files.map(file compressImage(file)) ); // 将compressedUrls发送到后端如FormData const formData new FormData(); compressedUrls.forEach((url, i) { // 将DataURL转为Blob再append避免后端接收base64字符串 fetch(url).then(res res.blob()).then(blob { formData.append(images, blob, img_${i}.jpg); }); }); });参数说明maxWidth800适配移动端屏幕800px宽度足够展示商品细节。quality0.8JPEG压缩质量0.7-0.8为最佳平衡点体积减少60%画质无明显锯齿。toDataURL(image/jpeg)强制转JPEG避免PNG透明通道导致体积暴增。注意fetch(url).then(res res.blob())是关键。若直接formData.append(images, url)后端收到的是base64字符串约33%体积膨胀需额外解码转为Blob后后端RequestParam MultipartFile可直接接收二进制流。5.3 离线草稿箱localStorage持久化未提交的商品信息用户填写一半商品信息突然切走微信回来发现表单清空——这是二手平台最大流失点。用localStorage保存草稿关机重启也不丢// publish.jsp底部 script // 页面加载时恢复草稿 window.addEventListener(load, function() { const draft localStorage.getItem(itemDraft); if (draft) { const data JSON.parse(draft); document.getElementById(title).value data.title || ; document.getElementById(price).value data.price || ; document.getElementById(desc).value data.desc || ; // ... 其他字段 alert(检测到未提交的草稿已自动恢复); } }); // 输入时实时保存防崩溃 [title, price, desc].forEach(id { document.getElementById(id).addEventListener(input, debounce(saveDraft, 1000)); }); function saveDraft() { const draft { title: document.getElementById(title).value, price: document.getElementById(price).value, desc: document.getElementById(desc).value, // 注意图片File对象无法存入localStorage只存预览URL previewUrls: Array.from(document.querySelectorAll(#previewContainer img)) .map(img img.src) }; localStorage.setItem(itemDraft, JSON.stringify(draft)); } // 防抖函数避免高频触发 function debounce(func, wait) { let timeout; return function executedFunction() { const later () { clearTimeout(timeout); func(...arguments); }; clearTimeout(timeout); timeout setTimeout(later, wait); }; } // 表单提交成功后清除草稿 document.getElementById(publishForm).addEventListener(submit, function() { localStorage.removeItem(itemDraft); }); /script落地效果草稿自动保存间隔1秒不影响输入流畅度localStorage容量5MB足够存10条完整商品草稿关闭浏览器再打开window.load事件中恢复用户无感知提交成功后removeItem避免草稿堆积。我带过的三个学生团队上线后用户平均单次发帖耗时从4分12秒降到2分07秒核心就靠这一招。不是所有优化都要砸钱上CDN或微服务有时候一行localStorage.setItem()就是最好的用户体验投资。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

初创公司代码托管选型:GitHub 能用吗?好用在哪、边界在哪、何时迁移?

初创公司代码托管选型:GitHub 能用吗?好用在哪、边界在哪、何时迁移?

刚拿到第一笔融资、团队从两三个人扩到十几个人的时候,几乎每个创始人都问过我同一个问题:代码放在 GitHub 上行不行?甚至有朋友说得更直白——我们做的虽然不是国防项目,但毕竟是商业代码,放别人平台上心里总不踏实。…

2026/10/13 7:33:05 阅读更多 →
DDNS MCP 服务完全指南:用 stdio 与 Streamable HTTP 把 DDNS 状态查询与同步接入 MCP 客户端

DDNS MCP 服务完全指南:用 stdio 与 Streamable HTTP 把 DDNS 状态查询与同步接入 MCP 客户端

网络CLI 【免费下载链接】DDNS 🌐自动更新域名解析到本机IP,支持dnspod,阿里DNS,CloudFlare,华为云,DNSCOM... 项目地址: https://gitcode.com/gh_mirrors/dd/DDNS 点击查看 免费下载 DDNS 在 Python 标准库之上内置了一个零第三方依赖的 MCP&#xff0…

2026/10/13 7:33:05 阅读更多 →
AI辅助编码实践:用命令行工具自动生成代码文档

AI辅助编码实践:用命令行工具自动生成代码文档

自己维护的几个项目一直有个老大难问题:文档落后于代码。功能改了,说明文没跟上,新同事接手时只能对着代码猜逻辑。后来尝试用辅助编码工具一边写功能一边补文档,折腾了几周,沉淀出一个带命令行交互的文档生成小工具&a…

2026/10/13 7:33:05 阅读更多 →

最新新闻

Schema标记实战:用结构化数据占据整个SERP

Schema标记实战:用结构化数据占据整个SERP

1. "占据整个SERP"到底是怎么回事:从一次搜索结果截图说起先别急着上代码,我们得先搞清楚一个问题:所谓"占据整个SERP",到底长什么样?去年我接手了一个垂直电商的小项目,卖的是某种小众…

2026/10/13 8:16:34 阅读更多 →
AutoTool实操:Agent工具路由如何省下30%推理成本

AutoTool实操:Agent工具路由如何省下30%推理成本

AAAI 2026 放榜之后,我朋友圈里最热闹的话题除了 Jev 这种突然爆火的开源 Agent 项目,就是各路团队在吐槽“推理成本根本扛不住”。Jev 确实把复杂任务的拆解能力拉到了一个新高度,但问题也随之而来:工具越挂越多、调用链越拉越长…

2026/10/13 8:16:34 阅读更多 →
免费磁盘清理工具 Czkawka:找重复文件与清理空文件夹完整上手指南

免费磁盘清理工具 Czkawka:找重复文件与清理空文件夹完整上手指南

免费磁盘清理工具 Czkawka:找重复文件与清理空文件夹完整上手指南 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka Czkawka 是一款用 Ru…

2026/10/13 8:16:34 阅读更多 →
Faker库实战:让接口测试与自动化测试的造数更真实高效

Faker库实战:让接口测试与自动化测试的造数更真实高效

做接口测试和自动化测试的朋友,应该都体验过那种被“假数据”支配的尴尬。我早年在某项目组做下单流程的接口测试,为了凑测试用户,手工在配置文件里写了几百个“张三”,手机号清一色13800138000,地址全是“北京市朝阳区…

2026/10/13 8:16:34 阅读更多 →
带实习生三个月,我总结了一套 Mentor 带教方法:从前端页面切入到后端接口拆解(附完整清单)

带实习生三个月,我总结了一套 Mentor 带教方法:从前端页面切入到后端接口拆解(附完整清单)

文档教程知识库 【免费下载链接】InterviewGuide 🔥🔥「InterviewGuide」是阿秀从校园->职场多年计算机自学过程的记录以及学弟学妹们计算机校招&秋招经验总结文章的汇总,包括但不限于C/C 、Golang、JavaScript、Vue、操作系统、数据结…

2026/10/13 8:16:34 阅读更多 →
CyFA:放弃预测残差,用循环特征对齐提升多变量时间序列异常检测

CyFA:放弃预测残差,用循环特征对齐提升多变量时间序列异常检测

多变量时间序列异常检测这块,我前前后后折腾了不少方案。最早用的也是"先预测、再算残差"的老路子,后来复现了 GDN 和 KDA 这两个基线,说实话越用越觉得别扭。直到我自己折腾出一个叫 CyFA 的思路,直接扔掉 Delta Rule&…

2026/10/13 8:15:34 阅读更多 →

日新闻

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

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

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

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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →