該網站採用python+flask+mysql的web建設技術,用戶能夠發表問答的評論,以及對問答的一些點贊和收藏功能,能夠根據用戶的關鍵字搜索文章,向用戶推薦類似文章等。 css
註冊頁面:用戶註冊,儲存在數據庫,而後用戶進行註冊驗證;html
登陸:用戶註冊完後,進入網站;前端
註銷:將網頁註冊賬號的正常狀態轉爲未登陸狀態,多個用戶時,也能夠退出這個用戶,轉入另外一個用戶,也泛指刪除與取消用戶與賬號的激活狀態;python
用戶發佈功能:用戶能夠發表本身見解和建議,問答存儲到數據庫中;mysql
詳情頁:詳情頁中具備評論及推薦文章功能,用戶可對新聞進行評論發表還可對文章進行點贊及收藏,此操做過程存入數據庫,以用戶id、新聞id做爲外鍵;網站還根據用戶感興趣的新聞推薦類似類型的新聞文章。web
我的中心:根據用戶的活躍度,呈現用戶發佈的新聞,評論文章,收藏文章以及點贊。算法
搜索:能夠根據用戶輸入關鍵詞進行模糊搜索,同時也能夠條件組合搜索。sql
2.網站結構設計數據庫
python是一種面向對象的解釋型計算機程序設計語言,具備豐富和強大的庫,它有高效率的高層數據結構,能簡單而有效地實現面向對象編程。Python簡潔的語法和對動態輸入的支持,再加上解釋性語言的本質,使得它在大多數平臺上的不少領域都是一個理想的腳本語言,特別適用於快速的應用程序開發。編程
Flask,是一個使用 Python 編寫的輕量級 Web 應用框架,使用簡單的核心,用 extension 增長其餘功能。
Mysql,是一種關係數據庫管理系統,關係數據庫將數據保存在不一樣的表中,而不是將全部數據放在一個大倉庫內。這三者相結合的web建設技術,我在這其中感覺到了代碼奇特的魅力。雖然有課本,可是僅僅掌握課本知識並不足以完成,還須要多多上機操做,熟悉代碼運用在哪裏,得出相對應的功能,基本功能都能準確無誤的給予數據支持。在這次建站過程當中,前端界面採用的是html、css、JavaScript,後端採用python做爲支持。
3.模塊詳細設計
3.數據庫設計
根據數據庫規範的設計方法,把數據庫的設計分爲如下六個階段:①.需求分析階段 .②慨念結構設計 ③.邏輯結構設計 ④物理結構設計 ⑤數據庫實施 ⑥.數據庫的運行和維護
共有5張表:
4.系統實現的關鍵算法與數據結構
評論,收藏,點贊:
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')) fabu_id = db.Column(db.Integer, db.ForeignKey('fabu.id')) creat_time = db.Column(db.DateTime, default=datetime.now) detail = db.Column(db.Text, nullable=False) fabu = db.relationship('Fabu', backref=db.backref('comments', order_by=creat_time.desc)) # order_by=creat_time.desc按時間降序 author = db.relationship('User', backref=db.backref('comments')) class Shoucang(db.Model): # 收藏 __tablename__ = 'shoucang' id = db.Column(db.Integer, primary_key=True, autoincrement=True) author_id = db.Column(db.Integer, db.ForeignKey('user.id')) fabu_id = db.Column(db.Integer, db.ForeignKey('fabu.id')) fabu = db.relationship('Fabu', backref=db.backref('shoucangs')) author = db.relationship('User', backref=db.backref('shoucangs')) class Dianzang(db.Model): # 點贊 __tablename__ = 'dianzang' id = db.Column(db.Integer, primary_key=True, autoincrement=True) author_id = db.Column(db.Integer, db.ForeignKey('user.id')) fabu_id = db.Column(db.Integer, db.ForeignKey('fabu.id')) fabu = db.relationship('Fabu', backref=db.backref('dianzangs')) author = db.relationship('User', backref=db.backref('dianzangs'))
# 跳轉首頁搜索
@app.route('/search/') def search(): sousuo = request.args.get('sousuo') # args獲取關鍵字,區別form author = User.query.all() ydfabu = Fabu.query.filter(Fabu.yuedu > 5).all() fabus = Fabu.query.filter( or_( # 兩種查詢條件 Fabu.title.contains(sousuo), # contains模糊查 Fabu.detail.contains(sousuo) ) ).order_by('-creat_time') return render_template('daohang.html', fabus=fabus, author=author, ydfabu=ydfabu) # fabus要和原首頁數據模型同樣 # 跳轉高級分類查詢 @app.route('/fenlei/') def fenlei(): fenlei = request.args.get('fenlei') # args獲取關鍵字,區別form author = User.query.all() ydfabu = Fabu.query.filter(Fabu.yuedu > 5).all() fenlei_fabus = Fabu.query.filter( or_( # 兩種查詢條件 # Fabu.title.contains(fenlei), # contains模糊查 Fabu.leixing.contains(fenlei), # Fabu.creat_time.contains(fenlei) ) ).order_by('-creat_time') return render_template('daohang.html', fabus=fenlei_fabus, author=author, ydfabu=ydfabu) # fabus要和原首頁數據模型同樣
上傳頭像:
#上傳頭像 @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/img', f.filename) # 注意:沒有的文件夾必定要先建立,否則會提示沒有該路徑 f.save(upload_path) user.img = 'img/' + f.filename db.session.commit() return redirect(url_for('yonghu', username_id=user_id,tag=1));
跳轉登陸:
# 跳轉登陸 @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['user_id'] = user.id session.permanent = True # 設置session過時的時間 return redirect(url_for('daohang')) else: return u'用戶密碼錯誤' else: return u'用戶不存在,請先註冊'
跳轉首頁:
@app.route('/') def daohang(): pl = request.args.get('pl') # 接收順序排列的關鍵詞,接收不到就按時間排列 if pl == '按熱度': context = { 'fabus': Fabu.query.order_by('-yuedu').all(), 'author': User.query.all(), 'ydfabu': Fabu.query.filter(Fabu.yuedu > 5).all() # 當發佈的文章閱讀量大於多少時取出這些文章,顯示在首頁的推薦文章 # order_by('-creat_time')按時間降序排列,Fabu.query.all()查出了Fabu類的全部元組 } return render_template('daohang.html', **context) else: context = { 'fabus': Fabu.query.order_by('-creat_time').all(), 'author': User.query.all(), 'ydfabu': Fabu.query.filter(Fabu.yuedu > 5).all() # 當發佈的文章閱讀量大於多少時取出這些文章,顯示在首頁的推薦文章 # order_by('-creat_time')按時間降序排列,Fabu.query.all()查出了Fabu類的全部元組 } return render_template('daohang.html', **context)
# 插入功能 user = User(username='15',password='12') db.session.add(user) db.session.commit() # 查詢功能 user=User.query.filter(User.username=="15").first() print(user.username,user.password) # 修改功能 user=User.query.filter(User.username=="15").first() user.password='888' db.session.commit() # 刪除功能 user=User.query.filter(User.username=="15").first() db.session.delete(user) db.session.commit()
5.成品展現: