计算机毕业设计:Python智慧农业气象与产量分析系统 Flask框架 XGBoost 机器学习 数据分析 可视化 大数据 大模型(建议收藏)✅
1、项目介绍
技术栈
采用 Python 语言开发,基于 Flask 框架搭建后端服务,使用 MySQL 数据库进行数据存储,通过 pymysql 连接数据库,运用 XGBoost 机器学习模型实现产量预测,前端结合 HTML、CSS、JavaScript、Echarts 和 Layui 框架构建页面。
功能模块
· 数据可视化大屏
· 产量预测分析
· 气象数据管理
· 产量数据管理
· 后台管理首页
· 注册登录
项目介绍
本系统基于 Flask 框架构建农业数据分析与可视化平台,通过分析气象与农作物产量的关系,实现对农作物产量的预测。系统提供数据可视化大屏,展示日照时长、温度、风速、降雨量等气象指标以及水稻年产量排名与各区县三年总产量。产量预测模块基于 XGBoost 模型,对当前或未来时段的农作物产量进行预测并提供可视化展示。系统还包含气象数据管理、产量数据管理、后台管理首页及用户注册登录功能,支持数据的查询、添加、删除与系统信息查看。
2、项目界面
(1)数据可视化大屏
该农业数据分析平台页面包含日照时长、温度、风速、降雨量的气象分析模块,以及水稻年产量排名和各区县三年总产量的产量分析模块,搭配核心指标统计卡片与数据表格,实现农业气象与产量数据的可视化展示。

(2)产量预测分析
该页面为农业数据分析平台的产量预测模块,左侧是包含产量预测等功能的系统导航栏,主区域的折线图用于展示各区县的产量数据,可直观呈现产量分布情况并支持交互查看详细信息。

(3)气象数据管理
该农业数据分析平台的气象管理页面,提供气象数据的查询、添加与删除功能,支持按区县搜索气象记录,以表格形式展示各区县的气象指标,实现气象数据的管理与查看。

(4)产量数据管理
该农业数据分析平台的产量管理页面,提供按县区搜索产量数据的功能,支持数据的添加与删除操作,以表格形式展示各区县历年早稻和晚稻产量,实现产量数据的查看与管理。

(5)后台管理首页
该农业数据分析平台的主页,用于展示管理员登录信息与当前时间,提供系统首页入口,并以表格形式呈现系统版本、服务器地址、操作系统、运行环境、Python及数据库版本等信息,帮助用户快速了解系统状态与配置。

(6)注册登录界面
该页面是农业数据分析平台的登录界面,提供账号密码输入框、密码显示切换、注册账号入口与登录按钮,用户可通过输入账号密码完成身份验证,进入系统。

3、项目说明
一、技术栈简要说明
本系统采用 Python 语言开发,基于 Flask 框架搭建后端服务,使用 MySQL 数据库进行数据存储,通过 pymysql 连接数据库,运用 XGBoost 机器学习模型实现产量预测,前端结合 HTML、CSS、JavaScript、Echarts 和 Layui 框架构建页面。
二、功能模块详细介绍
· 数据可视化大屏
该页面为农业数据分析平台的核心展示界面,包含日照时长、温度、风速、降雨量的气象分析模块,以及水稻年产量排名和各区县三年总产量的产量分析模块,搭配核心指标统计卡片与数据表格,通过 Echarts 图表实现农业气象与产量数据的可视化展示,帮助用户直观了解气象条件与产量分布的关系。
· 产量预测分析
该页面为农业数据分析平台的产量预测模块,左侧为包含产量预测等功能的系统导航栏,主区域通过折线图展示各区县的产量数据。系统基于 XGBoost 机器学习模型,通过对气象与农作物产量关系数据集的分析与训练,实现对当前或未来某一时间段农作物产量的预测,并支持交互查看详细信息,为用户提供科学的产量预估参考。
· 气象数据管理
该页面为农业数据分析平台的气象管理页面,提供气象数据的查询、添加与删除功能,支持按区县搜索气象记录,以表格形式展示各区县的气象指标,包括日照时长、温度、风速、降雨量等字段,实现气象数据的集中管理与便捷查看。
· 产量数据管理
该页面为农业数据分析平台的产量管理页面,提供按县区搜索产量数据的功能,支持数据的添加与删除操作,以表格形式展示各区县历年早稻和晚稻产量数据,实现产量数据的查看与管理,方便用户对历史产量进行追溯和维护。
· 后台管理首页
该页面为农业数据分析平台的主页,用于展示管理员登录信息与当前时间,提供系统首页入口,并以表格形式呈现系统版本、服务器地址、操作系统、运行环境、Python 版本及数据库版本等信息,帮助用户快速了解系统状态与配置,便于系统运维。
· 注册登录
该页面为农业数据分析平台的登录界面,提供账号密码输入框、密码显示切换、注册账号入口与登录按钮,用户可通过输入账号密码完成身份验证,进入系统。系统管理员可以通过后台界面对用户信息、公告信息和农作物数据进行管理和维护,保证系统的正常运行与信息安全。
三、项目总结
本系统基于 Flask 框架构建农业数据分析与可视化平台,通过分析气象与农作物产量的关系,实现对农作物产量的预测。系统提供数据可视化大屏,展示日照时长、温度、风速、降雨量等气象指标以及水稻年产量排名与各区县三年总产量,帮助用户直观了解农业气象与产量分布。产量预测模块基于 XGBoost 机器学习模型,对当前或未来时段的农作物产量进行预测并提供可视化展示,为农业生产规划提供数据支撑。系统还包含气象数据管理、产量数据管理、后台管理首页及用户注册登录功能,支持数据的查询、添加、删除与系统信息查看。该系统的实现对农业生产的优化具有积极意义,有助于提高农作物产量和品质,促进农业可持续发展。
4、核心代码
import datetime
from flask import Flask as _Flask, flash, redirect
from flask import request, session
from flask import render_template
from flask.json import JSONEncoder as _JSONEncoder, jsonify
import decimal
import os
from service import user_service, notice_service, data_service, output_service, weather_service, predict_service
from utils.JsonUtils import read_json
from utils.Result import Result
base = os.path.dirname(__file__)
directory_path = os.path.dirname(__file__)
json_path = directory_path + '/static/api/'
class JSONEncoder(_JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
return float(o)
if isinstance(o, datetime.datetime):
return o.strftime("%Y-%m-%d %H:%M:%S")
if isinstance(o, datetime.date):
return o.strftime("%Y-%m-%d")
super(_JSONEncoder, self).default(o)
class Flask(_Flask):
json_encoder = JSONEncoder
import os
app = Flask(__name__)
app.config['SESSION_TYPE'] = 'filesystem'
app.config['SECRET_KEY'] = os.urandom(24)
# ----------------------------------------------页面加载模块开始----------------------------------------------
# 加载系统json文件
@app.route('/api/<string:path>/')
def api_json(path):
if path == 'init.json' and session.get('user') and session.get('user')['type'] == 1:
path = 'custom_init.json'
return read_json(json_path + path)
# 加载page下的静态页面
@app.route('/page/<string:path>')
def api_path(path):
return render_template("page/" + path)
# 系统默认路径后台跳转
@app.route('/admin')
def admin_page():
if session.get('user') and session.get('user')['id'] > 0:
return render_template("index.html")
else:
return redirect("/login")
# 系统可视化数据请求接口
@app.route('/')
def main_page():
month_rain = data_service.get_month_rain_volume()
ave_wind = data_service.get_ave_wind()
count, output, weather = data_service.get_total()
yearly_outputs = data_service.get_yearly_output()
months_temp = data_service.get_months_temp()
times_selling = data_service.get_times_selling()
months_sun = data_service.get_months_sun()
table_list = data_service.get_table_list()
return render_template("main.html", month_rain=month_rain,
ave_wind=ave_wind,
table_list=table_list,
count=count, output=output, weather=weather,
yearly_outputs=yearly_outputs, months_temp=months_temp,
times_selling=times_selling, months_sun=months_sun)
# 系统登录路径
@app.route('/login')
def login_page():
return render_template("page/login.html")
# 系统退出登录路径
@app.route('/logout')
def logout_page():
session.clear()
return redirect("/login")
# 系统注册用户
@app.route('/register', methods=['get'])
def register_page():
return render_template("page/register.html")
# ----------------------------------------------页面加载模块结束----------------------------------------------
# ----------------------------------------------用户相关模块开始----------------------------------------------
# 用户注册
@app.route('/register', methods=['post'])
def register_user():
form = request.form.to_dict() # 获取值
result = user_service.insert_user(form)
return result.get()
# 用户登录
@app.route('/login', methods=['post'])
def login_user():
form = request.form.to_dict() # 获取值
result = user_service.select_user_by_account_password(form)
session['user'] = result.data
return result.get()
# 用户数据分页
@app.route('/page/user/add', methods=['get'])
def page_user_add():
return render_template("page/user/add.html")
# 用户修改密码
@app.route('/user/reset/password', methods=['post'])
def reset_password_user():
form = request.form.to_dict() # 获取值
result = user_service.reset_password(form['old_password'], form['new_password'], form['again_password'])
return result.get()
@app.route('/add/user', methods=['post'])
def add_user():
form = request.form.to_dict()
result = user_service.insert_user(form)
return result.get()
# 用户编辑页面
@app.route('/page/user/edit', methods=['get'])
def page_user_edit():
id = request.args.get('id')
user = user_service.get_user(id)
return render_template("page/user/edit.html", user=user)
# 编辑用户接口
@app.route('/edit/user', methods=['post'])
def edit_user():
form = request.form.to_dict()
result = user_service.edit_user(form)
return result.get()
# 单个删除用户接口
@app.route('/del/user/<int:id>', methods=['post'])
def del_user(id):
result = user_service.del_user(id)
return result.get()
# 批量删除用户接口
@app.route('/del/user', methods=['post'])
def del_user_list():
ids = request.args.get('ids')
result = user_service.del_user_list(ids)
return result.get()
# 用户数据分页
@app.route('/list/user', methods=['get'])
def user_list():
page = request.args.get('page')
limit = request.args.get('limit')
where = request.args.get('searchParams')
result = user_service.select_user_list(page, limit, where)
return result.get()
# ----------------------------------------------用户相关模块结束----------------------------------------------
# ----------------------------------------------公告相关模块开始----------------------------------------------
# 公告添加页面
@app.route('/page/notice/add', methods=['get'])
def page_notice_add():
return render_template("page/notice/add.html")
@app.route('/add/notice', methods=['post'])
def add_notice():
form = request.form.to_dict()
result = notice_service.insert_notice(form)
return result.get()
# 数据公告编辑页面
@app.route('/page/notice/edit', methods=['get'])
def page_notice_edit():
id = request.args.get('id')
notice = notice_service.get_notice(id)
return render_template("page/notice/edit.html", notice=notice)
# 编辑公告接口
@app.route('/edit/notice', methods=['post'])
def edit_notice():
form = request.form.to_dict()
result = notice_service.edit_notice(form)
return result.get()
# 单个删除公告接口
@app.route('/del/notice/<int:id>', methods=['post'])
def del_notice(id):
result = notice_service.del_notice(id)
return result.get()
# 批量删除公告接口
@app.route('/del/notice', methods=['post'])
def del_notice_list():
ids = request.args.get('ids')
result = notice_service.del_notice_list(ids)
return result.get()
# 公告数据分页
@app.route('/list/notice', methods=['get'])
def notice_list():
page = request.args.get('page')
limit = request.args.get('limit')
where = request.args.get('searchParams')
result = notice_service.select_notice_list(page, limit, where)
return result.get()
# 公告数据最新获取
@app.route('/get/notice/new', methods=['get'])
def get_new_notice():
result = notice_service.get_notice_by_new()
return result.get()
# ----------------------------------------------公告相关模块结束----------------------------------------------
# ----------------------------------------------产量相关模块开始----------------------------------------------
# 产量添加页面跳转
@app.route('/page/output/add', methods=['get'])
def page_output_add():
return render_template("page/output/add.html")
# 产量新增接口
@app.route('/add/output', methods=['post'])
def add_output():
form = request.form.to_dict()
result = output_service.insert_output(form)
return result.get()
# 产量编辑页面跳转
@app.route('/page/output/edit', methods=['get'])
def page_output_edit():
id = request.args.get('id')
output = output_service.get_output(id)
return render_template("page/output/edit.html", output=output)
# 产量编辑接口
@app.route('/edit/output', methods=['post'])
def edit_output():
form = request.form.to_dict()
result = output_service.edit_output(form)
return result.get()
# 删除单个产量接口
@app.route('/del/output/<int:id>', methods=['post'])
def del_output(id):
result = output_service.del_output(id)
return result.get()
# 批量删除产量接口
@app.route('/del/output', methods=['post'])
def del_output_list():
ids = request.args.get('ids')
result = output_service.del_output_list(ids)
return result.get()
# 产量数据分页接口
@app.route('/list/output', methods=['get'])
def output_list():
page = request.args.get('page')
limit = request.args.get('limit')
where = request.args.get('searchParams')
result = output_service.select_output_list(page, limit, where)
return result.get()
# ----------------------------------------------产量相关模块结束----------------------------------------------
# ----------------------------------------------气象相关模块开始----------------------------------------------
# 气象添加页面跳转
@app.route('/page/weather/add', methods=['get'])
def page_weather_add():
return render_template("page/weather/add.html")
# 气象新增接口
@app.route('/add/weather', methods=['post'])
def add_weather():
form = request.form.to_dict()
result = weather_service.insert_weather(form)
return result.get()
# 气象编辑页面跳转
@app.route('/page/weather/edit', methods=['get'])
def page_weather_edit():
id = request.args.get('id')
weather = weather_service.get_weather(id)
return render_template("page/weather/edit.html", weather=weather)
# 气象编辑接口
@app.route('/edit/weather', methods=['post'])
def edit_weather():
form = request.form.to_dict()
result = weather_service.edit_weather(form)
return result.get()
# 删除单个气象接口
@app.route('/del/weather/<int:id>', methods=['post'])
def del_weather(id):
result = weather_service.del_weather(id)
return result.get()
# 批量删除气象接口
@app.route('/del/weather', methods=['post'])
def del_weather_list():
ids = request.args.get('ids')
result = weather_service.del_weather_list(ids)
return result.get()
# 气象数据分页接口
@app.route('/list/weather', methods=['get'])
def weather_list():
page = request.args.get('page')
limit = request.args.get('limit')
where = request.args.get('searchParams')
result = weather_service.select_weather_list(page, limit, where)
return result.get()
# ----------------------------------------------气象相关模块结束----------------------------------------------
# ----------------------------------------------预测相关模块开始----------------------------------------------
# 预测数据接口
@app.route('/predict/data', methods=['get'])
def predict_data():
result = predict_service.get_predict_data()
return result.get()
# ----------------------------------------------预测相关模块结束----------------------------------------------
if __name__ == '__main__':
# 端口号设置
app.run(host="127.0.0.1", port=5000)
5、项目列表





AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)