python 实现任务管理清单案例


Posted in Python onApril 25, 2020

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>
                 {{ session.user }}</a></li>
            <li><a href="/logout/" rel="external nofollow" ><span class="glyphicon glyphicon-log-in"></span>
                 注销 </a></li>

          {% else %}

            <li><a href="/login/" rel="external nofollow" ><span class="glyphicon glyphicon-log-in"></span>
                登陆</a></li>
            <li><a href="/register/" rel="external nofollow" ><span class="glyphicon glyphicon-log-out"></span>
              注册</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 实现任务管理清单案例

以上这篇python 实现任务管理清单案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Django的上下文中设置变量的方法
Jul 20 Python
python 添加用户设置密码并发邮件给root用户
Jul 25 Python
网站渗透常用Python小脚本查询同ip网站
May 08 Python
Django实现简单分页功能的方法详解
Dec 05 Python
Python语言实现将图片转化为html页面
Dec 06 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
Jan 29 Python
Python拆分大型CSV文件代码实例
Oct 07 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
Django+Celery实现动态配置定时任务的方法示例
May 26 Python
Pyinstaller加密打包应用的示例代码
Jun 11 Python
详解Python yaml模块
Sep 23 Python
python 利用matplotlib在3D空间中绘制平面的案例
Feb 06 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
Apr 25 #Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 #Python
python 在threading中如何处理主进程和子线程的关系
Apr 25 #Python
Python多线程:主线程等待所有子线程结束代码
Apr 25 #Python
解决python父线程关闭后子线程不关闭问题
Apr 25 #Python
Python标准库:内置函数max(iterable, *[, key, default])说明
Apr 25 #Python
python except异常处理之后不退出,解决异常继续执行的实现
Apr 25 #Python
You might like
ThinkPHP查询中的魔术方法简述
2014/06/25 PHP
php一个文件搞定微信jssdk配置
2016/12/12 PHP
php实现的mongoDB单例模式操作类
2018/01/20 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
2008/09/25 Javascript
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
js创建数据共享接口——简化框架之间相互传值
2011/10/23 Javascript
js分解url参数(面向对象-极简主义法应用)
2012/08/09 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
2013/11/11 Javascript
Jquery 切换不同图片示例代码
2013/12/05 Javascript
javascript为下拉列表动态添加数据项
2014/05/23 Javascript
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
2017/10/19 Javascript
vue实现学生信息管理系统
2020/05/30 Javascript
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
Python max内置函数详细介绍
2016/11/17 Python
python中defaultdict的用法详解
2017/06/07 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
2017/11/24 Python
numpy使用技巧之数组过滤实例代码
2018/02/03 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
python中bytes和str类型的区别
2019/10/21 Python
python实现两个一维列表合并成一个二维列表
2019/12/02 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
python定义具名元组实例操作
2021/02/28 Python
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
销售行业个人求职自荐信
2013/09/25 职场文书
应用数学专业求职信
2014/03/14 职场文书
工程项目经理任命书
2014/06/05 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
会议接待欢迎词范文
2015/01/26 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
任命书标准格式
2015/03/02 职场文书
入门学习Go的基本语法
2021/07/07 Golang
TypeScript实用技巧 Nominal Typing名义类型详解
2022/09/23 Javascript