設計與實現)
溫馨提示本人主頁置頂文章(點我)開頭有 CSDN 平臺官方提供的學長聯系方式的名片一、 項目背景與意義隨著現代農業(yè)向精細化、智能化方向發(fā)展傳統(tǒng)的小香蔥種植管理模式在數據記錄、生長監(jiān)控、成本核算和銷售追溯等方面面臨諸多挑戰(zhàn)。種植戶通常依賴紙質記錄或簡單的電子表格導致數據分散、易丟失、難以分析無法為科學決策提供有效支持。本項目旨在設計并實現一個基于SpringBoot的小香蔥種植管理系統(tǒng)其核心意義在于提升管理效率將種植計劃、農事記錄、投入品管理、采收銷售等環(huán)節(jié)數字化實現一站式管理減少人工重復勞動。實現數據驅動決策通過系統(tǒng)化記錄生長環(huán)境、施肥用藥、產量等數據為優(yōu)化種植方案、預測產量、控制成本提供數據依據。保障農產品安全與可追溯建立完整的農事操作檔案實現從種植到銷售的全流程追溯提升產品信譽與市場競爭力。技術實踐價值作為一個典型的SpringBoot全棧項目它涵蓋了企業(yè)級應用開發(fā)的核心流程包括需求分析、架構設計、數據庫建模、后端API開發(fā)、前端交互等具有很好的學習與參考價值。二、 技術棧選型本項目采用前后端分離架構后端基于SpringBoot生態(tài)前端使用Vue.js具體技術選型如下1. 后端技術棧核心框架Spring Boot 2.7.x (提供快速啟動和自動配置)Web框架Spring MVC數據持久層MyBatis-Plus (簡化CRUD操作)數據庫MySQL 8.0 (關系型數據庫存儲業(yè)務數據)數據庫連接池HikariCP (高性能連接池)權限控制Spring Security JWT (實現用戶認證與接口鑒權)API文檔Knife4j (集成Swagger生成在線API文檔)項目構建Maven其他工具Lombok (簡化JavaBean代碼) Hutool (Java工具包)2. 前端技術棧核心框架Vue 3.x (組合式API)構建工具Vite (快速開發(fā)與構建)UI組件庫Element Plus (基于Vue 3的桌面端組件庫)狀態(tài)管理Pinia (Vue官方推薦的狀態(tài)管理庫)路由Vue Router 4.xHTTP客戶端Axios圖表ECharts (用于數據可視化展示)3. 開發(fā)與部署版本控制Git后端部署打包為Jar通過Docker容器或直接使用Java命令運行。前端部署構建為靜態(tài)資源部署至Nginx或對象存儲。三、 系統(tǒng)核心功能模塊設計系統(tǒng)主要面向種植基地管理員、技術員和銷售員核心功能模塊如下1. 基地與地塊管理維護種植基地、大棚、地塊的基本信息。2. 種植計劃管理制定小香蔥的種植批次、品種、計劃面積、預計周期等。3. 農事操作管理記錄播種、灌溉、施肥、病蟲害防治等日常操作支持圖片上傳。4. 投入品管理管理種子、肥料、農藥等農資的入庫、出庫與庫存。5. 環(huán)境數據監(jiān)測可選集成對接傳感器記錄溫度、濕度、光照等數據。6. 采收與銷售管理記錄采收批次、重量、等級以及銷售客戶、價格、訂單信息。7. 數據統(tǒng)計與報表提供產量統(tǒng)計、成本分析、農事日歷等可視化報表。8. 系統(tǒng)管理用戶、角色、權限、操作日志管理。四、 數據庫核心表設計以下是幾個核心業(yè)務表的結構設計-- 種植批次表 CREATE TABLE planting_batch ( id bigint NOT NULL AUTO_INCREMENT COMMENT 主鍵, batch_no varchar(50) NOT NULL COMMENT 批次編號, variety varchar(100) DEFAULT NULL COMMENT 品種, plot_id bigint DEFAULT NULL COMMENT 種植地塊ID, plant_area decimal(10,2) DEFAULT NULL COMMENT 種植面積(畝), plan_plant_date date DEFAULT NULL COMMENT 計劃種植日期, actual_plant_date date DEFAULT NULL COMMENT 實際種植日期, status tinyint DEFAULT 1 COMMENT 狀態(tài)(1:種植中, 2:已采收), create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_batch_no (batch_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT種植批次表; -- 農事記錄表 CREATE TABLE farming_record ( id bigint NOT NULL AUTO_INCREMENT, batch_id bigint NOT NULL COMMENT 關聯種植批次ID, operation_type tinyint NOT NULL COMMENT 操作類型(1:播種,2:灌溉,3:施肥,4:施藥,5:除草,6:其他), operation_date date NOT NULL COMMENT 操作日期, description text COMMENT 操作描述, operator varchar(50) DEFAULT NULL COMMENT 操作人, material_used varchar(500) DEFAULT NULL COMMENT 使用農資, image_urls varchar(1000) DEFAULT NULL COMMENT 現場圖片(多張,逗號分隔), create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_batch_id (batch_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT農事記錄表; -- 采收記錄表 CREATE TABLE harvest_record ( id bigint NOT NULL AUTO_INCREMENT, batch_id bigint NOT NULL, harvest_date date NOT NULL, harvest_weight decimal(10,2) NOT NULL COMMENT 采收重量(公斤), grade varchar(20) DEFAULT NULL COMMENT 等級, storage_location varchar(200) DEFAULT NULL COMMENT 存放位置, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_batch_id (batch_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT采收記錄表;五、 核心代碼實現示例1. 后端實體類與Mapper (使用MyBatis-Plus)import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.time.LocalDate; import java.time.LocalDateTime; Data TableName(planting_batch) public class PlantingBatch { TableId(type IdType.AUTO) private Long id; private String batchNo; private String variety; private Long plotId; private Double plantArea; private LocalDate planPlantDate; private LocalDate actualPlantDate; private Integer status; TableField(fill FieldFill.INSERT) private LocalDateTime createTime; TableField(fill FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; }import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; Mapper public interface PlantingBatchMapper extends BaseMapperPlantingBatch { // MyBatis-Plus已提供基礎CRUD方法 }2. Service層與業(yè)務邏輯import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import java.time.LocalDate; Service public class PlantingBatchServiceImpl extends ServiceImplPlantingBatchMapper, PlantingBatch implements PlantingBatchService { Override public boolean startBatch(PlantingBatchDTO dto) { // 1. 校驗數據 if (dto.getPlanPlantDate().isBefore(LocalDate.now())) { throw new BusinessException(計劃種植日期不能早于今天); } // 2. 生成批次號 String batchNo PB System.currentTimeMillis(); // 3. DTO轉Entity并保存 PlantingBatch batch new PlantingBatch(); BeanUtils.copyProperties(dto, batch); batch.setBatchNo(batchNo); batch.setStatus(1); // 狀態(tài):種植中 return this.save(batch); } Override public PageResultPlantingBatchVO queryPage(PlantingBatchQuery query) { // 構建查詢條件 LambdaQueryWrapperPlantingBatch wrapper new LambdaQueryWrapper(); wrapper.like(StringUtils.isNotBlank(query.getBatchNo()), PlantingBatch::getBatchNo, query.getBatchNo()) .eq(query.getStatus() ! null, PlantingBatch::getStatus, query.getStatus()) .orderByDesc(PlantingBatch::getCreateTime); // 分頁查詢 PagePlantingBatch page this.page(new Page(query.getPageNum(), query.getPageSize()), wrapper); // 轉換為VO列表 ListPlantingBatchVO voList page.getRecords().stream() .map(this::convertToVO) .collect(Collectors.toList()); return new PageResult(page.getTotal(), voList); } private PlantingBatchVO convertToVO(PlantingBatch batch) { // 轉換邏輯可關聯查詢地塊名稱等 PlantingBatchVO vo new PlantingBatchVO(); BeanUtils.copyProperties(batch, vo); return vo; } }3. Controller層REST APIimport org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; RestController RequestMapping(/api/planting-batch) Api(tags 種植批次管理) public class PlantingBatchController { Autowired private PlantingBatchService plantingBatchService; PostMapping ApiOperation(創(chuàng)建種植批次) public RString create(RequestBody Valid PlantingBatchDTO dto) { boolean success plantingBatchService.startBatch(dto); return success ? R.ok(創(chuàng)建成功) : R.fail(創(chuàng)建失敗); } GetMapping(/page) ApiOperation(分頁查詢種植批次) public RPageResultPlantingBatchVO page(PlantingBatchQuery query) { PageResultPlantingBatchVO pageResult plantingBatchService.queryPage(query); return R.ok(pageResult); } PutMapping(/{id}/harvest) ApiOperation(標記批次已采收) public RString markHarvested(PathVariable Long id) { // 業(yè)務邏輯更新狀態(tài)并可能創(chuàng)建采收記錄 boolean updated plantingBatchService.markAsHarvested(id); return updated ? R.ok(操作成功) : R.fail(操作失敗); } }4. 前端Vue組件示例 (查詢頁面)template div classplanting-batch-page el-card !-- 查詢條件 -- el-form :modelqueryParams inline el-form-item label批次號 el-input v-modelqueryParams.batchNo placeholder請輸入批次號 clearable / /el-form-item el-form-item label狀態(tài) el-select v-modelqueryParams.status placeholder請選擇 clearable el-option label種植中 :value1 / el-option label已采收 :value2 / /el-select /el-form-item el-form-item el-button typeprimary clickhandleQuery查詢/el-button el-button clickresetQuery重置/el-button /el-form-item /el-form !-- 操作按鈕 -- div stylemargin-bottom: 20px; el-button typeprimary clickhandleCreate新建批次/el-button /div !-- 數據表格 -- el-table :datatableData border el-table-column propbatchNo label批次號 / el-table-column propvariety label品種 / el-table-column propplantArea label面積(畝) / el-table-column propplanPlantDate label計劃種植日 / el-table-column propstatus label狀態(tài) template #defaultscope el-tag :typescope.row.status 1 ? success : info {{ scope.row.status 1 ? 種植中 : 已采收 }} /el-tag /template /el-table-column el-table-column label操作 width200 template #defaultscope el-button sizesmall clickhandleView(scope.row)查看/el-button el-button sizesmall typewarning clickhandleHarvest(scope.row) v-ifscope.row.status 1標記采收/el-button /template /el-table-column /el-table !-- 分頁 -- div classpagination-container el-pagination size-changehandleSizeChange current-changehandleCurrentChange :current-pagequeryParams.pageNum :page-sizes[10, 20, 50] :page-sizequeryParams.pageSize layouttotal, sizes, prev, pager, next, jumper :totaltotal /el-pagination /div /el-card /div /template script setup import { ref, onMounted } from vue import { getPlantingBatchPage, markHarvested } from /api/plantingBatch const queryParams ref({ batchNo: , status: null, pageNum: 1, pageSize: 10 }) const tableData ref([]) const total ref(0) // 加載數據 const loadData async () { const res await getPlantingBatchPage(queryParams.value) if (res.code 200) { tableData.value res.data.list total.value res.data.total } } // 查詢 const handleQuery () { queryParams.value.pageNum 1 loadData() } // 標記采收 const handleHarvest async (row) { try { await ElMessageBox.confirm(確認標記該批次已采收, 提示, { type: warning }) const res await markHarvested(row.id) if (res.code 200) { ElMessage.success(res.msg) loadData() // 刷新列表 } } catch (error) { // 用戶取消 } } onMounted(() { loadData() }) /script六、 總結與展望本文詳細闡述了基于SpringBoot的小香蔥種植管理系統(tǒng)的設計背景、技術選型、功能模塊、數據庫設計以及核心代碼實現。該系統(tǒng)通過將傳統(tǒng)種植業(yè)務數字化能夠有效提升管理效率與決策科學性。后續(xù)可擴展方向物聯網集成接入溫濕度