Flask微电影管理系统 views.py

import datetime
import uuid
from functools import wraps

import os
from werkzeug.utils import secure_filename

from app import db, app
from app.admin import admin
from flask import render_template, flash, redirect, \
    url_for, session, request
from app.admin.forms import LoginForm, TagForm, MovieForm, PreviewForm, RoleForm, AuthForm, AdminForm
from app.models import Admin, Adminlog, Tag, Oplog, Movie, Preview, User, Comment, Moviecol, Userlog, Role, Auth


# # 登录装饰器
def admin_login_req(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if "admin" not in session:
            return redirect(url_for("admin.login", next=request.url))
        return f(*args, **kwargs)

    return decorated_function


# 装饰器: 判断用户权限控制
def admin_auth(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        # # 获取登录管理员的对象, 实现下述操作;
        # admin = Admin.query.join(
        #     Role
        # ).filter(
        #     Role.id == Admin.role_id,
        #     Admin.id == session['admin_id']
        # ).first()
        #
        # # 查看登录管理员权限;   # ['1', '2']
        # auths = admin.role.auths
        #
        # # 管理员权限处理(所有权限转换为整形)  #[1,2]
        # auths = list(map(lambda v: int(v), auths.split(',')))
        #
        # # 获取所有的权限列表
        # auth_list = Auth.query.all()
        # print(auth_list)
        #
        # # 找出登录管理员拥有权限对应的url地址;
        # urls = [v.url for v in auth_list for val in auths if val == v.id]
        #
        # # 获取用户要访问的url
        # rule = str(request.url_rule)
        #
        # from flask import abort
        # if rule not in urls:
        #     return "用户拥有的权限为{}, 现在访问的为{}".format(urls, rule)
        return f(*args, **kwargs)

    return wrapper


# 修改文件名称
def change_filename(filename):
    fileinfo = os.path.splitext(filename)
    filename = datetime.datetime.now().strftime("%Y%m%d%H%M%S") + str(uuid.uuid4().hex) + fileinfo[-1]
    return filename


@admin.route('/')
@admin_login_req  # 访问控制
def index():
    # return  "admin"
    return render_template('admin/index.html')


# 用户登录
@admin.route('/login', methods=['POST', 'GET'])
def login():
    # 创建表单对象
    form = LoginForm()

    # 当用户提交表单时:
    #   1). 查询用户和密码是否正确?
    #   2). 加入session缓存中;
    #   3), 登录信息存入登录日志的数据库中;
    if form.validate_on_submit():
        data = form.data
        admin = Admin.query.filter_by(name=data["account"]).first()
        if not admin.check_pwd(data["pwd"]):
            flash("密码错误!", 'err')
            return redirect(url_for("admin.login"))
        session["admin"] = data["account"]
        session["admin_id"] = admin.id
        # 管理员操作日志
        adminlog = Adminlog(
            admin_id=admin.id,
            ip=request.remote_addr,
        )
        db.session.add(adminlog)
        db.session.commit()
        return redirect(url_for("admin.index"))
    return render_template("admin/login.html", form=form)


# 退出, 清除服务器端缓存
@admin.route('/logout/')
@admin_login_req
def logout():
    session.pop("admin", None)
    session.pop("admin_id", None)
    return redirect(url_for("admin.login"))


#
# # 修改密码
# @admin.route("/pwd/", methods=["GET", "POST"])
# @admin_login_req
# def pwd():
#     form = PwdForm()
#     if form.validate_on_submit():
#         # 修改密码
#         #   1). 查看缓存会话中用户是否存在?
#         #   2). 判断原密码是否正确?
#         #   3). 获取新密码并更新数据库;
#         data = form.data
#         admin = Admin.query.filter_by(name=session["admin"]).first()
#         from werkzeug.security import generate_password_hash
#         admin.pwd = generate_password_hash(data["new_pwd"])
#         db.session.add(admin)
#         db.session.commit()
#         flash("修改密码成功,请重新登录!", "ok")
#         redirect(url_for('admin.logout'))
#     return render_template("admin/pwd.html", form=form)
#
#
# # ****************************************标签管理*************************************************
#
# 添加标签
@admin.route("/tag/add/", methods=["GET", "POST"])
@admin_login_req
@admin_auth
def tag_add():
    form = TagForm()

    # 添加标签
    #   1). 获取提交表单内容
    #   2). 判断要添加的标签是否存在?
    #   3). 如果存在,则报错;
    #   4). 如果不存在, 则添加到数据表Tag中, 并将操作写入日志数据表中;
    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"]
        )
        db.session.add(tag)
        db.session.commit()
        flash("添加标签成功!", "ok")
        oplog = Oplog(
            admin_id=session["admin_id"],
            ip=request.remote_addr,
            reason="添加标签%s" % data["name"]
        )
        db.session.add(oplog)
        db.session.commit()
        redirect(url_for('admin.tag_add'))
    return render_template("admin/tag/tag_add.html", form=form)


# 编辑标签
@admin.route("/tag/edit/<int:id>/", methods=["GET", "POST"])
@admin_login_req
@admin_auth
def tag_edit(id=None):
    form = TagForm()
    tag = Tag.query.get_or_404(id)

    if request.method == 'GET':
        form.name.data = tag.name

    # 编辑标签
    #   1). 获取要编辑标签的对象;
    #   2). 判断修改后的标签是否已经存在?
    #   3). 如果存在, 则报错;
    #   4). 如果不存在, 则将修改的信息提交到数据库中;
    if form.validate_on_submit():
        data = form.data
        tag_count = Tag.query.filter_by(name=data["name"]).count()
        if tag.name != data["name"] and tag_count == 1:
            flash("名称已经存在!", "err")
            return redirect(url_for('admin.tag_edit', id=id))
        tag.name = data["name"]
        db.session.add(tag)
        db.session.commit()
        flash("修改标签成功!", "ok")
        redirect(url_for('admin.tag_edit', id=id))
    return render_template("admin/tag/tag_edit.html", form=form, tag=tag)


# 标签列表
@admin.route("/tag/list/<int:page>/", methods=["GET"])
@admin_login_req
@admin_auth
def tag_list(page=1):
    # 标签列表
    #   1). 获取所有的标签内容;
    #   2). 根据标签的创建时间进行排序输出;
    #   3). 通过paginate进行分页(page代表显示第几页, per_page代表每页显示的内容数量)
    page_data = Tag.query.order_by(
        Tag.addtime.desc()
    ).paginate(page=page, per_page=10)
    return render_template("admin/tag/tag_list.html", page_data=page_data)


# 标签删除
@admin.route("/tag/del/<int:id>/", methods=["GET"])
@admin_login_req
@admin_auth
def tag_del(id=None):
    tag = Tag.query.filter_by(id=id).first_or_404()
    db.session.delete(tag)
    db.session.commit()
    flash("删除标签成功!", "ok")
    return redirect(url_for('admin.tag_list', page=1))


# # **************************************电影管理***************************************


# 添加电影
@admin.route("/movie/add/", methods=["GET", "POST"])
@admin_login_req
@admin_auth
def movie_add():
    form = MovieForm()
    if form.validate_on_submit():
        # 添加电影
        #   1). 获取电影视频的内容和电影的logo, 并将其保存到本地static目录中;
        #   2). 将电影的相关信息保存到movie数据库表中;
        #   3). 注意: logo和电影在数据库中存储的是文件路径, 而不是二进制数据;
        data = form.data
        file_url = secure_filename(form.url.data.filename)
        file_logo = secure_filename(form.logo.data.filename)
        if not os.path.exists(app.config["UP_DIR"]):
            os.makedirs(app.config["UP_DIR"])
        url = change_filename(file_url)
        logo = change_filename(file_logo)
        form.url.data.save(app.config["UP_DIR"] + url)
        form.logo.data.save(app.config["UP_DIR"] + logo)

        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"]
        )
        db.session.add(movie)
        db.session.commit()
        flash("添加电影成功!", "ok")
        return redirect(url_for('admin.movie_add'))
    return render_template("admin/movie/movie_add.html", form=form)


# 删除电影
@admin.route("/movie/del/<int:id>/", methods=["GET"])
@admin_login_req
@admin_auth
def movie_del(id=None):
    # 删除电影
    #   1). 通过电影id号获取电影对象;
    #   2). delete方法删除即可;
    movie = Movie.query.get_or_404(int(id))

    db.session.delete(movie)
    db.session.commit()
    flash("删除电影成功!", "ok")
    return redirect(url_for('admin.movie_list', page=1))


# 编辑电影
@admin.route("/movie/edit/<int:id>/", methods=["GET", "POST"])
@admin_login_req
@admin_auth
def movie_edit(id=None):
    """
    编辑电影
        1). 如果是get方法, 显示数据库中该电影的信息;
        2). 如果提交修改的电影信息时,  判断电影名称, 电影视频名称, logo名称是否冲突?
        3). 如果冲突, 则报错;
        4). 如果没有冲突,将修改的信息写入数据库中;
    """

    form = MovieForm()
    form.url.validators = []
    form.logo.validators = []
    movie = Movie.query.get_or_404(int(id))
    if request.method == "GET":
        form.title.data = movie.title
        form.info.data = movie.info
        form.tag_id.data = movie.tag_id
        form.star.data = movie.star
        form.area.data = movie.area
        form.release_time.data = movie.release_time
        form.logo.data = movie.logo
    if form.validate_on_submit():
        data = form.data
        movie_count = Movie.query.filter_by(title=data["title"]).count()
        if movie_count == 1 and movie.title != data["title"]:
            flash("片名已经存在!", "err")
            return redirect(url_for('admin.movie_edit', id=id))

        if form.url.data.filename != "":
            file_url = secure_filename(form.url.data.filename)
            movie.url = change_filename(file_url)
            form.url.data.save(app.config["UP_DIR"] + movie.url)

        if form.logo.data.filename != "":
            file_logo = secure_filename(form.logo.data.filename)
            movie.logo = change_filename(file_logo)
            form.logo.data.save(app.config["UP_DIR"] + movie.logo)

        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"]
        db.session.add(movie)
        db.session.commit()
        flash("修改电影成功!", "ok")
        return redirect(url_for('admin.movie_edit', id=id))
    return render_template("admin/movie/movie_edit.html", form=form, movie=movie)


# 电影列表
@admin.route("/movie/list/<int:page>/", methods=["GET"])
@admin_login_req
@admin_auth
def movie_list(page=None):
    if page is None:
        page = 1
    page_data = Movie.query.join(Tag).filter(
        Tag.id == Movie.tag_id
    ).order_by(
        Movie.addtime.desc()
    ).paginate(page=page, per_page=10)
    return render_template("admin/movie/movie_list.html", page_data=page_data)


#
# # *****************************电影预告************************************************
# 添加预告
@admin.route("/preview/add/", methods=["GET", "POST"])
@admin_login_req
@admin_auth
def preview_add():
    """
    # 添加预告
        1). 如果是get方法, 则返回预告添加页面;
        2). 如果是post方法, 则获取用户提交的预告封面和预告标题, 将其保存在数据库中;
    """
    form = PreviewForm()
    if form.validate_on_submit():
        data = form.data
        file_logo = secure_filename(form.logo.data.filename)
        if not os.path.exists(app.config["UP_DIR"]):
            os.makedirs(app.config["UP_DIR"])
        logo = change_filename(file_logo)
        print(logo)
        print(app.config["UP_DIR"] + logo)
        form.logo.data.save(app.config["UP_DIR"] + logo)
        preview = Preview(
            title=data["title"],
            logo=logo
        )
        db.session.add(preview)
        db.session.commit()
        flash("添加预告成功!", "ok")
        return redirect(url_for('admin.preview_add'))
    return render_template("admin/preview/preview_add.html", form=form)


# 删除预告
@admin.route("/preview/del/<int:id>/", methods=["GET"])
@admin_login_req
@admin_auth
def preview_del(id=None):
    """
    1). 根据预告的id号删除预告信息;
    2). 如果查询该预告存在, 则删除;
    :param id:
    :return:
    """
    preview = Preview.query.get_or_404(int(id))
    db.session.delete(preview)
    db.session.commit()
    flash("删除预告成功!", "ok")
    return redirect(url_for('admin.preview_list', page=1))


# 编辑预告
@admin.route("/preview/edit/<int:id>/", methods=["GET", "POST"])
@admin_login_req
@admin_auth
def preview_edit(id):
    form = PreviewForm()
    form.logo.validators = []
    preview = Preview.query.get_or_404(int(id))
    if request.method == "GET":
        form.title.data = preview.title
    if form.validate_on_submit():
        data = form.data
        if form.logo.data.filename != "":
            file_logo = secure_filename(form.logo.data.filename)
            preview.logo = change_filename(file_logo)
            form.logo.data.save(app.config["UP_DIR"] + preview.logo)
        preview.title = data["title"]
        db.session.add(preview)
        db.session.commit()
        flash("修改预告成功!", "ok")
        return redirect(url_for('admin.preview_edit', id=id))
    return render_template("admin/preview/preview_edit.html", form=form, preview=preview)


# 预告列表
@admin.route("/preview/list/<int:page>/", methods=["GET"])
@admin_login_req
@admin_auth
def preview_list(page=1):
    """
    预告列表
        1). 从数据库表中查看所有预告信息,按照时间顺序进行显示;
        2). paginate是分页需要的数据;

    :param page: 查看预告的第几页
    :return:
    """
    page_data = Preview.query.order_by(
        Preview.addtime.desc()
    ).paginate(page=page, per_page=10)
    return render_template("admin/preview/preview_list.html", page_data=page_data)


# # ********************************会员信息 **************************************
# 会员列表
@admin.route("/user/list/<int:page>/", methods=["GET"])
@admin_login_req
@admin_auth
def user_list(page=1):
    page_data = User.query.order_by(
        User.addtime.desc()
    ).paginate(page=page, per_page=10)
    return render_template("admin/admin/user_list.html", page_data=page_data)


# 查看会员
@admin.route("/user/view/<int:id>/", methods=["GET"])
@admin_login_req
@admin_auth
def user_view(id=None):
    user = User.query.get_or_404(int(id))
    return render_template("admin/admin/user_view.html", user=user)


# 删除会员
@admin.route("/user/del/<int:id>/", methods=["GET"])
@admin_login_req
@admin_auth
def user_del(id=None):
    user = User.query.filter_by(id=id).first()
    db.session.delete(user)
    db.session.commit()
    flash("删除会员成功!", "ok")
    return redirect(url_for('admin.user_list', page=1))


# *******************评论列表**************************************
@admin.route("/comment/list/<int:page>/", methods=["GET"])
@admin_login_req
def comment_list(page=1):
    """
    根据用户id和电影id显示评论信息, 按照时间顺序显示;
    """
    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=10)
    return render_template("admin/comment/comment_list.html", page_data=page_data)


# 删除评论
@admin.route("/comment/del/<int:id>/", methods=["GET"])
@admin_login_req
@admin_auth
def comment_del(id=None):
    comment = Comment.query.get_or_404(int(id))
    db.session.delete(comment)
    db.session.commit()
    flash("删除评论成功!", "ok")
    return redirect(url_for('admin.comment_list', page=1))


# *****************************收藏列表**********************************

# 收藏列表
@admin.route("/moviecol/list/<int:page>/", methods=["GET"])
@admin_login_req
def moviecol_list(page=1):
    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=10)

    return render_template("admin/moviecol_list.html", page_data=page_data)


# 收藏删除
@admin.route("/moviecol/del/<int:id>/", methods=["GET"])
@admin_login_req
@admin_auth
def moviecol_del(id=None):
    moviecol = Moviecol.query.get_or_404(int(id))
    db.session.delete(moviecol)
    db.session.commit()
    flash("删除收藏成功!", "ok")
    return redirect(url_for('admin.moviecol_list', page=1))


# ****************************操作日志**************************************

# 操作日志
@admin.route("/oplog/list/<int:page>/", methods=["GET"])
@admin_login_req
def oplog_list(page=1):
    page_data = Oplog.query.join(
        Admin
    ).filter(
        Admin.id == Oplog.admin_id,
    ).order_by(
        Oplog.addtime.desc()
    ).paginate(page=page, per_page=10)
    return render_template("admin/log/oplog_list.html", page_data=page_data)


# # 管理员登录日志
@admin.route("/adminloginlog/list/<int:page>/", methods=["GET"])
@admin_login_req
def adminloginlog_list(page=None):
    if page is None:
        page = 1
    page_data = Adminlog.query.join(
        Admin
    ).filter(
        Admin.id == Adminlog.admin_id,
    ).order_by(
        Adminlog.addtime.desc()
    ).paginate(page=page, per_page=10)
    return render_template("admin/log/adminloginlog_list.html", page_data=page_data)


# 会员登录日志
@admin.route("/userloginlog/list/<int:page>/", methods=["GET"])
@admin_login_req
def userloginlog_list(page=None):
    if page is None:
        page = 1
    page_data = Userlog.query.join(
        User
    ).filter(
        User.id == Userlog.user_id,
    ).order_by(
        Userlog.addtime.desc()
    ).paginate(page=page, per_page=10)
    return render_template("admin/log/userloginlog_list.html", page_data=page_data)


# **********************************权限管理*******************************************
@admin.route("/auth/add/", methods=["GET", "POST"])
@admin_login_req
@admin_auth
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/auth_add.html", form=form)


# 权限列表
@admin.route("/auth/list/<int:page>/", methods=["GET"])
@admin_login_req
def auth_list(page=None):
    if page is None:
        page = 1
    page_data = Auth.query.order_by(
        Auth.addtime.desc()
    ).paginate(page=page, per_page=10)
    return render_template("admin/auth/auth_list.html", page_data=page_data)


# 权限删除
@admin.route("/auth/del/<int:id>/", methods=["GET"])
@admin_login_req
@admin_auth
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))


# 编辑权限
@admin.route("/auth/edit/<int:id>/", methods=["GET", "POST"])
@admin_login_req
@admin_auth
def auth_edit(id=None):
    form = AuthForm()
    auth = Auth.query.get_or_404(id)
    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/auth_edit.html", form=form, auth=auth)


# ******************************角色操作******************************
# 添加角色
@admin.route("/role/add/", methods=["GET", "POST"])
@admin_login_req
@admin_auth
def role_add():
    form = RoleForm()
    if form.validate_on_submit():
        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/role_add.html", form=form)


# 编辑角色
@admin.route("/role/edit/<int:id>/", methods=["GET", "POST"])
@admin_login_req
@admin_auth
def role_edit(id=None):
    form = RoleForm()
    role = Role.query.get_or_404(id)
    if request.method == "GET":
        auths = role.auths
        form.auths.data = list(map(lambda v: int(v), auths.split(",")))
    if form.validate_on_submit():
        data = form.data
        role.name = data["name"]
        role.auths = ",".join(map(lambda v: str(v), data["auths"]))
        db.session.add(role)
        db.session.commit()
        flash("修改角色成功!", "ok")
    return render_template("admin/role/role_edit.html", form=form, role=role)


# 角色列表
@admin.route("/role/list/<int:page>/", methods=["GET"])
@admin_login_req
def role_list(page=None):
    if page is None:
        page = 1
    page_data = Role.query.order_by(
        Role.addtime.desc()
    ).paginate(page=page, per_page=10)
    return render_template("admin/role/role_list.html", page_data=page_data)


# 删除角色
@admin.route("/role/del/<int:id>/", methods=["GET"])
@admin_login_req
@admin_auth
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))


# ****************************管理员************************************

# 添加管理员
@admin.route("/admin/add/", methods=["GET", "POST"])
@admin_login_req
@admin_auth
def admin_add():
    form = AdminForm()
    from werkzeug.security import generate_password_hash
    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
        )
        db.session.add(admin)
        db.session.commit()
        flash("添加管理员成功!", "ok")
    return render_template("admin/superadmin/admin_add.html", form=form)


# 管理员列表
@admin.route("/admin/list/<int:page>/", methods=["GET"])
@admin_login_req
def admin_list(page=None):
    if page is None:
        page = 1
    page_data = Admin.query.join(
        Role
    ).filter(
        Role.id == Admin.role_id
    ).order_by(
        Admin.addtime.desc()
    ).paginate(page=page, per_page=10)
    return render_template("admin/superadmin/admin_list.html", page_data=page_data)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值