Flask構建微電影(二)

第三章、項目分析、搭建目錄及模型設計

3.1.先後臺項目目錄分析

微電影網站html

  • 前臺模塊
  • 後臺模塊

 前臺(home)python

  • 數據模型:models.py
  • 表單處理:home/forms.py
  • 模板目錄:templates/home

 後臺(admin)mysql

  • 數據模型:models.py
  • 表單處理:admin/forms.py
  • 模板目錄:templates/admin
  • 靜態文件:static

開始建立目錄,以下:sql

 

 

3.2.藍圖構建項目目錄

什麼是藍圖?數據庫

一個應用中或跨用用製做應用組件和支持通用的模式flask

藍圖的做用session

  • 將不一樣的功能模塊化app

  • 構建大型應用
  • 優化項目結構
  • 加強可讀性,易於維護

如何使用藍圖構建項目目ide

(1)home/__init__.py模塊化

#coding:utf-8
__author__ = 'derek'

from flask import Blueprint

home = Blueprint("home",__name__)

import app.home.views

(2)admin/__init__.py

#coding:utf-8
__author__ = 'derek'

from flask import Blueprint

admin = Blueprint("admin",__name__)

import app.admin.views

(3)home/views.py

#coding:utf-8
__author__ = 'derek'

from . import home    #導入藍圖

@home.route("/")
def index():
    return "<h1 style='color:green'>this is home</h1>"

(4)admin/views.py

#coding:utf-8
__author__ = 'derek'

from . import admin   #導入藍圖

@admin.route("/")
def index():
    return "<h1 style='color:red'>this is admin</h1>"

(5)app/__init__.py

#coding:utf-8
__author__ = 'derek'

from flask import Flask
app = Flask(__name__)
app.debug = True    #調式模式

#導入藍圖對象,而後起個別名,易於區分
from app.home import home as home_blueprint
from app.admin import admin as admin_blueprint

#註冊藍圖
app.register_blueprint(home_blueprint)
app.register_blueprint(admin_blueprint,url_prefix = "/admin")   #url_prefix添加前綴

(6)app/manage.py

#coding:utf-8
__author__ = 'derek'

from app import app         # 導入的app是app/__init__中實例化的對象:app = Flask(__name__)

if __name__ == '__main__':
    app.run()

(7)運行項目(manage,py)

home

admin

3.3.會員及會員登陸日誌數據模型設計

 (1)安裝flask-sqlalchemy

pip install -i https://pypi.douban.com/simple --trusted-host pypi.douban.com flask-sqlalchemy

 (2)app/models.py

    Flask-SQLAlchemy 配置

 表結構的設計

#coding:utf-8
__author__ = 'derek'
from datetime import datetime
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
app
= Flask(__name__) #鏈接mysql數據庫(用戶名、密碼、ip、端口和數據庫名字) app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:123456@127.0.0.1:3306/movie" app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True db = SQLAlchemy(app) #會員 class User(db.Model): #繼承db.Model __tablename__ = "user" #數據庫中表顯示的名字 id = db.Column(db.Integer,primary_key=True) #編號,int類型,主鍵 name = db.Column(db.String(100),unique=True) #暱稱,字符串類型(長度100),惟一 pwd = db.Column(db.String(100)) #密碼 email = db.Column(db.String(100),unique=True) #郵箱 phone = db.Column(db.String(11),unique=True) #手機 info = db.Column(db.Text) #個性簡介 face = db.Column(db.String(255),unique=True) #頭像 addtime = db.Column(db.DateTime,index=True,default=datetime.now) #添加時間 uuid = db.Column(db.String(255),unique=True) #惟一標識符 userlogs = db.relationship('UserLog',backref='user') #會員日誌外鍵關係 def __repr__(self): return "<User %r>"%self.name #會員登陸日誌 class UserLog(db.Model): __tablename__ = "userlog" id = db.Column(db.Integer,primary_key=True) #編號 #跟User表的id外鍵關聯,類名小寫 user_id = db.Column(db.Integer,db.ForeignKey('user.id')) #所屬會員 ip = db.Column(db.String(100)) #登陸ip addtime = db.Column(db.DateTime,index=True,default=datetime.now) #登陸時間 def __repr__(self): return "<UserLog %r>"%self

3.4.標籤、電影、上映預告數據模型設

class Tag(db.Model):
    __tablename__ = "tag"
    id = db.Column(db.Integer,primary_key=True)        #編號
    name = db.Column(db.String(100),unique=True)       #標題
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)   #添加時間
    movies = db.relationship("Movie",backref="tag")    #電影外鍵關係關聯

    def __repr__(self):
        return "<Tag %r>"%self.name


#電影
class Movie(db.Model):
    __tablename__ = "movie"
    id = db.Column(db.Integer,primary_key=True)       #編號
    title = db.Column(db.String(255),unique=True)     #標題
    url = db.Column(db.String(255),unique=True)       #地址
    info = db.Column(db.Text)                          #簡介
    logo = db.Column(db.String(255),unique=True)      #封面
    star = db.Column(db.SmallInteger)                  #星級
    playnum = db.Column(db.BigInteger)                #播放量
    commentnum = db.Column(db.BigInteger)             #評論數
    tag_id = db.Column(db.Integer,db.ForeignKey('tag.id'))   #所屬標籤
    area = db.Column(db.String(255))                  #上映地區
    release_time = db.Column(db.Date)                 #上映時間
    length = db.Column(db.String(100))                #電影播放時間
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)   #添加時間

    def __repr__(self):
        return "<Movie %r>"%self.title


#電影上映預告
class Preview(db.Model):
    __tablename__ = "preview"
    id = db.Column(db.Integer,primary_key=True)
    title = db.Column(db.String(255),unique=True)
    logo = db.Column(db.String(255),unique=True)
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)

    def __repr__(self):
        return "<Preview %r>"%self.title

 

3.5.評論及收藏電影數據模型設計

#評論
class Comment(db.Model):
    __tablename__ = "comment"
    id = db.Column(db.Integer,primary_key=True)        #編號
    content = db.Column(db.Text)                       #內容
    movie_id = db.Column(db.Integer,db.ForeignKey("movie.id"))    #所屬電影
    user_id = db.Column(db.Integer,db.ForeignKey("user.id"))      #所屬用戶
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)    #添加時間

    def __repr__(self):
        return "Comment %r"%self.id


#電影收藏
class Moviecol(db.Model):
    __tablename__ = "moviecol"
    id = db.Column(db.Integer, primary_key=True)  # 編號
    movie_id = db.Column(db.Integer, db.ForeignKey("movie.id"))  # 所屬電影
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"))  # 所屬用戶
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加時間

    def __repr__(self):
        return "Moviecol %r" % self.id

 要對應的跟User和Movie關聯起來

class User(db.Model): 
    .
    .
    .
    comments = db.relationship("Comment",backref="user")   #評論外鍵關係關聯
    moviecols = db.relationship("Moviecol",backref="user")   #電影收藏外鍵關係關聯              
class Movie(db.Model):
    '
    '
    '
    comments = db.relationship("Comment",backref="movie" )          #評論外鍵關係關聯
    moviecols = db.relationship("Moviecol",backref="movie" )          #電影收藏外鍵關係關聯    

 

3.6.權限及角色數據模型設計

#權限
class Auth(db.Model):
    __tablename__ = "auth"
    id = db.Column(db.Integer,primary_key=True)       #編號
    name = db.Column(db.String(100),unique=True)      #名稱
    url = db.Column(db.String(255),unique=True)       #地址
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)   #添加時間

    def __repr__(self):
        return "<Auth %r>"%self.name


#角色
class Role(db.Model):
    __tablename__ = "role"
    id = db.Column(db.Integer,primary_key=True)     #編號
    name = db.Column(db.String(100),unique=True)    #名稱
    auths = db.Column(db.String(600))               #權限列表
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)   #添加時間

    def __repr__(self):
        return "<Role %r>"%self.name

 

3.7.管理員、登陸日誌、操做日誌數據模型設計

#管理員
class Admin(db.Model):
    __tablename__ = "admin"
    id = db.Column(db.Integer,primary_key=True)    #編號
    name = db.Column(db.String(100),unique=True)   #管理員帳號
    pwd = db.Column(db.String(100))                 #管理員面
    is_super = db.Column(db.SmallInteger)           #是否爲超級管理員,0爲超級管理員
    role_id = db.Column(db.Integer,db.ForeignKey("role.id"))     #所屬角色
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)   #添加時間
    adminlogs = db.relationship("Adminlog",backref='admin')     #管理員登陸日誌外鍵關係關聯
    oplogs = db.relationship("Oplog",backref='admin')           #管理員操做日誌外鍵關係關聯

    def __repr__(self):
        return "<Admin %r>"%self.id


#管理員登陸日誌
class Adminlog(db.Model):
    __tablename__ = "adminlog"
    id = db.Column(db.Integer,primary_key=True)            #編號
    admin_id = db.Column(db.Integer,db.ForeignKey("admin.id"))     #所屬管理員
    ip = db.Column(db.String(100))        #登陸ip
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)   #登陸時間

    def __repr__(self):
        return "Adminlog %r"%self.id


#操做日誌
class Oplog(db.Model):
    __tablename__ = "oplog"
    id = db.Column(db.Integer,primary_key=True)            #編號
    admin_id = db.Column(db.Integer,db.ForeignKey('admin.id'))     #所屬管理員
    ip = db.Column(db.String(100))        #登陸ip
    reason = db.Column(db.String(600))    #操做緣由
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)   #登陸時間

    def __repr__(self):
        return "Oplog %r" % self.id

 

3.8.生成數據庫表

(1)建立數據庫

create database derek default charset utf8 collate utf8_general_ci;

(2)安裝pymysql

pip install pymysql

(3)在models.py下面加上代碼,而後運行,就生成到數據庫裏面了

if __name__ == '__main__':
    db.create_all()
#coding:utf-8
__author__ = 'derek'

import pymysql
from flask import Flask
from datetime import datetime

from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
#鏈接mysql數據庫(用戶名、密碼、ip、端口和數據庫名字)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:123456@127.0.0.1:3306/movie"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True

db = SQLAlchemy(app)

#會員
class User(db.Model):        #繼承db.Model
    __tablename__ = "user"    #數據庫中表顯示的名字
    id = db.Column(db.Integer,primary_key=True)     #編號,int類型,主鍵
    name = db.Column(db.String(100),unique=True)    #暱稱,字符串類型(長度100),惟一
    pwd = db.Column(db.String(100))                  #密碼
    email = db.Column(db.String(100),unique=True)    #郵箱
    phone = db.Column(db.String(11),unique=True)     #手機
    info = db.Column(db.Text)                         #個性簡介
    face = db.Column(db.String(255),unique=True)      #頭像
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)   #添加時間
    uuid = db.Column(db.String(255),unique=True)      #惟一標識符
    userlogs = db.relationship('UserLog',backref='user')   #會員日誌外鍵關係
    comments = db.relationship("Comment",backref="user")   #評論外鍵關係關聯
    moviecols = db.relationship("Moviecol",backref="user")   #電影收藏外鍵關係關聯

    def __repr__(self):
        return "<User %r>"%self.name


#會員登陸日誌
class UserLog(db.Model):
    __tablename__ = "userlog"
    id = db.Column(db.Integer,primary_key=True)        #編號
    #跟User表的id外鍵關聯,類名小寫
    user_id = db.Column(db.Integer,db.ForeignKey('user.id'))    #所屬會員
    ip = db.Column(db.String(100))        #登陸ip
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)   #登陸時間

    def __repr__(self):
        return "<UserLog %r>"%self.id


#標籤
class Tag(db.Model):
    __tablename__ = "tag"
    id = db.Column(db.Integer,primary_key=True)        #編號
    name = db.Column(db.String(100),unique=True)       #標題
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)   #添加時間
    movies = db.relationship("Movie",backref="tag")    #電影外鍵關係關聯

    def __repr__(self):
        return "<Tag %r>"%self.name


#電影
class Movie(db.Model):
    __tablename__ = "movie"
    id = db.Column(db.Integer,primary_key=True)       #編號
    title = db.Column(db.String(255),unique=True)     #標題
    url = db.Column(db.String(255),unique=True)       #地址
    info = db.Column(db.Text)                          #簡介
    logo = db.Column(db.String(255),unique=True)      #封面
    star = db.Column(db.SmallInteger)                  #星級
    playnum = db.Column(db.BigInteger)                #播放量
    commentnum = db.Column(db.BigInteger)             #評論數
    tag_id = db.Column(db.Integer,db.ForeignKey('tag.id'))   #所屬標籤
    area = db.Column(db.String(255))                  #上映地區
    release_time = db.Column(db.Date)                 #上映時間
    length = db.Column(db.String(100))                #電影播放時間
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)   #添加時間
    comments = db.relationship("Comment",backref="movie" )          #評論外鍵關係關聯
    moviecols = db.relationship("Moviecol",backref="movie" )          #電影收藏外鍵關係關聯

    def __repr__(self):
        return "<Movie %r>"%self.title


#電影上映預告
class Preview(db.Model):
    __tablename__ = "preview"
    id = db.Column(db.Integer,primary_key=True)
    title = db.Column(db.String(255),unique=True)
    logo = db.Column(db.String(255),unique=True)
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)

    def __repr__(self):
        return "<Preview %r>"%self.title


#評論
class Comment(db.Model):
    __tablename__ = "comment"
    id = db.Column(db.Integer,primary_key=True)        #編號
    content = db.Column(db.Text)                       #內容
    movie_id = db.Column(db.Integer,db.ForeignKey("movie.id"))    #所屬電影
    user_id = db.Column(db.Integer,db.ForeignKey("user.id"))      #所屬用戶
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)    #添加時間

    def __repr__(self):
        return "Comment %r"%self.id


#電影收藏
class Moviecol(db.Model):
    __tablename__ = "moviecol"
    id = db.Column(db.Integer, primary_key=True)  # 編號
    movie_id = db.Column(db.Integer, db.ForeignKey("movie.id"))  # 所屬電影
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"))  # 所屬用戶
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 添加時間

    def __repr__(self):
        return "Moviecol %r" % self.id


#權限
class Auth(db.Model):
    __tablename__ = "auth"
    id = db.Column(db.Integer,primary_key=True)       #編號
    name = db.Column(db.String(100),unique=True)      #名稱
    url = db.Column(db.String(255),unique=True)       #地址
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)   #添加時間

    def __repr__(self):
        return "<Auth %r>"%self.name


#角色
class Role(db.Model):
    __tablename__ = "role"
    id = db.Column(db.Integer,primary_key=True)     #編號
    name = db.Column(db.String(100),unique=True)    #名稱
    auths = db.Column(db.String(600))               #權限列表
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)   #添加時間

    def __repr__(self):
        return "<Role %r>"%self.name


#管理員
class Admin(db.Model):
    __tablename__ = "admin"
    id = db.Column(db.Integer,primary_key=True)    #編號
    name = db.Column(db.String(100),unique=True)   #管理員帳號
    pwd = db.Column(db.String(100))                 #管理員面
    is_super = db.Column(db.SmallInteger)           #是否爲超級管理員,0爲超級管理員
    role_id = db.Column(db.Integer,db.ForeignKey("role.id"))     #所屬角色
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)   #添加時間
    adminlogs = db.relationship("Adminlog",backref='admin')     #管理員登陸日誌外鍵關係關聯
    oplogs = db.relationship("Oplog",backref='admin')           #管理員操做日誌外鍵關係關聯

    def __repr__(self):
        return "<Admin %r>"%self.id


#管理員登陸日誌
class Adminlog(db.Model):
    __tablename__ = "adminlog"
    id = db.Column(db.Integer,primary_key=True)            #編號
    admin_id = db.Column(db.Integer,db.ForeignKey("admin.id"))     #所屬管理員
    ip = db.Column(db.String(100))        #登陸ip
    addtime = db.Column(db.DateTime,index=True,default=datetime.now)   #登陸時間

    def __repr__(self):
        return "Adminlog %r"%self.id


#操做日誌
class Oplog(db.Model):
    __tablename__ = "oplog"
    id = db.Column(db.Integer,primary_key=True)            #編號
    admin_id = db.Column(db.Integer,db.ForeignKey('admin.id'))     #所屬管理員
    ip = db.Column(db.String(100))        #登陸ip
    reason = db.Column(db.String(600))    #操做緣由
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)   #登陸時間

    def __repr__(self):
        return "Oplog %r" % self.id
models.py全部代碼

(4)查看數據庫

show databases;
user movie;
show tables;

 

(5)添加一個角色

if __name__ == '__main__':
    # db.create_all()

    role = Role(
        name="超級管理員",
        auths=""
    )
    db.session.add(role)
    db.session.commit()

取數據庫查看

desc role;
select * from role;

 

 (6)添加一個管理員

密碼保存的時候採用hash加密

if __name__ == '__main__':
    # db.create_all()
    #添加角色
    # role = Role(
    #     name="超級管理員",
    #     auths=""
    # )
    # db.session.add(role)
    # db.session.commit()

    #添加管理員
    #對密碼加密保存
    from werkzeug.security import generate_password_hash

    admin = Admin(
        name="derek",
        pwd=generate_password_hash("123456"),
        is_super=0,
        role_id=1
    )
    db.session.add(admin)
    db.session.commit()

查看數據庫

select * from admin\G;

 

上一篇:Flask構建微電影(一)

相關文章
相關標籤/搜索