这个基于Spring Boot的农产品销售网站项目是我去年带队完成的一个毕业设计课题,当时我们团队花了3个月时间从零开始搭建了这个完整的电商平台。现在回头看,这个项目虽然规模不大,但涵盖了电商系统从后台管理到前端展示的全套功能模块,特别适合作为计算机专业学生的毕业设计选题。
这个系统最核心的价值在于解决了农产品销售中的几个痛点:一是打破了地域限制,让偏远地区的优质农产品可以直接面向全国消费者;二是通过信息化手段提升了交易透明度,消费者可以查看详细的农产品溯源信息;三是为小型农户提供了低成本的线上销售渠道。从技术实现角度来看,我们采用了主流的Spring Boot+Vue.js前后端分离架构,既保证了开发效率,又确保了系统性能。
我们选择Spring Boot作为后端框架主要基于以下几个考虑:
数据库选用MySQL 8.0,主要看中它:
java复制// 典型的数据访问层代码示例
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
@Query("SELECT p FROM Product p WHERE p.category.id = :categoryId")
List<Product> findByCategoryId(@Param("categoryId") Long categoryId);
}
前端采用Vue.js 3.x组合:
这种组合的优势在于:
javascript复制// 前端API调用示例
export const getProducts = (params) => {
return axios.get('/api/products', { params })
}
我们采用经典的三层架构:

这种架构的扩展性很强,后期如果需要增加移动端App,只需要开发新的前端即可,后端接口可以复用。
商品管理是系统的核心功能,我们实现了:
关键数据库表设计:
sql复制CREATE TABLE `product` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`description` text,
`price` decimal(10,2) NOT NULL,
`stock` int NOT NULL DEFAULT '0',
`category_id` bigint NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_category` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
订单系统实现了完整的状态机:
状态转换图:
code复制[待支付] --支付成功--> [已支付]
[待支付] --超时未支付--> [已取消]
[已支付] --发货--> [已发货]
[已发货] --确认收货--> [已完成]
采用JWT实现无状态认证:
安全措施:
最初我们直接存储图片到数据库,导致性能问题。后来改进为:
普通SQL更新会出现超卖问题,最终方案:
java复制@Transactional
public boolean reduceStock(Long productId, int quantity) {
Product product = productRepository.findById(productId)
.orElseThrow(() -> new RuntimeException("Product not found"));
if (product.getStock() < quantity) {
return false;
}
int affectedRows = productRepository.reduceStock(productId, quantity);
return affectedRows > 0;
}
对应的Repository方法:
java复制@Modifying
@Query("UPDATE Product p SET p.stock = p.stock - :quantity WHERE p.id = :productId AND p.stock >= :quantity")
int reduceStock(@Param("productId") Long productId, @Param("quantity") int quantity);
支付接口对接时遇到的主要问题:
推荐使用Docker快速搭建开发环境:
yaml复制version: '3'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: agri_mall
ports:
- "3306:3306"
redis:
image: redis:alpine
ports:
- "6379:6379"
我们最终采用的部署方案:
部署脚本示例:
bash复制# 后端服务启动
nohup java -jar agri-mall.jar --spring.profiles.active=prod > app.log 2>&1 &
# 前端部署
npm run build
cp -r dist/* /usr/share/nginx/html/
这个基础版本完成后,还可以考虑以下扩展:
通过这个项目,我们团队收获了几点重要经验:
给后来者的建议:
这个项目虽然已经完成,但其中还有很多可以优化的地方。最近我正在研究如何将系统改造成微服务架构,以支持更大的业务规模。如果你对某个具体模块的实现细节感兴趣,或者在使用过程中遇到问题,欢迎交流讨论。