From b8870d4c33ed2016d285dc46de9af21677c337eb Mon Sep 17 00:00:00 2001 From: zhengxinonly Date: Sat, 26 Jun 2021 03:17:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8flask-restful=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E6=95=B0=E6=8D=AE=E6=A0=A1=E9=AA=8C=E4=B8=8E=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- applications/api/__init__.py | 0 applications/common/admin/__init__.py | 0 applications/common/admin/role_curd.py | 145 ---------------- applications/common/serialization/__init__.py | 15 ++ applications/common/utils/gen_captcha.py | 0 .../extensions/init_databases/__init__.py | 136 +-------------- applications/models/__init__.py | 3 +- applications/models/rights/power.py | 12 -- applications/models/vip/__init__.py | 62 ------- applications/templates/admin/file/photo.html | 4 +- applications/templates/admin/user/avatar.html | 2 +- applications/view/__init__.py | 2 - applications/view/admin/dict.py | 2 +- .../{common => view}/admin/dict_curd.py | 0 applications/view/admin/file.py | 69 ++++---- .../{common => view}/admin/file_curd.py | 0 .../view/company/department/__init__.py | 2 +- .../company/department}/dept_curd.py | 0 applications/view/company/users/__init__.py | 3 +- applications/view/company/users/profile.py | 32 ++-- .../admin => view/company/users}/user_curd.py | 0 applications/view/company/users/user_view.py | 3 +- .../admin => view/rights}/rights_curd.py | 10 +- applications/view/rights/role.py | 157 +++++++++++++----- applications/view/rights/role_curd.py | 74 +++++++++ applications/view/rights/view.py | 15 +- applications/view/vip/__init__.py | 58 ------- 27 files changed, 273 insertions(+), 533 deletions(-) delete mode 100644 applications/api/__init__.py delete mode 100644 applications/common/admin/__init__.py delete mode 100644 applications/common/admin/role_curd.py create mode 100644 applications/common/serialization/__init__.py delete mode 100644 applications/common/utils/gen_captcha.py delete mode 100644 applications/models/vip/__init__.py rename applications/{common => view}/admin/dict_curd.py (100%) rename applications/{common => view}/admin/file_curd.py (100%) rename applications/{common/admin => view/company/department}/dept_curd.py (100%) rename applications/{common/admin => view/company/users}/user_curd.py (100%) rename applications/{common/admin => view/rights}/rights_curd.py (91%) create mode 100644 applications/view/rights/role_curd.py delete mode 100644 applications/view/vip/__init__.py diff --git a/applications/api/__init__.py b/applications/api/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/applications/common/admin/__init__.py b/applications/common/admin/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/applications/common/admin/role_curd.py b/applications/common/admin/role_curd.py deleted file mode 100644 index 860daaa..0000000 --- a/applications/common/admin/role_curd.py +++ /dev/null @@ -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) diff --git a/applications/common/serialization/__init__.py b/applications/common/serialization/__init__.py new file mode 100644 index 0000000..19cc75c --- /dev/null +++ b/applications/common/serialization/__init__.py @@ -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, +} diff --git a/applications/common/utils/gen_captcha.py b/applications/common/utils/gen_captcha.py deleted file mode 100644 index e69de29..0000000 diff --git a/applications/extensions/init_databases/__init__.py b/applications/extensions/init_databases/__init__.py index 97ab387..3bf7dfb 100644 --- a/applications/extensions/init_databases/__init__.py +++ b/applications/extensions/init_databases/__init__.py @@ -2,8 +2,6 @@ import json from flask import Flask -from applications.extensions.init_databases.data import user_data - def add_data(fields, data_list, obj): from applications.extensions import db @@ -79,7 +77,7 @@ def create_admin_power(): _data_list = \ [ (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), (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, @@ -88,11 +86,11 @@ def create_admin_power(): 12, '系统监控', '1', 'admin:monitor:main', '/admin/monitor', '_iframe', '1', 'layui-icon layui-icon-vercode', 5, '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), (17, '文件管理', '0', '', '', '', '0', 'layui-icon layui-icon-camera', 2, '2021-03-19 18:56:23', '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), (21, '权限增加', '2', 'admin:power:add', '', '', '4', 'layui-icon layui-icon-add-circle', 1, '2021-03-22 19:43:52', @@ -288,27 +286,6 @@ def create_example(): 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): @app.cli.command() def init_db(): @@ -327,110 +304,3 @@ def register_script(app: Flask): from applications.extensions import db db.drop_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() diff --git a/applications/models/__init__.py b/applications/models/__init__.py index 1c97fe1..8a2d422 100644 --- a/applications/models/__init__.py +++ b/applications/models/__init__.py @@ -2,8 +2,7 @@ from applications.models.company import Dept, DeptSchema, User, UserSchema from .dict_models import DictType, DictData, DictTypeSchema, DictDataSchema from .log import AdminLog, LogSchema 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_power import role_power from applications.models.rights.user_role import user_role -from applications.models.vip import VipMember, Course, Phase, course_phase, member_phase diff --git a/applications/models/rights/power.py b/applications/models/rights/power.py index 8f54da8..a2005e6 100644 --- a/applications/models/rights/power.py +++ b/applications/models/rights/power.py @@ -37,15 +37,3 @@ class PowerSchema(ma.Schema): 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() diff --git a/applications/models/vip/__init__.py b/applications/models/vip/__init__.py deleted file mode 100644 index b16a1bf..0000000 --- a/applications/models/vip/__init__.py +++ /dev/null @@ -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='期数编号'), # 属性 外键 -) diff --git a/applications/templates/admin/file/photo.html b/applications/templates/admin/file/photo.html index a4f77a1..c194c56 100644 --- a/applications/templates/admin/file/photo.html +++ b/applications/templates/admin/file/photo.html @@ -162,10 +162,10 @@ layer.close(index) let loading = layer.load() $.ajax({ - url: 'delete', + url: 'upload', data: { id: obj.data['id'] }, dataType: 'json', - type: 'POST', + type: 'delete', success: function (res) { layer.close(loading) if (res.success) { diff --git a/applications/templates/admin/user/avatar.html b/applications/templates/admin/user/avatar.html index bdceaf1..2d1f166 100644 --- a/applications/templates/admin/user/avatar.html +++ b/applications/templates/admin/user/avatar.html @@ -74,7 +74,7 @@ // 修改 avatar 字段 $.ajax({ method: 'put', - url: '/users/updateAvatar', + url: '/users/avatar', data: JSON.stringify({ avatar: result.data }), dataType: 'json', contentType: 'application/json', diff --git a/applications/view/__init__.py b/applications/view/__init__.py index 7dd5638..09f144e 100644 --- a/applications/view/__init__.py +++ b/applications/view/__init__.py @@ -3,7 +3,6 @@ from applications.view.index import register_index_views from applications.view.passport import register_passport_views from applications.view.rights import register_rights_view from applications.view.company.department import register_dept_views -from applications.view.vip import register_vip_view def init_view(app): @@ -12,4 +11,3 @@ def init_view(app): register_rights_view(app) register_passport_views(app) register_dept_views(app) - register_vip_view(app) diff --git a/applications/view/admin/dict.py b/applications/view/admin/dict.py index 53825a2..2454d89 100644 --- a/applications/view/admin/dict.py +++ b/applications/view/admin/dict.py @@ -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.rights import authorize 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') diff --git a/applications/common/admin/dict_curd.py b/applications/view/admin/dict_curd.py similarity index 100% rename from applications/common/admin/dict_curd.py rename to applications/view/admin/dict_curd.py diff --git a/applications/view/admin/file.py b/applications/view/admin/file.py index 1f74e0c..a076957 100644 --- a/applications/view/admin/file.py +++ b/applications/view/admin/file.py @@ -1,13 +1,14 @@ 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.rights import authorize from applications.extensions import db 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_api = Api(file_bp) # 图片管理 @@ -27,42 +28,36 @@ def table(): return table_api(data=data, count=count) -# 上传 -@file_bp.get('/upload') -@authorize("admin:file:add", log=True) -def upload(): - return render_template('admin/file/photo_add.html') +@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 = file_curd.upload_one(photo=photo, mime=mime) + res = { + "msg": "上传成功", + "code": 0, + "success": True, + "data": + {"src": file_url} + } + return jsonify(res) + return fail_api() -# 上传接口 -@file_bp.post('/upload') -@authorize("admin:file:add", log=True) -def upload_api(): - 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() - - -# 图片删除 -@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="删除失败") + @authorize("admin:file:delete", log=True) + def delete(self): + _id = request.form.get('id') + res = file_curd.delete_photo_by_id(_id) + if res: + return success_api(msg="删除成功") + else: + return fail_api(msg="删除失败") # 图片批量删除 diff --git a/applications/common/admin/file_curd.py b/applications/view/admin/file_curd.py similarity index 100% rename from applications/common/admin/file_curd.py rename to applications/view/admin/file_curd.py diff --git a/applications/view/company/department/__init__.py b/applications/view/company/department/__init__.py index 677dc8e..68a5c59 100644 --- a/applications/view/company/department/__init__.py +++ b/applications/view/company/department/__init__.py @@ -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.validate import check_data 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') diff --git a/applications/common/admin/dept_curd.py b/applications/view/company/department/dept_curd.py similarity index 100% rename from applications/common/admin/dept_curd.py rename to applications/view/company/department/dept_curd.py diff --git a/applications/view/company/users/__init__.py b/applications/view/company/users/__init__.py index ca26c3d..f2b119b 100644 --- a/applications/view/company/users/__init__.py +++ b/applications/view/company/users/__init__.py @@ -1,7 +1,6 @@ from flask import Blueprint, request, render_template from flask_restful import Api -from applications.common.admin import user_curd from applications.common.utils.http import table_api from applications.common.utils.rights import authorize from applications.models import Role @@ -36,5 +35,5 @@ def add(): return render_template('admin/user/add.html', roles=roles) -from . import profile +from . import profile, user_curd from . import user_view diff --git a/applications/view/company/users/profile.py b/applications/view/company/users/profile.py index 8fe8a5a..cec4763 100644 --- a/applications/view/company/users/profile.py +++ b/applications/view/company/users/profile.py @@ -1,10 +1,11 @@ # 个人中心 from flask import render_template, request, make_response from flask_login import login_required, current_user -from flask_restful import Resource, reqparse -from applications.common.admin import user_curd +from flask_restful import Resource 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') @@ -15,21 +16,20 @@ def center(): return render_template('admin/user/profile.html', user_info=user_info, user_logs=user_logs) -# 修改头像 -@users_bp.get('/avatar') -@login_required -def profile(): - return render_template('admin/user/avatar.html') +@user_api.resource('/avatar') +class Avatar(Resource): + """修改头像""" + def get(self): + return make_response(render_template('admin/user/avatar.html')) -# 修改头像 -@users_bp.put('/updateAvatar') -@login_required -def update_avatar(): - url = request.json.get("avatar").get("src") - if not user_curd.update_avatar(url): - return fail_api(msg="出错啦") - return success_api(msg="修改成功") + def put(self): + url = request.json.get("avatar").get("src") + ret = User.query.filter_by(id=current_user.id).update({"avatar": url}) + db.session.commit() + if not ret: + return fail_api(msg="出错啦") + return success_api(msg="修改成功") # 修改当前用户信息 diff --git a/applications/common/admin/user_curd.py b/applications/view/company/users/user_curd.py similarity index 100% rename from applications/common/admin/user_curd.py rename to applications/view/company/users/user_curd.py diff --git a/applications/view/company/users/user_view.py b/applications/view/company/users/user_view.py index 429fb5a..3ba46d8 100644 --- a/applications/view/company/users/user_view.py +++ b/applications/view/company/users/user_view.py @@ -2,11 +2,10 @@ from flask import render_template, request, make_response from flask_restful import Resource 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.rights import authorize 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('/') diff --git a/applications/common/admin/rights_curd.py b/applications/view/rights/rights_curd.py similarity index 91% rename from applications/common/admin/rights_curd.py rename to applications/view/rights/rights_curd.py index 1324b5f..07aca66 100644 --- a/applications/common/admin/rights_curd.py +++ b/applications/view/rights/rights_curd.py @@ -1,19 +1,21 @@ 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.common.curd import model_to_dicts + +from flask_restful import marshal +from applications.common.serialization import power_fields def get_power_dict(): power = Power.query.all() - res = model_to_dicts(Schema=PowerSchema2, model=power) + res = marshal(power, power_fields) return res # 选择父节点 def select_parent(): power = Power.query.all() - res = model_to_dicts(Schema=PowerSchema2, model=power) + res = marshal(power, power_fields) res.append({"powerId": 0, "powerName": "顶级权限", "parentId": -1}) return res diff --git a/applications/view/rights/role.py b/applications/view/rights/role.py index 499b013..122caa7 100644 --- a/applications/view/rights/role.py +++ b/applications/view/rights/role.py @@ -1,10 +1,14 @@ from flask import Blueprint, render_template, request, jsonify 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.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') @@ -19,17 +23,34 @@ def main(): @role_bp.get('/data') @authorize("admin:role:main", log=True) def table(): - page = request.args.get('page', type=int) - limit = request.args.get('limit', type=int) - role_name = request.args.get('roleName', type=str) - role_code = request.args.get('roleCode', type=str) - filters = {} - if role_name: - filters["name"] = ('%' + role_name + '%') - if role_code: - filters["code"] = ('%' + role_code + '%') - data, count = role_curd.get_role_data_dict(page=page, limit=limit, filters=filters) - return table_api(data=data, count=count) + 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) # 角色增加 @@ -44,8 +65,24 @@ def add(): @role_bp.post('/save') @authorize("admin:role:add", log=True) def save(): - req = request.json - role_curd.add_role(req=req) + 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="成功") @@ -60,7 +97,19 @@ def power(_id): @role_bp.get('/getRolePower/') @authorize("admin:role:main", log=True) 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 = { "data": powers, "status": {"code": 200, "message": "默认"} @@ -72,11 +121,14 @@ def get_role_power(_id): @role_bp.put('/saveRolePower') @authorize("admin:role:edit", log=True) def save_role_power(): - req_form = request.form - power_ids = req_form.get("powerIds") - power_list = power_ids.split(',') - role_id = req_form.get("roleId") - role_curd.update_role_power(_id=role_id, power_list=power_list) + 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_curd.update_role_power(_id=res.role_id, power_list=power_list) return success_api(msg="授权成功") @@ -84,7 +136,7 @@ def save_role_power(): @role_bp.get('/edit/') @authorize("admin:role:edit", log=True) 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) @@ -92,8 +144,27 @@ def edit(_id): @role_bp.put('/update') @authorize("admin:role:edit", log=True) def update(): - res = role_curd.update_role(request.json) - if not res: + 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=res.role_id).update(data) + db.session.commit() + if not role: return fail_api(msg="更新角色失败") return success_api(msg="更新角色成功") @@ -102,27 +173,27 @@ def update(): @role_bp.put('/enable') @authorize("admin:role:edit", log=True) def enable(): - id = request.json.get('roleId') - # print(id) - if id: - res = role_curd.enable_status(id) - if not res: - return fail_api(msg="出错啦") - return success_api(msg="启动成功") - return fail_api(msg="数据错误") + parser = reqparse.RequestParser() + parser.add_argument('roleId', dest='role_id', required=True, type=int) + res = parser.parse_args() + ret = Role.query.filter_by(id=res.role_id).update({"enable": 1}) + db.session.commit() + if not ret: + return fail_api(msg="出错啦") + return success_api(msg="启动成功") # 禁用用户 @role_bp.put('/disable') @authorize("admin:role:edit", log=True) def dis_enable(): - _id = request.json.get('roleId') - if _id: - res = role_curd.disable_status(_id) - if not res: - return fail_api(msg="出错啦") - return success_api(msg="禁用成功") - return fail_api(msg="数据错误") + parser = reqparse.RequestParser() + parser.add_argument('roleId', dest='role_id', required=True, type=int) + res = parser.parse_args() + ret = role_curd.disable_status(res.role_id) + if not ret: + return fail_api(msg="出错啦") + return success_api(msg="禁用成功") # 角色删除 @@ -140,6 +211,10 @@ def remove(_id): @authorize("admin:role:remove", log=True) @login_required def batch_remove(): - ids = request.form.getlist('ids[]') - role_curd.batch_remove(ids) + parser = reqparse.RequestParser() + parser.add_argument('ids[]', action='append', dest='ids') + + res = parser.parse_args() + + role_curd.batch_remove(res.ids) return success_api(msg="批量删除成功") diff --git a/applications/view/rights/role_curd.py b/applications/view/rights/role_curd.py new file mode 100644 index 0000000..146994c --- /dev/null +++ b/applications/view/rights/role_curd.py @@ -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) diff --git a/applications/view/rights/view.py b/applications/view/rights/view.py index 5188c91..4d87369 100644 --- a/applications/view/rights/view.py +++ b/applications/view/rights/view.py @@ -1,8 +1,7 @@ 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 ...common.admin import rights_curd +from . import rights_bp, rights_api, rights_curd from ...common.utils.http import success_api, fail_api from ...common.utils.rights import authorize @@ -98,7 +97,7 @@ def enable(): @authorize("admin:power:edit", log=True) def dis_enable(): _id = request.json.get('powerId') - if id: + if _id: res = rights_curd.disable_status(_id) if not res: return fail_api(msg="出错啦") @@ -113,11 +112,3 @@ def batch_remove(): ids = request.form.getlist('ids[]') rights_curd.batch_remove(ids) return success_api(msg="批量删除成功") - - -""" - https://developer.aliyun.com/article/778501 - 四位权限值: 增删改查 - 八位部门值: 流量 接待&转化 讲师 运营 1111 1111 - 四位公司值: -""" diff --git a/applications/view/vip/__init__.py b/applications/view/vip/__init__.py deleted file mode 100644 index 838a798..0000000 --- a/applications/view/vip/__init__.py +++ /dev/null @@ -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)