管理信息系統 課程設計

 

1、項目選擇php

  1. 繼續沿用Python+Flask+MysqL的web建設技術,開發一個網站
  2. 網站主題根據我的興趣與特長自由選擇
  3. 此項目屬於我的項目,每一個同窗獨立完成,和其餘同窗不同 

2、項目要求css

    1. 整個網站風格統一,佈局合理,儘可能美觀。
    2. 做品必須完成:
      1. 網站父模板統一佈局:頭部導航條、底部圖片導航、中間主顯示區域佈局
      2. 註冊、登陸、註銷
      3. 發佈、列表顯示
      4. 詳情頁
      5. 評論、列表顯示
      6. 我的中心
      7. 搜索,條件組合搜索
      8. 文章分類、顯示
      9. 點贊、收藏
      10. 修改密碼、頭像、上傳頭像
      11. 個人發佈、點贊、收藏、評論
      12. 高級搜索
      13. 熱門文章、推薦文章
    3.  參考網站:http://bbs.xiaomi.cn/

A.系統概要說明html

這個網站我作的是有關文學論壇的系統,基於Python+Flask+MysqL的web建設技術,在上學期學習的基礎上進行完善,雖然不算完美,可是對Python有了更進一步的瞭解,作起來更駕輕就熟。前端

Python優勢:python

1.「優雅」、「明確」、「簡單」web

      這是python的定位,使得python程序看上去簡單易懂,初學者容易入門,學習成本更低。但隨着學習的不但深刻,python同樣能夠知足勝任複雜場景的開發需求。引用一個說法,Python的哲學是就是簡單優雅,儘可能寫容易看明白的代碼,儘可能寫少的代碼。算法

2.  開發效率高sql

     python做爲一種高級語言,具備豐富的第三方庫,官方庫中也有相應的功能模塊支持,覆蓋了網絡、文件、GUI、數據庫、文本等大量內容。所以開發者無需事必躬親,遇到主流的功能需求時能夠直接調用,在基礎庫的基礎上施展拳腳,能夠節省你不少功力和時間成本,大大下降開發週期。shell

3.  無需關注底層細節數據庫

     Python做爲一種高級開發語言,在編程時無需關注底層細節(如內存管理等)。

4.  功能強大

     Python是一種前端後端通吃的綜合性語言,功能強大,php能勝任的角色它都能作,至於後端如何勝任,須要在後續學習中逐步領悟。

5.  可移植性

     Python能夠在多種主流的平臺上運行,開發程序時只要繞開對系統平臺的依賴性,則能夠在無需修改的前提下運行在多種系統平臺上,具體有待後續學習中深刻展開。其餘優勢有待繼續發掘。

  Python缺點:

1. 代碼運行速度慢

    由於Python是一種高級開發語言,不像c語言同樣能夠深刻底層硬件最大程度上挖掘榨取硬件的性能,所以它的運行速度要遠遠慢於c語言。另一個緣由是,Python是解釋型語言,你的代碼在執行時會一行一行地翻譯成CPU能理解的機器碼,這個翻譯過程很是耗時,因此很慢。而C程序是運行前直接編譯成CPU能執行的機器碼,因此很是快。

    但須要注意的是,這種慢對於不須要追求硬件高性能的應用場合來說根本不是問題,由於它們比較的數量級根本不是用戶能直觀感覺到的!想一想程序執行所需的時間數量級?例如開發一個下載MP3的網絡應用程序,C程序的運行時間須要0.001秒,而Python程序的運行時間須要0.1秒,慢了100倍,但因爲網絡更慢,須要等待1秒,用戶體驗幾乎沒有差異,除非你用很是精確的計時器來計時。

2.  發佈程序時必須公開源代碼

     什麼?有沒有搞錯?是的,發佈程序時咱們必須公開源代碼!仍是由於Python是一種解釋性語言,沒有編譯打包的過程(聽說最新的python能夠打包,但本質上仍是把源代碼和解釋器打在一塊兒,沒有太大實際意義)。想一想咱們的shell腳本是否是也是這個狀況,你能在不發佈源代碼的狀況下發佈一個黑盒子程序來讓別人正常使用麼?

     這個缺點僅限於你想單純靠賣開發出來的軟件產品掙錢的時候。但在這個開發互聯的時代,不靠賣產品自己來賺錢的商業模式愈來愈主流了,因此問題也不是無法解決。 

B.網站結構設計

網站的結構設計是體現內容設計與創意設計的關鍵環節,在內容設計完成以後,網站的目標及內容主題等有關問題已經肯定。結構設計要作的事情就是如何將內容劃分爲清晰合理的層次體系,好比欄目的劃分及其關係、網頁的層次及其關係、連接的路徑設置、功能在網頁上的分配等等,以上這些都僅僅是前臺結構設計,而前臺結構設計的實現須要強大的後臺支撐,後臺也應有良好的結構設計以保證前臺結構設計的實現。在我看來,根據開發量來講,Flask小巧簡單易上手,同時具備強大的擴展能力,使其功能能夠不弱於django、Tornado等框架,我最終選擇了Flask。從 建表設計 到  瀏覽器前端展現 總體的結構,後臺鏈接數據庫,總體佈局是否美觀,都是從網站結構分析這方面出發要考慮的問題.

C.模塊詳細設計

模塊詳細設計這一方面,我是從

  1. 網站父模板統一佈局:頭部導航條、底部圖片導航、中間主顯示區域佈局
  2. 註冊、登陸、註銷
  3. 發佈、列表顯示
  4. 詳情頁
  5. 評論、列表顯示
  6. 我的中心
  7. 搜索,條件組合搜索
  8. 文章分類、顯示
  9. 點贊、收藏
  10. 修改密碼、頭像、上傳頭像
  11. 個人發佈、點贊、收藏、評論
  12. 高級搜索
  13. 熱門文章、推薦文章

這幾方面來規劃個人整個網站的,以及考慮實現功能所需的類及具體的方法函數,包括涉及到的sql語句、Python+Flask+MysqL的web建設技術等。

D.數據庫設計

一直以來,在數據庫庫方面我掌握的不是很好,有些細節的東西我會不當心忽略。但在這一次大做業設計中,感受本身能力有所提升,對數據庫也有了更進一步的掌握。

數據庫設計的設計內容包括:需求分析、概念結構設計、邏輯結構設計、物理結構設計、數據庫的實施和數據庫的運行和維護。

數據庫設計是指對於一個給定的應用環境,構造最優的數據庫模式,創建數據庫及其應用系統,使之可以有效地存儲數據,知足各類用戶的應用需求(信息要求和處理要求)。在數據庫領域內,經常把使用數據庫的各種系通通稱爲數據庫應用系統

咱們要搭建後臺,與MySQL相鏈接,多是因爲我電腦的問題,MySQL常常自動關閉,這個時候要打開電腦的管理,去服務那裏設置爲自動。有時候百度能解決不少問題。

鏈接數據庫前,要先確認如下事項:

  • 已經建立了數據庫 TESTDB.
  • 在TESTDB數據庫中您已經建立了表 EMPLOYEE
  • EMPLOYEE表字段爲 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME。
  • 鏈接數據庫TESTDB使用的用戶名爲 "testuser" ,密碼爲 "test123",你能夠能夠本身設定或者直接使用root用戶名及其密碼,Mysql數據庫用戶受權請使用Grant命令。
  • 在你的機子上已經安裝了 Python MySQLdb 模塊。

再者,數據庫要明確步驟,需求分析、概念設計、邏輯設計、物理設計、驗證設計和運行維護設計,這些都缺一不可。

from flask import Flask
from exts import db #數據庫使用方法
import config #數據庫鏈接文件
from apps.front import bp as front_bp #鏈接前端數據文件

E.系統實現的關鍵算法與數據結構

def create_app():
app = Flask(__name__)
app.config.from_object(config)
app.register_blueprint(front_bp)
db.init_app(app)

return app


if __name__ == '__main__':
app = create_app()
app.run(port=8000)
#點贊功能
@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('F:/godlike/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))

 F.主要代碼:

#搜索功能
@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('F:/godlike/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())

#註銷
@bp.route('/logout/')
@login_required
def logout():
del session[config.FRONT_USER_ID]
return redirect(url_for('front.index'))
#註冊功能後臺視圖
class SignupView(views.MethodView):
def get(self):
return_to = request.referrer
if return_to and return_to != request.url and safeutils.is_safe_url(return_to):
return render_template('front/front_signup.html',return_to=return_to)
else:
return render_template('front/front_signup.html')
def post(self):
form = SignupForm(request.form)
if form.validate():
email = form.email.data
username = form.username.data
password = form.password1.data
user = FrontUser(email=email,username=username,password=password)
db.session.add(user)
db.session.commit()
return restful.success()
else:
print(form.get_error())
return restful.params_error(message=form.get_error())
#登陸功能後臺視圖
class SigninView(views.MethodView):
def get(self):
return_to = request.referrer
if return_to and return_to != request.url and return_to != url_for("front.signup") and safeutils.is_safe_url(
return_to):
return render_template('front/front_signin.html', return_to=return_to)
else:
return render_template('front/front_signin.html')
def post(self):
form =SigninForm(request.form)
if form.validate():
email = form.email.data
password = form.password.data
remember = form.remeber.data
user = FrontUser.query.filter_by(email=email).first()
if user and user.check_password(password):
session[config.FRONT_USER_ID]=user.id
if remember:
session.permanent= True
return restful.success()
else:
return restful.params_error(message='郵箱或密碼錯誤!')
else:
return restful.params_error(message=form.get_error())

首頁代碼:
{% from "common/_macros.html" import static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% include "common/_heads.html" %}
<link rel="stylesheet" href="{{ static('front/css/front_base.css') }}">
<title>
{% block title %}{% endblock %}
</title>
{% block head %}{% endblock %}
</head>
<body>
<div class="banner">

<ul style="">
<li class="first"><a href="{{ url_for("front.index") }}">論壇首頁</a></li>
<li class="first"><a href="{{ url_for("front.index") }}">全部文章</a></li>
<li class="first"><a href="">熱門精選</a></li>
<li class="first"><a href="{{ url_for("front.apost") }}">發佈帖子</a></li>
{# <!--<li class="first"><a href=""></a></li>-->#}
</ul>

<div class="banner_search">
<form action="{{ url_for('front.search') }}" method="get">
<input type="text" name="q" id="" value="" placeholder="請輸入關鍵字"/>
<button type="submit">搜索</button>
</form>
</div>
<div class="banner_right">
{% if g.front_user %}
<span id="login-tag" data-is-login="1" style="display: none;"></span>
<a href="{{ url_for('front.usercenter',user_id=g.front_user.id,tag="1") }}">{{ g.front_user.username }}</a>
<span>or</span>
<a href="{{ url_for('front.logout') }}">註銷</a>
{% else %}
<a href="{{ url_for('front.signin') }}">登陸</a>
<span>or</span>
<a href="{{ url_for("front.signup") }}">註冊</a>
{% endif %}
</div>
</div>


<div class="main-container">
{% block body %}{% endblock %}
</div>

</body>
</html>
帖子加精:
{% from "common/_macros.html" import static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>帖子加精</title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
{% include "common/_heads.html" %}
<script src="{{ static("front/js/jiajing.js") }}"></script>
</head>
<body>
<div style="width: 1000px; margin: 50px auto; ">
<table class="table table-bordered" style="text-align: center">
<thead>
<tr>
<th>帖子標題</th>
<th>做者</th>
<th>發佈時間</th>
<th>所屬板塊</th>
<th>操做</th>
</tr>
</thead>
{% for foo in post %}
<tr data-id="{{ foo.id }}" data-highlight="{{ 1 if foo.highlight else 0}}">

<th><a target="_blank" href="{{ url_for("front.post_detail",post_id=foo.id) }}">{{ foo.title }}</a></th>
<th>{{ foo.author.username }}</th>
<th>{{ foo.board.name }}</th>
<th>{{ foo.create_time }}</th>
<th>
{% if foo.highlight %}
<button type="button" class="btn btn-default highlight-btn">取消加精</button>
{% else%}
<button type="button" class="btn btn-danger highlight-btn">加精</button>
{% endif %}

</th>



</tr>
{% endfor %}
</table>
</div>
</body>
</html>

G.成品展現

論壇首頁:

註冊頁面:

 

格式不標準時:

 

登陸界面:

登陸成功:

 

發佈帖子:

發佈成功:

若是要設置帖子等級,須要數據庫後臺改id:

 

點贊和評論功能:

 

 

我的中心:

 

 修改密碼:

 

 

密碼不一致時:

 

搜索帖子:

 

 

 我的總結:在本學期的課程設計當中,儘管是基於上學期的知識上的改進,但仍是有點不完美的。在一開始要搭建各類虛擬環境,雖然有視頻教學,但大部分仍是要靠本身去領悟理解。如何讓頁面佈局更加美觀,完善具體功能,如何熟練運用Python+Flask+MysqL的web建設技術,都是要靠本身去摸索領悟的。不要懼怕代碼報錯,一步步解決才能學到更多。

相關文章
相關標籤/搜索