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

    操作说明:

    1. 系统概要说明
      1. 本课程设计很大的改进,学习了flask的新知识,更深入了解flask框架,Flask选择组件的额外工作给那些使用案例不适用标准ORM的开发者提供了更多的灵活性,同样也给使用不同工作流和模版化系统的开发者们带来了灵活性,虽然Flask历史相对更短,但它能够学习之前出现的框架并且把注意力放在了微小项目上。它大多数情况被使用在一些只有一两个功能的小型项目上。例如 httpbin,一个简单的(但很强大的)调试和测试HTTP库的项目。
      2. 最开始跟着视频学习的时候,感觉和上课老师讲的完全不一样,完全就是新的知识,完全是从头开始,我印象深刻的是虚拟环境的搭建,还有映射,数据库的连接和导入。这些步骤很大程度上一不小心就走错一步,整个程序就不成功了,我就在重新创建和不停删除虚拟环境中度过。virtualenv是一个工具,可以利用它创建与操作系统python环境相孤立的python运行环境,方便测试和开发依赖包的管理。
    2. 网站结构设计
      1. 网站结构和上学期大体上没有什么区别,大致改了很多细致的设计。网站结构主要大概有主页、登录注册页 、发布帖子、详情页和个人中心页。新添的模块都是在这些基础上,再次修改和完善,比如主页上的导航,搜索,热门推荐和分类,详情页里的点赞收藏按键,评论列表和推荐文章,个人中心页的更改信息和我的收藏等。  
    3. 系统实现的关键算法与数据结构
      1. 系统的实现大概与上学期差不多,我大概展示新添的几个模块的功能,主py文件
      2. 修改密码
         1 #修改密码
         2 @app.route('/setPassword/<id>', methods=['GET', 'POST'])
         3 @loginFirst
         4 def setPassword(id):
         5     if request.method == 'GET':
         6         return render_template('setPassword.html')
         7     else:
         8         user = User.query.filter(User.id == id).first()
         9         if user:
        10             if user.check_password(request.form.get('old')):
        11                 user.password = request.form.get('new1')
        12                 db.session.commit()
        13                 info = '修改成功'
        14             else:
        15                 info = '原密码错误'
        16         else:
        17             info = '未知错误'
        18         return redirect(url_for('index', info=info))
      3. 上传头像
         1 # 上传头像
         2 @app.route('/uploadLogo/<user_id>', methods=['GET', 'POST'])
         3 @loginFirst
         4 def uploadLogo(user_id):
         5     user = User.query.filter(User.id == user_id).first()
         6     f = request.files['logo']
         7     basepath = os.path.dirname(__file__)  # 当前文件所在路径
         8     upload_path = os.path.join(basepath, 'static/uploads', f.filename)  # 注意:没有的文件夹一定要先创建,不然会提示没有该路径
         9     f.save(upload_path)
        10     user.icon = 'uploads/' + f.filename
        11     db.session.commit()
        12     return redirect(url_for('setPassword', id=user_id));
      4. 个人中心以及我的收藏
         1 # 个人中心
         2 @app.route('/comment/<user_id>/<num>')
         3 @loginFirst
         4 def comment(user_id, num):
         5     user = User.query.filter(User.id == user_id).first()
         6     content = {
         7         'comment': user.comment,
         8         'questions': user.question,
         9         'user2': user,
        10     }
        11     if (num == '1'):
        12         return render_template('subComment1.html', **content, title='全部问题')
        13     elif (num == '2'):
        14         return render_template('subComment2.html', **content)
        15     elif (num == '3'):
        16         return render_template('subComment3.html', **content)
        17     elif (num == '4'):
        18         content = {
        19             'comment': user.comment,
        20             'questions': user.collection.all(),
        21             'user2': user,
        22         }
        23         return render_template('subComment1.html', **content, title='我的收藏')
        24     else:
        25         return render_template('subComment1.html', **content)
        1 @app.route('/c/<cf>')
        2 def c(cf):
        3     content = {
        4         'questions': Question.query.filter(Question.cf == cf).order_by('-creat_time').all(),
        5         'cf': Cf.query.all(),
        6         'hot': Question.query.order_by('-click').all()[0:5]
        7     }
        8     return render_template('index.html', **content)
      5. 详情页的点赞和收藏功能
         1 # 详情页
         2 @app.route('/detail/<question_id>', methods=['GET', 'POST'])
         3 @loginFirst
         4 def detail(question_id):
         5     quest = Question.query.filter(Question.id == question_id).first()
         6     u = User.query.filter(User.id == session.get('user_id')).first()
         7     if request.method == 'POST':
         8         if request.form.get('click') == '1':
         9             quest.click = quest.click + 1
        10         if request.form.get('collection') == '1':
        11             user = u
        12             user.collection.append(quest)
        13             db.session.add(user)
        14     col = u.collection.filter_by(id=question_id).first()
        15     if col is None:
        16         col = {}
        17     comment = Comment.query.filter(Comment.question_id == question_id).order_by('-creat_time').all()
        18     quest.look = quest.look + 1
        19     content = {
        20         'ques': quest,
        21         'comment': comment,
        22         'col': col,
        23         'questions': Question.query.filter(Question.cf == quest.cf).all(),
        24     }
        25     db.session.commit()
        26     return render_template('detail.html', **content)
      6. 高级查找
         1 # 高级查找
         2 @app.route('/search')
         3 def search():
         4     qu = request.args.get('q')
         5     c = '' if request.args.get('c') == '' else request.args.get('c')
         6     y = '' if request.args.get('y') == '' else request.args.get('y')
         7     query = Question.query.filter(
         8         or_(
         9             Question.title.contains(qu),
        10             Question.detail.contains(qu),
        11         ),
        12         Question.cf.like('%' + c + '%'),
        13         Question.creat_time.like('%' + y + '%'),
        14     ).order_by('-creat_time').all()
        15     context = {
        16         'questions': query,
        17         'cf': Cf.query.all(),
        18         'hot': Question.query.order_by('-click').all()[0:5]
        19     }
        20     return render_template('index.html', **context)
    4. 数据库设计
      1. 数据库的设计,新添了两个表,分别是收藏表和分类栏目表,数据库的设计在虚拟环境里面,需要在虚拟环境里python manage.py db init,更新需要的库和更新你创的数据库模型,并把它导入进去,然后在数据库就能见到了新创的表了。
      2. 收藏表
        1 # 收藏表
        2 Collection = db.Table(
        3     'collection',
        4     db.Column('id', db.Integer, primary_key=True, autoincrement=True),
        5     db.Column('book_id', db.Integer, db.ForeignKey('question.id')),  # 评论对应的文章的id
        6     db.Column('collection', db.Integer, db.ForeignKey('user.id')),  # 收藏用户的id
        7     db.Column('createdate', db.DATETIME)  # 发布时间
        8 )
         
      3. 分类表,需在后台手动添加数据
        1 # 分类
        2 class Cf(db.Model):
        3     __tablname__ = 'cf'
        4     id = db.Column(db.Integer, primary_key=True, autoincrement=True)  # 数据库唯识别id
        5     name = db.Column(db.String(30))  # 文章名称
        6     context = db.Column(db.TEXT)  # 分类内容

         

    5. 模块详细设计
      1. 模块设计大概与上学期差不多,我大概展示新添的几个模块的功能,主html文件,都是在有母版的继承下展开的
      2. 更改信息(上传头像和修改密码的功能)
        {% extends 'base.html' %}
        {% block title %}
            修改信息
        {% endblock %}
        
        {% block link %}
        
        {% endblock %}
        
        {% block box %}
            <div class="container" style="padding-top: 200px;">
                <div class="row clearfix">
                    <div class="col-md-2 column">
                    </div>
                    <div class="col-md-8 column">
                        <div style="margin: 80px 0px;margin-left: 70px;">
                            <form class="form-horizontal" role="form" method="post" enctype="multipart/form-data" action="{{ url_for('uploadLogo',user_id=user_id) }}">
                                <div class="form-group">
                                    <div class="col-sm-10">
                                        <h1>上传头像</h1>
                                        <input type="file" id="exampleInputFile" name="logo" required>
                                        <button type="submit" class="btn btn-default">上传头像</button>
                                        <img src="{{ url_for('static',filename=user.icon) }}" width="100px"/>
                                    </div>
                                </div>
                            </form>
                        </div>
                        <hr>
                        <form class="form-horizontal" role="form" method="post">
        
                            <div class="form-group" >
                                <h1 style="margin-left: 70px;">修改密码</h1>
                                <label for="inputEmail3" class="col-sm-2 control-label">原密码</label>
                                <div class="col-sm-10">
                                    <input type="password" name="old" class="form-control" id="p1" required/>
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="inputPassword3" class="col-sm-2 control-label">新密码</label>
                                <div class="col-sm-10">
                                    <input type="password" name="new1" class="form-control" id="p2" required/>
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="inputPassword3" class="col-sm-2 control-label">确定密码</label>
                                <div class="col-sm-10">
                                    <input type="password" class="form-control" id="p3" required/>
                                </div>
                            </div>
                            <div class="form-group">
                                <div class="col-sm-offset-2 col-sm-10">
                                    <button type="submit" class="btn btn-default" onclick="return f()">提交</button>
                                </div>
                            </div>
                        </form>
        
                    </div>
                    <div class="col-md-2 column">
                    </div>
                </div>
            </div>
        {% endblock %}
        
        {% block script %}
            <script>
                function f() {
                    if ($('#p2').val() == $('#p3').val())
                        return true;
                    alert('两次密码不一样');
                    return false;
                }
            </script>
        {% endblock %}
      3. 个人中心页(我的问答、评论、信息、收藏等)
        {% extends 'base.html' %}
        {% block title %}
            个人中心
        {% endblock %}
        
        {% block link %}
        
        {% endblock %}
        
        {% block box %}
            <div class="container">
                <div class="row clearfix">
                    <div class="col-md-2 column">
                    </div>
                    <div class="col-md-8 column">
                        <ul class="nav nav-tabs">
                            <li role="presentation"><a href="{{ url_for('comment',user_id=user2.id,num='1') }}">全部问题</a></li>
                            <li role="presentation"><a href="{{ url_for('comment',user_id=user2.id,num='2') }}">全部评论</a></li>
                            <li role="presentation"><a href="{{ url_for('comment',user_id=user2.id,num='3') }}">个人信息</a></li>
                            <li role="presentation"><a href="{{ url_for('comment',user_id=user2.id,num='4') }}">我的收藏</a></li>
                        </ul>
                        {% block subComment %}{% endblock %}
                    </div>
                    <div class="col-md-2 column">
                    </div>
                </div>
            </div>
        {% endblock %}
        
        {% block script %}
        
        {% endblock %}
        {% extends 'comment.html' %}
        {% block subComment %}
            <ul class="list-group" style="">
                <h1>{{ title }}</h1>
                {% for foo in questions %}
                    <li class="list-group-item" style=" 800px">
                        <a class="wrap-img" href="#" target="_blank">
                            <img src="{{ url_for('static',filename=foo.author.icon) }}" width="50px">
                        </a>
                        <span class="glyphicon glyphicon-left" aria-hidden="true"></span>
                        <a href="{{ url_for('comment',user_id=foo.author.id ,num='1')}}"
                           target="_blank">{{ foo.author.username }}</a>
                        <br>
                        <a href="{{ url_for('detail',question_id=foo.id) }}">{{ foo.title }}</a>
                        <span class="badge">{{ foo.creat_time }}</span>
                        <p style="">{{ foo.detail[0:50] }}...
                        </p>
                    </li>
                {% endfor %}
            </ul>
        {% endblock %}
        {% extends 'comment.html' %}
        {% block subComment %}
            <ul class="list-group" style="margin-top: 30px;">
                <h1>全部评论</h1>
                {% for com in comment %}
                    <li class="list-group-item" style=" 800px">
                        <a class="wrap-img" href="#" target="_blank">
                            <img src="{{ url_for('static',filename=com.author.icon) }}" width="50px">
                        </a>
                        <span class="glyphicon glyphicon-left" aria-hidden="true"></span>
                        <a href="{{ url_for('comment',user_id=com.author.id,num='1') }}"
                           target="_blank">{{ com.author.username }}</a>
                        <br>
                        <span class="badge">{{ com.creat_time }}</span>
                        <p style="">{{ com.detail }}</p>
                    </li>
                {% endfor %}
            </ul>
        {% endblock %}
        {% extends 'comment.html' %}
        {% block subComment %}
            <div class="list-group-item" style="margin-top: 30px; 800px;">
                <h1>头像:
                    <img src="{{ url_for('static',filename=user2.icon) }}" width="100px">
                </h1>
                <h1>名称:
                    <small>{{ user2.username }}</small>
                </h1>
        
                <h1>问题数:
                    <small>{{ questions|length }}</small>
                </h1>
                <h1>评论数:
                    <small>{{ comment|length }}</small>
                </h1>
            </div>
        {% endblock %}
      4. 详情页(浏览数,点赞、收藏功能,评论展示功能。热门文章推荐功能)
        {% extends 'base.html' %}
        {% block title %}
            详情页
        {% endblock %}
        
        {% block link %}
            <script src="{{ url_for('static',filename='ueditor/ueditor.config.js') }}"></script>
            <script src="{{ url_for('static',filename='ueditor/ueditor.all.min.js') }}"></script>
            {#    <script src="{{ url_for('static',filename="front/js/front_pdetail.js") }}"></script>#}
        {% endblock %}
        
        {% block box %}
            <div class="container">
                <div class="row clearfix">
                    <div class="col-md-2 column">
                    </div>
                    <div class="col-md-8 column">
        
                        <h1>{{ ques.title }}</h1>
                        <div style="padding: 10px;">
                            <span style="padding-left: 10px;">作者:{{ ques.author.username }}</span>
                            <span style="padding-left: 10px;">浏览数:{{ ques.look }}</span>
                            <span style="padding-left: 10px;">点赞数:{{ ques.click }}</span>
                            <form method="post" style="display: inline-block;padding-left: 10px;">
                                <input name="click" value="1" type="hidden">
                                <button class="glyphicon glyphicon-heart">点赞</button>
                            </form>
                            <form method="post" style="display: inline-block;padding-left: 10px;">
                                <input name="collection" value="1" type="hidden">
                                {% if col %}
                                    <button type="button" disabled>已收藏</button>
                                {% else %}
                                    <button class="glyphicon glyphicon-leaf">收藏</button>
                                {% endif %}
                            </form>
                        </div>
                        <div style="padding: 70px 20px;margin-bottom: 100px;border:1px solid #eee;">
        {#                    <p>#}
        {#                        {{ ques.detail }}#}
        {##}
        {#                    </p>#}
                            <article class="ques-detail" id="ques-detail" data-id="{{ ques.id }}">
                                {{ ques.detail |safe }}
                            </article>
                        </div>
                        <hr>
                        <div style="padding: 15px;">
                            <h1>推荐文章</h1><br>
                            {% for foo in questions %}
                                <li class="list-group-item" style=" 700px">
                                    <a class="wrap-img" href="#" target="_blank">
                                        <img src="{{ url_for('static',filename=foo.author.icon) }}" width="50px">
                                    </a>
                                    <span class="glyphicon glyphicon-user" aria-hidden="true"></span>
                                    <a href="{{ url_for('comment',user_id=foo.author.id ,num='1') }}"
                                       target="_blank">{{ foo.author.username }}</a>
                                    <br>
                                    <a href="{{ url_for('detail',question_id=foo.id) }}">{{ foo.title }}</a>
                                    <span class="badge">{{ foo.creat_time }}</span>
                                    <p style="">{{ foo.detail[0:50] }}...
                                    </p>
                                </li>
                            {% endfor %}
                        </div>
        
                        <hr>
        
                        <form class="form-horizontal" role="form" method="post" action="{{ url_for('answer') }}">
                            <div class="form-group">
                                <label for="inputEmail3" class="col-sm-2 control-label">评论内容</label>
                                <div class="col-sm-10">
        
                                    <input type="text" name="author_id" value="{{ user.id }}" hidden>
                                    <input type="text" name="question_id" value="{{ ques.id }}" hidden>
                                    <script id="editor" type="text/plain" name="detail"></script>
        {#                            <textarea class="form-control" name="detail" rows="10"></textarea>#}
                                </div>
                            </div>
                            <div class="form-group">
                                <div class="col-sm-offset-2 col-sm-10">
                                    <button type="submit" class="btn btn-default" id="comment-btn">发布</button>
                                </div>
                            </div>
                        </form>
                        <hr>
                        <h1>用户评论</h1><br>
                        <ul>
                            {% for com in comment %}
                                <li class="list-group-item">
                                    <img src="{{ url_for('static',filename=com.author.icon) }}" width="50px">
                                    {#                            <h4>{{ com.author.username }}</h4>#}
                                    <h4><a href="{{ url_for('comment',user_id=com.author.id ,num='1') }}"
                                           target="_blank">{{ com.author.username }}</a></h4>
                                    <span class="badge">{{ com.creat_time }}</span>
                                    <div>
                                        <p>{{ com.detail }}</p>
                                    </div>
                                </li>
                            {% endfor %}
                        </ul>
                    </div>
                    <div class="col-md-2 column">
                    </div>
                </div>
            </div>
        {% endblock %}
        
        {% block script %}
            <script>
                $(function () {
                    var ue = UE.getEditor("editor", {
                        'serverUrl': '../static/ueditor/upload/',
                        "toolbars": [
                            [
                                'undo',
                                'redo',
                                'bold',
                                'italic',
                                'source',
                                'blockquote',
                                'selectall',
                                'fontfamily',
                                'fontsize',
                                'simpleupload',
                                'emotion'
                            ]
        
                        ]
        
                    })
                    window.ue = ue;
        
                });
        </script>
        {% endblock %}
      5. 主页(导航里的高级搜索,按文字查找、分类查找、时间查找等)
        <nav class="navbar navbar-default" role="navigation">
            <div class="container-fluid">
                <div class="navbar-header">
                    <img src="{{ url_for('static',filename='img/8-1306061335461b.jpg') }}" alt="" width="50px">
                    <a class="navbar-brand" href="{{ url_for('index') }}">广商论坛</a>
                </div>
                <div>
                    <ul class="nav navbar-nav">
                        <li class="dropdown">{# active 可以显示为点亮 #}
                            <a href="{{ url_for('index') }}" class="dropdown-toggle" data-toggle="dropdown">
                                首页
                                <b class="caret"></b>
                            </a>
                            <ul class="dropdown-menu">
                                <li><a href="#">军事</a></li>
                                <li><a href="#">体育</a></li>
                                <li><a href="#">生活</a></li>
                                <li class="divider"></li>
        
                            </ul>
                        </li>
                        {% if user_id %}
                            <li class="drop_down">
                                <a href="javascript:void(0)" class="dropdown-toggle" data-toggle="dropdown">
                                    {{ user.username }}
                                    <b class="caret"></b>
                                </a>
                                <ul class="dropdown-menu">
                                    <li><a href="{{ url_for('setPassword',id=user_id) }}">更改信息</a></li>
                                    <li><a href="{{ url_for('comment',user_id=user_id,num='1') }}">个人中心</a></li>
                                    <li class="divider"></li>
                                    <li><a href="{{ url_for('logout') }}">退出</a></li>
                                </ul>
                            </li>
                        {% else %}
                            <li class=""><a href="{{ url_for('login') }}">登录</a></li>
                            <li><a href="{{ url_for('regist') }}">注册</a></li>
                        {% endif %}
                        <li class=""><a href="{{ url_for('question') }}">发布问答</a></li>
                        <li class="">
                            <form class="navbar-form navbar-left" role="search" action="{{ url_for('search') }}" method="get">
                                <div class="form-group">
                                    <input type="text" class="form-control" placeholder="搜索" required name="q">
                                </div>
                                <div class="form-group">
                                    <select class="form-control" name="c">
                                        <option value="" selected>--分类--</option>
        
                                        {% for c in cf %}
                                            <option value="{{ c.id }}">{{ c.name }}</option>
                                        {% endfor %}
                                    </select>
                                </div>
                                <div class="form-group">
                                    <select class="form-control" name="y">
                                        <option value="" selected>--发布年份--</option>
                                        <option >2018</option>
                                        <option>2017</option>
                                        <option>2016</option>
                                        <option>2015</option>
                                        <option>2014</option>
                                    </select>
                                </div>
                                <button type="submit" class="btn btn-default">搜索</button>
                            </form>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    6. 成品展示
        1. 网站父模板统一布局:头部导航条、底部图片导航、中间主显示区域布局
          •   
        2. 注册、登录、注销
        3. 发布、列表显示
        4. 详情页
        5. 评论、列表显示
        6. 个人中心
        7. 搜索,条件组合搜索
        8. 文章分类、显示
        9. 点赞、收藏
        10. 修改密码、头像、上传头像
        11. 我的发布、点赞、收藏、评论
        12. 高级搜索
        13. 热门文章、推荐文章
  • 相关阅读:
    第九篇 python基础之函数,递归,内置函数
    第六篇:python基础之文件处理
    第五篇:python基础之字符编码
    第四篇:python基础之条件和循环
    第三篇:python基础之数据类型与变量
    第二篇:python基础之核心风格
    第一篇:初识Python
    作业
    作业3
    作业2
  • 原文地址:https://www.cnblogs.com/iamzhuangyuan/p/9170320.html
Copyright © 2011-2022 走看看