python 实现任务管理清单案例

作者:zcx1203 时间:2023-09-01 04:59:17 

base.html:


{% extends "bootstrap/base.html" %}

{% block styles %}
 {{ super() }}
 <link rel="stylesheet" href="../static/css/main.css" rel="external nofollow" >
{% endblock %}

{% block navbar %}
 <nav class="navbar navbar-default">
   <div class="container-fluid">
     <!-- Brand and toggle get grouped for better mobile display -->
     <div class="navbar-header">
       <button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
           data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
         <span class="sr-only">Toggle navigation</span>
         <span class="icon-bar"></span>
         <span class="icon-bar"></span>
         <span class="icon-bar"></span>
       </button>
       <a class="navbar-brand" href="index.html" rel="external nofollow" ></a>
     </div>

<!-- Collect the nav links, forms, and other content for toggling -->
     <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
       <ul class="nav navbar-nav">
          <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ></a></li>
          <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ></a></li>
         <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >首页<span class="sr-only">(current)</span></a></li>
         <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >新闻</a></li>
         <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >国际</a></li>
         <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >国内</a></li>
         <li><a href="/sysinfo/" rel="external nofollow" >系统信息</a></li>
         <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >登陆用户</a></li>
       </ul>
       <ul class="nav navbar-nav navbar-right">

{% if 'user' in session %}
           <li><a href="login.html" rel="external nofollow" ><span class="glyphicon glyphicon-user"></span>
             &nbsp;&nbsp; {{ session.user }}</a></li>
           <li><a href="/logout/" rel="external nofollow" ><span class="glyphicon glyphicon-log-in"></span>
             &nbsp;&nbsp; 注销 </a></li>

{% else %}

<li><a href="/login/" rel="external nofollow" ><span class="glyphicon glyphicon-log-in"></span>
             &nbsp;&nbsp;登陆</a></li>
           <li><a href="/register/" rel="external nofollow" ><span class="glyphicon glyphicon-log-out"></span>
           &nbsp;&nbsp;注册</a></li>
         {% endif %}

</ul>
     </div><!-- /.navbar-collapse -->
   </div><!-- /.container-fluid -->
 </nav>
{% endblock %}

{% block content %}
 {#定义属于自己的block#}
 {% block newcontent %}

{% endblock %}

{% block footer %}

<div class="footer">

京ICP备11008151号京公网安备11010802014853

</div>

{% endblock %}
{% endblock %}

list.html:


{% extends 'base.html' %}

{% block newcontent %}
 <div class="row">
   <div class="col-md-6 col-md-offset-3">
     /*添加任务*/
     <form class="form-horizontal" action="/todo/add/" method="post">
       <div class="form-group">
         {# 添加框          #}
         <div class="col-sm-9">
           <input type="text" class="form-control" placeholder="请添加任务" required="required"
               name="todo_name">
         </div>
         {#  选择框       #}
         <div class="col-sm-2">
           <select class="form-control" name="part">
             {% for part in parts %}
               <option value="{{ part.id }}">{{ part.name }}</option>
             {% endfor %}
           </select>
         </div>

{#  添加的按钮       #}
         <div class="col-sm-1">
           <input type="submit" class="btn btn-success" value="添加任务">
         </div>
       </div>

</form>

/*任务显示*/
     <h1>添加任务</h1>
     <table class="table table-bordered">
       <tr>
         <td>任务内容</td>
         <td>创建时间</td>
         <td>状态</td>
         <td>所属部门</td>
         <td>操作</td>
       </tr>
       {% for todo in todos %}
         <tr>
           <td>{{ todo.name }}</td>
           <td>{{ todo.add_time }}</td>
           {#    #}
           <td>
             {% if todo.status %}
                <a href="/todo/undo/{{ todo.id }}/" rel="external nofollow" class="btn btn-sm btn-success" role="button"><span
             class="glyphicon glyphicon-ok"></span> 已完成</a>

{% else %}
               <a href="/todo/done/{{ todo.id }}/" rel="external nofollow" class="btn btn-sm btn-warning" role="button"><span
             class="glyphicon glyphicon-remove"></span> 未完成</a>

{% endif %}

</td>
           <td>{{ todo.department.name }}</td>
           <td><a href="/todo/delete/{{ todo.id }}/" rel="external nofollow" class="btn btn-sm btn-danger" role="button"><span
             class="glyphicon glyphicon-remove"></span> 删除</a></td>
         </tr>

{% endfor %}

</table>
   </div>
 </div>

{% endblock %}

models.py:


from datetime import datetime
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:971203@localhost/Todo'
# SQLAlchemy 将会追踪对象的修改并且发送信号。
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
bootstrap = Bootstrap(app)
app.config['SECRET_KEY'] = 'westos'
# 1). 面向对象方式创建表
# 2). 分析关系:
#    部门和用户: 一对多
#    用户和任务: 一对多的关系
#    用户和用户登录日志: 一对多的关系
# 实现一对多(Role(1): User(n))的关系
#  - 多的一端写外键
#  - 少的一端写反向引用

class User(db.Model):
 id = db.Column(db.Integer, autoincrement=True, primary_key=True)
 # unique:用户名唯一, nullable=False指用户名不能为空;
 name = db.Column(db.String(50), unique=True, nullable=False)
 pwd = db.Column(db.String(100))
 email = db.Column(db.String(30), unique=True)
 phone = db.Column(db.String(30), unique=True)
 info = db.Column(db.Text) # 个人简介
 add_time = db.Column(db.DateTime, default=datetime.now())  # 创建时间
 department_id = db.Column(db.Integer, db.ForeignKey('department.id'))
 todos = db.relationship('Todo', backref='user')
 userlogs = db.relationship('Userlog', backref='user')
 # 部门id与其他表关联,不能随便写

def __repr__(self):
   return '<User: %s>' %(self.name)

# 部门
class Department(db.Model):
 id = db.Column(db.Integer, autoincrement=True, primary_key=True)
 name = db.Column(db.String(50), unique=True, nullable=False)
 # 反向引用: user就包含一个属性, department
 users = db.relationship('User', backref='department')
 todos = db.relationship('Todo', backref='department')
 def __repr__(self):
   return '<Department: %s>' %(self.name)

class Todo(db.Model):
 id = db.Column(db.Integer, autoincrement=True, primary_key=True)
 name = db.Column(db.String(200), nullable=False)
 add_time = db.Column(db.DateTime, default=datetime.now()) # 创建时间
 status = db.Column(db.Boolean, default=False) # 任务状态, 默认为Flase(未完成)
 department_id = db.Column(db.Integer, db.ForeignKey('department.id'))
 user_id = db.Column(db.Integer,db.ForeignKey('user.id') )

def __repr__(self):
   return '<Todo: %s>' % (self.id)

# 用户登录日志
class Userlog(db.Model):
 id = db.Column(db.Integer, autoincrement=True, primary_key=True)
 add_time = db.Column(db.DateTime, default=datetime.now()) # 创建时间
 ip = db.Column(db.String(200), nullable=False) # 登录ip
 area = db.Column(db.String(200)) # 用户登录地点
 user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 外键

def __repr__(self):
   return '<Userlog: %s>' % (self.ip)

views.py:


from flask import render_template, request, redirect, url_for, session

from models import app, Todo, db, Department,User
from mDB import isPasswdOk,isUserExist,addUser
from forms import LoginForm,RegisterForm
@app.route('/')
def index():
 return render_template('base.html')
@app.route('/register/')
def register():
 form = RegisterForm()
 if form.validate_on_submit():
   user = request.form('user')
   passwd = request.form('passwd')
 return render_template('register.html')

@app.route('/login/',methods=['GET','POST'])
def login():
 form = LoginForm()
 # 如果是post方法并且表单验证通过的话, 返回True;
 if form.validate_on_submit():
   # 1). 获取用户提交的表单信息
   # print(form.data) 是字典类型, 内容如下:
   # {'user': 'westos', 'passwd': 'westos', 'submit': True }
   user = form.data['user']
   passwd = form.data['passwd']
   # 2. 判断用户名和密码是否正确

if isPasswdOk(user, passwd):
     # 将用户名和密码信息存储到session中;
     session['user'] = user
     session['passwd'] = passwd
     # 如果登陆成功, 跳转到主页;
     return redirect(url_for('todo_list'))
   else:
     # 如果登陆失败, 重新登陆;
     return render_template('login.html',form=form, message="用户名或者密码错误")
 return render_template('login.html', form=form)
@app.route('/logout/')
def logout():
 session.pop('user',None)
 session.pop('passwd',None)
 return redirect(url_for('todo_list'))
# 任务的增删改查
@app.route('/todo/add/', methods=['POST'])
def todo_add():
 # 获取提交的任务信息
 name = request.form['todo_name']
 part = request.form['part']
 # 添加完成之后, 返回任务列表显示页面
 u = User.query.filter_by(name=session['user']).first()
 id = u.id
 todo = Todo(name=name, department_id=part, user_id=id)
 db.session.add(todo)
 db.session.commit()

return redirect(url_for('todo_list'))

@app.route('/todo/delete/<int:id>/')
def todo_delete(id):
 u = Todo.query.filter_by(id=id).first()
 db.session.delete(u)
 db.session.commit()
 return redirect(url_for('todo_list'))

@app.route('/list/')
def todo_list():
 # 1). 从数据库中查询
 todos = Todo.query.all()
 parts = Department.query.all()

return render_template('list.html',
             todos = todos,
             parts=parts)

# 修改任务的状态(变成已完成状态/变成未完成状态)
@app.route('/todo/undo/<int:id>/')
def undo(id):
 todo = Todo.query.filter_by(id=id).first()
 todo.status = False
 db.session.commit()
 # 更新状态后, 返回任务列表页
 return redirect(url_for('todo_list'))

@app.route('/todo/done/<int:id>/')
def done(id):
 todo = Todo.query.filter_by(id=id).first()
 todo.status = True
 db.session.commit()
 # 更新状态后, 返回任务列表页
 return redirect(url_for('todo_list'))

run.py:


# 项目真实运行脚本

from models import app,db
# 导入编写的视图函数和路由
from views import *

app.run()

python 实现任务管理清单案例

python 实现任务管理清单案例

python 实现任务管理清单案例

来源:https://blog.csdn.net/zcx1203/article/details/83625345

标签:python,任务,清单
0
投稿

猜你喜欢

  • 解决Python报错:ValueError:operands could not be broadcast together with shapes

    2021-05-14 12:04:53
  • Oracle 中文字段进行排序的sql语句

    2009-09-26 18:58:00
  • 使用Java实现先查询缓存再查询数据库

    2024-01-14 02:18:05
  • asp数字或者字符排序函数代码

    2011-02-24 11:00:00
  • 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等

    2024-01-26 16:53:22
  • python实现各种插值法(数值分析)

    2023-06-14 15:15:37
  • 详解PHP变量传值赋值和引用赋值变量销毁

    2023-10-25 00:27:31
  • numpy ndarray 按条件筛选数组,关联筛选的例子

    2021-04-12 04:58:09
  • python isinstance函数用法详解

    2023-05-08 12:43:56
  • JavaScript队列函数和异步执行详解

    2024-04-22 13:26:21
  • Go 通过结构struct实现接口interface的问题

    2024-05-08 10:44:55
  • python获取命令行输入参数列表的实例代码

    2022-02-26 15:48:41
  • python PIL模块的基本使用

    2022-08-28 16:35:19
  • 如何优化JavaScript脚本的性能

    2008-02-19 21:47:00
  • 从Vista地址栏到网站导航菜单

    2009-09-08 12:35:00
  • python基础while循环及if判断的实例讲解

    2021-02-18 06:56:06
  • Python接口自动化浅析logging封装及实战操作

    2022-12-04 12:21:44
  • Python读写Redis数据库操作示例

    2024-01-13 02:09:05
  • SQL Server高级内容之case语法函数概述及使用

    2024-01-13 20:40:12
  • python单例模式的多种实现方法

    2023-05-01 12:05:04
  • asp之家 网络编程 m.aspxhome.com