1. 程式人生 > 實用技巧 >移動開發思路

移動開發思路

更多程式設計教程請到:菜鳥教程 https://www.piaodoo.com/

友情連結:

高州陽光論壇https://www.hnthzk.com/

人人影視http://www.sfkyty.com/

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>

  &lt;!-- Collect the nav links, forms, and other content for toggling --&gt;
  &lt;div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"&gt;
    &lt;ul class="nav navbar-nav"&gt;
       &lt;li&gt;&lt;a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &gt;&lt;/a&gt;&lt;/li&gt;
       &lt;li&gt;&lt;a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &gt;&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &gt;首頁&lt;span class="sr-only"&gt;(current)&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &gt;新聞&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &gt;國際&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &gt;國內&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="/sysinfo/" rel="external nofollow" &gt;系統資訊&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &gt;登陸使用者&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul class="nav navbar-nav navbar-right"&gt;

      {% if 'user' in session %}
        &lt;li&gt;&lt;a href="login.html" rel="external nofollow" &gt;&lt;span class="glyphicon glyphicon-user"&gt;&lt;/span&gt;
          &amp;nbsp;&amp;nbsp; {{ session.user }}&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="/logout/" rel="external nofollow" &gt;&lt;span class="glyphicon glyphicon-log-in"&gt;&lt;/span&gt;
          &amp;nbsp;&amp;nbsp; 登出 &lt;/a&gt;&lt;/li&gt;

      {% else %}

        &lt;li&gt;&lt;a href="/login/" rel="external nofollow" &gt;&lt;span class="glyphicon glyphicon-log-in"&gt;&lt;/span&gt;
          &amp;nbsp;&amp;nbsp;登陸&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="/register/" rel="external nofollow" &gt;&lt;span class="glyphicon glyphicon-log-out"&gt;&lt;/span&gt;
        &amp;nbsp;&amp;nbsp;註冊&lt;/a&gt;&lt;/li&gt;
      {% endif %}



    &lt;/ul&gt;
  &lt;/div&gt;&lt;!-- /.navbar-collapse --&gt;
&lt;/div&gt;&lt;!-- /.container-fluid --&gt;

</nav>
{% endblock %}

{% block content %}
{#定義屬於自己的block#}
{% block newcontent %}

{% endblock %}

{% block footer %}

&lt;div class="footer"&gt;


  京ICP備11008151號京公網安備11010802014853

&lt;/div&gt;

{% 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>

      {#  新增的按鈕       #}
      &lt;div class="col-sm-1"&gt;
        &lt;input type="submit" class="btn btn-success" value="新增任務"&gt;
      &lt;/div&gt;
    &lt;/div&gt;

  &lt;/form&gt;

  /*任務顯示*/
  &lt;h1&gt;新增任務&lt;/h1&gt;
  &lt;table class="table table-bordered"&gt;
    &lt;tr&gt;
      &lt;td&gt;任務內容&lt;/td&gt;
      &lt;td&gt;建立時間&lt;/td&gt;
      &lt;td&gt;狀態&lt;/td&gt;
      &lt;td&gt;所屬部門&lt;/td&gt;
      &lt;td&gt;操作&lt;/td&gt;
    &lt;/tr&gt;
    {% for todo in todos %}
      &lt;tr&gt;
        &lt;td&gt;{{ todo.name }}&lt;/td&gt;
        &lt;td&gt;{{ todo.add_time }}&lt;/td&gt;
        {#    #}
        &lt;td&gt;
          {% if todo.status %}
             &lt;a href="/todo/undo/{{ todo.id }}/" rel="external nofollow" class="btn btn-sm btn-success" role="button"&gt;&lt;span
          class="glyphicon glyphicon-ok"&gt;&lt;/span&gt; 已完成&lt;/a&gt;

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

          {% endif %}

        &lt;/td&gt;
        &lt;td&gt;{{ todo.department.name }}&lt;/td&gt;
        &lt;td&gt;&lt;a href="/todo/delete/{{ todo.id }}/" rel="external nofollow" class="btn btn-sm btn-danger" role="button"&gt;&lt;span
          class="glyphicon glyphicon-remove"&gt;&lt;/span&gt; 刪除&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;

    {% endfor %}


  &lt;/table&gt;
&lt;/div&gt;

</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:[email protected]/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 實現任務管理清單案例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援菜鳥教程www.piaodoo.com。