目录

Python实例题

题目

要求:

解题思路:

代码实现:

Python实例题

题目

基于 Flask 的任务管理系统

要求

  • 使用 Flask 框架构建一个任务管理系统,支持以下功能:
    • 用户认证(注册、登录、注销)
    • 任务的创建、编辑、删除和标记完成
    • 任务分类和优先级管理
    • 任务截止日期和提醒功能
    • 任务统计和可视化分析
  • 使用 SQLite 数据库存储用户、任务等信息。
  • 添加美观的前端界面,支持响应式设计。

解题思路

  • 使用 Flask 蓝图组织代码结构。
  • 通过 Flask-Login 处理用户认证。
  • 使用 Flask-SQLAlchemy 管理数据库操作。
  • 结合 Bootstrap 和 Chart.js 实现数据可视化。

代码实现

from flask import Flask, render_template, request, redirect, url_for, flash, Blueprint
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
from werkzeug.security import generate_password_hash, check_password_hash
from datetime import datetime, timedelta
import os# 初始化 Flask 应用
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key-here'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(app.root_path, 'task_manager.db')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False# 初始化数据库
db = SQLAlchemy(app)# 初始化 Flask-Login
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'auth.login'# 数据模型
class User(UserMixin, db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)password_hash = db.Column(db.String(120), nullable=False)tasks = db.relationship('Task', backref='user', lazy=True)def set_password(self, password):self.password_hash = generate_password_hash(password)def check_password(self, password):return check_password_hash(self.password_hash, password)class Category(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(50), nullable=False)user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)tasks = db.relationship('Task', backref='category', lazy=True)def __repr__(self):return self.nameclass Task(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(100), nullable=False)description = db.Column(db.Text)created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)due_date = db.Column(db.DateTime)completed = db.Column(db.Boolean, default=False)priority = db.Column(db.Integer, default=1)  # 1: 低, 2: 中, 3: 高user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)category_id = db.Column(db.Integer, db.ForeignKey('category.id'))def is_overdue(self):return self.due_date and not self.completed and datetime.now() > self.due_datedef is_due_soon(self):return self.due_date and not self.completed and datetime.now() < self.due_date and \self.due_date - datetime.now() <= timedelta(days=1)# 用户加载回调
@login_manager.user_loader
def load_user(user_id):return User.query.get(int(user_id))# 认证蓝图
auth = Blueprint('auth', __name__)@auth.route('/register', methods=['GET', 'POST'])
def register():if request.method == 'POST':username = request.form['username']password = request.form['password']if User.query.filter_by(username=username).first():flash('用户名已存在', 'error')return redirect(url_for('auth.register'))user = User(username=username)user.set_password(password)db.session.add(user)db.session.commit()# 为新用户创建默认分类default_category = Category(name='默认', user_id=user.id)db.session.add(default_category)db.session.commit()flash('注册成功,请登录', 'success')return redirect(url_for('auth.login'))return render_template('register.html')@auth.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':username = request.form['username']password = request.form['password']user = User.query.filter_by(username=username).first()if user and user.check_password(password):login_user(user)flash('登录成功', 'success')return redirect(url_for('main.dashboard'))else:flash('用户名或密码错误', 'error')return render_template('login.html')@auth.route('/logout')
@login_required
def logout():logout_user()flash('已注销', 'success')return redirect(url_for('auth.login'))# 主蓝图
main = Blueprint('main', __name__)@main.route('/')
@login_required
def dashboard():# 获取用户的任务统计数据total_tasks = Task.query.filter_by(user_id=current_user.id).count()completed_tasks = Task.query.filter_by(user_id=current_user.id, completed=True).count()pending_tasks = total_tasks - completed_tasks# 获取即将到期的任务due_soon_tasks = Task.query.filter_by(user_id=current_user.id, completed=False) \.filter(Task.due_date <= datetime.now() + timedelta(days=1)) \.order_by(Task.due_date).all()# 获取逾期任务overdue_tasks = Task.query.filter_by(user_id=current_user.id, completed=False) \.filter(Task.due_date < datetime.now()) \.order_by(Task.due_date).all()# 获取最近添加的任务recent_tasks = Task.query.filter_by(user_id=current_user.id) \.order_by(Task.created_at.desc()).limit(5).all()# 获取分类统计categories = Category.query.filter_by(user_id=current_user.id).all()category_stats = []for category in categories:total = Task.query.filter_by(user_id=current_user.id, category_id=category.id).count()completed = Task.query.filter_by(user_id=current_user.id, category_id=category.id, completed=True).count()if total > 0:completion_rate = (completed / total) * 100else:completion_rate = 0category_stats.append({'category': category,'total': total,'completed': completed,'completion_rate': completion_rate})return render_template('dashboard.html', total_tasks=total_tasks,completed_tasks=completed_tasks,pending_tasks=pending_tasks,due_soon_tasks=due_soon_tasks,overdue_tasks=overdue_tasks,recent_tasks=recent_tasks,category_stats=category_stats)@main.route('/tasks')
@login_required
def tasks():# 获取过滤参数status = request.args.get('status', '')category = request.args.get('category', '')priority = request.args.get('priority', '')sort = request.args.get('sort', 'due_date')order = request.args.get('order', 'asc')# 构建查询query = Task.query.filter_by(user_id=current_user.id)if status == 'completed':query = query.filter_by(completed=True)elif status == 'pending':query = query.filter_by(completed=False)if category and category != 'all':query = query.filter_by(category_id=category)if priority and priority != 'all':query = query.filter_by(priority=int(priority))# 排序if sort == 'due_date':if order == 'asc':query = query.order_by(Task.due_date.asc())else:query = query.order_by(Task.due_date.desc())elif sort == 'priority':if order == 'asc':query = query.order_by(Task.priority.asc())else:query = query.order_by(Task.priority.desc())elif sort == 'created_at':if order == 'asc':query = query.order_by(Task.created_at.asc())else:query = query.order_by(Task.created_at.desc())tasks = query.all()# 获取用户的分类categories = Category.query.filter_by(user_id=current_user.id).all()return render_template('tasks.html', tasks=tasks, categories=categories,status=status, category=category, priority=priority,sort=sort, order=order)@main.route('/task/add', methods=['GET', 'POST'])
@login_required
def add_task():categories = Category.query.filter_by(user_id=current_user.id).all()if request.method == 'POST':title = request.form['title']description = request.form.get('description', '')due_date_str = request.form.get('due_date', '')category_id = request.form.get('category', '')priority = request.form.get('priority', 1)if not title:flash('任务标题不能为空', 'error')return redirect(url_for('main.add_task'))due_date = Noneif due_date_str:try:due_date = datetime.strptime(due_date_str, '%Y-%m-%d')except ValueError:flash('日期格式不正确,请使用 YYYY-MM-DD 格式', 'error')return redirect(url_for('main.add_task'))task = Task(title=title,description=description,due_date=due_date,priority=priority,user_id=current_user.id,category_id=category_id if category_id else None)db.session.add(task)db.session.commit()flash('任务已添加', 'success')return redirect(url_for('main.tasks'))return render_template('task_form.html', categories=categories, is_edit=False)@main.route('/task/<int:task_id>/edit', methods=['GET', 'POST'])
@login_required
def edit_task(task_id):task = Task.query.get_or_404(task_id)# 确保用户只能编辑自己的任务if task.user_id != current_user.id:flash('权限不足', 'error')return redirect(url_for('main.tasks'))categories = Category.query.filter_by(user_id=current_user.id).all()if request.method == 'POST':task.title = request.form['title']task.description = request.form.get('description', '')due_date_str = request.form.get('due_date', '')task.category_id = request.form.get('category', '')task.priority = request.form.get('priority', 1)if not task.title:flash('任务标题不能为空', 'error')return redirect(url_for('main.edit_task', task_id=task_id))task.due_date = Noneif due_date_str:try:task.due_date = datetime.strptime(due_date_str, '%Y-%m-%d')except ValueError:flash('日期格式不正确,请使用 YYYY-MM-DD 格式', 'error')return redirect(url_for('main.edit_task', task_id=task_id))db.session.commit()flash('任务已更新', 'success')return redirect(url_for('main.tasks'))return render_template('task_form.html', task=task, categories=categories, is_edit=True)@main.route('/task/<int:task_id>/toggle', methods=['POST'])
@login_required
def toggle_task(task_id):task = Task.query.get_or_404(task_id)# 确保用户只能操作自己的任务if task.user_id != current_user.id:flash('权限不足', 'error')return redirect(url_for('main.tasks'))task.completed = not task.completeddb.session.commit()flash('任务状态已更新', 'success')return redirect(url_for('main.tasks'))@main.route('/task/<int:task_id>/delete', methods=['POST'])
@login_required
def delete_task(task_id):task = Task.query.get_or_404(task_id)# 确保用户只能删除自己的任务if task.user_id != current_user.id:flash('权限不足', 'error')return redirect(url_for('main.tasks'))db.session.delete(task)db.session.commit()flash('任务已删除', 'success')return redirect(url_for('main.tasks'))@main.route('/categories')
@login_required
def categories():categories = Category.query.filter_by(user_id=current_user.id).all()return render_template('categories.html', categories=categories)@main.route('/category/add', methods=['POST'])
@login_required
def add_category():name = request.form['name']if not name:flash('分类名称不能为空', 'error')return redirect(url_for('main.categories'))if Category.query.filter_by(user_id=current_user.id, name=name).first():flash('分类名称已存在', 'error')return redirect(url_for('main.categories'))category = Category(name=name, user_id=current_user.id)db.session.add(category)db.session.commit()flash('分类已添加', 'success')return redirect(url_for('main.categories'))@main.route('/category/<int:category_id>/edit', methods=['POST'])
@login_required
def edit_category(category_id):category = Category.query.get_or_404(category_id)# 确保用户只能编辑自己的分类if category.user_id != current_user.id:flash('权限不足', 'error')return redirect(url_for('main.categories'))name = request.form['name']if not name:flash('分类名称不能为空', 'error')return redirect(url_for('main.categories'))if Category.query.filter_by(user_id=current_user.id, name=name).first() and name != category.name:flash('分类名称已存在', 'error')return redirect(url_for('main.categories'))category.name = namedb.session.commit()flash('分类已更新', 'success')return redirect(url_for('main.categories'))@main.route('/category/<int:category_id>/delete', methods=['POST'])
@login_required
def delete_category(category_id):category = Category.query.get_or_404(category_id)# 确保用户只能删除自己的分类if category.user_id != current_user.id:flash('权限不足', 'error')return redirect(url_for('main.categories'))# 检查是否有任务属于该分类if Task.query.filter_by(user_id=current_user.id, category_id=category_id).count() > 0:flash('该分类下有任务,不能删除', 'error')return redirect(url_for('main.categories'))db.session.delete(category)db.session.commit()flash('分类已删除', 'success')return redirect(url_for('main.categories'))@main.route('/analytics')
@login_required
def analytics():# 获取任务统计数据total_tasks = Task.query.filter_by(user_id=current_user.id).count()completed_tasks = Task.query.filter_by(user_id=current_user.id, completed=True).count()pending_tasks = total_tasks - completed_tasks# 按优先级统计priority_stats = {}for priority in [1, 2, 3]:total = Task.query.filter_by(user_id=current_user.id, priority=priority).count()completed = Task.query.filter_by(user_id=current_user.id, priority=priority, completed=True).count()pending_tasks = total - completedif total > 0:completion_rate = (completed / total) * 100else:completion_rate = 0priority_stats[priority] = {'total': total,'completed': completed,'pending': pending_tasks,'completion_rate': completion_rate}# 按分类统计categories = Category.query.filter_by(user_id=current_user.id).all()category_stats = []for category in categories:total = Task.query.filter_by(user_id=current_user.id, category_id=category.id).count()completed = Task.query.filter_by(user_id=current_user.id, category_id=category.id, completed=True).count()if total > 0:completion_rate = (completed / total) * 100else:completion_rate = 0category_stats.append({'category': category,'total': total,'completed': completed,'completion_rate': completion_rate})# 最近7天的任务完成情况today = datetime.now().date()last_7_days = [(today - timedelta(days=i)) for i in range(6, -1, -1)]daily_stats = []for day in last_7_days:start_time = datetime.combine(day, datetime.min.time())end_time = datetime.combine(day, datetime.max.time())created = Task.query.filter_by(user_id=current_user.id) \.filter(Task.created_at.between(start_time, end_time)).count()completed = Task.query.filter_by(user_id=current_user.id, completed=True) \.filter(Task.due_date.between(start_time, end_time)).count()daily_stats.append({'date': day,'created': created,'completed': completed})return render_template('analytics.html', total_tasks=total_tasks,completed_tasks=completed_tasks,pending_tasks=pending_tasks,priority_stats=priority_stats,category_stats=category_stats,daily_stats=daily_stats)# 注册蓝图
app.register_blueprint(main)
app.register_blueprint(auth)# 创建数据库表
with app.app_context():db.create_all()if __name__ == '__main__':app.run(debug=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89510.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89510.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/89510.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用GPU加速TensorFlow

一、写在前面 我们已经依靠keras和TensorFlow给大家做了一些机器学习在图像处理中的应用(影像组学学习手册,基于深度学习的图像分类任务)&#xff0c;此前的教程中我们没有用GPU进行加速&#xff0c;但是相较于CPU而言&#xff0c;GPU是设计用于处理大规模并行计算任务的硬件&…

模型预测专题:强鲁棒性DPCC

0 1 前言 在进行DPCC的学习过程中&#xff0c;于下面链接看到了一篇强鲁棒性算法&#xff1b;感觉挺有意思的&#xff0c;学习一下。 永磁同步电机高性能控制算法&#xff08;12&#xff09;——基于预测电流误差补偿的强鲁棒预测控制/参数辨识&有限集预测控制与连续集预…

修复opensuse 风滚草rabbitmq的Error: :plugins_dir_does_not_exist问题

https://wiki.archlinux.org/title/Talk:RabbitMQ 报错 yqh192 /u/l/r/l/r/plugins> sudo rabbitmq-plugins enable rabbitmq_management Error: :plugins_dir_does_not_exist Arguments given:enable rabbitmq_managementUsagerabbitmq-plugins [--node <node>] [--…

前端做gis地图有哪些库

以下是前端开发GIS地图常用的库&#xff1a; Leaflet&#xff1a;轻量级、易于使用的开源JavaScript库&#xff0c;具有丰富的地图功能和插件生态系统&#xff0c;支持多种地图数据源&#xff0c;适合初学者和专业开发者。其优势在于简洁性和易用性&#xff0c;代码结构清晰&am…

赋能城市安全韧性|众智鸿图总裁扈震受邀出席智慧城市大会发表主题报告

——“众智鸿图作为城市基础设施智能化综合服务提供商&#xff0c;以地理信息科学、时空大数据、人工智能为核心能力&#xff0c;长期深耕于燃气、供水、排水等城市基础设施生命线领域及港口、园区等工业领域&#xff0c;致力于为城市稳定运行与高效发展提供坚实保障。” 2025年…

【大语言模型入门】—— 浅析LLM基座—Transformer原理

【大语言模型入门】—— 浅析LLM基座—Transformer原理 解密GPT核心技术&#xff1a;Transformer架构深度解析被反复强调的核心概念意味着什么&#xff1f; GPT预测机制解析&#xff1a;从Next Token Prediction到任务推理核心机制的本质案例驱动的机制解析解构策略&#xff1a…

Django打造智能Web机器人控制平台

Django 实现 Web 机器人控制 以下是关于 Django 实现 Web 机器人控制管理的实例思路和关键代码片段,涵盖多个常见场景。由于篇幅限制,剩余的可通过类似模式扩展。 基础机器人模型定义 # models.py from django.db import modelsclass Robot(models.Model):name = models.C…

周赛98补题

题目意思&#xff1a; 给定一个数字判断加上自身任意因子数&#xff0c;是否能成为一个奇数。 思路&#xff1a; 我们想一个最简单的判断方法&#xff0c; 任意的数字的因子数都有1&#xff0c;故&#xff0c;最简单的方法就是判断奇偶。 奇数1成偶数&#xff0c;偶数1成奇…

【STM32】 STM32低功耗模式详解:睡眠模式与唤醒机制【待测试】

本篇知识点基于F0讲解 一、STM32三种低功耗模式参考表格 模式功耗唤醒时间保持状态典型应用场景睡眠模式中等 (mA级)最短 (μs级)CPU停止&#xff0c;外设保持短暂待机&#xff0c;快速响应停止模式低 (μA级)中等 (ms级)RAM保持&#xff0c;时钟停止长时间待机&#xff0c;电…

【Vue入门学习笔记】Vue核心语法

目录 准备工作删除不需要的代码 模版语法文本插值使用JavaScript表达式无效写法原始HTML 属性绑定简写布尔型Attribute动态绑定多个值 准备工作 删除不需要的代码 删除components下的文件 进入App.vue 删掉代码&#xff0c;只保留如下内容 <template></template&g…

ClickHouse 窗口分析 argMax() / argMin()

argMin() 是 ClickHouse 中一个非常有用的聚合函数&#xff0c;它可以找出某个列的最小值&#xff0c;并返回该最小值对应的另一个列的值 函数语法 argMin(arg, val) arg&#xff1a;要返回的列&#xff08;当找到最小值时返回该列的值&#xff09; val&#xff1a;用于比较的…

k8s client 通过KubeConfig和证书方式连接api server

一、背景 本文以kubePi这样一个k8s客户端为示例,使用证书方式,怎么连接k8s集群。 然后告诉你证书是如何生成的, 最后通过一个Python编程示例,在程序里如何使用。 api server地址:比如https://110.206.56.308:6443 Certificate:证书内容 Certificate Key:证书的私钥 先…

(2025.07)解决——ubuntu20.04系统开机黑屏,左上角光标闪烁

前面一些碎碎念&#xff1a; 电脑装的双系统&#xff0c;之前都还好着&#xff0c;今天突然ubuntu开机的时候黑屏了&#xff0c;左上角有光标在闪烁&#xff0c;也查了一些资料&#xff0c;基本上大家的都是驱动有问题&#xff0c;还有内存问题。&#xff08;个人建议&#xff…

一文讲清libmodbus在STM32上基于FreeRTOS的移植

libmodbus 开发库概述 libmodbus是一个免费的跨平台支持RTU和TCP的Modbus库&#xff0c;遵循LGPL V2.1协议。libmodbus支持Linux、 Mac Os X、 FreeBSD、 QNX和Windows等操作系统。 libmodbus可以向符合Modbus协议的设备发送和接收数据&#xff0c;并支持通过串口或者TCP网络进…

go语言安装达梦数据完整教程

一、安装 go-dm 驱动 1. 使用 go get 命令安装 # 打开PowerShell或命令提示符 go get github.com/dmdbms/go-dm# 若网络问题&#xff0c;配置代理 go env -w GOPROXYhttps://goproxy.cn,direct2. 验证驱动安装 go list -m github.com/dmdbms/go-dm# 预期输出类似 github.com…

华为云Flexus+DeepSeek征文|基于Dify构建音视频内容转录工作流

华为云FlexusDeepSeek征文&#xff5c;基于Dify构建音视频内容转录工作流 一、构建音视频内容转录工作流前言二、构建音视频内容转录工作流环境2.1 基于FlexusX实例的Dify平台2.2 基于MaaS的模型API商用服务 三、构建音视频内容转录工作流实战3.1 配置Dify环境3.2 配置Dify工具…

Pandas6(数据清洗2)——置换和随机采样、get_dummies、扩展数据类型、字符串处理函数

数据清洗2 一、置换和随机采样&#xff08;permutation,sample&#xff09; 随机置换&#xff08;打乱排序&#xff08;洗牌&#xff09;&#xff09;函数&#xff1a;numpy.random.permutation &#xff0c;可以对一个序列进行随机排序&#xff0c;常用于数据集随机划分等场景…

按月设置索引名的完整指南:Elasticsearch日期索引实践

按月设置索引名的完整指南:Elasticsearch日期索引实践 在时序数据场景中,按月设置索引名(如logs-2024-01)是优化查询效率、降低管理成本的关键策略。以下是三种实现方案及详细步骤: 方案一:索引模板 + 日期数学表达式(推荐) 原理:利用ES内置的日期数学表达式动态生成…

西南交通大学【机器学习实验7】

实验目的 理解和掌握朴素贝叶斯基本原理和方法&#xff0c;理解极大似然估计方法&#xff0c;理解先验概率分布和后验概率分布等概念&#xff0c;掌握朴素贝叶斯分类器训练方法。 实验要求 给定数据集&#xff0c;编程实现朴素贝叶斯分类算法&#xff0c;计算相应先验概率&a…

java生成pdf文件

1.依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>8.0.4</version><type>pom</type></dependency> 2.代码 package org.example;import com.itextpdf.io.image…