管理信息系统 课程设计

 

一、项目选择

  1. 继续沿用Python+Flask+MysqL的web建设技术,开发一个网站
  2. 网站主题根据个人兴趣与特长自由选择
  3. 此项目属于个人项目,每个同学独立完成,和其他同学不一样 

二、项目要求

  1. 整个网站风格统一,布局合理,尽量美观。
  2. 作品必须完成:
    1. 网站父模板统一布局:头部导航条、底部图片导航、中间主显示区域布局
    2. 注册、登录、注销
    3. 发布、列表显示
    4. 详情页
    5. 评论、列表显示
    6. 个人中心
    7. 搜索,条件组合搜索
    8. 文章分类、显示
    9. 点赞、收藏
    10. 修改密码、头像、上传头像
    11. 我的发布、点赞、收藏、评论
    12. 高级搜索
    13. 热门文章、推荐文章
  3.  参考网站:http://bbs.xiaomi.cn/

三、提交材料

  1. 整个python项目文件夹
  2. 一项目文档,包括:
    1. 系统概要说明
    2. 网站结构设计
    3. 模块详细设计
    4. 数据库设计
    5. 系统实现的关键算法与数据结构
    6. 成品展示
       

四、材料提交方式及日期

    1. 每人提交一个文件夹,以学号姓名命名
    2. 个人文件夹里包含三述的材料:
      1. 整个python项目文件夹
      2. 一项目文档
    3. 请在2018/06/16 日期之前提交给学委
    4. 学委收齐后,整理刻录一张光盘交给老师。
      1. 空白光盘可找老师领取
      2. 建一个班级文件夹,里面放一个一个同学的文件夹,都不要压缩

 

 

1、系统概要说明

     本篇文章主要是讲关于用数据库能够进行用户的注册,登录以及能增加用户的问答,评论功能,还有就是收藏和点赞功能,和在首页能显示不同用户发布的问答,有条件的查询以及热搜榜。

2、 网站结构设计

   在根目录下有静态文件夹(static),html存放的文件夹(templates)以及主python文件以及config配置文件。static中又分别有三个文件夹,css,js和upload文件。css文件是用来布局美化的功能; js文件则是用来完成一些页面的特效功能; uploads文件就是用来    储存用户的头像图片。在templates中存放了所有页面的HTML,包含模板以及其余的html页面。

3、模块详细设计

  • 客户端—首页遍历问答请求—查询数据库—返回所有问答
  • 客户端--注册请求—查询数据库—返回页面(提示成功)—跳转登录页面
  • 客户端—登录请求—查询数据库(有该用户)—返回页面(提示成功)—跳转首页
  • 客户端—登录请求—查询数据库(查询不到该用户)—返回页面(提示登录不成功)—跳转到登录页面(重新登录)
  • 客户端—问答评论请求—将评论的内容存入数据库—返回评论用户以及评论内容
  • 客户端—点赞收藏请求—存入数据库—将加一后的数据返回页面
  • 客户端—用户头像上传请求—存入用户表—返回用户图像
  • 客户端—发布问答请求—存取数据到数据库—返回页面—跳转到首页
  • 客户端—个人信息请求—查询数据库—返回从数据库查询到的个人信息

 

4、数据库设计

     本系统运行的数据库要把格式转换为utf-8格式,不然发布问答的内容,标题不能输入文字,会显示错误,只能输入数字数据库里需要有五张表, user(用户)表,question(问答)表,comment(评论)表,collection(收藏)表以及cf(分类)表。

     User表有用户ID,用户名,密码,icon,而密码是经过加密处理的。

     Question表:问答id,title,detail,creat_time,用户id,类别,浏览次数和点赞次数。

     Comment表:评论id,用户id,问答id,creat_time,detail。

    Collection表:收藏id,问答id,用户id。

    cf表:分类id,类别名。

 

5、系统实现的关键算法与数据结构

    关键算法有注册,登录,发布问答和发布评论,个人信息

注册部分的代码:

 

@app.route('/regist/', methods=['GET', 'POST'])
def regist():
    if request.method == 'GET':
        # 打开注册页的模板
        return render_template('regist.html')
    else:  # 收到用户上传的信息
        username = request.form.get('username')
        password = request.form.get('password')
        user = User.query.filter(User.username == username).first()
        if user:
            return 'error:user exitst'
        else:
            user = User(username=username, password=password)
            db.session.add(user)  # 加入数据库
            db.session.commit()
            return redirect(url_for('login'))






{% extends 'base.html' %}
{% block title %}
    注册
{% endblock %}

{% block link %}

{% endblock %}

{% block box %}
    <div class="container" style="padding-top: 100px;">
        <script type="text/javascript" src="../static/js/ma.js"></script>
        <div class="row clearfix">
            <div class="col-md-8 column">
                <form class="form-horizontal" role="form" method="post" action="{{ url_for('regist') }}">
                    <div class="form-group">
                        <label for="inputEmail3" class="col-sm-2 control-label" style="color:blue">账号</label>
                        <div class="col-sm-10">
                            <input type="text" name="username" class="form-control" id="inputEmail3" required/>
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="Password1" class="col-sm-2 control-label" style="color:blue">密码</label>
                        <div class="col-sm-10">
                            <input type="password" name="password" class="form-control" id="Password1" required/>
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="Password2" class="col-sm-2 control-label" style="color:blue">确认密码</label>
                        <div class="col-sm-10">
                            <input type="password"  class="form-control" id="Password2"required/>
                        </div>
                        <br />
                        <br />
                        <br />
                    </div>
                    <div class="form-group">
                        <div class="col-sm-offset-2 col-sm-10">
                            <button type="submit" onclick="return aaa()" class="btn btn-default" style="width:100%;background:pink;">注册</button>
                        </div>
                    </div>
                </form>
            </div>
            <div class="col-md-4 column">
            </div>
        </div>
    </div>
{% endblock %}

{% block script %}
    <script>
    function aaa() {
        var p1 = document.getElementById('Password1')
        var p2 = document.getElementById('Password2')
        if (p1.value != p2.value){
            alert('两次密码不一样!')
            return false;
        }
        return true;
    }

    </script>
{% endblock %}

 

  代码解析:定义regist方法,获取get方法,打开注册页的模板,收到用户上传的信息,传送到数据库,匹配有没有相同的用户名,有的返回到注册页面并显示该用户名已存在。没有的就返回到登录页面进行登录。在注册的时候也会匹配两次输入的密码是否一致,不一致就会显示“两次密码不一致”,重新输入密码。

 

登录部分的代码:

# 登陆
@app.route('/login/', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
username = request.form.get('username')
password = request.form.get('password')
user = User.query.filter(User.username == username).first()
if user:
if user.check_password(password):
session['username'] = user.username
session['user_id'] = user.id
session.permanent = True
# 重新定位到首页
return redirect(url_for('index'))
else:
# 重新定位到注册
return redirect(url_for('login'))
else:
return redirect(url_for('login'))



{% extends 'base.html' %}
{% block title %}
    登录
{% endblock %}

{% block link %}

{% endblock %}

{% block box %}
    <div class="container" style="padding-top: 100px;">
        <script type="text/javascript" src="../static/js/login.js"></script>
        <div class="row clearfix">
            <div class="col-md-8 column">
                <form class="form-horizontal" role="form" method="post" action="{{ url_for('login') }}">
                    <div class="form-group">
                        <label for="inputEmail3" class="col-sm-2 control-label" style="color:blue;">账号</label>
                        <div class="col-sm-10">
                            <input type="text" name="username" class="form-control" id="inputEmail3"/>
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="inputPassword3" class="col-sm-2 control-label" style="color:blue;">密码</label>
                        <div class="col-sm-10">
                            <input type="password" name="password" class="form-control" id="inputPassword3"/>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-sm-offset-2 col-sm-10">
                            <div class="checkbox">
                                <label><input type="checkbox"/>Remember me</label>
                            </div>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-sm-offset-2 col-sm-10">
                            <button type="submit" class="btn btn-default">登录</button>
                        </div>
                    </div>
                </form>
            </div>
            <div class="col-md-4 column">
            </div>
        </div>
    </div>
{% endblock %}

{% block script %}

{% endblock %}

  代码解析:定义login方法,请求方式是“get”,返回到'login.html'页面,获取数据,传送到数据库,匹配用户名和密码,如果匹配成功返回到首页,不成功返回到注册页面,进行注册。

 

发布问答部分的代码:

@app.route('/question', methods=['GET', 'POST'])
@loginFirst
def question():
    if request.method == 'GET':
        cf = Cf.query.all()
        return render_template('question.html', cf=cf)
    else:
        title = request.form.get('title')
        detail = request.form.get('detail')
        author_id = request.form.get('author_id')
        cf = request.form.get('cf')
        question = Question(title=title, detail=detail, author_id=author_id, cf=cf)
        db.session.add(question)  # 加入数据库
        db.session.commit()
        return redirect(url_for('index'))






{% extends 'base.html' %}
{% block title %}
    发布问答
{% endblock %}

{% block link %}

{% endblock %}

{% block box %}
    <div class="container" style="padding-top: 100px;">
        <div class="row clearfix">
            <div class="col-md-8 column">
                <form class="form-horizontal" role="form" method="post" action="#">
                    <div class="form-group">
                        <label for="inputEmail3" class="col-sm-2 control-label"><span style="color:yellow">标题</span></label>
                        <div class="col-sm-10">
                            <input type="text" name="author_id" value="{{ user.id }}" hidden>
                            <input type="text" class="form-control" id="title" name="title"/>
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-sm-2 control-label" for="name"><span style="color:yellow">内容</span></label>
                        <div class="col-sm-10">
                            <textarea class="form-control" name="detail" rows="10"></textarea>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-sm-offset-2 col-sm-10">
                            <select name="cf" id="" class="form-control">
                                <option value="">--请选择分类--</option>
                                {% for c in cf %}
                                    <option value="{{ c.id }}">{{ c.name }}</option>
                                {% endfor %}
                            </select>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-sm-offset-2 col-sm-10">
                            <button type="submit" class="btn btn-default">发布</button>
                        </div>
                    </div>
                </form>
            </div>
            <div class="col-md-4 column">
            </div>
        </div>
    </div>
{% endblock %}

{% block script %}

{% endblock %}

  代码解析:定义question方法,如果请求的方式是“GET”那么返回到question.html,否则获取title,detail,author_id,cf,然后加进数据库的question表,返回首页。

 

 

评论部分的代码:

@app.route('/answer/', methods=['GET', 'POST'])
def answer():
    if request.method == 'POST':
        question_id = request.form.get('question_id')
        author_id = request.form.get('author_id')
        detail = request.form.get('detail')
        comment = Comment(question_id=question_id, author_id=author_id, detail=detail)
        db.session.add(comment)
        db.session.commit()
        return redirect(url_for('detail', question_id=question_id))








{% extends 'base.html' %}
{% block title %}
    详情页
{% endblock %}

{% block link %}

{% endblock %}

{% block box %}
<div class="container">
    <div class="row clearfix">

        <div class="col-md-6 column">

            <h1 style="color:yellow">{{ ques.title }}</h1>
            <div style="padding: 10px;">
                <span style="padding-left: 10px;color:yellow">作者:{{ ques.author.username }}</span>
                <span style="padding-left: 10px;color:yellow">浏览数:{{ ques.look }}</span>
                <span style="padding-left: 10px;color:yellow">点赞数:{{ ques.click }}</span>
                <form method="post" style="display: inline-block;padding-left: 10px;">
                    <input name="click" value="1" type="hidden">
                    <button>点赞</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>收藏</button>
                    {% endif %}
                </form>
            </div>
            <div style="padding: 70px 20px;margin-bottom: 20px;border:1px solid #eee;">
                <p style="color:yellow">
                    {{ ques.detail }}
                </p>
            </div>
        </div>

            <div style="padding: 15px;" class="col-md-6 column">
                <h1 style="color:yellow">推荐文章</h1><br>
                {% for foo in questions %}
                <li class="list-group-item" style="width: 700px">
                    <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 %}
            </div>
    </div>
                <br>
 <div class="row clearfix">
     <div class="col-md-6 column">
                <h1 style="color:yellow">评论</h1><br>
                <div class="form-group" style="height:100px;width:700px;">
                    <input type="text" name="author_id" value="{{ user.id }}" hidden>
                    <input type="text" name="question_id" value="{{ ques.id }}" hidden>
                    <textarea class="form-control" name="detail" rows="10" style="width:500px;"></textarea>
                </div>
                <br>
                 <br>
                 <br>
                <br>
                <br>
                <div class="form-group">
                    <button type="submit" class="btn btn-default">发布</button>
                </div>
     </div>
  <div class="col-md-6 column">
             <h1 style="color:yellow">用户评论</h1><br>
                <ul style="margin-left:0px;">
                    {% for com in comment %}
                        <li class="list-group-item">
                            <h4>{{ com.author.username }}</h4>
                            <div>
                                {{ com.detail }}
                            </div>
                        </li>
                    {% endfor %}
                </ul>

  </div>

 </div>
</div>
{% endblock %}

{% block script %}

{% endblock %}

  代码解析:定义answer方法,如果请求的是“POST”方法,那么获取question_id,author_id,detail,把数据传送到数据库,加入数据库的comment表,返回到detail页面。其中question_id要作为主键。

 

6、成品展示

首页页面:

 

 

 

 

 注册页面:

密码不一致时

 

 

 登录页面:

 

 

 

 

 

 查询功能:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 点击发布了的标题:

 

 

 

 

 进入到详情页:

 

 

 点击收藏:

 

点击点赞:

 

 

发布问答页面:

 

 

发布完问答自动回到首页:

 

 

 

 

 

评论:

 

 

 个人信息:

 

 

 

 

 

posted @ 2018-06-16 15:28  029郭媚婷  阅读(277)  评论(0编辑  收藏  举报