diff --git a/applications/config/common.py b/applications/config/common.py index 7e9d77a..b4e026d 100644 --- a/applications/config/common.py +++ b/applications/config/common.py @@ -6,3 +6,4 @@ SECRET_KEY = 'pear-admin-flask' UPLOADED_PHOTOS_DEST = 'static/upload' UPLOADED_FILES_ALLOW = ['gif','jpg'] +JSON_AS_ASCII = False \ No newline at end of file diff --git a/applications/models/admin.py b/applications/models/admin.py index c82638b..0b861ec 100644 --- a/applications/models/admin.py +++ b/applications/models/admin.py @@ -37,7 +37,7 @@ class Role(db.Model): id = db.Column(db.Integer, primary_key=True, comment='角色ID') name = db.Column(db.String(255), comment='角色名称') code = db.Column(db.String(255), comment='角色标识') - enable = db.Column(db.CHAR(1), comment='是否启用') + enable = db.Column(db.Integer, comment='是否启用') remark = db.Column(db.String(255), comment='备注') details = db.Column(db.String(255), comment='详情') sort = db.Column(db.Integer, comment='排序') diff --git a/applications/service/admin/power.py b/applications/service/admin/power.py index b0faf57..bd177b7 100644 --- a/applications/service/admin/power.py +++ b/applications/service/admin/power.py @@ -28,6 +28,7 @@ def get_power_dict(): return power_dict +# 选择父节点 def select_parent(): power = Power.query.all() power_schema = PowerSchema(many=True) @@ -36,6 +37,7 @@ def select_parent(): return power_dict +# 增加权限 def save_power(req): icon = req.get("icon") openType = req.get("openType") @@ -44,6 +46,7 @@ def save_power(req): powerName = req.get("powerName") powerType = req.get("powerType") powerUrl = req.get("powerUrl") + sort = req.get("sort") power = Power( icon=icon, open_type=openType, @@ -51,13 +54,36 @@ def save_power(req): code=powerCode, name=powerName, type=powerType, - url=powerUrl + url=powerUrl, + sort=sort ) r = db.session.add(power) db.session.commit() return r +# 根据id查询权限 +def get_power_by_id(id): + p = Power.query.filter_by(id=id).first() + return p + + +# 更新角色 +def update_power(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") + } + print(data) + role = Role.query.filter_by(id=id).update(data) + db.session.commit() + return role + + # 删除权限(目前没有判断父节点自动删除子节点) def remove_power(id): power = Power.query.filter_by(id=id).first() diff --git a/applications/service/admin/role.py b/applications/service/admin/role.py index 281cd5b..af24b48 100644 --- a/applications/service/admin/role.py +++ b/applications/service/admin/role.py @@ -1,5 +1,6 @@ from flask_marshmallow import Marshmallow from marshmallow import fields +from sqlalchemy import and_ from applications.models import db from applications.models.admin import Role, Power @@ -33,25 +34,24 @@ class PowerSchema(ma.Schema): # 序列化类 enable = fields.Integer() -''' -获取用户的sqlalchemy对象 -分页器 -''' - - -def get_role_data(page, limit): - role = Role.query.paginate(page=page, per_page=limit, error_out=False) +# 获取角色对象 +def get_role_data(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): - role, count = get_role_data(page, limit) +# 获取角色dict +def get_role_data_dict(page, limit, filters): + role, count = get_role_data(page, limit, filters) role_schema = RoleSchema(many=True) # 用已继承ma.ModelSchema类的自定制类生成序列化类 output = role_schema.dump(role.items) # 生成可序列化对象 return output, count +# 增加角色 def add_role(req): details = req.get("details") enable = req.get("enable") @@ -69,6 +69,29 @@ def add_role(req): db.session.commit() +# 通过id获取角色 +def get_role_by_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") + } + print(data) + 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 @@ -86,6 +109,7 @@ def get_role_power(id): return output +# 更新角色权限 def update_role_power(id, power_list): role = Role.query.filter_by(id=id).first() power_id_list = [] diff --git a/applications/service/admin/user.py b/applications/service/admin/user.py index 8b17c73..29f16ac 100644 --- a/applications/service/admin/user.py +++ b/applications/service/admin/user.py @@ -2,6 +2,7 @@ from flask import jsonify from flask_login import current_user from flask_marshmallow import Marshmallow from marshmallow import fields +from sqlalchemy import and_ from sqlalchemy.sql import exists from applications.models import db @@ -27,8 +28,8 @@ class UserSchema(ma.Schema): ''' -def get_user_data(page, limit): - user = User.query.paginate(page=page, per_page=limit, error_out=False) +def get_user_data(page, limit,filters): + user = User.query.filter(and_(*[getattr(User, k).like(v) for k,v in filters.items()])).paginate(page=page, per_page=limit, error_out=False) count = User.query.count() return user, count @@ -39,8 +40,8 @@ def get_user_data(page, limit): ''' -def get_user_data_dict(page, limit): - user, count = get_user_data(page, limit) +def get_user_data_dict(page, limit, filters): + user, count = get_user_data(page, limit,filters) user_schema = UserSchema(many=True) # 用已继承ma.ModelSchema类的自定制类生成序列化类 output = user_schema.dump(user.items) # 生成可序列化对象 return output, count @@ -104,10 +105,7 @@ def update_user_role(id, roles_list): user = User.query.filter_by(id=id).first() roles_id = [] for role in user.role: - print(role) roles_id.append(role.id) - print('---------------------') - print(roles_id) roles = Role.query.filter(Role.id.in_(roles_id)).all() for r in roles: user.role.remove(r) diff --git a/applications/views/admin/index.py b/applications/views/admin/index.py index e0c830d..ea266b9 100644 --- a/applications/views/admin/index.py +++ b/applications/views/admin/index.py @@ -14,7 +14,7 @@ ma = Marshmallow() # 首页 @admin_index.route('/') -@PreAuthorize('index:index') +@login_required def index(): username = current_user.username return render_template('admin/index.html', username=username) diff --git a/applications/views/admin/monitor.py b/applications/views/admin/monitor.py index aef0818..5fa1f0b 100644 --- a/applications/views/admin/monitor.py +++ b/applications/views/admin/monitor.py @@ -1,3 +1,4 @@ +import os import platform import re from datetime import datetime @@ -43,20 +44,22 @@ def index(): memory_total = str(round(memory_information.total / 1024 / 1024)) memory_free = str(round(memory_information.free / 1024 / 1024)) # 磁盘信息 - disk_partitions = psutil.disk_partitions() - disk_partitions_list = [] - for i in disk_partitions: - a = psutil.disk_usage(i.device) - disk_partitions_dict = { - 'device': i.device, - 'fstype': i.fstype, - 'total': str(round(a.total / 1024 / 1024)), - 'used': str(round(a.used / 1024 / 1024)), - 'free': str(round(a.free / 1024 / 1024)), - 'percent': a.percent - } - disk_partitions_list.append(disk_partitions_dict) + disk_partitions_list = [] + # 判断是否在容器中 + if not os.path.exists('/.dockerenv'): + disk_partitions = psutil.disk_partitions() + for i in disk_partitions: + a = psutil.disk_usage(i.device) + disk_partitions_dict = { + 'device': i.device, + 'fstype': i.fstype, + 'total': str(round(a.total / 1024 / 1024)), + 'used': str(round(a.used / 1024 / 1024)), + 'free': str(round(a.free / 1024 / 1024)), + 'percent': a.percent + } + disk_partitions_list.append(disk_partitions_dict) # 开机时间 boot_time = datetime.fromtimestamp(psutil.boot_time()).replace(microsecond=0) diff --git a/applications/views/admin/power.py b/applications/views/admin/power.py index b446f53..326912b 100644 --- a/applications/views/admin/power.py +++ b/applications/views/admin/power.py @@ -1,6 +1,6 @@ from flask import Blueprint, render_template, request, jsonify from flask_login import login_required -from applications.service.admin.power import get_power_dict, select_parent, save_power, remove_power +from applications.service.admin.power import get_power_dict, select_parent, save_power, remove_power, get_power_by_id admin_power = Blueprint('adminPower', __name__, url_prefix='/admin/power') @@ -52,3 +52,18 @@ def remove(id): return jsonify(success=True, msg="删除成功") else: return jsonify(success=False, msg="删除失败") + +# 权限编辑 +@admin_power.route('/edit/', methods=['GET', 'POST']) +def edit(id): + power = get_power_by_id(id) + return render_template('admin/power/edit.html',power=power) + + +# 权限更新 +@admin_power.route('/update', methods=['PUT']) +def update(): + res = update_role(request.json) + if not res: + return jsonify(success=False, msg="更新角色失败") + return jsonify(success=True, msg="更新角色成功") diff --git a/applications/views/admin/role.py b/applications/views/admin/role.py index eaa4b0a..7ccd6ec 100644 --- a/applications/views/admin/role.py +++ b/applications/views/admin/role.py @@ -1,7 +1,8 @@ from flask import Blueprint, render_template, request, jsonify from flask_login import login_required -from applications.service.admin.role import get_role_data_dict, add_role, get_role_power, update_role_power +from applications.service.admin.role import get_role_data_dict, add_role, get_role_power, update_role_power, \ + get_role_by_id, update_role admin_role = Blueprint('adminRole', __name__, url_prefix='/admin/role') @@ -13,20 +14,20 @@ def index(): return render_template('admin/role/main.html') -# @admin_role.route('/test') -# @login_required -# def test(): -# return jsonify(current_user.role) - -# 用户 分页查询 - - +# 表格数据 @admin_role.route('/data') @login_required def table(): page = request.args.get('page', type=int) limit = request.args.get('limit', type=int) - data, count = get_role_data_dict(page=page, limit=limit) + roleName = request.args.get('roleName', type=str) + roleCode = request.args.get('roleCode', type=str) + filters = {} + if roleName: + filters["name"] = ('%' + roleName + '%') + if roleCode: + filters["code"] = ('%' + roleCode + '%') + data, count = get_role_data_dict(page=page, limit=limit, filters=filters) res = { 'msg': "", 'code': 0, @@ -45,6 +46,7 @@ def add(): return render_template('admin/role/add.html') +# 角色增加 @admin_role.route('/save', methods=['POST']) @login_required def save(): @@ -53,89 +55,49 @@ def save(): return jsonify(msg="成功", success=True) +# 角色授权 @admin_role.route('/power/') def power(id): return render_template('admin/role/power.html', id=id) +# 获取角色权限 @admin_role.route('/getRolePower/') def getRolePower(id): powers = get_role_power(id) res = { "data": powers, - "status":{"code": 200, "message": "默认"} + "status": {"code": 200, "message": "默认"} } return jsonify(res) -@admin_role.route('/saveRolePower',methods=['PUT']) + +# 保存角色权限 +@admin_role.route('/saveRolePower', methods=['PUT']) def saveRolePower(): - req_form =request.form - powerIds=req_form.get("powerIds") - power_list=powerIds.split(',') - roleId=req_form.get("roleId") - update_role_power(id=roleId,power_list=power_list) - return jsonify(success=True,msg="授权成功") - -# @admin_user.route('/delete', methods=['POST']) -# @login_required -# def delete(): -# id = request.form.get('id') -# user = delete_by_id() -# db.session.commit() -# if user: -# return jsonify(msg="删除成功", code=200) -# else: -# return jsonify(msg="删除失败", code=999) -# - -# 编辑用户 -# @admin_user.route('/edit/', methods=['GET', 'POST']) -# @login_required -# def update(id): -# if request.method == 'POST': -# username = request.form.get('username') -# password = request.form.get('password') -# role = request.form.get('role') -# if username and role: -# if password is None: -# if User.query.filter_by(id=id).first() is not None: -# update_user(id,username) -# return jsonify(msg="修改成功", code=200) -# -# else: -# res = {"msg": "用户已经存在", "code": 200} -# return jsonify(res) -# else: -# user = User.query.filter_by(id=id).first() -# if user is not None: -# User.query.filter_by(id=id).update({'username': username, 'role': role}) -# user.set_password(password) -# db.session.commit() -# return jsonify(msg="修改成功", code=200) -# else: -# return jsonify(msg="用户不存在", code=200) -# -# else: -# -# return jsonify(msg="用户名密码角色不能为空", code=999) -# else: -# role = ['管理员', '普通用户'] -# user = User.query.filter_by(id=id).first() -# return render_template('admin/user_edit.html', user=user, role=role) + req_form = request.form + powerIds = req_form.get("powerIds") + power_list = powerIds.split(',') + roleId = req_form.get("roleId") + update_role_power(id=roleId, power_list=power_list) + return jsonify(success=True, msg="授权成功") -# 更新用户状态 -# @admin_user.route('/update/status', methods=['POST']) -# @login_required -# def ustatus(): -# id = request.form.get('id') -# status = request.form.get('status') -# if id and status: -# res = update_status(status=status) -# return res -# return jsonify(msg="出错啦", code=999) +# 角色编辑 +@admin_role.route('/edit/', methods=['GET', 'POST']) +def edit(id): + role = get_role_by_id(id) + return render_template('admin/role/edit.html', role=role) +# 更新角色 +@admin_role.route('/update', methods=['PUT']) +def update(): + res = update_role(request.json) + if not res: + return jsonify(success=False, msg="更新角色失败") + return jsonify(success=True, msg="更新角色成功") + # 批量删除 # @admin_user.route('/batchRemove', methods=['GET', 'POST']) # @login_required diff --git a/applications/views/admin/user.py b/applications/views/admin/user.py index 10bd60d..506bdb5 100644 --- a/applications/views/admin/user.py +++ b/applications/views/admin/user.py @@ -21,7 +21,14 @@ def index(): def data(): page = request.args.get('page', type=int) limit = request.args.get('limit', type=int) - data, count = get_user_data_dict(page=page, limit=limit) + realName = request.args.get('realName', type=str) + username = request.args.get('username',type=str) + filters = {} + if realName: + filters["realname"]=('%'+realName+'%') + if username: + filters["username"]=('%'+username+'%') + data, count = get_user_data_dict(page=page, limit=limit, filters=filters) res = { 'msg': "", 'code': 0, diff --git a/migrations/versions/58fc2c4c30a5_.py b/migrations/versions/58fc2c4c30a5_.py new file mode 100644 index 0000000..289a8af --- /dev/null +++ b/migrations/versions/58fc2c4c30a5_.py @@ -0,0 +1,28 @@ +"""empty message + +Revision ID: 58fc2c4c30a5 +Revises: 715a8ecc5856 +Create Date: 2021-03-19 21:31:06.761526 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '58fc2c4c30a5' +down_revision = '715a8ecc5856' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('admin_role', sa.Column('enable', sa.Integer(), nullable=True, comment='是否启用')) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('admin_role', 'enable') + # ### end Alembic commands ### diff --git a/migrations/versions/715a8ecc5856_.py b/migrations/versions/715a8ecc5856_.py new file mode 100644 index 0000000..ede2495 --- /dev/null +++ b/migrations/versions/715a8ecc5856_.py @@ -0,0 +1,28 @@ +"""empty message + +Revision ID: 715a8ecc5856 +Revises: 64de3323bc01 +Create Date: 2021-03-19 21:30:52.200812 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +# revision identifiers, used by Alembic. +revision = '715a8ecc5856' +down_revision = '64de3323bc01' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('admin_role', 'enable') + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('admin_role', sa.Column('enable', mysql.CHAR(collation='utf8_unicode_ci', length=1), nullable=True, comment='是否启用')) + # ### end Alembic commands ### diff --git a/static/admin/config/pear.config.yml b/static/admin/config/pear.config.yml index c2be9d5..3f2d97f 100644 --- a/static/admin/config/pear.config.yml +++ b/static/admin/config/pear.config.yml @@ -4,7 +4,7 @@ logo: ## 网站名称 title: "Pear Admin" ## 网站图标 - image: "admin/admin/images/logo.png" + image: "/static/admin/admin/images/logo.png" ## 菜单配置 menu: ## 菜单数据来源 diff --git a/static/upload/6958819_pear-admin_1607443454_1.png b/static/upload/6958819_pear-admin_1607443454_1.png new file mode 100644 index 0000000..048643a Binary files /dev/null and b/static/upload/6958819_pear-admin_1607443454_1.png differ diff --git a/static/upload/png b/static/upload/png deleted file mode 100644 index 43c38d6..0000000 Binary files a/static/upload/png and /dev/null differ diff --git a/templates/admin/power/edit.html b/templates/admin/power/edit.html new file mode 100644 index 0000000..2866771 --- /dev/null +++ b/templates/admin/power/edit.html @@ -0,0 +1,202 @@ + + + + 权限编辑 + + +
+
+
+
+
+ +
+ +
+
+
+ +
+
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/templates/admin/power/main.html b/templates/admin/power/main.html index e1a913c..9d82e09 100644 --- a/templates/admin/power/main.html +++ b/templates/admin/power/main.html @@ -206,7 +206,7 @@ title: '修改', shade: 0.1, area: ['450px', '500px'], - content: MODULE_PATH + 'edit?powerId=' + obj.data['powerId'] + content: MODULE_PATH + 'edit/' + obj.data['powerId'] }); } diff --git a/templates/admin/role/add.html b/templates/admin/role/add.html index 0efee37..48ddba7 100644 --- a/templates/admin/role/add.html +++ b/templates/admin/role/add.html @@ -1,7 +1,7 @@ - 用户新增 + 角色新增 diff --git a/templates/admin/role/edit.html b/templates/admin/role/edit.html new file mode 100644 index 0000000..2e6dda9 --- /dev/null +++ b/templates/admin/role/edit.html @@ -0,0 +1,105 @@ + + + + 角色编辑 + + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/templates/admin/role/main.html b/templates/admin/role/main.html index e547ff6..003fdd6 100644 --- a/templates/admin/role/main.html +++ b/templates/admin/role/main.html @@ -175,7 +175,7 @@ title: '修改', shade: 0.1, area: ['500px', '500px'], - content: MODULE_PATH + 'edit?roleId=' + obj.data['roleId'] + content: MODULE_PATH + 'edit/' + obj.data['id'] }); }