期末作品检查
Posted 103许雅婷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了期末作品检查相关的知识,希望对你有一定的参考价值。
一、个人学期总结
在本学期中我学习了管理信息系统这门课程,并实现了基于Python的Flask框架web建设项目,Python,是一种面向对象的解释型计算机程序语言。学期初始,我们学习了Python的基础语法,输入、输出、交互、数字计算的方法、字符串基本操作、凯撒密码、自制九九乘法表、中英文词频统计等,还学习了import turtle库,并利用这个库绘制出多种多样的图形,提升了我们对编程语言的思维能力,为构建Flask框架制作网页的学习打下基础。期中之后,我们更加深入学习这门课程,了解代码原理,开始网页的制作,然后开始使用标签制作html页面内容,以及美化网页,添加网页其他功能等。
这一个学期项目建设的学习使我受益匪浅,在老师的悉心教导下,不仅让我全面的、系统的学会了页设计与制作的基础知识,还让我学会了自己动手去制作属于自己的网页,由于本人的技术还不是很成熟,还存在很多的不足地方,在今后的课余时间,我会继续认真学习网页制作的更多知识以实现自身技能的提高。
二、总结Python+Flask+mysql的web建设技术过程
首先,利用PyCharm创建一个Flask之后,我们就开始创建python文件,首先一个以网页展示作为前端的管理信息系统需要做到前端与后端Mysql数据库之间的交互,则肯定需要进行连接数据库的操作,此时我们创建了名为config的数据库连接配置的py文件实现与Mysql数据库之间的连接。
1、第三方库导入
from flask import Flask,render_template,request,redirect,url_for,session from flask_sqlalchemy import SQLAlchemy from datetime import datetime from functools import wraps from sqlalchemy import or_ from werkzeug.security import generate_password_hash,check_password_hash
import config app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app)
2、config的重要代码为:
SQLALCHEMY_DATABASE_URI = \'mysql+pymysql://root:@127.0.0.1:3306/mis_db?charset=utf8\' SQLALCHEMY_TRACK_MODIFICATIONS = False
3、在实现与数据库之间的连接之后,我们创建py文件开始创建数据表
(1)user表里存放用户的id,用户名跟密码。
(2)question表里存放用户的id、title(标题)、detail(详情)、create_time(创建时间)、author_id(文章作者的用户id)。
(3)comment表里存放id、author_id(评论用户的id)、question_id(文章的id)、create_time(创建时间)和detail(详情)。
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) create_time = db.Column(db.DateTime, default=datetime.now) question = db.relationship(\'Question\', backref=db.backref(\'comments\',order_by=create_time.desc)) author = db.relationship(\'User\', backref=db.backref(\'comments\'))
user表
question表
comment表
具体建设过程如下:
一、导航,头部,CSS基础
1、制作自己的导航条。
2、HTML头部元素:
(1)<base> 定义了页面链接标签的默认链接地址
(2)<style> 定义了HTML文档的样式文件
(3) <link> 定义了一个文档和外部资源之间的关系。
3、CSS可以通过三种方式实现:
(1)图片文字用div等元素布局形成HTML文件;
(2)新建相应CSS文件,CSS文件中定义样式并用<link>链接到html中;
(3)在HTML中的<head>中使用<style>进行布局美化。
index.html
{% extends\'base2.html\' %} {% block title %}首页{% endblock %} {% block main %} <link rel="stylesheet" type="text/css" href="{{ url_for(\'static\',filename=\'css/1.css\') }}"> <script src="{{ url_for(\'static\',filename=\'js/base.js\') }}"></script> <p>{{ user }}</p> <div class="div"> <ul class="list-group"> {% for foo in questions %} <li class="list-group-item"> <br> <a href="{{ url_for(\'usercenter\',user_id=foo.author_id,tag="1") }}">作者★:{{ foo.author.username }}</a> <br> <a href="{{ url_for(\'detail\' ,question_id=foo.id)}}">问题标题:{{ foo.title }}</a> <br> <p style="color:black">详情:{{ foo.detail }}</p> <br> <a class="ziti" href="{{ url_for(\'usercenter\' ,user_id=foo.author_id,tag="1")}}">评论:{{ foo.comments|length }}</a> <br> <span class="badge" style="margin-left: 60%">{{ foo.creat_time }}</span> <hr size="1"> <br> <br> </li> {% endfor %} </ul> </div> <div class="recommend" > <footer class="footer"> <div class="img"> <img src="../static/image/b.jpg" width="250" height="100" > <img src="../static/image/4.jpg" width="250" height="100"> <img src="../static/image/2.jpg" width="250" height="100" > <img src="../static/image/1.jpg" width="250" height="100" > <img src="../static/image/5.jpg" width="250" height="100" > <p>简书 读书 散文 交友 人生</p> </div> </footer> </div> <div class="bottom" style="background-color: cadetblue;clear:both; text-align:center; font-size:12px; padding-bottom:1px"> <a href="">联系我们</a> <a href="">加入我们</a> <a href="">帮助中心</a> <a href="">合作伙伴</a> </div> <div id="footer" style="background-color:cadetblue; clear:both; text-align:center; font-size:12px; padding-bottom:1px">版权@yaya</div> {% endblock %}
二、完成注册功能(用html元素制作web页面)
1、用div,form制作注册页面;
2、通过JS语句增加错误提示框,并实现写好HTML+CSS文件,设置每个输入元素的id。
3、定义javascript 函数,设置登录注册页面验证用户名与登录密码6-20位,注册还需包括验证用户名首字母不能是数字,只能包含字母和数字,输入的两次密码必须一致,并在各自html页面的button标签onclick调用这个函数。
4、js文件: onclick函数return True时才提交表单,return False时不提交表单,判断用户名是否存在:存在报错,不存在就存到数据库中,redirect重定向到登录页。
5、html文件:
(1)<form>中设置 action和method="post"
(2)<input> 中设置 name
6、主py文件中:
(1)from flask import request, redirect, url_for
(2)@app.route(\'/regist/\', methods=[\'GET\', \'POST’])
@app.route(\'/register/\', methods=[\'GET\',\'POST\']) def register(): if request.method==\'GET\': return render_template(\'register.html\') else: usern=request.form.get(\'username\') passw= request.form.get(\'password\') user=User.query.filter(User.username==usern).first() if user: return \'username existed\' else: user=User(username=usern,password=passw) db.session.add(user) db.session.commit() return redirect(url_for(\'login2\'))
register.html
{% extends\'base2.html\' %} {% block title %} register {% endblock %} {% block head %} <link rel="stylesheet" type="text/css" href="../static/css/1.css"> <script src="../static/js/zhuce.js"></script> {% endblock %} {% block main %} <body> <div class="box"> <div id="container" style="width: 400px" align="center"> <div id="header" style="background-color:lightskyblue"><h1 align="center" style="margin-bottom: 0;">注册</h1></div> <div id="content" style="background-color:lightpink;height:205px;width:400px;float:left;"> <p></p> <form action="{{ url_for(\'register\') }}" method="POST"> <div class="input_box"> Username:<input id="uname" type="text" name="username" placeholder="请输入用户名"> </div> <br> <div class="input_box"> Password:<input id="upass" type="password" name="password" placeholder="请输入登录密码"> </div> <br> <div class="input_box"> 密码确认:<input id="again" type="password" placeholder="请再次输入密码"> </div><br> <div id="error_box"><br></div> <div class="input_box"> <button onclick="return myLogin()">点击注册</button> <button type="button" onclick=window.alert("是否取消注册!")>取消</button> </div> </form> </div> </div> </div> </body> {% endblock %}
zhuce.js
function myLogin() { var oUname = document.getElementById("uname"); var oUpass = document.getElementById("upass"); var oAgain = document.getElementById("again"); var oError = document.getElementById("error_box"); oError.innerHTML = "<br>"; // 验证用户名 if (oUname.value.length < 6 || oUname.value.length > 20) { oError.innerHTML = "用户名6-20位"; 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; } } // 验证密码 if (oUpass.value.length < 6 || oUpass.value.length > 20) { oError.innerHTML = "密码6-20位"; return false; } // 验证再次输入的密码 if (upass.value != zhuce.value) { oError.innerHTML = "密码不一致"; return false; } return true; // 验证弹框 window.alert("注册成功!") }
三、完成登录功能
1、定义JavaScript 函数。
(1)验证用户名6-20位
(2)验证密码6-20位。
2、与注册一样完成js文件,在主py文件定义函数,读取表单数据查询数据库;
3、用户名密码对就用session记住用户名并跳转到首页;用户名密码不对则提示相应错误。
py文件
@app.route(\'/login2/\', methods=[\'GET\',\'POST\']) def login2(): if request.method==\'GET\': return render_template(\'login2.html\') else: usern=request.form.get(\'username\') passw= request.form.get(\'password\') user=User.query.filter(User.username==usern).first() if user: if user.check_password(passw): session[\'user\'] = usern session[\'id\'] = user.id session.permanent=True return redirect(url_for(\'index\')) else: return "密码错误,请重新输入。" else: return "用户名不存在!"
login.html
{% extends\'base2.html\' %} {% block title %} Login {% endblock %} {% block head %} <link href="{{ url_for("static",filename="css/1.css") }}" rel="stylesheet" type="text/css"> <script src="{{ url_for("static",filename="js/denglu.js") }}"></script> {% endblock %} {% block main %} <body> <div class="box"> <form action="{{ url_for(\'login2\') }}" method="post"> <div id="container" style="width: 400px" align="center"> <div id="header" style="background-color:lightskyblue"><h1 align="center" style="margin-bottom: 0;">会员登录</h1></div> <div id="content" style="background-color:lightpink;height:205px;width:400px;float:left;"> <p></p> <div class="input_box"> Username:<input id="username" type="text" name="username" placeholder="请输入用户名"><br> </div> <br> <div class="input_box"> Password:<input id="password" type="password" name="password" placeholder="请输入登录密码"><br> </div> <div id="error_box"><br></div> <div class="input_box"> <input type="radio">普通会员 <input type="radio">金牌会员 <input type="radio">钻石会员 </div><br> <div class="input_box"> <button onclick="return fnLogin()">登录</button> <button type="button" onclick=window.alert("是否取消登录!")>取消</button> </div> </div> </div> </form> </div> </div> </body> {% endblock %} </html>
denglu.js
function fnLogin() { var oUname = document.getElementById("username") var oError = document.getElementById("error_box") var opassward = document.getElementById("password") var isError=true; oError.innerHTML="<br>" //uname if (oUname.value.length < 6 || oUname.value.length > 20) { oError.innerHTML = "用户名6-20位"; 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; } } //upass if(oUpass.value.length<6 || oUpass.value.length>12){ oError.innerHTML="密码6-12位"; isError = false; return isError; } window.alert("登录成功") }
四、加载静态文件,父模板的继承和扩展
1、用url_for加载静态文件<script src="{{ url_for(\'static\',filename=\'js/login.js\') }}"></script>;
2、flask 从static文件夹开始寻找可用于加载css, js, image文件。
3、实现继承和扩展,把一些公共的代码放在父模板中,避免每个模板写同样的内容。
4、子模板继承父模板 ,父模板提前定义好子模板可以实现一些自己需求的位置及名称。子模板中写代码实现自己的需求。
5、夜间模式的开启与关闭
(1)放置点击的按钮或图片。
(2)定义开关切换函数。
(3)onclick函数调用。
<img id="myOnOff" style="float: right" onclick="mySwitch()" src="{{ url_for("static",filename="image/off.jpg") }}" width="35px">
js文件
function mySwitch() {
var oBody = document.getElementById("myBody");
var oOnoff = document.getElementById("myOnOff");
if (oOnoff.src.match("on")) {
oOnoff.src = "../static/image/off.jpg";
oBody.style.background = "black";
oBody.style.color = "white";
} else {
oOnoff.src = "../static/image/on.jpg";
oBody.style.background = "white";
oBody.style.color = "black";
}
}
五、实现登录之后更新导航
1、用上下文处理器app_context_processor定义函数
(1)获取session中保存的值
(2)返回字典