基于flask的微电影管理系统——数据库表创建(一)

一.创建flask框架

在这里插入图片描述

二.编写数据库中需要的表,导入各模块

init.py中

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()        # 解决数据库报错问题
from flask_script import Manager  # 命令行操作数据库
from flask_migrate import Migrate  # 数据库迁移
from flask_moment import Moment  # 时间的问题解决
from flask_bootstrap import Bootstrap  # 导入bootstrap样式


app=Flask(__name__)
# 读取配置文件的配置信息
app.config.from_pyfile('../config.py')
db=SQLAlchemy(app)
manager=Manager(app)
migrate=Migrate(db,app)
moment=Moment(app)
bootstrap=Bootstrap(app)

config.py中配置文件

SQLALCHEMY_DATABASE_URI='mysql://root:redhat@localhost/MovieProject'
SQLALCHEMY_TRACK_MODIFICATIONS=True
SECRET_KEY='password'
# 用户上传信息存储位置的配置
BASEDIR = os.path.abspath(os.path.dirname(__file__))  # 获取当前项目所在目录的绝对路径
# /root/PycharmProjects/day38_MovieProject/app/static/upload/userFaceImg/
FC_DIR_LAST='upload/userFaceImg/'
FC_DIR = os.path.join(BASEDIR, 'app/static',FC_DIR_LAST )
# 电影文件保存位置
MOVIE_UP_DIR_LAST = 'upload/movieImg/'
MOVIE_UP_DIR = os.path.join(BASEDIR, 'app/static', MOVIE_UP_DIR_LAST)
# 预告文件保存位置
PREVIEW_UP_DIR_LAST = 'upload/previewImg/'
PREVIEW_UP_DIR = os.path.join(BASEDIR, 'app/static', 'upload/previewImg/')

# 分页的配置
PER_PAGE = 5

models.py具体的数据库要求

from datetime import datetime

from app import db


# 关联
#   1. 标签(1)和电影(n):
#   2. 电影(1)和评论(n)
#   3. 用户(1)和评论(n)
#   4. 用户(1)和用户登录日志(n)
#   5. 角色(1)和管理员(n)


# 标签表
class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50), unique=True, index=True)  # 标签名称, 不能重复;
    addtime = db.Column(db.DateTime, default=datetime.utcnow())

    # 关联其他表
    movies = db.relationship('Movie', backref='tag')  # 反向关联, 让Movie表多一个属性, tag

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


# 电影表
class Movie(db.Model):
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    name = db.Column(db.String(50), index=True) 
    addtime = db.Column(db.DateTime, default=datetime.utcnow())  # 创建时间
    info = db.Column(db.Text)  # 电影简介
    star = db.Column(db.SmallInteger)  # 电影的星级
    area = db.Column(db.String(50))  # 地区
    length = db.Column(db.String(20))  # 片长
    release_time = db.Column(db.Date)  # 上映时间
    url = db.Column(db.String(200))  # 上传电影内容的url地址;
    logo = db.Column(db.String(200))  # 上传电影封面的url地址;
    play_num=db.Column(db.Integer,default=0) #播放量
    comment_num=db.Column(db.Integer,default=0) #评论量
    # 关联其他表
    tag_id = db.Column(db.Integer, db.ForeignKey('tag.id'))  # 标签的外键关联
    comments = db.relationship('Comment', backref="movie")  # 电影和评论的反向引用
    moviecollects = db.relationship('MovieCollect', backref='movie')

    def __repr__(self):
        return '<Movie %s>' % (self.name)


# 预告管理表
class Preview(db.Model):
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    name = db.Column(db.String(50), unique=True, index=True)  # 名称, 不能重复;
    addtime = db.Column(db.DateTime, default=datetime.utcnow())  # 创建时间
    logo = db.Column(db.String(200), unique=True)  # 上传预告封面的url地址;

    def __repr__(self):
        return "<Preview %s>" % (self.name)


# 会员管理数据库
class User(db.Model):
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    name = db.Column(db.String(30), unique=True)
    password = db.Column(db.String(300))
    email = db.Column(db.String(50), unique=True)  # 邮箱地址
    phone = db.Column(db.String(20), unique=True)  # ********电话号码不能使用整形
    face = db.Column(db.String(200), unique=True)  # 用户头像url地址
    gender = db.Column(db.Boolean)  # 性别

    # 关联其他表
    comments = db.relationship('Comment', backref='user')  # 用户和评论的反向关联
    userlogs = db.relationship('Userlog', backref='user')  # 会员和会员登录日志的反向关联
    moviecollects = db.relationship('MovieCollect', backref='user')

    # 添加简介这一列信息
    info = db.Column(db.Text)

    def verify_password(self, password):
        from werkzeug.security import check_password_hash
        # 判断密码是否正确
        return check_password_hash(self.password, password)

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


# 电影评论数据表: 评论和用户/电影关联
class Comment(db.Model):
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    content = db.Column(db.String(50), unique=True, index=True)  # 评论的内容
    addtime = db.Column(db.DateTime, default=datetime.utcnow())  # 创建时间

    # 关联其他表
    movie_id = db.Column(db.Integer, db.ForeignKey('movie.id'))  # 电影和评论的外键关联
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 电影和用户的关联

    def __repr__(self):
        return "<Comment %s>" % (self.content[:6])


# 会员登录日志表
class Userlog(db.Model):
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    addtime = db.Column(db.DateTime, default=datetime.utcnow())  # 创建时间
    ip = db.Column(db.String(30))  # 用户登录的ip
    area = db.Column(db.String(50))  # 用户客户端登录所在的地理位置

    # 关联其他表
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 会员和会员登录日志之间的关联

    def __repr__(self):
        return 'Userlog %s' % (self.ip)


# 权限管理的数据库表
class Auth(db.Model):
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    addtime = db.Column(db.DateTime, default=datetime.utcnow())  # 创建时间
    name = db.Column(db.String(30), unique=True)  # 权限的名称
    url = db.Column(db.String(50), unique=True)  # 权限的url地址

    # 为了设置标签管理员有两个以上的权限,所以不能关联
    # role_id = db.Column(db.Integer, db.ForeignKey('role.id'))

    def __repr__(self):
        return '<Auth %s>' % (self.name)


# 角色管理
class Role(db.Model):
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    addtime = db.Column(db.DateTime, default=datetime.utcnow())  # 创建时间
    name = db.Column(db.String(30), unique=True)  # 角色的名称
    # auths = db.relationship('Auth', backref='role')

    # 关联其他表
    auths = db.Column(db.String(100))  # '1,2,3,4'
    admins = db.relationship('Admin', backref='role')

    def __repr__(self):
        return '<Role %s>' % (self.name)


# 管理员数据表
class Admin(db.Model):
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    addtime = db.Column(db.DateTime, default=datetime.utcnow())  # 创建时间
    name = db.Column(db.String(30), unique=True)  # 名称
    password = db.Column(db.String(100))
    is_super = db.Column(db.Boolean, default=False)  # 是否为超级管理员(可以做任何操作), 默认不是

    # 关联其他表
    role_id = db.Column(db.Integer, db.ForeignKey('role.id'))  # 角色和管理员的关联
    adminlogs = db.relationship("Adminlog", backref='admin')  # 管理员登录日志
    adminOplogs = db.relationship('AdminOplog', backref='admin')  # 管理员操作日志

    def verify_password(self, password):
        from werkzeug.security import check_password_hash
        # 判断密码是否正确
        return check_password_hash(self.password, password)

    def __repr__(self):
        return "<Admin %s>" % (self.name)


# 管理员登录日志
class Adminlog(db.Model):
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    addtime = db.Column(db.DateTime, default=datetime.utcnow())  # 创建时间
    admin_id = db.Column(db.Integer, db.ForeignKey('admin.id'))  # 管理员和管理员登录日志之间的关联
    ip = db.Column(db.String(30))  # 登录的ip
    area = db.Column(db.String(50))  # 客户端登录所在的地理位置

    def __repr__(self):
        return 'Adminlog %s' % (self.ip)


# 管理员操作日志
class AdminOplog(db.Model):
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    addtime = db.Column(db.DateTime, default=datetime.utcnow())  # 创建时间
    content = db.Column(db.String(30))  # 管理员操作的内容
    ip = db.Column(db.String(30))  # 登录的ip
    area = db.Column(db.String(50))  # 客户端登录所在的地理位置

    # 关联其他表
    admin_id = db.Column(db.Integer, db.ForeignKey('admin.id'))  # 管理员和管理员登录日志之间的关联

    def __repr__(self):
        return 'AdminOplog %s' % (self.ip)


# 电影收藏
class MovieCollect(db.Model):
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    addtime = db.Column(db.DateTime, default=datetime.utcnow())  # 创建时间

    # 关联其他表
    movie_id = db.Column(db.Integer, db.ForeignKey('movie.id'))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    def __repr__(self):
        return "<MovieCollect %s>" % (self.movie_id)

manage.py具体调用,创建数据库中的表

import getpass

from app import manager
from app.models import *
from werkzeug.security import generate_password_hash,check_password_hash


@manager.command
def initdb():
    """初始化数据表"""
    db.drop_all()
    db.create_all()
    u=User(name='redhat',password=generate_password_hash('redhat'),email='[email protected]')
    db.session.add(u)
    db.session.commit()
    print("初始化数据库成功......")

@manager.command
def createsuperuser():
    """创建超级用户"""
    username=input('请输入超级用户名: ')
    if Admin.query.filter_by(name=username).first():
        print('该超户已经存在....')
    else:
        password=getpass.getpass('请输入超级用户密码: ')
        password_hash=generate_password_hash(password)
        admin=Admin(name=username,password=password_hash,is_super=True)
        db.session.add(admin)
        db.session.commit()
        print('创建超级用户成功')

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

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/GLH_2236504154/article/details/88874280