目录
1.新建项目
2.进行项目
1.新建readme.txt文件对整个项目进行文字说明
2.按照文字说明进行步骤
1.导入数据库
2.新建app包
3.新建manage.py文件
4.app包下 init.py文件添加代码
5.app包下 新建 admin包
6.templates文件夹下 新建admin包
7.设置修改运行的文件
8.templates/admin/login.html 修改页面
9.admin/views文件中
10.app中新建models.py文件
11.补全views.py文件中login函数
12.views.py中新建index函数
13.admin中新建index.html
14.运行起来 登录
15.修改index.html页面
16. 新建admin.html并编写
17. 新建grid.html菜单页面
18. 修改views.py文件中 添加管理员日志
19. 标签管理-添加标签
20.标签管理-标签列表
21.标签管理-标签编辑
22.标签管理-标签删除
23.电影管理-添加电影
24.电影管理-电影列表
25.电影管理-电影编辑
26.电影管理-电影删除
27.预告管理-添加预告
28.预告管理-预告列表
29.预告管理-预告编辑
30.预告管理-预告删除
31.会员管理-会员列表
32.会员管理-会员删除
33.会员管理-会员查看
34.评论管理-评论列表
35.评论管理-评论删除
36.收藏管理-收藏列表
37.收藏管理-收藏删除
38.日志管理
39.权限管理
40.角色管理
41.管理员管理
进入后界面
运行点击网址
显示结果
这样就没问题了
1.1 movie.sql文件导入到mysql数据库中
static,templates放到app包中存放
2.1 static===>存放公共的资源 js/css/jquery/image
2.2 templates===>存储界面文件 html/jsp
2.3 将app.py删除
3.1 JSNUMovie文件夹下创建manage.py
见上图
3.2 manage.py文件代替app.py的功能
'''
Manage项目运行的主入口
'''
# 导入上方的app包里面的内容
from app import app
from flask_script import Manager
# 1.设置业务管理文件
manage=Manager(app)
# 2.运行Flask管理模块
if __name__=='__main__':
manage.run()
3.3 flask_script报错
cmd===>pip install flask-script 下载第三方模块
下载第三方模块
cmd===>pip install flask-sqlalchemy (数据库的驱动功能包)
cmd===>pip install flask-redis (缓存机制功能包)
4.1 设置项目名称
4.2 设置数据连接
4.3 设置项目缓存
4.4 设置DEBUG模式
4.5 数据库连接
4.6 设置缓存机制
4.7 设置蓝图(提高编程效率)
'''
app/__init__.py
1 设置项目名称
2 设置数据连接
3 设置项目缓存
4 设置DEBUG模式
5 数据库连接
6 设置缓存机制
7 设置蓝图(提高编程效率)
cmd===>pip install flask-sqlalchemy (数据库的驱动功能包)
cmd===>pip install flask-redis (缓存机制功能包)
'''
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_redis import FlaskRedis
# 设置作者
__author__='zq'
'''1.设置名称'''
app=Flask(__name__)
'''2.设置数据库连接'''
# 2.1 设置mysql连接参数
# mysql+mysqlconnector===>msyql数据库+mysql的驱动模块
# root:mysql====>用户名和密码
# 127.0.0.1:3306===>ip地址+3306端口号 localhost公认的本机地址
# movie==>数据库名称
app.config['SQLALCHEMY_DATABASE_URI']=\
'mysql+mysqlconnector://root:[email protected]:3306/movie'
# 2.2 设置mysql对象修改与信号发送
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=True
'''3.设置项目缓存'''
# 3.1 设置缓存的URL
app.config['REDIS_URL']='redis://127.0.0.1:6379/0'
# 3.2 设置秘钥
app.config['SECRET_KEY']='zpp_movie'
# 3.3 设置上传的目录
# os.path.join ===>目录拼接函数
# os.path.abspath===>绝对路径 E:\PycharmProjects\JSNUMovie
# os.path.dirname(__file__)===>E:\PycharmProjects\JSNUMovie\app\static\uploads\
# __file__ ===>app包
# 后端上传的目录
app.config['UP_DIR']=\
os.path.join(
os.path.abspath(os.path.dirname(__file__)),'static/uploads/')
#前端上传目录
app.config['FC_DIR']=\
os.path.join(
os.path.abspath(os.path.dirname(__file__)),"static/uploads/users"
)
# 4.设置DEBUG模式
app.debug=False
# 5.数据库连接
db=SQLAlchemy(app)
# 6.设置缓存机制
rd=FlaskRedis(app)
'''7.设置蓝图'''
# 调用app包下admin包 导入admin功能 别名 admin_blueprint
# 7.1 设置导入蓝图
from app.admin import admin as admin_blueprint
# 7.2 注册蓝图
# 127.0.0.1:5000/admin/
app.register_blueprint(admin_blueprint,url_prefix='/admin')
5.1 admin包下__init__.py设置当前模块蓝图的名称
5.2 admin包下 新建views文件
5.3 admin/views login函数
admin下的__init__.py
'''
app/admin/__init__.py
'''
from flask import Blueprint
# 设置当前模块的蓝图 名称 admin
admin=Blueprint('admin',__name__)
import app.admin.views
admin下的views.py
'''
app/admin/views
管理员模块 视图文件
后台登录系统
'''
# 1.登录功能实现
from flask import render_template
from . import admin
@admin.route("/login/",methods=['GET','POST'])
def login():
# 1.测试语句
print("登录模块")
return render_template("admin/login.html")
6.1 admin包下 新建login.html
运行login.html
7.1 打开右上角Add Configuration....
选择Edit Configurations
选择左上角的+
选择python
修改Name===>MovieManager
添加Parameters===>runserver
添加Script path===>选择JSNUMovie文件夹下manage.py文件
7.2 点击右上角的播放按钮
7.3 打开控制台 127.0.0.1:5000 打开浏览器
7.4 输入URL 127.0.0.1:5000/admin/login
查看是否进入login.html
8.1 网站素材 复制粘贴到 static文件夹下
8.2 修改login.html页面
后台页面
星空电影管理系统
{% for msg in get_flashed_messages(category_filter=['err']) %}
{{ msg }}
{% endfor %}
{% for msg in get_flashed_messages(category_filter=['ok']) %}
{{ msg }}
{% endfor %}
9.1 修改login函数
9.2 新建forms文件
cmd===>pip install flask-wtf
9.3 编写LoginForm类
'''
后台登录 表单
flask_wtf是flask框架的表单验证模块,可以很方便生成表单,也可以当做json数据交互的验证工具
flask框架中内部并没有提供全面的表单验证,所以当我们不借助第三方插件来处理代码会显得混乱
官方推荐的一个表单验证插件就是wtforms
wtform是一个支持多种web框架的form组件,主要用于对用户请求数据进行验证
wtforms按照功能类别分类由以下几个类别:
Forms:主要用于表单验证、字段定义、HTML生成,并把各种验证流程聚集在一起进行验证
Fields:主要负责渲染(生成HTML)和数据转换 zq===>account='zq'
Validator:主要用于验证用户输入的数据合法性,比如Length验证器用户验证输入数据的长度
Widgets:html插件,允许使用者在字段中通过该字典自定义html小部件
Meta:用于使用者定义wtfomrs功能,例如csrf的功能开启
Extensions:丰富的扩展库,可以与其他框架结合使用,例如django
'''
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField
from wtforms.validators import DataRequired,ValidationError
from app.models import Admin
# 1.管理员登录表单
class LoginForm(FlaskForm):
# validators:验证器
# description:描述
# render_kw:渲染属性
account = StringField(
label="账号",
validators=[DataRequired("账号不能为空")],
description="管理员账号",
render_kw={
'class':'form-control',
'placeholder':'请输入账号'
}
)
pwd = PasswordField(
label="密码",
validators=[DataRequired("密码不能为空")],
description="管理员密码",
render_kw={
'class':'form-control',
'placeholder':'请输入密码'
}
)
submit=SubmitField(
label='登录',
render_kw={
'class':'btn btn-primary btn-block btn-flat'
}
)
# 根据账号查询数据是否存在 field ===>account的值
def validat_account(self,field):
# 获取账号的值
account = field.data
# 查询操作models
admin = Admin.query.filter_by(name=account).count()
if admin==0:
raise ValidationError("账号不存在!")
'''
模型层
跟数据库中表一一对应
'''
# 调用init文件中的db属性
from app import db
from datetime import datetime
# 1.管理员
class Admin(db.Model):
# 1.设置表格名称(数据库表一致)
__tablename__='admin'
# 2.表格是否存在
__table_args__={'useexisting':True}
# 3.设置映射
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)# 所属角色
addtime=db.Column(db.DateTime,index=True,default=datetime.now)
# '''外键关联'''
# adminlogs=db.relationship('Adminlog',backref='admin')# 管理员登录日志外键关联
# oplogs=db.relationship("Oplog",backref='admin')
# 4.显示对象属性
def __repr__(self):
return ''%self.name
# 5.检查密码
def check_pwd(self,pwd):
# 系统密码
print("系统密码:",self.pwd)
# 用户密码
print("用户密码:",pwd)
return self.pwd == pwd
10.1 编写Admin类
'''
模型层
跟数据库中表一一对应
'''
# 调用init文件中的db属性
from app import db
from datetime import datetime
# 1.管理员
class Admin(db.Model):
# 1.设置表格名称(数据库表一致)
__tablename__='admin'
# 2.表格是否存在
__table_args__={'useexisting':True}
# 3.设置映射
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为超级管理员
rold_id=db.Column(db.Integer)# 所属角色
# '''外键关联'''
# adminlogs=db.relationship('Adminlog',backref='admin')# 管理员登录日志外键关联
# oplogs=db.relationship("Oplog",backref='admin')
# 4.显示对象属性
def __repr__(self):
return ''%self.name
# 5.检查密码
def check_pwd(self,pwd):
# 系统密码
print("系统密码:",self.pwd)
# 用户密码
print("用户密码:",pwd)
return self.pwd == pwd
'''
app/admin/views
管理员模块 视图文件
后台登录系统
'''
# 1.登录功能实现
from flask import render_template
from . import admin
from app.admin.forms import LoginForm
@admin.route("/login/",methods=['GET','POST'])
def login():
#1.获取登录表单
form=LoginForm()
return render_template("admin/login.html",form=form)
运行
'''
app/admin/views
管理员模块 视图文件
后台登录系统
'''
# 1.登录功能实现
from flask import render_template,flash,redirect,url_for,session
from . import admin
from app.admin.forms import LoginForm
from app.models import Admin
#1.登录功能实现
@admin.route("/login/",methods=['GET','POST'])
def login():
#1.获取登录表单
form=LoginForm()
# 2.判断是否提交按钮
if form.validate_on_submit():
# 3.获取表单数据
data=form.data
# 4.判断账号是否一致
# query查询
# name缺省值参数
# data数据{'account':'admin','pwd':'123'}
# first() 第一个被查询出来的值 将查询出来的数据保存成Admin的实体类
admin=Admin.query.filter_by(name=data['account']).first()
# 5.判断密码是否一致
if admin==None or not admin.check_pwd(data['pwd']):
# 5.1通过flash发送错误信息
flash("用户名或密码错误",'err')
# 5.2 重定向请求
return redirect(url_for('admin.login'))
# 6.如果都正确 则保存session
session['admin']=data['account']
session['admin_id']=admin.id
# 7.设置管理员日志
# 8.数据库添加session add是数据库添加操作
# 9.输出结果
print("登录成功")
# 10.重定向
# 当需要获取前端页面表单传过来的id值的时候,我们需要使用request.args.get
# request.args.get('next') 获取请求的单个参数
return redirect(url_for('admin.index'))
return render_template("admin/login.html",form=form)
# 2.系统首页
@admin.route("/")
def index():
return render_template("admin/index.html")
后台首页
主界面
缺少mysql模块
cmd===>pip install mysql-connector
15.1 头部区域 admin.html
15.2 主区域 显示主页的内容的
15.3 底部区域 js区域
{% extends 'admin/admin.html' %}
{% block content %}
星空电影管理系统
内存使用率
系统设置
{% endblock %}
{% block js %}
{% endblock %}
16.1
后台浏览器
{% block css %}
{% endblock %}
16.2
后台浏览器
*{
font-family: 'Microsoft YaHei',sans-serif;
}
.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{
vertical-align: middle;
text-align: center;
}
{% block css %}
{% endblock %}
星空电影系统
电影管理系统
{% block content %}
{% endblock %}
{% block js %}
{% endblock %}
'''
app/admin/views
管理员模块 视图文件
后台登录系统
'''
# 1.登录功能实现
from flask import render_template,flash,redirect,url_for,session,request
from . import admin
from app.admin.forms import LoginForm
from app.models import Admin,Adminlog
from app.models import db
#1.登录功能实现
@admin.route("/login/",methods=['GET','POST'])
def login():
#1.获取登录表单
form=LoginForm()
# 2.判断是否提交按钮
if form.validate_on_submit():
# 3.获取表单数据
data=form.data
# 4.判断账号是否一致
# query查询
# name缺省值参数
# data数据{'account':'admin','pwd':'123'}
# first() 第一个被查询出来的值 将查询出来的数据保存成Admin的实体类
admin=Admin.query.filter_by(name=data['account']).first()
# 5.判断密码是否一致
if admin==None or not admin.check_pwd(data['pwd']):
# 5.1通过flash发送错误信息
flash("用户名或密码错误",'err')
# 5.2 重定向请求
return redirect(url_for('admin.login'))
# 6.如果都正确 则保存session
session['admin']=data['account']
session['admin_id']=admin.id
# 7.设置管理员日志
adminlog = Adminlog(
admin_id=admin.id,
ip=request.remote_addr
)
# 8.数据库添加session add是数据库添加操作
db.session.add(adminlog)
db.session.commit()
# 9.输出结果
print("登录成功")
# 10.重定向
# 当需要获取前端页面表单传过来的id值的时候,我们需要使用request.args.get
# request.args.get('next') 获取请求的单个参数
return redirect(url_for('admin.index'))
return render_template("admin/login.html",form=form)
# 2.系统首页
@admin.route("/")
def index():
return render_template("admin/index.html")
18.1 models中添加管理员日志和管理员操作日志
'''
模型层
跟数据库中表一一对应
'''
# 调用init文件中的db属性
from app import db
from datetime import datetime
# 1.管理员
class Admin(db.Model):
# 1.设置表格名称(数据库表一致)
__tablename__='admin'
# 2.表格是否存在
__table_args__={'useexisting':True}
# 3.设置映射
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)# 所属角色
addtime=db.Column(db.DateTime,index=True,default=datetime.now)
# '''外键关联'''
# adminlogs=db.relationship('Adminlog',backref='admin')# 管理员登录日志外键关联
# oplogs=db.relationship("Oplog",backref='admin')
# 4.显示对象属性
def __repr__(self):
return ''%self.name
# 5.检查密码
def check_pwd(self,pwd):
# 系统密码
print("系统密码:",self.pwd)
# 用户密码
print("用户密码:",pwd)
return self.pwd == pwd
# 2.管理员登录日志
class Adminlog(db.Model):
__tablename__='adminlog'
__table_args__={'useexisting':True}
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)
def __repr__(self):
return ""%self.id
# 3.管理员操作日志
class Oplog(db.Model):
__tablename__='oplog'
__table_args__={'useexisting':True}
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)
def __repr__(self):
return ""%self.id
18.2 login函数中添加管理员登录日志
上个login内已经添加 adminlog表中可以查看管理员登录日志
19.1 grid.html中添加标签请求
19.2 views.py中添加 tag_add函数
# 3.标签管理-添加标签
@admin.route('/tag_add/',methods=['GET','POST'])
def tag_add():
'''第一种情况:点击左侧菜单子选项 进入到tag_add.html页面
第二种情况:tag_add.html页面 提交form表单数据保存
'''
# 3.1 获取表单验证
form = TagForm()
# 3.2 判断是否点击了提交按钮
if form.validate_on_submit():
# 获取表单数据
data = form.data
# 根据标签名称查找统计标签
tag = Tag.query.filter_by(name=data['name']).count()
# 若查找该标签
if tag == 1:
flash("标签已经存在,不可重复",'err')
return redirect(url_for('admin.tag_add'))
# 没有查找到该标签
tag = Tag(name=data['name'])
# 设置session添加
db.session.add(tag)
db.session.commit()
# 添加管理员操作日志
oplog = Oplog(
admin_id = session['admin_id'],
ip = request.remote_addr,
reason='添加标签%s'%data['name']
)
db.session.add(oplog)
db.session.commit()
flash("标签添加成功",'ok')
redirect(url_for('admin.tag_add'))
return render_template('admin/tag_add.html',form=form)
19.3 forms.py中添加 TagForm()
# 2.标签的表单
class TagForm(FlaskForm):
name = StringField(
label='名称',
validators=[DataRequired("标签名不能为空")],
description='电影的标签',
render_kw={
'class':'form-control',
'id' : 'input_name',
'placeholder':'请输入电影标签名称!!'
})
submit = SubmitField(
'添加',
render_kw = {'class':'btn btn-primary'}
)
19.4 admin文件夹中添加 tag_add.html
{% extends 'admin/admin.html' %}
{% block content %}
星空电影管理系统 | 后台
添加标签
{% endblock %}
{% block js %}
{% endblock %}
19.5 models.py文件中添加 Tag类
# 4.标签表
class Tag(db.Model):
__tablename__ = 'tag'
__table_args__ = {'useexisting':True}
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()) # 添加时间
# 设置外键关联 与 电影的外键关联movie
movies = db.relationship('Movie',backref='tag')
# 显示属性
def __repr__(self):
return ""%self.name
20.1 grid.html中添加标签列表请求
已添加
20.2 views.py中添加 tag_list函数
# 4.标签管理-标签列表
@admin.route("/tag_list//",methods=['GET'])
def tag_list(page=None):
'''
1.点击左侧菜单 标签列表===> tag_list.html页面展示数据
2.点击页码 使用缺省值参数 page接受页码值===>根据页码查询数据并展示到tag_list.html
'''
# 第一种情况无页码
if page is None:
page = 1
# 分页查询
# paginate(page,per_page,False) 显示第page页 每页per_page,error_out=False不抛出404
# 按照标签添加时间进行降序 分页插件设置页码
page_data = Tag.query.order_by(Tag.addtime.desc())\
.paginate(page=page,per_page=3)
return render_template("admin/tag_list.html",page_data=page_data)
20.3 admin文件夹中添加 tag_list.html
{% extends 'admin/admin.html' %}
{% import 'ui/admin_page.html' as pg %}
{% block content %}
星空电影管理系统 | 后台
{% endblock %}
{% block js %}
{% endblock %}
20.4 新建ui/admin_page.html
{% macro page(data,url) %}
{% if data %}
{% endif %}
{% endmacro %}
21.1 tag_list.html中发送编辑请求
21.2 views.py中添加 tag_edit函数
# 5.标签管理-标签编辑
@admin.route("/tag_edit/",methods=['GET','POST'])
def tag_edit(id=None):
# 5.1 获取表单
form = TagForm()
# 5.2 将表单中的按钮改成修改
form.submit.label.text = '修改'
# 5.3 根据id值查询数据库 有数据或者404 tag是原有的标签数据 喜剧片
tag = Tag.query.get_or_404(id)
# 5.4 判断表单是否提交
if form.validate_on_submit():
# 5.5 获取表单数据
data = form.data
# 5.6 先把用户数据查询一遍判断是否存在
tag_count = Tag.query.filter_by(name=data['name']).count()
# 5.7 判断标签是否存在
if tag.name != data['name'] and tag_count == 1:
flash("标签名称已经存在",'err')
return redirect(url_for('admin.tag_edit',id=tag.id))
# 5.8 表单数据更改
tag.name = data['name']
# 5.9 数据库的数据提交和添加
db.session.add(tag)
db.session.commit()
# 5.10 标签的提示框
flash("标签已经修改成功",'ok')
# 5.11 重定向到编辑页面
redirect(url_for('admin.tag_edit',id=tag.id))
return render_template("admin/tag_edit.html",form=form,tag=tag)
21.3 admin文件夹下添加 tag_edit.html
{% extends 'admin/admin.html' %}
{% block content %}
星空电影管理系统 | 后台
标签编辑
{% endblock %}
{% block js %}
{% endblock %}
22.1 tag_list.html中发送编辑请求
22.2 views.py中添加 tag_del函数
# 6.标签管理-标签删除
@admin.route('/tag_del/',methods=['GET'])
def tag_del(id=None):
# 6.1 查看是否存在该标签
# filter_by查不到或者多个数据不会报错,get会报错
tag = Tag.query.filter_by(id=id).first_or_404()
# 6.2 删除标签
db.session.delete(tag)
db.session.commit()
# 6.3 提示框
flash("标签<<{0}>>删除成功".format(tag.name),'ok')
# 6.4 重定向标签列表页面
return redirect(url_for('admin.tag_list',page=1))
23.1 grid.html中 设置电影管理 添加电影 和电影列表
电影管理
2
23.2 views.py中 添加movie_add和movie_list请求函数
# 7.电影管理-电影添加
@admin.route('/movie_add',methods=['GET','POST'])
def movie_add():
# 7.1 获取电影表单
form = MovieForm()
# 7.2 判断按钮是否点击
if form.validate_on_submit():
# 7.3 获取表单数据
data = form.data
# 7.4 处理上传文件以及LOGO
file_url = secure_filename(form.url.data.filename)
file_logo = secure_filename(form.logo.data.filename)
# 7.5 判断当前项目中的上传文件目录是否存在 static/uploads文件夹
if not os.path.exists(app.config['UP_DIR']):
# 7.5.1 创建目录
os.makedirs(app.config['UP_DIR'])
# 7.5.2 更改目录以及目录权限
os.chmod(app.config['UP_DIR'],'rb')
# 7.6 修改form表单数据
# file_url ====>psdb.png els.mp4
url = change_filename(file_url)
logo = change_filename(file_logo)
# 7.7 保存数据到form表单
# static/uploads/20220406173106f5a6a528041b429eb0fa50004fc9abea.png
form.url.data.save(app.config['UP_DIR']+url)
form.logo.data.save(app.config['UP_DIR']+logo)
# 7.8 设置form表单数据
movie = Movie(
title=data['title'],
url = url,
info =data['info'],
logo = logo,
star = int(data['star']),
playnum = 0,
commentnum = 0,
tag_id =int(data['tag_id']),
area=data['area'],
release_time=data['release_time'],
length=data['length']
)
# 7.9 添加数据
db.session.add(movie)
db.session.commit()
# 7.10 弹出框
flash("添加电影成功啦!!!",'ok')
# 7.11 重定向
return redirect(url_for("admin.movie_add"))
# 7.12 进入添加页面
return render_template('admin/movie_add.html',form=form)
def change_filename(filename):
# 1.将传递的路径进行分解 E:/pycharm/project/els.mp4
fileinfo = os.path.splitext(filename)
# 2.拼接新的文件名称
'''
2022040617310
datetime.now()当前时间 按照YYYYmmddHHMMSS
f5a6a528041b429eb0fa50004fc9abea
str(uuid.uuid4().hex)
fileinfo[-1]
.png .mp4
'''
filename = datetime.now().strftime("%Y%m%d%H%M%S") + str(uuid.uuid4().hex)+fileinfo[-1]
return filename
23.3 forms.py中 添加MovieForm
# 3.电影的表单
class MovieForm(FlaskForm):
title = StringField(
label='片名',
validators=[DataRequired('片名不能为空!')],
description='片名',
render_kw={
'class':'form-control',
'id':'input_title',
'placeholder':'请输入片名'
}
)
url = FileField(
label='文件',
validators=[DataRequired('请上传文件')],
description='文件'
)
info = TextAreaField(
label='简介',
validators=[DataRequired('简介不能为空')],
description="简介",
render_kw={
'class':'form-control',
'rows':10
}
)
logo = FileField(
label='封面',
validators=[DataRequired("请上传封面")],
description='封面'
)
star = SelectField(
label='星级',
validators=[DataRequired('请选择星级')],
coerce=int,
choices=[(1,'1星'),(2,'2星'),(3,'3星'),(4,'4星'),(5,'5星')],
description='星级',
render_kw={
'class':'form-control'
}
)
tag_id = SelectField(
label='标签',
validators=[DataRequired('请选择标签!')],
coerce=int,
# 查询数据库中的tag标签表的内容循环遍历
choices=[(v.id,v.name) for v in Tag.query.all()],
description='标签',
render_kw={
'class':'form-control'
}
)
area = StringField(
label='地区',
validators=[
DataRequired("请输入地区!")
],
description='地区',
render_kw={
'class':'form-control',
'placeholder':'请输入地区'
}
)
length = StringField(
label='时长',
validators=[DataRequired('片长不能为空!')],
description='片长',
render_kw={
'class':'form-control',
'placeholder':'请输入片长!'
}
)
release_time = StringField(
label='上映时间',
validators=[DataRequired('上映时间不能为空!')],
description='上映时间',
render_kw={
'class':'form-control',
'placeholder':'请选择上映时间!',
'id':'input_release_time'
}
)
submit = SubmitField(
'添加',
render_kw= {
'class':'btn btn-primary'
}
)
23.4 models.py中 添加Movie
外键关联 Comment 评论 MovieCol收藏
# 5.电影表
class Movie(db.Model):
__tablename__ = 'movie'
__table_args__ = {'useexisting':True}
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 ""%self.title
# 设置外键关联 与 电影的外键关联movie
movies = db.relationship('Movie',backref='tag')
添加与tag的关联
23.5 admin文件夹中 movie_add.html和 movie_list.html
24.1 grid.html 添加电影列表请求
24.2 views.py 添加函数 movie_list
# 8.电影管理-电影列表
@admin.route('/movie_list/',methods=['GET'])
def movie_list(page=None):
# 8.1 判断page是否有值
if page is None:
page = 1
# 8.2 进行关联查询 关联Tag查询 单表filter_by 多表filter进行关联字段的
# 过滤条件 Tag.id == Movie.tag_id
# 排序条件 Movie.addtime.desc()
# 分页设置 page=page per_page=1 每页显示1条数据 当前页面是那一页
page_data = Movie.query.join(Tag).filter(
Tag.id == Movie.tag_id
).order_by(
Movie.addtime.desc()
).paginate(page=page,per_page=1)
# 8.3 返回movie_list.html 将分页数据传递到前端
return render_template("admin/movie_list.html",page_data=page_data)
24.3 admin文件夹中新建 movie_list.html
{% extends 'admin/admin.html' %}
{% import 'ui/admin_page.html' as pg %}
{% block content %}
星空电影管理系统 | 后台
电影列表
{% for msg in get_flashed_messages(category_filter=['ok']) %}
操作成功
{{ msg }}
{% endfor %}
{% for msg in get_flashed_messages(category_filter=['err']) %}
操作失败
{{ msg }}
{% endfor %}
编号
片名
片长
标签
地区
星级
播放数量
评论数量
上映时间
操作事项
{% for v in page_data.items %}
{{ v.id }}
{{ v.title }}
{{ v.length }}分钟
{{ v.tag.name }}
{{ v.area }}
{{ v.star }}
{{ v.playnum }}
{{ v.commentnum }}
{{ v.addtime }}
编辑
删除
{% endfor %}
{% endblock %}
{% block js %}
{% endblock %}
25.1 movie_list.html 添加编辑请求
25.2 views中添加函数 movie_edit
# 9.电影管理-电影编辑
@admin.route("/movie_edit/",methods=['GET','POST'])
def movie_edit(id=None):
# 9.1 获取电影表单
form = MovieForm()
form.submit.label.text = '修改'
# 9.2 设置url,logo非空验证为空 编辑不修改的时候 不会验证器报错
form.url.validators = []
form.logo.validators = []
# 9.3 根据id查询数据
movie = Movie.query.get_or_404(int(id))
# 9.4 判断请求类型
if request.method == "GET":
# 9.5 将info,tag_id,star数据放到表单中显示在编辑页面
form.info.data = movie.info
form.tag_id.data = movie.tag_id
form.star.data = movie.star
# 9.6 表单提交 post请求
if form.validate_on_submit():
# 9.7 获取表单数据
data = form.data
# 9.8 根据表单名查看数据库是否存在
movie_count = Movie.query.filter_by(title=data['title']).count()
# 9.9 判断电影名称是否存在以及电影名称没有修改
if movie_count == 1 and movie.title != data['title']:
# 提示错误信息
flash("片名已经存在!",'err')
return redirect(url_for("admin.movie_edit",id=id))
# 9.10 创建目录 uploads不存在则新建 存在则不再新建
if not os.path.exists(app.config['UP_DIR']):
os.makedirs(app.config['UP_DIR'])
os.chmod(app.config['UP_DIR'],'rb')
# 9.11 上传新的视频文件
if form.url.data != "":
# 删除原有的视频文件
os.remove(app.config['UP_DIR'] + movie.url)
# 上传的视频文件名称
file_url = secure_filename(form.url.data.filename)
# 修改了的视频文件名称
movie.url = change_filename(file_url)
form.url.data.save(app.config['UP_DIR']+movie.url)
# 9.12 上传图片
if form.logo.data != "":
# 删除原有的图片文件
os.remove(app.config['UP_DIR']+movie.logo)
file_logo = secure_filename(form.logo.data.filename)
movie.logo = change_filename(file_logo)
form.logo.data.save(app.config['UP_DIR'] + movie.logo)
# 9.13 设置其他的数据信息
movie.star = data['star']
movie.tag_id = data['tag_id']
movie.info = data["info"]
movie.title = data['title']
movie.area = data['area']
movie.length = data['length']
movie.release_time = data['release_time']
# 9.14 数据提交
db.session.add(movie)
db.session.commit()
# 9.15 提示修改成功
flash("修改电影成功啦啦啦!!!",'ok')
return redirect(url_for('admin.movie_edit',id=id))
# 返回到电影编辑页面
return render_template("admin/movie_edit.html",form=form,movie=movie)
25.3 admin文件夹中新建 movie_edit.html
{% extends 'admin/admin.html' %}
{% block content %}
星空电影管理系统 | 后台
电影编辑
{% endblock %}
{% block js %}
{% endblock %}
26.1 movie_list.html 添加删除请求
26.2 views中添加函数 movie_del
# 10.电影管理-电影删除
@admin.route("/movie_del/",methods=['GET'])
def movie_del(id=None):
# 10.1 根据id查询删除的数据是否存在
movie = Movie.query.get_or_404(id)
# 10.2 若存在则进行删除操作
if not movie is None:
# 删除数据库的电影数据时候 uploads中的文件并没有删除掉
os.remove(app.config['UP_DIR']+movie.url)
os.remove(app.config['UP_DIR']+movie.logo)
db.session.delete(movie)
db.session.commit()
# 10.3 提示框
flash("电影删除成功啦!","ok")
return redirect(url_for('admin.movie_list',page=1))
27.1 grid.html 添加预告请求 admin.preview_add
预告管理
2
27.2 views.py 新建preview_add函数
# 11.预告管理-预告添加
@admin.route("/preview_add/",methods=['GET','POST'])
def preview_add():
# 11.1 获取预告表单
form = PreviewForm()
# 11.2 判断表单是否点击提交
if form.validate_on_submit():
# 11.3 获取添加的数据
data = form.data
# 11.4 获取logo的名称
file_logo = secure_filename(form.logo.data.filename)
# 11.5 判断是否有uploads文件夹
if not os.path.exists(app.config['UP_DIR']):
os.makedirs(app.config['UP_DIR'])
os.chmod(app.config['UP_DIR'],'rb')
# 11.6 修改logo的文件名称
logo = change_filename(file_logo)
# 11.7 保存logo到form中
form.logo.data.save(app.config['UP_DIR'] + logo)
# 11.8 设置其他的预告数据
preview = Preview(
title=data['title'],
logo = logo
)
# 11.9 添加数据到数据库中
db.session.add(preview)
db.session.commit()
# 11.10 提示成功
flash("添加预告成功!",'ok')
return redirect(url_for("admin.preview_add"))
return render_template("admin/preview_add.html",form=form)
27.3 models.py 新建 Preview 模型
# 6.上映预告表
class Preview(db.Model):
__tablename__ = 'preview'
__table_args__ = {'useexisting':True}
# 编号
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 ""%self.title
27.4 forms.py 新建 PreviewForm表单
# 4.预告的表单
class PreviewForm(FlaskForm):
title = StringField(
label="预告标题",
validators=[
DataRequired("预告标题不能为空!")],
description="上映电影的预告标题",
render_kw= {
'class':'form-control',
'placeholder':'请输入预告标题'
}
)
logo = FileField(
label="预告封面",
validators=[DataRequired('预告封面不能为空!')],
description="预告封面"
)
submit = SubmitField(
"添加预告",
render_kw={
'class':'btn btn-primary'
}
)
27.5 admin文件夹下新建 preview_add.html
28.1 grid.html 添加预告列表请求 admin.preview_list
28.2 views.py 新建preview_list函数
# 12.预告管理-预告列表
@admin.route("/preview_list/",methods=['GET'])
def preview_list(page=None):
# 12.1 判断page是否为None
if page is None:
page = 1
# 12.2 根据添加时间排序的分页数据
page_data = Preview.query.order_by(
Preview.addtime.desc()
).paginate(page=page,per_page=1)
# 12.3 返回分页数据
return render_template("admin/preview_list.html",page_data=page_data)
28.3 admin文件夹下编辑 preview_add.html
{% extends 'admin/admin.html' %}
{% block content %}
星空电影管理系统 | 后台
添加预告
{% endblock %}
{% block js %}
{% endblock %}
29.1 preview_list.html 中添加 编辑请求 admin.preview_edit
29.2 views.py 中添加 preview_edit函数
# 13.预告管理-预告编辑
@admin.route("/preview_edit/",methods=['GET','POST'])
def preview_edit(id=None):
# 13.1 获取预告表单
form = PreviewForm()
form.submit.label.text = "修改"
# 13.2 设置logo的验证器为空
form.logo.validators = []
# 13.3 根据id获取预告的数据信息
preview = Preview.query.get_or_404(int(id))
# 13.4 判断请求类型
if request.method == 'GET':
form.title.data = preview.title
# 13.5 post请求
if form.validate_on_submit():
# 13.6 获取编辑页面的数据
data = form.data
# 13.7 判断logo是否为空
if form.logo.data != "":
# 13.8 删除原有的封面图片
os.remove(app.config['UP_DIR']+preview.logo)
# 13.9 获取上传图片的文件名以及路径
file_logo = secure_filename(form.logo.data.filename)
# 13.10 对上传的图片名进行更改
preview.logo = change_filename(file_logo)
# 13.11 保存新的数据到form表单中
form.logo.data.save(app.config['UP_DIR'] + preview.logo)
# 13.12 设置提交到数据库的数据信息
preview.title = data['title']
# 13.13 提交到数据库中
db.session.add(preview)
db.session.commit()
# 13.14 提示框
flash("预告修改成功!!!",'ok')
return redirect(url_for('admin.preview_edit',id=id))
return render_template("admin/preview_edit.html",form=form,preview=preview)
29.3 admin文件夹下编辑preview_edit.html
{% extends 'admin/admin.html' %}
{% block content %}
星空电影管理系统 | 后台
预告编辑
{% endblock %}
{% block js %}
{% endblock %}
30.1 preview_list.html 中添加 删除请求 admin.preview_del
30.2 views.py 中添加preview_del函数
# 14.预告管理-预告删除
@admin.route("/preview_del/",methods=['GET'])
def preview_del(id =None):
# 14.1 根据id获取预告数据
preview = Preview.query.get_or_404(id)
# 14.2 判断是否有数据
if not preview is None:
# 14.3 删除原有的预告封面
os.remove(app.config['UP_DIR']+preview.logo)
# 14.4 删除数据
db.session.delete(preview)
db.session.commit()
# 14.5 提示删除成功
flash("预告删除成功啦!!!",'ok')
return redirect(url_for("admin.preview_list",page=1))
else:
flash("预告删除失败啦!!!",'err')
return redirect(url_for("admin.preview_list",page=1))
31.1 grid.html 设置会员管理 子标签 会员列表 admin.user_list
会员管理
1
31.2 models.py 新建 User
# 7.会员表
class User(db.Model):
__tablename__ = 'user'
__table_args__ = {'useexisting': True}
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), unique=True)
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)# 唯一标识符
comments=db.relationship('Comment',backref='user')
moviecols = db.relationship('Moviecol', backref='user')
# 会员日志、评论表、收藏表外键关联
def __repr__(self):
return "" % self.name
def check_pwd(self,pwd):
# 加密判断
return pwd == self.pwd
31.3views.py中 新建 user_list函数
# 15.会员管理-会员列表
@admin.route("/user_list/",methods=['GET'])
def user_list(page=None):
# 15.1 判断page是否为None
if page is None:
page = 1
# 15.2 根据添加时间排序的分页数据
page_data = User.query.order_by(
User.addtime.desc()
).paginate(page=page,per_page=1)
# 15.3 返回分页数据
return render_template("admin/user_list.html",page_data=page_data)
31.5 admin文件夹下 新建user_list.html
{% extends 'admin/admin.html' %}
{% import 'ui/admin_page.html' as pg %}
{% block content %}
星空电影管理系统 | 后台
会员列表
{% for msg in get_flashed_messages(category_filter=['ok']) %}
操作成功
{{ msg }}
{% endfor %}
{% for msg in get_flashed_messages(category_filter=['err']) %}
操作失败
{{ msg }}
{% endfor %}
编号
昵称
{# 密码 #}
电子邮箱
电话号码
头像
状态
注册时间
操作事项
{% for v in page_data.items %}
{{ v.id }}
{{ v.name }}
{# {{ v.pwd }} #}
{{ v.email }}
{{ v.phone }}
{# {{ v.info }} #}
{% if v.face %}
{% else %}
{% endif %}
正常/冻结
{{ v.addtime }}
查看
解冻
冻结
删除
{% endfor %}
{% endblock %}
{% block js %}
{% endblock %}
32.1 user_list.html 添加 会员删除请求 admin.user_del
32.2 views.py 新建 user_del函数
# 14.会员管理-会员删除
@admin.route("/user_del/",methods=['GET'])
def user_del(id =None):
form_page= int(request.args.get("fp"))-1
if not form_page:
form_page=1
# 14.1 根据id获取预告数据
user = User.query.get_or_404(int(id))
# 14.4 删除数据
db.session.delete(user)
db.session.commit()
# 14.5 提示删除成功
flash("会员删除成功啦!!!",'ok')
return redirect(url_for("admin.user_list",page=form_page))
33.1 user_list.html 添加 会员查看请求 admin.user_view
33.2 views.py 新建 user_view函数
# 17.会员管理-会员查看
@admin.route("/user_view/",methods=['GET'])
def user_view(id=None):
#17.1
form_page=request.args.get('fp')
if not form_page:
form_page=1
user=User.query.get_or_404(int(id))
return render_template("admin/user_view.html",user=user,form_page=form_page)
33.3 admin文件夹下新建 user_view.html
{% extends 'admin/admin.html' %}
{% block css %}
{% endblock %}
{% block content %}
星空电影管理系统
会员详情
编号:
{{ user.id }}
昵称:
{{ user.name }}
邮箱:
{{ user.email }}
手机:
{{ user.phone }}
头像:
{% if user.face %}
{% else %}
{% endif %}
注册时间:
{{ user.addtime }}
唯一标识符:
{{ user.uuid }}
个性简介:
{{ user.info }}
{% endblock %}
{% block js %}
{% endblock %}
34.1 grid.html新建评论管理 以及评论列表请求 comment_list
评论管理
1
34.2 models.py 新建comment类
# 8.评论表
class Comment(db.Model):
__tablename__='comment'
__table_args__={'useexisting':True}
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 ""%self.id
34.3 views.py 新建comment_list函数
# 18.评论管理-评论列表
@admin.route("/comment_list/",methods=['GET'])
def comment_list(page=None):
#18.1
if page is None:
page=1
#18.2 通过评论join查询相关的movie以及user表
page_data=Comment.query.join(
Movie).join(
User).filter(
Movie.id==Comment.movie_id,
User.id==Comment.user_id).order_by(
Comment.addtime.desc()
).paginate(page=page,per_page=1)
return render_template("admin/comment_list.html",page_data=page_data)
34.4 admin文件夹下新建 comment_list.html
{% extends 'admin/admin.html' %}
{% import 'ui/admin_page.html' as pg %}
{% block content %}
星空电影管理系统 | 后台
评论列表
{% for msg in get_flashed_messages(category_filter=['ok']) %}
操作成功
{{ msg }}
{% endfor %}
{% for msg in get_flashed_messages(category_filter=['err']) %}
操作失败
{{ msg }}
{% endfor %}
{% for v in page_data.items %}
{% if v.user.face %}
{% else %}
{% endif %}
{% endfor %}
{% endblock %}
{% block js %}
{% endblock %}
35.1 comment_list.html 添加评论删除请求 comment_del
35.2 views.py 添加 comment_del函数
# 19.评论管理-评论删除
@admin.route("/comment_del/",methods=['GET'])
def comment_del(id =None):
form_page= int(request.args.get("fp"))-1
if not form_page:
form_page=1
# 14.1 根据id获取预告数据
comment = Comment.query.get_or_404(int(id))
# 14.4 删除数据
db.session.delete(comment)
db.session.commit()
# 14.5 提示删除成功
flash("评论删除成功啦!!!",'ok')
return redirect(url_for("admin.comment_list",page=form_page))
36.1 grid.html 新建收藏管理 admin.moviecol_list
收藏管理
1
36.2 models.py 添加 Moviecol类
movie.id user.id
# 9.收藏表
class Moviecol(db.Model):
__tablename__='moviecol'
__table_args__={'useexisting':True}
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 ""%self.id
36.3 views.py 添加 moviecol_list函数
# 20.收藏管理-收藏列表
@admin.route("/moviecol_list/",methods=['GET'])
def moviecol_list(page=None):
#20.1
if page is None:
page=1
#20.2 通过评论join查询相关的movie以及user表
page_data=Moviecol.query.join(
Movie).join(
User).filter(
Movie.id==Moviecol.movie_id,
User.id==Moviecol.user_id).order_by(
Moviecol.addtime.desc()
).paginate(page=page,per_page=1)
print(page_data)
return render_template("admin/moviecol_list.html",page_data=page_data)
36.4 admin文件夹新建 moviecol_list.html
{% extends 'admin/admin.html' %}
{% import 'ui/admin_page.html' as pg %}
{% block content %}
星空电影管理系统 | 后台
收藏列表
{% for msg in get_flashed_messages(category_filter=['ok']) %}
操作成功
{{ msg }}
{% endfor %}
{% for msg in get_flashed_messages(category_filter=['err']) %}
操作失败
{{ msg }}
{% endfor %}
编号
电影
用户
收藏时间
操作事项
{% for v in page_data.items %}
{{ v.id }}
{{ v.movie.title }}
{{ v.user.name }}
{{ v.addtime }}
删除
{% endfor %}
{% endblock %}
{% block js %}
{% endblock %}
37.1 moviecol_list.html中添加 删除请求 admin.moviecol_del
37.2 views.py 添加moviecol_del函数
# 21.收藏管理-收藏删除
@admin.route("/moviecol_del/",methods=['GET'])
def moviecol_del(id =None):
form_page= int(request.args.get("fp"))-1
if not form_page:
form_page=1
# 21.1 根据id获取预告数据
moviecol = Moviecol.query.get_or_404(int(id))
# 21.4 删除数据
db.session.delete(moviecol)
db.session.commit()
# 14.5 提示删除成功
flash("收藏删除成功啦!!!",'ok')
return redirect(url_for("admin.comment_list",page=form_page))
38.1 grid.html中
日志管理
3
38.2 models.py编写Userlog , Adminlog , 0plog
# 2.管理员登录日志
class Adminlog(db.Model):
__tablename__ = 'adminlog'
__table_args__ = {'useexisting':True}
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 ""%self.id
# 3.管理员操作日志
class Oplog(db.Model):
__tablename__ = 'oplog'
__table_args__ = {'useexisting':True}
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(100))# 操作原因
addtime = db.Column(db.DateTime,index=True,default=datetime.now())
def __repr__(self):
return ""%self.id
#10.会员登录日志
class Userlog(db.Model):
__tablename__='userlog'
__table_args__={'useexisting':True}
id=db.Column(db.Integer,primary_key=True)
user_id=db.Column(db.Integer,db.ForeignKey('user.id'))
ip=db.Column(db.String(100))
addtime=db.Column(db.DateTime,index=True,default=datetime.now)
def __repr__(self):
return ""%self.id
38.3 views.py中添加userlog_list adminlog_list oplog_list函数
# 22. 日志管理-操作日志列表
@admin.route("/oplog_list/",methods=['GET'])
def oplog_list(page=None):
#22.1
if page is None:
page=1
#22.2 oplog关联查询
page_data=Oplog.query.join(Admin).filter(
Admin.id==Oplog.admin_id,
).order_by(
Oplog.addtime.desc()
).paginate(page=page,per_page=2)
return render_template("admin/oplog_list.html",page_data=page_data)
#23.日志管理-管理员登录日志列表
@admin.route("/adminlog_list/",methods=['GET'])
def adminlog_list(page=None):
#23.1判断是否
if page is None:
page=1
#23.2
page_data=Adminlog.query.join(Admin).filter(
Admin.id==Adminlog.admin_id
).order_by(
Adminlog.addtime.desc()
).paginate(page=page,per_page=50)
return render_template("admin/adminlog_list.html",page_data=page_data)
#24.日志管理-会员登录日志列表
@admin.route("/userlog_list/",methods=['GET'])
def userlog_list(page=None):
#24.1判断是否
if page is None:
page=1
#24.2
page_data=Userlog.query.join(User).filter(
User.id==Userlog.user_id
).order_by(
Userlog.addtime.desc()
).paginate(page=page,per_page=5)
return render_template("admin/userlog_list.html",page_data=page_data)
38.4 admin文什夹中 userlog_list.html, adminlog_list.html, oplog_list.html
userlog_list.html
{% extends 'admin/admin.html' %}
{% import 'ui/admin_page.html' as pg %}
{% block content %}
星空电影管理系统 | 后台
会员登录日志列表
{% for msg in get_flashed_messages(category_filter=['ok']) %}
操作成功
{{ msg }}
{% endfor %}
{% for msg in get_flashed_messages(category_filter=['err']) %}
操作失败
{{ msg }}
{% endfor %}
编号
会员
登录时间
IP地址
{% for v in page_data.items %}
{{ v.id }}
{{ v.user.name }}
{{ v.addtime }}
{{ v.ip }}
{% endfor %}
{% endblock %}
{% block js %}
{% endblock %}
admin_lists.html
{% extends 'admin/admin.html' %}
{% import 'ui/admin_page.html' as pg %}
{% block content %}
星空电影管理系统 | 后台
管理员登录日志列表
{% for msg in get_flashed_messages(category_filter=['ok']) %}
操作成功
{{ msg }}
{% endfor %}
{% for msg in get_flashed_messages(category_filter=['err']) %}
操作失败
{{ msg }}
{% endfor %}
编号
管理员
登录时间
IP地址
{% for v in page_data.items %}
{{ v.id }}
{{ v.admin.name }}
{{ v.addtime }}
{{ v.ip }}
{% endfor %}
{% endblock %}
{% block js %}
{% endblock %}
oplog_list.html
{% extends 'admin/admin.html' %}
{% import 'ui/admin_page.html' as pg %}
{% block content %}
星空电影管理系统 | 后台
操作日志列表
{% for msg in get_flashed_messages(category_filter=['ok']) %}
操作成功
{{ msg }}
{% endfor %}
{% for msg in get_flashed_messages(category_filter=['err']) %}
操作失败
{{ msg }}
{% endfor %}
编号
管理员
操作时间
操作原因
IP地址
{% for v in page_data.items %}
{{ v.id }}
{{ v.admin.name }}
{{ v.addtime }}
{{ v.reason }}
{{ v.ip }}
{% endfor %}
{% endblock %}
{% block js %}
{% endblock %}
39.1 grid.html 添加权限管理
权限管理
2
39.2 models.py 编写 Auth模型
#10.权限
class Auth(db.Model):
__tablename__='auth'
__table_args__={'useexisting':True}
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(100),unique=True)
url = db.Column(db.String(255), unique=True)
# role_id=db.Column(db.Integer,db.ForeignKey('role.id'))
addtime=db.Column(db.DateTime,index=True,default=datetime.now)
# roles=db.relationship("Role",backref='auth')
def __repr__(self):
return ""%self.name
39.3 forms.py 添加 AuthForm表单
# 5.权限得表单
class AuthForm(FlaskForm):
name=StringField(
label='权限名称',
validators=[DataRequired('权限名称不能为空')],
description='权限名称',
render_kw={
'class':'form-control',
'placeholder':'请输入权限名称'
}
)
url=StringField(
label='权限地址',
validators=[DataRequired('权限地址不能为空')],
description='权限地址',
render_kw={
'class': 'form-control',
'placeholder': '请输入权限地址'
}
)
submit=SubmitField(
'添加',
render_kw={
'class':'btn btn-primary'
}
)
39.4 views.py添加 auth_add,auth_list,auth_edit,auth_del
auth_add,
#25.权限管理-权限添加
@admin.route("/auth_add/",methods=['GET','POST'])
def auth_add():
form=AuthForm()
if form.validate_on_submit():
data=form.data
auth=Auth(
name=data['name'],
url=data['url']
)
db.session.add(auth)
db.session.commit()
flash("权限添成功",'ok')
return render_template("admin/auth_add.html",form=form)
auth_list,
#26.日志管理-会员登录日志列表
@admin.route("/auth_list/",methods=['GET'])
def auth_list(page=None):
#26.1判断是否
if page is None:
page=1
#26.2
page_data=Auth.query.order_by(
Auth.addtime.desc()
).paginate(page=page,per_page=1)
return render_template("admin/auth_list.html",page_data=page_data)
auth_edit,
#27.权限管理-权限编辑
@admin.route("/auth_edit/",methods=['GET','POST'])
def auth_edit(id=None):
form=AuthForm()
auth=Auth.query.get_or_404(id)
form.submit.label.text='编辑'
if form.validate_on_submit():
data=form.data
auth.url=data['url']
auth.name=data['name']
db.session.add(auth)
db.session.commit()
flash("修改权限成功",'ok')
redirect(url_for('admin.auth_edit',id=id))
return render_template("admin/auth_edit.html",form=form,auth=auth)
auth_del
#28.权限管理-权限删除
@admin.route("/auth_del/",methods=['GET'])
def auth_del(id=None):
auth=Auth.query.filter_by(id=id).first_or_404()
db.session.delete(auth)
db.session.commit()
flash("删除权限成功!",'ok')
return redirect(url_for("admin.auth_list",page=1))
39.5 admin文件夹中添加 auth_add.html,auth_list.html,auth_edit.html
auth_add.html
{% extends 'admin/admin.html' %}
{% block content %}
星空电影管理系统 | 后台
添加权限
{% endblock %}
{% block js %}
{% endblock %}
,auth_list.html
{% extends 'admin/admin.html' %}
{% import 'ui/admin_page.html' as pg %}
{% block content %}
星空电影管理系统 | 后台
权限列表
{% for msg in get_flashed_messages(category_filter=['ok']) %}
操作成功
{{ msg }}
{% endfor %}
{% for msg in get_flashed_messages(category_filter=['err']) %}
操作失败
{{ msg }}
{% endfor %}
编号
名称
地址
添加时间
操作事项
{% for v in page_data.items %}
{{ v.id }}
{{ v.name }}
{{ v.url }}
{{ v.addtime }}
编辑
删除
{% endfor %}
{% endblock %}
{% block js %}
{% endblock %}
,auth_edit.html
{% extends 'admin/admin.html' %}
{% block content %}
星空电影管理系统 | 后台
权限编辑
{% endblock %}
{% block js %}
{% endblock %}
40.1 grid.html 添加角色管理
角色管理
2
40.2 models.py 编写Role模型
#11.角色
class Role(db.Model):
__tablename__='role'
__table_args__={'useexisting':True}
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(100),unique=True)
# auths = db.Column(db.String(600),db.ForeignKey('auth.id'))
auths=db.Column(db.String(600))
addtime=db.Column(db.DateTime,index=True,default=datetime.now)
admins = db.relationship('Admin', backref='role') # 管理员外键关联
# auths=db.relationship('Auth',backref='role')
def __repr__(self):
return ""%self.name
40.3 forms.py 添加RoleForm表单
# 6.角色的表单
class RoleForm(FlaskForm):
name=StringField(
label='角色名称',
validators=[DataRequired('角色名称不能为空')],
description='角色名称',
render_kw={
'class':'form-control',
'placeholder':'请输入角色名称'
}
)
auths=SelectMultipleField(
label='权限列表',
validators=[DataRequired("权限列表不能为空!")],
# 动态数据填充选择栏 列表生成器
coerce=int,
choices=[(v.id,v.name) for v in Auth.query.all()],
description='权限列表',
render_kw={
'class':'form-control'
}
)
submit=SubmitField(
'添加',
render_kw={
'class':'btn btn-primary'
}
)
40.4 views.py添加 role_add,role_list,role_edit,role_del
role_add
#29.角色管理-角色添加
@admin.route("/role_add",methods=['GET','POST'])
def role_add():
#29.1
form=RoleForm()
#29.2 判断表单中按钮是否点击
if form.validate_on_submit():
#29.3 获取表单数据
data=form.data
role=Role(
name=data['name'],
auths=','.join(map(lambda v:str(v),data['auths']))
)
db.session.add(role)
db.session.commit()
flash("添加角色成功!",'ok')
return render_template("admin/role_add.html",form=form)
,role_list,
#30.角色管理-角色列表
@admin.route("/role_list/",methods=['GET'])
def role_list(page=None):
#30.1判断是否page为none
if page is None:
page=1
#30.2 查询并分页数据
page_data=Role.query.order_by(
Role.addtime.desc()
).paginate(page=page,per_page=1)
'''角色权限显示权限名称'''
for v in page_data.items:
# 设置显示的字符串
auths_str=''
#auths
if v.auths:
# 对权限列表字段值进行切割 返回列表['3','6','7']
ah_list=v.auths.split(',')
# 循环遍历权限列表值
for ix in ah_list:
#根据id查询auth权限表中的名称数据
ah=Auth.query.filter_by(id=int(ix)).first_or_404()
#添加数据
auths_str+=ah.name+','
else:
auths_str='无任何权限'
# 将需要显示的数据设置到分页数据中
v.auths=auths_str
return render_template("admin/role_list.html",page_data=page_data)
role_edit
#31.角色管理-角色编辑
@admin.route("/role_edit/",methods=['GET','POST'])
def role_edit(id=None):
form=RoleForm()
role=Role.query.get_or_404(id)
form.submit.label.text='修改'
if request.method=='GET' and role.auths:
auths=role.auths
form.auths.data=list(map(lambda v:int(v),auths.split(',')))
# 31.5 判断表单是否点击了按钮
if form.validate_on_submit():
#31.5.2
data=form.data
#31.5.2
role.name=data['name']
#31.5.3 根据权限值设置 添加的权限列表值
role.auths=','.join(map(lambda v:str(v),data['auths']))
db.session.add(role)
db.session.commit()
flash('修改角色成功了!','ok')
return render_template("admin/role_edit.html",form=form,role=role)
role_del
#32.角色管理-角色删除
@admin.route("/role_del/",methods=['GET'])
def role_del(id=None):
role=Role.query.filter_by(id=id).first_or_404()
db.session.delete(role)
db.session.commit()
flash("删除角色成功!",'ok')
return redirect(url_for("admin.role_list",page=1))
40.5 admin文件夹中添加role_add.html,role_list.html,role_edit.html
role_add.html
{% extends 'admin/admin.html' %}
{% block css %}
{% endblock %}
{% block content %}
星空电影管理系统 | 后台
添加角色
{% endblock %}
{% block js %}
{% endblock %}
role_list.html
{% extends 'admin/admin.html' %}
{% import 'ui/admin_page.html' as pg %}
{% block content %}
星空电影管理系统 | 后台
角色列表
{% for msg in get_flashed_messages(category_filter=['ok']) %}
操作成功
{{ msg }}
{% endfor %}
{% for msg in get_flashed_messages(category_filter=['err']) %}
操作失败
{{ msg }}
{% endfor %}
编号
名称
权限
添加时间
操作事项
{% for v in page_data.items %}
{{ v.id }}
{{ v.name }}
{{ v.auths }}
{{ v.addtime }}
编辑
删除
{% endfor %}
{% endblock %}
{% block js %}
{% endblock %}
role_edit.html
{% extends 'admin/admin.html' %}
{% block css %}
{% endblock %}
{% block content %}
星空电影管理系统 | 后台
角色编辑
{% endblock %}
{% block js %}
{% endblock %}
添加管理员
41.1 grid.html 添加权限管理
管理员管理
2
41.2 models.py 编写 Admin模型
# 1.管理员
class Admin(db.Model):
# 1.设置表格名称(数据库表一致)
__tablename__ = 'admin'
# 2.表格是否存在
__table_args__ = {'useexisting':True}
# 3.设置映射
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') #管理员操作日志外键关联
# 4.显示对象属性
def __repr__(self):
return ''%self.name
# 5.检查密码
def check_pwd(self,pwd):
# 系统密码
print("系统密码:",self.pwd)
# 用户密码
print("用户密码:",pwd)
return check_password_hash(self.pwd,pwd)
41.3 forms.py 添加 AdminForm表单
# 7.管理员的表单
class AdminForm(FlaskForm):
name = StringField(
label='管理员名称',
validators=[DataRequired("管理员名不能为空")],
description='管理员名称',
render_kw={
'class': 'form-control',
'placeholder': '请输入管理员名称!!'
})
pwd = PasswordField(
label='管理员密码',
validators=[DataRequired('管理员密码不能为空')],
description='管理员密码',
render_kw={
'class': 'form-control',
'placeholder': '请输入管理员密码'
})
repwd = PasswordField(
label='管理员重复密码',
validators=[DataRequired('管理员重复密码不能为空'),
EqualTo('pwd',message='两次密码不一致')],
description='管理员重复密码',
render_kw={
'class': 'form-control',
'placeholder': '请输入管理员重复密码'
})
role_id=SelectField(
label='所属角色',
coerce=int,
choices=[(v.id,v.name) for v in Role.query.all()],
render_kw={
'class':'form-control'
}
)
submit = SubmitField(
'编辑',
render_kw={
'class': 'btn btn-primary'
}
)
41.4 views.py添加 admin_add,admin_list,admin_del
admin_add
#33.管理员管理-管理员添加
@admin.route("/admin_add",methods=['GET','POST'])
@admin_login_req
def admin_add():
form = AdminForm()
if form.validate_on_submit():
data=form.data
admin=Admin(
name=data['name'],
pwd=generate_password_hash(data['pwd']),
role_id=data['role_id'],
is_super=1
)
#33.5
db.session.add(admin)
db.session.commit()
flash("添加管理员成功!",'ok')
return render_template("admin/admin_add.html",form=form)
,admin_list
#34.管理员管理-管理员列表
@admin.route("/admin_list/",methods=['GET'])
def admin_list(page=None):
#34.1 判断page是否有值
if page is None:
page=1
#34.2分页查询数据
page_data=Admin.query.join(Role).filter(
Role.id==Admin.role_id
).order_by(
Admin.addtime.desc()
).paginate(page=page,per_page=1)
'''34.3 根据session中的id值进行查询is_supper的值'''
#获取登录的用户id的值
account_id=session['admin_id']
#查询数据
adm=Admin.query.filter_by(id=account_id).first_or_404()
# 将查询数据传递到前端页面
return render_template("admin/admin_list.html",
page_data=page_data,
isSuper=adm.is_super)
,admin_del
#35.管理员管理-管理员删除
@admin.route("/admin_del/",methods=['GET'])
def admin_del(id=None):
admin=Admin.query.filter_by(id=id).first_or_404()
db.session.delete(admin)
db.session.commit()
flash("删除管理员成功!",'ok')
return redirect(url_for("admin.admin_list",page=1))
41.5 admin文件夹中添加 admin_add.html,admin_list.html
admin_add.html,
{% extends 'admin/admin.html' %}
{% block content %}
星空电影管理系统 | 后台
添加管理员
{% endblock %}
{% block js %}
{% endblock %}
admin_list.html
{% extends 'admin/admin.html' %}
{% import 'ui/admin_page.html' as pg %}
{% block content %}
星空电影管理系统 | 后台
管理员列表
{% for msg in get_flashed_messages(category_filter=['ok']) %}
操作成功
{{ msg }}
{% endfor %}
{% for msg in get_flashed_messages(category_filter=['err']) %}
操作失败
{{ msg }}
{% endfor %}
编号
管理员名称
管理员类型
管理员角色
添加时间
{% if isSuper==0 %}
操作事项
{% endif %}
{% for v in page_data.items %}
{{ v.id }}
{{ v.name }}
{% if v.is_super==0 %}
超级管理员
{% else %}
普通管理员
{% endif %}
{{ v.role.name }}
{{ v.addtime }}
{% if isSuper==0 %}
删除
{% endif %}
{% endfor %}
{% endblock %}
{% block js %}
{% endblock %}
42.1 admin.html 添加修改密码请求
42.2 views.py中 添加pwd函数
42.3admin文件夹中添加pwd.html页面
43.1 admin.html 添加退出系统请求
43.2 views.py中 添加logout函数
44.1 views.py中添加admin_login_req(f)
44.2 将所有的请求上方添加登录装饰器
删除