diff --git a/README.md b/README.md index 66d673a..ab22b8a 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,7 @@ venv\Scripts\activate # source venv/bin/activate # (Linux激活虚拟环境) # 安装依赖 -pip install -r requirement\requirement-dev.txt +pip install -r requirement.txt ``` + 数据迁移 diff --git a/applications/rights/rights.py b/applications/rights/rights.py index 29ec2fd..55d314f 100644 --- a/applications/rights/rights.py +++ b/applications/rights/rights.py @@ -1,12 +1,11 @@ import copy -from typing import Optional from collections import OrderedDict +from typing import Optional from flask import request, jsonify, current_app from flask.views import MethodView from flask_login import current_user from flask_pydantic import validate - from pydantic import BaseModel, Field from common.utils.http import success_api, fail_api @@ -148,27 +147,6 @@ def make_menu_tree(): return sorted(menu_dict.get(0), key=lambda item: item['sort']) -# 删除权限(目前没有判断父节点自动删除子节点) -def remove_power(power_id): - power = RightModel.query.filter_by(id=power_id).first() - role_id_list = [] - roles = power.role - for role in roles: - role_id_list.append(role.id) - roles = RoleModel.query.filter(RoleModel.id.in_(role_id_list)).all() - for p in roles: - power.role.remove(p) - r = RightModel.query.filter_by(id=power_id).delete() - db.session.commit() - return r - - -# 批量删除权限 -def batch_remove_power(ids): - for _id in ids: - remove_power(_id) - - class PowerModel(BaseModel): icon: str open_type: Optional[str] = Field(alias='openType') @@ -208,7 +186,14 @@ class RightsApi(MethodView): def delete(self): ids = request.form.getlist('ids[]') - batch_remove_power(ids) + for id in ids: + role = RoleModel.query.filter_by(id=id).first() + # 删除该角色的权限和用户 + role.power = [] + role.user = [] + + r = RoleModel.query.filter_by(id=id).delete() + db.session.commit() return success_api(message="批量删除成功") diff --git a/applications/rights/roles.py b/applications/rights/roles.py index 5656f49..d2ed341 100644 --- a/applications/rights/roles.py +++ b/applications/rights/roles.py @@ -1,48 +1,21 @@ from flask import request from flask.views import MethodView -from flask_restful import reqparse - from common.utils.http import table_api, success_api, fail_api from extensions import db -from models import RightModel, RoleModel, UserModel - - -def remove_role(role_id): - """ 删除角色 """ - role = RoleModel.query.filter_by(id=role_id).first() - # 删除该角色的权限 - power_id_list = [] - for p in role.power: - power_id_list.append(p.id) - - powers = RightModel.query.filter(RightModel.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 = UserModel.query.filter(UserModel.id.in_(user_id_list)).all() - for u in users: - role.user.remove(u) - r = RoleModel.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) +from models import RightModel, RoleModel def role_deletes(): - parser = reqparse.RequestParser() - parser.add_argument('ids[]', action='append', dest='ids') + ids = request.form.getlist('ids[]') + for id in ids: + role = RoleModel.query.filter_by(id=id).first() + # 删除该角色的权限和用户 + role.power = [] + role.user = [] - res = parser.parse_args() - - batch_remove_role(res.ids) + r = RoleModel.query.filter_by(id=id).delete() + db.session.commit() return success_api(message="批量删除成功") @@ -169,21 +142,21 @@ class RolePowerApi(MethodView): """ 更新角色权限 """ role = RoleModel.query.filter_by(id=_id).first() - power_id_list = [] - for p in role.power: - power_id_list.append(p.id) - powers = RightModel.query.filter(RightModel.id.in_(power_id_list)).all() - for p in powers: - role.power.remove(p) powers = RightModel.query.filter(RightModel.id.in_(power_list)).all() - for p in powers: - role.power.append(p) + role.power = powers + db.session.commit() return success_api(message="授权成功") # 角色删除 def delete(self, _id): - res = remove_role(_id) - if not res: + role = RoleModel.query.filter_by(id=_id).first() + # 删除该角色的权限和用户 + role.power = [] + role.user = [] + + r = RoleModel.query.filter_by(id=_id).delete() + db.session.commit() + if not r: return fail_api(message="角色删除失败") return success_api(message="角色删除成功") diff --git a/applications/users/user.py b/applications/users/user.py index 5abac61..ff17a6c 100644 --- a/applications/users/user.py +++ b/applications/users/user.py @@ -4,7 +4,6 @@ from flask import request, jsonify from flask.views import MethodView from flask_login import current_user from flask_pydantic import validate -from flask_restful import reqparse from pydantic import BaseModel, Field from sqlalchemy import desc @@ -181,35 +180,31 @@ def user_role_resource(_id, body: PersonModel2): def user_info(_id, action): if action == 'info': - parser = reqparse.RequestParser() - parser.add_argument('realName', type=str, dest='real_name') - parser.add_argument('username', type=str) - parser.add_argument('remark', type=str) - parser.add_argument('details', type=str) - - res = parser.parse_args() + real_name = request.json.get('realName', '') + username = request.json.get('username', '') + remark = request.json.get('remark', '') + details = request.json.get('details', '') ret = UserModel.query.get(_id) - ret.username = res.username - ret.realname = res.real_name - ret.remark = res.details + ret.username = username + ret.realname = real_name + ret.remark = details db.session.commit() if not ret: return fail_api(message="出错啦") return success_api(message="更新成功") elif action == 'status': - parser = reqparse.RequestParser() - parser.add_argument('userId', type=int, required=True, dest='user_id') - parser.add_argument('operate', type=int, required=True, dest='operate', choices=[0, 1]) + user_id = int(request.json.get('userId', 0)) # int + operate = int(request.json.get('operate', 0)) # int + if operate not in [0, 1]: + return {'status': 'error', 'message': '请求有误'} - res = parser.parse_args() - - if res.operate == 1: + if operate == 1: user = UserModel.query.get(_id) - user.enable = res.operate + user.enable = operate message = success_api(message="启动成功") else: - user = UserModel.query.filter_by(id=res.user_id).update({"enable": res.operate}) + user = UserModel.query.filter_by(id=user_id).update({"enable": operate}) message = success_api(message="禁用成功") if user: db.session.commit() @@ -225,22 +220,21 @@ def user_info(_id, action): return fail_api(message="出错啦") return success_api(message="修改成功") elif action == 'password': - parser = reqparse.RequestParser() - parser.add_argument('oldPassword', type=str, required=True, help='旧密码不得为空') - parser.add_argument('newPassword', type=str, required=True, help='新密码不得为空') - parser.add_argument('confirmPassword', type=str, required=True, help='确认密码不能为空') + oldPassword = request.json.get('oldPassword', '') + newPassword = request.json.get('newPassword', '') + confirmPassword = request.json.get('confirmPassword', '') + if not all([oldPassword, newPassword, confirmPassword]): + return {'status': 'error', 'message': '密码不能为空'} - res = parser.parse_args() - - if res.newPassword != res.confirmPassword: + if newPassword != confirmPassword: return fail_api(message='确认密码不一致') """ 修改当前用户密码 """ user = UserModel.query.get(_id) - is_right = user.validate_password(res.oldPassword) + is_right = user.validate_password(oldPassword) if not is_right: return jsonify(success=False, message="旧密码错误") - user.set_password(res.newPassword) + user.set_password(newPassword) db.session.add(user) db.session.commit() diff --git a/requirement.txt b/requirement.txt index 32f03e5..f332777 100644 --- a/requirement.txt +++ b/requirement.txt @@ -6,15 +6,17 @@ colorama==0.4.4 Flask==2.0.1 Flask-Login==0.5.0 Flask-Migrate==3.0.1 -Flask-RESTful==0.3.9 +Flask-Pydantic==0.9.0 Flask-SQLAlchemy==2.5.1 greenlet==1.1.0 +gunicorn==20.1.0 itsdangerous==2.0.1 Jinja2==3.0.1 Mako==1.1.4 MarkupSafe==2.0.1 Pillow==8.2.0 psutil==5.8.0 +pydantic==1.9.1 PyMySQL==1.0.2 python-dateutil==2.8.1 python-dotenv==0.18.0 @@ -22,5 +24,5 @@ python-editor==1.0.4 pytz==2021.1 six==1.16.0 SQLAlchemy==1.4.18 +typing_extensions==4.2.0 Werkzeug==2.0.1 -gunicorn==20.1.0 \ No newline at end of file diff --git a/templates/admin/rights/rights_add.html b/templates/admin/rights/rights_add.html index c6846b0..4e36c2f 100644 --- a/templates/admin/rights/rights_add.html +++ b/templates/admin/rights/rights_add.html @@ -148,6 +148,7 @@ return false; }); + iconPicker.render({ // 选择器,推荐使用input elem: '#icon', diff --git a/templates/admin/roles/roles_power.html b/templates/admin/roles/roles_power.html index 957499d..d1da216 100644 --- a/templates/admin/roles/roles_power.html +++ b/templates/admin/roles/roles_power.html @@ -62,8 +62,9 @@ $.ajax({ url: '/api/v1/roles/role_power/' + data.field.roleId, - data: data.field, + data: JSON.stringify(data.field), dataType: 'json', + contentType: 'application/json', type: 'put', success: function(result) { if (result.success) {