一.创建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 "" % (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 '' % (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 "" % (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 "" % (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 "" % (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 '' % (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 '' % (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 "" % (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 "" % (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()