SSM+JSP网上购物商城项目从零搭建全流程详解
如果你正在做Java课程设计或者毕业设计大概率绕不开“网上购物商城”这个题目。用SSM加JSP这套老组合来做商城放在今天看依然是一个非常典型、非常能锻炼人的练手项目。这里记录一下我做这类项目时的完整思路包括模块怎么拆、表怎么建、代码的关键坑点在哪以及最后怎么打包部署全程直接照着做就行。1. 项目定位与技术选型思路1.1 为什么到现在还在用SSMJSP很多人会问现在新项目不都是Spring Boot加前后端分离吗为什么还要用SSM加JSP。答案很简单因为很多高校的课程安排、毕业设计选题、以及一部分老企业的维护项目仍然停留在这套技术栈上。学了Spring Boot直接上手当然爽但Spring Boot的出现恰恰是为了简化Spring的配置流程它的底层核心依然是Spring MVC的那套请求处理流程和依赖注入思路。把SSM吃透再去看Spring Boot你会觉得很多设计都是在“做减法”反过来也一样。SSM指的就是Spring SpringMVC MyBatisJSP负责页面展示。这套组合的典型访问流程是浏览器发请求到TomcatTomcat把请求交给DispatcherServletDispatcherServlet根据URL映射到对应的ControllerController调用Service层Service层通过MyBatis操作MySQL数据库最后把数据塞进Model由JSP渲染成HTML返回给浏览器。这个链路虽然每一步都有人觉得繁琐但每一步都看得见摸得着对于理解JavaWeb全流程帮助非常大。1.2 整体模块怎么拆做商城项目最忌讳一上来就写代码。先想清楚做哪些页面、哪些角色、哪些状态流转。一个能满足课程设计要求、又能真正跑通的网上购物商城至少要包含两块前台商城和后台管理。前台商城面向普通用户包括注册登录、商品列表、商品详情、购物车、生成订单、订单列表、订单详情这些核心页面。购物车流程可以做成用户把商品加入购物车购物车列表里可以修改数量、删除条目然后结算生成一个订单。支付这块不建议接真实支付接口做一个模拟支付的按钮就可以了因为大部分课程设计并不要求真的对接支付宝微信而且沙箱环境的审核流程反而会耽误时间。后台管理面向管理员包括商品管理、商品分类管理、用户管理、订单管理。管理员登录后可以新增商品、编辑商品信息、上下架商品、管理分类、查看所有订单并修改订单状态。订单状态一般就四个待付款、待发货、待收货、已完成。后台页面风格可以做得朴素一点重点是功能完整、操作逻辑清晰。1.3 工程结构提前规划好Maven工程的目录结构建议按以下方式组织后面写代码会顺手很多ssm-shop/ ├── pom.xml ├── src/main/java │ ├── com.shop.controller │ ├── com.shop.service │ ├── com.shop.service.impl │ ├── com.shop.mapper │ ├── com.shop.entity │ └── com.shop.common ├── src/main/resources │ ├── jdbc.properties │ ├── mybatis-config.xml │ ├── applicationContext.xml │ ├── spring-mvc.xml │ └── mapper └── src/main/webapp ├── WEB-INF │ ├── web.xml │ ├── jsp │ └── lib ├── static └── index.jspController只管接收参数和返回视图Service接口定义业务方法ServiceImpl写具体逻辑Mapper接口定义数据库方法XML文件写SQL语句。这种分层方式能让项目结构清晰老师提问答辩的时候也好解释。entity包对应数据库的表结构common包放分页工具类、统一返回结果之类的公共类。2. 核心业务模块与数据库设计2.1 表结构设计是商城的命根子商城项目的核心其实不在代码在数据表怎么设计。我的建议是不要动不动搞七八张表一张表只负责一件事关系要清楚。下面这套表结构是我实际用过、改过多次以后觉得比较稳的版本。用户表user字段名类型说明idint主键自增usernamevarchar(50)用户名唯一passwordvarchar(100)密码MD5加密后存储phonevarchar(20)手机号emailvarchar(50)邮箱roleint角色1表示管理员0表示普通用户create_timedatetime注册时间密码千万不能存明文。项目里可以用MD5做一次摘要简单点的写法是DigestUtils.md5DigestAsHex(password.getBytes())虽然MD5强度一般但应付课程设计绰绰有余。如果你想加分可以加盐比如用户名和密码拼接后再做摘要这样即使两张表的MD5值相同也不会被直接对比出来。商品分类表category字段名类型说明idint主键namevarchar(50)分类名称sortint排序权重分类表不用设计成无限极分类网上购物商城用一级分类就够了比如手机数码、服饰鞋包、食品生鲜。如果需要二级分类再加一个parent_id字段但查询会复杂不少不建议课程设计阶段这么搞。商品表product字段名类型说明idint主键namevarchar(100)商品名称descriptiontext商品描述pricedecimal(10,2)商品价格stockint库存数量imagevarchar(255)图片URLcategory_idint所属分类IDstatusint1上架 0下架create_timedatetime上架时间价格字段一定要用decimal而不是float或double。浮点数在计算金额的时候会出现0.1加0.2不等于0.3的问题这在订单金额计算中是绝对不能接受的。商品图片只保存路径不保存二进制数据图片文件放到服务端指定目录或者干脆放到一个静态资源目录下面JSP页面通过路径引用。购物车表cart字段名类型说明idint主键user_idint用户IDproduct_idint商品IDquantityint数量购物车有两种实现方式一种是纯Session实现用户未登录也能加购物车但换浏览器就丢另一种是存入数据库用户登录后购物车持久化。我建议用数据库方式因为后续订单流程更好对接而且答辩时有底气说“购物车数据是持久化的不会因为Session过期而丢失”。订单表orders字段名类型说明idint主键order_novarchar(32)订单编号user_idint下单用户IDtotal_pricedecimal(10,2)总金额statusint订单状态receiver_namevarchar(50)收货人receiver_phonevarchar(20)收货电话receiver_addressvarchar(255)收货地址create_timedatetime下单时间订单明细表order_item字段名类型说明idint主键order_idint关联订单IDproduct_idint商品IDproduct_namevarchar(100)商品名称快照product_pricedecimal(10,2)商品价格快照quantityint购买数量订单明细表里存商品名称和价格的快照很重要。商品改价是常有的事如果订单明细只存product_id回头查历史订单时价格和名称全都变了对账根本对不上。快照的意义就是让历史订单永远保持下单那一刻的真实信息。2.2 订单编号的生成方案订单编号一般有一个经典格式时间戳加随机数。直接拿当前时间拼一个随机四位数是常见做法。更好的方式是采用年月日时分秒加用户ID再加随机数保证同一用户在同一秒内不会重复。用SimpleDateFormat格式化当前时间拼上去就行。有人想用UUIDUUID作为订单编号的问题是没有规律用户看不懂而且字符串太长不建议用于这种展示场景。订单生成过程里有一个很重要的概念叫“数据一致性”。你下单时要做两件事往订单表插一条数据同时扣减商品库存。如果插订单成功但扣库存失败就会出大问题订单有了库存没减超卖就发生了。解决方式是在Service层的下单方法上加事务注解让这两步操作要么全部成功要么全部回滚。Spring里对事务的管理非常成熟Transactional注解加在方法上出现RuntimeException时自动回滚。这就是“保证数据一致性”的一个典型落地场景。3. 关键代码实现与踩坑记录3.1 登录验证与拦截器系统的登录逻辑不复杂复杂的是“有些页面必须登录才能访问”。后台管理的所有页面、前台的购物车和结算页面都应该校验用户是否登录。这里最优雅的做法是定义SpringMVC的HandlerInterceptor在请求进入Controller之前做校验而不是在每个Controller里复制粘贴判断用户是否为空的那几行代码。写一个LoginInterceptor类实现HandlerInterceptor接口在preHandle方法里从Session里取登录用户对象如果为空就重定向到登录页不为空就放行。后台管理还可以再加一个权限判断检查用户role字段是否为1不是管理员就拒绝访问。然后在spring-mvc.xml里用mvc:interceptors标签配置拦截路径比如/admin/**和/cart/**这些路径走拦截器/login和/register不拦截。这个过程是SSM项目里非常经典的一个练习点做好了整个项目的框架感会强很多。这里有个容易踩的坑页面跳转用重定向还是转发要想清楚。登录成功后用return redirect:/product/list因为如果使用转发浏览器地址栏还会停留在登录路径此时用户刷新页面就会重复提交表单体验很差。重定向是浏览器重新发起一次GET请求刷新也不会重复提交。3.2 购物车下单选型与库存校验进入结算页面后点击提交订单Controller接收购物车数据Service层做这几件事生成订单编号。根据用户ID查出购物车条目。循环遍历购物车条目逐个校验商品库存是否足够。库存足够就生成订单明细记录同时扣减库存。计算订单总金额。插入订单表。清空购物车。这个流程里最容易出问题的就是库存校验和扣减不是原子的。如果你先查出库存判断够然后扣库存这中间如果有两个用户同时下单就可能都判断库存够然后都扣减成功导致超卖。处理方式在课程设计阶段可以简单一点在扣减库存的SQL语句里加上库存大于等于购买数量的条件update idreduceStock UPDATE product SET stock stock - #{quantity} WHERE id #{productId} AND stock gt; #{quantity} /updateSQL执行后返回影响行数如果影响行数为0说明库存不足或商品不存在此时抛出异常事务回滚用户看到“库存不足”的提示。这种方式叫乐观锁思路不用真的去锁表简单有效。下单方法加上Transactional注解后事务回滚的同时也要注意异常要抛到Controller层才能被捕获到并提示给用户。如果你在Service里把异常catch掉了然后返回一个对象事务不会回滚这是个很隐蔽的坑。正确写法是Service方法里不捕获异常让它在Controller层统一处理spring的事务代理才能感知到异常并触发回滚。3.3 MyBatis动态SQL在商品筛选中的应用商品列表页一般会有搜索和分类筛选功能甚至多条件组合查询。比如搜索关键词加上分类ID再加上排序方式这时候用MyBatis的动态SQL处理是最舒服的。select idsearchProducts resultTypecom.shop.entity.Product SELECT * FROM product where if testkeyword ! null and keyword ! AND name LIKE CONCAT(%, #{keyword}, %) /if if testcategoryId ! null AND category_id #{categoryId} /if AND status 1 /where if testsort price_asc ORDER BY price ASC /if if testsort price_desc ORDER BY price DESC /if /selectwhere标签会自动处理掉第一个条件前面的多余AND很省心。排序字段这里没有直接拼SQL而是用条件判断选择了固定的排序方式可以有效避免SQL注入。这是一个值得写进博客的细节任何从用户端传进来的参数都不能直接拼接到SQL语句里要么用#{}占位符绑定参数要么像这里一样用逻辑分支映射到固定的SQL片段。3.4 分页查询的实现方式商品列表和订单列表的数据量通常不会太大但分页是必须做的因为这几乎是每个答辩老师都会问的高频问题。分页实现有两种思路一种是自己用MyBatis的RowBounds这个本质上是内存分页数据量大了性能很差另一种是使用PageHelper插件一行代码搞定物理分页。PageHelper的使用方式是在查询前调用PageHelper.startPage(pageNum, pageSize)然后紧接着执行Mapper查询PageHelper会通过拦截器自动改写SQL追加LIMIT语句。查询结果拿到以后再创建一个PageInfo对象里面封装了总记录数、总页数、当前页等所有分页所需数据JSP页面直接遍历显示。这是目前SSM项目通用的方案强烈推荐直接使用不要自己手写分页工具类。JSP页面里分页导航栏需要我们自己写用c:forEach循环生成页码链接控制好当前页的高亮样式。首尾加“上一页”“下一页”按钮参数里带上pageNumController通过RequestParam(defaultValue 1)接收当前页没有传参时默认第一页。3.5 JSP页面渲染必须知道的事JSP这套技术在当前环境下可以说是越用越少了但既然用了就一定要用对。第一页面最顶部需要声明% page contentTypetext/html;charsetUTF-8 languagejava %否则会以ISO-8859-1编码渲染中文全部乱码这是最常见的低级错误。第二JSP页面里用EL表达式${}输出变量用JSTL标签库的c:forEach循环遍历列表。这里有一个坑如果你忘了在页面顶部引入JSTL标签库% taglib prefixc urihttp://java.sun.com/jsp/jstl/core %那么页面里的c:forEach全部不会被解析直接以文本形式显示在页面上。而且要注意JSTL的uri在不同Tomcat版本里可能略有差异通常那串标准的http地址是通用的。第三EL表达式取不到值的排查思路。当你在Controller里往Model里放了一个listJSP里却怎么都取不到的时候大概率是以下三种情况之一Controller返回的视图名称拼错了或者值确实为null再或者页面里变量名和model里放的名字不一致。调试的时候可以在JSP页面里直接写一行${xxx}加在页面顶部如果显示空字符就是后端没有放进model如果显示原样字符串就是EL解析没生效后者多半是web.xml版本声明太低。Servlet 2.5及以下的web.xml不默认开启EL需要检查web.xml头部声明是否用了Servlet 4.0或3.1的版本。4. 项目打包部署与老项目迁移4.1 传统JSP项目打包War的正确打开方式课程设计交上去的东西最后肯定要能跑起来这就涉及打包部署。JSP项目现在虽然可以用Spring Boot内嵌Tomcat启动但传统SSM项目不推荐这么做。最稳妥的做法是打成War包丢到一个独立的Tomcat里跑。如果用IDEA打包在Maven侧边栏的Lifecycle里执行clean然后执行package如果pom.xml里配置了合适打包插件和依赖就能在target目录下生成一个War包。需要注意的地方是pom.xml里的finalName配置决定生成的War包名称部署时这个名称就是访问路径的上下文。如果配置的是shop.war启动后访问地址就是http://localhost:8080/shop/。4.2 源发行版17需要目标发行版17的警告如何处理这个报错出现的频率非常高尤其是在新电脑上装了JDK 17而项目用的还是老代码的情况下。报错信息是“java: 警告: 源发行版 17 需要目标发行版 17”实际含义是编译时使用了当前JDK的版本和Maven编译器插件默认指定的老版本冲突了。处理方式是确认代码里那些java.version的配置或者直接在pom.xml里指定编译插件的source和targetplugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.8.1/version configuration source1.8/source target1.8/target encodingUTF-8/encoding /configuration /plugin同时也要保证project.build.sourceEncoding是UTF-8否则编译阶段特殊字符可能出问题。JDK版本统一这件事越早做越好否则各种奇怪的编译问题会浪费大量时间。4.3 Nginx能不能解析JSP页面部署架构里常有同学问Nginx能像Tomcat一样直接跑JSP吗。这里说清楚Nginx本身只能处理静态资源和反向代理它不具备解析JSP的能力。JSP本质上是一个Java动态页面必须由Tomcat这种Servlet容器渲染成HTMLNginx才能把最终结果返回给浏览器。实际部署时的架构是Nginx监听80端口静态资源例如图片、CSS和JS文件直接由Nginx返回带有.jsp的请求反向代理到Tomcat的8080端口。Nginx配置片段大致如下location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location ~* \.(css|js|jpg|png|gif)$ { root /opt/shop/static; expires 7d; }这种架构能明显降低Tomcat的静态资源压力也是实际生产环境比较常见的做法。但如果你只是做课程设计一台Tomcat把静态资源和JSP一起处理好完全够了不需要为了炫技引入Nginx。4.4 老项目想升级到Spring Boot的话从哪里改有不少人做完SSM项目之后会想尝试把它改造成Spring Boot版本或者毕业论文里写一句“本项目采用SSM架构可扩展性强”。但如果真要改造需要明确几个差异点Spring Boot里JSP支持是需要额外配置的默认推荐的是Thymeleaf模板引擎。如果一定要沿用JSP需要在application.properties里设置spring.mvc.view.prefix/WEB-INF/jsp/和spring.mvc.view.suffix.jsp而且JSP必须放在src/main/resources/META-INF/resources或src/main/webapp目录下打包方式也必须是War而不是Jar因为Jar包内嵌容器无法直接渲染JSP。这个坑实操过就知道Spring Boot对JSP的适配一直比较别扭建议新代码直接用Thymeleaf或者前后端分离。MyBatis的Mapper接口和XML文件在Spring Boot里不需要配置mapperLocations也能自动扫描前提是XML文件放在resources/mapper目录下并配置好mybatis.mapper-locationsclasspath:mapper/*.xml。事务那块用EnableTransactionManagement开启注解事务使用方式和SSM里完全一致。5. 常见问题与排错实录5.1 高频报错速查表报错/现象原因解决方案页面中文显示乱码JSP页面编码或请求/响应编码未设置页面顶部声明UTF-8SpringMVC配置CharacterEncodingFilterc:forEach标签原样显示缺少JSTL标签库引入JSP顶部加taglib指令数据显示不出来Model里的变量名与页面EL表达式不一致对比Controller中addObject的第一个参数名和页面${}里的名字启动时提示找不到Mapper beanMapper接口未扫描或XML未加载检查applicationContext.xml中mappger扫描配置确认接口加了Mapper注解500错误且控制台显示Invalid bound statementMapper接口方法在XML中未定义对应的statementmapper XML的namespace必须全限定接口名方法id必须匹配下单后库存没扣减事务未生效或SQL条件不对Service方法加TransactionalSQL带stock#{quantity}条件表单重复提交登录或下单成功后用了转发改成重定向redirect:/xxx上传图片后页面不显示图片静态路径未映射配置resources映射或者图片放到webapp下固定目录源发行版17警告JDK版本和编译插件版本不一致pom中强制source/target为1.8War包部署后404上下文路径和路径不对确认War包名称通过http://ip:8080/warname/访问还有几个看起来奇怪但原因简单的现象记录一下。页面样式丢失多半是项目用了相对路径引用CSS而当前URL层级比较深相对路径算出来的位置不对。解决方式是使用${pageContext.request.contextPath}拼接绝对路径。多模块项目里找不到类通常是因为父工程没有引入子模块的依赖或者在同一个模块里缺少另一个模块的依赖声明。检查pom.xml里dependency有没有把其他模块加进去。5.2 调试技巧实录Maven项目里常见一个现象明明改了代码重新部署后还是老样子。这时先Clean再Package然后强力刷新页面缓存同时确认Tomcat的部署目录里是不是真的替换了War包。有时候Tomcat处于运行状态时你手动复制War文件覆盖解压目录还是旧的需要停掉Tomcat后删除work目录和webapps下的解压目录再启动。数据库连接相关的问题也容易卡住。启动时报错Access denied for user rootlocalhost基本就是jdbc.properties里边用户名密码不对或者权限不够用命令行能连上不代表Java能连上检查URL里的ip端口是不是localhostMySQL默认端口3306如果是其他端口一定要显式写。还有一类问题是“本地好好的部署到服务器上就404或500”。绝大部分原因是Linux服务器的文件路径大小写敏感以及数据库的字符集和本地不一致。本地Windows不区分大小写服务器上该大写就大写该小写就小写尤其是部署目录。数据库字符集一定要在建库时指定utf8mb4否则中文数据插入时就报encoding错误。6. 这个项目还能怎么扩展SSM商城做完之后如果你想在答辩或者简历里多写一点亮点有几个方向可以低价成本扩展。商品搜索方面当前是SQL的模糊查询你可以扩展成全文检索把商品数据同步到Elasticsearch搜索接口走ES但课程设计阶段不建议做涉及的成本和复杂度会明显上升。图片存储方面目前是存服务器本地路径你可以换成对象存储把图片上传接口改成先传到云OSS再返回URL代码改动其实不大就是在上传工具类里换一个客户端但看起来很加分。缓存方面首页那些热门商品、分类导航这种变化不频繁的数据可以引入Redis做缓存查询时先查Redis没有再查数据库同时把数据回填进缓存。Cache Aside Pattern这套逻辑在面试里也经常被问到。消息通知方面下单或者库存不足的时候发个邮件提醒用Spring自带的JavaMailSender就能实现。这些功能每做一样都不复杂但组合起来整个项目的完整度会高很多。我个人做这类项目最有体会的一点是不要想着把所有功能都堆上去把核心链路做扎实把表结构设计清楚把你的每一个设计理由想明白比多写几个花里胡哨的功能有用得多。答辩老师最喜欢问的其实就是“为什么这么设计”你能把每个选择背后的原因讲得头头是道这个项目就成功了一大半。

相关新闻

断网3年、营收反创54亿:老干妈的“离线运营“与“在线制造“实验

断网3年、营收反创54亿:老干妈的“离线运营“与“在线制造“实验

【摘要】社媒停更近3年的老干妈,2025年营收冲上54亿元历史峰值,关键工序产品不良率降至0.02%。拆解其“离线运营在线制造”双轨实践:AI视觉质检系统将拣椒岗位从600个压缩至48个,电商渠道占比不足5%成为收缩线上运营的核心决策依据…

2026/10/12 6:57:02 阅读更多 →
中文科研利器:从PDF拆解到PPT生成的三工具自动化流水线

中文科研利器:从PDF拆解到PPT生成的三工具自动化流水线

最近在整理自己课题组的工作流时,我发现了一个特别扎心的现象:市面上几乎所有的科研辅助工具,都是先为英文场景设计的。中文论文的PDF解析、中文术语的实体识别、中文实验记录的语义检索,甚至组会PPT里的中文排版,每一…

2026/10/12 6:56:02 阅读更多 →
实测9款AI论文写作工具:从选题到答辩谁最值得用?

实测9款AI论文写作工具:从选题到答辩谁最值得用?

又是一年毕业季,朋友圈里哀嚎一片。写论文这事儿,从选题、文献综述到初稿润色,每个环节都像在渡劫,再加上现在不少学校对AI使用的规定越来越严,人人都想问一句:AI写论文到底能不能用?哪个最好用…

2026/10/12 6:56:02 阅读更多 →

最新新闻

本地ComfyUI生成AI漫剧:从整合包安装到批量出片的完整方案

本地ComfyUI生成AI漫剧:从整合包安装到批量出片的完整方案

前两天一个做短视频的朋友跑来问我:网上那些AI漫剧到底是怎么做出来的?他试了好几个能生成视频的网页,几分钟就烧掉几十块,充值按钮还老在眼前晃,生成次数也卡得死死的。我直接把我自己在用的一套本地方案丢给了他&…

2026/10/12 8:24:00 阅读更多 →
面试六分钟速败?拆解高频变态问题背后的考察逻辑与应对技巧

面试六分钟速败?拆解高频变态问题背后的考察逻辑与应对技巧

10点预约的面试,10点06我已经坐在公司楼下的便利店捧着冰美式发呆,手里攥着被汗水浸皱的简历。前后不到一支烟的时间就结束了战斗,快到我甚至在怀疑自己是不是走错了楼层。但那六分钟里,面试官抛出的问题,每一句都让我…

2026/10/12 8:24:00 阅读更多 →
哈希洪荒攻击:当HashMap变成性能炸弹

哈希洪荒攻击:当HashMap变成性能炸弹

1. 这不是密码学课,是给你讲个能听懂的“快递站爆仓”故事你有没有经历过这种场景:小区门口突然堆满快递,不是因为双十一大促,而是有人用同一张收货单——反复写了1000遍“3栋2单元501”,然后一股脑全塞进快递柜。柜子…

2026/10/12 8:24:00 阅读更多 →
网络最大流算法详解:从EK到Dinic的模板题实战指南

网络最大流算法详解:从EK到Dinic的模板题实战指南

1. 从零理解网络最大流:为什么这道模板题值得反复琢磨很多人第一次在算法题库里刷到“网络最大流”这个标签时,反应都差不多——看了一遍定义,觉得好像懂了,真上手写代码,发现连样例都过不去。我当年也是这样&#xff…

2026/10/12 8:24:00 阅读更多 →
混合发电系统协同调度优化:风电、光热与热电联产建模实战

混合发电系统协同调度优化:风电、光热与热电联产建模实战

凌晨两点,值班室里的风功率预测曲线开始往上翻,光热电站的储热罐温度却已经降到了下限附近,而热电联产机组正被热网指令压着电出力——一边是风电想满发,一边是热用户等着供热,白天攒下来的光热余量还没放干净。这个场…

2026/10/12 8:24:00 阅读更多 →
6G显存也能跑ComfyUI反推与提示词直出:本地部署与避坑指南

6G显存也能跑ComfyUI反推与提示词直出:本地部署与避坑指南

最近折腾 ComfyUI 的花样越来越多,有人拿它做修图,有人拿它跑写真,但我被问得最多的问题是:“只有 6G 显存,能本地玩反推和提示词直出吗?”答案是能,而且比你想象中稳。这篇记录基于我反复装了三…

2026/10/12 8:22:59 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器: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 阅读更多 →