小假期

管理信息系统 课程设计

一、系统概要说明

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

posted on 2018-06-16 15:35  028肖家琪  阅读(189)  评论(0编辑  收藏  举报

导航