使用flask-restful实现数据校验与序列化

This commit is contained in:
zhengxinonly
2021-06-26 03:17:29 +08:00
parent 8fba71c464
commit b8870d4c33
27 changed files with 273 additions and 533 deletions
View File
-145
View File
@@ -1,145 +0,0 @@
from sqlalchemy import and_
from applications.extensions import db
from applications.models import Role, RoleSchema
from applications.models.rights.power import Power, PowerSchema2
from applications.models import User
# 获取角色对象
from applications.common.curd import model_to_dicts
def get_role_data(page, limit, filters):
print(page, limit, filters)
role = Role.query.filter(and_(*[getattr(Role, k).like(v) for k, v in filters.items()])).paginate(page=page,
per_page=limit,
error_out=False)
count = Role.query.count()
return role, count
def get_role_data_dict(page, limit, filters):
""" 获取角色dict """
role, count = get_role_data(page, limit, filters)
data = model_to_dicts(Schema=RoleSchema, model=role.items)
return data, count
def add_role(req):
""" 增加角色 """
details = req.get("details")
enable = req.get("enable")
roleCode = req.get("roleCode")
roleName = req.get("roleName")
sort = req.get("sort")
role = Role(
details=details,
enable=enable,
code=roleCode,
name=roleName,
sort=sort
)
db.session.add(role)
db.session.commit()
def get_role_by_id(_id):
""" 通过id获取角色 """
r = Role.query.filter_by(id=_id).first()
return r
def update_role(req_json):
""" 更新角色 """
_id = req_json.get("roleId")
data = {
"code": req_json.get("roleCode"),
"name": req_json.get("roleName"),
"sort": req_json.get("sort"),
"enable": req_json.get("enable"),
"details": req_json.get("details")
}
role = Role.query.filter_by(id=_id).update(data)
db.session.commit()
return role
def get_role_power(_id):
""" 获取角色的权限 """
role = Role.query.filter_by(id=_id).first()
check_powers = role.power
check_powers_list = []
for cp in check_powers:
check_powers_list.append(cp.id)
powers = Power.query.all()
power_schema = PowerSchema2(many=True) # 用已继承ma.ModelSchema类的自定制类生成序列化类
output = power_schema.dump(powers) # 生成可序列化对象
for i in output:
if int(i.get("powerId")) in check_powers_list:
i["checkArr"] = "1"
else:
i["checkArr"] = "0"
return output
def update_role_power(_id, power_list):
""" 更新角色权限 """
role = Role.query.filter_by(id=_id).first()
power_id_list = []
for p in role.power:
power_id_list.append(p.id)
powers = Power.query.filter(Power.id.in_(power_id_list)).all()
for p in powers:
role.power.remove(p)
powers = Power.query.filter(Power.id.in_(power_list)).all()
for p in powers:
role.power.append(p)
db.session.commit()
def enable_status(_id):
""" 启用角色 """
enable = 1
role = Role.query.filter_by(id=_id).update({"enable": enable})
if role:
db.session.commit()
return True
return False
def disable_status(_id):
""" 停用角色 """
enable = 0
role = Role.query.filter_by(id=_id).update({"enable": enable})
if role:
db.session.commit()
return True
return False
def remove_role(_id):
""" 删除角色 """
role = Role.query.filter_by(id=_id).first()
# 删除该角色的权限
power_id_list = []
for p in role.power:
power_id_list.append(p.id)
powers = Power.query.filter(Power.id.in_(power_id_list)).all()
for p in powers:
role.power.remove(p)
user_id_list = []
for u in role.user:
user_id_list.append(u.id)
users = User.query.filter(User.id.in_(user_id_list)).all()
for u in users:
role.user.remove(u)
r = Role.query.filter_by(id=id).delete()
db.session.commit()
return r
def batch_remove(ids):
""" 批量删除 """
for _id in ids:
remove_role(_id)
@@ -0,0 +1,15 @@
from flask_restful import fields
power_fields = {
'powerId': fields.String(attribute="id"),
'powerName': fields.String(attribute="name"),
'powerType': fields.String(attribute="type"),
'powerUrl': fields.String(attribute="url"),
'openType': fields.String(attribute="open_type"),
'parentId': fields.String(attribute="parent_id"),
'icon': fields.String,
'sort': fields.Integer,
'create_time': fields.DateTime,
'update_time': fields.DateTime,
'enable': fields.Integer,
}
@@ -2,8 +2,6 @@ import json
from flask import Flask from flask import Flask
from applications.extensions.init_databases.data import user_data
def add_data(fields, data_list, obj): def add_data(fields, data_list, obj):
from applications.extensions import db from applications.extensions import db
@@ -79,7 +77,7 @@ def create_admin_power():
_data_list = \ _data_list = \
[ [
(1, '系统管理', '0', '', None, None, '0', 'layui-icon layui-icon-set-fill', 1, None, None, 1), (1, '系统管理', '0', '', None, None, '0', 'layui-icon layui-icon-set-fill', 1, None, None, 1),
(3, '用户管理', '1', 'admin:user:main', '/admin/user/', '_iframe', '1', (3, '用户管理', '1', 'admin:user:main', '/users/', '_iframe', '1',
'layui-icon layui-icon layui-icon layui-icon layui-icon-rate', 1, None, None, 1), 'layui-icon layui-icon layui-icon layui-icon layui-icon-rate', 1, None, None, 1),
(4, '权限管理', '1', 'admin:power:main', '/rights/', '_iframe', '1', None, 2, None, None, 1), (4, '权限管理', '1', 'admin:power:main', '/rights/', '_iframe', '1', None, 2, None, None, 1),
(9, '角色管理', '1', 'admin:role:main', '/admin/role', '_iframe', '1', 'layui-icon layui-icon-username', 2, (9, '角色管理', '1', 'admin:role:main', '/admin/role', '_iframe', '1', 'layui-icon layui-icon-username', 2,
@@ -88,11 +86,11 @@ def create_admin_power():
12, '系统监控', '1', 'admin:monitor:main', '/admin/monitor', '_iframe', '1', 12, '系统监控', '1', 'admin:monitor:main', '/admin/monitor', '_iframe', '1',
'layui-icon layui-icon-vercode', 5, 'layui-icon layui-icon-vercode', 5,
'2021-03-18 22:05:19', '2021-03-25 19:15:27', 1), '2021-03-18 22:05:19', '2021-03-25 19:15:27', 1),
(13, '日志管理', '1', 'admin:log:main', '/admin/log', '_iframe', '1', 'layui-icon layui-icon-read', 4, (13, '日志管理', '1', 'admin:log:main', '/logs', '_iframe', '1', 'layui-icon layui-icon-read', 4,
'2021-03-18 22:37:10', '2021-06-03 11:06:25', 1), '2021-03-18 22:37:10', '2021-06-03 11:06:25', 1),
(17, '文件管理', '0', '', '', '', '0', 'layui-icon layui-icon-camera', 2, '2021-03-19 18:56:23', (17, '文件管理', '0', '', '', '', '0', 'layui-icon layui-icon-camera', 2, '2021-03-19 18:56:23',
'2021-03-25 19:15:08', 1), '2021-03-25 19:15:08', 1),
(18, '图片上传', '1', 'admin:file:main', '/admin/file', '_iframe', '17', 'layui-icon layui-icon-camera', 5, (18, '图片上传', '1', 'admin:file:main', '/file', '_iframe', '17', 'layui-icon layui-icon-camera', 5,
'2021-03-19 18:57:19', '2021-03-25 19:15:13', 1), '2021-03-19 18:57:19', '2021-03-25 19:15:13', 1),
(21, '权限增加', '2', 'admin:power:add', '', '', '4', 'layui-icon layui-icon-add-circle', 1, (21, '权限增加', '2', 'admin:power:add', '', '', '4', 'layui-icon layui-icon-add-circle', 1,
'2021-03-22 19:43:52', '2021-03-22 19:43:52',
@@ -288,27 +286,6 @@ def create_example():
add_data(_fields, _data_list, DictData) add_data(_fields, _data_list, DictData)
course_data = [
{'id': 1, 'name': '基础课'},
{'id': 2, 'name': '进阶课'},
{'id': 3, 'name': '爬虫课'},
{'id': 4, 'name': '数据分析课'},
{'id': 5, 'name': '全栈课程'},
{'id': 6, 'name': '自动化办公专题'},
{'id': 7, 'name': '反反爬专题'},
{'id': 8, 'name': 'JavaScript解密专题'},
{'id': 9, 'name': 'Scrapy框架专题'},
]
phase_data = [
{'name': '基础课'},
{'name': '高级开发'},
{'name': '爬虫'},
{'name': '数据分析'},
{'name': '全栈课程'}
]
def register_script(app: Flask): def register_script(app: Flask):
@app.cli.command() @app.cli.command()
def init_db(): def init_db():
@@ -327,110 +304,3 @@ def register_script(app: Flask):
from applications.extensions import db from applications.extensions import db
db.drop_all() db.drop_all()
db.create_all() db.create_all()
@app.cli.command()
def init_vip_member():
from applications.models.vip import VipMember, Course, Phase
from applications.extensions import db
course_list = []
for data in course_data:
course = Course()
course.name = data.get('name')
db.session.add(course)
course_list.append(course_list)
for _phase in phase_data:
for i in range(1, 11):
print(_phase['name'], i)
phase = Phase()
phase.name = _phase['name']
phase.phase = i
db.session.add(phase)
db.session.commit()
base_course = Course.query.get(1)
adv_course = Course.query.get(2)
spider_course = Course.query.get(3)
ana_course = Course.query.get(4)
stack_course = Course.query.get(5)
for data in user_data:
user = VipMember()
user.id = int(data['id'])
user.create_at = data['date']
user.username = data['name']
user.wx = data['wx']
user.qq = data['qq']
user.account = data['account']
user.phase = int(data['phase'])
user.remark = data['remark']
print('rights', data['rights'])
rights = int(data['rights']) if data['rights'] else 0
user.courses.append(base_course)
if rights == 1:
user.courses.append(adv_course)
if rights == 3:
user.courses.append(spider_course)
if rights == 4:
user.courses.append(adv_course)
user.courses.append(base_course)
if rights == 5:
user.courses.append(ana_course)
if rights == 7:
user.courses.append(stack_course)
if rights == 8:
user.courses.append(spider_course)
user.courses.append(ana_course)
if rights == 9:
user.courses.append(adv_course)
user.courses.append(spider_course)
user.courses.append(ana_course)
if rights == 10:
user.courses.append(spider_course)
user.courses.append(stack_course)
if rights == 11:
user.courses.append(adv_course)
user.courses.append(spider_course)
user.courses.append(stack_course)
if rights == 16:
user.courses.append(adv_course)
user.courses.append(spider_course)
user.courses.append(ana_course)
user.courses.append(stack_course)
if data['base']:
base_list = data['base'].replace('', ',').split(',')
print(base_list)
for rou in base_list:
print('rou', rou)
x = Phase.query.filter(Phase.name == '基础课').filter(Phase.phase == int(rou)).first()
user.phases.append(x)
print(x)
if data['adv']:
adv_list = data['adv'].replace('', ',').split(',')
for rou in adv_list:
x = Phase.query.filter(Phase.name == '高级开发').filter(Phase.phase == int(rou)).first()
user.phases.append(x)
print(adv_list)
if data['spider']:
spider_list = data['spider'].replace('', ',').split(',')
for rou in spider_list:
x = Phase.query.filter(Phase.name == '爬虫').filter(Phase.phase == int(rou)).first()
user.phases.append(x)
print(spider_list)
if data['ana']:
ana_list = data['ana'].replace('', ',').split(',')
for rou in ana_list:
x = Phase.query.filter(Phase.name == '数据分析').filter(Phase.phase == int(rou)).first()
user.phases.append(x)
print(ana_list)
if data['stack']:
stack_list = data['stack'].replace('', ',').split(',')
for rou in stack_list:
x = Phase.query.filter(Phase.name == '全栈课程').filter(Phase.phase == int(rou)).first()
user.phases.append(x)
print(stack_list)
db.session.commit()
+1 -2
View File
@@ -2,8 +2,7 @@ from applications.models.company import Dept, DeptSchema, User, UserSchema
from .dict_models import DictType, DictData, DictTypeSchema, DictDataSchema from .dict_models import DictType, DictData, DictTypeSchema, DictDataSchema
from .log import AdminLog, LogSchema from .log import AdminLog, LogSchema
from applications.models.file.photo import Photo, PhotoSchema from applications.models.file.photo import Photo, PhotoSchema
from applications.models.rights.power import Power, PowerSchema, PowerSchema2 from applications.models.rights.power import Power, PowerSchema
from applications.models.rights.role import Role, RoleSchema from applications.models.rights.role import Role, RoleSchema
from applications.models.rights.role_power import role_power from applications.models.rights.role_power import role_power
from applications.models.rights.user_role import user_role from applications.models.rights.user_role import user_role
from applications.models.vip import VipMember, Course, Phase, course_phase, member_phase
-12
View File
@@ -37,15 +37,3 @@ class PowerSchema(ma.Schema):
enable = fields.Integer() enable = fields.Integer()
class PowerSchema2(ma.Schema): # 序列化类
powerId = fields.Str(attribute="id")
powerName = fields.Str(attribute="name")
powerType = fields.Str(attribute="type")
powerUrl = fields.Str(attribute="url")
openType = fields.Str(attribute="open_type")
parentId = fields.Str(attribute="parent_id")
icon = fields.Str()
sort = fields.Integer()
create_time = fields.DateTime()
update_time = fields.DateTime()
enable = fields.Integer()
-62
View File
@@ -1,62 +0,0 @@
from datetime import datetime
from applications.extensions import db
class VipMember(db.Model):
__tablename__ = 'vip_member'
id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='VIP用户ID')
username = db.Column(db.String(20), comment='用户名')
mobile = db.Column(db.String(11), comment='电话号码')
id_card = db.Column(db.String(16), comment='身份证号码')
wx = db.Column(db.String(50), comment='微信号')
qq = db.Column(db.String(20), comment='QQ号')
account = db.Column(db.String(50), comment='报名账号')
number = db.Column(db.String(12), comment='学号')
phase = db.Column(db.SMALLINT, comment='第几期')
avatar = db.Column(db.String(255), comment='头像', default="/static/admin/admin/images/avatar.jpg")
remark = db.Column(db.String(255), comment='备注')
password_hash = db.Column(db.String(128), comment='哈希密码')
enable = db.Column(db.Integer, default=0, comment='启用')
create_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')
update_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')
courses = db.relationship('Course', secondary="vip_member_course", backref=db.backref('members'), lazy='dynamic')
phases = db.relationship('Phase', secondary="vip_member_phase", backref=db.backref('members'), lazy='dynamic')
class Course(db.Model):
__tablename__ = 'vip_course'
id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='课程id')
name = db.Column(db.String(20), comment='课程名')
class Phase(db.Model):
__tablename__ = 'vip_phase'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(20), comment='课程名')
phase = db.Column(db.Integer, comment='第几期')
teacher = db.Column(db.String(20), comment='带课讲师')
# 创建中间表
member_phase = db.Table(
"vip_member_phase", # 中间表名称
db.Column("id", db.Integer, primary_key=True, autoincrement=True, comment='标识'), # 主键
db.Column("member_id", db.Integer, db.ForeignKey("vip_member.id"), comment='用户编号'), # 属性 外键
db.Column("phase_id", db.Integer, db.ForeignKey("vip_phase.id"), comment='期数编号'), # 属性 外键
)
# 创建中间表
course_phase = db.Table(
"vip_member_course", # 中间表名称
db.Column("id", db.Integer, primary_key=True, autoincrement=True, comment='标识'), # 主键
db.Column("member_id", db.Integer, db.ForeignKey("vip_member.id"), comment='用户编号'), # 属性 外键
db.Column("course_id", db.Integer, db.ForeignKey("vip_course.id"), comment='期数编号'), # 属性 外键
)
+2 -2
View File
@@ -162,10 +162,10 @@
layer.close(index) layer.close(index)
let loading = layer.load() let loading = layer.load()
$.ajax({ $.ajax({
url: 'delete', url: 'upload',
data: { id: obj.data['id'] }, data: { id: obj.data['id'] },
dataType: 'json', dataType: 'json',
type: 'POST', type: 'delete',
success: function (res) { success: function (res) {
layer.close(loading) layer.close(loading)
if (res.success) { if (res.success) {
@@ -74,7 +74,7 @@
// 修改 avatar 字段 // 修改 avatar 字段
$.ajax({ $.ajax({
method: 'put', method: 'put',
url: '/users/updateAvatar', url: '/users/avatar',
data: JSON.stringify({ avatar: result.data }), data: JSON.stringify({ avatar: result.data }),
dataType: 'json', dataType: 'json',
contentType: 'application/json', contentType: 'application/json',
-2
View File
@@ -3,7 +3,6 @@ from applications.view.index import register_index_views
from applications.view.passport import register_passport_views from applications.view.passport import register_passport_views
from applications.view.rights import register_rights_view from applications.view.rights import register_rights_view
from applications.view.company.department import register_dept_views from applications.view.company.department import register_dept_views
from applications.view.vip import register_vip_view
def init_view(app): def init_view(app):
@@ -12,4 +11,3 @@ def init_view(app):
register_rights_view(app) register_rights_view(app)
register_passport_views(app) register_passport_views(app)
register_dept_views(app) register_dept_views(app)
register_vip_view(app)
+1 -1
View File
@@ -3,7 +3,7 @@ from flask import Blueprint, render_template, request, jsonify
from applications.common.utils.http import table_api, success_api, fail_api from applications.common.utils.http import table_api, success_api, fail_api
from applications.common.utils.rights import authorize from applications.common.utils.rights import authorize
from applications.models import DictType, DictData from applications.models import DictType, DictData
from applications.common.admin import dict_curd from applications.view.admin import dict_curd
admin_dict = Blueprint('adminDict', __name__, url_prefix='/admin/dict') admin_dict = Blueprint('adminDict', __name__, url_prefix='/admin/dict')
+32 -37
View File
@@ -1,13 +1,14 @@
import os import os
from flask import Blueprint, request, render_template, jsonify, current_app from flask import Blueprint, request, render_template, jsonify, current_app, make_response
from flask_restful import Api, Resource
from applications.common.utils.http import fail_api, success_api, table_api from applications.common.utils.http import fail_api, success_api, table_api
from applications.common.utils.rights import authorize from applications.common.utils.rights import authorize
from applications.extensions import db from applications.extensions import db
from applications.models import Photo from applications.models import Photo
from applications.common.admin import file_curd from applications.view.admin import file_curd
file_bp = Blueprint('file', __name__, url_prefix='/file') file_bp = Blueprint('file', __name__, url_prefix='/file')
file_api = Api(file_bp)
# 图片管理 # 图片管理
@@ -27,42 +28,36 @@ def table():
return table_api(data=data, count=count) return table_api(data=data, count=count)
# 上传 @file_api.resource('/upload')
@file_bp.get('/upload') class Upload(Resource):
@authorize("admin:file:add", log=True) @authorize("admin:file:add", log=True)
def upload(): def get(self):
return render_template('admin/file/photo_add.html') return make_response(render_template('admin/file/photo_add.html'))
@authorize("admin:file:add", log=True)
def post(self):
if 'file' in request.files:
photo = request.files['file']
mime = request.files['file'].content_type
file_url = file_curd.upload_one(photo=photo, mime=mime)
res = {
"msg": "上传成功",
"code": 0,
"success": True,
"data":
{"src": file_url}
}
return jsonify(res)
return fail_api()
# 上传接口 @authorize("admin:file:delete", log=True)
@file_bp.post('/upload') def delete(self):
@authorize("admin:file:add", log=True) _id = request.form.get('id')
def upload_api(): res = file_curd.delete_photo_by_id(_id)
if 'file' in request.files: if res:
photo = request.files['file'] return success_api(msg="删除成功")
mime = request.files['file'].content_type else:
file_url = file_curd.upload_one(photo=photo, mime=mime) return fail_api(msg="删除失败")
res = {
"msg": "上传成功",
"code": 0,
"success": True,
"data":
{"src": file_url}
}
return jsonify(res)
return fail_api()
# 图片删除
@file_bp.route('/delete', methods=['GET', 'POST'])
@authorize("admin:file:delete", log=True)
def delete():
_id = request.form.get('id')
res = file_curd.delete_photo_by_id(_id)
if res:
return success_api(msg="删除成功")
else:
return fail_api(msg="删除失败")
# 图片批量删除 # 图片批量删除
@@ -5,7 +5,7 @@ from applications.common.utils.http import success_api, fail_api
from applications.common.utils.rights import authorize from applications.common.utils.rights import authorize
from applications.common.utils.validate import check_data from applications.common.utils.validate import check_data
from applications.models import DeptSchema from applications.models import DeptSchema
from applications.common.admin import dept_curd as dept_curd from applications.view.company.department import dept_curd as dept_curd
dept_bp = Blueprint('dept', __name__, url_prefix='/dept') dept_bp = Blueprint('dept', __name__, url_prefix='/dept')
+1 -2
View File
@@ -1,7 +1,6 @@
from flask import Blueprint, request, render_template from flask import Blueprint, request, render_template
from flask_restful import Api from flask_restful import Api
from applications.common.admin import user_curd
from applications.common.utils.http import table_api from applications.common.utils.http import table_api
from applications.common.utils.rights import authorize from applications.common.utils.rights import authorize
from applications.models import Role from applications.models import Role
@@ -36,5 +35,5 @@ def add():
return render_template('admin/user/add.html', roles=roles) return render_template('admin/user/add.html', roles=roles)
from . import profile from . import profile, user_curd
from . import user_view from . import user_view
+16 -16
View File
@@ -1,10 +1,11 @@
# 个人中心 # 个人中心
from flask import render_template, request, make_response from flask import render_template, request, make_response
from flask_login import login_required, current_user from flask_login import login_required, current_user
from flask_restful import Resource, reqparse from flask_restful import Resource
from applications.common.admin import user_curd
from applications.common.utils.http import fail_api, success_api from applications.common.utils.http import fail_api, success_api
from applications.view.company.users import users_bp, user_api from applications.extensions import db
from applications.models import User
from applications.view.company.users import users_bp, user_api, user_curd
@users_bp.get('/center') @users_bp.get('/center')
@@ -15,21 +16,20 @@ def center():
return render_template('admin/user/profile.html', user_info=user_info, user_logs=user_logs) return render_template('admin/user/profile.html', user_info=user_info, user_logs=user_logs)
# 修改头像 @user_api.resource('/avatar')
@users_bp.get('/avatar') class Avatar(Resource):
@login_required """修改头像"""
def profile():
return render_template('admin/user/avatar.html')
def get(self):
return make_response(render_template('admin/user/avatar.html'))
# 修改头像 def put(self):
@users_bp.put('/updateAvatar') url = request.json.get("avatar").get("src")
@login_required ret = User.query.filter_by(id=current_user.id).update({"avatar": url})
def update_avatar(): db.session.commit()
url = request.json.get("avatar").get("src") if not ret:
if not user_curd.update_avatar(url): return fail_api(msg="出错啦")
return fail_api(msg="出错啦") return success_api(msg="修改成功")
return success_api(msg="修改成功")
# 修改当前用户信息 # 修改当前用户信息
+1 -2
View File
@@ -2,11 +2,10 @@ from flask import render_template, request, make_response
from flask_restful import Resource from flask_restful import Resource
from applications.extensions import db from applications.extensions import db
from applications.common.admin import user_curd
from applications.common.utils.http import fail_api, success_api from applications.common.utils.http import fail_api, success_api
from applications.common.utils.rights import authorize from applications.common.utils.rights import authorize
from applications.models import User, Role from applications.models import User, Role
from applications.view.company.users import user_api, users_bp from applications.view.company.users import user_api, users_bp, user_curd
@user_api.resource('/') @user_api.resource('/')
@@ -1,19 +1,21 @@
from applications.extensions import db from applications.extensions import db
from applications.models.rights.power import Power, PowerSchema2 from applications.models.rights.power import Power
from applications.models import Role from applications.models import Role
from applications.common.curd import model_to_dicts
from flask_restful import marshal
from applications.common.serialization import power_fields
def get_power_dict(): def get_power_dict():
power = Power.query.all() power = Power.query.all()
res = model_to_dicts(Schema=PowerSchema2, model=power) res = marshal(power, power_fields)
return res return res
# 选择父节点 # 选择父节点
def select_parent(): def select_parent():
power = Power.query.all() power = Power.query.all()
res = model_to_dicts(Schema=PowerSchema2, model=power) res = marshal(power, power_fields)
res.append({"powerId": 0, "powerName": "顶级权限", "parentId": -1}) res.append({"powerId": 0, "powerName": "顶级权限", "parentId": -1})
return res return res
+116 -41
View File
@@ -1,10 +1,14 @@
from flask import Blueprint, render_template, request, jsonify from flask import Blueprint, render_template, request, jsonify
from flask_login import login_required from flask_login import login_required
from applications.common.admin import role_curd
from applications.extensions import db
from applications.models import Role, Power
from applications.view.rights import role_curd
from applications.common.utils.http import table_api, success_api, fail_api from applications.common.utils.http import table_api, success_api, fail_api
from applications.common.utils.rights import authorize from applications.common.utils.rights import authorize
from flask_restful import reqparse, marshal
from applications.common.serialization import power_fields
role_bp = Blueprint('role', __name__, url_prefix='/admin/role') role_bp = Blueprint('role', __name__, url_prefix='/admin/role')
@@ -19,17 +23,34 @@ def main():
@role_bp.get('/data') @role_bp.get('/data')
@authorize("admin:role:main", log=True) @authorize("admin:role:main", log=True)
def table(): def table():
page = request.args.get('page', type=int) parser = reqparse.RequestParser(bundle_errors=True)
limit = request.args.get('limit', type=int) parser.add_argument('page', type=int, default=1)
role_name = request.args.get('roleName', type=str) parser.add_argument('limit', type=int, default=10)
role_code = request.args.get('roleCode', type=str) parser.add_argument('roleName', type=str, dest='role_name', default="")
filters = {} parser.add_argument('roleCode', type=str, dest='role_code', default="")
if role_name:
filters["name"] = ('%' + role_name + '%') res = parser.parse_args()
if role_code:
filters["code"] = ('%' + role_code + '%') filters = []
data, count = role_curd.get_role_data_dict(page=page, limit=limit, filters=filters) if res.role_name:
return table_api(data=data, count=count) filters.append(Role.name.like('%' + res.role_name + '%'))
if res.role_code:
filters.append(Role.code.like('%' + res.role_code + '%'))
paginate = Role.query.filter(*filters).paginate(page=res.page, per_page=res.limit, error_out=False)
return table_api(data=[
{
'id': item.id,
'roleName': item.name,
'roleCode': item.code,
'enable': item.enable,
'remark': item.remark,
'details': item.details,
'sort': item.sort,
'create_at': item.create_time,
} for item in paginate.items
], count=paginate.total)
# 角色增加 # 角色增加
@@ -44,8 +65,24 @@ def add():
@role_bp.post('/save') @role_bp.post('/save')
@authorize("admin:role:add", log=True) @authorize("admin:role:add", log=True)
def save(): def save():
req = request.json parser = reqparse.RequestParser()
role_curd.add_role(req=req) parser.add_argument('details', type=str)
parser.add_argument('enable', type=int)
parser.add_argument('roleCode', type=str, dest='role_code')
parser.add_argument('roleName', type=str, dest='role_name')
parser.add_argument('sort', type=int)
res = parser.parse_args()
role = Role(
details=res.details,
enable=res.enable,
code=res.role_code,
name=res.role_name,
sort=res.sort
)
db.session.add(role)
db.session.commit()
return success_api(msg="成功") return success_api(msg="成功")
@@ -60,7 +97,19 @@ def power(_id):
@role_bp.get('/getRolePower/<int:_id>') @role_bp.get('/getRolePower/<int:_id>')
@authorize("admin:role:main", log=True) @authorize("admin:role:main", log=True)
def get_role_power(_id): def get_role_power(_id):
powers = role_curd.get_role_power(_id) role = Role.query.filter_by(id=_id).first()
# 获取权限列表的 id
check_powers_list = [rp.id for rp in role.power]
powers = Power.query.all() # 获取所有的权限
# power_schema = PowerSchema2(many=True) # 用已继承 ma.ModelSchema 类的自定制类生成序列化类
# 将所有的权限生产可序列化对象 json
# powers = power_schema.dump(powers) # 生成可序列化对象
powers = marshal(powers, power_fields)
for i in powers:
if int(i.get("powerId")) in check_powers_list:
i["checkArr"] = "1"
else:
i["checkArr"] = "0"
res = { res = {
"data": powers, "data": powers,
"status": {"code": 200, "message": "默认"} "status": {"code": 200, "message": "默认"}
@@ -72,11 +121,14 @@ def get_role_power(_id):
@role_bp.put('/saveRolePower') @role_bp.put('/saveRolePower')
@authorize("admin:role:edit", log=True) @authorize("admin:role:edit", log=True)
def save_role_power(): def save_role_power():
req_form = request.form parser = reqparse.RequestParser()
power_ids = req_form.get("powerIds") parser.add_argument('powerIds', dest='power_ids')
power_list = power_ids.split(',') parser.add_argument('roleId', dest='role_id')
role_id = req_form.get("roleId")
role_curd.update_role_power(_id=role_id, power_list=power_list) res = parser.parse_args()
power_list = res.power_ids.split(',')
role_curd.update_role_power(_id=res.role_id, power_list=power_list)
return success_api(msg="授权成功") return success_api(msg="授权成功")
@@ -84,7 +136,7 @@ def save_role_power():
@role_bp.get('/edit/<int:_id>') @role_bp.get('/edit/<int:_id>')
@authorize("admin:role:edit", log=True) @authorize("admin:role:edit", log=True)
def edit(_id): def edit(_id):
role = role_curd.get_role_by_id(_id) role = Role.query.filter_by(id=_id).first()
return render_template('admin/role/edit.html', role=role) return render_template('admin/role/edit.html', role=role)
@@ -92,8 +144,27 @@ def edit(_id):
@role_bp.put('/update') @role_bp.put('/update')
@authorize("admin:role:edit", log=True) @authorize("admin:role:edit", log=True)
def update(): def update():
res = role_curd.update_role(request.json) parser = reqparse.RequestParser()
if not res: parser.add_argument('roleId', dest='role_id', type=int)
parser.add_argument('roleCode', dest='role_code', type=str)
parser.add_argument('roleName', dest='role_name', type=str)
parser.add_argument('sort', type=int)
parser.add_argument('enable', type=int)
parser.add_argument('details', type=str)
res = parser.parse_args()
data = {
"code": res.role_code,
"name": res.role_name,
"sort": res.sort,
"enable": res.enable,
"details": res.details
}
role = Role.query.filter_by(id=res.role_id).update(data)
db.session.commit()
if not role:
return fail_api(msg="更新角色失败") return fail_api(msg="更新角色失败")
return success_api(msg="更新角色成功") return success_api(msg="更新角色成功")
@@ -102,27 +173,27 @@ def update():
@role_bp.put('/enable') @role_bp.put('/enable')
@authorize("admin:role:edit", log=True) @authorize("admin:role:edit", log=True)
def enable(): def enable():
id = request.json.get('roleId') parser = reqparse.RequestParser()
# print(id) parser.add_argument('roleId', dest='role_id', required=True, type=int)
if id: res = parser.parse_args()
res = role_curd.enable_status(id) ret = Role.query.filter_by(id=res.role_id).update({"enable": 1})
if not res: db.session.commit()
return fail_api(msg="出错啦") if not ret:
return success_api(msg="启动成功") return fail_api(msg="出错啦")
return fail_api(msg="数据错误") return success_api(msg="启动成功")
# 禁用用户 # 禁用用户
@role_bp.put('/disable') @role_bp.put('/disable')
@authorize("admin:role:edit", log=True) @authorize("admin:role:edit", log=True)
def dis_enable(): def dis_enable():
_id = request.json.get('roleId') parser = reqparse.RequestParser()
if _id: parser.add_argument('roleId', dest='role_id', required=True, type=int)
res = role_curd.disable_status(_id) res = parser.parse_args()
if not res: ret = role_curd.disable_status(res.role_id)
return fail_api(msg="出错啦") if not ret:
return success_api(msg="禁用成功") return fail_api(msg="出错啦")
return fail_api(msg="数据错误") return success_api(msg="禁用成功")
# 角色删除 # 角色删除
@@ -140,6 +211,10 @@ def remove(_id):
@authorize("admin:role:remove", log=True) @authorize("admin:role:remove", log=True)
@login_required @login_required
def batch_remove(): def batch_remove():
ids = request.form.getlist('ids[]') parser = reqparse.RequestParser()
role_curd.batch_remove(ids) parser.add_argument('ids[]', action='append', dest='ids')
res = parser.parse_args()
role_curd.batch_remove(res.ids)
return success_api(msg="批量删除成功") return success_api(msg="批量删除成功")
+74
View File
@@ -0,0 +1,74 @@
from sqlalchemy import and_
from applications.extensions import db
from applications.models import Role, RoleSchema
from applications.models.rights.power import Power
from applications.models import User
# 获取角色对象
from applications.common.curd import model_to_dicts
def get_role_data(page, limit, filters):
print(page, limit, filters)
role = Role.query.filter(
and_(*[getattr(Role, k).like(v) for k, v in filters.items()])
).paginate(page=page, error_out=False)
count = Role.query.count()
return role, count
def get_role_data_dict(page, limit, filters):
""" 获取角色dict """
role, count = get_role_data(page, limit, filters)
data = model_to_dicts(Schema=RoleSchema, model=role.items)
return data, count
def get_role_by_id(_id):
""" 通过id获取角色 """
r = Role.query.filter_by(id=_id).first()
return r
def update_role_power(_id, power_list):
""" 更新角色权限 """
role = Role.query.filter_by(id=_id).first()
power_id_list = []
for p in role.power:
power_id_list.append(p.id)
powers = Power.query.filter(Power.id.in_(power_id_list)).all()
for p in powers:
role.power.remove(p)
powers = Power.query.filter(Power.id.in_(power_list)).all()
for p in powers:
role.power.append(p)
db.session.commit()
def remove_role(_id):
""" 删除角色 """
role = Role.query.filter_by(id=_id).first()
# 删除该角色的权限
power_id_list = []
for p in role.power:
power_id_list.append(p.id)
powers = Power.query.filter(Power.id.in_(power_id_list)).all()
for p in powers:
role.power.remove(p)
user_id_list = []
for u in role.user:
user_id_list.append(u.id)
users = User.query.filter(User.id.in_(user_id_list)).all()
for u in users:
role.user.remove(u)
r = Role.query.filter_by(id=id).delete()
db.session.commit()
return r
def batch_remove(ids):
""" 批量删除 """
for _id in ids:
remove_role(_id)
+3 -12
View File
@@ -1,8 +1,7 @@
from flask import render_template, request, jsonify, make_response from flask import render_template, request, jsonify, make_response
from flask_restful import Resource, reqparse from flask_restful import Resource
from . import rights_bp, rights_api from . import rights_bp, rights_api, rights_curd
from ...common.admin import rights_curd
from ...common.utils.http import success_api, fail_api from ...common.utils.http import success_api, fail_api
from ...common.utils.rights import authorize from ...common.utils.rights import authorize
@@ -98,7 +97,7 @@ def enable():
@authorize("admin:power:edit", log=True) @authorize("admin:power:edit", log=True)
def dis_enable(): def dis_enable():
_id = request.json.get('powerId') _id = request.json.get('powerId')
if id: if _id:
res = rights_curd.disable_status(_id) res = rights_curd.disable_status(_id)
if not res: if not res:
return fail_api(msg="出错啦") return fail_api(msg="出错啦")
@@ -113,11 +112,3 @@ def batch_remove():
ids = request.form.getlist('ids[]') ids = request.form.getlist('ids[]')
rights_curd.batch_remove(ids) rights_curd.batch_remove(ids)
return success_api(msg="批量删除成功") return success_api(msg="批量删除成功")
"""
https://developer.aliyun.com/article/778501
四位权限值: 增删改查
八位部门值: 流量 接待&转化 讲师 运营 1111 1111
四位公司值:
"""
-58
View File
@@ -1,58 +0,0 @@
from flask import Blueprint, render_template, make_response, Flask, request
from flask_restful import Resource, Api, reqparse
from sqlalchemy import desc
from applications.common.utils.http import table_api
from applications.models import VipMember
vip_bp = Blueprint('vip', __name__, url_prefix='/vip')
vip_api = Api(vip_bp)
def register_vip_view(app: Flask):
app.register_blueprint(vip_bp)
@vip_api.resource('/member')
class Member(Resource):
def get(self):
return make_response(render_template('admin/vip/main.html'))
def post(self):
pass
# 用户分页查询
@vip_bp.get('/data')
def data():
parse = reqparse.RequestParser()
parse.add_argument('page', type=int, default=1)
parse.add_argument('limit', type=int, default=10)
parse.add_argument('wx', type=str, default="")
parse.add_argument('username', type=str, default="")
res = parse.parse_args()
filters = []
if res.username:
filters.append(VipMember.username.like('%{}%'.format(res.username)))
if res.wx:
filters.append(VipMember.wx.like('%{}%'.format(res.wx)))
paginate = VipMember.query.filter(*filters).paginate(
page=res.page, per_page=res.limit)
return table_api(data=[
{
'id': item.id,
'username': item.username,
'mobile': item.mobile,
'id_card': item.id_card,
'wx': item.wx,
'qq': item.qq,
'account': item.account,
'number': '{:0>2}{:0>4}'.format(item.phase, item.id),
'create_at': item.update_at,
'phase': item.phase,
} for item in paginate.items], count=paginate.total)