1. 项目概述与设计背景
作为一名长期从事Java Web开发的工程师,我最近完成了一个助农产品销售平台的毕业设计项目。这个平台采用B/S架构,使用Java语言结合JSP技术开发,后端框架选择了SSM(Spring+SpringMVC+MyBatis)组合。数据库方面采用MySQL 8.0,前端使用Bootstrap框架实现响应式布局。
这个项目的核心目标是解决农产品销售中的信息不对称问题。在实际调研中,我发现很多优质农产品由于缺乏有效的销售渠道,导致农民收益有限。而城市消费者又难以获取新鲜、优质的农产品。这个平台正是为了搭建这样一个桥梁,让农产品可以直接从生产者到达消费者手中。
提示:选择SSM框架而非SpringBoot是考虑到教学目的,SSM更能体现传统Java Web开发的完整技术栈,适合作为毕业设计展示技术能力。
2. 系统架构与技术选型
2.1 整体架构设计
系统采用经典的三层架构:
- 表现层:JSP+JSTL+EL表达式
- 业务逻辑层:Spring框架管理
- 数据访问层:MyBatis实现
这种分层架构的优势在于:
- 职责分离,便于维护
- 可扩展性强,各层可以独立演进
- 适合团队协作开发
2.2 技术栈详解
数据库设计:
我设计了约15张核心表,包括:
- 用户表(t_user)
- 商家表(t_merchant)
- 商品表(t_product)
- 订单表(t_order)
- 订单明细表(t_order_detail)
- 留言表(t_message)
其中商品表与商家表采用一对多关系,一个商家可以发布多个商品。订单表与用户表也是多对一关系,一个用户可以下多个订单。
前端技术:
- Bootstrap 5.1.3:实现响应式布局
- jQuery 3.6.0:处理DOM操作和AJAX请求
- ECharts 5.3.2:用于数据可视化展示
后端技术:
- Spring 5.3.9:IoC和AOP核心容器
- SpringMVC 5.3.9:处理Web请求
- MyBatis 3.5.7:ORM框架
- Jackson 2.12.5:JSON处理
- Log4j 2.14.1:日志记录
3. 核心功能实现
3.1 用户管理系统
用户分为三类角色:
- 普通用户:注册登录、浏览商品、下单购买
- 商家用户:商品管理、订单处理
- 管理员:系统管理、用户审核
用户注册采用手机号验证方式,核心代码如下:
java复制// 用户注册逻辑
public Result register(User user, String code) {
// 验证短信验证码
if(!smsService.verifyCode(user.getPhone(), code)){
return Result.error("验证码错误");
}
// 检查用户名是否已存在
if(userMapper.selectByUsername(user.getUsername()) != null){
return Result.error("用户名已存在");
}
// 密码加密
user.setPassword(DigestUtils.md5DigestAsHex(user.getPassword().getBytes()));
user.setCreateTime(new Date());
user.setStatus(0); // 0-未审核 1-已审核
userMapper.insert(user);
return Result.success("注册成功,等待审核");
}
3.2 商品管理模块
商家可以发布、编辑、下架商品。商品信息包括:
- 基础信息:名称、价格、库存
- 详情信息:描述、图片、规格参数
- 物流信息:重量、运费模板
商品搜索采用Elasticsearch实现全文检索,核心配置:
xml复制<!-- Elasticsearch配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
@Document(indexName = "products")
public class ProductES {
@Id
private Long id;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String name;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String description;
// 其他字段...
}
3.3 订单处理流程
订单状态机设计:
- 待付款(10)
- 待发货(20)
- 待收货(30)
- 已完成(40)
- 已取消(50)
- 已退款(60)
订单创建的核心逻辑:
java复制public Result createOrder(OrderDTO orderDTO) {
// 1. 参数校验
if(orderDTO.getItems() == null || orderDTO.getItems().isEmpty()){
return Result.error("订单商品不能为空");
}
// 2. 计算总价
BigDecimal totalAmount = BigDecimal.ZERO;
for(OrderItemDTO item : orderDTO.getItems()){
Product product = productMapper.selectById(item.getProductId());
if(product == null || product.getStatus() != 1){
return Result.error("商品"+item.getProductId()+"已下架");
}
if(product.getStock() < item.getQuantity()){
return Result.error("商品"+product.getName()+"库存不足");
}
totalAmount = totalAmount.add(
product.getPrice().multiply(new BigDecimal(item.getQuantity()))
);
}
// 3. 创建订单
Order order = new Order();
order.setOrderNo(generateOrderNo());
order.setUserId(orderDTO.getUserId());
order.setTotalAmount(totalAmount);
order.setStatus(10); // 待付款
orderMapper.insert(order);
// 4. 创建订单明细
for(OrderItemDTO item : orderDTO.getItems()){
OrderItem orderItem = new OrderItem();
orderItem.setOrderId(order.getId());
orderItem.setProductId(item.getProductId());
orderItem.setQuantity(item.getQuantity());
orderItemMapper.insert(orderItem);
// 扣减库存
productMapper.deductStock(item.getProductId(), item.getQuantity());
}
return Result.success(order);
}
4. 特色功能实现
4.1 首页信息推送
系统首页采用智能推荐算法,根据用户浏览历史和购买记录推荐相关商品。推荐逻辑如下:
- 新用户:推荐销量最高的商品
- 老用户:基于协同过滤算法推荐
- 季节因素:结合时令农产品调整推荐权重
推荐服务核心代码:
java复制public List<Product> recommendProducts(Long userId) {
// 1. 获取用户历史行为
List<UserBehavior> behaviors = userBehaviorMapper.selectByUser(userId);
// 2. 判断用户类型
if(behaviors == null || behaviors.isEmpty()){
// 新用户推荐热销商品
return productMapper.selectHotProducts(10);
}else{
// 老用户使用协同过滤
List<Long> similarUsers = cfService.findSimilarUsers(userId);
return cfService.recommendProducts(similarUsers);
}
}
4.2 农产品溯源功能
为增加消费者信任度,实现了农产品溯源功能。商家可以上传:
- 种植/养殖过程照片
- 质检报告
- 物流信息
这些信息会生成唯一的溯源二维码,消费者扫码即可查看。
5. 系统部署与优化
5.1 部署方案
系统采用Docker容器化部署:
- Nginx:前端静态资源和反向代理
- Tomcat:应用服务器
- MySQL:主从复制
- Redis:缓存和Session共享
docker-compose.yml关键配置:
yaml复制version: '3'
services:
web:
image: nginx:1.21
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./dist:/usr/share/nginx/html
app:
image: tomcat:9.0
ports:
- "8080:8080"
volumes:
- ./app.war:/usr/local/tomcat/webapps/ROOT.war
mysql:
image: mysql:8.0
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: agri_mall
5.2 性能优化措施
-
缓存策略:
- 商品详情使用Redis缓存
- 热点数据预加载
- 多级缓存设计
-
数据库优化:
- 建立合适的索引
- 读写分离
- 分库分表准备
-
前端优化:
- 静态资源CDN加速
- 图片懒加载
- 请求合并
6. 开发心得与问题解决
6.1 开发中的典型问题
问题1:并发下单导致超卖
现象:高并发场景下,商品库存可能出现负数。
解决方案:
- 数据库乐观锁:
sql复制UPDATE product SET stock = stock - 1
WHERE id = ? AND stock >= 1
- Redis分布式锁:
java复制public boolean tryLock(String key, long expire) {
return redisTemplate.opsForValue()
.setIfAbsent(key, "1", expire, TimeUnit.SECONDS);
}
问题2:JSP页面加载缓慢
现象:首次访问JSP页面响应时间长。
解决方案:
- 预编译JSP
- 启用JSP缓存
- 静态资源分离部署
6.2 项目经验总结
-
技术选型要权衡:
- 教学项目可以适当使用传统技术栈
- 生产环境建议使用SpringBoot简化配置
-
数据库设计要点:
- 合理设计索引
- 避免过度规范化
- 考虑扩展性
-
开发流程建议:
- 先设计后编码
- 编写单元测试
- 持续集成
这个项目让我深刻理解了电商系统的核心流程和技术难点。特别是并发控制和分布式事务的处理,需要综合考虑多种技术方案。在实际开发中,文档编写和代码注释同样重要,良好的文档可以大大提高后期维护效率。