第三章、项目分析、搭建目录及模型设计
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 Blueprinthome = Blueprint("home",__name__)import app.home.views
(2)admin/__init__.py
#coding:utf-8 __author__ = 'derek'from flask import Blueprintadmin = 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"] = Truedb = 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)) #登录ipaddtime = 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)) #登录ipaddtime = 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)) #登录ipreason = 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 datetimefrom flask_sqlalchemy import SQLAlchemyapp = Flask(__name__) #连接mysql数据库(用户名、密码、ip、端口和数据库名字) app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:123456@127.0.0.1:3306/movie" app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = Truedb = 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)) #登录ipaddtime = 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)) #登录ipaddtime = 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)) #登录ipreason = db.Column(db.String(600)) #操作原因addtime = db.Column(db.DateTime, index=True, default=datetime.now) #登录时间def __repr__(self):return "Oplog %r" % self.id
(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_hashadmin = 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构建微电影(一)