zoukankan      html  css  js  c++  java
  • Flask构建微电影(二)

    第三章、项目分析、搭建目录及模型设计

    3.1.前后台项目目录分析

    微电影网站

    • 前台模块
    • 后台模块

     前台(home)

    • 数据模型:models.py
    • 表单处理:home/forms.py
    • 模板目录:templates/home

     后台(admin)

    • 数据模型:models.py
    • 表单处理:admin/forms.py
    • 模板目录:templates/admin
    • 静态文件:static

    开始创建目录,如下:

     

    3.2.蓝图构建项目目录

    什么是蓝图?

    一个应用中或跨用用制作应用组件和支持通用的模式

    蓝图的作用

    • 将不同的功能模块化

    • 构建大型应用
    • 优化项目结构
    • 增强可读性,易于维护

    如何使用蓝图构建项目目

    (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 adminG;

    上一篇:Flask构建微电影(一)

     

  • 相关阅读:
    O(n)回文子串(Manacher)算法
    LightOJ 1282
    LightOJ
    LightOJ
    POJ-2563
    POJ-2398
    POJ-2318
    ZOJ-3318
    [svc]ftp协议数据连接的2种模式
    [py]python中的特殊类class type和类的两面性图解
  • 原文地址:https://www.cnblogs.com/derek1184405959/p/9038294.html
Copyright © 2011-2022 走看看