基于 Spring Boot 的“种汇”良种推广与农技服务系统:技术栈、背景意义与核心代码
2026/9/7 7:07:49 网站建设 项目流程

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构建管理后台与用户端页面
接口文档Knife4j(Swagger)自动生成在线接口文档,方便前后端联调

3. 系统核心功能模块

系统围绕“良种推广”和“农技服务”两条主线,设计以下核心模块:

  • 用户管理模块:支持农户、农技专家、种业企业、管理员等多角色注册与登录,基于 JWT 实现身份认证。
  • 良种信息管理模块:管理员和种业企业发布、编辑、上下架良种信息,包括品种名称、作物类别、特征特性、适宜区域、产量表现等。
  • 推广活动模块:发布线上推广活动、优惠政策和示范田信息,支持农户在线报名参与。
  • 农技咨询模块:农户提交种植技术问题,农技专家在线解答,支持图文描述和附件上传。
  • 农技知识库模块:按作物类别、主题分类整理种植技术文章和常见问题,支持关键词检索。
  • 订单与意向管理模块:农户对感兴趣的良种提交购买意向或在线下单,企业跟进处理。
  • 数据统计模块:对良种浏览量、咨询量、订单量等数据进行统计展示,辅助运营决策。

4. 核心代码实现

下面选取系统中最具代表性的几个核心环节,给出关键代码实现。

4.1 项目基础配置

首先在pom.xml中引入核心依赖,包括 Spring Boot Web、MyBatis-Plus、MySQL 驱动、Redis、JWT 和 Knife4j。

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi2-spring-boot-starter</artifactId> <version>4.3.0</version> </dependency> </dependencies>

application.yml中配置数据源、Redis 和 MyBatis-Plus 相关参数。

spring: datasource: url: jdbc:mysql://localhost:3306/zhonghui?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/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: auto

4.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) { Map<String, 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 QueryWrapper<User>().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); Map<String, 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) { QueryWrapper<Seed> 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"); Page<Seed> 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) { QueryWrapper<Consultation> 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 缓存提升访问性能,整体架构清晰、易于扩展。

后续可以从以下方向持续完善:一是引入推荐算法,根据农户种植区域和作物偏好精准推送良种;二是增加视频直播和远程诊断能力,进一步丰富农技服务形式;三是对接农业物联网数据,实现品种表现的动态跟踪与评估,为良种推广提供更扎实的数据支撑。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询