期末做品檢查

一.我的學期總結javascript

   從一開始接觸的是turtle庫繪製圖形,在沒有接觸基本語法的狀況下,會由於基礎不紮實而學起來吃力,turtle庫的學習,練習if條件、for循環、定義函數的代碼,激發了咱們對python的學習興趣的熱情,逐漸的,在對庫的使用中熟悉了python的語法,有html基礎加上Bootstrap(www.runoob.com)的CSS引用,就能夠製做出一個靜態頁面,再有了python基礎以及鏈接數據庫的知識,就能夠完成web建站了。php

   Python的確易學、易用、強大。印證了Bruce Eckel的觀點:「Python多是惟一一種旨在幫助程序員把事情弄得更加簡單的語言」,是一種「用着方便、看着舒服」的程序。在課堂上也經歷了明明聽懂了,但是課下一作,就什麼都不會了,腦殼一片空白,沒有一點思路,並且剛寫了一點代碼程序就會報錯,因此多加練習仍是頗有必要的,有時候也要借鑑一下別人的學習方法。遇到問題先本身想,而後是上網查資料,再而後是問同窗,最後是問老師。Flask框架相對於其餘框架而言,更加穩定,不會有莫名其妙的錯誤,容錯性強,運行效果好,報錯信息明瞭。在本學期的管理系統課程中,我收穫瞭如下編程習慣:css

1.搜索能力:你沒有能力和精力完成全部的事情,別人也不必定有時間幫你,有些時候須要本身去找答案,至少是找到靈感。因此學習從Google、CSDN等網站找到本身須要的東西是一個很好的習慣;html

2.善用Python標準庫;java

3.盡能力熟悉經常使用的工具和項目。python

  二.總結Python+Flask+MysqL的web建設技術過程:mysql

1.web建設過程當中須要用到的工具:pycharm64.exe + Python 3.6 64-bit + MySQL + Navicat for MySQL(輔助工具)jquery

2新建flask項目程序員

3.建立鏈接數據庫的名爲config的py文件web

import os
DEBUG = True

SECRET_KEY = os.urandom(24)

DIALECT = 'mysql'
DRIVER = 'mysqldb'
USERNAME = 'root'
PASSWORD = 'ROOT'
HOST = 'localhost'
DATABASE = 'mis_db'
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:@localhost:3306/mis_db?charset=utf8'
SQLALCHEMY_TRACK_MODIFICATIONS = False

4.在鏈接了數據庫以後,就能夠在另外一個主py文件裏建立基本表,包括

  user表裏存放用戶的id、用戶名、密碼和暱稱;

  question表裏存放用戶的id、標題、問答詳情、建立時間、做者id;

   comment表裏存放id、做者id、文章id、建立時間和問答詳情。

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(20), nullable=False)
    _password = db.Column(db.String(200), nullable=False) #內部使用
    nickname = db.Column(db.String(20), nullable=True)

class Ques(db.Model):
    __tablename__ = 'question'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    author = db.relationship('User', backref=db.backref('question'))
    title = db.Column(db.String(20), nullable=False)
    detail = db.Column(db.Text, nullable=False)
    creat_time = db.Column(db.DateTime, default=datetime.now)


class Comment(db.Model):
    __tablename__ = 'comment'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    question_id = db.Column(db.Integer, db.ForeignKey('question.id'))
    creat_time = db.Column(db.DateTime, default=datetime.now)
    detail = db.Column(db.Text, nullable=False)
    question = db.relationship('Ques', backref=db.backref('comment', order_by=creat_time.desc))
    author = db.relationship('User', backref=db.backref('comment'))
db.create_all()

5.數據庫增刪改查

#增長
user=User(username='lulu',password='11111',nickname='123456')
db.session.add(user)
db.session.commit()
#查詢
user=User.query.filter(User.username =='lulu').first()
print(user.username,user.password,user.nickname)
#刪除
user=User.query.filter(User.username =='lulu').first()
db.session.delete(user)
db.session.commit()
#修改
user=User.query.filter(User.username =='lulu').first()
user.password='123456789'
db.session.commit()

6.加載靜態文件和模板繼承
加載靜態文件:

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<link type="text/css" rel="stylesheet" href="{{ url_for('static',filename='css/all.css') }}">

子模板繼承:
a.註冊

{% extends 'lx3.html' %}
{% block registertitle %}註冊{% endblock %}
{% block registerhead %}
    <script type="text/javascript" src="../static/js/all.js"></script>{% endblock %}

b.登陸

{% extends 'lx3.html' %}
{% block logintitle %}登陸{% endblock %}

{% block loginhead %}<script type="text/javascript" src="../static/js/all.js"></script>{% endblock %}

c.發佈問答

{% extends 'lx3.html' %}
{% block registertitle %}發佈{% endblock %}

d.我的中心父模板

{% extends"lx3.html" %}
{% block logintitle %}我的中心{% endblock %}
{% block loginhead %}
{% endblock %}

e.我的中心

{% extends 'user.html' %}
{% block user %}我的信息{% endblock %}

7.首頁功能

.py文件

#首頁
@app.route('/')
def lx():
    context = {
        'question': Ques.query.all()

    }

html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首頁
        {% block logintitle %}{% endblock %}
        {% block registertitle %}{% endblock %}
    </title>

    <nav style="background-color: white">
        <ul class="nav nav-tabs">
            <li><a href="{{ url_for('lx') }}">首頁</a></li>
            <li><a href="{{ url_for('fabu') }}">發佈菜譜</a></li>

            <ul class="nav navbar-nav navbar-right">
            {% if username %}
             <li><a href="{{url_for('logout') }}"><span class="glyphicon glyphicon-user"></span> 註銷</a></li>
            <li><a href=""><span class="glyphicon glyphicon-log-in"></span> {{username }}</a></li>
            {% else %}

            <li><a href="{{ url_for('regist') }}"><span class="glyphicon glyphicon-user"></span> 註冊</a></li>
            <li><a href="{{ url_for('login') }}"><span class="glyphicon glyphicon-log-in"></span> 登陸</a></li>
            {% endif %}

        </ul>

   <form action="{{ url_for('search') }}" class="navbar-form navbar-left" role="search"method="get">
       <div class="form-group"><input type="text" name="search" class="form-control" placeholder="請輸入關鍵詞">
           <button type="submit" class="btn btn-default" style="width: 70px">Search</button></div>
            </form>


        </ul>
    </nav>
    {% block loginhead %}{% endblock %}
    {% block registerhead %}{% endblock %}
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<link type="text/css" rel="stylesheet" href="{{ url_for('static',filename='css/all.css') }}">




</head>
<script src="https://cdn.bootcss.com/bootstrap/4.0.0-beta/js/bootstrap.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<body class="body">

<h1  align="center">美食天下</h1>
{% block body %}
    <div class="container">
    <div class="row clearfix">
        <div class="col-md-2 column">
        </div>
        <div class="col-md-8 column">
            {% for foo in question %}
            <div class="list-group">
                 <a href="{{ url_for('usercenter',user_id=foo.author.id,tag='1') }}" class="list-group-item active">做者:{{ foo.author.username}}</a>

                <div class="list-group-item">
                    <a href="{{ url_for('detail',question_id=foo.id)}}" class="list-group-item-heading">
                        {{ foo.title}}
                    </a>
                    <p class="list-group-item-text">
                        {{foo.detail}}
                    </p>
                </div>
                <div class="list-group-item">
                     <span class="badge">發佈時間:{{foo.creat_time}}</span> 發佈時間
                </div>
        </div>
             {% endfor %}
        <div class="col-md-2 column">
        </div>
    </div>
</div>
    <div class="row">
    <div class="col-md-1"></div>
    <div class="col-md-2">
        </br></br></br>
        <div class="list-group">
            <a href="#" class="list-group-item active">
                Introduction
            </a>
            <a href="http://www.meishij.net/zuofa/liangbanjisi_27.html" class="list-group-item list-group-item-action">涼拌雞絲</a>
            <a href="http://www.meishij.net/zuofa/bawangchaoshiluandunzhizhuroufentiao.html" class="list-group-item list-group-item-action">霸王亂燉之豬肉粉條</a>
            <a href="http://www.meishij.net/zuofa/bingcaotianchengshalaqiubishalajiang.html" class="list-group-item list-group-item-action">冰草甜橙沙拉</a>
            <a href="http://www.meishij.net/zuofa/pugongyingyumibing.html" class="list-group-item list-group-item-action ">蒲公英玉米餅</a>
            <a href="http://www.meishij.net/zuofa/shengdanhuahuanpaofu.html" class="list-group-item list-group-item-action ">聖誕花環泡芙</a>
            <a href="http://www.meishij.net/zuofa/wanghongzangzangbao_2.html" class="list-group-item list-group-item-action ">網紅髒髒包</a>
        </div>
    </div>

    <div class="col-md-1"></div>
    <div class=" col-md-3">
        <a href="http://www.meishij.net/zuofa/liangbanjisi_27.html" >
            <img src="{{ url_for('static',filename='images/jisi.jpg') }}"  height="40%" width="90%">
        </a>
        <a href="http://www.meishij.net/zuofa/liangbanjisi_27.html" ><h3 class="text-muted"><font color="white">涼拌雞絲</font></h3></a>
        <p class="text-muted"><font color="FFF7FF">雞的肉質細嫩,滋味鮮美,適合多種烹調方法,並富有養分,有滋補養身的做用。肌肉不但適合熱炒、燉湯,並且是比較適合冷食涼拌的肉類。今天就和你們一塊兒分享這道極爲簡單的涼拌小菜,只需將雞肉煮熟後撕成細絲,再澆上料汁便可享用 </font></p>
        <p><a href="http://www.meishij.net/zuofa/liangbanjisi_27.html" class="btn btn-primary" role="button">Enter</a> <a href="http://so.meishi.cc/?q=雞絲" class="btn btn-default" role="button">more</a></p>
    </div>
    <div class=" col-md-3">
        <a href="http://www.meishij.net/zuofa/bawangchaoshiluandunzhizhuroufentiao.html" >
            <img src="{{ url_for('static',filename='images/mian.jpg') }}" height="40%" width="90%">
        </a>
        </br>
        <a href="http://www.meishij.net/zuofa/bawangchaoshiluandunzhizhuroufentiao.html" ><h3 class="text-muted"><font color="white">霸王亂燉之豬肉粉條</font></h3></a>
        <p class="text-muted"><font color="white">吃慣了精緻的小菜,偶爾吃吃粗曠的燉菜也不錯,最家常最簡單的亂燉,同時也是最美味最下飯的亂燉。砂鍋裏各色食材放得滿滿當當,小火慢燉,砂鍋邊緣蒸騰出一絲絲熱氣。大塊吃肉解饞,粉條吸足了肉的香味鮮香爽滑,配上米飯味美.</font> </p>
        <p><a href="http://www.meishij.net/zuofa/bawangchaoshiluandunzhizhuroufentiao.html" class="btn btn-primary" role="button">Enter</a> <a href="http://so.meishi.cc/index.php?q=豬肉粉條" class="btn btn-default" role="button">more</a></p>
    </div>
</div>

<div class="row">
    <div class="col-md-4"></div>
    <div class=" col-md-3">
        </br></br>
        <a href="http://www.meishij.net/zuofa/bingcaotianchengshalaqiubishalajiang.html" >
            <img src="{{ url_for('static',filename='images/sala.jpg') }}"  height="40%" width="90%"></a>
        <a href="http://www.meishij.net/zuofa/bingcaotianchengshalaqiubishalajiang.html" ><h3 class="text-muted"><font color="white">冰草甜橙沙拉</font></h3></a>
        <p class="text-muted"><font color="white">第一次嘗試丘比的青檸味的沙拉醬,比起以前用其它口味,口感更清新,更爽味,微甜而不膩。搭配了冰草,櫻桃番茄,甜橙,作成口味微甜的沙拉,吃起來至關爽口。冰草脆而多汁,與甜橙和櫻桃番茄在一塊兒組成紅黃綠亮眼的三色,很是養眼而美味。</font></p>
        <p><a href="http://www.meishij.net/zuofa/bingcaotianchengshalaqiubishalajiang.html" class="btn btn-primary" role="button">Enter</a> <a href="http://so.meishi.cc/index.php?q=沙拉" class="btn btn-default" role="button">more</a></p>
    </div>
    <div class=" col-md-3">
        </br></br>
        <a href="http://www.meishij.net/zuofa/pugongyingyumibing.html" >
            <img src="{{ url_for('static',filename='images/yumi.jpg') }}" height="40%" width="90%">
        </a>
        <a href="http://www.meishij.net/zuofa/pugongyingyumibing.html" ><h3 class="text-muted"><font color="white">蒲公英玉米餅</font></h3></a>
        <p class="text-muted"><font color="white">蒲公英具備清熱解毒,解除消化不良和便祕,清淨血液的功效,含有豐富的維生素和礦物質,除了當餡料包餃子,還能作鹹粥,其自己帶有一種清爽的口感,又具備豐富的食療效果。這裏花兒就和您分享用蒲公英作的特別好吃的一種主食:蒲公英貼餅子。</font></p>
        <p><a href="http://www.meishij.net/zuofa/pugongyingyumibing.html" class="btn btn-primary" role="button">Enter</a> <a href="http://so.meishi.cc/index.php?q=玉米餅" class="btn btn-default" role="button">more</a></p>
    </div>
</div>

<div class="row">
    <div class="col-md-4"></div>
    <div class=" col-md-3">
        </br></br>
        <a href="http://www.meishij.net/zuofa/shengdanhuahuanpaofu.html" >
            <img src="{{ url_for('static',filename='images/paofu.jpg') }}"  height="40%" width="90%"></a>
        <a href="http://www.meishij.net/zuofa/shengdanhuahuanpaofu.html" ><h3 class="text-muted"><font color="white">聖誕花環泡芙</font></h3></a>
        <p class="text-muted"><font color="white">罐頭小廚、火雞、蛋糕、翻糖餅乾堪稱聖誕老三樣,今年來點不同!這款聖誕花環泡芙,美味和顏值全天在線,美妙的奶香和糖霜讓人心神盪漾,隔着屏幕都能聞到甜甜的味道呢</font></p>
        <p><a href="http://www.meishij.net/zuofa/shengdanhuahuanpaofu.html" class="btn btn-primary" role="button">Enter</a> <a href="http://so.meishi.cc/index.php?q=泡芙" class="btn btn-default" role="button">more</a></p>
    </div>
    <div class="row">
    <div class="col-md-4"></div>
    <div class=" col-md-3">
        </br></br>
        <a href="http://www.meishij.net/zuofa/wanghongzangzangbao_2.html" >
            <img src="{{ url_for('static',filename='images/zangbao.jpg') }}"  height="40%" width="90%"></a>
        <a href="http://www.meishij.net/zuofa/wanghongzangzangbao_2.html" ><h3 class="text-muted"><font color="white">網紅髒髒包</font></h3></a>
        <p class="text-muted"><font color="white">髒髒包是一款起酥麪包,一時間賣得火爆,不少店鋪都斷貨。它裏面包有香醇的巧克力餡,外表淋上一層巧克力醬,再撒上可可粉,入口的一瞬間略有點微苦,口感酥軟,甜而不膩。</font></p>
        <p><a href="http://www.meishij.net/zuofa/wanghongzangzangbao_2.html" class="btn btn-primary" role="button">Enter</a> <a href="http://so.meishi.cc/index.php?q=髒髒包" class="btn btn-default" role="button">more</a></p>
    </div>
    </div>
{% endblock %}


</body>
</html>

8.完成註冊和登陸功能
a.註冊與登陸js頁面。onclick函數return True時才提交表單,return False時不提交表單。

function denglu() {
   
    var oUname = document.getElementById("user")
    var oError = document.getElementById("error_box")
    var oUpass = document.getElementById("upass")
    var isError = true;
    oError.innerHTML = "<br>"
    if (oUname.value.length > 12 || oUname.value.length < 6) {
        oError.innerHTML = "用戶名至少6-12位";
        isError = false;
        return isError;
    } else if (oUname.value.charCodeAt(0) >= 48 && oUname.value.charCodeAt(0) <= 57) {
        oError.innerHTML = "用戶名必須爲字母";
        isError = false;
        return isError;
    } else for (var i = 0; i < oUname.value.length; i++) {
        if ((oUname.value.charCodeAt(i) < 48 || oUname.value.charCodeAt(i) > 57) && (oUname.value.charCodeAt(i) < 97 || oUname.value.charCodeAt(i) > 122)) {
         oError.innerHTML = "only letter or number";
          isError = false;
           return isError;
        }
    }
    if (oUpass.value.length > 20 || oUpass.value.length < 6) {
        oError.innerHTML = "密碼爲 6-20位字符";
       isError = false;
        return isError;
    }
    window.alert("登陸成功")
    return true;
}

function zhuce() {
    var oPass = document.getElementById("upass");
    var oPass1 = document.getElementById("upass1");
    var oUname = document.getElementById("uname");
    var oError = document.getElementById("error_box")
    var isError = true;
    oError.innerHTML = "<br>"
    if (oUname.value.length < 6 || oUname.value.length > 12) {
        oError.innerHTML = "用戶名6-12位";
        isError = false;
        return isError;
    } else if ((oUname.value.charCodeAt(0) >= 48) && (oUname.value.charCodeAt(0) <= 57)) {
        oError.innerHTML = "首位爲英文";
       isError = false;
        return isError;
    } else for (var i = 0; i < oUname.value.length; i++) {
            if (((oUname.value.charCodeAt(i) < 48) || (oUname.value.charCodeAt(i) > 57)) && ((oUname.value.charCodeAt(i) < 97) || (oUname.value.charCodeAt(i) > 122))) {
                oError.innerHTML = "字母或數字";
                isError = false;
                return isError;
            }

        }
    if ((oPass.value.length < 6 || oPass.value.length > 12)&&(oPass != oPass1)) {
        oError.innerHTML = "密碼輸入錯誤";
        isError = false;
        return isError;
    }

    window.alert("註冊成功")
    return true;
}

b.註冊頁面的.py文件

@app.route('/regist', methods=['GET', 'POST'])
def regist():
    if request.method == 'GET':
        return render_template('lx.html')
    else:
        username = request.form.get('username')
        password = request.form.get('password')

        user = User.query.filter(User.username == username).first()
        # 判斷用戶名是否存在
        if user:
            return u'帳號已存在'
        else:
            user = User(username=username, password=password)
            db.session.add(user)
            db.session.commit()
            return redirect(url_for('login'))

註冊頁面的html文件

{% extends 'lx3.html' %}
{% block registertitle %}註冊{% endblock %}
{% block registerhead %}
    <script type="text/javascript" src="../static/js/all.js"></script>{% endblock %}


<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="../static/css/all.css">
<base href="www.gzcc.cn" target="_blank">


<h1>
    註冊界面
</h1>


<body id="myBody">
{% block body %}

    <div class="bigdiv" id="container">
        <div id="header"><h2 align="center">註冊</h2></div>

        <div id="content">

            <form action="{{ url_for('regist') }}" method="post">
                <div align="center"> 帳號註冊:<input id="uname" type="text" name="username" placeholder="請輸入用戶名"><br></div>
                <div align="center"> 註冊密碼:<input id="upass" type="password" name="password" placeholder="請輸入密碼"><br>
                </div>
                <div align="center"> 確認密碼:<input id="upass1" type="password" name="password1" placeholder="請確認密碼"></div>
                <div align="center"><input type="radio" name="role" value="stu">student
                    <input type="radio" name="role" value="tea">teacher <br>

                    <div>
                        <button type="submit" onclick="return zhuce()">註冊</button>
                        <input type="button" value="cancel"><br>
                    </div>
                </div>
                <div align="center">
                    <div id="error_box"></div>
                    <br>
                </div>
            </form>
        </div>
    </div>

    </body>

{% endblock %}
</html>

c.登陸頁面的.py文件

@app.route('/login/', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('lx2.html')
    else:
        username = request.form.get('username')
        password = request.form.get('password')
        user = User.query.filter(User.username == username).first()
        # 判斷用戶名是否存在
        if user:
            if user.check_password(password):
                session['user'] = username
                session['userid']=user.id
                session.permanent = True
                return redirect(url_for('lx'))
            else:
                return u'密碼錯誤'
        else:
            return u'帳號不存在'

登陸頁面的html文件

{% extends 'lx3.html' %}
{% block logintitle %}登陸{% endblock %}

{% block loginhead %}<script type="text/javascript" src="../static/js/all.js"></script>{% endblock %}
 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet"  type="text/css" href="../static/css/all.css" >

<h1>

 用戶界面

</h1>

<div class="col">
<body class="body">
{% block body %}

<script>
function displayDate() {
document.getElementById("demo").innerHTML=Date();
}
</script>
<p id="demo">what is the time?</p>
<button type="button" onclick="displayDate()">顯示日期</button>

<div  class="bigdiv" >

<div id="header" ><h2 align="center">登陸</h2></div>

<div id="content">

     <form action="{{ url_for('login')}}"method="post">
     <div align="center">username:<input id="user" type="text" name="username" placeholder="請輸入用戶名" ></div> <br>
       <div align="center"> password:<input  id="upass" type="password" name="password" placeholder="請輸入密碼" align="center"><br></div>

      <div align="center">  <input type="radio" name="role" value="stu">student
      <input type="radio" name="role" value="tea">teacher <br>
      <input type="checkbox" value="true"><span style="color: blueviolet">rember</span> <a href="www.gzcc.cn"> 登陸問題請點</a></div>  <br>

       <div align="center">
            <button type="submit" onclick=" return fuck()">登陸</button>
        <input type="button" value="cancel"><br>
       </div>
    <div align="center">
         <div id="error_box"></div><br>
    </div>
     </form>
</div>
</div>
{% endblock %}
</div>
</body>
</html>

9.註銷功能

@app.route('/logout')
def logout():
    session.clear()
    return redirect(url_for('lx'))

10.發佈菜譜功能

.py文件

@app.route('/fabu', methods=['GET', 'POST'])
@loginFirst
def fabu():
    if request.method == 'GET':
        return render_template('fabu.html')
    else:
        title = request.form.get('title')
        detail = request.form.get('detail')
        author_id = User.query.filter(User.username == session.get('user')).first().id  # 判斷用戶名是否存在
        question = Ques(title=title, detail=detail, author_id=author_id)
        db.session.add(question)
        db.session.commit()
        return redirect(url_for('lx'))

.html文件

{% extends 'lx3.html' %}
{% block registertitle %}發佈{% endblock %}
{% block registerhead %}<script type="text/javascript" src="../static/js/all.js"></script>{% endblock %}
 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet"  type="text/css" href="../static/css/all.css" >
<base href="www.gzcc.cn"target="_blank">
<body>
{% block body %}
    <div class="bigdiv">
    <h2>發佈菜譜</h2>
        <form action="{{ url_for('fabu') }}" method="post">
    <label for="">標題</label>
<textarea name="title" id="title" cols="50" rows="1"></textarea><br>
<label for="">內容</label>
<textarea name="detail" id="detail" cols="50" rows="10"></textarea><br>
    <div align="center"><button type="submit">發佈</button></div>
            </form>
    </div>

{% endblock %}
</body>
</html>

 11.問答詳情及發佈評論功能

.py文件

@app.route('/detail/<question_id>', methods=['GET', 'POST'])
def detail(question_id):
    quest = Ques.query.filter(Ques.id == question_id).first()
    comments = Comment.query.filter(Comment.question_id == question_id).all()
    return render_template('detail.html', quest=quest,comments=comments)

@app.route('/comment',methods=['POST'])
@loginFirst
def comment():
    comment =request.form.get('new_comment')
    question_id=request.form.get('question_id')
    auth_id=User.query.filter(User.username==session.get('user')).first().id
    comm = Comment(author_id=auth_id,question_id=question_id,detail=comment)
    db.session.add(comm)
    db.session.commit()

    return redirect(url_for('detail',question_id=question_id))

.html文件

{% extends 'lx3.html' %}
{% block registertitle %} 內容{% endblock %}
{% block registerhead %}
    <script type="text/javascript" src="../static/js/all.js"></script>{% endblock %}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="../static/css/all.css">
<base href="www.gzcc.cn" target="_blank">



{% block body %}
<div class="container" align="">
        <div class="row clearfix">
            <div class="col-md-3 column">
            </div>
            <div class="col-md-6 column">
                <h3 align="center">{{ quest.title }}</h3>
                <div align="center" style="font-weight: 900 ">
                    {#                    <span style="color: red">做者:{{ quest.author.username }}&nbsp;時間:{{ quest.creat_time }}</span>#}
                    <span class="badge">做者:{{ quest.author.username }}&nbsp;&nbsp;發佈時間:{{ quest.creat_time }}</span>
                </div>
                <div class="panel panel-default">
                    <div class="panel-body" style="font-size:large">
                        &nbsp;&nbsp; &nbsp;{{ quest.detail }}

                    </div>
                </div>

                <h4>評論:({{ quest.comment|length }})</h4>
                {% for foo in comments %}
                    <div class="panel panel-default">
                        <div class="panel-body">
                                <span><a
                                        href="{{ url_for('usercenter',user_id=foo.author.id,tag='1') }}">{{ foo.author.username }}</a>&nbsp;&nbsp;&nbsp;時間:{{ foo.creat_time }}</span><br>
                            <span style="font-size: medium">&nbsp;&nbsp;{{ foo.detail }}</span>
                        </div>
                    </div>
                {% endfor %}

            <h4>發佈評論</h4>
            <div>
                    <form action="{{ url_for('comment') }}" method="post">
                        <textarea name="new_comment" id="new_comment" cols="90" rows="5"></textarea>
                        <input id="question_id" name="question_id" type="hidden" value="{{ quest.id }}">
                        <button type="submit">發佈</button>
                    </form>
                </div>
                <div class="col-md-3 column">
                </div>

            </div>
        </div>

    </div>
    

{% endblock %}

 11.我的中心功能

.py文件

@app.route('/usercenter/<user_id>/<tag>')
@loginFirst
def usercenter(user_id,tag):
    user=User.query.filter(User.id==user_id).first()
    context={
        'username_id': user.id,
        'username':user.username,
        'questions':user.question,
        'comments':user.comment
    }
    if tag == '1':
        return render_template('usercenter.html',**context)
    elif tag == '2':
        return render_template('all_question.html', **context)
    else:
        return render_template('all_comment.html', **context)

.html文件

{% extends"lx3.html" %}
{% block logintitle %}我的中心{% endblock %}
{% block loginhead %}
    <style>
    .nav_ul li{
        list-style: none;
        float: left;
        margin: 10px;
    }
    </style>

{% endblock %}
{% block body %}
<ul class="nav_ul">
<li role="presentation"><a href="{{ url_for('usercenter',user_id = username_id,tag='2') }}">所有問答</a></li>
<li role="presentation"> <a href="{{ url_for('usercenter',user_id = username_id,tag='3') }}">所有評論</a></li>
<li role="presentation"><a href="{{ url_for('usercenter',user_id = username_id,tag='1') }}">我的信息</a></li>
</ul>
{% block user %}{% endblock %}

{% endblock %}

 所有問答.html

{% extends 'user.html' %}
{% block user %}

    <div class="container">
        <div class="row clearfix">
            <div class="col-md-2 column">
            </div>
            <div class="col-md-8 column" id="rgba1">

                <hr>
                <h3 align="center">
                    <small>所有問答</small>
                </h3>
                <ul class="list-unstyled">
                    {% for foo in questions %}
                        <li class="list-group-item">
                            <span class="glyphicon glyphicon-user"></span><a>{{ foo.author.username }}</a>
                            <p><a href="{{ url_for('detail',question_id=foo.id)}}">標題:{{ foo.title }}</a></p>
                            <span class="badge pull-right">{{ foo.create_time }}</span>
                            <p>問答內容:{{ foo.detail }}</p>
                            <br>
                        </li>
                    {% endfor %}
                </ul>
            </div>
            <div class="col-md-2 column">
            </div>
        </div>
    </div>
{% endblock %}

 

所有評論.html

{% extends 'user.html' %}
{% block user %}
<div class="container">
    <div class="row clearfix">
        <div class="col-md-2 column">
        </div>
        <div class="col-md-8 column"  id="rgba1">


        <hr>
        <h3 align="center">
            <small>所有評論</small>
        </h3>
        <ul class="list-unstyled">
            {% for foo in comments %}
                <li class="list-group-item">

                    <span class="badge pull-right">{{ foo.create_time }}</span>
                    <p>文章標題:{{ foo.question.title }}</p>
                    <p>評論內容:{{ foo.detail }}</p>
                    <span class="glyphicon glyphicon-user"></span><small ><a>{{ foo.author.username }}</a></small>
                    <br>
                </li>
            {% endfor %}
        </ul>
        </div>
        <div class="col-md-2 column">
        </div>
    </div>
</div>
{% endblock %}

我的信息.html

{% extends 'user.html' %}
{% block user %}
    <div class="container">
        <div class="row clearfix">
            <div class="col-md-2 column">
            </div>
            <div class="col-md-8 column" id="rgba1">
                <p class="text-center">
                    <small>{{ username }}</small>
                </p>
                <hr>
                <h3 align="center">
                    <small>我的信息</small>
                </h3>
                <ul class="list-group">
                    <li class="list-group-item" style="background-color: antiquewhite"><span class="glyphicon glyphicon-user"></span>用戶:{{ username }}</li>
                    <li class="list-group-item" style="background-color: wheat">暱稱</li>
                    <li class="list-group-item" style="background-color: aquamarine">文章篇數:{{ questions|length }}</li>
                </ul>
            </div>
            <div class="col-md-2 column">
            </div>
        </div>
    </div><br>
{% endblock %}

 13.搜索功能

.py文件

@app.route('/search/',methods=['GET','POST'])
def search():
    search = request.args.get('search')
    question = Ques.query.filter(
        or_(
            Ques.title.contains(search),
            Ques.detail.contains(search)
        )

    ).order_by('-creat_time')

    return render_template('lx3.html',question=question)

14.裝飾器

decorator裝飾器,它能加強函數的功能,它是一個函數,它的參數是一個函數,返回值是一個函數

def loginFirst(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        if session.get('user'):
            return func(*args, **kwargs)
        else:
            return redirect(url_for('login'))

    return wrapper

15.上下文處理器

@app.context_processor
def mycontext():
    username = session.get('user')
    if username:
        return {'username': username}
    else:
        return {}

    

編程是一門技術,也能夠說是一門手藝。如同書法、繪畫、樂器、雕刻等,技藝純熟的背後必定付出了很長的時間去反覆練習。編程的世界浩瀚無邊,因此應保持一顆敬畏的心態去學習,認真對待寫下的每一行代碼,甚至每個字符。整體來講,在老師的指導下,我學到了不少東西。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息