期末作品检查

Posted 李海力

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了期末作品检查相关的知识,希望对你有一定的参考价值。

1.超文本标记语言,标准通用标记语言下的一个应用,在网站网址广泛应用。本学期我我学习了管理信息系统这门课程,对WEB网站前端后端有了一概念性的认识,并在老师的指导和同学的帮助下,利用Python+Flask+mysql技术尝试搭建了自己的小网页,并在这个过程中学习了html语言,同时也更加清楚的认识到自己知识的浅薄,这门课程激发了自己对于网页设计的兴趣,使得对网页的理解不仅仅停留在使用的层次,而是解开了神秘面纱,认清了其实是人人能学并能学好的一门技术,在今后的学习中,会更加认真对待,实现更多的功能。这次制作的网页暂时只有登录注册,发布问答评论,个人中心的功能,期待今后实现更多。

2.界面与程序及数据库连接

import os
SECRET_KEY = os.urandom(24)

SQLALCHEMY_DATABASE_URI = \'mysql+pymysql://root:123456@localhost:3306/mis_db?charset=utf8\'
SQLALCHEMY_TRACK_MODIFICATIONS = False

 

2.1.加载静态文件,父模板的继承和扩展

<!DOCTYPE HTML>
<html>
    <meta charset="UTF-8">
    <title>{% block title %}Base{% endblock %}</title>
    <link href="{{ url_for(\'static\',filename=\'CSS/base.css\') }}" rel="stylesheet" type="text/css">
    <script src="{{ url_for(\'static\',filename=\'JScript/base.js\') }}"></script>
    {% block head %}{% endblock %}
</head>
<body id="mybody" background="../static/image/beijing.jpg">
<nav class="meue" >
    <div style="float: left;">
        <img src=" {{ url_for(\'static\',filename=\'image/smail.PNG\') }}" weight="50" height="50">
    </div>
    <div style="line-height:480%;">
        <img id="on_off" src="{{ url_for(\'static\',filename=\'image/on1.PNG\') }}" onclick="MySwitch()" width="30px" >
    </div>
    <div >
        {% if username %}
            &nbsp;&nbsp;&nbsp;&nbsp;<a href="{{ url_for(\'usercenter1\',user_id =session.get(\'id\'),tag=1) }}" style="font-weight: 600">{{ username }}</a>
            &nbsp;&nbsp;&nbsp;&nbsp;<a href="{{ url_for(\'logout\') }}">登出</a>
        {% else %}
            &nbsp;&nbsp;&nbsp;&nbsp;<a href="{{ url_for(\'login\') }}">登录</a>
            &nbsp;&nbsp;&nbsp;&nbsp;<a href="{{ url_for(\'regist\') }}">注册</a>
        {% endif %}
    </div>
    <div style="line-height:340%;">|</div>
      <div class="search">
        <form action="{{ url_for(\'search\') }}" method="get">
         <input name="q" type="text" name="search" style="width:300px;">
         <button type="submit" ><img src="{{ url_for(\'static\',filename=\'image/search.png\') }}" width="14" height="14"></button>
        </form>
      </div>
    <div>
        <a href="{{ url_for(\'home\') }}">首页</a>
        <a href="{{ url_for(\'question\') }}">问答</a>
        <a href="http://photo.sina.com.cn/">图片</a>
        <a href="http://www.iqiyi.com/">视频</a>
        <a href="https://www.zhihu.com/explore">发现</a>

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

<footer class="copyright">
    <a>版权开发:lihaili</a>
</footer>
</body>
</html>

2.2首页,登录界面,注册界面及其html,代码

 

{% extends \'base.html\' %}

{% block title %}Home{% endblock %}

{% block head %}#首页
    <link href="{{ url_for(\'static\',filename=\'CSS/home.css\') }}" rel="stylesheet" type="text/css">
{% endblock %}

{% block main %}
<div  align="center">
        <ul>
            <img class="view" src="{{ url_for(\'static\',filename=\'image/note.png\') }}">
            {% for foo in questions %}
                <li>
                    <div class="content">
                        <div class="author">
                            <img src="{{ url_for(\'static\',filename=\'image/boy.png\') }}">
                            <a href="{{ url_for(\'usercenter1\',user_id=foo.author_id,tag=1) }}">{{ foo.author.username }}</a>
                            <span>{{ foo.creat_time }}</span>

                            <p class="comp">[{{ foo.comments|length }}]</p>
                            <img class="com" src="{{ url_for(\'static\',filename=\'image/comment.png\') }}">
                        </div>
                        <br>
                        <a class="title" href="{{ url_for(\'detail\',question_id=foo.id) }}">{{ foo.title }}</a><br>
                        <p>{{ foo.detail }}</p>
                    </div>
                </li>
            {% endfor %}
        </ul>


</div>
{% endblock %}

{% extends \'base.html\' %}

{% block title %}Login{% endblock %}

{% block head %}
    <link href="{{ url_for(\'static\',filename=\'CSS/login.css\') }}" rel="stylesheet" type="text/css">
    <script src="{{ url_for(\'static\',filename=\'JScript/login.js\') }}"></script>
{% endblock %}

{% block main %}
<div class="login">
    <form action="{{ url_for(\'login\') }}" method="post">
        <div class="login-top">
            <h1>登录</h1>
            <input id="uname" name="username" type="text" value="Username" onfocus="this.value = \'\';" onblur="if (this.value==\'\'){ this.value = \'Username\';}">
            <input id="upass" name="password" type="password" value="Password" onfocus="this.value = \'\';" onblur="if (this.value==\'\'){ this.value = \'Password\';}">
            <div class="forgot">
                <input type="checkbox"><p>记住账号</p>
            </div>
        </div>
        <div class="login-bottom">
            <div id="errorbox"></div><button onclick="return MyLogin()" value="登录">Enter</button>
        </div>
    </form>
</div>
{% endblock %}

 

 

{% extends \'base.html\' %}

{% block title %}Register{% endblock %}

{% block head %}
    <link href="{{ url_for(\'static\',filename=\'CSS/regist.css\') }}" rel="stylesheet" type="text/css">
    <script src="{{ url_for(\'static\',filename=\'JScript/regist.js\') }}"></script>
{% endblock %}

{% block main %}
<div class="login">
    <form action="{{ url_for(\'regist\') }}"  method="post">
        <div class="login-top">
            <h1>注册信息</h1>
            <input id="uname" name="username" type="text" value="Username" onfocus="this.value = \'\';" onblur="if (this.value==\'\'){ this.value = \'Username\';}">
            <input id="fpass" name="password" type="password" value="Password" onfocus="this.value = \'\';" onblur="if (this.value==\'\'){ this.value = \'Password\';}">
            <input id="spass" type="password" value="Password"  onfocus="this.value = \'\';" onblur="if (this.value==\'\'){ this.value = \'Password\';}">
        </div>
        <div class="login-bottom">
            <div id="errorbox"></div><button onclick="return MyRegister()">注册</button>
        </div>
    </form>
</div>
{% endblock %}

2.3个人中心

{% extends \'base.html\' %}

{% block title %}Center{% endblock %}

{% block head %}
    <link href="{{ url_for(\'static\',filename=\'CSS/center.css\') }}" rel="stylesheet" type="text/css">
{% endblock %}

{% block main %}
<div class="center" >
    <h2><a href="{{ url_for(\'usercenter1\',user_id=user.id,tag=1) }}"> {{ user.username }}</a></h2>
    <ul class="base">
        <li role="presentation"><a href="{{ url_for(\'usercenter1\',user_id=user.id,tag=\'1\') }}">所有提问</a></li>
        <li role="presentation"><a href="{{ url_for(\'usercenter1\',user_id=user.id,tag=\'2\') }}">所有评论</a></li>
        <li role="presentation"><a href="{{ url_for(\'usercenter1\',user_id=user.id,tag=\'3\') }}">个人信息</a></li>
    </ul>

   {% block usercenter %}{% endblock %}

</div>
{% endblock %}

2.4发布问答,评论

{% extends \'base.html\' %}

{% block title %}Question{% endblock %}

{% block head %}
    <link href="{{ url_for(\'static\',filename=\'CSS/question.css\') }}" rel="stylesheet" type="text/css">
{% endblock %}

{% block main %}
<div class="question">
<h3>发布问答</h3>
<form action="{{ url_for(\'question\') }}"  method="post">
    <div >
        <br>
        <label for="ask" align="center">标题</label>
        <br>
        <input  name="title" type="text" style="height: 22px;" id="questionTitle" placeholder="这里输入短标题"></input>
    </div>
    <br>
    <div>
        <label for="questionDetail" align="center">详情</label>
        <br>
        <textarea name="detail"  rows="8" id="questionDetail" placeholder="说点什么吧....."></textarea>
    </div>
    <input type="checkbox"><p>同意《用户发布问答准则》</p>
    <br>

    <button type="submit" class="btn-default">发布</button>
</form>
</div>
{% endblock %}

{% extends \'base.html\' %}

{% block title %}Detail{% endblock %}

{% block head %}
    <link href="{{ url_for(\'static\',filename=\'CSS/detail.css\') }}" rel="stylesheet" type="text/css">
{% endblock %}

{% block main %}
<div class="detail">
    <h2>{{ question.title }}</h2>
    <a href="{{ url_for(\'usercenter1\',user_id=question.author_id,tag=1) }}">{{ question.author.username }}</a>
    <span>{{ question.creat_time }}</span>
    <div class="p">
        <p>{{ question.detail }}</p>
    </div>
    <form action="{{ url_for(\'comment\') }}" method="post">
        <textarea name="detail" rows="5"></textarea><br>
        <button >发送</button>
        <input name="question_id" type="hidden" value="{{ question.id }}">
    </form>
    <br>

    <ul>
        <p style="font-weight: 600;font-size: 16.5px">评论[{{ question.comments|length }}]</p>
        <div>
            {% for foo in question.comments %}
            <li>
                <img src="{{ url_for(\'static\',filename=\'image/xiaolian.png\') }}">
                <a href="{{ url_for(\'usercenter1\',user_id=foo.author_id,tag=1) }}">{{ foo.author.username }}</a>
                <span>{{ foo.creat_time }}</span><br>
                <p>{{ foo.detail }}</p>
            </li>
            {% endfor %}
        </div>
    </ul>
</div>
{% endblock %}

3.主py代码

主PY文件写视图函数,带id参数。 首页标题的标签做带参数的链接,在详情页将数据的显示在恰当的位置。建立评论的对象关系映射,尝试实现发布评论。

from flask import Flask,render_template,request,redirect,url_for,session
from flask_sqlalchemy import SQLAlchemy
import config
from functools import wraps
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) #内部使用

    @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\'))

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

db.create_all()

@app.route(\'/\')
def home():
    context={
        \'questions\': Question.query.order_by(\'-creat_time\').all()
    }
    return render_template(\'home.html\',**context)

@app.route(\'/detail/<question_id>\')
def detail(question_id):
    question=Question.query.filter(Question.id==question_id).first()
    return render_template(\'detail.html\',question=question)

# 登录装饰器
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():
        detail=request.form.get(\'detail\')
        author_id = User.query.filter(User.username == session.get(\'user\')).first().id
        question_id = request.form.get(\'question_id\')
        comment = Comment(author_id=author_id,question_id=question_id,detail=detail)
        db.session.add(comment)  # 保存到数据库
        db.session.commit()  # 提交
        return redirect(url_for(\'detail\',question_id=question_id))

@app.route(\'/usercenter/<user_id>/<tag>\')
@loginFirst
def usercenter1(user_id,tag):
    user=User.query.filter(User.id==user_id).first()
    context={
        \'user\':user
    }
    if tag==\'1\':
        return render_template(\'userques.html\',**context)
    elif tag==\'2\':
        return render_template(\'usercom.html\', **context)
    else:
        return render_template(\'userinfo.html\', **context)

# @app.route(\'/usercenter/<user_id>\')
# @loginFirst
# def usercenter2(user_id):
#     user = User.query.filter(User.id == user_id).first()
#     context = {
#         \'user\': user
#     }
#     return render_template(\'center_two.html\', **context)

# 显示登录的用户名
@app.context_processor
def mycontext():
    usern=session.get(\'user\')
    if usern:
        return {\'username\':usern}
    else:
        return {}

@app.route(\'/login/\',methods=[\'GET\',\'POST\'])
def login():
    if request.method==\'GET\':
        return render_template(\'login.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[\'id\'] = user.id
                session.permanent = True
                return redirect(url_for(\'home\'))
            else:
                return \'Password error\'
        else:
            return \'Username inexistent\'

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

@app.route(\'/regist/\',methods=[\'GET\',\'POST\'])
def regist():
    if request.method == \'GET\':
        return render_template("regist.html")
    else :
        username = request.form.get(\'username\')
        password = request.form.get(\'password\')
        user = User.query.filter(User.username == username).first()
        if user:
            return \'Username existed\'
        else:
            user1 = User(username=username, password=password)
            db.session.add(user1)
            db.session.commit()
            return redirect(url_for(\'login\'))

@app.route(\'/question/\',methods=[\'GET\',\'POST\'])
@loginFirst
def question():
    if request.method == \'GET\':
        return render_template(\'question.html\')
    else:
        title = request.form.get(\'title\')
        detail = request.form.get(\'detail\')
        user=User.query.filter(User.username == session.get(\'user\')).first()
        author_id = user.id
        question = Question.query.filter(Question.title == title).first()
        if question:
            return \'Question existed\'
        else:
            question1 = Question(title=title, detail=detail, author_id=author_id)
            question1.author = user
            db.session.add(question1)  # 保存到数据库
            db.session.commit()  # 提交
            return redirect(url_for(\'home\'))

@app.route(\'/search/\')
@loginFirst
def search():
    que=request.args.get(\'q\')
    ques=Question.query.filter(
        or_(
            Question.title.contains(que),
            Question.detail.contains(que),
        )
    ).order_by(\'-creat_time\')
    return render_template(\'home.html\',questions=ques)

if __name__ == \'__main__\':
    app.run(debug=True)

实现登录后更新导航:用上下文处理器app_context_processor定义函数,获取session中保存的值,返回字典。在

以上是关于期末作品检查的主要内容,如果未能解决你的问题,请参考以下文章

期末作品检查

期末作品检查

期末作品检查

期末作品检查

期末作品检查

期末作品检查