Compare commits

..

2 Commits

Author SHA1 Message Date
hjc-abc bd36728c06 1
1 week ago
hjc-abc 89bcf750a1 1
1 week ago

@ -0,0 +1,3 @@
# 默认忽略的文件
/shelf/
/workspace.xml

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_22" default="true" project-jdk-name="22" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/玉米病虫害识别系统.iml" filepath="$PROJECT_DIR$/.idea/玉米病虫害识别系统.iml" />
</modules>
</component>
</project>

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -0,0 +1,704 @@
# -*- coding: utf-8 -*-
import torchvision.models.resnet as resnet
import os
import torch
import torch.nn.functional as F
import torchvision.transforms as transforms
from PIL import Image
import numpy as np
from flask import Flask, render_template, request, redirect, url_for, flash, session, jsonify
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
from datetime import datetime
import requests
app = Flask(__name__, instance_path=os.path.abspath('instance'))
app.secret_key = 'your_secret_key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db' # 数据库文件在 instance 文件夹中
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///Corn' # 数据库文件在 instance 文件夹中
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
class SimpleQA:
def __init__(self):
# 初始化问题和答案的字典
self.qa_pairs = {
"你好吗?": "我很好,谢谢!",
"今天天气怎么样?": "我无法获取实时天气信息。",
"你喜欢什么颜色?": "作为AI我没有个人喜好。",
"玉米斑病": "分为大斑病和小斑病主要危害叶片、叶鞘严重时还会影响果穗和苞叶。防治方法包括在发病初期喷洒品润500-600倍液时间间隔15-20天连续喷洒3次。",
"玉米黑粉病": "常见于幼苗到成株期可感染植株、果实等部位。防治方法包括种植初期使用多菌灵或三唑酮拌种采用2-3年农作物轮流种植使用有机肥。",
"玉米粘虫病": "幼虫喜食玉米叶片,形成大范围病害时玉米叶子会短时间内被啃食干净。防治方法包括使用杀菊酯乳油或灭扫利进行喷雾。",
"玉米螟": "通过取食心叶、叶片、钻食茎秆等方式为害。防治方法包括使用辛硫磷颗粒剂撒施或辛硫磷乳油喷雾于玉米心叶内。。",
"玉米大斑病": "主要危害叶片,严重时可危害叶鞘和苞叶。防治方法包括使用好速净、速克净等药剂喷施。",
"玉米小斑病": "从苗期到成熟期均可发生,主要危害叶部。防治方法包括摘除病叶,使用多菌灵或托布津喷洒。",
"玉米锈病": "影响叶片和果穗,病原菌通过风力传播。防治方法包括科学施肥,增加磷钾肥比例,使用三唑酮乳油或石硫合剂喷洒。",
"玉米播种时该注意什么": "玉米播种时需要注意以下几个方面1.播种时间选择适宜的播种时间非常重要通常根据当地的气候条件来确定。玉米适宜的播种温度大约在15-18℃之间。过早播种可能会遇到低温影响种子发芽过晚播种则可能会影响产量。2.土壤条件确保土壤湿度适宜不宜过湿或过干。土壤应该松软、透气有利于种子发芽和根系发展。种子质量选择高质量、无病虫害的种子。检查种子发芽率确保在播种前种子具有高发芽率。可以进行种子处理如消毒、包衣等以提高抗病能力和发芽率。3.播种深度播种深度一般为3-5厘米具体深度取决于土壤类型和气候条件。播种过深可能导致种子发芽困难过浅则可能导致种子干燥或被鸟类等动物吃掉。4.行距和株距根据品种特性和土壤肥力确定合适的行距和株距以保证良好的通风透光和光合作用。5.播种方式可以采用条播、点播或撒播等方式。条播和点播有利于后期管理和机械化操作。6.覆土播种后要及时覆土覆土要均匀避免形成空洞。7.防虫害播种后可以采取措施防止地下害虫对种子和幼芽的危害。8.水分管理播种后根据土壤湿度情况适时浇水但不宜过多以免造成土壤温度过低影响发芽。9.记录:记录播种日期、品种、播种量和播种方式等信息,以便于后期管理和收获。",
"玉米生长过程中的注意事项": "1.水分管理确保玉米生长期间有充足的水分特别是在拔节期、抽雄期和灌浆期。避免水分过多导致根部病害或植株倒伏。2.施肥根据土壤肥力情况施足底肥通常以有机肥为主。在玉米生长的关键时期如拔节期和抽雄期适量追施氮肥、磷肥和钾肥。注意施肥均匀避免烧根。3.病虫害防治定期检查玉米植株及时发现并防治病虫害如玉米螟、叶蝉、纹枯病等。采用轮作、抗病品种、生物防治和化学防治相结合的方法。4.杂草控制在玉米苗期及时进行中耕除草减少杂草与玉米争水争肥。可以使用除草剂但需注意选择对玉米安全的除草剂并严格按照说明书使用。5.植株调整对于某些品种可能需要进行摘心或去除多余的雄穗以促进养分集中供应果穗。6.防倒伏选择抗倒伏能力强的品种。合理密植避免种植密度过高。在拔节期前进行培土增强植株稳定性。7.环境监测关注天气预报预防极端天气如干旱、洪涝、冰雹等对玉米生长的影响。在气温较高、湿度较大的季节注意预防热害。8.适时收获:确定适宜的收获时间,通常玉米乳熟期末至蜡熟期为最佳收获期。避免收获过早或过晚,影响产量和品质。记录和评估:记录生长过程中的关键管理措施和天气情况,为下一季种植提供参考。收获后评估产量和品质,分析原因,不断优化种植技术。",
"玉米化肥的使用": "1.基肥 施用时间:播种前.推荐肥料有机肥如充分腐熟的农家肥。化肥类型氮肥如尿素、硫酸铵、磷肥如过磷酸钙、磷酸二铵、钾肥如硫酸钾、氯化钾。用量根据土壤肥力情况一般每亩施用氮肥15-20公斤、磷肥30-40公斤、钾肥15-20公斤。2.种肥施用时间播种时与种子一起施入。推荐肥料磷酸二铵或复合肥。用量每亩5-10公斤注意与种子保持适当距离防止烧种。3.追肥提苗肥施用时间玉米出苗后至拔节前。推荐肥料尿素或硝酸铵。用量每亩施用尿素5-10公斤。拔节肥施用时间玉米拔节期。推荐肥料尿素或硝酸铵。用量每亩施用尿素10-15公斤孕穗肥。施用时间玉米大喇叭口期孕穗期。推荐肥料尿素或硝酸铵。用量每亩施用尿素15-20公斤吐丝肥视情况而定。施用时间玉米抽雄吐丝期。推荐肥料尿素或硝酸铵。用量每亩施用尿素5-10公斤主要用于土壤肥力较差或后期脱肥的地块",
# 可以继续添加更多问题和答案
}
def add_qa_pair(self, question, answer):
# 添加问题和答案到字典
self.qa_pairs[question] = answer
def get_answer(self, question):
# 获取问题对应的答案
question = question.strip()
return self.qa_pairs.get(question, "对不起,我不知道这个问题的答案。")
# 创建问答系统实例
qa_system = SimpleQA()
db = SQLAlchemy(app)
# 用户模型
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100), unique=True, nullable=False)
password = db.Column(db.String(200), nullable=False)
# 书籍模型
class Book(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(200), nullable=False)
author = db.Column(db.String(100), nullable=False)
# 评论模型
class Comment(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
timestamp = db.Column(db.DateTime, default=datetime.utcnow)
replies = db.relationship('Reply', backref='comment', lazy=True) # 一对多关系
# 回复模型
class Reply(db.Model):
id = db.Column(db.Integer, primary_key=True)
comment_id = db.Column(db.Integer, db.ForeignKey('comment.id'), nullable=False)
username = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
timestamp = db.Column(db.DateTime, default=datetime.utcnow)
# 玉米病虫害模型
class Pest(db.Model):
__tablename__ = 'pest'
PestName = db.Column(db.Text, primary_key=True, nullable=False)
PestCause = db.Column(db.Text, nullable=False)
Symptoms = db.Column(db.Text, nullable=False)
Solution = db.Column(db.Text, nullable=False)
def __repr__(self):
return f'Pest(PestNam={self.PestNam})'
# 初始化数据库
with app.app_context():
db.create_all()
@app.route('/')
def home():
return render_template('login.html')
@app.route('/login', methods=['POST'])
def login():
usr_name = request.form['username']
usr_pwd = request.form['password']
user = User.query.filter_by(username=usr_name).first()
if user and check_password_hash(user.password, usr_pwd):
session['username'] = usr_name
flash(f'欢迎光临 {usr_name}:请进入个人首页,查看最新资讯')
return redirect(url_for('main'))
else:
flash('错误提示:用户名或密码不正确,请重试')
return redirect(url_for('home'))
@app.route('/signup', methods=['GET', 'POST'])
def signup():
if request.method == 'POST':
nn = request.form['new_username']
np = request.form['new_password']
npf = request.form['confirm_password']
if np != npf:
flash('错误提示:密码和确认密码必须一样')
elif User.query.filter_by(username=nn).first() is not None:
flash('错误提示:用户名已被注册!')
else:
new_user = User(username=nn, password=generate_password_hash(np))
db.session.add(new_user)
db.session.commit()
flash('欢迎:你已经成功注册!')
return redirect(url_for('home'))
return render_template('signup.html')
@app.route('/main')
def main():
if 'username' not in session:
flash('请先登录!')
return redirect(url_for('home'))
return render_template('main.html')
@app.route('/re_reading', methods=['GET', 'POST'])
def re_reading():
if 'username' not in session:
flash('请先登录!')
return redirect(url_for('home'))
if request.method == 'POST':
title = request.form.get('title')
author = request.form.get('author')
new_book = Book(title=title, author=author)
db.session.add(new_book)
db.session.commit()
flash(f'成功添加书籍:{title},作者:{author}')
return redirect(url_for('re_reading'))
books = Book.query.all()
return render_template('reading.html', books=books)
@app.route('/read_book/<int:book_id>')
def read_book(book_id):
book = Book.query.get_or_404(book_id)
return render_template('fetched_books.html', book=book)
@app.route('/delete_book/<int:book_id>', methods=['POST'])
def delete_book(book_id):
if 'username' not in session:
flash('请先登录!')
return redirect(url_for('home'))
book = Book.query.get_or_404(book_id)
db.session.delete(book)
db.session.commit()
flash(f'成功删除书籍:{book.title}')
return redirect(url_for('re_reading'))
@app.route('/re_search', methods=['GET', 'POST'])
def re_search():
if 'username' not in session:
flash('请先登录!')
return redirect(url_for('home'))
result = ""
if request.method == 'POST':
query = request.form.get('query')
result = f"查询结果:{query}"
return render_template('search.html', result=result)
@app.route('/re_image_recognition')
def re_image_recognition():
if 'username' not in session:
flash('请先登录!')
return redirect(url_for('home'))
return render_template('index.html')
@app.route('/re_forum', methods=['GET'])
def re_forum():
if 'username' not in session:
flash('请先登录!')
return redirect(url_for('home'))
comments = Comment.query.order_by(Comment.timestamp.desc()).all()
return render_template('forum.html', comments=comments)
@app.route('/index')
def index():
result_message = request.args.get('result', '')
return render_template('index.html', result=result_message)
@app.route('/submit_comment', methods=['POST'])
def submit_comment():
if 'username' not in session:
flash('请先登录!')
return redirect(url_for('home'))
content = request.form['content']
new_comment = Comment(username=session['username'], content=content)
db.session.add(new_comment)
db.session.commit()
flash('评论成功!')
return redirect(url_for('re_forum'))
@app.route('/submit_reply/<int:comment_id>', methods=['POST'])
def submit_reply(comment_id):
if 'username' not in session:
flash('请先登录!')
return redirect(url_for('home'))
content = request.form['content']
new_reply = Reply(comment_id=comment_id, username=session['username'], content=content)
db.session.add(new_reply)
db.session.commit()
flash('回复成功!')
return redirect(url_for('re_forum'))
@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('home'))
@app.route('/fetch_books', methods=['GET'])
def fetch_books():
response = requests.get('https://www.googleapis.com/books/v1/volumes?q=python') # 示例 API
if response.status_code == 200:
books_data = response.json()
return render_template('fetched_books.html', books=books_data['items'])
else:
flash('无法获取书籍数据,请稍后再试。')
return redirect(url_for('main'))
@app.route('/diseasequery', methods=['POST'])
def disease_query():
inputEntry = request.form.get('inputEntry')
if not inputEntry :
return jsonify({'error': '请输入查询内容'}), 400
pest = Pest.query.filter_by(PestName=inputEntry ).first()
if not pest:
return jsonify({'error': '未找到相关病虫害信息'}), 404
return jsonify({
'PestName': pest.PestName,
'PestCause': pest.PestCause,
'Symptoms': pest.Symptoms,
'Solution': pest.Solution
})
torch.serialization.add_safe_globals({"ResNet": resnet.ResNet})
# 有 GPU 就用 GPU没有就用 CPU
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
os.chdir('E:/PyCharm 2024.2.1/PycharmProjects/pythonProject3/数据集')
# 载入模型
model_path = 'checkpoint/dataset_pytorch_C2.pth'
model = torch.load(model_path, map_location=device, weights_only=False)
model.eval().to(device)
# 测试集图像预处理
test_transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# 类别映射
idx_to_labels = np.load('idx_to_labels.npy', allow_pickle=True).item()
@app.route('/re_image_recognition', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return jsonify({'error': '没有文件上传'}), 400
file = request.files['file']
if file.filename == '':
return jsonify({'error': '未选择任何文件'}), 400
img_path = os.path.join("uploads", file.filename)
file.save(img_path)
# 打开并预处理图像
img_pil = Image.open(img_path)
input_img = test_transform(img_pil).unsqueeze(0).to(device)
# 前向预测
with torch.no_grad():
pred_logits = model(input_img)
# 计算 softmax
pred_softmax = F.softmax(pred_logits, dim=1)
# 找到置信度最大的前 n 个结果
n = 10
top_n = torch.topk(pred_softmax, n)
pred_ids = top_n[1].cpu().numpy().squeeze()
confs = top_n[0].cpu().numpy().squeeze()
# 找到最大置信度的类别名称
max_conf_index = np.argmax(confs)
max_conf_class_name = idx_to_labels[pred_ids[max_conf_index]]
# 根据类别名称输出相应的应对措施
if max_conf_class_name == "叶斑病":
action = (
"为害症状:主要为害叶片和苞叶。病斑不规则、透光,中央灰白色,边缘褐色,上生黑色小点,即病原菌的子囊座。\n"
"形态特征:\n"
"病菌子囊座生在叶片两面散生或聚生初埋生具圆形孔口露在表皮外。子囊矩圆形近棒形至囊形大小3555×7.58.5微米。子囊孢子矩圆形无色具隔膜1个隔膜处稍缢缩细胞中具油滴12个大小1416×3.54微米。\n"
"传播途径:\n"
"病菌在病残体上越冬,翌年春季形成子囊孢子,进行初侵染。\n"
"发病条件:\n"
"冷湿条件易发病。\n"
"防治方法\n"
"(1)及时收集病残体烧毁。\n"
"(2)结合防治玉米其它叶斑病及早喷洒75%百菌清可湿性粉剂1000倍液加70%甲基硫菌灵可湿性粉剂1000倍液或75%百菌清可湿性粉剂1000倍液加70%代森锰锌可湿性粉剂1000倍液、40%多·硫悬浮剂500倍液、50%复方硫菌灵可湿性粉剂800倍液隔10天左右1次连续防治12次。"
)
html_action = action.replace("\n", "<br>")
print(html_action)
elif max_conf_class_name == "夜蛾":
action = (
"为害症状:幼虫取食植物叶片,造成叶片缺刻或孔洞,严重时可将叶片吃光,仅剩叶脉。\n"
"形态特征:\n"
"成虫体长14-20毫米翅展35-40毫米前翅灰褐色有明显的黑色斑点幼虫体色多变通常为绿色或褐色体表有明显的纵向条纹。\n"
"传播途径:\n"
"成虫飞行传播,幼虫也可通过寄主植物的运输传播。\n"
"发病条件:\n"
"温暖湿润的气候条件有利于夜蛾的繁殖和为害,尤其在春季和夏季为害严重。\n"
"防治方法\n"
"(1)及时清除田间杂草,减少夜蛾产卵场所。\n"
"(2)使用生物农药如Bt苏云金杆菌制剂喷洒或使用2.5%溴氰菊酯乳油2000倍液、5%高效氯氰菊酯乳油1500倍液等化学药剂进行防治。"
)
html_action = action.replace("\n", "<br>")
return render_template('your_template.html', result=html_action)
elif max_conf_class_name == "大地老虎":
action = (
"为害症状:\n"
"大地老虎的幼虫在春季啃食作物幼苗,造成断苗和断垄现象。幼虫尤其喜欢在土表下啃食作物的根部,严重时可导致整株作物死亡。\n"
"形态特征:\n"
"成虫为中等大小的蛾类体长约20-23毫米翅展约45-50毫米前翅为灰褐色具有两条明显的波状横纹。幼虫体长约40-50毫米体色为深褐色或黑褐色体表有小刺。\n"
"传播途径:\n"
"成虫在夜间飞行,通过成虫的迁徙传播种群。\n"
"发病条件:\n"
"大地老虎在温暖湿润的土壤中繁殖迅速,尤其在春季和秋季为害严重。\n"
"防治方法:\n"
"(1) 在幼虫为害期,及时清除田间杂草,减少大地老虎的栖息地。\n"
"(2) 使用50%辛硫磷乳油1000倍液或20%氰戊菊酯乳油2000倍液喷洒对幼虫进行防治。\n"
"(3) 可以采用毒饵诱杀如用炒香的麦麸或玉米粉拌入5%辛硫磷颗粒剂,撒在田间诱杀幼虫。"
)
html_action = action.replace("\n", "<br>")
print(html_action)
elif max_conf_class_name == "小地老虎":
action = (
"为害症状:\n"
"小地老虎的幼虫在夜间活动,主要危害作物幼苗,造成断苗、缺苗和断垄现象。幼虫尤其喜欢在土表下啃食作物的根部和嫩茎,严重时可导致整株作物死亡。\n"
"形态特征:\n"
"成虫为中等大小的蛾类体长约16-23毫米翅展约37-45毫米前翅为灰褐色具有明显的黑色斑点和波状横纹。幼虫体长约18-24毫米体色为黑褐色体表有明显的小刺。\n"
"传播途径:\n"
"成虫在夜间飞行,通过成虫的迁徙传播种群。\n"
"发病条件:\n"
"小地老虎在温暖湿润的土壤中繁殖迅速,尤其在春季和秋季为害严重。\n"
"防治方法:\n"
"(1) 在幼虫为害期,及时清除田间杂草,减少小地老虎的栖息地。\n"
"(2) 使用50%辛硫磷乳油1000倍液或20%氰戊菊酯乳油2000倍液喷洒对幼虫进行防治。\n"
"(3) 可以采用毒饵诱杀如用炒香的麦麸或玉米粉拌入5%辛硫磷颗粒剂,撒在田间诱杀幼虫。"
)
html_action = action.replace("\n", "<br>")
print(html_action)
elif max_conf_class_name == "桃蛀螟":
action = (
"为害症状:\n"
"桃蛀螟的幼虫主要危害桃、李、杏等核果类果树的果实,造成果实腐烂和脱落。幼虫在果内蛀食果肉,常造成果实畸形和蛀孔,影响果实的品质和产量。\n"
"形态特征:\n"
"成虫体长约10-15毫米翅展约20-30毫米前翅为黄色具有黑色斑点和波状横纹。\n"
"幼虫体长约20-30毫米体色为淡黄色或黄褐色体表有明显的黑色斑点。\n"
"传播途径:\n"
"成虫在夜间飞行,通过成虫的迁徙传播种群;卵散产在果实表面,孵化后幼虫直接蛀入果实内。\n"
"发病条件:\n"
"桃蛀螟在温暖湿润的环境中繁殖迅速,尤其在夏季为害严重。\n"
"防治方法:\n"
"(1) 果实套袋:在果实膨大期进行果实套袋,防止成虫产卵和幼虫蛀入果实。\n"
"(2) 灯光诱杀:利用成虫的趋光性,在果园内设置黑光灯或太阳能杀虫灯进行诱杀。\n"
"(3) 化学防治在成虫发生期和幼虫孵化初期使用10%氯氰菊酯乳油1000倍液或20%氰戊菊酯乳油2000倍液喷洒对成虫和幼虫进行防治。"
)
html_action = action.replace("\n", "<br>")
print(html_action)
elif max_conf_class_name == "灰斑病":
action = (
"为害症状:\n"
"灰斑病主要为害叶片。病斑初期为圆形或近圆形,边缘明显,褐色,中央灰白色,后期病斑上生出黑色小点,即病原菌的分生孢子器。严重时叶片布满病斑,导致叶片枯黄脱落。\n"
"形态特征:\n"
"分生孢子器扁圆形或近球形暗褐色大小为100-200微米孔口明显。\n"
"分生孢子卵形或椭圆形无色单胞大小为5-10×3-5微米。\n"
"传播途径:\n"
"病菌以分生孢子器在病叶上越冬,翌年春季形成分生孢子,借助风雨进行传播,引起初侵染和再侵染。\n"
"发病条件:\n"
"高温高湿条件易发病,尤其是多雨季节和湿度大的环境有利于病害的发生和流行。\n"
"防治方法:\n"
"(1) 农业防治:\n"
"及时清除病叶,减少病原菌的越冬场所。\n"
"加强田间管理,合理施肥,增强植株的抗病能力。\n"
"(2) 化学防治:\n"
"在发病初期使用50%多菌灵可湿性粉剂800倍液或70%甲基硫菌灵可湿性粉剂1000倍液喷洒隔7-10天喷一次连续防治2-3次。"
)
html_action = action.replace("\n", "<br>")
print(html_action)
elif max_conf_class_name == "玉米螟":
action = (
"为害症状:\n"
"玉米螟主要为害玉米的心叶、茎秆和果穗。幼虫蛀食玉米心叶,造成排孔状的食痕;蛀入茎秆后,导致植株折断;蛀入果穗,影响籽粒发育,严重时导致籽粒霉烂。\n"
"形态特征:\n"
"成虫体长10-15毫米翅展20-30毫米前翅为黄褐色具有暗褐色波状横纹。\n"
"幼虫体长20-30毫米体色为淡黄色或浅褐色背部有明显的暗褐色纵线。\n"
"传播途径:\n"
"玉米螟成虫具有较强的飞行能力,通过迁飞传播。卵通常产在玉米叶片背面,孵化后的幼虫会蛀入玉米心叶或茎秆内为害。\n"
"发病条件:\n"
"温暖湿润的气候条件有利于玉米螟的发生和繁殖,特别是在夏季高温多雨的季节,玉米螟的发生更为严重。\n"
"防治方法:\n"
"(1) 农业防治:\n"
"秋季深翻土地,减少越冬虫源。\n"
"清除田间玉米秸秆和残茬,减少虫源基数。\n"
"选择抗虫品种,减轻为害。\n"
"(2) 生物防治:\n"
"释放天敌,如赤眼蜂,寄生玉米螟卵,减少幼虫发生。\n"
"(3) 化学防治:\n"
"在玉米心叶期使用2.5%溴氰菊酯乳油1000倍液或40%乐果乳油800倍液喷洒重点喷施玉米心叶。\n"
"在成虫产卵期和幼虫孵化初期使用50%辛硫磷乳油1000倍液喷洒防治效果较好。"
)
elif max_conf_class_name == "白心花金龟":
action = (
"为害症状:\n"
"白心花金龟主要为害果树、花卉和观赏植物的花朵和叶片。成虫和幼虫均能为害,成虫啃食花朵和叶片,造成花瓣和叶片残缺不全;幼虫在土壤中取食植物根部,导致植株生长不良。\n"
"形态特征:\n"
"成虫体长约20-25毫米体色为亮绿色或铜绿色具有金属光泽。前胸背板和鞘翅上具有白色斑纹腹部为黑色具有白色心形图案。\n"
"幼虫体长约40-50毫米体色为白色头部为褐色体表光滑。\n"
"传播途径:\n"
"白心花金龟成虫具有较强的飞行能力,通过迁飞传播。卵产在土壤中,孵化后的幼虫在土壤中取食植物根部。\n"
"发病条件:\n"
"温暖湿润的气候条件有利于白心花金龟的发生和繁殖,特别是在春季和夏季,白心花金龟的活动更为频繁。\n"
"防治方法:\n"
"(1) 农业防治:\n"
"清理田间杂草,减少成虫的栖息地。\n"
"在果树或花卉开花前,进行土壤翻耕,破坏幼虫的栖息环境。\n"
"(2) 生物防治:\n"
"释放寄生蜂等天敌,控制幼虫和成虫的数量。\n"
"(3) 化学防治:\n"
"在成虫活动高峰期使用50%辛硫磷乳油1000倍液或2.5%溴氰菊酯乳油1000倍液喷洒防治成虫。\n"
"在幼虫发生期使用50%辛硫磷颗粒剂撒施于植株根部周围,防治幼虫。"
)
html_action = action.replace("\n", "<br>")
print(html_action)
elif max_conf_class_name == "白边蛾":
action = (
"为害症状:\n"
"白边蛾主要为害棉花、玉米、豆类等作物。幼虫取食叶片,造成叶片缺刻或孔洞,严重时可将叶片食尽,影响作物的光合作用和产量。\n"
"形态特征:\n"
"成虫体长约15-20毫米翅展约35-45毫米。前翅为灰褐色具有明显的白色边缘和白色斑点后翅为灰白色。\n"
"幼虫体长约30-40毫米体色为绿色或褐色体表具有明显的黑色斑点头部为褐色。\n"
"传播途径:\n"
"白边蛾成虫具有较强的飞行能力,通过迁飞传播。卵通常产在作物叶片背面,孵化后的幼虫取食叶片。\n"
"发病条件:\n"
"温暖湿润的气候条件有利于白边蛾的发生和繁殖,特别是在夏季高温多雨的季节,白边蛾的发生更为严重。\n"
"防治方法:\n"
"(1) 农业防治:\n"
"清除田间杂草,减少成虫的栖息地。\n"
"加强田间管理,及时清除受害叶片,减少虫源基数。\n"
"(2) 生物防治:\n"
"释放寄生蜂等天敌,控制幼虫和成虫的数量。\n"
"(3) 化学防治:\n"
"在幼虫发生初期使用50%辛硫磷乳油1000倍液或2.5%溴氰菊酯乳油1000倍液喷洒防治幼虫。\n"
"在成虫活动高峰期使用40%乐果乳油800倍液喷洒防治成虫。"
)
html_action = action.replace("\n", "<br>")
print(html_action)
elif max_conf_class_name == "红蜘蛛":
action = (
"为害症状:\n"
"红蜘蛛主要为害果树、蔬菜、棉花、花卉等作物。幼螨、若螨和成螨均能为害,取食叶片汁液,导致叶片出现黄白色小点,严重时叶片变黄、干枯,甚至脱落,影响作物的光合作用和产量。\n"
"形态特征:\n"
"成螨体长约0.4-0.6毫米体色为红色或橙黄色体表光滑。足4对前两对足较长。\n"
"幼螨体长约0.2毫米体色为淡黄色足3对。\n"
"传播途径:\n"
"红蜘蛛通过风、雨水、昆虫等传播。成螨和幼螨在叶片背面取食,并在叶片背面的缝隙中产卵。\n"
"发病条件:\n"
"高温干燥的气候条件有利于红蜘蛛的发生和繁殖,特别是在夏季高温少雨的季节,红蜘蛛的发生更为严重。\n"
"防治方法:\n"
"(1) 农业防治:\n"
"加强田间管理,及时清除田间杂草,减少虫源基数。\n"
"在红蜘蛛发生初期,及时清除受害叶片,减少虫源传播。\n"
"(2) 生物防治:\n"
"释放捕食性螨类,如智利小植绥螨,控制红蜘蛛的数量。\n"
"(3) 化学防治:\n"
"在红蜘蛛发生初期使用1.8%阿维菌素乳油1000倍液或20%哒螨灵乳油1500倍液喷洒防治成螨和幼螨。\n"
"注意轮换用药,避免红蜘蛛产生抗药性。"
)
html_action = action.replace("\n", "<br>")
print(html_action)
elif max_conf_class_name == "蚜虫":
action = (
"为害症状:\n"
"蚜虫主要为害果树、蔬菜、棉花、花卉等作物。成虫和若虫均能为害,吸取植物汁液,导致叶片卷曲、皱缩、变黄,影响作物的光合作用和生长发育。严重时可导致植株死亡。\n"
"形态特征:\n"
"成虫体长约1-5毫米体色多样常见的有绿色、黄色、黑色等。触角较长通常为6节。足3对前两对足较长。\n"
"若虫体长约0.5-2毫米体色与成虫相似但体型较小触角和足较短。\n"
"传播途径:\n"
"蚜虫通过爬行、飞行和有翅蚜迁飞传播。有翅蚜具有较强的飞行能力,可远距离迁飞。无翅蚜主要通过爬行和人工搬运传播。\n"
"发病条件:\n"
"温暖湿润的气候条件有利于蚜虫的发生和繁殖,特别是在春季和夏季,蚜虫的发生更为严重。土壤肥沃、水分充足的环境也利于蚜虫的繁殖。\n"
"防治方法:\n"
"(1) 农业防治:\n"
"加强田间管理,及时清除田间杂草,减少虫源基数。\n"
"定期修剪植株,去除受害叶片,减少虫源传播。\n"
"合理施肥,增强植株的抗虫能力。\n"
"(2) 生物防治:\n"
"释放天敌,如瓢虫、草蛉等,控制蚜虫的数量。\n"
"(3) 化学防治:\n"
"在蚜虫发生初期使用10%吡虫啉可湿性粉剂1000倍液或2.5%溴氰菊酯乳油1500倍液喷洒防治成虫和若虫。\n"
"注意轮换用药,避免蚜虫产生抗药性。"
)
html_action = action.replace("\n", "<br>")
print(html_action)
elif max_conf_class_name == "蛴螬":
action = (
"为害症状:\n"
"蛴螬主要为害花生、大豆、玉米、马铃薯、棉花等作物。幼虫(蛴螬)取食作物根系,导致植株生长不良、叶片发黄、萎蔫甚至死亡。严重时可导致作物大幅度减产。\n"
"形态特征:\n"
"成虫金龟子体长约15-30毫米体色为黑色或褐色具有金属光泽。翅鞘坚硬具有明显的纵向条纹。\n"
"幼虫蛴螬体长约20-40毫米体色为乳白色头部为褐色体表具有明显的纵向皱纹和刚毛。\n"
"传播途径:\n"
"蛴螬主要通过土壤传播。成虫在土壤中产卵,孵化后的幼虫取食作物根系。成虫也可通过迁飞传播。\n"
"发病条件:\n"
"土壤疏松、肥沃、水分充足的环境有利于蛴螬的发生和繁殖。特别是在春季和秋季,蛴螬的活动更为频繁。\n"
"防治方法:\n"
"(1) 农业防治:\n"
"合理轮作,避免连作,减少蛴螬的繁殖地。\n"
"深耕土壤,破坏蛴螬的栖息环境。\n"
"清除田间杂草,减少成虫的栖息地。\n"
"(2) 生物防治:\n"
"释放寄生蜂等天敌,控制蛴螬的数量。\n"
"(3) 化学防治:\n"
"在蛴螬发生初期使用50%辛硫磷乳油1000倍液或2.5%溴氰菊酯乳油1000倍液灌根防治幼虫。\n"
"在成虫活动高峰期使用40%乐果乳油800倍液喷洒防治成虫。"
)
html_action = action.replace("\n", "<br>")
print(html_action)
elif max_conf_class_name == "蝼蛄":
action = (
"为害症状:\n"
"蝼蛄主要为害玉米、大豆、花生、甘薯、蔬菜等作物。成虫和若虫均能为害,取食作物幼苗的根系和茎部,导致幼苗死亡或生长不良,严重影响作物的生长发育和产量。\n"
"形态特征:\n"
"成虫体长约30-40毫米体色为棕褐色或黑褐色具有明显的翅鞘。前足特化为铲状适应于掘土。\n"
"若虫体长约10-20毫米体色与成虫相似但体型较小前足未特化为铲状。\n"
"传播途径:\n"
"蝼蛄主要通过土壤传播。成虫在土壤中产卵,孵化后的若虫取食作物根系。成虫和若虫也可通过爬行和人工搬运传播。\n"
"发病条件:\n"
"土壤疏松、肥沃、含水量适中的环境有利于蝼蛄的发生和繁殖。特别是在春季和秋季,蝼蛄的活动更为频繁。\n"
"防治方法:\n"
"(1) 农业防治:\n"
"合理轮作,避免连作,减少蝼蛄的繁殖地。\n"
"深耕土壤,破坏蝼蛄的栖息环境。\n"
"清除田间杂草,减少成虫和若虫的栖息地。\n"
"(2) 生物防治:\n"
"释放寄生蜂等天敌,控制蝼蛄的数量。\n"
"(3) 化学防治:\n"
"在蝼蛄发生初期使用50%辛硫磷乳油1000倍液或2.5%溴氰菊酯乳油1000倍液灌根防治若虫。\n"
"在成虫活动高峰期使用40%乐果乳油800倍液喷洒防治成虫。"
)
html_action = action.replace("\n", "<br>")
print(html_action)
elif max_conf_class_name == "锈病":
action = (
"为害症状:\n"
"锈病是一种常见的植物病害,主要为害小麦、大麦、玉米、大豆、花生、苹果、梨、葡萄等作物。病叶、病茎、病果表面出现黄色或橙色的锈色斑点,随后斑点中央破裂,散发出锈色粉末,即病原菌的孢子。严重时,叶片变黄、枯死,影响作物的光合作用和生长发育,导致减产。\n"
"形态特征:\n"
"病斑:初期为黄色小斑点,逐渐扩大为圆形或椭圆形的锈色斑点,表面有明显的隆起。\n"
"病原菌(锈菌):孢子为橙色或黄色的粉末状,可通过风力传播。\n"
"传播途径:\n"
"锈病主要通过风力传播。病原菌的孢子随风飘散,落在健康植株上,通过伤口或气孔侵入植物组织,引起发病。\n"
"发病条件:\n"
"温暖湿润的气候条件有利于锈病的发生和传播。特别是在春季和秋季,气温适宜、湿度较高时,锈病的发病率较高。此外,种植密度过大、通风不良、土壤肥力不足等因素也利于锈病的发生。\n"
"防治方法:\n"
"(1) 农业防治:\n"
"选择抗病品种,种植抗锈病的作物品种。\n"
"合理密植,改善田间通风透光条件。\n"
"及时清除病叶、病茎、病果,减少病原菌的传播。\n"
"合理施肥,增强植株的抗病能力。\n"
"(2) 生物防治:\n"
"利用拮抗微生物,如木霉菌等,控制锈菌的繁殖。\n"
"(3) 化学防治:\n"
"在锈病发生初期使用25%三唑酮可湿性粉剂1500倍液或15%粉锈宁可湿性粉剂1000倍液喷洒防治锈病。\n"
"注意轮换用药,避免病原菌产生抗药性。"
)
html_action = action.replace("\n", "<br>")
print(html_action)
elif max_conf_class_name == "黄地老虎":
action = (
"为害症状:\n"
"黄地老虎主要为害玉米、大豆、棉花、花生、马铃薯、蔬菜等作物。幼虫(黄地老虎)取食作物幼苗,导致幼苗被切断或倒伏,严重影响作物的生长发育和产量。严重时,大面积的幼苗被毁,导致作物大幅度减产。\n"
"形态特征:\n"
"成虫黄地老虎蛾体长约15-20毫米前翅为黄褐色具有深褐色斑纹。后翅为白色翅脉明显。\n"
"幼虫黄地老虎体长约35-45毫米体色为黄褐色头部为黑色体表具有明显的刚毛。腹部末端有一对尾刺。\n"
"传播途径:\n"
"黄地老虎主要通过土壤传播。成虫在土壤中产卵,孵化后的幼虫取食作物幼苗。成虫也可通过迁飞传播。\n"
"发病条件:\n"
"土壤疏松、肥沃、水分充足的环境有利于黄地老虎的发生和繁殖。特别是在春季和秋季,黄地老虎的活动更为频繁。\n"
"防治方法:\n"
"(1) 农业防治:\n"
"合理轮作,避免连作,减少黄地老虎的繁殖地。\n"
"深耕土壤,破坏黄地老虎的栖息环境。\n"
"清除田间杂草,减少成虫的栖息地。\n"
"(2) 生物防治:\n"
"释放寄生蜂等天敌,控制黄地老虎的数量。\n"
"(3) 化学防治:\n"
"在黄地老虎发生初期使用50%辛硫磷乳油1000倍液或2.5%溴氰菊酯乳油1000倍液灌根防治幼虫。\n"
"在成虫活动高峰期使用40%乐果乳油800倍液喷洒防治成虫。"
)
html_action = action.replace("\n", "<br>")
print(html_action)
elif max_conf_class_name == "金针虫":
action = (
"为害症状:\n"
"金针虫主要为害农作物及园艺植物的根部和茎部。它们以幼虫形态在地下活动,咬食植物的根系和种子,导致植株生长不良、叶片发黄、枯萎,严重时可导致植株死亡。\n"
"形态特征:\n"
"成虫体长约15-22毫米体色呈黄色或黄褐色。头部较小口器发达触角丝状约11节。前胸背板呈方形鞘翅上有明显纵向条纹。\n"
"幼虫体长约25-30毫米呈扁平状体色淡黄身体呈节状腹部末端有3对尾须。\n"
"传播途径:\n"
"金针虫主要通过土壤传播,幼虫在土壤中活动,孵化后直接侵害植物根部。成虫在夜间活动,飞行能力弱。\n"
"发病条件:\n"
"土壤疏松、湿润且富含腐殖质的环境有利于金针虫的发生和繁殖。尤其是农田或园艺植物种植地的土壤条件适宜时,金针虫的危害较为严重。\n"
"防治方法:\n"
"(1) 农业防治:\n"
"深耕土壤,破坏金针虫的栖息环境。\n"
"合理轮作,避免连作,减少虫源基数。\n"
"使用有机肥料,增强土壤的生态平衡。\n"
"(2) 物理防治:\n"
"在种植前,进行土壤熏蒸处理,杀灭土壤中的金针虫。\n"
"(3) 化学防治:\n"
"在发现金针虫为害时使用50%辛硫磷乳油1000倍液或48%毒死蜱乳油1500倍液灌根防治幼虫。\n"
"注意轮换用药,避免金针虫产生抗药性。"
)
html_action = action.replace("\n", "<br>")
print(html_action)
else:
action = "未识别到具体应对措施"
result_message = f"具有最大置信度的类别名称:{max_conf_class_name}\n相关知识及应对措施:\n{action}"
return redirect(url_for('index', result=result_message))
@app.route('/get_answer', methods=['POST'])
def get_answer():
# 获取前端发送的问题
question = request.json.get('question', '')
# 使用问答系统获取答案
answer = qa_system.get_answer(question)
# 返回答案
return jsonify({'answer': answer})
if __name__ == '__main__':
if not os.path.exists("uploads"):
os.makedirs("uploads")
app.run(debug=True)

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

@ -0,0 +1,58 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ book.title }}</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
margin: 20px;
}
.container {
max-width: 800px;
margin: auto;
background: white;
padding: 20px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
h1 {
text-align: center;
}
.author {
font-size: 1.2em;
margin: 10px 0;
}
.content {
margin: 20px 0;
}
a {
display: inline-block;
margin-top: 20px;
padding: 10px 15px;
background-color: #4CAF50;
color: white;
text-decoration: none;
border-radius: 5px;
}
a:hover {
background-color: #45a049;
}
</style>
</head>
<body>
<div class="container">
<h1>{{ book.title }}</h1>
<p class="author"><strong>作者:</strong>{{ book.author }}</p>
<div class="content">
<strong>内容:</strong>
<p>书籍的内容将在这里展示...</p>
<!-- 可以在这里添加书籍的详细内容 -->
</div>
<a href="{{ url_for('re_reading') }}">返回书籍列表</a>
</div>
</body>
</html>

@ -0,0 +1,172 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>评论区</title>
<style>
body {
margin: 0;
min-height: 100vh;
background-image: url('{{ url_for('static', filename='images/2.jpg') }}');
background-size: cover;
background-position: center;
background-repeat: no-repeat;
font-family: Arial, sans-serif;
}
.back-button {
position: absolute; /* 定位返回按钮 */
top: 0;
left: 0;
font-size: 16px;
padding: 10px 30px;
background-color: green; /* Set button color to green */
color: white; /* Set text color to white for better visibility */
border: none; /* Optional: Remove border */
cursor: pointer; /* Optional: Change cursor on hover */
}
.comment-section {
background-color: rgba(255, 255, 255, 0.9);
padding: 20px;
border-radius: 12px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
max-width: 800px;
margin: 50px auto;
overflow: hidden;
}
.comment-header {
font-weight: bold;
color: #333;
}
.comment-body {
margin: 10px 0;
}
.comment-time {
font-size: 0.8em;
color: #aaa;
margin-top: 5px;
}
.reply-btn, .submit-btn, .logout-btn, .toggle-replies-btn {
background-color: #28a745;
color: white;
border: none;
padding: 6px 12px;
border-radius: 20px;
cursor: pointer;
margin-top: 10px;
transition: background-color 0.3s;
}
.reply-btn:hover, .submit-btn:hover, .logout-btn:hover, .toggle-replies-btn:hover {
background-color: #218838;
}
.reply-form {
margin-top: 10px;
display: none;
border-top: 1px solid #ddd;
padding-top: 10px;
}
.welcome-message {
text-align: right;
margin-bottom: 20px;
}
.comment {
margin-bottom: 20px;
padding: 15px;
border-radius: 10px;
background-color: rgba(240, 240, 240, 0.9);
transition: background-color 0.3s;
}
.comment:hover {
background-color: rgba(240, 240, 240, 1);
}
.sub-reply {
margin-top: 10px;
margin-left: 40px;
padding: 10px;
border-left: 3px solid #28a745;
background-color: rgba(220, 240, 220, 0.8);
border-radius: 8px;
}
.reply-header {
font-weight: bold;
color: #333;
}
</style>
<script>
function toggleReplies(commentId) {
const repliesContainer = document.getElementById('replies-' + commentId);
const toggleButton = document.getElementById('toggle-replies-btn-' + commentId);
if (repliesContainer.style.display === 'none' || repliesContainer.style.display === '') {
repliesContainer.style.display = 'block';
toggleButton.innerText = '隐藏回复评论';
} else {
repliesContainer.style.display = 'none';
toggleButton.innerText = '查看回复评论';
}
}
</script>
</head>
<body>
<button class="back-button" onclick="window.location.href='/main';">返回</button>
<h2 style="text-align: center; color: #333;">评论区</h2>
<div class="comment-section">
<div class="welcome-message">
{% if session.username %}
<span>欢迎,{{ session.username }}!</span>
<a href="{{ url_for('logout') }}" class="logout-btn">退出登录</a>
{% else %}
<a href="{{ url_for('login') }}">登录</a> | <a href="{{ url_for('signup') }}">注册</a>
{% endif %}
</div>
{% for comment in comments %}
<div class="comment">
<div class="comment-header">{{ comment.username }}</div>
<div class="comment-body">
<p>{{ comment.content }}</p>
</div>
<span class="comment-time">{{ comment.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}</span>
{% if session.username %}
<button class="reply-btn" onclick="document.getElementById('reply-form-{{ comment.id }}').style.display='block'">回复</button>
{% endif %}
<div id="reply-form-{{ comment.id }}" class="reply-form">
{% if session.username %}
<form action="{{ url_for('submit_reply', comment_id=comment.id) }}" method="post">
<textarea name="content" placeholder="输入你的回复评论..." required></textarea>
<button type="submit" class="submit-btn">提交回复评论</button>
</form>
{% else %}
<p>请登录以回复评论。</p>
{% endif %}
</div>
<input type="hidden" name="comment_id" value="{{ comment.id }}">
</form>
<button id="toggle-replies-btn-{{ comment.id }}" class="toggle-replies-btn" onclick="toggleReplies({{ comment.id }})">查看子评论</button>
<div id="replies-{{ comment.id }}" class="replies" style="display: none;">
{% for reply in comment.replies %}
<div class="sub-reply">
<div class="reply-header">@{{ reply.username }} 回复:</div>
<p>{{ reply.content }}</p>
<span class="comment-time">{{ reply.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}</span>
</div>
{% endfor %}
</div>
</div>
{% endfor %}
{% if session.username %}
<form action="{{ url_for('submit_comment') }}" method="post">
<span>{{ session.username }}</span>
<textarea name="content" placeholder="输入你的评论..." required style="width: 100%; height: 100px;"></textarea>
<button type="submit" class="submit-btn">提交评论</button>
</form>
{% else %}
<p>请登录以发表评论。</p>
{% endif %}
</div>
</body>
</html>

@ -0,0 +1,111 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>玉米病虫害图形识别</title>
<style>
body {
background-image: url('{{ url_for('static', filename='images/3.png') }}');
background-size: cover;
background-position: center;
background-repeat: no-repeat; /* 防止背景图片重复 */
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
font-family: Arial, sans-serif;
}
.container {
text-align: center;
}
.button {
padding: 10px 20px;
font-size: 16px;
color: white;
background-color: #4CAF50;
border: none;
border-radius: 5px;
cursor: pointer;
}
.back-button {
background-color: #4CAF50;
}
.file-label {
display: inline-block;
padding: 10px 20px;
cursor: pointer;
background-color: #4CAF50;
color: white;
border-radius: 5px;
}
#result-content {
margin-top: 20px;
display: flex;
flex-direction: column;
align-items: center; /* 使结果内容居中 */
}
#result {
width: 250%; /* 调整宽度 */
height: 250px; /* 保持高度 */
border: 1px solid #ccc;
border-radius: 5px;
padding: 10px;
font-size: 16px;
resize: none;
margin-top: 10px; /* 添加顶部间距 */
}
.back-button {
position: absolute; /* 定位返回按钮 */
top: 0;
left: 0;
font-size: 16px;
padding: 10px 30px;
background-color: green; /* Set button color to green */
color: white; /* Set text color to white for better visibility */
border: none; /* Optional: Remove border */
cursor: pointer; /* Optional: Change cursor on hover */
}
</style>
</head>
<body>
<div class="container">
<h1>玉米病虫害图形识别</h1>
<button class="button back-button" type="button" onclick="window.location.href='{{ url_for('main') }}';">返回</button>
<div id="upload-form">
<form action="/re_image_recognition" method="post" enctype="multipart/form-data" onsubmit="return checkFile();">
<div class="button-group">
<label for="file-input" class="file-label">选择图片</label>
<input type="file" name="file" id="file-input" accept="image/*" onchange="handleFileChange();" style="display: none;">
<input type="submit" value="上传并分析" class="button">
</div>
</form>
</div>
<!-- 结果输出框 -->
<div id="result-content">
<h2>分析结果</h2>
<textarea id="result" readonly>{{ result }}</textarea>
</div>
</div>
<script>
function checkFile() {
var fileInput = document.getElementById('file-input');
if (fileInput.files.length === 0) {
alert('请选择一个图片文件上传。');
return false;
}
return true;
}
function handleFileChange() {
var fileInput = document.getElementById('file-input');
var fileLabel = document.querySelector('.file-label');
fileLabel.textContent = fileInput.files[0].name;
}
</script>
</body>
</html>

@ -0,0 +1,82 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
font-family: Arial, sans-serif;
background-image: url('{{ url_for('static', filename='images/background.jpg') }}'); /* 背景图的路径 */
background-size: cover; /* 填满整个网页 */
background-position: center; /* 居中显示 */
background-repeat: no-repeat; /* 不重复 */
}
.container {
background: rgba(255, 255, 255, 0.9);
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
width: 300px;
text-align: center;
}
h2 {
margin-bottom: 20px;
}
input {
width: 100%;
padding: 10px;
margin: 10px 0;
border: 1px solid #ccc;
border-radius: 4px;
}
button {
width: 100%;
padding: 10px;
background-color: #28a745;
border: none;
color: white;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #218838;
}
.message {
color: red;
margin-top: 10px;
text-align: left;
}
</style>
</head>
<body>
<div class="container">
<h2>用户登录</h2>
<form action="{{ url_for('login') }}" method="post">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required>
<button type="submit">登录</button>
</form>
<p>还没有账户? <a href="{{ url_for('signup') }}">注册</a></p>
{% with messages = get_flashed_messages() %}
{% if messages %}
<div class="message">
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% endwith %}
</div>
</body>
</html>

@ -0,0 +1,179 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>主界面</title>
<style>
body {
margin: 0;
font-family: Arial, sans-serif;
background-image: url('{{ url_for('static', filename='images/background.jpg') }}'); /* 替换为你的背景图片URL */
background-size: cover; /* 确保背景图像覆盖整个页面 */
background-position: center; /* 居中显示 */
background-repeat: no-repeat; /* 不重复背景图像 */
height: 100vh; /* 高度设置为视口高度 */
}
.navbar {
width: 200px; /* 侧边栏宽度 */
background-color: rgba(51, 51, 51, 0.8); /* 半透明背景 */
height: 100vh; /* 侧边栏高度 */
position: fixed; /* 固定在左侧 */
padding-top: 20px;
}
.navbar a {
display: block;
background-color: #4CAF50;
color: white;
padding: 15px;
margin: 10px 0;
text-decoration: none; /* 去掉下划线 */
text-align: left; /* 左对齐 */
border-radius: 5px; /* 圆角 */
transition: background-color 0.3s;
}
.navbar a:hover {
background-color: #45a049;
}
.main-content {
margin-left: 220px; /* 侧边栏宽度加上一点间距 */
padding: 20px;
flex: 1; /* 让主内容区占满剩余空间 */
}
.header {
background-color: rgba(76, 175, 80, 0.8); /* 半透明背景 */
color: white;
padding: 15px;
text-align: center;
margin-bottom: 20px;
}
.content {
text-align: center;
padding: 50px;
color: white;
position: relative;
}
.content h1 {
font-size: 2.5em;
margin: 0;
}
.content p {
font-size: 1.2em;
max-width: 600px;
margin: 20px auto;
background: rgba(0, 0, 0, 0.5);
padding: 20px;
border-radius: 10px;
}
.floating-btn {
position: fixed;
right: 20px;
bottom: 20px;
width: 50px;
height: 50px;
background-color: #4CAF50;
color: white;
border-radius: 50%;
text-align: center;
line-height: 50px;
cursor: pointer;
z-index: 1000;
}
.dialog-box {
display: none;
position: fixed;
right: 20px;
bottom: 80px;
width: 300px;
max-height: 300px; /* 设置最大高度 */
overflow-y: auto; /* 当内容超出时,出现滚动条 */
background-color: white;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
padding: 10px;
z-index: 1001;
}
</style>
</head>
<body>
<div class="floating-btn" id="floatingBtn">AI</div>
<div class="dialog-box" id="dialogBox">
<div id="chatHistory"></div>
<input type="text" id="userInput" placeholder="请输入你的问题" />
<button onclick="getAnswer()">提交</button>
</div>
<div class="navbar">
<a href="{{ url_for('re_search') }}">查询</a>
<a href="{{ url_for('re_reading') }}">阅读</a>
<a href="{{ url_for('re_image_recognition') }}">识别</a>
<a href="{{ url_for('re_forum') }}">评论区</a>
<a href="{{ url_for('logout') }}">登出</a>
</div>
<div class="main-content">
<div class="header">
<h1>欢迎来到主界面</h1>
</div>
<div class="content">
<h1>关于我们</h1>
<p>这是一个集查询、阅读、识别和论坛于一体的综合平台。我们致力于为用户提供最佳的服务体验。希望您能在这里找到所需的信息与乐趣!</p>
</div>
</div>
<script>
document.getElementById('floatingBtn').addEventListener('click', function() {
var dialog = document.getElementById('dialogBox');
dialog.style.display = dialog.style.display === 'none' ? 'block' : 'none';
});
function getAnswer() {
var userInput = document.getElementById('userInput').value;
var chatHistory = document.getElementById('chatHistory');
// 显示用户的问题
chatHistory.innerHTML += '<p><strong>你:</strong> ' + userInput + '</p>';
// 清空输入框
document.getElementById('userInput').value = '';
// 发送AJAX请求到后端API
fetch('/get_answer', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ question: userInput })
})
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok ' + response.statusText);
}
return response.json();
})
.then(data => {
// 分析答案字符串,并在需要的地方添加换行
var answer = data.answer;
// 在每个句号后添加换行
answer = answer.replace(/。/g, '。<br>');
// 在特定关键词后添加换行,例如"防治方法"
answer = answer.replace(//g, '<br>');
// 显示答案
chatHistory.innerHTML += '<p><strong>AI:</strong> ' + answer + '</p>';
})
.catch(error => {
console.error('Error:', error);
chatHistory.innerHTML += '<p><strong>AI:</strong> 发生错误,无法获取答案。</p>';
});
}
</script>
</body>
</html>

@ -0,0 +1,674 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>阅读页面</title>
<style>
.book-content {
margin-top: 20px;
padding: 15px;
border: 1px solid #ccc;
display: none;
background: #f9f9f9;
line-height: 1.6; /* 增加行高以提高可读性 */
font-size: 16px; /* 增加字体大小 */
}
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
background-image: url('{{ url_for('static', filename='images/1.jpg') }}');
margin: 20px;
}
h1 {
text-align: center;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
th, td {
padding: 15px;
text-align: left;
border: 1px solid #ddd;
}
th {
background-color: #4CAF50;
color: white;
}
form {
margin: 20px 0;
text-align: center;
}
input[type="text"] {
padding: 10px;
width: 200px;
margin: 5px;
}
input[type="submit"] {
padding: 10px 20px;
background-color: #4CAF50;
color: white;
border: none;
cursor: pointer;
}
.container {
max-width: 800px;
margin: auto;
background: white;
padding: 20px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.book-details {
display: none;
margin-top: 20px;
padding: 20px;
background: #e2e2e2;
border: 1px solid #ccc;
}
.book-details h2 {
margin-bottom: 10px;
}
.button-container {
margin-top: 20px;
text-align: center;
}
.button-container button {
padding: 10px 20px;
margin: 0 10px;
border: none;
background-color: #4CAF50;
color: white;
cursor: pointer;
}
.button-container button:hover {
background-color: #45a049;
}
.back-button {
position: absolute; /* 定位返回按钮 */
top: 0;
left: 0;
font-size: 16px;
padding: 10px 30px;
background-color: green; /* Set button color to green */
color: white; /* Set text color to white for better visibility */
border: none; /* Optional: Remove border */
cursor: pointer; /* Optional: Change cursor on hover */
}
.book-content {
margin-top: 20px;
padding: 15px;
border: 1px solid #ccc;
display: none;
background: #f9f9f9;
}
</style>
</head>
<body>
<div class="container">
<h1>我的书籍列表</h1>
<button class="button back-button" type="button" onclick="window.location.href='{{ url_for('main') }}';">返回</button>
<form id="searchForm">
<input type="text" id="searchTerm" placeholder="输入书名或作者" required>
<input type="submit" value="搜索书籍">
</form>
<table id="bookTable">
<thead>
<tr>
<th>书名</th>
<th>作者</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="#" class="book-link"
data-title="一地多种蔬菜高效种植模式"
data-author="姚明华"
data-content="本书介绍了在有限的土地上实现多种蔬菜高效种植的策略与方法。书中详细阐述了不同蔬菜之间的合理搭配、混种技术和轮作原则,强调提升地块综合利用率和土壤肥力的技术。同时结合实际案例和经验,提供了施肥、灌溉及病虫害防治的配套措施,旨在帮助农户在种植上实现产量与效益的双提升"
data-text="一、概述
(一)高效种植模式发展概况
我国是创建农作物生产模式的最早国家早在2千多年前黄河中下
游已经有了复种技术,以后逐步发展成我国北方以小麦为主的两年三熟制
和南方以水稻为主的一年两熟制。新中国成立后尤其是20世纪80年代
以来,我国农业随着农村产业结构的调整和商品经济的发展,农业内部调
整在保证粮食安全生产的同时,发展复种种植,加快农村经济迅速发展。
基于市场需求,农民增收的客观要求,专业生产、综合经营、讲求效益,
从不同自然资源条件、不同生产要素、不同的层次上重新调整生产结构和
组合方式,高效益地组织生产。同时,在由传统农业逐步转变为以科学技
术为基础的现代农业过程中,科学化、商品化、集约化、知识化的观念武
装了广大农民,因而,创建高效种植模式就成为一种必然的发展趋势。
长江流域处于南北过渡地带,适宜发展多种生态型作物搭配的多元、
多熟种植模式。发展高效种植模式的综合优势主要表现在以下几个方面:
1.增加复种指数,提高耕地资源的利用效力
我国人均占有耕地少近年来全国人均耕地仅1.4亩左右,湖北省
人均仅0.8亩左右,这样发展下去,问题十分严重,要在人多地少的情况
下多生产农副产品,满足人民生活水平日益提高的需要,解决人口增加和
耕地减少的矛盾,唯一出路是依靠科技进步,提高单位面积产量和经济效
益为目的立体高效种植模式。把一亩田当几亩田使用,对单一土地资源进
行多种用途开发,即进行立体种植,多层次生产,多层次加工,全方位开
发;充分利用土地,提高复种指数,缓解粮食与经济、饲料作物争地争时
矛盾,实现全面增产。
2.立体间套,时空用满,较好地发挥了光、热、水、土
地资源的生产潜力
实行立体种植,能够提高光能利用率。据研究,作物对照射到地面上
太阳辐射能的利用率的理论值可达5%而当前一般只有1%2%。采用
立体间套,时间上的重叠,增大了绿色植被的周年覆盖度,从时间、空间
上充分利用太阳能,使农作物光合作用能高效而持续的进行。引进新的作
物群体,所配置的合理生态位,充分利用了生物相生边际效应,使高、矮
作物,喜阳、耐阴作物,喜湿、耐旱作物,不同营养需求作物各得其所。
同时,在复合群体中,上层叶片较多截留雨水,不同作物需水特性和根层
不同,可以利用不同深度水分,优势互补。实现作物季季增产,全年丰
收。
3.有利提高土壤肥力,改善农田生态环境
小麦/棉花、小麦-水稻、小麦/玉米等传统种植制度的几种作物,都
是耗地作物,长期连作势必造成养分的偏耗,使土壤养分的比例失调,连
作病害严重。实行多元间套,用养结合,水旱轮作,配方施肥,有机质还
田,就可以改善土壤物理、化学、生物性状,减少养分亏损和偏耗,提高
土壤养分有效性和利用率,保证作物稳产、高产,有利于改善农田生态环
境和农业可持续发展。
4.增强农业生产抗御风险能力
农业生产面临自然和市场双重风险,不论出现哪种风险都会对农业增
效、农民增收带来影响。实行多元立体间套,各种作物之间的趋利避灾,
优势互补,一方面大大提高了农作物抗御自然灾害的能力,变被动救灾为
主动避灾,将自然的损失减少到最低限度;另一方面,要向市场提供适销
对路的农产品,不失时机地抓好短平快“现金作物”的收入,即使某种农产
品市场滞销,也能让间套作其他农产品正常销售,保证农户的现金收入,
从而保护了农民种田的积极性。
5.提高了单位面积产量
发展本高效模式,通过多层次利用资源,复合式进行生产,可以大幅
度提高单位面积产量、产值,也为农村剩余劳动力广辟了就业门路,是促
进农村商品经济发展加快农民致富的有效途径。"
data-read-url="https://zh.z-lib.gs/book/17945863/2a0e7e/%E4%B8%80%E5%9C%B0%E5%A4%9A%E7%A7%8D%E8%94%AC%E8%8F%9C%E9%AB%98%E6%95%88%E7%A7%8D%E6%A4%8D%E6%A8%A1%E5%BC%8F.html"
data-txt-url="path/to/your/file1.txt"
>一地多种蔬菜高效种植模式</a></td>
<td>姚明华</td>
</tr>
<tr>
<td><a href="#" class="book-link"
data-title="温室大棚蔬菜栽培与病虫害防治技术"
data-author="车艳芳, 邢素丽"
data-content="本书系统地讲述了温室大棚的建设与管理,涵盖了蔬菜栽培的各个环节,包括选择适合的蔬菜种类、栽培技术、营养管理及环境调控。此外,特别强调了病虫害的识别、监测与防治技术,提供了有效的防治方案与生物防治的应用案例,为温室蔬菜种植者提供切实可行的指导,促进蔬菜种植的可持续发展。"
data-text="第一章温室大棚蔬菜保护设施介绍
第一节温室大棚蔬菜简易保护地设施
一、风障
在蔬菜生产中应用最早的简易保护地设施就是风障,而且现在仍在应
用。风障是用高粱秸、芦苇夹绑成,按一定的距离设置在菜田的北侧,呈
东西方向延长,不仅能够起到减弱风速、稳定气流、改善小气候、增加光
照强度的作用,还能使越冬的耐寒叶菜提早上市,加快育苗移栽的蔬菜生
长发育速度,从而将生育期延长,提高产量。
(一)风障的设置
风障分为两种即大风障和篱笆障。大风障的距离有30~40米如果
想达到更好的效果可在各排大风障之间再设置4~5排篱笆障。近年来
由于高粱秸和芦苇比较短缺的缘故,大风障大部分用细竹竿绑成,用陈旧
的塑料薄膜作披风,篱笆障也用细竹编成,夏季可以拆下来作为菜豆、豇
豆、黄瓜等蔬菜的架材。
(二)风障的作用
设置风障的主要目的就是减弱风速,通常情况下,最佳的范围是风障
高度的1.5~2倍这样可以减弱风速约15%。风越大,风障的效果就越明
若在大风障前5~6米处再设置一道篱笆障会起到更好的防风效果。
风障设置的排数越多,就越容易减弱风速。
距离风障越近,其增温的效果就越明显,但是也要因天气而异。例
如,有风的晴天增温最多,而阴天则增温较少。因此,风障在蔬菜栽培上
的提早作用是受条件限制的,有一定的限度。它所起到的效果主要表现为
气流比较稳定,光照较长,地温较高,蔬菜的生长发育较快,能够获得早
熟高产。
最好在入冬前设置大风障,因为这样冻土层浅,到了春天土壤化冻比
较快,能够促进越冬叶菜类早熟。
二、阳畦
在菜田将土做成框然后在北面架起大风障在风障前设置宽1.8~2
长10~20米的阳畦可根据地块的宽度将多个阳畦连接成一排
桩挂线,按线划印,取出表土堆放一边,用底土来做框,北框比地面高出
约20厘米南框比地面高出约5厘米。做框时注意要分层夯实切齐
床面上挡上木杆,用塑料薄膜覆盖,夜间用草苫覆盖保温。阳畦可以进行
蔬菜育苗,也能够进行速生蔬菜在阳畦的基础上,要加宽加高,在其后部
筑起高约1米的土墙在前面用竹片作拱杆形成中部高约1.3米宽3~4
米的半拱形,用塑料薄膜覆盖,夜间用草苫覆盖,叫做改良阳畦,又叫小
暖窖、立壕子。它的采光、保温效果优于阳畦,而且可以进入内部操作,
比较适合蔬菜育苗,矮棵果菜类蔬菜提早延晚栽培,耐寒叶菜类蔬菜的越
冬栽培。
三、地膜覆盖
1978年我国由日本引进了地膜覆盖技术并推广应用。日本的地膜
覆盖是利用高垄、高畦实行地面覆盖,因此,喜温蔬菜必须终霜后才能定
植。我国通过试验,发明了改良地膜覆盖,利用高低埂畦和高畦沟栽,可
以在终霜前约10天定植先栽苗然后进行地膜覆盖等到终霜后把秧苗引
出膜外,这样就进一步提高了早熟效果。
地膜覆盖的作用主要表现在以下几点:
1.增温作用
透明的地
膜覆盖可以提高地温0~20厘米深的地温日平均增加3~6摄氏
度。但是不同的天气和不同的覆盖方式,会产生不同的增温效应。一般来
说,晴天温度增高多,阴天相对减少;增温效应明显的是高垄高畦。
2.改善光照条件
因为地膜和膜下的水滴能够进行反射,促使近地面的发射光和散射光
增强50%以上,有利于进行光合作用。
3.保水作用
由于地膜的封闭作用,土壤的水分蒸发减少,这样便促进了土壤深层
毛细管水向上层运动,使水分在地膜下形成内循环,使地面蒸发减少了,
深层水分在上层积累,既减少了灌水量,还有利于雨季排水防涝。
4.抑制盐碱危害
由于地面蒸发,土壤盐分会随水分的蒸发上升并且滞留在土壤表面和
浅土层中。用地膜覆盖不但抑制了地面蒸发,阻止了深层土壤盐分向浅层
运动和积累,而且由于土壤水分的内循环作用,降低了耕作层的土壤含盐
通常情况下可下降53%~89%。
5.防止肥水流失
地膜覆盖能够防止大雨造成的地面径流,防止造成肥水流失,提高了
土壤肥料的利用率,节省了肥料。
6.优化土壤理化性状
土壤在地膜覆盖下能够始终保持疏松状态,因此土壤微生物活动加
强,促使有机肥加快分解,有利于作物的根系发育,提高了吸收功能。
7.减轻病虫草害
覆盖地膜能够防止一些借风雨传播的病害以及部分虫害的发生,还可
以防止土传病害的发生。覆盖银灰色地膜有很好的避蚜效果,能够防治蚜
虫和由蚜虫引起的病毒病;若覆盖黑色地膜,可以闷死多种杂草。
四、遮阳网
在南方,遮阳网夏季可防强光、高温和暴雨,而在北方,遮阳网夏季
应用于部分蔬菜的育苗,对于那些不耐强光的蔬菜,应用在盛夏高温强光
季节,也能起到较好的效果。"
data-read-url="https://zh.z-lib.gs/book/17790708/16ee10/%E6%B8%A9%E5%AE%A4%E5%A4%A7%E6%A3%9A%E8%94%AC%E8%8F%9C%E6%A0%BD%E5%9F%B9%E4%B8%8E%E7%97%85%E8%99%AB%E5%AE%B3%E9%98%B2%E6%B2%BB%E6%8A%80%E6%9C%AF.html">温室大棚蔬菜栽培与病虫害防治技术</a></td>
<td>车艳芳, 邢素丽</td>
</tr>
<tr>
<td><a href="#" class="book-link"
data-title="蔬菜无土栽培实用技术" data-author="余汉清 & 羊杏平"
data-content="本书专注于无土栽培技术的应用,介绍了水培、气雾培、基质培等多种无土栽培方式的理论与实践。内容覆盖了无土栽培的设计、营养液配方、栽培管理及病虫害防治等方面,适合希望突破传统土壤栽培限制的蔬菜种植者。书中结合实例,详细讲解了不同蔬菜在无土环境下的生长特性及管理要点,助力实现高效、可控的蔬菜生产。"
data-text="第一章 营养液
要点提示:
营养液是无土栽培的核心,必须认真地了解它、掌握它,才能真正掌
握无土栽培技术。必须经过一番艰苦的学习与磨炼,从理论和实践上认识
营养液的组成及其变化规律,才能在千变万化的实际环境中灵活而又正确
地使用营养液,以取得良好效果。
第一节 原料及其性质
营养液是将含有各种植物所需营养元素的化合物溶解于水中配制而成
的,其原料就是水和含有营养元素的化合物及辅助物质。
一、水的来源与要求
1.水的来源
在研究营养液新配方及某种营养元素的缺乏症状等实验水培时,需要
使用蒸馏水或去离子水。在大生产中可使用洁净的雨水、井水和自来水。
雨水的收集量取决于温室屋面上的集水面积和降雨量,如月降雨量达
到100mm以上则水培用水可以自给。使用雨水时要考虑到当地的空气污
染程度如污染严重则不能使用。即使断定无污染也应在下雨后10分
钟之后收集雨水,以冲去尘埃等污染物。
井水和自来水是常用的水源,使用前必须对水质进行化验,以确定其
可用性。一般的标准是水质要和饮用水相当。
如用河水作水源,则必须经过处理,使其达到符合卫生规范的饮用水
标准才可使用。
2.水质的要求
总的要求和符合卫生规范的饮用水相当。现将几项与无土栽培营养液
的平衡有密切关系及有累积性公害影响的指标介绍如下:
1硬度水质有软水和硬水之分。硬水是指水中含有的钙、镁盐的
浓度比较高达到一定的标准。其标准统一以每升水中氧化钙CaO
含量来表示1度=10mgCaO/L。硬度的划分04度是很软水48度
是软水816度是中硬水1630度是硬水30度以上是极硬水。在钙
质土和石灰岩地区的水常为硬水(北京地区)。
用硬水配制营养液必须将其中钙和镁的含量计算出来,以便减少配方
中规定的钙、镁用量,否则其总盐分会过高。用作营养液的水,硬度不能
太高一般以不超过10度为宜。
2酸碱度pH6.58.5。
3溶解氧使用前的溶解氧应接近饱和。
4氯化钠NaCl含量小于2mmol/L。
5余氯自来水消毒时常用液氯Cl2
故水中常含Cl2
0.3mg/L这对植物根系有害。因此水进入栽培槽之后应放置半天
便余氯散逸后才好定植。
6重金属及有害健康的元素容许限。
二、营养元素化合物及辅助原料的性质与要求
一般将化学工业生产出来的化合物的品质分为4类一是化学试剂
细分为三级,即保证试剂[GRGuaranteed Reagent又称一级试剂]、
分析试剂[ARAnalytic
Reagent又称二级试剂]、化学纯试剂
[CPChemical Pure又称三级试剂];二是医药用;三是工业用;四是
农业用。
化学试剂类的纯度最高其中GR级是化学试剂类的最高但价格昂
贵。在无土栽培中,研究营养液新配方及探索营养元素缺乏症等试验,需
用到化学试剂,除特别要求精细的外,一般用到化学纯级已可。在生产
中,除了微量元素用化学纯试剂或医药用品外,大量元素的供给多采用农
业用品,以利于降低成本。如无合格的农业原料,可用工业用品代替,但
工业用原料的价格比农用的贵。
营养液配方中标出的用量是以纯品表示的,在配制营养液时,要按各
种化合物原料标明的百分纯度折算出原料的用量。
严禁使用商品标识不明、技术参数不清楚的原料,这是采购时就必须
注意的。如因其他原因的大批原料缺少技术参数,则应取样送化验部门化
验清楚,确认为无害时才允许使用。
原料中本物以外的营养元素都作杂质处理。例如,本物磷酸二氢钾中
含有少量铁和锰,这铁和锰是营养元素,但它们是本物磷酸二氢钾的杂
质。使用时要注意这类杂质的量是否达到干扰营养液平衡的程度。
有时原料的本物虽然符合纯度要求,但因含有少量的有害元素超过了
容许限也不能使用。例如硝酸钾KNO3
纯度达到98%是符合纯度"
data-read-url="https://zh.z-lib.gs/book/5602172/4235c0/%E8%94%AC%E8%8F%9C%E6%97%A0%E5%9C%9F%E6%A0%BD%E5%9F%B9%E5%AE%9E%E7%94%A8%E6%8A%80%E6%9C%AF.html">蔬菜无土栽培实用技术</a></td>
<td>余汉清 & 羊杏平</td>
</tr>
<tr>
<td><a href="#" class="book-link"
data-title="葡萄栽培新品种新技术" data-author="许冠达"
data-content="本书以葡萄栽培的新发展为核心,介绍了近年来各国在葡萄新品种培育及栽培技术方面的最新成果。内容涵盖了葡萄的选种、嫁接、种植密度、修剪技术及病虫害综合防治等方面,强调现代科技在葡萄栽培中的应用,如精准施肥和灌溉、植物生长调节剂的使用等。书中还包含成功案例与实用经验,适合葡萄种植者与专业人员深入了解葡萄产业的前沿动态。"
data-text="一 概述
(一)经济意义
葡萄是世界果树生产中栽培面积较大、产量较高的水果。不仅适应性
强,分布广泛,管理方便,还具有产量高、经济效益高、营养丰富等优
点。
1.适应性强,经济寿命长
葡萄是一种适应性很强的果树,既耐旱、耐贫瘠、耐盐碱,又耐寒、
耐热、耐涝。无论北方还是南方,既可以在平原、坡地、沙荒地上进行大
规模栽培,又可以在房前屋后、畜舍、墙边、天井、河塘渠边、道路两
侧、阳台、屋顶等处栽植。不仅能绿化、美化环境,还能给人们提供新鲜
美味的葡萄果实。
葡萄树的寿命很长一般能达80100年它的结果寿命一般也能达
到3050年。在我国山东、山西、辽宁、河北、新疆、西藏等地都有几十
年树龄的大葡萄树,每年仍然高产。所以葡萄园一经建立,便可长期收
益。
2.结果早、丰产、稳产,经济效益高
在果树当中,葡萄是进入结果期较早,且丰产、稳产的果树树种。一
般定植后第二年就可开花结果,第三年以后产量便逐年递增并很快进入丰
产期。
3.营养价值较高,用途广泛
葡萄是营养物质丰富的一种水果,鲜果含有人体易于吸收的营养物
含量分别为葡萄糖和果糖占15%25%蛋白质占0.15%0.9%
有机酸占0.5%1.5%,矿物质(包括磷、钾、钙、硫、铁等)及多种维生素
(维生素B1、B2、B6、B12、P)占0.3%0.5%。以上这些营养物质对幼儿发
育、人体健康是极为有益的。
葡萄果粒如玉珠,形美、色艳、汁多、味甜,是人们非常喜爱的水
果。葡萄除鲜食外,还能酿酒、制汁、制干,是一种经济价值很高的水
果。全世界每年生产的葡萄的2/3用于酿酒在世界酒类贸易上葡萄酒
是贸易量最大的一种。葡萄酒的类型很多,有干酒、甜酒、白葡萄酒、红
葡萄酒,度数有高有低,有带汽的有不带汽的,各种各样,是一种营养丰
富的饮料,宴会、便餐、旅游普遍饮用。世界上一些葡萄栽培业发达的国
家,葡萄酒已成为人们日常生活中不可缺少的饮料。葡萄除可以酿酒外,
还可直接压制葡萄汁,葡萄汁是国际上三大饮料之一。从世界的生产情况
看,葡萄汁的产量在不断增加。葡萄干是水果中独领风骚的珍品,味道甜
美,营养丰富,是人们喜爱食用的葡萄制品。葡萄酿酒后的皮渣是重要的
能源和食用油原料。葡萄籽的另一重要用途是加工食用油,葡萄籽油中含
有大量不饱和脂肪酸特别是亚油酸含量高达65%80%,还含有维生素
P、E有明显的保健和医疗效用也可作高级的化工用油。因此葡萄是
所有果树中附加效益最高的树种之一。
近些年来,随着乡村旅游的兴起,葡萄特色旅游已成为多地乡村旅游
的新亮点。在原有产业基础上,葡萄产业扩展为葡萄酒、绿色饮品、健康
食品、特色旅游等关联产业,成为推动经济发展的重要引擎。
(二)产业现状与存在的问题
1.世界葡萄产业发展现状
国际葡萄与葡萄酒组织(OIV)在2016年10月第39届世界葡萄与葡萄酒
大会上指出2015年世界葡萄栽培面积达到750万公顷葡萄产量为7 600
万吨葡萄酒消费量约为2 400万千升。
葡萄园面积2015年世界葡萄种植面积有所上升达到750万公顷
比2014年增加2.8万公顷。中国葡萄种植面积增加了3.4万公顷,成为世界
第二大葡萄种植国家,而欧盟国家的葡萄园面积呈现持续下降的趋势
(2015年比2014年下降3.4万公顷)。西班牙仍保持世界第一的地位,面积超
过102.1万公顷中国为79.9万公顷法国为78万公顷。
葡萄产量2015年所有类型的葡萄总产量为7
600万吨比2000年上
涨了17%。2015年中国的葡萄总产量为1 366.9万吨,是世界第一大葡萄
生产国(占全球葡萄总产量的17%)意大利为820万吨美国为700万吨
法国排第四位总产量为630万吨。
葡萄酒产量2016年世界葡萄酒(不包括葡萄汁及未发酵汁)产量为2
590万千升是近20年来产量最低的年份主要原因是不利的天气状况对
多个国家的葡萄生产造成了影响。总产量为488万千升的意大利仍保持世
界第一的位置接下来是法国419万千升和西班牙378万千升美国的225
万千升达到了本国创纪录的水平。而南半球的阿根廷葡萄酒产量急剧下
仅为88万千升智利和巴西的天气条件较为良好产量分别是101万
千升和14万千升。"
data-read-url="https://zh.z-lib.gs/book/28035746/45adf8/%E8%91%A1%E8%90%84%E6%A0%BD%E5%9F%B9%E6%96%B0%E5%93%81%E7%A7%8D%E6%96%B0%E6%8A%80%E6%9C%AF.html">葡萄栽培新品种新技术</a></td>
<td>许冠达</td>
</tr>
<tr>
<td><a href="#" class="book-link"
data-title="茄子高效栽培" data-author="廖成华"
data-content="本书专注于茄子的高效生产技术,介绍了茄子的选种、育苗、栽培管理及病虫害防治的最佳实践。书中详细分析了影响茄子生长的环境因素,提供了科学的种植模式及肥水管理方案,旨在提高茄子的产量与质量。此外,包含了市场需求分析和经济效益评估,帮助种植者提升茄子种植的经济收益。"
data-text="一、大棚茄子生产的基本要求
1.对温度的要求
茄子喜温、耐热,害怕寒冷。茄子的不同发育阶段要求的温度也不
发芽的适宜温度为2535℃最低在1118℃之间11℃的恒温条件
则不发芽78℃则发生冷害0℃以下植株受冻死亡。苗期白天气温
以25℃左右为宜晚上以1518℃为宜夜间温度低于10℃则生长不良。
结果期白天的适宜温度为2530℃夜间以1620℃为宜。温度低于
15℃果实生长缓慢温度高于35℃易造成落花和畸形果。
1发芽期茄子发芽的适宜温度为2535℃最低温度为15℃
最高在40℃左右。出苗期白天保持30℃左右夜间维持在20℃左右
样能够保证出苗整齐。而在恒温条件下,种子发芽不良。因此,生产中常
对种子进行变温处理。
2幼苗期茄子苗期生长的适宜温度为2230℃能正常发育的
最高温度约为33℃最低温度约为6℃。
3花芽分化期昼夜温差对茄子花芽分化的影响比较大。白天
30℃左右、夜间25℃左右秧苗生长旺盛花芽分化早。
4结果期控制好结果期的温度有利于获得高产。白天温度在20
30℃范围内开花结果正常出现35℃左右的高温时易产生结果障碍。
夜间的适宜温度为1820℃。
生产中应根据不同生长发育时期,调节适宜的温度。
2.对光照条件的要求
茄子喜光对日照长度和强度的要求较高。茄子的光补偿点为2000勒
克斯饱和点为4万勒克斯。光照不足幼苗发育不良长柱花减少
量下降,果实着色不良。长日照下生长旺盛,尤其在苗期,日照时间越
长,越能促进发育,花芽分化快,开花早。
不同品种的茄子对光照强度的要求不同,紫色和紫红色品种对光照强
度的要求比其他品种高。光照弱时,光合作用能力下降,植株生长弱,产
量下降,并且色素难以形成,造成果实着色不良,影响茄子转色,降低茄
子的商品性。
1发芽期在暗处发芽快。
2幼苗期茄子幼苗的光饱和点为4万勒克斯。一般在光照时间为
1516小时的条件下幼苗初期生长旺盛。
3花芽分化期花芽分化主要受日照长度的影响。1516小时的
光照,花芽分化早,着花节位低。
4开花结果期光照强开花数多落花数少反之开花结果
不良。
茄子虽然是短日照植物但对光周期反应不敏感。每天给予4小时以
上的光照,花芽都可以分化。光照不足,植株长势弱、叶片薄、花芽分化
晚、短柱花多、结果率低。
生产中应根据不同的生长时期,适时调节光照强度和光照时间。
3.对水分条件的要求
由于茄子分枝多,植株高大,叶片大而薄,蒸腾作用强,植株容易蒸
腾失水,造成茄子水分缺乏,影响生长发育,生产上必须适时、适量补充
水分。浇水时要严格控制浇水量,浇水过多会使得土壤湿度过大,病害加
土壤中适宜的含水量在60%80%之间。如果空气相对湿度在80%以
上,则易导致茄子绵疫病的发生和蔓延,且易造成授粉困难、落花落果。
若土壤水分不足,植株和果实生长慢、果面粗糙、品质差。因此,在大棚
栽培的过程中,既要注意浇水,保持适宜的土壤含水量,又要防止土壤和
空气的湿度过大,及时通风散湿。茄子喜水、怕涝,因为枝叶繁茂,蒸腾
量大所以需水量多生长期间土壤相对湿度以80%为宜,空气相对湿度
以70%80%为宜。若湿度过大,病害严重,尤其是土壤积水易造成沤根
死苗。茄子根系发达,较耐干旱,特别是在坐果以前应适当控制水分。进
行多次中耕能促进根系发育,防止幼苗徒长,利于花芽分化和坐果。
1发芽期茄子种子的含水量一般为5%6%,发芽时吸收的水分
接近其重量的60%,所以茄子种子发芽需要充足的水分。否则,发芽率
低,出苗慢。
2幼苗期幼苗生长初期要求水分充足。随着幼苗的不断生
长,植株根系逐渐发达,吸水能力增强,这时如果水分过多,再遇上光照
不足或夜温过高或密度过大,易引起幼苗徒长。
3花芽分化期在光照正常、温度适宜的条件下充足的水分能
够促进幼苗生长和花芽分化。但如果水分过多,幼苗长势弱,形成的花芽
质量差。
4开花结果期茄子栽培中后期如果出现高温干旱天气茄子
植株长势减弱,生长发育受阻,易引起植株早衰,并出现落叶、落花、落
果现象。
5果实发育期在门茄“瞪眼”以前需要的水分较少对茄收获
前后需要的水分较多。茄子果实中含90%左右的水分,水分对果肉细胞的
膨大起着非常重要的作用。如果水分不足,果实发育不良,易形成无光泽
的僵果,品质变劣,生产中应注意补充水分。"
data-read-url="https://zh.z-lib.gs/book/28476244/af5f95/%E8%8C%84%E5%AD%90%E9%AB%98%E6%95%88%E6%A0%BD%E5%9F%B9%E6%96%B0%E6%A8%A1%E5%BC%8F.html">茄子高效栽培</a></td>
<td>廖成华</td>
</tr>
<tr>
<td><a href="#" class="book-link" data-title="番茄高效栽培"
data-author="吴慧文"
data-content="本书围绕番茄的高效栽培技术展开,详细介绍了番茄的品种选择、栽培环境的调控、施肥与灌溉技术、育苗与定植方法等。重点分析了影响番茄产量和品质的关键因素,并提供实用的病虫害防治措施,帮助种植者有效应对各种挑战,以确保番茄的优质高效生产。书中结合实际案例,适合广大番茄种植者和农业技术人员参考与学习。"
data-text="玉一、栽培管理
1.防止大棚番茄土壤盐渍化的方法
1产生原因大棚蔬菜多为集约式栽培由于大棚蔬菜环境条件
好于外界,植物的生长周期和产量都高于普通蔬菜,这样在种植过程中施
用的肥料往往高于普通蔬菜,因而更容易造成土壤次生盐渍化。大棚内的
土壤因为常年覆盖棚膜,土壤的水、气、热平衡受到影响,土壤得不到雨
水充分淋洗,再加上强烈的土表蒸发和作物蒸腾作用,盐分容易在土壤表
层中聚集,严重影响了大棚蔬菜的产量和品质。
2土壤盐渍化的危害土壤肥料过量施用和土壤次生盐渍化
造成大棚蔬菜生理性干旱、代谢紊乱、离子失调等障碍。主要表现为:植
株生物量减少,发育缓慢甚至生长停滞,叶片出现黄褐色或者边缘枯黄,
根系生长受到抑制,根毛变褐或腐烂,严重的还会导致死亡。土壤中可溶
性盐的浓度增加,土壤的水势降低至小于根的水势时,作物根细胞就会失
水枯萎死亡。高浓度的钠离子、氯离子存在,引起硝酸根和钙离子的吸收
障碍,植株对水及各种营养元素的吸收比例失衡,导致产量和质量下降。
此外,土壤耕层内盐分聚集还可能诱发大棚番茄的各种病害,如番茄脐腐
病等。
3防治方法施用植物秸秆能有效降低土壤盐碱化和硝酸盐的含
量,土壤电导率明显下降。这是因为秸秆分解过程中微生物同化了一部分
硝酸盐;另一方面,施用秸秆能在一定程度上使土壤疏松,土壤中硝酸盐
的淋洗作用加强,同时疏松的土壤又阻止了硝酸盐随上升水流向上运动,
可有效控制大棚土壤盐渍化。
施用有机肥和生物菌肥,可以增加土壤的阳离子交换量,同时增加的
有益菌群还能起到解磷、解钾、消除土壤盐害的作用,对土壤有机质的分
解、提高土壤理化性状和改善土壤结构也具有重要作用。
2.大棚番茄移栽前进行土壤改良的方法
大棚番茄连续种了几年后,产量会越来越低。这是因为在种植番茄时
连续多年使用化肥、农药和除草剂,使土壤出现板结和盐渍化,轻者能使
叶片发黄或果实转色不好,重者可导致根系生长不良甚至死棵,产量必然
会受到影响。因此,在番茄移栽前要对土壤进行改良。
1定植前大水漫灌利用“盐随水来盐随水去”的特点在清洁
田园以后深翻土壤漫灌土地12次把土壤中的盐分淋洗到土壤深处。
也可以采用客土改良的方法一般换土深度为2025厘米可以对土壤进
行彻底改良,但比较费工费时。
2增施有机肥在大量施用化肥而有机肥施用不足或新建大棚取
土以后,土壤易发生板结,导致土壤的透气性和保水保肥能力下降,会影
响番茄根系吸收养分和水分的能力。因此,在移植前应施用秸秆有机肥,
可以提高土壤的透气性和保水保肥性,改良土壤结构。
3增施生物菌肥基施有机肥再增施生物菌肥能够调节土壤
中有益生物种群和菌群的群落结构,抑制有害菌,从而减轻土壤有害菌的
发生。增加的有益菌群还能起到解磷、解钾、消除土壤盐害的作用,加速
土壤中有机质的分解,提高土壤理化性状和改善土壤结构。每亩增施激抗
菌、大源或瑞神55千克。当老棚出现死棵现象时要用化学药剂对死棵进
行防治用阿米西达蘸苗盘进行根系消毒或用68%金雷0.5克拌土,穴
施后再定植。
3.大棚番茄防冻措施
防冻的方法有很多,大体可分为种苗抗寒法与大棚物理防冻法。
1种苗抗寒法选用抗寒的品种或者用其他方法提高种苗的抗
冻能力。
2大棚物理防冻法
①低温处理。把泡胀后将要发芽的种子放在0℃条件下12天然后
播种,这样可以促进发芽,增强秧苗的抗寒性,防止冻害发生。
②变温处理。把将要发芽的番茄种子每天在15℃的较低温度下放置
1218小时接着转移到1822℃的较高温度下放置26小时。如此反复
数日,能显著提高蔬菜秧苗的抗寒力,并加快其生长发育速度。
③多层覆盖。在大棚上加盖一层毡子或者草苫。在大棚中采用塑料薄
膜做成二层幕,于夜间覆盖。在大棚内套小拱棚,气温和地温都可提高。
保持棚膜清洁,保证进光量。棚内的热量主要来自太阳辐射,当阳光
透过棚膜进入棚内时,由于温室效应,一部分光能转化为热能。棚膜上的
水滴、尘土等对棚内的光照条件影响很大,及时擦拭棚膜或者喷防雾剂,
有利于增加进光量,提高棚室温度。
④科学浇水。冬季棚室番茄浇水要做到“五浇五不浇”,即晴天浇水,
阴天不浇水;午前浇水,午后不浇水;浇小水,不大水漫灌;冬季水温
低,浇水时要先在棚内预热,待水温与地温接近时再浇;浇暗水,不浇明
水。
⑤利用贮水池贮热。在大棚中建贮水池,在池子的上部盖上一层透明
薄膜,以防水池内的水分蒸发,增加棚内的湿度。利用水比热大的特点,
在中午高温时吸收的热量可以在晚上释放出来。
4.通过矮化番茄提高番茄产量和品质的方法
矮化番茄不但可以减少土壤的养分损失,减少化肥投入,而且还能增
加番茄的产量和品质。矮化植株在管理中必须进行植株调整。
1采用拉丝种植让番茄绕钢丝生长在栽培番茄的大棚中顺着
畦埂的方向拉一道细钢丝,将塑料尼龙绳绑在番茄植株茎基部,另一端绑
在钢丝上。随着番茄植株不断生长每隔2530厘米约每开一穗花时
顺时针方向缠绕植株茎秆。"
data-read-url="https://zh.z-lib.gs/book/15511594/edbbfb/%E7%95%AA%E8%8C%84%E9%AB%98%E6%95%88%E6%A0%BD%E5%9F%B9pdf.html">番茄高效栽培</a></td>
<td>吴慧文</td>
</tr>
</tbody>
</table>
<div class="book-details" id="bookDetails">
<h2 id="detailTitle"></h2>
<p><strong>作者:</strong> <span id="detailAuthor"></span></p>
<p><strong>内容:</strong> <span id="detailContent"></span></p>
<div class="button-container">
<button id="closeDetails">关闭</button>
<button id="readButton">预览</button>
<button id="externalReadButton" style="display:none;">线上阅读</button>
</div>
</div>
<div class="book-content" id="bookContentSection">
<h3>书籍内容</h3>
<p id="bookText"></p>
</div>
</div>
<script>
const searchForm = document.getElementById('searchForm');
const bookTableBody = document.getElementById('bookTable').getElementsByTagName('tbody')[0];
const bookDetails = document.getElementById('bookDetails');
const detailTitle = document.getElementById('detailTitle');
const detailAuthor = document.getElementById('detailAuthor');
const detailContent = document.getElementById('detailContent');
const closeDetails = document.getElementById('closeDetails');
const readButton = document.getElementById('readButton');
const bookContentSection = document.getElementById('bookContentSection');
const bookText = document.getElementById('bookText');
let currentBookText = '';
let currentReadUrl = '';
searchForm.addEventListener('submit', function(event) {
event.preventDefault();
const searchTerm = document.getElementById('searchTerm').value.toLowerCase();
const rows = bookTableBody.getElementsByTagName('tr');
// 遍历所有行,检查书名和作者是否包含搜索关键字
for (let i = 0; i < rows.length; i++) {
const titleCell = rows[i].cells[0].textContent.toLowerCase();
const authorCell = rows[i].cells[1].textContent.toLowerCase();
if (titleCell.includes(searchTerm) || authorCell.includes(searchTerm)) {
rows[i].style.display = ''; // 显示匹配的行
} else {
rows[i].style.display = 'none'; // 隐藏不匹配的行
}
}
// 清空搜索框
document.getElementById('searchTerm').value = '';
});
document.addEventListener('click', function(event) {
if (event.target.classList.contains('book-link')) {
event.preventDefault();
detailTitle.textContent = event.target.dataset.title;
detailAuthor.textContent = event.target.dataset.author;
detailContent.textContent = event.target.dataset.content; // 显示书籍内容
currentBookText = event.target.dataset.text; // 存储当前书籍的文本内容
bookDetails.style.display = 'block';
bookContentSection.style.display = 'none'; // 隐藏书籍内容区域
document.getElementById('externalReadButton').style.display = 'inline'; // 显示阅读按钮
currentReadUrl = event.target.dataset.readUrl; // 从数据属性中获取URL
}
});
closeDetails.addEventListener('click', function() {
bookDetails.style.display = 'none';
bookContentSection.style.display = 'none';
});
readButton.addEventListener('click', function() {
if (currentBookText) {
//bookText.textContent = currentBookText; // 显示书籍的文本内容
//bookContentSection.style.display = 'block'; // 显示内容区域
// 对内容进行简单的格式处理,例如替换换行符为 <br> 标签
// 将文本中的列表化和段落分开显示
const formattedText = currentBookText
.replace(/\n/g, '<br>') // 替换换行符
.replace(/[一二三四五六七八九十]+/g, '<span style="font-weight:bold;">$&</span>') // 表示序号的文本加粗
.replace(/(\d+\.\s)/g, '<br>' + '$&'); // 给数字加上换行
bookText.innerHTML = formattedText; // 使用 innerHTML 以支持 HTML 排版
bookContentSection.style.display = 'block'; // 显示内容区域
}
});
document.getElementById('externalReadButton').addEventListener('click', function() {
if (currentReadUrl) {
window.location.href = currentReadUrl; // 跳转到外部链接
}
});
</script>
</body>
</html>

@ -0,0 +1,92 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>查询界面</title>
<style>
body {
font-family: Arial, sans-serif;
background-image: url('{{ url_for('static', filename='images/4.png') }}');
text-align: center;
}
.container {
width: 800px;
margin: auto;
position: relative; /* 为返回按钮定位 */
}
#result {
height: 500px;
width: 100%;
margin-top: 20px;
border: 1px solid #ccc;
padding: 10px;
overflow-y: scroll;
text-align: left;
background-color: #333; /* 假设您希望背景颜色不是白色,以便白色字体更明显 */
}
.button {
font-size: 16px;
padding: 10px 30px;
background-color: green; /* Set button color to green */
color: white; /* Set text color to white for better visibility */
border: none; /* Optional: Remove border */
cursor: pointer; /* Optional: Change cursor on hover */
}
.back-button {
position: absolute; /* 定位返回按钮 */
top: 0;
left: 0;
}
.field-name {
color: red;
}
.dark-font {
color: #fff; /* 将字体颜色改为白色 */
}
</style>
</head>
<body>
<div class="container">
<button class="button back-button" type="button" onclick="window.location.href='{{ url_for('main') }}';">返回</button>
<h1>查询界面</h1>
<form id="searchForm" method="POST">
<input type="text" id="inputEntry" name="inputEntry" placeholder="请输入玉米病虫害名称" style="width: 500px; padding: 10px;">
<button class="button" type="submit">查询</button>
</form>
<div id="result"></div>
</div>
<script>
document.getElementById('searchForm').onsubmit = function(event) {
event.preventDefault();
var formData = new FormData(this);
var query = formData.get('inputEntry');
fetch('/diseasequery', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.error) {
document.getElementById('result').innerText = '查询结果:' + data.error;
} else {
document.getElementById('result').innerHTML = `
<p class="field-name">病虫害名称:<span class="dark-font">${data.PestName}</span></p>
<p class="field-name">致病原因:<span class="dark-font">${data.PestCause}</span></p>
<p class="field-name">发病症状:<span class="dark-font">${data.Symptoms}</span></p>
<p class="field-name">防护措施:<span class="dark-font">${data.Solution}</span></p>
`;
}
})
.catch(error => {
console.error('Error:', error);
document.getElementById('result').innerText = '查询失败,请稍后再试。';
});
};
</script>
</body>
</html>

@ -0,0 +1,88 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>注册</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
font-family: Arial, sans-serif;
background-image: url('{{ url_for('static', filename='static/images/background.jpg') }}');
background-size: cover;
background-position: center;
}
.container {
background: rgba(255, 255, 255, 0.9);
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
width: 300px;
text-align: center;
}
h2 {
margin-bottom: 20px;
}
input {
width: 100%;
padding: 10px;
margin: 10px 0;
border: 1px solid #ccc;
border-radius: 4px;
}
button {
width: 100%;
padding: 10px;
background-color: #28a745;
border: none;
color: white;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #218838;
}
.error-message {
color: red;
font-size: 0.9em;
margin-top: 10px;
}
a {
color: #007bff;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<div class="container">
<h2>欢迎注册</h2>
<form action="{{ url_for('signup') }}" method="post">
<label for="new_username">用户名:</label>
<input type="text" name="new_username" id="new_username" required><br>
<label for="new_password">密码:</label>
<input type="password" name="new_password" id="new_password" required minlength="6" placeholder="至少6位"><br>
<label for="confirm_password">确认密码:</label>
<input type="password" name="confirm_password" id="confirm_password" required><br>
<button type="submit">注册</button>
</form>
<p>已有账户? <a href="/">登录</a></p>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class="error-message">
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save