期末作品检查

一、个人学期总结

     在这个学期,我由一开始的概念知识到后面基本熟悉的上机操作,都离不开老师对我们一步步的指导。在这个课程中我发现,跟随老师的步伐,做出一个界面并不代表什么,而是需要课后多加熟悉,上手操作,才能算是掌握这门课程的核心。一开始上课时,老师首先是让我们熟悉了解了什么是管理信息系统,以及我们眼中的管理信息系统是什么。我们学习了Python的基础语法,输入、输出、交互、数字计算的方法、字符串基本操作、凯撒密码、自制九九乘法表、中英文词频统计等,还学习了import turtle库,并利用这个库绘制出多种多样的图形,海龟图标有趣可爱,课堂氛围活泼许多,从而激发了我们学习Python的兴趣,提升了我们对编程语言的思维能力,为构建Flask框架制作网页的学习打下基础。并让我们从简单的上手,做简单输入输出交互,例如 用户输入两个数字,计算并输出两个数字之和:(尝试只用一行代码实现这个功能) 输入半径,计算圆的面积。除此之外,我们还进行了turtle库的基础学习和循环、函数和条件定义,练习如何画五角星 画同心圆 画太阳花 画五个角星,这让我初次尝试到了这门课程的乐趣,并想要继续探寻这其中的奥秘。在这之后,我们又相继学习了如何如何统计中文和英文字频、如何利用datetime处理时间和日期问题。基本入门后,我们开始学习认识URL,观察常用网站网址,区分不同组成部分。观察web浏览过程.,了解HTML基础,练习使用标签制作简单的页面。观察常用网页的HTML元素,在实际的应用场景中,用已学的标签模仿制作。 用div,form制作登录页面, 练习使用下拉列表选择框,无序列表,有序列表,定义列表。并且使用<script></script>的三种用法,登录验证,完成登录与注册页面的HTML+CSS+JS。在学习的中后期,我们开始学习FLASK这一项目,设置调试模式,理解Flask项目主程序。使用装饰器,设置路径与函数之间的关系。使用Flask中render_template,用不同的路径,返回首页、登录员、注册页。用视图函数反转得到URL,url_for(‘login’),完成导航里的链接。加载静态文件,进行父模板的继承和扩展,实现自己代码的需求。

   在学习Python+Flask+MysqL的web建设时,需要安装数据库(mysql)、开发工具(pycharm)和开发需要用到的第三方库。一开始,我们学习网页前端的制作,第一次知道五花八门的网页原来是由许许多多的标签对组成的,每一对都有它特定的一些功能,包含了标签对里的众多参数,要想实现这些标签对的功能就必须遵循它的书写规则,由于pycharm软件里,在html里一旦有某个字母拼写错误就会报错,颜色也是书写正误的凭借,所以html报错还是比较好处理的,但在JS代码的编写中不会提示你哪里出错,所以在编写过程中要多加细心谨慎。

  在后端建设过程中,我们引入了flask库,用于创建一个Flask对象以及页面的跳转,引入flask_sqlalchemy库进行数据库的关联映射等,学习了对数据的增删改查等操作,利用对数据库的查询、添加功能实现了页面的登陆、注册以及发布功能,这些功能的实现根据前端页面的name属性名,后台请求接收同名name的值,再对接收到的值做一系列增删查改操作。在对这些name属性命名时,要注意前后端对应,且同一页面不能出现相同命名,否则会出现数据传递出错,造成一系列的麻烦,所以在编程过程中要时刻注意代码的唯一性、对应性、简洁性和条理性,尽量用更少更优化的代码实现功能。为网页增加功能,为网页增添属于自己的风格。开始做Flask项目,加载静态文件,父模板的继承和扩展,连接mysql数据库,创建用户模型,建立mysql和app的连接。通过用户模型,对数据库进行增删改查操作。完成注册功能,将界面的数据存到数据库,redirect重定向登录页。完成登录功能。登录之后更新导航,用上下文处理器定义函数,获取session中保存的值,返回字典,在父模板中更新导航,插入登录前发布器。完成注销功能,清除session。发布功能的实现,制作首页的显示列表,首页列表显示全部问答,完成问答详情页布局,从首页问答标题到问答详情页,完成评论功能,完成评论列表显示及时间排序,个人中心显示,个人中心标签页导航,完成个人中心—导航标签,实现搜索功能(包括高级搜索即搜素题目和内容都可以出现),最重要的是实现密码加密功能,在数据库显示密文,明文密码只有个人用户才清楚。

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

1.使用工具:①pycharm64.exe ②Python 3.6 64-bit ③MySQL ④HEIDISQL

2.功能实现过程

导航:

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
   <title>{% block title %}{% endblock %}base</title>
    <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/shouye.css" type="text/css">
     <script src="../static/js/shouye.js"></script>
    <manhua target="_blank"/>
</head>
 {% block head %}{% endblock %}
<body id="myBody">
<nav class="navbar navbar-default" role="navigation">
    <img src="http://news.u17i.com/images/header_bg/header_bg_1508753122_9zUfjgQKJw7A.jpg"><br>
    <div class="container-fluid">
        <div class="navbar-header">
            <a  href="http://127.0.0.1:5000/manhua"><img class="logo" id="tubiao" src="../static/images/dongman.jpg"></a>
        </div>


   <ul class="nav navbar-nav navbar-left" id="myBody">
       <li><a href="{{ url_for('shouye') }}">首页</a></li>
       <li><a href="http://127.0.0.1:5000/manhua">漫画</a></li>
       <li><a href="{{ url_for('wenda') }}">问答</a></li>
       {%  if name %}
           <li><a href="{{ url_for('usercenter',user_id=session.get('userid'),tag=1)}}">{{ session.get('user') }}</a></li>
           <li><a href="{{ url_for('logout') }}">注销</a></li>
       {% else %}
           <li><a href="{{ url_for('login') }}">登陆</a></li>
           <li><a href="{{ url_for('register') }}">注册</a></li>
       {% endif %}
       <li><img id="on_off" onclick="mySwitch()" src="../static/images/on.jpg" width="50px"></li>
       <form action="{{ url_for('search') }}" method="get"  class="navbar-form navbar-right" style="float:right">
           <input name="q" type="text" placeholder="请输入搜索内容">
           <input type="submit" value="搜索">
{#           <input name="q" type="text" class="form-control"  placeholder="请输入关键字" >#}
{#           <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-search" aria-hidden="true" ></span>查找</button>#}
       </form>
</ul>



</div>
</nav>
{% block main %}
{% endblock %}

</body>
</html>

漫画页面:

 

html

 

{% extends'shouye.html' %}
{% block title %}
   manhua
{% endblock %}
{% block head %}
    <link rel="stylesheet" type="text/css" href="../static/css/manhua.css" type="text/css">
     <script src="../static/js/manhua.js"></script>
    <manhua target="_blank"/>
{% endblock %}
{% block main %}
<body id="myBody">


<div>
    <div class="katong">
        <a href="https://baike.baidu.com/item/%E5%A4%A9%E7%A9%BA%E4%B9%8B%E5%9F%8E/6298?fr=aladdin" >
            <img src="https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike150%2C5%2C5%2C150%2C50/sign=bd7d3d834734970a537e187df4a3baad/50da81cb39dbb6fd47c8108a0f24ab18962b378e.jpg" width="300" height="200"></a>
        <div class="desc"><a href="https://baike.baidu.com/item/%E5%A4%A9%E7%A9%BA%E4%B9%8B%E5%9F%8E/6298?fr=aladdin">天空之城</a></div>
    </div>
    <div class="katong">
        <a href="https://baike.baidu.com/item/%E4%BD%A0%E7%9A%84%E5%90%8D%E5%AD%97%E3%80%82/19127928?fromtitle=%E4%BD%A0%E7%9A%84%E5%90%8D%E5%AD%97&fromid=19126915&fr=aladdin">
            <img src="https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike220%2C5%2C5%2C220%2C73/sign=0000a3f3583d26973ade000f3492d99e/242dd42a2834349ba3d7f0bcc0ea15ce36d3be32.jpg" width="300" height="200"></a>
        <div class="desc"><a href="https://baike.baidu.com/item/%E4%BD%A0%E7%9A%84%E5%90%8D%E5%AD%97%E3%80%82/19127928?fromtitle=%E4%BD%A0%E7%9A%84%E5%90%8D%E5%AD%97&fromid=19126915&fr=aladdin">你的名字</a></div>
    </div>
    <div class="katong">
        <a href="https://baike.baidu.com/item/%E5%93%86%E5%95%A6A%E6%A2%A6%EF%BC%9A%E4%BC%B4%E6%88%91%E5%90%8C%E8%A1%8C/13845055?fr=aladdin">
            <img src="https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike220%2C5%2C5%2C220%2C73/sign=e1f375ca56da81cb5aeb8b9f330fbb73/aec379310a55b319a7591f4b44a98226cffc176f.jpg" width="300" height="200"></a>
        <div class="desc"><a href="https://baike.baidu.com/item/%E5%93%86%E5%95%A6A%E6%A2%A6%EF%BC%9A%E4%BC%B4%E6%88%91%E5%90%8C%E8%A1%8C/13845055?fr=aladdin">哆啦A梦</a></div>
    </div>
    <div class="katong">
        <a href="https://baike.baidu.com/item/%E7%81%AB%E5%BD%B1%E5%BF%8D%E8%80%85/8702?fr=aladdin">
            <img src="http://www.285868.com/uploadfile/2016/1026/20161026032202862.jpg" width="300" height="200"></a>
        <div class="desc"><a href="https://baike.baidu.com/item/%E7%81%AB%E5%BD%B1%E5%BF%8D%E8%80%85/8702?fr=aladdin">火影忍者</a></div>
    </div>
    <div class="katong">
        <a href="https://baike.baidu.com/item/%E7%81%AB%E5%BD%B1%E5%BF%8D%E8%80%85/8702?fr=aladdin">
            <img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=e7239edc02087bf469e15fbb93ba3c49/77c6a7efce1b9d16074c3bf6f3deb48f8d54649a.jpg" width="300" height="200"></a>
        <div class="desc"><a href="https://baike.baidu.com/item/%E7%81%AB%E5%BD%B1%E5%BF%8D%E8%80%85/8702?fr=aladdin">吸血鬼骑士</a></div>
    </div>
        <div class="katong">
        <a href="https://baike.baidu.com/item/%E7%96%AF%E7%8B%82%E5%8A%A8%E7%89%A9%E5%9F%8E/18869840?fr=aladdin">
            <img src="https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D500/sign=6c3e4c6ad51b0ef468e8985eedc551a1/b64543a98226cffcd6ebbbf6be014a90f703eab5.jpg" width="300" height="200"></a>
        <div class="desc"><a href="https://baike.baidu.com/item/%E7%96%AF%E7%8B%82%E5%8A%A8%E7%89%A9%E5%9F%8E/18869840?fr=aladdin">疯狂动物城</a></div>
    </div>
   </div>
        <div class="katong">
        <a href="https://baike.baidu.com/item/%E5%AF%BB%E6%A2%A6%E7%8E%AF%E6%B8%B8%E8%AE%B0/20483318?fr=aladdin">
            <img src="https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike116%2C5%2C5%2C116%2C38/sign=c48d88aa65061d95694b3f6a1a9d61b4/4e4a20a4462309f7fdde5c80790e0cf3d6cad6eb.jpg"width="300" height="200"></a>
        <div class="desc"><a href="https://baike.baidu.com/item/%E5%AF%BB%E6%A2%A6%E7%8E%AF%E6%B8%B8%E8%AE%B0/20483318?fr=aladdin">寻梦环游记</a></div>
    </div>
     <div class="katong">
        <a href="https://baike.baidu.com/item/%E8%88%AA%E6%B5%B7%E7%8E%8B/75861?fr=aladdin&fromid=8904&fromtitle=%E6%B5%B7%E8%B4%BC%E7%8E%8B">
            <img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D500/sign=d75e8d65df39b60049ce0fb7d9513526/9a504fc2d5628535274d5ca79aef76c6a6ef6383.jpg" width="300" height="200"></a>
        <div class="desc"><a href="https://baike.baidu.com/item/%E8%88%AA%E6%B5%B7%E7%8E%8B/75861?fr=aladdin&fromid=8904&fromtitle=%E6%B5%B7%E8%B4%BC%E7%8E%8B">海贼王</a></div>
    </div>
</div>
<div class="clearfloat">
    <img src="http://p0.so.qhimgs1.com/t01b0bcf7da772c3e8c.jpg" width="500" height="500">

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

 

实现开灯关灯功能:

 

 

js

 function mySwitch()
{
    var myele=document.getElementById("on_off")
    if (myele.src.match("on"))
    {
        myele.src="../static/images/off.jpg"
        document.getElementById("myBody").style.background="black"
        document.getElementById("demo").style.color="white"
    }
    else
    {
        myele.src="../static/images/on.jpg"
        document.getElementById("myBody").style.background="white"
        document.getElementById("demo").style.color="black"
    }
}

 登陆:

html

{% extends'shouye.html' %}
{% block title %}
    Login
{% endblock %}
{% block head %}
    <link rel="stylesheet" type= "text/css" href="../static/css/denglu.css">
    <script src="../static/js/denglu.js"></script>
{% endblock %}
{% block main %}
<body>
    <div class="b1" >
    <form action="{{ url_for("login") }}" method="post">
        <div class="s1" ><h3>用户登录/LOGIN </h3></div>
        <div class="b2" >
        户名:<input id="name" type="text"placeholder="请输入用户名"name="name"><br>
        密码:<input id="password" type="password"placeholder="请输入密码"name="password"><br>
        </div>
        <div id="error_box"><br></div>
    <div class="s2" >
         <button onclick="return myLogin()">登录</button>
         <button type="button" onclick=window.alert("是否取消登录")>取消</button>
          <label for="remember_me" style="padding: 0;">Remember me?</label>
          <input type="checkbox" id="remember_me" style="position: relative; top: 3px; margin: 0; " name="remember_me"/>
          <div class="design">
              <p>Design by ss</p>
         </div>

    </div>
    </form>
    </div>
</body>
        {% endblock %}

js

function myLogin() {
        var oUname = document.getElementById("name");
        var oError = document.getElementById("error_box");
        var opassword = document.getElementById("password");
         oError.innerHTML="<br>";
            //oUname
         if(oUname.value.length<6||oUname.value.length>12){
                oError.innerHTML="用户名请输入6-12个字符";
                return false;
            }else if ((oUname.value.charCodeAt(0)>=48) &&(oUname.value.charCodeAt(0)<=57)){
                 oError.innerHTML="用户名首字符不能为数字";
                 return false;
         }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="用户名只能是字母和数字";
                   return false;
               }

         }

         //opassword
         if(opassword.value.length<6||opassword.value.length>12){
                oError.innerText="密码请输入6-12个字符内";
                return false;
            }
         return true;
             }

py

@app.route('/login',methods=['GET','POST'])
def login():
    if request.method =='GET':
        return render_template('denglu.html')
    else:
        name = request.form.get('name')
        passw = request.form.get('password')
        user = User.query.filter(User.username == name).first()
    if user:
       if user.check_password(passw):
            session['user'] = name
            session['userid'] = user.id
            session.permanent = True
            return redirect(url_for('manhua'))
       else:
           return "密码错误!"
    else:
        return "用户名不存在!"

导入包:

py

from flask import Flask, render_template, url_for, redirect, request,session
from flask_sqlalchemy import SQLAlchemy
from functools import wraps
import config
from datetime import datetime
from sqlalchemy import or_ ,and_
from werkzeug.security import generate_password_hash, check_password_hash
app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)



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(50))


    @property
    def password(self):
        return self._password

    @password.setter
    def password(self, row_password):
        self._password = generate_password_hash(row_password)

    def check_password(self, row_password):
        result = check_password_hash(self._password, row_password)
        return result

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


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'))
    create_time = db.Column(db.DateTime, default=datetime.now)
    detail = db.Column(db.Text, nullable=False)
    question = db.relationship('Question', backref=db.backref('comments'))
    author = db.relationship('User', backref=db.backref('comments'))

注册:

html

{% extends'shouye.html' %}
{% block title %}
    register
{% endblock %}
    {% block head %}
    <link rel="stylesheet"type="text/css"href="../static/css/zhuce.css">
    <script src="../static/js/zhuce.js"></script>
{% endblock %}
{% block main %}
<body>
    <div class="b1" >
        <form action="{{ url_for("register") }}" method="post">
        <div class="s1" ><h3>注册/ENROLL </h3></div>
        <div class="b2" >

            请输入账号: <input id="name" type="text" placeholder="write down your name" name="name"><br>
            请输入密码: <input id="password" type="password" placeholder="write down your PIN" name="password"><br>
            再输入密码: <input id="password2" type="password" placeholder="write down your PIN" name="password2"><br>
        </div>

        <div id="error_box"><br></div>


    <div class="s2" >
         <button onclick="return myLogin()">注册</button>
         <button type="button" onclick=window.alert("是否取消注册")>取消</button>
          <label for="remember_me" style="padding: 0;">Remember me?</label>
          <input type="checkbox" id="remember_me" style="position: relative; top: 3px; margin: 0; " name="remember_me"/>
          <div class="design">
              <p>Design by ss</p>
         </div>
</div>
        </form>
    </div>
 </body>
{% endblock %}

 

js

function myLogin() {
           var oUname = document.getElementById("name")
           var oError = document.getElementById("error_box")
           var opassword = document.getElementById("password")
           var opassword2 = document.getElementById("password2")
           oError.innerHTML = "<br>"
           //oUname
           if (oUname.value.length < 6 || oUname.value.length > 12) {
               oError.innerHTML = "用户名请输入6-12个字符";
               return false;
           } else if ((oUname.value.charCodeAt(0) >= 48) && (oUname.value.charCodeAt(0) <= 57)) {
               oError.innerHTML = "用户名首字符不能为数字";
               return false;
           } 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 = "用户名只能包含字母和数字";
                   return false;
               }

           }

           //opassword
           if (opassword.value.length < 6 || opassword.value.length > 20) {
               oError.innerHTML = "密码请输入6-12个字符内";
               return false;
           }
           if (opassword2.value != opassword.value) {
               oError.innerHTML = "登陆请重新输入你的密码";
               return false;
           }
           window.alert("注册成功!")
            return true;
       }

 

py

@app.route("/register",methods=['GET','POST'])
def register():
    if request.method == 'GET':
        return render_template("zhuce.html")
    else:
        name = request.form.get('name')
        passw = request.form.get('password')
        user = User.query.filter(User.username == name).first()
    if user:
        return "用户名已存在!"

    else:
        user = User(username=name, password=passw)
        db.session.add(user)
        db.session.commit()
        return render_template("denglu.html")

 登陆后显示登陆名,注册变为注销:

 

html

 {%  if name %}
           <li><a href="{{ url_for('usercenter',user_id=session.get('userid'),tag=1)}}">{{ session.get('user') }}</a></li>
           <li><a href="{{ url_for('logout') }}">注销</a></li>
       {% else %}
           <li><a href="{{ url_for('login') }}">登陆</a></li>
           <li><a href="{{ url_for('register') }}">注册</a></li>
       {% endif %}
       <li><img id="on_off" onclick="mySwitch()" src="../static/images/on.jpg" width="50px"></li>
       <form action="{{ url_for('search') }}" method="get"  class="navbar-form navbar-right" style="float:right">
           <input name="q" type="text" placeholder="请输入搜索内容">
           <input type="submit" value="搜索">

py

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

 问答

 

html

{% extends'shouye.html' %}
{% block title %}
    wenda
{% endblock %}
{% block head %}
    <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/wenda.css">
   {% endblock %}
{% block main %}
<body>
   <div class="form-group">
    <h1 style="color:blueviolet", align="center"> 漫画问卷调查</h1>
       <form action="{{ url_for("wenda") }}" method="post">
        <div class="q">
            <label for="question">电影</label><br>
            <textarea id="question"  cols="100" rows="1" name="title"></textarea>
        </div>
        <div class="form-group">
            <label for="questionDetail">反馈</label>
            <textarea class="form-control" id="questionDetail" cols="50" rows="5" name="detail"></textarea>
        </div>
       <br>
        <div class="input-area">
            <button onclick="fnQuestion">发布</button>
        </div>
       </form>
   </div>
{% endblock %}
</body>

py

@app.route('/wenda',methods=['GET','POST'])
@loginFirst
def wenda():
    if request.method=='GET':
        return render_template('wenda.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=Question(title=title,detail=detail,author_id=author_id)
        db.session.add(question)  # 数据库,添加操作
        db.session.commit()
    return redirect(url_for('manhua'))

 首页显示发布问答

 

html

{% extends 'shouye.html' %}
{% block title %}首页{% endblock %}
{% block head %}
    <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/sywenda.css">
{% endblock %}
{% block main %}
   <div class="label">
    <ul class="list-group">
        {% for foo in questions %}
            <li class="list-group-item">
                <div class="s1">
                <a href="{{ url_for('sywdxq',question_id=foo.id )}}">电影名称:{{ foo.title }}</a><br>
                <a href="#">反馈详情:{{ foo.detail }}</a><br>
                </div>
                <a class="s" href="{{ url_for('usercenter',user_id=foo.author.id,tag = 1) }}">{{ foo.author.username }}</a><br>
                <span class="badge" style="margin-left: 60%">{{ foo.creat_time }}发布时间</span>
                <p style="margin-left: 25%"></p>
            </li>
        {% endfor %}
        </ul>

   </div>
{% endblock %}

 首页问答详情及评论:

{% extends 'shouye.html' %}
{% block title %}首页{% endblock %}
{% block head %}
    <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/sywdxq.css">
{% endblock %}
{% block main %}
    <div class="col-md-2 column "></div>
    <div class="col-md-8 column ">
        <div class="page-headr">
            <h1>welcome !!!</h1><br>

            <h3>Title:{{ ques.title }}<br>
                <a class="ss" href="{{ url_for('usercenter',user_id=ques.author.id,tag = 1) }}">{{ ques.author.username }}</a><br>
{#                <small class="ss" href="{{ url_for('usercenter',user_id=ques.author.id,tag = 1) }}" >author:{{ ques.author.username }}#}
                    <br><span class="badge">发布时间:{{ ques.creat_time }}</span></small>
            </h3>
            <hr>
            <p>detail:{{ ques.detail }}</p>
            <hr>
             <form action="{{url_for('comment')}}" method="post" style="">
                <div class="form-group">
                    <textarea name="new_comment" class="form-control" rows="5" id="new-comment" placeholder="write your comments" style="width: 800px"></textarea><br>
                    <input name="question_id" type="hidden" value="{{ ques.id }}">
                </div>
                 <br>
                <button type="submit" class="btn btn-default" style="width:100px "> 发送</button>
            </form>

            <ul class="list-group" style="margin: 0px"></ul>
        </div>
    </div>

{#    <div class="col-md-2 column ">#}
    <h4>评论:({{ ques.comments|length }})</h4>
        <ul class="list">
            {% for foo in ques.comments %}
                <li class="post_item">
                    <a href="{{ url_for('usercenter',user_id=foo.author.id,tag=1) }}" class="light">{{foo.author.username }}</a><br>
{#                    <img width="48" height="48" class="pf" src="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=4066191998,32277144&fm=27&gp=0.jpg" alt="">#}
                    <p class="post_item">{{ foo.detail }}</p>
                    <span class="foot">发布于  {{ foo.create_time }}</span>
                </li>
                <hr>
            {% endfor %}
        </ul>
{% endblock %}

py

@app.route('/sywdxq/<question_id>')
def sywdxq(question_id):
    quest = Question.query.filter(Question.id == question_id).first()
    return render_template("sywdxq.html",ques=quest)

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


@app.route('/comment/',methods=['POST'])
@loginFirst
def comment():
    comment=request.form.get('new_comment')
    ques_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=ques_id,detail=comment)
    db.session.add(comm)  # 数据库,添加操作
    db.session.commit()
    return redirect(url_for('sywdxq',question_id=ques_id))

用户详情:

问答、评论、个人信息html

{% extends 'userbase.html' %}
{% block title %}个人中心{% endblock %}
{% block user %}
    <div class="page-header">
        <h3><span class="glyphicon glyphicon-user"  aria-hidden="true"></span>{{ username }}<br>
            <small>全部问答<span class="badge"></span></small>
        </h3>
        <ul class="list-group" style="margin: 10px">
            {% for ques in question %}
                <li class="list-group-item">
                    <span class="glyphicon glyphicon-heart-empty" aria-hidden="true"></span>
                    <a href="#">{{ ques.author.username }}</a>
                    <span class="badge">{{ ques.create_time }}</span>
                    <p>{{ ques.detail }}</p>
                </li>
            {% endfor %}
        </ul>
    </div>

{% endblock %}
{% extends 'userbase.html' %}

{% block user %}
    <div class="page-header">
    <br>
        <h3><small>全部评论<span class="badge"></span></small></h3>
        <ul class="list-group" style="margin: 10px">
            {% for ques in comments %}
                <li class="list-group-item">
                    <span class="glyphicon glyphicon-heart-empty" aria-hidden="true"></span>
                    <a href="#">{{ ques.author.username }}</a>
                    <span class="badge">{{ ques.create_time }}</span>
                    <p>{{ ques.detail }}</p>
                </li>
            {% endfor %}
        </ul>
    </div>

{% endblock %}
{% extends 'userbase.html' %}

{% block user %}
    <div class="page-header">
    <br>
        <h3><small>个人信息<span class="badge"></span></small></h3>
        <ul class="list-group" style=" ">
            <li class="list-group-item">用户:{{ username }}</li>
            <li class="list-group-item">评论:{{ comments|length }}</li>
            <li class="list-group-item">文章数:{{ question|length }}</li>
            <p>     </p>
        </ul>
    </div>

{% endblock %}
{% extends 'shouye.html' %}
{% block title %}个人中心{% endblock %}
{% block head %}

<style>
        .nav_ul li {
            list-style:none;
            float:left;
            margin:10px;
            border-bottom:outset;

        }
    </style>

{% endblock %}


{% block main %}
  <ul class="nav_ul">
      <li role="presentation"><a href="{{ url_for('usercenter', user_id = user.id ,tag="1") }}">全部问答</a></li>
      <li role="presentation"><a href="{{ url_for('usercenter',user_id = user.id,tag="2") }}">全部评论</a></li>
      <li role="presentation"><a href="{{ url_for('usercenter',user_id = user.id,tag="3") }}">个人信息</a></li>

 </ul>

{% block user %}{% endblock %}


{% endblock %}

个人中心

html

{% extends 'shouye.html' %}
{% block title %}个人中心{% endblock %}
{% block head %}
    <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/usercenter.css">
{% endblock %}

{% block main %}
    <div class="page-header">
        <h3><span class="glyphicon glyphicon-user"  aria-hidden="true"></span>{{ username }}<br>
            <small>全部问答<span class="s1"></span></small>
        </h3>
        <ul class="list-group" style="margin: 10px">
            {% for foo in question %}
                <li class="list-group-item">
                    <span class="glyphicon glyphicon-heart-empty" aria-hidden="true"></span>
                    <a href="#">{{ foo.author.username }}</a>
                    <span class="s2">{{ foo.create_time }}</span>
                    <p>{{ foo.detail }}</p>
                </li>
            {% endfor %}
        </ul>
    </div>

    <div class="page-header">
        <h3><span class="glyphicon glyphicon-user" aria-hidden="true"></span>{{ user }}<br>
            <small>全部评论<span class="s1"></span></small>
        </h3>
        <ul class="list-group" style="margin: 10px">
            {% for foo in comments %}
                <li class="list-group-item">
                    <span class="glyphicon glyphicon-heart-empty" aria-hidden="true"></span>
                    <a href="#">{{ foo.author.username }}</a>
                    <span class="s2">{{ foo.create_time }}</span>
                    <p>{{ foo.detail }}</p>
                </li>
            {% endfor %}
        </ul>
    </div>

    <div class="page-header">
        <h3><span class="glyphicon glyphicon-user" aria-hidden="true"></span>{{ user }}<br>
            <small>个人信息<span class="s1"></span></small>
        </h3>
        <ul class="list-group" style="margin: 10px">
            <li class="list-group-item">用户:{{ username }}</li>
            <li class="list-group-item">编号:</li>
            <li class="list-group-item">昵称:</li>
        </ul>
    </div>
{% endblock %}

数据库密码加密:

 

py

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(50))


    @property
    def password(self):
        return self._password

    @password.setter
    def password(self, row_password):
        self._password = generate_password_hash(row_password)

    def check_password(self, row_password):
        result = check_password_hash(self._password, row_password)
        return result

 谢谢老师一学期以来的指导,虽然我还有很多不足,在今后我会继续努力做的更好!

posted on 2018-01-04 16:54  104鲍珊珊  阅读(1603)  评论(0编辑  收藏  举报

导航