refactor(api):调整后端逻辑-上
This commit is contained in:
@@ -7,6 +7,7 @@ from applications.common.utils.upload import photos
|
|||||||
from applications.configs import common
|
from applications.configs import common
|
||||||
from applications.extensions import init_plugs
|
from applications.extensions import init_plugs
|
||||||
from applications.view import init_view
|
from applications.view import init_view
|
||||||
|
from applications.api import init_api
|
||||||
from applications.configs import config
|
from applications.configs import config
|
||||||
|
|
||||||
|
|
||||||
@@ -25,7 +26,7 @@ def create_app(config_name=None):
|
|||||||
|
|
||||||
# 注册路由
|
# 注册路由
|
||||||
init_view(app)
|
init_view(app)
|
||||||
|
init_api(app)
|
||||||
# 文件上传
|
# 文件上传
|
||||||
configure_uploads(app, photos)
|
configure_uploads(app, photos)
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -1,38 +1,18 @@
|
|||||||
from flask import Blueprint, render_template, jsonify, make_response
|
from flask import jsonify
|
||||||
from flask_restful import marshal, Api, Resource, reqparse
|
from flask_restful import Api, Resource
|
||||||
|
from applications.api import api_bp
|
||||||
from applications.common.serialization import dept_fields
|
|
||||||
from applications.common.utils.http import success_api, fail_api
|
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.extensions import db
|
from applications.extensions import db
|
||||||
from applications.models import Dept, User
|
from applications.models import Dept, User
|
||||||
|
from flask_restful import marshal, reqparse
|
||||||
|
from applications.common.serialization import dept_fields
|
||||||
|
|
||||||
dept_bp = Blueprint('dept', __name__, url_prefix='/dept')
|
dept_api = Api(api_bp, prefix='/dept')
|
||||||
dept_api = Api(dept_bp)
|
|
||||||
|
|
||||||
|
|
||||||
@dept_bp.get('/')
|
|
||||||
@authorize("admin:dept:main", log=True)
|
|
||||||
def main():
|
|
||||||
return render_template('department/main.html')
|
|
||||||
|
|
||||||
|
|
||||||
@dept_bp.get('/data')
|
|
||||||
@authorize("admin:dept:main", log=True)
|
|
||||||
def data():
|
|
||||||
dept_data = Dept.query.order_by(Dept.sort).all()
|
|
||||||
|
|
||||||
res = {
|
|
||||||
"data": marshal(dept_data, dept_fields)
|
|
||||||
}
|
|
||||||
return jsonify(res)
|
|
||||||
|
|
||||||
|
|
||||||
@dept_api.resource('/add')
|
@dept_api.resource('/add')
|
||||||
class AddDepartment(Resource):
|
class AddDepartment(Resource):
|
||||||
# @authorize("admin:dept:add", log=True)
|
|
||||||
# def get(self):
|
|
||||||
# return make_response(render_template('department/add.html'))
|
|
||||||
|
|
||||||
@authorize("admin:dept:add", log=True)
|
@authorize("admin:dept:add", log=True)
|
||||||
def post(self):
|
def post(self):
|
||||||
@@ -64,35 +44,6 @@ class AddDepartment(Resource):
|
|||||||
return success_api(msg="成功")
|
return success_api(msg="成功")
|
||||||
|
|
||||||
|
|
||||||
@dept_bp.get('/tree')
|
|
||||||
@authorize("admin:dept:main", log=True)
|
|
||||||
def tree():
|
|
||||||
dept_data = Dept.query.order_by(Dept.sort).all()
|
|
||||||
res = {
|
|
||||||
"status": {"code": 200, "message": "默认"},
|
|
||||||
"data": marshal(dept_data, dept_fields)
|
|
||||||
|
|
||||||
}
|
|
||||||
return jsonify(res)
|
|
||||||
|
|
||||||
|
|
||||||
# 启用
|
|
||||||
@dept_bp.put('/enable')
|
|
||||||
@authorize("admin:dept:edit", log=True)
|
|
||||||
def enable():
|
|
||||||
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="出错啦")
|
|
||||||
|
|
||||||
|
|
||||||
@dept_api.resource('/edit/<int:dept_id>')
|
@dept_api.resource('/edit/<int:dept_id>')
|
||||||
class DeptURD(Resource):
|
class DeptURD(Resource):
|
||||||
@authorize("admin:dept:edit", log=True)
|
@authorize("admin:dept:edit", log=True)
|
||||||
@@ -146,3 +97,45 @@ class DeptURD(Resource):
|
|||||||
if ret:
|
if ret:
|
||||||
return success_api(msg="删除成功")
|
return success_api(msg="删除成功")
|
||||||
return fail_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="出错啦")
|
||||||
@@ -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="删除失败")
|
||||||
@@ -2,25 +2,51 @@ from flask import jsonify
|
|||||||
from flask_login import login_required
|
from flask_login import login_required
|
||||||
from flask_restful import Resource, Api, reqparse, marshal
|
from flask_restful import Resource, Api, reqparse, marshal
|
||||||
|
|
||||||
from applications.extensions import db
|
|
||||||
from applications.models import Role, Power
|
|
||||||
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.common.serialization import power_fields
|
from applications.common.serialization import power_fields
|
||||||
|
|
||||||
from . import role_bp
|
from applications.extensions import db
|
||||||
from ._utils import remove_role, batch_remove_role
|
from applications.models import Power, Role, User
|
||||||
|
from . import api_bp
|
||||||
# TODO 分离视图操作
|
|
||||||
from flask import render_template, make_response
|
|
||||||
|
|
||||||
role_api = Api(role_bp)
|
|
||||||
|
|
||||||
|
|
||||||
# 表格数据
|
def remove_role(role_id):
|
||||||
@role_bp.get('/data')
|
""" 删除角色 """
|
||||||
@authorize("admin:role:main", log=True)
|
role = Role.query.filter_by(id=role_id).first()
|
||||||
def table():
|
# 删除该角色的权限
|
||||||
|
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 = reqparse.RequestParser(bundle_errors=True)
|
||||||
parser.add_argument('page', type=int, default=1)
|
parser.add_argument('page', type=int, default=1)
|
||||||
parser.add_argument('limit', type=int, default=10)
|
parser.add_argument('limit', type=int, default=10)
|
||||||
@@ -48,7 +74,7 @@ def table():
|
|||||||
'sort': item.sort,
|
'sort': item.sort,
|
||||||
'create_at': item.create_time,
|
'create_at': item.create_time,
|
||||||
} for item in paginate.items
|
} for item in paginate.items
|
||||||
], count=paginate.total)
|
], count=paginate.total, code=0)
|
||||||
|
|
||||||
|
|
||||||
@role_api.resource('/add')
|
@role_api.resource('/add')
|
||||||
@@ -143,11 +169,11 @@ class RolePower(Resource):
|
|||||||
@role_api.resource('/edit/<int:role_id>')
|
@role_api.resource('/edit/<int:role_id>')
|
||||||
class EditRole(Resource):
|
class EditRole(Resource):
|
||||||
|
|
||||||
# 角色编辑
|
# # 角色编辑
|
||||||
@authorize("admin:role:edit", log=True)
|
# @authorize("admin:role:edit", log=True)
|
||||||
def get(self, role_id):
|
# def get(self, role_id):
|
||||||
role = Role.query.filter_by(id=role_id).first()
|
# role = Role.query.filter_by(id=role_id).first()
|
||||||
return make_response(render_template('roles/edit.html', role=role))
|
# return make_response(render_template('roles/edit.html', role=role))
|
||||||
|
|
||||||
# 更新角色
|
# 更新角色
|
||||||
@authorize("admin:role:edit", log=True)
|
@authorize("admin:role:edit", log=True)
|
||||||
@@ -177,10 +203,12 @@ class EditRole(Resource):
|
|||||||
return success_api(msg="更新角色成功")
|
return success_api(msg="更新角色成功")
|
||||||
|
|
||||||
|
|
||||||
# 启用用户
|
@role_api.resource('/enable')
|
||||||
@role_bp.put('/enable')
|
class RoleEnable(Resource):
|
||||||
@authorize("admin:role:edit", log=True)
|
"""启用用户"""
|
||||||
def enable():
|
|
||||||
|
@authorize("admin:role:edit", log=True)
|
||||||
|
def put(self):
|
||||||
parser = reqparse.RequestParser()
|
parser = reqparse.RequestParser()
|
||||||
parser.add_argument('roleId', dest='role_id', required=True, type=int)
|
parser.add_argument('roleId', dest='role_id', required=True, type=int)
|
||||||
parser.add_argument('operate', required=True, type=int)
|
parser.add_argument('operate', required=True, type=int)
|
||||||
@@ -195,11 +223,13 @@ def enable():
|
|||||||
return success_api(msg=message)
|
return success_api(msg=message)
|
||||||
|
|
||||||
|
|
||||||
# 批量删除
|
@role_api.resource('/batch_remove')
|
||||||
@role_bp.delete('/batchRemove')
|
class RoleBatchRemove(Resource):
|
||||||
@authorize("admin:role:remove", log=True)
|
"""批量删除"""
|
||||||
@login_required
|
|
||||||
def batch_remove():
|
@authorize("admin:role:remove", log=True)
|
||||||
|
@login_required
|
||||||
|
def delete(self):
|
||||||
parser = reqparse.RequestParser()
|
parser = reqparse.RequestParser()
|
||||||
parser.add_argument('ids[]', action='append', dest='ids')
|
parser.add_argument('ids[]', action='append', dest='ids')
|
||||||
|
|
||||||
@@ -1,24 +1,32 @@
|
|||||||
from flask import jsonify
|
from flask import jsonify
|
||||||
|
|
||||||
|
"""
|
||||||
|
{
|
||||||
|
'success': True,
|
||||||
|
'code': 10002,
|
||||||
|
'msg': '提示消息',
|
||||||
|
'data':[] or {}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
def success_api(msg: str = "成功"):
|
|
||||||
|
def success_api(msg: str = "成功", code=200):
|
||||||
""" 成功响应 默认值”成功“ """
|
""" 成功响应 默认值”成功“ """
|
||||||
return jsonify(success=True, msg=msg)
|
return jsonify(success=True, msg=msg, code=200)
|
||||||
|
|
||||||
|
|
||||||
def fail_api(msg: str = "失败"):
|
def fail_api(msg: str = "失败", code=404):
|
||||||
""" 失败响应 默认值“失败” """
|
""" 失败响应 默认值“失败” """
|
||||||
return jsonify(success=False, msg=msg)
|
return jsonify(success=False, msg=msg, code=404)
|
||||||
|
|
||||||
|
|
||||||
def table_api(msg: str = "", count=0, data=None, limit=10):
|
def table_api(msg: str = "", count=0, data=None, limit=10, code=200):
|
||||||
""" 动态表格渲染响应 """
|
""" 动态表格渲染响应 """
|
||||||
res = {
|
res = {
|
||||||
'msg': msg,
|
'msg': msg,
|
||||||
'code': 0,
|
'code': code,
|
||||||
'data': data,
|
'data': data,
|
||||||
'count': count,
|
'count': count,
|
||||||
'limit': limit
|
'limit': limit
|
||||||
|
|
||||||
}
|
}
|
||||||
return jsonify(res)
|
return jsonify(res)
|
||||||
|
|||||||
@@ -1,4 +1,30 @@
|
|||||||
from applications.common.flask_uploads import UploadSet, IMAGES
|
import os
|
||||||
|
|
||||||
|
from flask import current_app
|
||||||
|
|
||||||
|
from applications.common.flask_uploads import UploadSet, IMAGES
|
||||||
|
from applications.extensions import db
|
||||||
|
from applications.models import Photo
|
||||||
|
|
||||||
photos = UploadSet('photos', IMAGES)
|
photos = UploadSet('photos', IMAGES)
|
||||||
|
|
||||||
|
|
||||||
|
def upload_one(photo, mime):
|
||||||
|
filename = photos.save(photo)
|
||||||
|
file_url = photos.url(filename)
|
||||||
|
|
||||||
|
upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST")
|
||||||
|
size = os.path.getsize(upload_url + '/' + filename)
|
||||||
|
photo = Photo(name=filename, href=file_url, mime=mime, size=size)
|
||||||
|
db.session.add(photo)
|
||||||
|
db.session.commit()
|
||||||
|
return file_url
|
||||||
|
|
||||||
|
|
||||||
|
def delete_photo_by_id(_id):
|
||||||
|
photo_name = Photo.query.filter_by(id=_id).first().name
|
||||||
|
photo = Photo.query.filter_by(id=_id).delete()
|
||||||
|
db.session.commit()
|
||||||
|
upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST")
|
||||||
|
os.remove(upload_url + '/' + photo_name)
|
||||||
|
return photo
|
||||||
|
|||||||
@@ -253,7 +253,7 @@
|
|||||||
let dtree = layui.dtree
|
let dtree = layui.dtree
|
||||||
|
|
||||||
{#定义模块访问路径#}
|
{#定义模块访问路径#}
|
||||||
let MODULE_PATH = '/dept/'
|
let MODULE_PATH = '/api/v1/dept/'
|
||||||
|
|
||||||
{#定义表格渲染函数#}
|
{#定义表格渲染函数#}
|
||||||
window.render = function () {
|
window.render = function () {
|
||||||
@@ -268,7 +268,7 @@
|
|||||||
treeDefaultClose: false,
|
treeDefaultClose: false,
|
||||||
toolbar: '#dept_toolbar', /*表格的工具栏*/
|
toolbar: '#dept_toolbar', /*表格的工具栏*/
|
||||||
elem: '#dept_table', /*表格挂载的对象*/
|
elem: '#dept_table', /*表格挂载的对象*/
|
||||||
url: '/dept/data', /*数据来源接口*/
|
url: MODULE_PATH + '/data', /*数据来源接口*/
|
||||||
page: false,
|
page: false,
|
||||||
cols: [
|
cols: [
|
||||||
[
|
[
|
||||||
@@ -355,7 +355,7 @@
|
|||||||
}
|
}
|
||||||
let loading = layer.load()
|
let loading = layer.load()
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/dept/enable',
|
url: MODULE_PATH + 'enable',
|
||||||
data: JSON.stringify({ deptId: this.value, operate: operate }),
|
data: JSON.stringify({ deptId: this.value, operate: operate }),
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
contentType: 'application/json',
|
contentType: 'application/json',
|
||||||
@@ -440,7 +440,7 @@
|
|||||||
// 修改数据 当点击更新之后,获取数据
|
// 修改数据 当点击更新之后,获取数据
|
||||||
form.on('submit(dept-update)', function (data) {
|
form.on('submit(dept-update)', function (data) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/dept/edit/' + data.field.deptId,
|
url: MODULE_PATH + 'edit/' + data.field.deptId,
|
||||||
data: JSON.stringify(data.field),
|
data: JSON.stringify(data.field),
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
contentType: 'application/json',
|
contentType: 'application/json',
|
||||||
@@ -462,7 +462,7 @@
|
|||||||
/*添加数据 渲染下拉选择组件*/
|
/*添加数据 渲染下拉选择组件*/
|
||||||
dtree.renderSelect({
|
dtree.renderSelect({
|
||||||
elem: '#selectParent',
|
elem: '#selectParent',
|
||||||
url: '/dept/tree',
|
url: MODULE_PATH + 'tree',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
selectInputName: { nodeId: 'parentId', context: 'parentName' },
|
selectInputName: { nodeId: 'parentId', context: 'parentName' },
|
||||||
skin: 'layui',
|
skin: 'layui',
|
||||||
@@ -474,7 +474,7 @@
|
|||||||
/*添加数据 表单组件,提交按钮之后触发的事件*/
|
/*添加数据 表单组件,提交按钮之后触发的事件*/
|
||||||
form.on('submit(dept-save)', function (data) {
|
form.on('submit(dept-save)', function (data) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/dept/add',
|
url: MODULE_PATH + 'add',
|
||||||
data: JSON.stringify(data.field),
|
data: JSON.stringify(data.field),
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
contentType: 'application/json',
|
contentType: 'application/json',
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<body class="pear-container">
|
<body class="pear-container">
|
||||||
<div class="layui-card">
|
<div class="layui-card">
|
||||||
<div class="layui-card-body">
|
<div class="layui-card-body">
|
||||||
<table id="dataTable" lay-filter="dataTable"></table>
|
<table id="photo_table" lay-filter="photo_table"></table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
@@ -67,6 +67,7 @@
|
|||||||
let form = layui.form
|
let form = layui.form
|
||||||
let $ = layui.jquery
|
let $ = layui.jquery
|
||||||
let upload = layui.upload
|
let upload = layui.upload
|
||||||
|
let MODULE_PATH = '/api/v1/file/'
|
||||||
|
|
||||||
let cols = [
|
let cols = [
|
||||||
[
|
[
|
||||||
@@ -92,10 +93,8 @@
|
|||||||
title: '图片',
|
title: '图片',
|
||||||
unresize: true,
|
unresize: true,
|
||||||
align: 'center',
|
align: 'center',
|
||||||
templet: function (d) {
|
templet: (d) => {
|
||||||
return '<img class="photo" style="max-width: 100%;\n' +
|
return `<img class="photo" style="max-width: 100%;height: 100%;cursor: pointer;" lay-event="photo" src="${d.href}"></i>`
|
||||||
' height: 100%;\n' +
|
|
||||||
' cursor: pointer;" lay-event="photo" src=" ' + d.href + '"></i>'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
@@ -129,8 +128,8 @@
|
|||||||
]
|
]
|
||||||
|
|
||||||
table.render({
|
table.render({
|
||||||
elem: '#dataTable',
|
elem: '#photo_table',
|
||||||
url: 'table',
|
url: MODULE_PATH + 'table',
|
||||||
page: true,
|
page: true,
|
||||||
cols: cols,
|
cols: cols,
|
||||||
skin: 'line',
|
skin: 'line',
|
||||||
@@ -141,7 +140,7 @@
|
|||||||
}, 'filter', 'print', 'exports']
|
}, 'filter', 'print', 'exports']
|
||||||
})
|
})
|
||||||
|
|
||||||
table.on('tool(dataTable)', function (obj) {
|
table.on('tool(photo_table)', function (obj) {
|
||||||
if (obj.event === 'remove') {
|
if (obj.event === 'remove') {
|
||||||
window.remove(obj)
|
window.remove(obj)
|
||||||
} else if (obj.event === 'photo') {
|
} else if (obj.event === 'photo') {
|
||||||
@@ -149,7 +148,7 @@
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
table.on('toolbar(dataTable)', function (obj) {
|
table.on('toolbar(photo_table)', function (obj) {
|
||||||
if (obj.event === 'add') {
|
if (obj.event === 'add') {
|
||||||
window.add()
|
window.add()
|
||||||
} else if (obj.event === 'refresh') {
|
} else if (obj.event === 'refresh') {
|
||||||
@@ -189,7 +188,7 @@
|
|||||||
layer.close(index)
|
layer.close(index)
|
||||||
let loading = layer.load()
|
let loading = layer.load()
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: 'upload',
|
url: MODULE_PATH + 'upload',
|
||||||
data: { id: obj.data['id'] },
|
data: { id: obj.data['id'] },
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
type: 'delete',
|
type: 'delete',
|
||||||
@@ -223,7 +222,7 @@
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
var ids = []
|
var ids = []
|
||||||
var hasCheck = table.checkStatus('dataTable')
|
var hasCheck = table.checkStatus('photo_table')
|
||||||
var hasCheckData = hasCheck.data
|
var hasCheckData = hasCheck.data
|
||||||
if (hasCheckData.length > 0) {
|
if (hasCheckData.length > 0) {
|
||||||
$.each(hasCheckData, function (index, element) {
|
$.each(hasCheckData, function (index, element) {
|
||||||
@@ -237,7 +236,7 @@
|
|||||||
layer.close(index)
|
layer.close(index)
|
||||||
let loading = layer.load()
|
let loading = layer.load()
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: "{{ url_for('file.batch_remove') }}",
|
url: MODULE_PATH + "batch_remove",
|
||||||
data: { ids: ids },
|
data: { ids: ids },
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
@@ -248,7 +247,7 @@
|
|||||||
icon: 1,
|
icon: 1,
|
||||||
time: 1000
|
time: 1000
|
||||||
}, function () {
|
}, function () {
|
||||||
table.reload('dataTable')
|
table.reload('photo_table')
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
layer.msg(res.msg, {
|
layer.msg(res.msg, {
|
||||||
@@ -262,7 +261,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
window.refresh = function () {
|
window.refresh = function () {
|
||||||
table.reload('dataTable')
|
table.reload('photo_table')
|
||||||
}
|
}
|
||||||
// 查看大图
|
// 查看大图
|
||||||
window.photo = function (obj) {
|
window.photo = function (obj) {
|
||||||
@@ -288,7 +287,7 @@
|
|||||||
area: ['auto'],
|
area: ['auto'],
|
||||||
skin: 'layui-layer-nobg', //没有背景色
|
skin: 'layui-layer-nobg', //没有背景色
|
||||||
shadeClose: true,
|
shadeClose: true,
|
||||||
content: '<img src=\'' + obj.data['href'] + '\' width=\'' + auto_img.width + 'px\' height=\'' + auto_img.height + 'px\'>'
|
content: `<img src="${obj.data['href']}" width="${auto_img.width}px" height="${auto_img.height}px">`
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -297,7 +296,7 @@
|
|||||||
// 选完文件后不自动上传
|
// 选完文件后不自动上传
|
||||||
upload.render({
|
upload.render({
|
||||||
elem: '#logo-img'
|
elem: '#logo-img'
|
||||||
, url: "{{ url_for('file.upload') }}"
|
, url: MODULE_PATH + "upload"
|
||||||
, auto: false
|
, auto: false
|
||||||
, exts: 'jpg|png|gif|bmp|jpeg'
|
, exts: 'jpg|png|gif|bmp|jpeg'
|
||||||
, size: 1000
|
, size: 1000
|
||||||
|
|||||||
@@ -71,14 +71,16 @@
|
|||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
{% include 'common/footer.html' %}
|
{% include 'common/footer.html' %}
|
||||||
|
</body>
|
||||||
<script>
|
<script>
|
||||||
layui.use(['form', 'jquery'], function () {
|
layui.use(['form', 'jquery'], function () {
|
||||||
let form = layui.form
|
let form = layui.form
|
||||||
let $ = layui.jquery
|
let $ = layui.jquery
|
||||||
|
let MODULE_PATH = '/api/v1/roles/'
|
||||||
|
|
||||||
form.on('submit(role-update)', function (data) {
|
form.on('submit(role-update)', function (data) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/admin/role/edit/' + data.field.roleId,
|
url: MODULE_PATH + 'edit/' + data.field.roleId,
|
||||||
data: JSON.stringify(data.field),
|
data: JSON.stringify(data.field),
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
contentType: 'application/json',
|
contentType: 'application/json',
|
||||||
@@ -97,9 +99,5 @@
|
|||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
|
||||||
</script>
|
</script>
|
||||||
<script>
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
</html>
|
||||||
@@ -131,7 +131,7 @@
|
|||||||
let $ = layui.jquery
|
let $ = layui.jquery
|
||||||
let popup = layui.popup
|
let popup = layui.popup
|
||||||
|
|
||||||
let MODULE_PATH = '/admin/role/'
|
let MODULE_PATH = '/api/v1/roles/'
|
||||||
|
|
||||||
let cols = [
|
let cols = [
|
||||||
[
|
[
|
||||||
@@ -194,7 +194,7 @@
|
|||||||
}
|
}
|
||||||
let loading = layer.load()
|
let loading = layer.load()
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/admin/role/enable',
|
url: MODULE_PATH + 'enable',
|
||||||
data: JSON.stringify({ roleId: this.value, operate: operate }),
|
data: JSON.stringify({ roleId: this.value, operate: operate }),
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
contentType: 'application/json',
|
contentType: 'application/json',
|
||||||
@@ -226,7 +226,8 @@
|
|||||||
title: '授权',
|
title: '授权',
|
||||||
shade: 0.1,
|
shade: 0.1,
|
||||||
area: ['320px', '400px'],
|
area: ['320px', '400px'],
|
||||||
content: MODULE_PATH + 'power/' + obj.data['id']
|
{#content: MODULE_PATH + 'power/' + obj.data['id']#}
|
||||||
|
content: '/admin/role/power/' + obj.data['id']
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,7 +237,8 @@
|
|||||||
title: '修改',
|
title: '修改',
|
||||||
shade: 0.1,
|
shade: 0.1,
|
||||||
area: ['500px', '500px'],
|
area: ['500px', '500px'],
|
||||||
content: MODULE_PATH + 'edit/' + obj.data['id']
|
{#content: MODULE_PATH + 'edit/' + obj.data['id']#}
|
||||||
|
content: '/admin/role/edit/' + obj.data['id']
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,7 +290,7 @@
|
|||||||
let loading = layer.load()
|
let loading = layer.load()
|
||||||
$.ajax({
|
$.ajax({
|
||||||
|
|
||||||
url: MODULE_PATH + 'batchRemove',
|
url: MODULE_PATH + 'batch_remove',
|
||||||
data: { ids: ids },
|
data: { ids: ids },
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
type: 'delete',
|
type: 'delete',
|
||||||
@@ -313,7 +315,7 @@
|
|||||||
{#添加数据逻辑#}
|
{#添加数据逻辑#}
|
||||||
form.on('submit(role-save)', function (data) {
|
form.on('submit(role-save)', function (data) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/admin/role/add',
|
url: MODULE_PATH + 'add',
|
||||||
data: JSON.stringify(data.field),
|
data: JSON.stringify(data.field),
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
contentType: 'application/json',
|
contentType: 'application/json',
|
||||||
|
|||||||
@@ -31,11 +31,12 @@
|
|||||||
let dtree = layui.dtree
|
let dtree = layui.dtree
|
||||||
let form = layui.form
|
let form = layui.form
|
||||||
let $ = layui.jquery
|
let $ = layui.jquery
|
||||||
|
let MODULE_PATH = '/api/v1/roles/'
|
||||||
|
|
||||||
dtree.render({
|
dtree.render({
|
||||||
elem: '#role-power',
|
elem: '#role-power',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
url: '/admin/role/role_power/' + {{id}},
|
url: MODULE_PATH + 'role_power/' + {{id}},
|
||||||
dataFormat: 'list',
|
dataFormat: 'list',
|
||||||
checkbar: true,
|
checkbar: true,
|
||||||
skin: 'layui',
|
skin: 'layui',
|
||||||
@@ -56,7 +57,7 @@
|
|||||||
data.field.powerIds = ids
|
data.field.powerIds = ids
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/admin/role/role_power/' + data.field.roleId,
|
url: MODULE_PATH + 'role_power/' + data.field.roleId,
|
||||||
data: data.field,
|
data: data.field,
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
type: 'put',
|
type: 'put',
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
from flask import Flask
|
from flask import Flask
|
||||||
|
|
||||||
from .department import dept_bp
|
|
||||||
from .file import file_bp
|
|
||||||
from .index import index_bp
|
from .index import index_bp
|
||||||
from .logs_view import logs_bp
|
from .logs_view import logs_bp
|
||||||
from .passport import passport_bp
|
from .passport import passport_bp
|
||||||
@@ -9,10 +7,11 @@ from .rights import rights_bp
|
|||||||
from .roles import role_bp
|
from .roles import role_bp
|
||||||
from .users import users_bp
|
from .users import users_bp
|
||||||
|
|
||||||
|
from . import department
|
||||||
|
from . import file
|
||||||
|
|
||||||
|
|
||||||
def init_view(app: Flask):
|
def init_view(app: Flask):
|
||||||
app.register_blueprint(dept_bp)
|
|
||||||
app.register_blueprint(file_bp)
|
|
||||||
app.register_blueprint(index_bp)
|
app.register_blueprint(index_bp)
|
||||||
app.register_blueprint(logs_bp)
|
app.register_blueprint(logs_bp)
|
||||||
app.register_blueprint(passport_bp)
|
app.register_blueprint(passport_bp)
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
from flask import render_template
|
||||||
|
|
||||||
|
from applications.common.utils.rights import authorize
|
||||||
|
from applications.view import index_bp
|
||||||
|
|
||||||
|
|
||||||
|
@index_bp.get('/dept')
|
||||||
|
@authorize("admin:dept:main", log=True)
|
||||||
|
def dept_index():
|
||||||
|
return render_template('department/main.html')
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
from flask import render_template
|
||||||
|
|
||||||
|
from applications.view import index_bp
|
||||||
|
from applications.common.utils.rights import authorize
|
||||||
|
|
||||||
|
|
||||||
|
# 图片管理
|
||||||
|
@index_bp.get('/file')
|
||||||
|
@authorize("admin:file:main", log=True)
|
||||||
|
def file_index():
|
||||||
|
return render_template('file/photo.html')
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
import os
|
|
||||||
|
|
||||||
from flask import Blueprint, request, render_template, current_app
|
|
||||||
from flask_restful import marshal
|
|
||||||
from sqlalchemy import desc
|
|
||||||
|
|
||||||
from applications.common.serialization import photo_fields
|
|
||||||
from applications.common.utils.http import table_api, success_api, fail_api
|
|
||||||
from applications.common.utils.rights import authorize
|
|
||||||
from applications.extensions import db
|
|
||||||
from applications.models import Photo
|
|
||||||
|
|
||||||
file_bp = Blueprint('file', __name__, url_prefix='/file')
|
|
||||||
|
|
||||||
|
|
||||||
# 图片管理
|
|
||||||
@file_bp.get('/')
|
|
||||||
@authorize("admin:file:main", log=True)
|
|
||||||
def index():
|
|
||||||
return render_template('file/photo.html')
|
|
||||||
|
|
||||||
|
|
||||||
# 图片数据
|
|
||||||
@file_bp.get('/table')
|
|
||||||
@authorize("admin:file:main", log=True)
|
|
||||||
def table():
|
|
||||||
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)
|
|
||||||
|
|
||||||
|
|
||||||
# 图片批量删除
|
|
||||||
@file_bp.route('/batchRemove', methods=['GET', 'POST'])
|
|
||||||
@authorize("admin:file:delete", log=True)
|
|
||||||
def batch_remove():
|
|
||||||
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="删除失败")
|
|
||||||
|
|
||||||
|
|
||||||
from . import file
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
import os
|
|
||||||
from flask import current_app
|
|
||||||
from applications.common.utils.upload import photos
|
|
||||||
from applications.extensions import db
|
|
||||||
from applications.models import Photo
|
|
||||||
|
|
||||||
|
|
||||||
def upload_one(photo, mime):
|
|
||||||
filename = photos.save(photo)
|
|
||||||
file_url = photos.url(filename)
|
|
||||||
|
|
||||||
upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST")
|
|
||||||
size = os.path.getsize(upload_url + '/' + filename)
|
|
||||||
photo = Photo(name=filename, href=file_url, mime=mime, size=size)
|
|
||||||
db.session.add(photo)
|
|
||||||
db.session.commit()
|
|
||||||
return file_url
|
|
||||||
|
|
||||||
|
|
||||||
def delete_photo_by_id(_id):
|
|
||||||
photo_name = Photo.query.filter_by(id=_id).first().name
|
|
||||||
photo = Photo.query.filter_by(id=_id).delete()
|
|
||||||
db.session.commit()
|
|
||||||
upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST")
|
|
||||||
os.remove(upload_url + '/' + photo_name)
|
|
||||||
return photo
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
from flask import request, jsonify
|
|
||||||
from flask_restful import Api, Resource
|
|
||||||
|
|
||||||
from applications.common.utils.http import fail_api, success_api
|
|
||||||
from applications.common.utils.rights import authorize
|
|
||||||
from applications.view.file import file_bp
|
|
||||||
from applications.view.file._utils import upload_one, delete_photo_by_id
|
|
||||||
|
|
||||||
file_api = Api(file_bp)
|
|
||||||
|
|
||||||
|
|
||||||
@file_api.resource('/upload')
|
|
||||||
class Upload(Resource):
|
|
||||||
# @authorize("admin:file:add", log=True)
|
|
||||||
# def get(self):
|
|
||||||
# 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 = 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="删除失败")
|
|
||||||
|
|
||||||
|
|
||||||
@@ -2,7 +2,7 @@ from flask import Blueprint, render_template
|
|||||||
|
|
||||||
from applications.common.utils.rights import authorize
|
from applications.common.utils.rights import authorize
|
||||||
|
|
||||||
from applications.view.roles._utils import remove_role, batch_remove_role
|
from applications.models import Role
|
||||||
|
|
||||||
role_bp = Blueprint('role', __name__, url_prefix='/admin/role')
|
role_bp = Blueprint('role', __name__, url_prefix='/admin/role')
|
||||||
|
|
||||||
@@ -21,4 +21,9 @@ def power(_id):
|
|||||||
return render_template('roles/power.html', id=_id)
|
return render_template('roles/power.html', id=_id)
|
||||||
|
|
||||||
|
|
||||||
from . import role
|
# 角色编辑
|
||||||
|
@authorize("admin:role:edit", log=True)
|
||||||
|
@role_bp.get('/edit/<int:role_id>')
|
||||||
|
def role_editor(role_id):
|
||||||
|
role = Role.query.filter_by(id=role_id).first()
|
||||||
|
return render_template('roles/edit.html', role=role)
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
from applications.extensions import db
|
|
||||||
from applications.models import Power, Role, User
|
|
||||||
|
|
||||||
|
|
||||||
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)
|
|
||||||
Reference in New Issue
Block a user