1. 项目背景与意义
随着乡村振兴战略的深入推进,农村地区的特色农产品、乡村旅游资源和乡土文化亟需一个高效、便捷的推广渠道。传统的线下推广方式受限于地域和信息传播速度,难以满足当前农村产业发展的需求。基于SpringBoot的乡村振兴推广平台,旨在借助互联网技术,整合乡村资源信息,打通农产品上行和乡村旅游推广的数字化通道,助力乡村经济发展。
本平台的建设具有以下现实意义:
- 促进农产品销售:为农户和合作社提供线上展示与销售渠道,拓宽农产品销路,增加农民收入。
- 推广乡村旅游:集中展示乡村景点、民宿和特色活动,吸引城市游客,带动乡村第三产业发展。
- 传承乡土文化:通过图文和视频等形式展示乡村非遗、民俗和手工艺,增强乡村文化影响力。
- 提升治理效能:为基层村务信息发布和惠农政策宣传提供统一平台,提高信息触达效率。
2. 技术栈选型
本平台采用前后端分离的开发模式,后端基于SpringBoot框架构建,前端使用Vue.js配合Element UI组件库,数据库选用MySQL,缓存层使用Redis。整体技术栈选型如下:
| 层次 | 技术选型 | 说明 |
|---|---|---|
| 后端框架 | SpringBoot 2.7 | 简化配置,快速构建RESTful API服务 |
| 持久层框架 | MyBatis-Plus | 简化数据库操作,内置分页和代码生成器 |
| 数据库 | MySQL 8.0 | 存储用户、商品、订单、资讯等业务数据 |
| 缓存中间件 | Redis | 缓存热点数据,存储验证码和登录令牌 |
| 安全框架 | Spring Security + JWT | 实现用户认证与接口权限控制 |
| 前端框架 | Vue.js 3 + Element UI | 构建单页应用,提供友好的管理界面 |
| 构建工具 | Maven | 管理项目依赖和构建打包 |
| 接口文档 | Swagger / Knife4j | 自动生成在线接口调试文档 |
3. 系统功能模块设计
平台面向普通游客、注册用户、商家和管理员四类角色,核心功能模块划分如下:
- 用户管理模块:实现用户注册、登录、个人信息维护、密码修改和收货地址管理。
- 农产品商城模块:提供农产品分类浏览、商品搜索、购物车、订单提交与支付流程管理。
- 乡村旅游模块:展示乡村景点、民宿、特色线路和活动资讯,支持在线预订和评价。
- 资讯发布模块:发布乡村振兴政策、农业技术、乡村动态等图文资讯,支持分类检索。
- 商家管理模块:商家可管理商品上下架、库存、订单发货和店铺信息。
- 后台管理模块:管理员对用户、商品、订单、资讯、评论进行审核和统计分析。
4. 数据库设计
系统核心数据表包括用户表、商品表、订单表、订单明细表、景点表、资讯表和评论表。以下为部分关键表结构设计:
用户表(sys_user)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键,自增 |
| username | varchar(50) | 登录用户名,唯一 |
| password | varchar(100) | 加密后的密码 |
| phone | varchar(20) | 手机号 |
| role | tinyint | 角色:0普通用户,1商家,2管理员 |
| status | tinyint | 账号状态:0禁用,1正常 |
| create_time | datetime | 注册时间 |
商品表(product)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键,自增 |
| name | varchar(100) | 商品名称 |
| category_id | bigint | 所属分类 |
| price | decimal(10,2) | 商品价格 |
| stock | int | 库存数量 |
| image | varchar(255) | 商品主图地址 |
| description | text | 商品详情描述 |
| seller_id | bigint | 所属商家用户ID |
| status | tinyint | 状态:0下架,1上架 |
5. 核心代码实现
以下选取平台中具有代表性的核心代码进行说明,包括统一返回结果封装、JWT登录认证、商品分页查询和订单创建。
5.1 统一返回结果封装
为保证前后端接口数据格式一致,定义统一的响应结果类:
import lombok.Data; @Data public class Result<T> { private Integer code; private String message; private T data; public static <T> Result<T> success(T data) { Result<T> result = new Result<>(); result.setCode(200); result.setMessage("操作成功"); result.setData(data); return result; } public static <T> Result<T> error(String message) { Result<T> result = new Result<>(); result.setCode(500); result.setMessage(message); return result; } }5.2 JWT登录认证
用户登录成功后签发JWT令牌,后续请求通过拦截器校验令牌并解析用户身份:
import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; import java.util.Date; public class JwtUtil { private static final String SECRET = "rural_revitalization_secret"; private static final long EXPIRE_TIME = 7 * 24 * 60 * 60 * 1000L; public static String generateToken(Long userId, String username) { return JWT.create() .withClaim("userId", userId) .withClaim("username", username) .withExpiresAt(new Date(System.currentTimeMillis() + EXPIRE_TIME)) .sign(Algorithm.HMAC256(SECRET)); } public static Long getUserId(String token) { return JWT.require(Algorithm.HMAC256(SECRET)) .build() .verify(token) .getClaim("userId") .asLong(); } }5.3 商品分页查询
使用MyBatis-Plus实现商品的分页条件查询,支持按名称模糊搜索和分类筛选:
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service public class ProductService { @Resource private ProductMapper productMapper; public Page<Product> pageQuery(int pageNum, int pageSize, String keyword, Long categoryId) { Page<Product> page = new Page<>(pageNum, pageSize); LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Product::getStatus, 1); if (keyword != null && !keyword.isEmpty()) { wrapper.like(Product::getName, keyword); } if (categoryId != null) { wrapper.eq(Product::getCategoryId, categoryId); } wrapper.orderByDesc(Product::getCreateTime); return productMapper.selectPage(page, wrapper); } }5.4 订单创建
用户提交订单时,校验商品库存并生成订单及明细记录,使用事务保证数据一致性:
import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; @Service public class OrderService { @Resource private OrderMapper orderMapper; @Resource private OrderItemMapper orderItemMapper; @Resource private ProductMapper productMapper; @Transactional(rollbackFor = Exception.class) public Long createOrder(Long userId, List<CartItem> cartItems) { Order order = new Order(); order.setUserId(userId); order.setOrderNo("RO" + System.currentTimeMillis()); order.setStatus(0); order.setCreateTime(LocalDateTime.now()); BigDecimal totalAmount = BigDecimal.ZERO; for (CartItem item : cartItems) { Product product = productMapper.selectById(item.getProductId()); if (product == null || product.getStock() < item.getQuantity()) { throw new RuntimeException("商品库存不足:" + product.getName()); } totalAmount = totalAmount.add(product.getPrice().multiply(BigDecimal.valueOf(item.getQuantity()))); } order.setTotalAmount(totalAmount); orderMapper.insert(order); for (CartItem item : cartItems) { Product product = productMapper.selectById(item.getProductId()); OrderItem orderItem = new OrderItem(); orderItem.setOrderId(order.getId()); orderItem.setProductId(product.getId()); orderItem.setProductName(product.getName()); orderItem.setPrice(product.getPrice()); orderItem.setQuantity(item.getQuantity()); orderItemMapper.insert(orderItem); product.setStock(product.getStock() - item.getQuantity()); productMapper.updateById(product); } return order.getId(); } }6. 系统测试与总结
平台完成开发后,对用户注册登录、商品浏览、购物车、订单提交、资讯发布等核心功能进行了功能测试和接口测试。测试结果表明,各模块功能运行正常,接口响应稳定,能够满足乡村振兴推广平台的基本业务需求。
本平台通过SpringBoot与Vue.js的结合,构建了一个集农产品销售、乡村旅游推广和资讯发布于一体的综合性服务平台,为乡村资源的数字化推广提供了可行的技术方案。后续可在智能推荐、直播带货、移动端适配等方面进一步扩展和优化。