管理信息系统 课程设计

一、网站结构设计

二、模块详细设计

1.导航条

2.注册页面

# 跳转注册。

@app.route('/zhuce/', methods=['GET', 'POST'])  # methods定义它有两种请求方式,因为它在表单的请求是post,类似我们在idea中的sava请求模式

def zhuce():

    if request.method == 'GET':

        return render_template('zhuce.html')

    else:

        username = request.form.get('user')  # post请求模式,安排对象接收数据

        password = request.form.get('pass')

        nickname = request.form.get('nickname')

        user = User.query.filter(User.username == username).first()  # 作查询,并判断

        if user:

            return u'该用户已存在'

        else:

            user = User(username=username, password=password, nickname=nickname)  # 将对象接收的数据赋到User类中,即存到数据库

            db.session.add(user)  # 执行操作

            db.session.commit()

            return redirect(url_for('denglu'))  # redirect重定向

3.登录页面

# 跳转登陆。

@app.route('/denglu/', methods=['GET', 'POST'])  # methods定义它有两种请求方式

def denglu():

    if request.method == 'GET':

        return render_template('denglu.html')

    else:

        username = request.form.get('user')  # post请求模式,安排对象接收数据

        password = request.form.get('pass')

        user = User.query.filter(User.username == username).first()  # 作查询,并判断

        if user:  # 判断用户名

            if user.check_password(password):  # 判断密码

                session['user'] = username  # 利用session添加传回来的值username

                session.permanent = True  # 设置session过期的时间

                return redirect(url_for('daohang'))

            else:

                return u'用户密码错误'

        else:

            return u'用户不存在,请先注册'

4.注销

# 跳转注销。

@app.route('/logout')

def logout():

    session.clear()  # 注销时删除所有session

return redirect(url_for('daohang'))

5.完成发布功能

.编写请求登录的装饰器:

# 跳转某页面之前先进行登录。定义decorator可以增强函数功能,装饰器本身是函数,入参是函数,返回值也是函数

def loginFirst(fabu):

    @wraps(fabu)  # 加上wraps,它可以保留原有函数的__name__,docstring

    def wrapper(*args, **kwargs):  # 定义wrapper函数将其返回,用*args, **kwargs把原函数的参数进行传递

        if session.get('user'):  # 只有经过登陆,session才能记住并get到值

            return fabu(*args, **kwargs)

        else:

            return redirect(url_for('denglu'))

 

return wrapper

.应用装饰器:

@loginFirst  # 将decorator定义的增强函数放在待增强函数定义的上面

@app.route('/fabu/', methods=['GET', 'POST'])  # methods定义它有两种请求方式

@loginFirst  # 将decorator定义的增强函数放在待增强函数定义的上面

def fabu():

.建立发布内容的对象关系映射

class Fabu(db.Model):

    __tablename__ = 'fabu'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)

    title = db.Column(db.String(100), nullable=False)

    detail = db.Column(db.Text, nullable=False)

    creat_time = db.Column(db.DateTime, default=datetime.now)  # 提交时间会自己赋值

    author_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 数据类型是db.Integer,db.ForeignKey参数指定外键是哪个表中哪个id

    author = db.relationship('User', backref=db.backref('fabu'))  # 建立关联,其author属性将返回与问答相关联的用户实例,相当于数据库中的表连接

# 第一个参数表明这个关系的另一端是哪个类,第二个参数backref,将向User类中添加一个fabu属性,从而定义反向关系,这一属性可访问Fabu类,获取的是模型对象

.完成发布函数,保存数据库,重定向到首页

# 跳转发布。

@app.route('/fabu/', methods=['GET', 'POST'])  # methods定义它有两种请求方式

@loginFirst  # 将decorator定义的增强函数放在待增强函数定义的上面

def fabu():

    if request.method == 'GET':

        return render_template('fabu.html')

    else:

        title = request.form.get('title')  # post请求模式,安排对象接收数据

        detail = request.form.get('detail')

        author_id = User.query.filter(

            User.username == session.get('user')).first().id  # 将session get到的user进行查询并取出id放到外键author_id中

        fabu = Fabu(title=title, detail=detail, author_id=author_id)  # 将对象接收的数据赋到Fabu类中,即存到数据库

        db.session.add(fabu)  # 执行操作

        db.session.commit()  # 提交到数据库

        return redirect(url_for('daohang'))  # redirect重定向

6.问答发布

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

                <h3 class="text-center">发布</h3>

                <ul class="list-unstyled">

                    {% for foo in fabus %}

                        <li class="list-group-item-success">

                            <a href="{{ url_for('yonghu',username_id=foo.author_id,tag=1) }}"><span

                                    class="glyphicon glyphicon-fire"></span>{{ foo.author.username }}</a>

                            <h4 class="text-center"><a

                                    href="{{ url_for('fabuview',fabu_id=foo.id) }}">{{ foo.title }}</a></h4>

                            <span class="badge pull-right">{{ foo.creat_time }}</span>

                            <br>

                            <p>{{ foo.detail }}</p>

                        </li>

                    {% endfor %}

                </ul>

            </div>

7.发布详情

# 跳转发布详情

@app.route('/fabuview/<fabu_id>')  # 和idea的update一样,将id带到控制器

def fabuview(fabu_id):

    fa = Fabu.query.filter(Fabu.id == fabu_id).first()  # 根据主页带回来的id查询出整条元组记录,丢进fa

    comments = Comment.query.filter(Comment.fabu_id == fabu_id).all()  # 根据带回来的Fabu的id在Comment查询出所有评论

return render_template('fabuview.html', fa=fa, comments=comments)  # 把值fa丢进键fa,在fabuview.html页面调用

8.个人信息中心

# 跳转用户详情

@app.route('/yonghu/<username_id>/<tag>')  # 为了把页面分开,我们在html页面传了一个tag参数

def yonghu(username_id, tag):

    user = User.query.filter(User.id == username_id).first()

    context = {

        'userid': user.id,

        'username': user.username,

        'fabus': user.fabu,

        'comments': user.comments

    }  # 根据tag的不同去到不同页面,一个请求跳转3个不同页面

    if tag == '1':

        return render_template('yonghu1.html', **context)

    elif tag == '2':

        return render_template('yonghu2.html', **context)

    else:

        return render_template('yonghu3.html', **context)

9.密码保护

from werkzeug.security import generate_password_hash,check_password_hash

 

_password = db.Column(db.String(200), nullable=False)   # 密码加密内部使用

 

    @property   # 定义函数,需要用属性时可以用函数代替

    def password(self):   # 密码加密外部使用

        return self._password

 

    @password.setter

    def password(self,row_password):   # 密码进来时进行加密,generate_password_hash是一个密码加盐哈希函数,生成的哈希值可通过check_password_hash()进行验证。

        self._password = generate_password_hash(row_password)

 

    def check_password(self,row_password):   # check_password_hash函数用于验证经过generate_password_hash哈希的密码。若密码匹配,则返回真,否则返回假。

        result = check_password_hash(self._password,row_password)

        return result

10.密码修改

<h3 class="text-center">密码修改</h3>
<hr>
<div class="form-group">
    <label for="username" class="col-sm-2 control-label">用户账号</label>
    <div class="col-sm-10">
        <input type="text" class="form-control" id="username" name="username"
               value="{{ users.username }}" readonly>
    </div>
</div>
<div class="form-group">
    <label for="password" class="col-sm-2 control-label">新密码</label>
    <div class="col-sm-10">
        <input type="text" class="form-control" id="password" name="password" placeholder="请输入新密码"
                required>
    </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>

11. 我的发布、点赞、收藏、评论

{% extends 'yonghufather.html' %}

{% block yonghubody %}
    <h3 class="text-center">个人信息</h3>
    <ul class="list-unstyled nav1">
        <li class="list-group-item-success">用户:{{ username }}</li>
        <li class="list-group-item-info">编号:{{ userid }}</li>
        <li class="list-group-item-warning">昵称:{{ nickname }}</li>
        <li class="list-group-item-danger">头像:<img src="https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=3298685419,1477967578&fm=27&gp=0.jpg" style="width: 40px"></li>
        <li class="list-group-item-success">文章:{{ fabus|length }}篇</li>
        <li class="list-group-item-info">评论:{{ comments|length }}条</li>
        <li class="list-group-item-warning">收藏文章:{{ shoucang|length }}篇</li>
    </ul>

{% endblock %}

三、成品展示

posted on 2018-06-16 21:40  张木清  阅读(322)  评论(0编辑  收藏  举报

导航