沿用Python+Flask+Mysql的web建設技術開發網站

1 系統概要說明

 1.1開發目的

       現在音樂已經成爲人們尤爲是年輕人的平常必備。走路,坐車,逛街,咱們都能看到戴着耳機聽音樂的人。古風曲、日韓風、歐美風、hippop等等各類音樂風格多樣。隨着媒體的發展,微博微信公衆號媒體採訪等等的發展,人們對音樂的理解也開始不僅是限於聽,愈來愈多的人開始瞭解歌曲背後的含義的故事。每首歌曲背後都有着不同的情感和故事,每首歌都表明着不同的經歷和成長。總有歌曲裏彷佛有着咱們的身影和故事,在某個瞬間已經是如同曲中人。css

       發現歌曲背後的故事,聊聊屬於咱們的感覺和想法,分享藏着咱們記憶和故事的那些歌。在音樂的世界中,放鬆本身,瞭解本身,也學會好好愛本身和珍惜身邊的人。html

2 網站結構設計

1.網站容許不登陸的遊客訪問,遊客能夠在網站首頁查看網站用戶發佈的相關帖子,能夠查看音樂榜單,可是隻能看當前頁的帖子,不能夠過頁查看,而且不容許評論和發佈帖子。jquery

2.網站用戶先註冊後登陸,註冊須要填寫很多於3字符的用戶名、設置密碼;註冊後可用用戶名和密碼登陸。密碼錯誤或者用戶名錯誤都沒法登陸。算法

3.網站用戶登陸後,導航欄會顯示用戶名,用戶如若須要下線或者切換賬號能夠註銷賬號從新登陸。數據庫

4.網站用戶登陸後,能夠查看網站用戶發佈的全部帖子,能夠進行評論、點贊和收藏,網站也會根據瀏覽記錄推薦相關的帖子。bootstrap

5.網站用戶登陸後,能夠瀏覽本身發佈過的帖子,發過的評論和查看本身的我的信息,也能夠從新修改頭像和密碼。api

6.網站訪問者能夠經過網站右側的分類瀏覽須要的類別帖子,也能夠經過搜索關鍵詞瀏覽帖子,網站也會將熱度前五的帖子標題顯示在左側方便瀏覽。微信

3.模塊詳細設計

導航欄(父模版):session

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}Music世界</title>
     
    {% block link %}{% endblock %}
    <link rel="stylesheet" href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css">
       <script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <link rel="stylesheet" type="text/css" href="../static/css/base.css">
 {% block head %}{% endblock %}
</head>
<body  id="body">
<nav class="navbar navbar-default" role="navigation">
    <div class="container-fluid dao">
        <ul class="nav nav-pills nav2">
                <li><img src="{{ url_for('static',filename='image/logo.png') }}" style="margin-left: 20px;" ></li>
                <li class="active"><a href="{{ url_for('index') }}">首頁</a></li>
                <li><a href="#">音樂分享</a></li>
                <li><a href="#">音樂榜單</a></li>
                <li><a href="#">個人音樂</a></li>
                <li><a href="#">音悅世界</a></li>
                <li><a href="{{ url_for('question') }}">發帖</a></li>

         {% if user_id %}
                    <li style="float: right;margin-right: 100px"><a href="{{ url_for('logout') }}">註銷</a></li>
                    <li style="float: right"><a href="{{ url_for('comment',user_id=user.id,num='1') }}">{{ user.username }}</a></li>

                {% else %}
                     <li style="float: right;margin-right: 150px"><a href="{{ url_for('regist') }}" style="color: hotpink">註冊</a></li>
                     <li style="float: right"><a href="{{ url_for('login') }}">登陸</a></li>
                {% endif %}


        <div >
    <form action="{{ url_for('search') }}" method="get" class="bs-example bs-example-form" role="form">
            <div class="col-lg-6" style="width: 250px;padding-bottom: 30px">
                <div class="input-group">
                    <input name="q" type="text" class="form-control" style="margin-top: 0" placeholder="請輸入關鍵字">
                    <span class="input-group-btn">
                        <button class="btn btn-default" type="submit">搜索</button>
                    </span>
                </div><!-- /input-group -->
            </div><!-- /.col-lg-6 -->
    </form>
</div>

 </ul>


    </div>

</nav>

<div class="box">
    {% block box %}{% endblock %}
</div>
{% block script %}{% endblock %}
</body>
</html>

首頁:數據結構

{% extends 'base.html' %}
{% block title %}
    首頁
{% endblock %}

{% block link %}
<link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/shouye.css') }}">
    <script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
{% endblock %}

{% block box %}
    <div >
           <div class="col-md-2 column"></div>
            <div  style="margin-left: 150px;">
                <ul class="list-group">
                    {% for foo in questions %}
                        <div class="info">
                         <li class="list-group-item" style="width: 800px">
                        <a  href="{{ url_for('comment',user_id=foo.author.id ,num='1') }}" target="_blank">
                            <img src="{{ url_for('static',filename=foo.author.icon) }}" width="50px">
                        </a>
                        <a href="{{ url_for('comment',user_id=foo.author.id ,num='1') }}" style="color: #337ab7"
                           target="_blank">{{ foo.author.username }}</a>

                        <h4><a href="{{ url_for('detail',question_id=foo.id) }}">{{ foo.title }}</a></h4>
                        <span class="badge">{{ foo.creat_time }}</span>
                        <p style="">{{ foo.detail[0:50] }}...
                        </p>
                        <div>
                            <strong>瀏覽:
                                <small>{{ foo.look }}</small>
                            </strong>
                            <strong> 分類:{{ foo.cfClass.name }}</strong>
                            <strong style="padding-left: 10px;"> 點贊:{{ foo.click }}</strong>
                        </div>
                        </li>

                        </div>

                    {% endfor %}


                </ul>

            <div style="width: 200px;float: right;margin-right: 80px;margin-top:-900px;text-align: center">

                    <a href="#" class="list-group-item " style="background-color: #337ab7;color: #fff" >
                        帖子分類
                    </a>
                    {% for c in cf %}
                        <a href="{{ url_for('c',cf=c.id) }}" class="list-group-item">{{ c.name }}</a>
                    {% endfor %}
                </div>
     </div>
      <div class="flo">
                        <a href="#" class="list-group-item" style="width: 200px;background-color: #337ab7;color: #fff;text-align: center;">
                            熱門推薦
                        </a>
                        {% for q in hot %}
                            <a href="{{ url_for('detail',question_id=q.id) }}" class="list-group-item" style="width: 200px;">
                                <span style="font-size: 16px;color: red;padding-right: 10px;width:105px;">{{ loop.index }}</span>
                                {{ q.title }}
                            </a>
                        {% endfor %}
                    </div>
            </div>
</div>

{% endblock %}

{% block script %}
    <script>
        {% if info %}
            alert('{{ info }}')
        {% endif %}
    </script>
{% endblock %}

註冊:

{% extends 'base.html' %}
{% block title %}
    註冊
{% endblock %}

{% block link %}
    <link rel="stylesheet" type="text/css" href="../static/css/style.css">
    <link href='http://fonts.googleapis.com/css?family=Oleo+Script' rel='stylesheet' type='text/css'>
{% endblock %}

{% block box %}
    <div class="lg-container">
    <h1 style="color:deeppink;">註冊</h1>
    <form action="{{ url_for('regist') }}" method="post" id="lg-form" name="lg-form" >

        <div>
            <label for="username">Username:</label>
                <input class="shuru" type="text" name="username" autocomplete="off" placeholder="請輸入用戶名">

        </div>

        <div>
            <label for="password">Password:</label>
               <input class="shuru" type="password" id="Password1" name="password" autocomplete="off" placeholder="設置密碼" >
        </div>
        <div>
              <label for="password">Password1:</label>
              <input class="shuru" type="password" id="Password2" name="password" autocomplete="off" placeholder="確認密碼" >
        </div>

        <div id="error_box"></div>
        <button type="submit" id="regist" onclick="return aaa()">註冊</button>

    </form>

</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 %}

登陸:

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

{% block link %}
    <link rel="stylesheet" type="text/css" href="../static/css/style.css">
    <link href='http://fonts.googleapis.com/css?family=Oleo+Script' rel='stylesheet' type='text/css'>
{% endblock %}

{% block box %}
  <div class="lg-container" >
    <h1 style="color:deeppink;">登陸</h1>
    <form action="{{ url_for('login') }}" method="post" id="lg-form" name="lg-form" >

        <div>
                <label for="username">Username:</label>
                <input class="shuru" id="inputEmail3" type="text"  name="username" placeholder="請輸入用戶名"><br>
        </div>

        <div>
        <label for="password">Password:</label>
              <input class="shuru" id="inputPassword3" type="password" name="password" placeholder="請輸入密碼" >
        </div>

        <input type="checkbox" name="vehicle" value="true" ><span>記住密碼</span>
        <a class="right" href="">登陸遇到問題?</a>


        <div id="error_box"></div>
        <button type="submit" value="login" id="login" onclick="return fnLogin()">登陸</button>

    </form>
    <div id="message"></div>
</div>
{% endblock %}

發佈帖子:

{% extends 'base.html' %}
{% block title %}
    發佈問答
{% endblock %}

<link rel="stylesheet" type="text/css" href="../static/css/release.css">
<script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

{% block box %}
     <div class="container" style="background-image: url(/static/image/back.jpg);width: 500px" >
    <div class="row clearfix">
        <div class="col-md-4 column">
        </div>
        <div class="col-md-4 column">
        </div>
       <div class="lg-container">
          <h1 align="center" style="color: salmon">發佈帖子</h1>

         <form role="form" action="{{ url_for('question') }}" method="post"><br/>
        <div class="q">

            <label for="inputEmail3">標題</label><br>
            <input type="text" name="author_id" value="{{ user.id }}" hidden>

            <textarea id="title" name="title" class="form-control" cols="80" rows="1"></textarea>


        </div>
        <div class="form-group">
            <label for="name">內容</label><br>
{#            <textarea class="form-control" id="questionDetail" name="questionDetail" cols="60" rows="5" ></textarea>#}
            <textarea placeholder="詳情" class="form-control" rows="5" id="detail" name="detail" style="width: 500px"></textarea>
        </div>
            <div class="form-group" style="margin-left:-115px">
                        <div class="col-sm-offset-2 col-sm-5">
                            <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>
       <br>
         <div style="margin-top: 30px">
            <button type="submit" class="btn btn-primary" onclick="{{ url_for('question') }}" >發佈</button>
         </div>
     </form>

        </div>
    <div class="col-md-4 column">
        </div>
    </div>
</div>
    
{% endblock %}

帖子詳情:

{% extends 'base.html' %}
{% block title %}
    帖子詳情
{% endblock %}

{% block link %}
<link rel="stylesheet" href="../static/css/detail.css">
    <script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.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">

                <h3>{{ ques.title }}</h3>
                <div style="padding: 10px;">
                    <span style="padding-left: 5px;">做者:{{ 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>點贊</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>
                <br>
                <small class="badge">時間:{{ ques.creat_time }}</small>
                </div>
                <div style="padding: 20px 20px;margin-bottom: 50px;border:1px solid #eee;">
                    <p>
                        {{ ques.detail }}

                    </p>
                </div>


                <hr>
                <form class="form-horizontal" role="form" method="post" action="{{ url_for('answer') }}" style="margin-left: 0">
                    <div class="form-group">
                        <label for="inputEmail3" class="col-sm-2 control-label" style="text-align: left;font-size: medium;color: #337ab7;">評論</label><br>
                        <div class="col-sm-10" style="margin-left:7px">
                            <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" placeholder="發表評論"></textarea>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-sm-offset-2 col-sm-10" style="margin-left:7px">
                            <button type="submit" class="btn btn-default">發佈</button>
                        </div>
                    </div>
                </form>
                <hr>
                <h4>用戶評論</h4>

                    {% for com in comment %}

                        <ul style="padding-left: 0;margin-bottom: 0;">
                    <li class="list-group-item" style="width: 900px">
                        <a href="#">{{ com.author.username }}</a>
                        <span class="badge">評論時間:{{ com.creat_time }}</span>
                        <p>{{ com.detail }}</p>
                    </li>
                </ul>
                    {% endfor %}

            <hr>
                <div >
                    <h3>推薦帖子</h3><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>

            <div class="col-md-2 column">
            </div>
        </div>
    </div>
{% endblock %}

我的發帖:

{% extends 'comment.html' %}
{% block head %}
        <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/geren.css') }}">
    <script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
{% endblock %}
{% block subComment %}


<ul class="list-group" style="">
     <h4>{{username }}
        <small> 所有帖子</h4>
    <hr>
        {% for foo in questions %}

              <li class="list-group-item"  style="width: 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>
</div>
{% endblock %}

我的評論:

{% extends 'comment.html' %}
   {% block head %}
        <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/geren.css') }}">
       <script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    {% endblock %}
{% block subComment %}

<div>
       <h4>{{ username }}
        <small> 所有評論</small></h4>
     <hr>
        {% for com in comment %}
            <ul style="padding-left: 0;margin-bottom: 0;">
                <li class="list-group-item" style="width: 900px">
                    <a href="#">{{ com.author.username }}</a>
                    <span class="badge">評論時間:{{ com.creat_time }}</span>
                    <p>{{ com.detail }}</p>
                </li>
            </ul>

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

我的資料:

{% extends 'comment.html' %}
{% block head %}
    <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='css/geren.css') }}">
    <script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
{% endblock %}
{% block subComment %}
    <div >
          <h4>{{ username }}
        <small> 我的資料</small></h4>
    <hr>
            <a href="#" class="list-group-item " style="background-color: pink">用戶:{{ user.username }}</a>
{#            <a href="#" class="list-group-item" style="background-color: pink">編號:{{ user.id }}</a>#}
            <a href="#" class="list-group-item" style="background-color: pink">暱稱:{{user.user.name}} </a>
            <a href="#" class="list-group-item " style="background-color: pink">帖子數:{{ questions|length }}</a>
            <a href="#" class="list-group-item " style="background-color: pink">評論數:{{ comment|length }}</a>

    </div>
{% endblock %}

修改信息:

% extends 'base.html' %}
{% block title %}
    我的信息修改
{% endblock %}


{% block box %}

    <div class="container" style="padding-top: 10px;">
    <h2 align="center" style="color: salmon">修改信息</h2>
        <div class="row clearfix">

            <div class="col-md-2 column">
            </div>
            <div class="col-md-8 column">
                 <h4 style="color: red">頭像上傳</h4>
                <div style="margin: 5px 0px;margin-left: 70px;">
                    <form class="form-horizontal" role="form" method="post" enctype="multipart/form-data" action="{{ url_for('uploadLogo',user_id=user_id) }}" style="padding-top: 20px">
                        <div class="form-group">
                            <div class="col-sm-10">
                                <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>
                <h4 style="color: red">修改密碼</h4>
                <form class="form-horizontal" role="form" method="post" style="width: 500px;padding-top: 20px">
{#                    <div class="form-group" >#}
{#                        <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" disabled/>#}
{#                        </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-success" 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 %}

4.數據庫設計

設計5個數據表分別爲:

1.User表:用於存儲用戶註冊的用戶數據

class User(db.Model):
    __tablename__ = 'user'
    # 創建一個表user
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(20), nullable=False)
    _password = db.Column(db.String(200), nullable=False)

    say = db.Column(db.String(50))
    icon = db.Column(db.String(50))
    collection = db.relationship('Question', secondary=Collection, backref=db.backref('user', lazy='dynamic'),
                                 lazy='dynamic')

2.Question表:用於存儲用戶發佈帖子的數據,包括帖子的標題、內容、發貼時間、發帖用戶、類別、點贊數和瀏覽量

class Question(db.Model):
    __tablename__ = 'question'
    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'))
    cf = db.Column(db.Integer, db.ForeignKey('cf.id'))
    look = db.Column(db.Integer)
    click = db.Column(db.Integer)
    author = db.relationship('User', backref=db.backref('question'))
    cfClass = db.relationship('Cf', backref=db.backref('question'))

3.Comment表:用於存儲用戶的評論數據,包括評論內容、評論時間、評論的用戶、評論的帖子

class Comment(db.Model):
    __tablename__ = 'comment'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    question_id = db.Column(db.Integer, db.ForeignKey('question.id'))
    creat_time = db.Column(db.DateTime, default=datetime.now())
    detail = db.Column(db.TEXT, nullable=False)
    question = db.relationship('Question', backref=db.backref('comment'))
    author = db.relationship('User', backref=db.backref('comment', order_by=creat_time.desc))

4.Cf表:識別和存儲帖子的類型

class Cf(db.Model):
    __tablname__ = 'cf'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True) 
    name = db.Column(db.String(30))  
    context = db.Column(db.TEXT)  

5.Collection表:存儲對應用戶收藏的帖子

Collection = db.Table(
    'collection',
    db.Column('id', db.Integer, primary_key=True, autoincrement=True)
    db.Column('book_id', db.Integer, db.ForeignKey('question.id'))                     
db.Column('collection', db.Integer, db.ForeignKey('user.id')) db.Column('createdate', db.DATETIME) )

5.系統展現的關鍵算法與數據結構

1.登陸註冊:

@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  '用戶不存在或密碼錯誤'
        else:
            return redirect(url_for('login'))


# 註冊
@app.route('/register/', 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 "帳號已存在"
        else:
            user = User(username=username, password=password)
            db.session.add(user)
            db.session.commit()
            return redirect(url_for('login'))

2.發佈帖子:

@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')
        author_id = User.query.filter(User.username == session.get('username')).first().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'))

3.詳情頁跳轉:

@app.route('/detail/<question_id>', methods=['GET', 'POST'])
# @loginFirst
def detail(question_id):
    quest = Question.query.filter(Question.id == question_id).first()
    u = User.query.filter(User.id == session.get('user_id')).first()
    if request.method == 'POST':
        if request.form.get('click') == '1':
            quest.click = quest.click + 1
        if request.form.get('collection') == '1':
            user = u
            user.collection.append(quest)
            db.session.add(user)
    col = u.collection.filter_by(id=question_id).first()
    if col is None:
        col = {}
    comment = Comment.query.filter(Comment.question_id == question_id).order_by('-creat_time').all()
    quest.look = quest.look + 1
    content = {
        'ques': quest,
        'comment': comment,
        'col': col,
        'questions': Question.query.filter(Question.cf == quest.cf).all(),
    }
    return render_template('detail.html',**content)

4.發表評論:

@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))

5.搜索:

@app.route('/search')
def search():
    qu = request.args.get('q')
    c = '' if request.args.get('c') == '' else request.args.get('c')
    y = '' if request.args.get('y') == '' else request.args.get('y')
    query = Question.query.filter(
        or_(
            Question.title.contains(qu),
            Question.detail.contains(qu),
        ),
        Question.cf.like('%' + c + '%'),
        Question.creat_time.like('%' + y + '%'),
    ).order_by('-creat_time').all()
    context = {
        'questions': query,
        'cf': Cf.query.all(),
        'hot': Question.query.order_by('-click').all()[0:5]
    }
    return render_template('index.html', **context)

6.上傳頭像:

@app.route('/uploadLogo/<user_id>', methods=['GET', 'POST'])
def uploadLogo(user_id):
    user = User.query.filter(User.id == user_id).first()
    f = request.files['logo']
    basepath = os.path.dirname(__file__) 
    upload_path = os.path.join(basepath, 'static/uploads', f.filename)  
    f.save(upload_path)
    user.icon = 'uploads/' + f.filename
    db.session.commit()
    return redirect(url_for('setPassword', id=user_id))

6.成品展現

1.首頁

(未登陸)

(已登陸)


 

2.登陸

3.註冊

4.搜索

5.分類

6.發佈帖子

7.帖子詳情

8.收藏

9.評論

10.我的帖子

11.我的評論

12.我的信息

13.修改信息

相關文章
相關標籤/搜索