过滤查询,完善基础功能,解决unicode编码问题,增加磁盘监控对于docker容器的判断
This commit is contained in:
@@ -6,3 +6,4 @@ SECRET_KEY = 'pear-admin-flask'
|
|||||||
UPLOADED_PHOTOS_DEST = 'static/upload'
|
UPLOADED_PHOTOS_DEST = 'static/upload'
|
||||||
UPLOADED_FILES_ALLOW = ['gif','jpg']
|
UPLOADED_FILES_ALLOW = ['gif','jpg']
|
||||||
|
|
||||||
|
JSON_AS_ASCII = False
|
||||||
@@ -37,7 +37,7 @@ class Role(db.Model):
|
|||||||
id = db.Column(db.Integer, primary_key=True, comment='角色ID')
|
id = db.Column(db.Integer, primary_key=True, comment='角色ID')
|
||||||
name = db.Column(db.String(255), comment='角色名称')
|
name = db.Column(db.String(255), comment='角色名称')
|
||||||
code = 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='备注')
|
remark = db.Column(db.String(255), comment='备注')
|
||||||
details = db.Column(db.String(255), comment='详情')
|
details = db.Column(db.String(255), comment='详情')
|
||||||
sort = db.Column(db.Integer, comment='排序')
|
sort = db.Column(db.Integer, comment='排序')
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ def get_power_dict():
|
|||||||
return power_dict
|
return power_dict
|
||||||
|
|
||||||
|
|
||||||
|
# 选择父节点
|
||||||
def select_parent():
|
def select_parent():
|
||||||
power = Power.query.all()
|
power = Power.query.all()
|
||||||
power_schema = PowerSchema(many=True)
|
power_schema = PowerSchema(many=True)
|
||||||
@@ -36,6 +37,7 @@ def select_parent():
|
|||||||
return power_dict
|
return power_dict
|
||||||
|
|
||||||
|
|
||||||
|
# 增加权限
|
||||||
def save_power(req):
|
def save_power(req):
|
||||||
icon = req.get("icon")
|
icon = req.get("icon")
|
||||||
openType = req.get("openType")
|
openType = req.get("openType")
|
||||||
@@ -44,6 +46,7 @@ def save_power(req):
|
|||||||
powerName = req.get("powerName")
|
powerName = req.get("powerName")
|
||||||
powerType = req.get("powerType")
|
powerType = req.get("powerType")
|
||||||
powerUrl = req.get("powerUrl")
|
powerUrl = req.get("powerUrl")
|
||||||
|
sort = req.get("sort")
|
||||||
power = Power(
|
power = Power(
|
||||||
icon=icon,
|
icon=icon,
|
||||||
open_type=openType,
|
open_type=openType,
|
||||||
@@ -51,13 +54,36 @@ def save_power(req):
|
|||||||
code=powerCode,
|
code=powerCode,
|
||||||
name=powerName,
|
name=powerName,
|
||||||
type=powerType,
|
type=powerType,
|
||||||
url=powerUrl
|
url=powerUrl,
|
||||||
|
sort=sort
|
||||||
)
|
)
|
||||||
r = db.session.add(power)
|
r = db.session.add(power)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return r
|
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):
|
def remove_power(id):
|
||||||
power = Power.query.filter_by(id=id).first()
|
power = Power.query.filter_by(id=id).first()
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
from flask_marshmallow import Marshmallow
|
from flask_marshmallow import Marshmallow
|
||||||
from marshmallow import fields
|
from marshmallow import fields
|
||||||
|
from sqlalchemy import and_
|
||||||
|
|
||||||
from applications.models import db
|
from applications.models import db
|
||||||
from applications.models.admin import Role, Power
|
from applications.models.admin import Role, Power
|
||||||
@@ -33,25 +34,24 @@ class PowerSchema(ma.Schema): # 序列化类
|
|||||||
enable = fields.Integer()
|
enable = fields.Integer()
|
||||||
|
|
||||||
|
|
||||||
'''
|
# 获取角色对象
|
||||||
获取用户的sqlalchemy对象
|
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)
|
||||||
|
|
||||||
def get_role_data(page, limit):
|
|
||||||
role = Role.query.paginate(page=page, per_page=limit, error_out=False)
|
|
||||||
count = Role.query.count()
|
count = Role.query.count()
|
||||||
return role, count
|
return role, count
|
||||||
|
|
||||||
|
|
||||||
def get_role_data_dict(page, limit):
|
# 获取角色dict
|
||||||
role, count = get_role_data(page, limit)
|
def get_role_data_dict(page, limit, filters):
|
||||||
|
role, count = get_role_data(page, limit, filters)
|
||||||
role_schema = RoleSchema(many=True) # 用已继承ma.ModelSchema类的自定制类生成序列化类
|
role_schema = RoleSchema(many=True) # 用已继承ma.ModelSchema类的自定制类生成序列化类
|
||||||
output = role_schema.dump(role.items) # 生成可序列化对象
|
output = role_schema.dump(role.items) # 生成可序列化对象
|
||||||
return output, count
|
return output, count
|
||||||
|
|
||||||
|
|
||||||
|
# 增加角色
|
||||||
def add_role(req):
|
def add_role(req):
|
||||||
details = req.get("details")
|
details = req.get("details")
|
||||||
enable = req.get("enable")
|
enable = req.get("enable")
|
||||||
@@ -69,6 +69,29 @@ def add_role(req):
|
|||||||
db.session.commit()
|
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):
|
def get_role_power(id):
|
||||||
role = Role.query.filter_by(id=id).first()
|
role = Role.query.filter_by(id=id).first()
|
||||||
check_powers = role.power
|
check_powers = role.power
|
||||||
@@ -86,6 +109,7 @@ def get_role_power(id):
|
|||||||
return output
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
# 更新角色权限
|
||||||
def update_role_power(id, power_list):
|
def update_role_power(id, power_list):
|
||||||
role = Role.query.filter_by(id=id).first()
|
role = Role.query.filter_by(id=id).first()
|
||||||
power_id_list = []
|
power_id_list = []
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ from flask import jsonify
|
|||||||
from flask_login import current_user
|
from flask_login import current_user
|
||||||
from flask_marshmallow import Marshmallow
|
from flask_marshmallow import Marshmallow
|
||||||
from marshmallow import fields
|
from marshmallow import fields
|
||||||
|
from sqlalchemy import and_
|
||||||
from sqlalchemy.sql import exists
|
from sqlalchemy.sql import exists
|
||||||
|
|
||||||
from applications.models import db
|
from applications.models import db
|
||||||
@@ -27,8 +28,8 @@ class UserSchema(ma.Schema):
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
def get_user_data(page, limit):
|
def get_user_data(page, limit,filters):
|
||||||
user = User.query.paginate(page=page, per_page=limit, error_out=False)
|
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()
|
count = User.query.count()
|
||||||
return user, count
|
return user, count
|
||||||
|
|
||||||
@@ -39,8 +40,8 @@ def get_user_data(page, limit):
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
|
|
||||||
def get_user_data_dict(page, limit):
|
def get_user_data_dict(page, limit, filters):
|
||||||
user, count = get_user_data(page, limit)
|
user, count = get_user_data(page, limit,filters)
|
||||||
user_schema = UserSchema(many=True) # 用已继承ma.ModelSchema类的自定制类生成序列化类
|
user_schema = UserSchema(many=True) # 用已继承ma.ModelSchema类的自定制类生成序列化类
|
||||||
output = user_schema.dump(user.items) # 生成可序列化对象
|
output = user_schema.dump(user.items) # 生成可序列化对象
|
||||||
return output, count
|
return output, count
|
||||||
@@ -104,10 +105,7 @@ def update_user_role(id, roles_list):
|
|||||||
user = User.query.filter_by(id=id).first()
|
user = User.query.filter_by(id=id).first()
|
||||||
roles_id = []
|
roles_id = []
|
||||||
for role in user.role:
|
for role in user.role:
|
||||||
print(role)
|
|
||||||
roles_id.append(role.id)
|
roles_id.append(role.id)
|
||||||
print('---------------------')
|
|
||||||
print(roles_id)
|
|
||||||
roles = Role.query.filter(Role.id.in_(roles_id)).all()
|
roles = Role.query.filter(Role.id.in_(roles_id)).all()
|
||||||
for r in roles:
|
for r in roles:
|
||||||
user.role.remove(r)
|
user.role.remove(r)
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ ma = Marshmallow()
|
|||||||
|
|
||||||
# 首页
|
# 首页
|
||||||
@admin_index.route('/')
|
@admin_index.route('/')
|
||||||
@PreAuthorize('index:index')
|
@login_required
|
||||||
def index():
|
def index():
|
||||||
username = current_user.username
|
username = current_user.username
|
||||||
return render_template('admin/index.html', username=username)
|
return render_template('admin/index.html', username=username)
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import os
|
||||||
import platform
|
import platform
|
||||||
import re
|
import re
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
@@ -43,20 +44,22 @@ def index():
|
|||||||
memory_total = str(round(memory_information.total / 1024 / 1024))
|
memory_total = str(round(memory_information.total / 1024 / 1024))
|
||||||
memory_free = str(round(memory_information.free / 1024 / 1024))
|
memory_free = str(round(memory_information.free / 1024 / 1024))
|
||||||
# 磁盘信息
|
# 磁盘信息
|
||||||
disk_partitions = psutil.disk_partitions()
|
|
||||||
disk_partitions_list = []
|
|
||||||
|
|
||||||
for i in disk_partitions:
|
disk_partitions_list = []
|
||||||
a = psutil.disk_usage(i.device)
|
# 判断是否在容器中
|
||||||
disk_partitions_dict = {
|
if not os.path.exists('/.dockerenv'):
|
||||||
'device': i.device,
|
disk_partitions = psutil.disk_partitions()
|
||||||
'fstype': i.fstype,
|
for i in disk_partitions:
|
||||||
'total': str(round(a.total / 1024 / 1024)),
|
a = psutil.disk_usage(i.device)
|
||||||
'used': str(round(a.used / 1024 / 1024)),
|
disk_partitions_dict = {
|
||||||
'free': str(round(a.free / 1024 / 1024)),
|
'device': i.device,
|
||||||
'percent': a.percent
|
'fstype': i.fstype,
|
||||||
}
|
'total': str(round(a.total / 1024 / 1024)),
|
||||||
disk_partitions_list.append(disk_partitions_dict)
|
'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)
|
boot_time = datetime.fromtimestamp(psutil.boot_time()).replace(microsecond=0)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from flask import Blueprint, render_template, request, jsonify
|
from flask import Blueprint, render_template, request, jsonify
|
||||||
from flask_login import login_required
|
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')
|
admin_power = Blueprint('adminPower', __name__, url_prefix='/admin/power')
|
||||||
|
|
||||||
@@ -52,3 +52,18 @@ def remove(id):
|
|||||||
return jsonify(success=True, msg="删除成功")
|
return jsonify(success=True, msg="删除成功")
|
||||||
else:
|
else:
|
||||||
return jsonify(success=False, msg="删除失败")
|
return jsonify(success=False, msg="删除失败")
|
||||||
|
|
||||||
|
# 权限编辑
|
||||||
|
@admin_power.route('/edit/<int:id>', 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="更新角色成功")
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
from flask import Blueprint, render_template, request, jsonify
|
from flask import Blueprint, render_template, request, jsonify
|
||||||
from flask_login import login_required
|
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')
|
admin_role = Blueprint('adminRole', __name__, url_prefix='/admin/role')
|
||||||
|
|
||||||
@@ -13,20 +14,20 @@ def index():
|
|||||||
return render_template('admin/role/main.html')
|
return render_template('admin/role/main.html')
|
||||||
|
|
||||||
|
|
||||||
# @admin_role.route('/test')
|
# 表格数据
|
||||||
# @login_required
|
|
||||||
# def test():
|
|
||||||
# return jsonify(current_user.role)
|
|
||||||
|
|
||||||
# 用户 分页查询
|
|
||||||
|
|
||||||
|
|
||||||
@admin_role.route('/data')
|
@admin_role.route('/data')
|
||||||
@login_required
|
@login_required
|
||||||
def table():
|
def table():
|
||||||
page = request.args.get('page', type=int)
|
page = request.args.get('page', type=int)
|
||||||
limit = request.args.get('limit', 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 = {
|
res = {
|
||||||
'msg': "",
|
'msg': "",
|
||||||
'code': 0,
|
'code': 0,
|
||||||
@@ -45,6 +46,7 @@ def add():
|
|||||||
return render_template('admin/role/add.html')
|
return render_template('admin/role/add.html')
|
||||||
|
|
||||||
|
|
||||||
|
# 角色增加
|
||||||
@admin_role.route('/save', methods=['POST'])
|
@admin_role.route('/save', methods=['POST'])
|
||||||
@login_required
|
@login_required
|
||||||
def save():
|
def save():
|
||||||
@@ -53,89 +55,49 @@ def save():
|
|||||||
return jsonify(msg="成功", success=True)
|
return jsonify(msg="成功", success=True)
|
||||||
|
|
||||||
|
|
||||||
|
# 角色授权
|
||||||
@admin_role.route('/power/<int:id>')
|
@admin_role.route('/power/<int:id>')
|
||||||
def power(id):
|
def power(id):
|
||||||
return render_template('admin/role/power.html', id=id)
|
return render_template('admin/role/power.html', id=id)
|
||||||
|
|
||||||
|
|
||||||
|
# 获取角色权限
|
||||||
@admin_role.route('/getRolePower/<int:id>')
|
@admin_role.route('/getRolePower/<int:id>')
|
||||||
def getRolePower(id):
|
def getRolePower(id):
|
||||||
powers = get_role_power(id)
|
powers = get_role_power(id)
|
||||||
res = {
|
res = {
|
||||||
"data": powers,
|
"data": powers,
|
||||||
"status":{"code": 200, "message": "默认"}
|
"status": {"code": 200, "message": "默认"}
|
||||||
}
|
}
|
||||||
return jsonify(res)
|
return jsonify(res)
|
||||||
|
|
||||||
@admin_role.route('/saveRolePower',methods=['PUT'])
|
|
||||||
|
# 保存角色权限
|
||||||
|
@admin_role.route('/saveRolePower', methods=['PUT'])
|
||||||
def saveRolePower():
|
def saveRolePower():
|
||||||
req_form =request.form
|
req_form = request.form
|
||||||
powerIds=req_form.get("powerIds")
|
powerIds = req_form.get("powerIds")
|
||||||
power_list=powerIds.split(',')
|
power_list = powerIds.split(',')
|
||||||
roleId=req_form.get("roleId")
|
roleId = req_form.get("roleId")
|
||||||
update_role_power(id=roleId,power_list=power_list)
|
update_role_power(id=roleId, power_list=power_list)
|
||||||
return jsonify(success=True,msg="授权成功")
|
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/<int:id>', 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)
|
|
||||||
|
|
||||||
|
|
||||||
# 更新用户状态
|
# 角色编辑
|
||||||
# @admin_user.route('/update/status', methods=['POST'])
|
@admin_role.route('/edit/<int:id>', methods=['GET', 'POST'])
|
||||||
# @login_required
|
def edit(id):
|
||||||
# def ustatus():
|
role = get_role_by_id(id)
|
||||||
# id = request.form.get('id')
|
return render_template('admin/role/edit.html', role=role)
|
||||||
# status = request.form.get('status')
|
|
||||||
# if id and status:
|
|
||||||
# res = update_status(status=status)
|
|
||||||
# return res
|
|
||||||
# return jsonify(msg="出错啦", code=999)
|
|
||||||
|
|
||||||
|
|
||||||
|
# 更新角色
|
||||||
|
@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'])
|
# @admin_user.route('/batchRemove', methods=['GET', 'POST'])
|
||||||
# @login_required
|
# @login_required
|
||||||
|
|||||||
@@ -21,7 +21,14 @@ def index():
|
|||||||
def data():
|
def data():
|
||||||
page = request.args.get('page', type=int)
|
page = request.args.get('page', type=int)
|
||||||
limit = request.args.get('limit', 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 = {
|
res = {
|
||||||
'msg': "",
|
'msg': "",
|
||||||
'code': 0,
|
'code': 0,
|
||||||
|
|||||||
@@ -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 ###
|
||||||
@@ -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 ###
|
||||||
@@ -4,7 +4,7 @@ logo:
|
|||||||
## 网站名称
|
## 网站名称
|
||||||
title: "Pear Admin"
|
title: "Pear Admin"
|
||||||
## 网站图标
|
## 网站图标
|
||||||
image: "admin/admin/images/logo.png"
|
image: "/static/admin/admin/images/logo.png"
|
||||||
## 菜单配置
|
## 菜单配置
|
||||||
menu:
|
menu:
|
||||||
## 菜单数据来源
|
## 菜单数据来源
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 2.2 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 8.7 KiB |
@@ -0,0 +1,202 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en" xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<title>权限编辑</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='/admin/component/pear/css/pear.css') }}"
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<form class="layui-form" action="">
|
||||||
|
<div class="mainBox">
|
||||||
|
<div class="main-container">
|
||||||
|
<div class="main-container">
|
||||||
|
<div class="layui-form-item layui-hide">
|
||||||
|
<label class="layui-form-label">编号</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="text" value="{{ power.id }}" name="powerId" lay-verify="title"
|
||||||
|
autocomplete="off" class="layui-input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">父级</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<ul id="selectParent" name="parentId" class="dtree" data-id="-1"></ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">名称</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="text" value="{{ power.name }}" name="powerName" lay-verify="title"
|
||||||
|
autocomplete="off" placeholder="权限名称" class="layui-input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item" id="powerCodeItem">
|
||||||
|
<label class="layui-form-label">标识</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="text" id="powerCode" value="{{ power.code }}" name="powerCode"
|
||||||
|
autocomplete="off" placeholder="权限标识" class="layui-input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">状态</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="radio" lay-filter="powerType" {% if power.type == '0' %} checked{% endif %}
|
||||||
|
name="powerType" value="0" title="目录">
|
||||||
|
<input type="radio" lay-filter="powerType" {% if power.type == '1' %} checked{% endif %}
|
||||||
|
name="powerType" value="1" title="菜单">
|
||||||
|
<input type="radio" lay-filter="powerType" {% if power.type == '2' %} checked{% endif %}
|
||||||
|
name="powerType" value="2" title="按钮">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item" id="powerUrlItem">
|
||||||
|
<label class="layui-form-label">路径</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="text" id="powerUrl" value="{{ power.open_type }}" name="powerUrl"
|
||||||
|
autocomplete="off" placeholder="菜单路径" class="layui-input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item" id="openTypeItem">
|
||||||
|
<label class="layui-form-label">打开</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<select name="openType" id="openType">
|
||||||
|
<option value=""></option>
|
||||||
|
<option value="_iframe" {% if power.type == '_iframe' %} checked{% endif %}>框架</option>
|
||||||
|
<option value="_blank" {% if power.type == '_blank' %} checked{% endif %}>签页</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">图标</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="text" id="icon" value="{{ power.icon }}" name="icon" lay-filter="icon"
|
||||||
|
class="layui-input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">排序</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="text" value="{{ power.sort }}" name="sort" lay-verify="title" autocomplete="off"
|
||||||
|
placeholder="排序" class="layui-input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bottom">
|
||||||
|
<div class="button-container">
|
||||||
|
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit="" lay-filter="power-save">
|
||||||
|
<i class="layui-icon layui-icon-ok"></i>
|
||||||
|
提交
|
||||||
|
</button>
|
||||||
|
<button type="reset" class="pear-btn pear-btn-sm">
|
||||||
|
<i class="layui-icon layui-icon-refresh"></i>
|
||||||
|
重置
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<script src="{{ url_for('static', filename='/admin/component/layui/layui.js') }}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='/admin/component/pear/pear.js') }}"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
layui.use(['form', 'jquery', 'iconPicker', 'dtree'], function () {
|
||||||
|
let form = layui.form;
|
||||||
|
let $ = layui.jquery;
|
||||||
|
let iconPicker = layui.iconPicker;
|
||||||
|
let dtree = layui.dtree;
|
||||||
|
|
||||||
|
dtree.renderSelect({
|
||||||
|
elem: "#selectParent",
|
||||||
|
url: "/admin/power/selectParent",
|
||||||
|
method: 'get',
|
||||||
|
selectInputName: {nodeId: "parentId", context: "powerName"},
|
||||||
|
skin: "layui",
|
||||||
|
dataFormat: "list",
|
||||||
|
response: {treeId: "powerId", parentId: "parentId", title: "powerName"},
|
||||||
|
selectInitVal: {{ power.parent_id }}
|
||||||
|
});
|
||||||
|
|
||||||
|
form.on("radio(powerType)", function (data) {
|
||||||
|
if (this.value == '0') {
|
||||||
|
$("#powerUrlItem").hide();
|
||||||
|
$("#powerCodeItem").hide();
|
||||||
|
$("#openTypeItem").hide();
|
||||||
|
$("#powerUrl").val("");
|
||||||
|
$("#powerCode").val("");
|
||||||
|
$("#openType").val("");
|
||||||
|
} else if (this.value == '1') {
|
||||||
|
$("#powerUrlItem").show();
|
||||||
|
$("#powerCodeItem").show();
|
||||||
|
$("#openTypeItem").show();
|
||||||
|
} else if (this.value == '2') {
|
||||||
|
$("#powerUrlItem").hide();
|
||||||
|
$("#openTypeItem").hide();
|
||||||
|
$("#powerCodeItem").show();
|
||||||
|
$("#powerUrl").val("");
|
||||||
|
$("#openType").val("");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
form.on('submit(power-save)', function (data) {
|
||||||
|
data.field.icon = "layui-icon " + data.field.icon;
|
||||||
|
$.ajax({
|
||||||
|
url: '/system/power/update',
|
||||||
|
data: JSON.stringify(data.field),
|
||||||
|
dataType: 'json',
|
||||||
|
contentType: 'application/json',
|
||||||
|
type: 'put',
|
||||||
|
success: function (result) {
|
||||||
|
if (result.success) {
|
||||||
|
layer.msg(result.msg, {icon: 1, time: 1000}, function () {
|
||||||
|
parent.layer.close(parent.layer.getFrameIndex(window.name));//关闭当前页
|
||||||
|
parent.render();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
layer.msg(result.msg, {icon: 2, time: 1000});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
iconPicker.render({
|
||||||
|
elem: '#icon',
|
||||||
|
type: 'fontClass',
|
||||||
|
search: true,
|
||||||
|
page: true,
|
||||||
|
limit: 12,
|
||||||
|
click: function (data) {
|
||||||
|
console.log(data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
iconPicker.checkIcon("icon", [[${sysPower.icon}]]);
|
||||||
|
|
||||||
|
window.init = function (type) {
|
||||||
|
if (type == '0') {
|
||||||
|
$("#powerUrlItem").hide();
|
||||||
|
$("#powerCodeItem").hide();
|
||||||
|
$("#openTypeItem").hide();
|
||||||
|
$("#powerUrl").val("");
|
||||||
|
$("#powerCode").val("");
|
||||||
|
$("#openType").val("");
|
||||||
|
} else if (type == '1') {
|
||||||
|
$("#powerUrlItem").show();
|
||||||
|
$("#powerCodeItem").show();
|
||||||
|
$("#openTypeItem").show();
|
||||||
|
} else if (type == '2') {
|
||||||
|
$("#powerUrlItem").hide();
|
||||||
|
$("#openTypeItem").hide();
|
||||||
|
$("#powerCodeItem").show();
|
||||||
|
$("#powerUrl").val("");
|
||||||
|
$("#openType").val("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.init([[${sysPower.powerType}]]);
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -206,7 +206,7 @@
|
|||||||
title: '修改',
|
title: '修改',
|
||||||
shade: 0.1,
|
shade: 0.1,
|
||||||
area: ['450px', '500px'],
|
area: ['450px', '500px'],
|
||||||
content: MODULE_PATH + 'edit?powerId=' + obj.data['powerId']
|
content: MODULE_PATH + 'edit/' + obj.data['powerId']
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<title>用户新增</title>
|
<title>角色新增</title>
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='/admin/component/pear/css/pear.css') }}"
|
<link rel="stylesheet" href="{{ url_for('static', filename='/admin/component/pear/css/pear.css') }}"
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -0,0 +1,105 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>角色编辑</title>
|
||||||
|
<link rel="stylesheet" href="{{ url_for('static', filename='/admin/component/pear/css/pear.css') }}"
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<form class="layui-form" action="">
|
||||||
|
<div class="mainBox">
|
||||||
|
<div class="main-container">
|
||||||
|
<div class="main-container">
|
||||||
|
<div class="layui-form-item layui-hide">
|
||||||
|
<label class="layui-form-label">编号</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="text" value="{{role.id}}" name="roleId" lay-verify="title"
|
||||||
|
autocomplete="off" placeholder="请输入标题" class="layui-input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">名称</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="text" value="{{ role.name }}" name="roleName" lay-verify="title"
|
||||||
|
autocomplete="off" placeholder="请输入标题" class="layui-input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">标识</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="text" value="{{ role.code }}" readonly name="roleCode" lay-verify="title"
|
||||||
|
autocomplete="off" placeholder="请输入标题" class="layui-input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">状态</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="radio" name="enable" {% if role.enable == 0 %}checked {% endif %}value="0" title="开启">
|
||||||
|
<input type="radio" name="enable" {% if role.enable == 1 %}checked {% endif %} value="1" title="关闭">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">排序</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="text" name="sort" value="{{ role.sort }}" lay-verify="title" autocomplete="off" placeholder="请输入标题"
|
||||||
|
class="layui-input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item layui-form-text">
|
||||||
|
<label class="layui-form-label">描述</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<textarea placeholder="请输入内容" name="details"
|
||||||
|
class="layui-textarea">{{role.details}}</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bottom">
|
||||||
|
<div class="button-container">
|
||||||
|
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||||
|
lay-filter="role-update">
|
||||||
|
<i class="layui-icon layui-icon-ok"></i>
|
||||||
|
提交
|
||||||
|
</button>
|
||||||
|
<button type="reset" class="pear-btn pear-btn-sm">
|
||||||
|
<i class="layui-icon layui-icon-refresh"></i>
|
||||||
|
重置
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<script src="{{ url_for('static', filename='/admin/component/layui/layui.js') }}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='/admin/component/pear/pear.js') }}"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
layui.use(['form', 'jquery'], function () {
|
||||||
|
let form = layui.form;
|
||||||
|
let $ = layui.jquery;
|
||||||
|
|
||||||
|
form.on('submit(role-update)', function (data) {
|
||||||
|
$.ajax({
|
||||||
|
url: '/admin/role/update',
|
||||||
|
data: JSON.stringify(data.field),
|
||||||
|
dataType: 'json',
|
||||||
|
contentType: 'application/json',
|
||||||
|
type: 'put',
|
||||||
|
success: function (result) {
|
||||||
|
if (result.success) {
|
||||||
|
layer.msg(result.msg, {icon: 1, time: 1000}, function () {
|
||||||
|
parent.layer.close(parent.layer.getFrameIndex(window.name));//关闭当前页
|
||||||
|
parent.layui.table.reload("role-table");
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
layer.msg(result.msg, {icon: 2, time: 1000});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -175,7 +175,7 @@
|
|||||||
title: '修改',
|
title: '修改',
|
||||||
shade: 0.1,
|
shade: 0.1,
|
||||||
area: ['500px', '500px'],
|
area: ['500px', '500px'],
|
||||||
content: MODULE_PATH + 'edit?roleId=' + obj.data['roleId']
|
content: MODULE_PATH + 'edit/' + obj.data['id']
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user