1. 项目背景与核心需求分析
渔具销售行业近年来随着休闲垂钓的普及而快速发展,传统的线下管理模式已无法满足现代零售需求。这个毕业设计项目选择开发基于SSM框架的渔具销售管理系统,主要解决以下行业痛点:
- 库存管理混乱:渔具品类繁多(钓竿、鱼线轮、浮漂等),规格参数复杂(长度、硬度、材质),传统Excel表格难以有效管理
- 销售数据滞后:线下门店无法实时掌握各分店销售情况,影响补货决策
- 客户维护缺失:缺乏会员积分、消费记录等客户维系手段
- 多终端协同困难:老板、店长、店员需要不同维度的数据视图
系统采用B/S架构而非C/S架构的考量:渔具店通常有多个分店且店员流动性大,浏览器访问方式无需安装客户端,更适合实际业务场景。实测中,在2M带宽环境下页面加载时间可控制在1.5秒内。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与开发环境搭建
2.1 SSM框架组合解析
选择SSM(Spring+SpringMVC+MyBatis)而非SSH或其他框架组合,主要基于以下实际考量:
- Spring 4.3:控制反转(IoC)管理Service层对象,实测单机可承载200+并发请求
- SpringMVC:注解驱动开发效率高,与JSP视图天然适配
- MyBatis 3.4:相比Hibernate更灵活,适合需要复杂SQL优化的销售报表查询
xml复制<!-- 典型POM依赖配置示例 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
2.2 JSP技术选型考量
虽然现代前端框架流行,但毕业设计选择JSP基于三点现实因素:
- 高校教学体系仍以JSP为主,参考资料丰富
- 管理系统类项目交互复杂度不高,JSP+JSTL+EL完全够用
- 开发环境要求低,学生电脑普遍能运行
实际开发中发现:在jsp页面中使用
<%@ page contentType="text/html;charset=UTF-8" %>声明编码后,仍需在web.xml中添加<filter>解决POST乱码问题,这是初学者的常见坑点。
2.3 MySQL数据库设计要点
渔具销售系统的核心表结构设计:
sql复制CREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) COLLATE utf8mb4_bin NOT NULL COMMENT '商品名称',
`spec` json DEFAULT NULL COMMENT '规格参数(长度/硬度等)',
`stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存',
`category_id` int(11) NOT NULL COMMENT '分类ID',
PRIMARY KEY (`id`),
KEY `idx_category` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
特别说明:
- 使用JSON类型存储多变的产品规格参数
- utf8mb4字符集支持emoji等特殊字符(客户备注可能需要)
- 为分类ID建立索引提升查询效率
3. 核心功能模块实现细节
3.1 进销存管理模块
库存预警实现逻辑:
java复制// 使用Spring Scheduled定时任务
@Scheduled(cron = "0 0 22 * * ?") // 每晚10点执行
public void checkStock() {
List<Product> products = productMapper.selectLowStock(10); // 阈值10件
if(!products.isEmpty()){
String content = "低库存商品:\n";
for(Product p : products){
content += p.getName()+" 剩余"+p.getStock()+"件\n";
}
emailUtil.sendAlertMail(content); // 发送邮件提醒
}
}
销售统计难点:
- 需要处理时段统计(天/周/月)
- 多维度分析(品类/门店/销售员)
- 解决方案:使用MyBatis的动态SQL构建统计查询
3.2 会员管理系统
采用策略模式实现不同等级的折扣计算:
java复制public interface DiscountStrategy {
BigDecimal calculate(BigDecimal amount);
}
@Component("vipDiscount")
public class VipDiscount implements DiscountStrategy {
@Override
public BigDecimal calculate(BigDecimal amount) {
return amount.multiply(new BigDecimal("0.85")); // 85折
}
}
3.3 报表生成模块
使用Apache POI导出Excel报表时的性能优化技巧:
- 使用SXSSFWorkbook处理大数据量(>5万行)
- 关闭自动计算公式
workbook.setForceFormulaRecalculation(false) - 批量写入数据而非单行插入
4. 开发中的典型问题与解决方案
4.1 JSP与AJAX交互问题
常见错误:直接返回JSON字符串导致乱码
正确做法:
jsp复制<%@ page contentType="application/json;charset=UTF-8" %>
<%
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
out.print(jsonStr);
out.flush();
%>
4.2 MyBatis一对多查询优化
N+1问题解决方案:
xml复制<resultMap id="orderWithItems" type="Order">
<collection property="items" ofType="OrderItem"
select="selectItemsByOrderId" column="id"/>
</resultMap>
<select id="selectItemsByOrderId" resultType="OrderItem">
SELECT * FROM order_item WHERE order_id = #{id}
</select>
改为:
xml复制<resultMap id="orderWithItems" type="Order">
<collection property="items" ofType="OrderItem"
columnPrefix="item_"/>
</resultMap>
<select id="selectOrderWithItems" resultMap="orderWithItems">
SELECT o.*,
i.id as item_id, i.product_name as item_product_name
FROM orders o LEFT JOIN order_item i ON o.id = i.order_id
WHERE o.id = #{id}
</select>
4.3 事务管理实践
在Spring中正确使用事务:
java复制@Service
public class OrderServiceImpl implements OrderService {
@Transactional(rollbackFor = Exception.class,
isolation = Isolation.READ_COMMITTED)
public void createOrder(Order order) {
// 扣减库存
productMapper.reduceStock(order.getItems());
// 生成订单
orderMapper.insert(order);
// 更新会员积分
memberMapper.updatePoints(order.getMemberId(),
order.getAmount());
}
}
5. 系统部署与性能调优
5.1 Tomcat优化配置
修改conf/server.xml中的Connector配置:
xml复制<Connector port="8080" protocol="HTTP/1.1"
maxThreads="200"
minSpareThreads="20"
acceptCount="100"
compression="on"
compressableMimeType="text/html,text/xml,text/css,application/json"
connectionTimeout="20000"
URIEncoding="UTF-8"/>
5.2 MySQL性能优化
针对销售统计查询的索引优化:
sql复制-- 原查询(执行时间2.3s)
SELECT product_id, SUM(quantity)
FROM order_item
WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY product_id;
-- 优化方案
ALTER TABLE order_item ADD INDEX idx_product_time (product_id, create_time);
-- 优化后执行时间0.15s
5.3 前端性能提升
合并静态资源减少请求数:
jsp复制<%-- 原方式 --%>
<script src="/js/jquery.js"></script>
<script src="/js/bootstrap.js"></script>
<%-- 优化方式 --%>
<script src="/dist/libs.min.js?v=20230601"></script>
使用webpack或gulp构建工具合并压缩JS/CSS文件
6. 毕业设计答辩要点
6.1 系统演示技巧
- 准备两套数据:正常数据+边界案例(如库存为0时的下单)
- 演示路线:客户注册→商品浏览→下单→支付→后台处理
- 重点展示:销售统计图表、库存预警通知
6.2 答辩常见问题准备
Q:为什么选择SSM而不是Spring Boot?
A:SSM更符合教学大纲要求,能展示更底层的配置过程;且系统规模不大,不需要Boot的快速开发特性。
Q:如何保证系统安全性?
A:采用三层措施:1) 密码MD5加盐存储 2) XSS过滤器处理用户输入 3) 关键操作日志记录
6.3 项目扩展方向建议
- 增加移动端H5页面(使用Vue.js+axios对接现有接口)
- 接入微信支付/支付宝支付
- 实现分店间库存调拨功能
- 增加销售预测算法(基于历史数据)
