refactor(api):调整后端逻辑-上

This commit is contained in:
zhengxinonly
2021-07-24 03:06:19 +08:00
parent 0ca75c81d4
commit b8e0173a9c
22 changed files with 342 additions and 323 deletions
+10
View File
@@ -0,0 +1,10 @@
from flask import Blueprint, Flask
api_bp = Blueprint('api', __name__, url_prefix='/api/v1')
from . import department
from . import file
from . import roles
def init_api(app: Flask):
app.register_blueprint(api_bp)
+141
View File
@@ -0,0 +1,141 @@
from flask import jsonify
from flask_restful import Api, Resource
from applications.api import api_bp
from applications.common.utils.http import success_api, fail_api
from applications.common.utils.rights import authorize
from applications.extensions import db
from applications.models import Dept, User
from flask_restful import marshal, reqparse
from applications.common.serialization import dept_fields
dept_api = Api(api_bp, prefix='/dept')
@dept_api.resource('/add')
class AddDepartment(Resource):
@authorize("admin:dept:add", log=True)
def post(self):
parser = reqparse.RequestParser()
parser.add_argument('address', type=str)
parser.add_argument('deptName', type=str, dest='dept_name')
parser.add_argument('email', type=str)
parser.add_argument('leader', type=str)
parser.add_argument('parentId', type=int, dest='parent_id')
parser.add_argument('phone', type=str)
parser.add_argument('sort', type=int)
parser.add_argument('status', type=int)
res = parser.parse_args()
dept = Dept(
parent_id=res.parent_id,
dept_name=res.dept_name,
sort=res.sort,
leader=res.leader,
phone=res.phone,
email=res.email,
status=res.status,
address=res.address
)
db.session.add(dept)
db.session.commit()
return success_api(msg="成功")
@dept_api.resource('/edit/<int:dept_id>')
class DeptURD(Resource):
@authorize("admin:dept:edit", log=True)
def get(self, dept_id):
dept = Dept.query.filter_by(id=dept_id).first()
dept_data = {
'id': dept.id,
'dept_name': dept.dept_name,
'leader': dept.leader,
'email': dept.email,
'phone': dept.phone,
'status': dept.status,
'sort': dept.sort,
'address': dept.address,
}
# return make_response(render_template('department/edit.html', dept=dept))
return jsonify(success=True, msg='ok', dept=dept_data)
@authorize("admin:dept:edit", log=True)
def put(self, dept_id):
parser = reqparse.RequestParser()
parser.add_argument('address', type=str)
parser.add_argument('deptName', type=str, dest='dept_name')
parser.add_argument('email', type=str)
parser.add_argument('leader', type=str)
parser.add_argument('phone', type=str)
parser.add_argument('sort', type=int)
parser.add_argument('status', type=int)
res = parser.parse_args()
data = {
"dept_name": res.dept_name,
"sort": res.sort,
"leader": res.leader,
"phone": res.phone,
"email": res.email,
"status": res.status,
"address": res.address
}
res = Dept.query.filter_by(id=dept_id).update(data)
if not res:
return fail_api(msg="更新失败")
db.session.commit()
return success_api(msg="更新成功")
@authorize("admin:dept:remove", log=True)
def delete(self, dept_id):
ret = Dept.query.filter_by(id=dept_id).delete()
User.query.filter_by(dept_id=dept_id).update({"dept_id": None})
db.session.commit()
if ret:
return success_api(msg="删除成功")
return fail_api(msg="删除失败")
@dept_api.resource('/data')
class DeptData(Resource):
@authorize("admin:dept:main", log=True)
def get(self):
dept_data = Dept.query.order_by(Dept.sort).all()
res = {
"data": marshal(dept_data, dept_fields)
}
return jsonify(res)
@dept_api.resource('/tree')
class DeptTree(Resource):
@authorize("admin:dept:main", log=True)
def get(self):
dept_data = Dept.query.order_by(Dept.sort).all()
res = {
"status": {"code": 200, "message": "默认"},
"data": marshal(dept_data, dept_fields)
}
return jsonify(res)
@dept_api.resource('/enable')
class DeptEnable(Resource):
@authorize("admin:dept:edit", log=True)
def put(self):
parser = reqparse.RequestParser()
parser.add_argument('deptId', type=int, dest='dept_id', required=True)
parser.add_argument('operate', type=int, choices=[0, 1], required=True)
res = parser.parse_args()
d = Dept.query.filter_by(id=res.dept_id).update({"status": res.operate})
if d:
db.session.commit()
message = '启用成功' if res.operate else '禁用成功'
return success_api(msg=message)
return fail_api(msg="出错啦")
+77
View File
@@ -0,0 +1,77 @@
import os
from flask import request, jsonify, current_app
from flask_restful import Api, Resource, marshal
from sqlalchemy import desc
from applications.api import api_bp
from applications.common.serialization import photo_fields
from applications.common.utils.http import fail_api, success_api, table_api
from applications.common.utils.rights import authorize
from applications.common.utils.upload import upload_one, delete_photo_by_id
from applications.extensions import db
from applications.models import Photo
file_api = Api(api_bp, prefix='/file')
@file_api.resource('/upload')
class Upload(Resource):
@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 = 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)
def delete(self):
_id = request.form.get('id')
res = delete_photo_by_id(_id)
if res:
return success_api(msg="删除成功")
else:
return fail_api(msg="删除失败")
@file_api.resource('/table')
class FileTable(Resource):
"""图片数据"""
@authorize("admin:file:main", log=True)
def get(self):
page = request.args.get('page', type=int)
limit = request.args.get('limit', type=int)
photo_paginate = Photo.query.order_by(desc(Photo.create_time)).paginate(page=page, per_page=limit,
error_out=False)
data = marshal(photo_paginate.items, photo_fields)
return table_api(data=data, count=photo_paginate.total, code=0)
@file_api.resource('/batch_remove')
class FileBatchRemove(Resource):
"""图片批量删除"""
@authorize("admin:file:delete", log=True)
def post(self):
ids = request.form.getlist('ids[]')
photo_name = Photo.query.filter(Photo.id.in_(ids)).all()
upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST")
for p in photo_name:
os.remove(upload_url + '/' + p.name)
photo = Photo.query.filter(Photo.id.in_(ids)).delete(synchronize_session=False)
db.session.commit()
if photo:
return success_api(msg="删除成功")
else:
return fail_api(msg="删除失败")
+239
View File
@@ -0,0 +1,239 @@
from flask import jsonify
from flask_login import login_required
from flask_restful import Resource, Api, reqparse, marshal
from applications.common.utils.http import table_api, success_api, fail_api
from applications.common.utils.rights import authorize
from applications.common.serialization import power_fields
from applications.extensions import db
from applications.models import Power, Role, User
from . import api_bp
def remove_role(role_id):
""" 删除角色 """
role = Role.query.filter_by(id=role_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=role_id).delete()
db.session.commit()
return r
def batch_remove_role(role_ids):
""" 批量删除 """
for role_id in role_ids:
remove_role(role_id)
role_api = Api(api_bp, prefix='/roles')
@role_api.resource('/data')
class RoleData(Resource):
# 表格数据
@authorize("admin:role:main", log=True)
def get(self):
parser = reqparse.RequestParser(bundle_errors=True)
parser.add_argument('page', type=int, default=1)
parser.add_argument('limit', type=int, default=10)
parser.add_argument('roleName', type=str, dest='role_name', default="")
parser.add_argument('roleCode', type=str, dest='role_code', default="")
res = parser.parse_args()
filters = []
if res.role_name:
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, code=0)
@role_api.resource('/add')
class AddRole(Resource):
# @authorize("admin:role:add", log=True)
# def get(self):
# return make_response(render_template('roles/add.html'))
@authorize("admin:role:add", log=True)
def post(self):
parser = reqparse.RequestParser()
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="成功")
@role_api.resource('/role_power/<int:role_id>')
class RolePower(Resource):
@authorize("admin:role:main", log=True)
def get(self, role_id):
# 获取角色权限
role = Role.query.filter_by(id=role_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 = {
"data": powers,
"status": {"code": 200, "message": "默认"}
}
return jsonify(res)
# 保存角色权限
@authorize("admin:role:edit", log=True)
def put(self, role_id):
parser = reqparse.RequestParser()
parser.add_argument('powerIds', dest='power_ids')
parser.add_argument('roleId', dest='role_id')
res = parser.parse_args()
power_list = res.power_ids.split(',')
""" 更新角色权限 """
role = Role.query.filter_by(id=role_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()
return success_api(msg="授权成功")
# 角色删除
@authorize("admin:role:remove", log=True)
def delete(self, role_id):
print(role_id)
res = remove_role(role_id)
print(res)
if not res:
return fail_api(msg="角色删除失败")
return success_api(msg="角色删除成功")
@role_api.resource('/edit/<int:role_id>')
class EditRole(Resource):
# # 角色编辑
# @authorize("admin:role:edit", log=True)
# def get(self, role_id):
# role = Role.query.filter_by(id=role_id).first()
# return make_response(render_template('roles/edit.html', role=role))
# 更新角色
@authorize("admin:role:edit", log=True)
def put(self, role_id):
parser = reqparse.RequestParser()
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=role_id).update(data)
db.session.commit()
if not role:
return fail_api(msg="更新角色失败")
return success_api(msg="更新角色成功")
@role_api.resource('/enable')
class RoleEnable(Resource):
"""启用用户"""
@authorize("admin:role:edit", log=True)
def put(self):
parser = reqparse.RequestParser()
parser.add_argument('roleId', dest='role_id', required=True, type=int)
parser.add_argument('operate', required=True, type=int)
res = parser.parse_args()
ret = Role.query.filter_by(id=res.role_id).update({"enable": res.operate})
db.session.commit()
message = "启动成功" if res.operate else "禁用成功"
if not ret:
return fail_api(msg="出错啦")
return success_api(msg=message)
@role_api.resource('/batch_remove')
class RoleBatchRemove(Resource):
"""批量删除"""
@authorize("admin:role:remove", log=True)
@login_required
def delete(self):
parser = reqparse.RequestParser()
parser.add_argument('ids[]', action='append', dest='ids')
res = parser.parse_args()
batch_remove_role(res.ids)
return success_api(msg="批量删除成功")