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 相关文章推荐
跟老齐学Python之正规地说一句话
Sep 28 Python
python实现支持目录FTP上传下载文件的方法
Jun 03 Python
使用python实现生成用户信息
Mar 20 Python
Python实现购物程序思路及代码
Jul 24 Python
Numpy中转置transpose、T和swapaxes的实例讲解
Apr 17 Python
Python判断是否json是否包含一个key的方法
Dec 31 Python
python list多级排序知识点总结
Oct 23 Python
Numpy中对向量、矩阵的使用详解
Oct 29 Python
从训练好的tensorflow模型中打印训练变量实例
Jan 20 Python
Python如何将函数值赋给变量
Apr 28 Python
Jupyter notebook如何实现指定浏览器打开
May 13 Python
Python自动化测试基础必备知识点总结
Feb 07 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
声音就能俘获人心,蕾姆,是哪个漂亮小姐姐配音呢?
2020/03/03 日漫
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
php 使用file_get_contents读取大文件的方法
2014/11/13 PHP
jquery选择器(常用选择器说明)
2010/09/28 Javascript
jQuery中的.bind()、.live()和.delegate()之间区别分析
2011/06/08 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
js获取ajax返回值代码
2014/04/30 Javascript
jQuery 中DOM 操作详解
2015/01/13 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
2016/02/25 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
微信小程序开发探究
2016/12/27 Javascript
浅谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/27 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
React Native 通告消息竖向轮播组件的封装
2020/08/25 Javascript
Vue 进阶之路(三)
2019/04/18 Javascript
微信公众号服务器验证Token步骤图解
2019/12/30 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
[02:11]2014DOTA2 TI专访VG战队Fenrir:队伍气氛良好
2014/07/11 DOTA
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
Python中sorted()排序与字母大小写的问题
2020/01/14 Python
pytorch 常用线性函数详解
2020/01/15 Python
详解django使用include无法跳转的解决方法
2020/03/19 Python
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
中国茶叶、茶具一站式网上购物商城:醉品茶城
2018/07/03 全球购物
JD Sports比利时官网:英国领先的运动鞋和运动服饰零售商
2018/10/10 全球购物
自动一体化专业求职信
2014/03/15 职场文书
小学家长评语大全
2014/04/16 职场文书
公司承诺书格式
2014/05/21 职场文书
中国合伙人观后感
2015/06/02 职场文书
酒店厨房管理制度
2015/08/06 职场文书
化工厂员工工作总结
2015/10/15 职场文书
ant design vue的form表单取值方法
2022/06/01 Vue.js