diff --git a/applications/__init__.py b/applications/__init__.py index 2b47f44..c935493 100644 --- a/applications/__init__.py +++ b/applications/__init__.py @@ -7,6 +7,7 @@ from applications.common.utils.upload import photos from applications.configs import common from applications.extensions import init_plugs from applications.view import init_view +from applications.api import init_api from applications.configs import config @@ -25,7 +26,7 @@ def create_app(config_name=None): # 注册路由 init_view(app) - + init_api(app) # 文件上传 configure_uploads(app, photos) diff --git a/applications/api/__init__.py b/applications/api/__init__.py new file mode 100644 index 0000000..a0ca06c --- /dev/null +++ b/applications/api/__init__.py @@ -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) diff --git a/applications/view/department/__init__.py b/applications/api/department.py similarity index 67% rename from applications/view/department/__init__.py rename to applications/api/department.py index 248b049..9319478 100644 --- a/applications/view/department/__init__.py +++ b/applications/api/department.py @@ -1,38 +1,18 @@ -from flask import Blueprint, render_template, jsonify, make_response -from flask_restful import marshal, Api, Resource, reqparse - -from applications.common.serialization import dept_fields +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_bp = Blueprint('dept', __name__, url_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 = Api(api_bp, prefix='/dept') @dept_api.resource('/add') 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) def post(self): @@ -64,35 +44,6 @@ class AddDepartment(Resource): 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/') class DeptURD(Resource): @authorize("admin:dept:edit", log=True) @@ -146,3 +97,45 @@ class DeptURD(Resource): 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="出错啦") diff --git a/applications/api/file.py b/applications/api/file.py new file mode 100644 index 0000000..dd0a26e --- /dev/null +++ b/applications/api/file.py @@ -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="删除失败") diff --git a/applications/view/roles/role.py b/applications/api/roles.py similarity index 57% rename from applications/view/roles/role.py rename to applications/api/roles.py index 8995957..03952b4 100644 --- a/applications/view/roles/role.py +++ b/applications/api/roles.py @@ -2,53 +2,79 @@ from flask import jsonify from flask_login import login_required 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.rights import authorize from applications.common.serialization import power_fields -from . import role_bp -from ._utils import remove_role, batch_remove_role - -# TODO 分离视图操作 -from flask import render_template, make_response - -role_api = Api(role_bp) +from applications.extensions import db +from applications.models import Power, Role, User +from . import api_bp -# 表格数据 -@role_bp.get('/data') -@authorize("admin:role:main", log=True) -def table(): - 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="") +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) - res = parser.parse_args() + 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 - 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) +def batch_remove_role(role_ids): + """ 批量删除 """ + for role_id in role_ids: + remove_role(role_id) - 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) + +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') @@ -143,11 +169,11 @@ class RolePower(Resource): @role_api.resource('/edit/') 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 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) @@ -177,33 +203,37 @@ class EditRole(Resource): return success_api(msg="更新角色成功") -# 启用用户 -@role_bp.put('/enable') -@authorize("admin:role:edit", log=True) -def enable(): - parser = reqparse.RequestParser() - parser.add_argument('roleId', dest='role_id', required=True, type=int) - parser.add_argument('operate', required=True, type=int) +@role_api.resource('/enable') +class RoleEnable(Resource): + """启用用户""" - res = parser.parse_args() - ret = Role.query.filter_by(id=res.role_id).update({"enable": res.operate}) - db.session.commit() + @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) - message = "启动成功" if res.operate else "禁用成功" - if not ret: - return fail_api(msg="出错啦") - return success_api(msg=message) + 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_bp.delete('/batchRemove') -@authorize("admin:role:remove", log=True) -@login_required -def batch_remove(): - parser = reqparse.RequestParser() - parser.add_argument('ids[]', action='append', dest='ids') +@role_api.resource('/batch_remove') +class RoleBatchRemove(Resource): + """批量删除""" - res = parser.parse_args() + @authorize("admin:role:remove", log=True) + @login_required + def delete(self): + parser = reqparse.RequestParser() + parser.add_argument('ids[]', action='append', dest='ids') - batch_remove_role(res.ids) - return success_api(msg="批量删除成功") + res = parser.parse_args() + + batch_remove_role(res.ids) + return success_api(msg="批量删除成功") diff --git a/applications/common/utils/http.py b/applications/common/utils/http.py index 75f4cd8..65b9d04 100644 --- a/applications/common/utils/http.py +++ b/applications/common/utils/http.py @@ -1,24 +1,32 @@ 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 = { 'msg': msg, - 'code': 0, + 'code': code, 'data': data, 'count': count, 'limit': limit - } return jsonify(res) diff --git a/applications/common/utils/upload.py b/applications/common/utils/upload.py index 7964829..1c86983 100644 --- a/applications/common/utils/upload.py +++ b/applications/common/utils/upload.py @@ -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) + + +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 diff --git a/applications/templates/department/main.html b/applications/templates/department/main.html index 5ada059..1c57652 100644 --- a/applications/templates/department/main.html +++ b/applications/templates/department/main.html @@ -253,7 +253,7 @@ let dtree = layui.dtree {#定义模块访问路径#} - let MODULE_PATH = '/dept/' + let MODULE_PATH = '/api/v1/dept/' {#定义表格渲染函数#} window.render = function () { @@ -268,7 +268,7 @@ treeDefaultClose: false, toolbar: '#dept_toolbar', /*表格的工具栏*/ elem: '#dept_table', /*表格挂载的对象*/ - url: '/dept/data', /*数据来源接口*/ + url: MODULE_PATH + '/data', /*数据来源接口*/ page: false, cols: [ [ @@ -355,7 +355,7 @@ } let loading = layer.load() $.ajax({ - url: '/dept/enable', + url: MODULE_PATH + 'enable', data: JSON.stringify({ deptId: this.value, operate: operate }), dataType: 'json', contentType: 'application/json', @@ -440,7 +440,7 @@ // 修改数据 当点击更新之后,获取数据 form.on('submit(dept-update)', function (data) { $.ajax({ - url: '/dept/edit/' + data.field.deptId, + url: MODULE_PATH + 'edit/' + data.field.deptId, data: JSON.stringify(data.field), dataType: 'json', contentType: 'application/json', @@ -462,7 +462,7 @@ /*添加数据 渲染下拉选择组件*/ dtree.renderSelect({ elem: '#selectParent', - url: '/dept/tree', + url: MODULE_PATH + 'tree', method: 'get', selectInputName: { nodeId: 'parentId', context: 'parentName' }, skin: 'layui', @@ -474,7 +474,7 @@ /*添加数据 表单组件,提交按钮之后触发的事件*/ form.on('submit(dept-save)', function (data) { $.ajax({ - url: '/dept/add', + url: MODULE_PATH + 'add', data: JSON.stringify(data.field), dataType: 'json', contentType: 'application/json', diff --git a/applications/templates/file/photo.html b/applications/templates/file/photo.html index c73f3ef..4edb7e5 100644 --- a/applications/templates/file/photo.html +++ b/applications/templates/file/photo.html @@ -7,7 +7,7 @@
-
+
@@ -67,6 +67,7 @@ let form = layui.form let $ = layui.jquery let upload = layui.upload + let MODULE_PATH = '/api/v1/file/' let cols = [ [ @@ -92,10 +93,8 @@ title: '图片', unresize: true, align: 'center', - templet: function (d) { - return '' + templet: (d) => { + return `` } }, @@ -129,8 +128,8 @@ ] table.render({ - elem: '#dataTable', - url: 'table', + elem: '#photo_table', + url: MODULE_PATH + 'table', page: true, cols: cols, skin: 'line', @@ -141,7 +140,7 @@ }, 'filter', 'print', 'exports'] }) - table.on('tool(dataTable)', function (obj) { + table.on('tool(photo_table)', function (obj) { if (obj.event === 'remove') { window.remove(obj) } 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') { window.add() } else if (obj.event === 'refresh') { @@ -171,7 +170,7 @@ } window.add = function () { - layer.open({ + layer.open({ type: 1, maxmin: true, title: '新增图片', @@ -189,7 +188,7 @@ layer.close(index) let loading = layer.load() $.ajax({ - url: 'upload', + url: MODULE_PATH + 'upload', data: { id: obj.data['id'] }, dataType: 'json', type: 'delete', @@ -223,7 +222,7 @@ return false } var ids = [] - var hasCheck = table.checkStatus('dataTable') + var hasCheck = table.checkStatus('photo_table') var hasCheckData = hasCheck.data if (hasCheckData.length > 0) { $.each(hasCheckData, function (index, element) { @@ -237,7 +236,7 @@ layer.close(index) let loading = layer.load() $.ajax({ - url: "{{ url_for('file.batch_remove') }}", + url: MODULE_PATH + "batch_remove", data: { ids: ids }, dataType: 'json', type: 'POST', @@ -248,7 +247,7 @@ icon: 1, time: 1000 }, function () { - table.reload('dataTable') + table.reload('photo_table') }) } else { layer.msg(res.msg, { @@ -262,7 +261,7 @@ } window.refresh = function () { - table.reload('dataTable') + table.reload('photo_table') } // 查看大图 window.photo = function (obj) { @@ -288,7 +287,7 @@ area: ['auto'], skin: 'layui-layer-nobg', //没有背景色 shadeClose: true, - content: '' + content: `` }) } } @@ -297,7 +296,7 @@ // 选完文件后不自动上传 upload.render({ elem: '#logo-img' - , url: "{{ url_for('file.upload') }}" + , url: MODULE_PATH + "upload" , auto: false , exts: 'jpg|png|gif|bmp|jpeg' , size: 1000 diff --git a/applications/templates/roles/edit.html b/applications/templates/roles/edit.html index f3e6aa4..f176daa 100644 --- a/applications/templates/roles/edit.html +++ b/applications/templates/roles/edit.html @@ -71,14 +71,16 @@ {% include 'common/footer.html' %} + - - \ No newline at end of file diff --git a/applications/templates/roles/main.html b/applications/templates/roles/main.html index 4b44087..0c3feb0 100644 --- a/applications/templates/roles/main.html +++ b/applications/templates/roles/main.html @@ -131,7 +131,7 @@ let $ = layui.jquery let popup = layui.popup - let MODULE_PATH = '/admin/role/' + let MODULE_PATH = '/api/v1/roles/' let cols = [ [ @@ -194,7 +194,7 @@ } let loading = layer.load() $.ajax({ - url: '/admin/role/enable', + url: MODULE_PATH + 'enable', data: JSON.stringify({ roleId: this.value, operate: operate }), dataType: 'json', contentType: 'application/json', @@ -226,7 +226,8 @@ title: '授权', shade: 0.1, 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: '修改', shade: 0.1, 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() $.ajax({ - url: MODULE_PATH + 'batchRemove', + url: MODULE_PATH + 'batch_remove', data: { ids: ids }, dataType: 'json', type: 'delete', @@ -313,7 +315,7 @@ {#添加数据逻辑#} form.on('submit(role-save)', function (data) { $.ajax({ - url: '/admin/role/add', + url: MODULE_PATH + 'add', data: JSON.stringify(data.field), dataType: 'json', contentType: 'application/json', diff --git a/applications/templates/roles/power.html b/applications/templates/roles/power.html index c83e639..b10ea50 100644 --- a/applications/templates/roles/power.html +++ b/applications/templates/roles/power.html @@ -31,11 +31,12 @@ let dtree = layui.dtree let form = layui.form let $ = layui.jquery + let MODULE_PATH = '/api/v1/roles/' dtree.render({ elem: '#role-power', method: 'get', - url: '/admin/role/role_power/' + {{id}}, + url: MODULE_PATH + 'role_power/' + {{id}}, dataFormat: 'list', checkbar: true, skin: 'layui', @@ -56,7 +57,7 @@ data.field.powerIds = ids $.ajax({ - url: '/admin/role/role_power/' + data.field.roleId, + url: MODULE_PATH + 'role_power/' + data.field.roleId, data: data.field, dataType: 'json', type: 'put', diff --git a/applications/view/__init__.py b/applications/view/__init__.py index 0a10759..3ccfb53 100644 --- a/applications/view/__init__.py +++ b/applications/view/__init__.py @@ -1,7 +1,5 @@ from flask import Flask -from .department import dept_bp -from .file import file_bp from .index import index_bp from .logs_view import logs_bp from .passport import passport_bp @@ -9,10 +7,11 @@ from .rights import rights_bp from .roles import role_bp from .users import users_bp +from . import department +from . import file + def init_view(app: Flask): - app.register_blueprint(dept_bp) - app.register_blueprint(file_bp) app.register_blueprint(index_bp) app.register_blueprint(logs_bp) app.register_blueprint(passport_bp) diff --git a/applications/view/department.py b/applications/view/department.py new file mode 100644 index 0000000..bb3b004 --- /dev/null +++ b/applications/view/department.py @@ -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') diff --git a/applications/view/file.py b/applications/view/file.py new file mode 100644 index 0000000..d58c146 --- /dev/null +++ b/applications/view/file.py @@ -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') diff --git a/applications/view/file/__init__.py b/applications/view/file/__init__.py deleted file mode 100644 index 0793b4f..0000000 --- a/applications/view/file/__init__.py +++ /dev/null @@ -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 diff --git a/applications/view/file/_utils.py b/applications/view/file/_utils.py deleted file mode 100644 index b62ebe3..0000000 --- a/applications/view/file/_utils.py +++ /dev/null @@ -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 diff --git a/applications/view/file/file.py b/applications/view/file/file.py deleted file mode 100644 index a34d160..0000000 --- a/applications/view/file/file.py +++ /dev/null @@ -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="删除失败") - - diff --git a/applications/view/index/__init__.py b/applications/view/index.py similarity index 100% rename from applications/view/index/__init__.py rename to applications/view/index.py diff --git a/applications/view/logs_view/__init__.py b/applications/view/logs_view.py similarity index 100% rename from applications/view/logs_view/__init__.py rename to applications/view/logs_view.py diff --git a/applications/view/roles/__init__.py b/applications/view/roles.py similarity index 64% rename from applications/view/roles/__init__.py rename to applications/view/roles.py index 7b59958..1bebfb1 100644 --- a/applications/view/roles/__init__.py +++ b/applications/view/roles.py @@ -2,7 +2,7 @@ from flask import Blueprint, render_template 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') @@ -21,4 +21,9 @@ def power(_id): return render_template('roles/power.html', id=_id) -from . import role \ No newline at end of file +# 角色编辑 +@authorize("admin:role:edit", log=True) +@role_bp.get('/edit/') +def role_editor(role_id): + role = Role.query.filter_by(id=role_id).first() + return render_template('roles/edit.html', role=role) diff --git a/applications/view/roles/_utils.py b/applications/view/roles/_utils.py deleted file mode 100644 index fd66358..0000000 --- a/applications/view/roles/_utils.py +++ /dev/null @@ -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)