期末作品检查
1.个人学期总结
这个学期,学习了管理信息系统这一门课,使我受益匪浅,学习了许多知识,也让我对这一门课有了重新的认识。
这门课是一门注重于平时积累和实践的课程,是一门对逻辑管理要求非常高的一门课程。刚开始接触这门课的时候,感到非常的新奇,让我更有动力去学习,但慢慢下来,随着学习的深入,逐渐发现,可门课的知识也渐渐的难了起来,虽是如此,知识难也有它的可用之处,可以实现许多功能,课程上学到的东西可以和管理知识联系起来,这使我更有深入学习这门课程的想法。老师一步一步的教导我们,从入门到深入,到最后可以完成一个简单的作品,这必须要靠理论知识和操作知识联系起来,才能理解和掌握这一门课程。
首先从基础知识入门,用python绘画了各种图形和进行文本的输入输出、字符串操作、运算以及使用datetime处理时间和日期与其相关的知识等等,还学习了列表、字典、元组、集合的遍历,这也为之后的学习奠定了基础。我们随后学习了web基础,用html元素制作web页面,完成了导航、头部、CSS基础;并且利用JavaScript完成登录页面与注册页面的前端;之后还学习了夜间模式的开闭和父模板的制作,并且加载静态文件、完成父模板的继承和扩展;连接数据库,通过用户模型,对数据库进行增删改查;完成注册和登录功能,用session记住用户名;最后完成主页显示列表、发布问答功能以及问答详情功能、发布评论;最后完成个人中心,统计发表数量和评论数,并且设置密码保护和搜索功能。
一个学期下来,把学到的知识都运用在本次的作业上,但是我还会继续深入学习,完成、呈现一个更加完善的作品。
2.总结Python+Flask+MysqL的web建设技术过程,标准如下:
1.即是对自己所学知识的梳理
2.也可作为初学入门者的简单教程
3.也可作为自己以后复习的向导
4.也是一种向外展示能力的途径
完成作品文件所有的css、js、image、html以及py文件
一、父模板(后面每个html继承父模板base.html)。连接base.css、base.js(灯光的开闭)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}首页{% endblock %}</title> <script src="{{ url_for('static',filename='js/base.js') }}" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/base.css') }}"> </head> <body id="myBody"> {% block head %}{% endblock %} <div class="a"> <div style="position: absolute;top: 2%"> <a href="{{ url_for('index') }}">首页</a> <a href="{{ url_for('question') }}">发布问答</a> </div> <form action="{{ url_for('search') }}" method="get" > <div style="position: absolute;left: 12%;top: 2%;"> <input type="text" class="form-control" name="q" placeholder="请输入关键字"> <button type="submit" class="btn btn-default">查找</button> </div> </form> <div class="navi" style="position: absolute;right:5%;top: 2%" > <a class="navi" href="">收藏</a> <img class="navi" id="on_off" onclick="mySwitch()" src="http://www.runoob.com/images/pic_bulbon.gif " width="20px"> {% if username %} <a href="{{ url_for('usercenter',user_id=session.get('userid'),tag=1) }}">{{ session.get('user') }}</a> <a href="{{ url_for('logout') }}">注销</a> {% else %} <a href="{{ url_for('login') }}">登录</a> <a href="{{ url_for('register') }}">注册</a> {% endif %} </div> </div> {% block main %}{% endblock %} <div class="footer_box"> 版权所有@ </div> </body> </html>
二、注册功能(继承父模板base.html),连接数据库。连接register.css、js24.js(设置注册条件)
{% extends'base.html' %} {% block title %} 注册 {% endblock %} {% block head %} <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/js24.css') }}"> <script src="{{ url_for('static',filename='js/js24.js') }}"></script> {% endblock %} {% block main %} <div class="bg-img"> <div class="box"> <h1>注册</h1> <div class="input_box"> <form action="{{ url_for('register') }}" method="post"> 用户名:<input id="username" type="text" placeholder="请输入新用户名" name="username"> </div> <br> <div class="input_box"> 昵称: <input id="nickname" type="text" placeholder="请输入昵称" name="nickname"> </div> <br> <div class="input_box"> 密 码:  <input id="userpass" type="password" placeholder="请输入新密码" name="password"> </div> <br> <div class="input_box"> 密 码:  <input id="reuserpass" type="password" placeholder="请再次输入新密码"> </div> <br> <div class="link_box"> <a href="{{ url_for('login') }}"> 已有帐号,立即登陆 <b> ></b> </a> </div> <div id="error_box"><br></div> <div class="input_box"> <button id="button" onclick="return fnRegister()">注册</button> </div> </form> </div> </div> {% endblock %}
三、登录功能(继承base.html)。连接login.css、js23.js(设置登录条件)
{% extends'base.html' %} {% block title %} 登录 {% endblock %} {% block head %} <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/js23.css') }}"> <script src="{{ url_for('static',filename='js/js23.js') }}"></script> {% endblock %} {% block main %} <div class="bg-img"> <div class="box"> <form action="{{ url_for('login') }}" method="post"> <h1>登录</h1> <div class="input_box"> <h3>username</h3> <input id="username" type="text" placeholder="请输入用户名" name="username"> </div> <div class="input_box"> <h3>userpass</h3> <input id="userpass" type="password" placeholder="请输入密码" name="password"> </div> <br> <div class="link_box"> <a href="{{ url_for('register') }}"> 没有账号,立即注册 <b> ></b> </a> </div> <div id="error_box"><br></div> <div class="input_box"> <button onclick="return fnLogin()">LOGIN</button> <button onclick=window.alert(fnLogin())>RESET</button> </div> </form> </div> </div> {% endblock %}
四、建立主页(继承base.html),并且有用户导航和已发布的问答。连接index.css
{% extends'base.html' %} {% block title %} 首页 {% endblock %} {% block head %} <script src="{{ url_for('static',filename='js/index.js') }}" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/index.css') }}"> {% endblock %} {% block main %} <div class="index"> <div> <div class="img"> <a href="https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=%E5%B0%8F%E7%8C%AA%E4%BD%A9%E5%A5%87&rsv_pq=f77d08900001a419&rsv_t=45ebl8vOLWaojJB%2BJqWl4G2jgewDoaq6Eal6j0Zx2EIT96apylRhpP3Koqg&rqlang=cn&rsv_enter=1&rsv_sug3=6&rsv_sug1=6&rsv_sug7=100"> <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1508477292746&di=b4d222e641b5c06b07c55cd205bba706&imgtype=0&src=http%3A%2F%2Fimg.mp.itc.cn%2Fupload%2F20161220%2Fca4c1e06ab854a40bb2590408a7b2f19_th.jpg"></a> <div class="desc"><a href="https://baike.baidu.com/item/小猪佩奇/12343674?fr=aladdin">小猪佩奇</a></div> </div> <div class="img"> <a href="https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E6%89%98%E9%A9%AC%E6%96%AF%E5%92%8C%E4%BB%96%E7%9A%84%E6%9C%8B%E5%8F%8B%E4%BB%AC&oq=%25E5%25B0%258F%25E7%258C%25AA%25E4%25BD%25A9%25E5%25A5%2587&rsv_pq=eb12f7da00019eba&rsv_t=de8cbtTwyWVcQv6xzo8AEbWJhamBkxPdSWJh9Imdf5qYr8rt2NZHXCfYWNg&rqlang=cn&rsv_enter=1&inputT=3189&rsv_sug3=14&rsv_sug1=14&rsv_sug7=100&rsv_sug2=1&prefixsug=tuomasi&rsp=2&rsv_sug4=3188"> <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1508477829747&di=fd07b5cc8dd393392af74d2b90404779&imgtype=0&src=http%3A%2F%2Ffdfs.xmcdn.com%2Fgroup23%2FM06%2F8A%2F7E%2FwKgJL1h52lGCOLCQAAEaqmTeglU035.jpg"></a> <div class="desc"><a href="https://baike.baidu.com/item/托马斯和他的朋友们/752251?fr=aladdin">托马斯和他的朋友们</a></div> </div> <div class="img"> <a href="https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E7%8C%AB%E5%92%8C%E8%80%81%E9%BC%A0&oq=%25E6%2589%2598%25E9%25A9%25AC%25E6%2596%25AF%25E5%2592%258C%25E4%25BB%2596%25E7%259A%2584%25E6%259C%258B%25E5%258F%258B%25E4%25BB%25AC&rsv_pq=d23a15630001b4ed&rsv_t=7430JNuHLv7607LmZ%2B%2BWE2eYL%2Fp7GhOQe3j0f5S9RCnmHRWM5plbXIAinRg&rqlang=cn&rsv_enter=1&inputT=2790&rsv_sug3=20&rsv_sug1=19&rsv_sug7=100&rsv_sug2=1&prefixsug=maohe%2520&rsp=0&rsv_sug4=2790"> <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1508477964743&di=46e94537aabf5867005957b87cd85799&imgtype=0&src=http%3A%2F%2Fcdn.aixifan.com%2Fdotnet%2Fartemis%2Fu%2Fcms%2Fwww%2F201603%2F2615504731cpun6r.jpg"></a> <div class="desc"><a href="https://baike.baidu.com/item/猫和老鼠/313885?fr=aladdin">猫和老鼠</a></div> </div> <div class="img"> <a href="https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E5%A4%A9%E7%BA%BF%E5%AE%9D%E5%AE%9D&oq=%25E7%258C%25AB%25E5%2592%258C%25E8%2580%2581%25E9%25BC%25A0&rsv_pq=8de48b3f0001c6b3&rsv_t=94c1qlZLktBv27KJJZA0Sxe9rIX64JhNE%2F7O030MAq3wDdaGuEiv99uR8Jg&rqlang=cn&rsv_enter=1&inputT=2790&rsv_sug3=27&rsv_sug1=26&rsv_sug7=100&bs=%E7%8C%AB%E5%92%8C%E8%80%81%E9%BC%A0"> <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1508478000480&di=5fe3f1bdcea73b098ec174ea6a7b5f8b&imgtype=0&src=http%3A%2F%2Fd2xosoyzehxi5w.cloudfront.net%2Fwp-content%2Fuploads%2F2014%2F12%2Fteletubbies-sun-baby-jess-smith-3.jpg"></a> <div class="desc"><a href="https://baike.baidu.com/item/天线宝宝/3232396?fr=aladdin">天线宝宝</a></div> </div> </div> <br><hr> {# <p>{{ username }}context</p>#} <div id="list-container"> <ul class="list-group"> {% for foo in questions %} <li> <span class="glyphicon glyphicon-leaf" aria-hidden="true"></span> 用户:<a href="{{ url_for('usercenter',user_id=foo.author_id,tag=2) }}" target="_blank" style="text-decoration: none">{{ foo.author.username }}</a> <br> <a href="{{ url_for('questiondetail',question_id=foo.id) }}" class="modal-title">{{ foo.title }}</a> <span class="badge">{{ foo.create_time }}</span> <p style="text-indent: 18px">{{ foo.detail }}</p> <img class="like" id="like_ornot" onclick="myLike()" src="../static/image/heart_stroke_28.png"> </li> {% endfor %} </ul> </div> </div> {% endblock %}
五、发布问答(继承base.html)。发布前必须先登录,发布问题后,问题在主页中显示。连接question.css、question.js(设置发表问题的条件)
{% extends'base.html' %} {% block title %} 问答 {% endblock %} {% block head %} <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/question.css') }}"> {% endblock %} {% block main %} <div class="form-group"> <div class="box"> <form action="{{ url_for('question') }}" method="post"> <h1>发布问答</h1> <div class="input_box"> <label for="questionQuestion">问题</label> <textarea class="form-control1" rows="1" id="questionQuestion" name="title"></textarea></div> <div class="input_box"> <label for="questionDetail">详情</label> <textarea class="form-control1" rows="5" id="questionDetail" name="detail"></textarea></div> <div id="error_box"><br></div> <div class="input_box"> <button onclick="fnQuestion()">提交问题</button> </div> </form> </div> </div> {% endblock %}
六、问答详情页(继承base.html)。点击发布的问题进入,可以发表评论。连接questiondetail.css
{% extends'base.html' %} {% block title %} 问答详情 {% endblock %} {% block head %} <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/questiondetail.css') }}"> {% endblock %} {% block main %} <div class="post"> <div class="artical"> <h1 style="text-align: center">{{ ques.title }}</h1> <br><small>用户:<a href="{{url_for('usercenter',user_id=ques.author_id,tag=2) }}">{{ques.author.username }} </a><span class="badge">{{ ques.create_time }}</span></small> <hr> <p class="lead">{{ ques.detail }}</p> </div> <form action="{{ url_for('comment') }}" method="post" style="align-content: inherit"> <div class="sign-container"> <textarea class="form-controld" rows="8" id="QuestionDetail" name="new_comment"></textarea> <input name="question_id" type="hidden" value="{{ ques.id }}"/> <br> <input type="submit" value="评论" style="float: right"> <h4>评论({{ ques.comments|length }})</h4> <hr> </div> </form> <ul class="list-group" style="background-size: contain"> {% for foo in ques.comments %} <li> <span class="glyphicon glyphicon-leaf" aria-hidden="true"></span> 用户:<a href="{{ url_for('usercenter',user_id=foo.author_id,tag=1) }}" >{{ foo.author.username }}</a> <span class="badge">{{ foo.creat_time }}</span> <br> <p style="text-indent: 18px">{{ foo.detail }}</p> </li> {% endfor %} </ul> </div> {% endblock %}
七、用户中心导航父模板(继承父模板)。连接userbase.css
{% extends'base.html' %} {% block title %} 个人中心 {% endblock %} {% block head %} <style> .nav_ul li{ list-style: none; float: left; margin: 10px; } </style> <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/userbase.css') }}"> {% endblock %} {% block main %} <div class="list-container"> <h1 style="text-align: center">{{ user.username }}</h1> <hr> <ul class="nav_ul"> <li role="presentation"><a href="{{ url_for('usercenter',user_id=user.id,tag='1') }}">Questions</a> </li> <li role="presentation"><a href="{{ url_for('usercenter',user_id=user.id,tag='2') }}">Comments</a> </li> <li role="presentation"><a href="{{ url_for('usercenter',user_id=user.id,tag='3') }}">Info</a> </li> </ul> <br> {% block user %}{% endblock %}</div> {% endblock %}
八、用户中心(继承usercenter)——问答、评论、个人信息(均继承用户中心父模板)。
{% extends'userbase.html' %} {% block user %} <div class="page-header"> <br> <h3>全部问答</h3> <br> <ul class="list-group" style="background-size: contain"> {% for foo in user.question %} <li class="list-group-item"> <span class="glyphicon glyphicon-leaf" aria-hidden="true"></span> <a href="#" target="_blank">{{ foo.author.username }}</a> <span class="badge">发布时间:{{ foo.create_time }}</span> <p style="text-indent: 18px">{{ foo.detail }}</p> </li> {% endfor %} </ul> </div> {% endblock %}
{% extends'userbase.html' %} {% block user %} <div class="page-header"> <br> <h3>全部评论</h3> <br> <ul class="list-group" style="background-size: contain"> {% for foo in user.comments %} <li class="list-group-item"> <span class="glyphicon-leaf" aria-hidden="true"></span> <a href="#" target="_blank">{{ foo.author.username }}</a> <span class="badge">发布时间:{{ foo.creat_time }}</span> <p style="text-indent: 18px">{{ foo.detail }}</p> </li> {% endfor %} </ul> </div> {% endblock %}
{% extends'userbase.html' %} {% block user %} <div class="page-header"> <br> <h3>个人信息</h3> <br> <ul class="list-group"> <li class="list-group-item">用户:{{ user.username }}</li> <li class="list-group-item">编号:{{ user.id }}</li> <li class="list-group-item">昵称:{{ user.nickname }}</li> <li class="list-group-item">文章篇数:{{ user.question|length }}</li> <li class="list-group-item">评论数:{{ user.comments|length }}</li> </ul> </div> {% endblock %}
九、搜索功能
@app.route('/search/') def search(): qu=request.args.get('q') ques=Question.query.filter( or_( Question.title.contains(qu), Question.detail.contains(qu) ) ).order_by('-create_time') return render_template('index.html',questions=ques)
十、数据库情况。
from datetime import datetime from werkzeug.security import generate_password_hash,check_password_hash from exts import db 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) create_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'))