基于 Spring Boot 的“种汇”良种推广与农技服务系统:技术栈、背景意义与核心代码
1. 项目背景与意义种子是农业的“芯片”良种推广与农业技术服务的数字化水平直接影响粮食安全和农民增收。传统模式下良种信息分散、推广渠道单一、农技指导依赖线下存在信息不对称、服务效率低、覆盖范围有限等问题。“种汇”良种推广与农技服务系统旨在通过信息化手段整合良种资源、推广渠道和农技服务能力构建一个集良种展示、在线推广、农技咨询、知识共享于一体的综合服务平台。系统面向种业企业、农技专家和广大农户帮助解决良种“推广难”、农技“落地难”的痛点推动农业科技成果向现实生产力转化。从实际意义上看本系统能够提升推广效率将良种信息数字化、标准化支持在线展示与精准推送降低推广成本。促进农技落地提供在线咨询、知识库和案例分享让农技服务突破地域和时间限制。支撑科学决策通过数据沉淀为种业企业和农业管理部门提供品种表现、用户需求等参考依据。2. 系统技术栈本系统采用前后端分离架构后端基于 Spring Boot 构建前端使用 Vue 生态数据库选用 MySQL并辅以 Redis 缓存和对象存储服务。整体技术选型兼顾开发效率、运行稳定性和后续扩展能力。层次技术选型说明后端框架Spring Boot 2.7.x快速构建 RESTful 服务内置自动配置与依赖管理持久层MyBatis-Plus简化 CRUD 操作支持分页查询与条件构造器数据库MySQL 8.0存储用户、良种、订单、咨询等业务数据缓存Redis缓存热点数据如品种列表、验证码、会话信息安全认证Spring Security JWT实现登录认证与接口权限控制文件存储MinIO / 阿里云 OSS存储良种图片、宣传资料等静态资源前端框架Vue 3 Element Plus构建管理后台与用户端页面接口文档Knife4jSwagger自动生成在线接口文档方便前后端联调3. 系统核心功能模块系统围绕“良种推广”和“农技服务”两条主线设计以下核心模块用户管理模块支持农户、农技专家、种业企业、管理员等多角色注册与登录基于 JWT 实现身份认证。良种信息管理模块管理员和种业企业发布、编辑、上下架良种信息包括品种名称、作物类别、特征特性、适宜区域、产量表现等。推广活动模块发布线上推广活动、优惠政策和示范田信息支持农户在线报名参与。农技咨询模块农户提交种植技术问题农技专家在线解答支持图文描述和附件上传。农技知识库模块按作物类别、主题分类整理种植技术文章和常见问题支持关键词检索。订单与意向管理模块农户对感兴趣的良种提交购买意向或在线下单企业跟进处理。数据统计模块对良种浏览量、咨询量、订单量等数据进行统计展示辅助运营决策。4. 核心代码实现下面选取系统中最具代表性的几个核心环节给出关键代码实现。4.1 项目基础配置首先在pom.xml中引入核心依赖包括 Spring Boot Web、MyBatis-Plus、MySQL 驱动、Redis、JWT 和 Knife4j。dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt/artifactId version0.9.1/version /dependency dependency groupIdcom.github.xiaoymin/groupId artifactIdknife4j-openapi2-spring-boot-starter/artifactId version4.3.0/version /dependency /dependencies在application.yml中配置数据源、Redis 和 MyBatis-Plus 相关参数。spring: datasource: url: jdbc:mysql://localhost:3306/zhonghui?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver redis: host: localhost port: 6379 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: auto4.2 用户登录与 JWT 认证用户登录是系统的安全入口。这里使用 JWT 生成令牌并将用户信息存入 Redis 以便后续校验。首先定义 JWT 工具类。import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.stereotype.Component; import java.util.Date; import java.util.HashMap; import java.util.Map; Component public class JwtUtil { private static final String SECRET zhonghui-secret-key; private static final long EXPIRE 1000 * 60 * 60 * 24; // 24小时 public String generateToken(Long userId, String username, String role) { MapString, Object claims new HashMap(); claims.put(userId, userId); claims.put(username, username); claims.put(role, role); return Jwts.builder() .setClaims(claims) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() EXPIRE)) .signWith(SignatureAlgorithm.HS256, SECRET) .compact(); } public Claims parseToken(String token) { return Jwts.parser() .setSigningKey(SECRET) .parseClaimsJws(token) .getBody(); } }登录接口接收用户名和密码校验通过后返回 JWT 令牌。import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; RestController RequestMapping(/api/auth) public class AuthController { Autowired private UserMapper userMapper; Autowired private JwtUtil jwtUtil; Autowired private StringRedisTemplate redisTemplate; private final BCryptPasswordEncoder encoder new BCryptPasswordEncoder(); PostMapping(/login) public Result login(RequestBody LoginRequest request) { User user userMapper.selectOne( new QueryWrapperUser().eq(username, request.getUsername())); if (user null || !encoder.matches(request.getPassword(), user.getPassword())) { return Result.error(用户名或密码错误); } String token jwtUtil.generateToken(user.getId(), user.getUsername(), user.getRole()); // 将令牌存入 Redis设置过期时间 redisTemplate.opsForValue().set(token: user.getId(), token, 24, TimeUnit.HOURS); MapString, Object data new HashMap(); data.put(token, token); data.put(user, user); return Result.success(data); } }4.3 良种信息管理良种信息是系统的核心业务数据。定义实体类Seed并使用 MyBatis-Plus 注解映射数据库表。import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; Data TableName(seed) public class Seed { TableId(type IdType.AUTO) private Long id; /** 品种名称 */ private String name; /** 作物类别 */ private String category; /** 品种特征特性 */ private String characteristics; /** 适宜区域 */ private String suitableRegion; /** 参考价格 */ private BigDecimal price; /** 封面图片地址 */ private String coverImage; /** 状态0-下架 1-上架 */ private Integer status; /** 发布企业ID */ private Long companyId; /** 浏览量 */ private Integer viewCount; private LocalDateTime createTime; private LocalDateTime updateTime; }良种查询接口支持按名称、类别和状态进行条件分页查询。import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; RestController RequestMapping(/api/seed) public class SeedController { Autowired private SeedMapper seedMapper; GetMapping(/page) public Result page(RequestParam(defaultValue 1) Integer page, RequestParam(defaultValue 10) Integer size, RequestParam(required false) String name, RequestParam(required false) String category) { QueryWrapperSeed wrapper new QueryWrapper(); if (name ! null !name.isEmpty()) { wrapper.like(name, name); } if (category ! null !category.isEmpty()) { wrapper.eq(category, category); } wrapper.eq(status, 1).orderByDesc(create_time); PageSeed result seedMapper.selectPage(new Page(page, size), wrapper); return Result.success(result); } GetMapping(/{id}) public Result detail(PathVariable Long id) { Seed seed seedMapper.selectById(id); if (seed null) { return Result.error(良种信息不存在); } // 浏览量自增 seed.setViewCount(seed.getViewCount() 1); seedMapper.updateById(seed); return Result.success(seed); } }4.4 农技咨询模块农技咨询模块实现农户提问、专家解答的完整流程。定义咨询实体类。import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.time.LocalDateTime; Data TableName(consultation) public class Consultation { TableId(type IdType.AUTO) private Long id; /** 提问农户ID */ private Long farmerId; /** 咨询标题 */ private String title; /** 咨询内容 */ private String content; /** 附件图片地址 */ private String imageUrl; /** 状态0-待解答 1-已解答 */ private Integer status; /** 解答专家ID */ private Long expertId; /** 解答内容 */ private String reply; private LocalDateTime createTime; private LocalDateTime replyTime; }专家提交解答时更新咨询状态并记录解答时间和内容。import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; RestController RequestMapping(/api/consultation) public class ConsultationController { Autowired private ConsultationMapper consultationMapper; PostMapping(/reply) public Result reply(RequestBody ReplyRequest request) { Consultation consultation consultationMapper.selectById(request.getId()); if (consultation null) { return Result.error(咨询记录不存在); } consultation.setStatus(1); consultation.setExpertId(request.getExpertId()); consultation.setReply(request.getReply()); consultation.setReplyTime(LocalDateTime.now()); consultationMapper.updateById(consultation); return Result.success(解答成功); } GetMapping(/pending) public Result pendingList(RequestParam(defaultValue 1) Integer page, RequestParam(defaultValue 10) Integer size) { QueryWrapperConsultation wrapper new QueryWrapper(); wrapper.eq(status, 0).orderByAsc(create_time); return Result.success(consultationMapper.selectPage(new Page(page, size), wrapper)); } }4.5 统一返回结果封装为保证前后端接口数据格式统一定义通用返回结果类。import lombok.Data; Data public class Result { private Integer code; private String message; private Object data; public static Result success(Object data) { Result result new Result(); result.setCode(200); result.setMessage(操作成功); result.setData(data); return result; } public static Result error(String message) { Result result new Result(); result.setCode(500); result.setMessage(message); return result; } }5. 总结与展望“种汇”良种推广与农技服务系统基于 Spring Boot 构建通过良种信息管理、推广活动、农技咨询和知识库等核心模块实现了良种推广与农技服务的线上化、流程化。系统采用 JWT 认证保障接口安全使用 Redis 缓存提升访问性能整体架构清晰、易于扩展。后续可以从以下方向持续完善一是引入推荐算法根据农户种植区域和作物偏好精准推送良种二是增加视频直播和远程诊断能力进一步丰富农技服务形式三是对接农业物联网数据实现品种表现的动态跟踪与评估为良种推广提供更扎实的数据支撑。