一、系统概要说明
本次继续沿用Python+Flask+MysqL的web建设技术,开发一个网站,这次选择了一个主题,为新闻,新闻为主要的一个大板块,细则分国际、法制以及军事。在这次课程设计中,对于用flask的建设有了更深的了解,比如在利用flask上传文件的时候,只需要利用 request 的files
属性即可,这也是一个字典,包含了被上传的文件。如果想获取上传的文件名,可以使用filename
属性,不过需要注意这个属性可以被客户端更改,所以并不可靠。更好的办法是利用werkzeug
提供的secure_filename
方法来获取安全的文件名。可以说Flask框架的核心就是Werkzeug和Jinja2。Python最出名的框架要数Django,此外还有Flask、Tornado等框架。虽然Flask不是最出名的框架,但是Flask应该算是最灵活的框架之一,这也是Flask受到广大开发者喜爱的原因。
二、网站结构设计
设计结构图:
三、模块详细设计
这次大部分继续沿用上学期的设计结构,进行了小部分的修改,比如,在所有文章当中,分为显示所有的文章,以及各类具体的文章,对于用户的喜爱可以直接选择自己需要的文章。在点进去文章详情里面,可以看到文章的详细内容,评论列表,并且可以对文章进行评论或者点赞。在发布帖子中,增加了可以具体对哪一类型进行发布。个人中心里面显示了个人中心的信息,我发布过的文章标题,以及我的收藏,个人中心可以进行修改密码以及个人信息。
四、数据库设计
五、系统实现的关键算法与数据结构
# 所有文章 @bp.route('/index/',methods=['GET','POST']) def index(): board_id = request.args.get('bd',type=int,default=None) page = request.args.get(get_page_parameter(),type=int, default=1) boards = BoardModel.query.all() start =(page-1)*config.PER_PAGE end = start + config.PER_PAGE posts=None total = 0 query_obj=PostModel.query.order_by(PostModel.create_time.desc()) if board_id: query_obj = query_obj.filter_by(board_id=board_id) posts = query_obj.slice(start,end) total = query_obj.count() else: posts = query_obj.slice(start,end) total = query_obj.count() pagination = Pagination(bs_version=3,page=page,total=total,outer_window=0,inner_window=2) context={ 'boards': boards, 'posts':posts, 'pagination':pagination, 'current_board':board_id } return render_template('front/front_index.html',**context)
#搜索功能 @bp.route('/search/') def search(): qu = request.args.get('q') ques = PostModel.query.filter( and_( PostModel.title.contains(qu) ) ).order_by('-create_time') board_id = request.args.get('bd', type=int, default=None) page = request.args.get(get_page_parameter(), type=int, default=1) boards = BoardModel.query.all() start = (page - 1) * config.PER_PAGE end = start + config.PER_PAGE total = 0 query_obj = PostModel.query.order_by(PostModel.create_time.desc()) if board_id: query_obj = query_obj.filter_by(board_id=board_id) posts = query_obj.slice(start, end) total = query_obj.count() else: posts = query_obj.slice(start, end) total = query_obj.count() pagination = Pagination(bs_version=3, page=page, total=total, outer_window=0, inner_window=2) context = { 'boards': boards, 'posts': ques, 'pagination': pagination, 'current_board': board_id } return render_template('front/front_index.html',**context)
#个人中心 @bp.route('/usercenter/<user_id>/<tag>') @login_required def usercenter(user_id,tag): user = FrontUser.query.filter(FrontUser.id==user_id).first() posts = PostModel.query.filter(PostModel.author_id == user_id).all() context = { 'user':user, 'posts':posts } if tag == '1': return render_template('front/front_usercenter.html',**context) if tag == '2': return render_template('front/front_user_apost.html',**context)
#点赞功能 @bp.route('/dianzan/',methods=['GET','POST']) @login_required def dianzan(): user_id=g.front_user.id post_id=request.form.get('post_id') dianzan=DianzanModel(user_id=user_id,post_id=post_id) db.session.add(dianzan) db.session.commit() return redirect(url_for('front.post_detail',post_id=post_id))
#用户上传头像 @bp.route('/avatar/<user_id>',methods=['POST']) @login_required def updata_acatar(user_id): user = FrontUser.query.filter(FrontUser.id == user_id).first() f = request.files['img'] basepath = os.path.dirname(__file__) # 当前文件所在路径 upload_path = os.path.join('E:/News/static/img', f.filename) # 注意:没有的文件夹一定要先创建,不然会提示没有该路径 f.save(upload_path) user.avatar = 'img/' + f.filename db.session.commit() return redirect(url_for('front.usercenter',user_id=user.id,tag=1))
#用户修改个人信息 @bp.route('/user_updata/<user_id>',methods=['GET','POST']) @login_required def user_updata(user_id): if request.method == 'GET': user= FrontUser.query.filter(FrontUser.id==user_id).first() return render_template('front/front_user_updata.html',user=user) else: form = UserupdataForm(request.form) if form.validate(): username = form.username.data realname = form.realname.data signature = request.form.get('signature') user = g.front_user user.username =username user.realname = realname user.signature = signature db.session.commit() return restful.success() else: return restful.params_error(form.get_error())
#用户修改密码 @bp.route('/resetpwd/',methods=['GET','POST']) @login_required def resetpwd(): if request.method == 'GET': return render_template('front/front_resetpwd.html') else: form = ResetpwdForm(request.form) if form.validate(): oldpwd = form.oldpwd.data newpwd = form.newpwd.data user = g.front_user if user.check_password(oldpwd): user.password = newpwd db.session.commit() # {"code":200,message=""} # return jsonify({"code":200,"message":""}) return restful.success() else: return restful.params_error("旧密码错误!") else: return restful.params_error(form.get_error())
六、成品展示
七、个人总结
在这次课程设计中,虽然有了上学期的基础,但在增加功能部分仍有很大的困难,通过学习专业视频,更加熟悉了解了flask的结构等等,最终的成品虽然仍有不足,希望自己再接再厉,能做出更好的产品!