一.个人学期总结

   从一开始接触的是turtle库绘制图形,在没有接触基本语法的情况下,会因为基础不扎实而学起来吃力,turtle库的学习,练习if条件、for循环、定义函数的代码,激发了我们对python的学习兴趣的热情,逐渐的,在对库的使用中熟悉了python的语法,有html基础加上Bootstrap(www.runoob.com)的CSS引用,就可以制作出一个静态页面,再有了python基础以及连接数据库的知识,就可以完成web建站了。

   Python的确易学、易用、强大。印证了Bruce Eckel的观点:“Python可能是唯一一种旨在帮助程序员把事情弄得更加简单的语言”,是一种“用着方便、看着舒服”的程序。在课堂上也经历了明明听懂了,可是课下一做,就什么都不会了,脑袋一片空白,没有一点思路,而且刚写了一点代码程序就会报错,所以多加练习还是很有必要的,有时候也要借鉴一下别人的学习方法。遇到问题先自己想,然后是上网查资料,再然后是问同学,最后是问老师。Flask框架相对于其他框架而言,更加稳定,不会有莫名其妙的错误,容错性强,运行效果好,报错信息明了。在本学期的管理系统课程中,我收获了以下编程习惯:

1.搜索能力:你没有能力和精力完成所有的事情,别人也不一定有时间帮你,有些时候需要自己去找答案,至少是找到灵感。所以学习从Google、CSDN等网站找到自己需要的东西是一个很好的习惯;

2.善用Python标准库;

3.尽能力熟悉常用的工具和项目。

  二.总结Python+Flask+MysqL的web建设技术过程:

1.web建设过程中需要用到的工具:pycharm64.exe + Python 3.6 64-bit + MySQL + Navicat for MySQL(辅助工具)

2新建flask项目

3.创建连接数据库的名为config的py文件

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

    

编程是一门技术,也可以说是一门手艺。如同书法、绘画、乐器、雕刻等,技艺纯熟的背后一定付出了很长的时间去反复练习。编程的世界浩瀚无边,所以应保持一颗敬畏的心态去学习,认真对待写下的每一行代码,甚至每一个字符。总体来说,在老师的指导下,我学到了很多东西。

posted on 2018-01-07 19:55  094吴嘉绿  阅读(319)  评论(0编辑  收藏  举报