zoukankan      html  css  js  c++  java
  • 管理信息系统 课程设计

    一、系统概要说明

          本次继续沿用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的结构等等,最终的成品虽然仍有不足,希望自己再接再厉,能做出更好的产品!

  • 相关阅读:
    天真的误会
    Unity3D笔记
    http纪要
    JQuery中ajax错误处理之页面跳转
    php代码片段
    3D游戏相关笔记
    Javascript笔记
    PHP对观察者模式的支持
    为什么要使用多线程
    死锁和活锁
  • 原文地址:https://www.cnblogs.com/xiaojiaqi/p/9190651.html
Copyright © 2011-2022 走看看