ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

SSM框架化妆品销售系统搭建与毕设实战指南

SSM框架化妆品销售系统搭建与毕设实战指南 简介本资源是一套基于SSMSpringSpringMVCMyBatis框架开发的化妆品销售网站完整毕设项目专为计算机相关专业本科生毕业设计及Java初学者实战训练打造覆盖从环境搭建、功能实现到数据库部署的全流程闭环。压缩包共3个文件1个SQL建库脚本、1个含源码的ZIP包、1个项目说明TXT总大小24.08MB结构精炼、开箱即用SQL脚本可直接导入MySQL初始化数据ZIP包内含完整前后端代码与配置文件TXT文档清晰说明运行依赖与调试要点。已有1192人学习下载项目功能完备前台支持用户注册登录、商品浏览/收藏/下单/评论等核心电商流程后台提供用户、商品、订单、公告等多维度管理能力界面简洁、逻辑清晰、调试通过率高适合作为毕设答辩原型或Java Web技术栈综合实践范例。1. 为什么一个“基于SSM的化妆品销售网站”仍是计算机专业毕设的高性价比选择很多同学在开题时看到“Spring Boot”“Vue3”“微服务”就下意识觉得SSM过时了但现实是在高校毕设评审场景中一个结构清晰、功能完整、数据库设计合理、能本地稳定运行的SSM项目比一个部署失败三次、接口返回500、连登录页都报404的Spring BootRedisES堆砌项目更容易通过答辩、获得高分。这不是技术倒退而是教育场景下的理性选择——SSMSpring Spring MVC MyBatis三层架构边界明确各层职责解耦学生能亲手写DAO接口、配XML映射、调通Controller跳转、理解事务传播行为而不是靠MapperScan和RestController一键生成后对着报错日志发呆。尤其对化妆品这类商品属性丰富品牌、功效、适用肤质、成分、保质期、订单状态流转明确待付款→已付款→已发货→已完成→已评价、后台管理需兼顾商品上下架与促销配置的业务SSM的显式配置反而让逻辑可追溯、问题可定位。本文不讲理论套话只聚焦如何用最简路径把这套系统从源码拉起、数据库跑通、前后端联调成功并避开90%同学踩过的坑——比如MyBatis动态SQL拼接错误导致SQL注入警告、Spring MVC视图解析器路径配置错位导致404、MySQL时区设置引发库存扣减时间戳异常等。2. 搭建SSM环境与运行项目源码的最小可行步骤2.1 环境版本确认与工具链准备SSM项目对JDK、Tomcat、IDEA、MySQL版本有隐性兼容要求。根据近3年高校实验室主流配置及源码常见依赖推荐组合如下组件推荐版本说明JDK1.8.0_291 或 OpenJDK 8u362SSM核心库如spring-4.3.x未完全适配JDK17的模块化特性强制升级易触发java.lang.NoClassDefFoundError: javax/xml/bind/JAXBContextIDEA2021.3.3 或 2022.3.3避免2023.x版本因Maven插件变更导致pom.xml中scopeprovided/scope依赖无法识别Tomcat8.5.94Tomcat 9默认启用HTTP/2部分SSM项目中的web.xml未声明metadata-completetrue会触发Servlet 3.0扫描冲突MySQL5.7.42MySQL 8.0默认caching_sha2_password认证插件SSM项目中jdbc:mysql://连接URL若未显式指定?serverTimezoneGMT%2B8useSSLfalseallowPublicKeyRetrievaltrue将报Access denied for user提示不要直接下载最新版工具。打开IDEA → Help → About → 查看Build号匹配对应版本的JDKMySQL安装包选择mysql-5.7.42-winx64.zipWindows或mysql-5.7.42-macos12-x86_64.dmgmacOS避免使用Homebrew一键安装的MySQL 8。2.2 导入项目到IDEA并修正Maven依赖假设你已从资源包中解压出cosmetics-ssm文件夹其结构含src/main/java、src/main/resources、WebContent/WEB-INF/web.xml等标准目录启动IDEA →Open→ 选择cosmetics-ssm根目录等待Maven自动导入若未触发右键pom.xml→Maven→Reload project检查pom.xml中关键依赖版本是否匹配!-- 必须确认以下三组版本协同 -- properties spring.version4.3.29.RELEASE/spring.version mybatis.version3.4.6/mybatis.version mybatis-spring.version1.3.2/mybatis-spring.version /properties若出现Cannot resolve symbol xxx检查Project Structure→Project Settings→Project→Project SDK是否指向JDK 1.8Project language level是否为8 - Lambdas, type annotations etc.关键修复pom.xml中build节点内必须包含finalNamecosmetics/finalName否则打包WAR后访问路径为http://localhost:8080/cosmetics-1.0/而非预期的/cosmetics/2.3 配置Tomcat Server并启动验证Run→Edit Configurations→→Tomcat Server→LocalApplication server选择已配置的Tomcat 8.5路径Deployment选项卡 →→Artifact→ 选择cosmetics:war exploded注意不是cosmetics:warApplication context填写/cosmetics与pom.xml中finalName一致点击OK→ 点击绿色三角形启动观察控制台输出重点确认三行日志INFO: Initializing Spring FrameworkServlet springmvc INFO: Mapped URL path [/user/**] onto handler userController INFO: Starting ProtocolHandler [http-nio-8080]若出现Caused by: java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet说明spring-webmvc.jar未打入WEB-INF/lib需检查Maven依赖范围是否误设为scopetest/scope。3. 数据库脚本执行与关键表结构解析3.1 使用IDEA导出并执行数据库脚本源码包中的sql/cosmetics_db.sql通常包含建库、建表、初始化数据三部分。手动执行易遗漏SET FOREIGN_KEY_CHECKS0;导致外键约束报错推荐用IDEA内置数据库工具View→Tool Windows→Database→→Data Source→MySQL填写Host: localhost,Port: 3306,Database: (empty),User: root,Password: your_password连接成功后右键SCHEMAS→New Schema→ 输入cosmetics_db右键新建的cosmetics_db→New→SQL File→ 将cosmetics_db.sql内容粘贴进去全选SQL → 右键 →Execute或按CtrlEnter注意若脚本中含CREATE DATABASE IF NOT EXISTS cosmetics_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;执行前需先在IDEA Database窗口中手动创建同名Schema否则报Unknown database cosmetics_db。3.2 核心表字段设计意图与业务约束化妆品销售场景下product商品、order订单、user用户三张表是业务主干。源码脚本中关键字段设计体现业务逻辑表名字段名类型约束业务含义与SSM实现关联点productbrand_idINTFK →brand.id品牌需单独维护SSM中ProductService查询商品时需JOIN brandMyBatis XML中用association映射Brand对象productshelf_statusTINYINT(1)DEFAULT 11上架0下架。Controller层ProductController.updateShelfStatus()接收参数后MyBatis执行UPDATE product SET shelf_status #{status} WHERE id #{id}orderpay_statusTINYINT(1)DEFAULT 00未支付1已支付2已退款。事务控制关键点用户支付成功后需同时更新order.pay_status1且扣减product.stockSSM中用Transactional保证原子性userreg_timeDATETIMEDEFAULT CURRENT_TIMESTAMPMySQL 5.7支持DEFAULT CURRENT_TIMESTAMP但SSM中UserMapper.insert()方法若未在XML中配置useGeneratedKeystrue则插入后user.getId()返回0需检查insert标签属性3.3 验证数据库连接与MyBatis映射修改src/main/resources/jdbc.properties确保数据库连接正确jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/cosmetics_db?useUnicodetruecharacterEncodingutf8serverTimezoneGMT%2B8 jdbc.usernameroot jdbc.password123456然后在src/test/java下新建测试类RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(locations {classpath:spring/spring-dao.xml, classpath:spring/spring-service.xml}) public class ProductDaoTest { Autowired private ProductMapper productMapper; Test public void testSelectById() { Product product productMapper.selectById(1); assertNotNull(product); // 断言商品存在 assertEquals(雅诗敦, product.getBrandName()); // 断言品牌名正确 } }若测试失败检查spring-dao.xml中bean idsqlSessionFactory的configLocation是否指向classpath:mybatis/mybatis-config.xml且该文件中mappers节点是否包含mapper resourcemapper/ProductMapper.xml/。4. 前后端联调与典型页面功能验证4.1 登录与用户权限路由控制SSM项目中用户登录流程为LoginController接收username/password→ 调用UserService.login()→UserMapper.selectByUsername()查询数据库 → 比对密码明文或MD5→ 设置Session → 重定向至首页。验证步骤启动Tomcat后访问http://localhost:8080/cosmetics/login.jsp输入数据库user表中已存在的账号如admin/123456成功后应跳转至/cosmetics/index.jsp且页面顶部显示“欢迎admin”若登录后仍停留在login.jsp检查LoginController中重定向代码// 正确写法返回字符串redirect:/index.jsp由Spring MVC视图解析器处理 return redirect:/index.jsp; // 错误写法返回index.jsp会被解析为逻辑视图名找不到对应JSP return index.jsp;4.2 商品列表分页与搜索功能调试化妆品网站需支持按品牌、功效、价格区间筛选。源码中ProductController.list()方法通常接收pageNum、pageSize、brandId等参数RequestMapping(/list) public String list(RequestParam(defaultValue 1) Integer pageNum, RequestParam(defaultValue 10) Integer pageSize, RequestParam(required false) Integer brandId, Model model) { PageHelper.startPage(pageNum, pageSize); // PageHelper插件开启分页 ListProduct products productService.listByBrand(brandId); PageInfoProduct pageInfo new PageInfo(products); model.addAttribute(pageInfo, pageInfo); return product/list; // 对应WebContent/WEB-INF/jsp/product/list.jsp }验证方法访问http://localhost:8080/cosmetics/product/list?brandId2假设品牌ID2为“兰蔻”检查返回HTML中c:forEach items${pageInfo.list} varp是否渲染出兰蔻商品若无数据用MySQL客户端执行SELECT * FROM product WHERE brand_id 2;确认数据存在4.3 订单提交与库存扣减事务验证这是SSM项目中最易出错的环节。用户下单时需完成① 创建订单记录 ② 扣减对应商品库存 ③ 更新订单状态。三步必须在同一个事务中在OrderService.createOrder()方法上添加Transactional方法内先调用orderMapper.insert(order)再调用productMapper.reduceStock(productId, quantity)reduceStock对应的SQL必须为UPDATE product SET stock stock - #{quantity} WHERE id #{id} AND stock #{quantity}WHERE条件中stock #{quantity}是防止超卖的关键验证超卖防护在MySQL中执行UPDATE product SET stock 5 WHERE id 1;设商品ID1库存为5使用JMeter或Postman并发发送10次下单请求商品ID1数量3查询SELECT stock FROM product WHERE id 1;结果应为25-3而非负数5. SSM项目毕设答辩前的5个硬核优化点5.1 日志输出规范化替换System.out为SLF4J源码中大量System.out.println(xxx)在答辩演示时会暴露调试痕迹且无法分级控制。统一替换为SLF4J在pom.xml中添加依赖dependency groupIdorg.slf4j/groupId artifactIdslf4j-log4j12/artifactId version1.7.32/version /dependency在每个Service类顶部声明Loggerprivate static final Logger logger LoggerFactory.getLogger(UserService.class);替换所有System.out.println(用户登录成功)为logger.info(用户{}登录成功IP地址{}, username, request.getRemoteAddr());在src/main/resources/log4j.properties中配置log4j.rootLoggerINFO, stdout, file log4j.appender.file.File${catalina.home}/logs/cosmetics.log log4j.appender.file.layout.ConversionPattern%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1} - %m%n提示答辩时展示cosmetics.log文件中清晰的INFO/WARN日志比控制台滚动的System.out更显工程素养。5.2 静态资源分离将CSS/JS/JPG移出WEB-INF源码中WebContent/WEB-INF/css/路径会导致浏览器无法加载样式WEB-INF下资源受Servlet容器保护。必须调整在WebContent目录下新建css/、js/、images/文件夹与WEB-INF同级将原WEB-INF/css/中所有文件剪切至WebContent/css/修改index.jsp中引用路径!-- 错误 -- link relstylesheet href${pageContext.request.contextPath}/WEB-INF/css/bootstrap.min.css !-- 正确 -- link relstylesheet href${pageContext.request.contextPath}/css/bootstrap.min.css在spring-mvc.xml中添加静态资源映射mvc:resources mapping/css/** location/css/ / mvc:resources mapping/js/** location/js/ / mvc:resources mapping/images/** location/images/ /5.3 数据库连接池升级HikariCP替代DBCP源码中spring-dao.xml常用BasicDataSourceApache DBCP但其连接泄漏检测弱。替换为HikariCPpom.xml中排除旧依赖添加新依赖exclusion groupIdcommons-dbcp/groupId artifactIdcommons-dbcp/artifactId /exclusion dependency groupIdcom.zaxxer/groupId artifactIdHikariCP/artifactId version3.4.5/version /dependencyspring-dao.xml中替换数据源Beanbean iddataSource classcom.zaxxer.hikari.HikariDataSource destroy-methodclose property namedriverClassName value${jdbc.driver} / property namejdbcUrl value${jdbc.url} / property nameusername value${jdbc.username} / property namepassword value${jdbc.password} / property nameconnectionTimeout value30000 / property namemaximumPoolSize value20 / /bean启动后观察日志HikariPool-1 - Starting...表明生效且连接池监控指标如HikariPool-1 - Pool stats可验证性能提升。5.4 安全加固CSRF防护与XSS过滤毕设系统虽不对外网开放但答辩演示时需体现安全意识在web.xml中启用Spring Security CSRF轻量级filter filter-namespringSecurityFilterChain/filter-name filter-classorg.springframework.web.filter.DelegatingFilterProxy/filter-class /filter filter-mapping filter-namespringSecurityFilterChain/filter-name url-pattern/*/url-pattern /filter-mapping在spring-security.xml中配置security:http security:csrf / !-- 启用CSRF -- security:intercept-url pattern/admin/** accessROLE_ADMIN / /security:http对用户输入内容做XSS过滤在ProductController.add()中对product.getName()调用StringEscapeUtils.escapeHtml4()需引入commons-textproduct.setName(StringEscapeUtils.escapeHtml4(product.getName()));注意答辩时可现场演示在商品名称输入框中输入scriptalert(1)/script提交后页面仅显示文本而非弹窗证明XSS防护有效。5.5 性能瓶颈定位使用JVisualVM分析内存与线程当系统响应变慢如商品列表加载超2秒用JDK自带工具诊断启动Tomcat后打开终端执行jvisualvm左侧Local进程列表中双击org.apache.catalina.startup.Bootstrap切换到Monitor标签页点击Heap Dump生成堆快照在快照中搜索org.mybatis.spring.SqlSessionTemplate查看实例数是否持续增长泄露迹象切换到Threads标签页点击Thread Dump查找WAITING状态线程是否集中在org.apache.ibatis.executor.statement.RoutingStatementHandlerSQL执行阻塞若发现MyBatis一级缓存未命中率过高可在mybatis-config.xml中开启二级缓存settings setting namecacheEnabled valuetrue/ /settings mapper namespacecom.cosmetics.mapper.ProductMapper cache evictionLRU flushInterval60000 size1024 readOnlytrue/ /mapper重启后对比商品列表响应时间通常可提升30%以上。本文还有配套的精品资源点击获取
返回列表