使用flask-restful实现数据校验与序列化3

This commit is contained in:
zhengxinonly
2021-06-27 19:27:08 +08:00
parent e9bd8a17a0
commit e3dd5458ad
23 changed files with 517 additions and 1202 deletions
+1 -2
View File
@@ -1,5 +1,4 @@
from applications.models.company import Dept, DeptSchema, User, UserSchema from applications.models.company import Dept, DeptSchema, User
from .dict_models import DictType, DictData, DictTypeSchema, DictDataSchema
from .log import AdminLog, LogSchema from .log import AdminLog, LogSchema
from applications.models.file.photo import Photo, PhotoSchema from applications.models.file.photo import Photo, PhotoSchema
from applications.models.rights.power import Power, PowerSchema from applications.models.rights.power import Power, PowerSchema
+1 -1
View File
@@ -1,2 +1,2 @@
from .dept import Dept, DeptSchema from .dept import Dept, DeptSchema
from .users import User, UserSchema from .users import User
-17
View File
@@ -27,20 +27,3 @@ class User(db.Model, UserMixin):
def validate_password(self, password): def validate_password(self, password):
return check_password_hash(self.password_hash, password) return check_password_hash(self.password_hash, password)
# 用户models的序列化类
class UserSchema(ma.Schema):
id = fields.Integer()
username = fields.Str()
realname = fields.Str()
enable = fields.Integer()
create_at = fields.DateTime()
update_at = fields.DateTime()
dept = fields.Method("get_dept")
def get_dept(self, obj):
from applications.models import Dept
if obj.dept_id != None:
return Dept.query.filter_by(id=obj.dept_id).first().dept_name
else:
return None
-47
View File
@@ -1,47 +0,0 @@
import datetime
from applications.extensions import db, ma
from marshmallow import fields
class DictType(db.Model):
__tablename__ = 'admin_dict_type'
id = db.Column(db.Integer, primary_key=True)
type_name = db.Column(db.String(255), comment='字典类型名称')
type_code = db.Column(db.String(255), comment='字典类型标识')
description = db.Column(db.String(255), comment='字典类型描述')
enable = db.Column(db.Integer, comment='是否开启')
create_time = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
update_time = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='更新时间')
class DictData(db.Model):
__tablename__ = 'admin_dict_data'
id = db.Column(db.Integer, primary_key=True)
data_label = db.Column(db.String(255), comment='字典类型名称')
data_value = db.Column(db.String(255), comment='字典类型标识')
type_code = db.Column(db.String(255), comment='字典类型描述')
is_default = db.Column(db.Integer, comment='是否默认')
enable = db.Column(db.Integer, comment='是否开启')
remark = db.Column(db.String(255), comment='备注')
create_time = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
update_time = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='更新时间')
class DictTypeSchema(ma.Schema): # 序列化类
id = fields.Str(attribute="id")
typeName = fields.Str(attribute="type_name")
typeCode = fields.Str(attribute="type_code")
description = fields.Str(attribute="description")
createTime = fields.Str(attribute="create_time")
updateName = fields.Str(attribute="update_time")
remark = fields.Str()
enable = fields.Str()
class DictDataSchema(ma.Schema): # 序列化类
dataId = fields.Str(attribute="id")
dataLabel = fields.Str(attribute="data_label")
dataValue = fields.Str(attribute="data_value")
remark = fields.Str()
enable = fields.Str()
-408
View File
@@ -1,408 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>首页</title>
{% include 'admin/common/header.html' %}
<link rel="stylesheet" href="{{ url_for('static', filename='/admin/admin/css/other/console2.css') }}"/>
</head>
<body class="pear-container">
<div class="layui-row layui-col-space10">
<div class="layui-col-md8">
<div class="layui-row layui-col-space10">
<div class="layui-col-md6">
<div class="layui-card">
<div class="layui-card-header">
主机信息
</div>
<div class="layui-card-body">
<div class="layui-row layui-col-space10">
<div class="layui-col-md6 layui-col-sm6 layui-col-xs6">
<div class="pear-card2">
<div class="title">核心数</div>
<div class="count pear-text">{{ cpu_count }}</div>
</div>
</div>
<div class="layui-col-md6 layui-col-sm6 layui-col-xs6">
<div class="pear-card2">
<div class="title">空闲率</div>
<div class="count pear-text"></div>
</div>
</div>
<div class="layui-col-md6 layui-col-sm6 layui-col-xs6">
<div class="pear-card2">
<div class="title">等待率</div>
<div class="count pear-text"></div>
</div>
</div>
<div class="layui-col-md6 layui-col-sm6 layui-col-xs6">
<div class="pear-card2">
<div class="title">使用率</div>
<div class="count pear-text">{{ cpus_percent }}%</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="layui-col-md6">
<div class="layui-card">
<div class="layui-card-header">
内存监控
</div>
<div class="layui-card-body">
<div class="layui-row layui-col-space10">
<div class="layui-col-md6 layui-col-sm6 layui-col-xs6">
<div class="pear-card2">
<div class="title">空闲内存</div>
<div class="count pear-text">{{ memory_free }}M</div>
</div>
</div>
<div class="layui-col-md6 layui-col-sm6 layui-col-xs6">
<div class="pear-card2">
<div class="title">最大内存</div>
<div class="count pear-text">{{ memory_total }}M</div>
</div>
</div>
<div class="layui-col-md6 layui-col-sm6 layui-col-xs6">
<div class="pear-card2">
<div class="title">已用内存</div>
<div class="count pear-text">{{ memory_used }}M</div>
</div>
</div>
<div class="layui-col-md6 layui-col-sm6 layui-col-xs6">
<div class="pear-card2">
<div class="title">内存使用</div>
<div class="count pear-text">{{ memory_usage }}%</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-header">主机监控</div>
<div class="layui-card-body">
<div class="layui-tab custom-tab layui-tab-brief" lay-filter="docDemoTabBrief">
<div id="echarts-records" style="background-color:#ffffff;min-height:400px;"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="layui-col-md4">
<div class="layui-card">
<div class="layui-card-header">磁盘信息</div>
<div class="layui-card-body">
<ul class="pear-card-status">
{% for i in disk_partitions_list %}
<li>
<p>{{ i.device }}</p>
<p>{{ i.fstype }}</p>
磁盘大小&nbsp;<span>{{ i.total }}M</span>&nbsp;&nbsp;
空闲大小&nbsp;<span>{{ i.free }}M</span>&nbsp;&nbsp;
<br/>
<br/>
已经使用&nbsp;<span>{{ i.used }}M</span>&nbsp;&nbsp;
使用概率&nbsp;<span>{{ i.percent }}%</span>
<br/>
<a href="javascript:;" data-id="1" class="pear-btn pear-btn-xs pear-btn-primary pear-reply">详情</a>
</li>
{% endfor %}
</ul>
</div>
</div>
<div class="layui-card">
<div class="layui-card-header">主机信息</div>
<div class="layui-card-body">
<table class="layui-table" lay-skin="line">
<thead>
<tr>
<th>属性</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>名称</td>
<td>{{ hostname }}</td>
</tr>
<tr>
<td>系统</td>
<td>{{ system_version }}</td>
</tr>
<tr>
<td>开机时间</td>
<td>{{ boot_time }}</td>
</tr>
<tr>
<td>运行时长</td>
<td>{{ up_time_format }}</td>
</tr>
<tr>
<td>python版本</td>
<td>{{ python_version }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
{% include 'admin/common/footer.html' %}
<script>
layui.use(['layer', 'echarts', 'popup'], function () {
var $ = layui.jquery,
echarts = layui.echarts;
let popup = layui.popup;
var echartsRecords = echarts.init(document.getElementById('echarts-records'), 'walden');
$("body").on("click", "[data-url]", function () {
parent.layui.tab.addTabOnlyByElem("content", {
id: $(this).attr("data-id"),
title: $(this).attr("data-title"),
url: $(this).attr("data-url"),
close: true
})
})
let bgColor = "#fff";
let color = [
"#0090FF",
"#36CE9E",
"#FFC005",
"#FF515A",
"#8B5CFF",
"#00CA69"
];
let echartData = [
{
name: "{{time_now}}",
cpu_percent: {{ cpus_percent }},
memory_percent: {{ memory_usage }}
},
];
var xAxisData = echartData.map(v => v.name);
// ["1", "2", "3", "4", "5", "6", "7", "8"]
var yAxisData1 = echartData.map(v => v.cpu_percent);
// [100, 138, 350, 173, 180, 150, 180, 230]
var yAxisData2 = echartData.map(v => v.memory_percent);
// [233, 233, 200, 180, 199, 233, 210, 180]
const hexToRgba = (hex, opacity) => {
let rgbaColor = "";
let reg = /^#[\da-f]{6}$/i;
if (reg.test(hex)) {
rgbaColor =
`rgba(${parseInt("0x" + hex.slice(1, 3))},${parseInt(
"0x" + hex.slice(3, 5)
)},${parseInt("0x" + hex.slice(5, 7))},${opacity})`;
}
return rgbaColor;
}
option = {
backgroundColor: bgColor,
color: color,
legend: {
right: 10,
top: 10
},
tooltip: {
trigger: "axis",
formatter: function (params) {
let html = '';
params.forEach(v => {
html +=
`<div style="color: #666;font-size: 14px;line-height: 24px">
<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${color[v.componentIndex]};"></span>
${v.seriesName}.${v.name}
<span style="color:${color[v.componentIndex]};font-weight:700;font-size: 18px">${v.value}</span>
%`;
})
return html
},
extraCssText: 'background: #fff; border-radius: 0;box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);color: #333;',
axisPointer: {
type: 'shadow',
shadowStyle: {
color: '#ffffff',
shadowColor: 'rgba(225,225,225,1)',
shadowBlur: 5
}
}
},
grid: {
top: 100,
containLabel: true
},
xAxis: [{
type: "category",
boundaryGap: false,
axisLabel: {
formatter: '{value}',
textStyle: {
color: "#333"
}
},
axisLine: {
lineStyle: {
color: "#D9D9D9"
}
},
data: xAxisData
}],
yAxis: [{
type: "value",
name: '单位:百分比',
axisLabel: {
textStyle: {
color: "#666"
}
},
nameTextStyle: {
color: "#666",
fontSize: 12,
lineHeight: 40
},
splitLine: {
lineStyle: {
type: "dashed",
color: "#E9E9E9"
}
},
axisLine: {
show: false
},
axisTick: {
show: false
}
}],
series: [{
name: "CPU",
type: "line",
smooth: true,
symbolSize: 8,
zlevel: 3,
lineStyle: {
normal: {
color: color[0],
shadowBlur: 3,
shadowColor: hexToRgba(color[0], 0.5),
shadowOffsetY: 8
}
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[{
offset: 0,
color: hexToRgba(color[0], 0.3)
},
{
offset: 1,
color: hexToRgba(color[0], 0.1)
}
],
false
),
shadowColor: hexToRgba(color[0], 0.1),
shadowBlur: 10
}
},
data: yAxisData1
}, {
name: '内存',
type: "line",
smooth: true,
symbolSize: 8,
zlevel: 3,
lineStyle: {
normal: {
color: color[1],
shadowBlur: 3,
shadowColor: hexToRgba(color[1], 0.5),
shadowOffsetY: 8
}
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[{
offset: 0,
color: hexToRgba(color[1], 0.3)
},
{
offset: 1,
color: hexToRgba(color[1], 0.1)
}
],
false
),
shadowColor: hexToRgba(color[1], 0.1),
shadowBlur: 10
}
},
data: yAxisData2
}]
};
echartsRecords.setOption(option);
window.onresize = function () {
echartsRecords.resize();
};
setInterval(ajaxPolling, 1000 * 10);
function ajaxPolling() {
$.ajax({
url: "/admin/monitor/polling",
success: function (data) {
echartData.push({
name: data.time_now,
cpu_percent: data.cups_percent,
memory_percent: data.memory_used
});
if (echartData.length > 8) {
echartData.shift();
}
xAxisData = echartData.map(v => v.name);
yAxisData1 = echartData.map(v => v.cpu_percent);
yAxisData2 = echartData.map(v => v.memory_percent);
option.xAxis[0].data = xAxisData;
option.series[0].data = yAxisData1;
option.series[1].data = yAxisData2;
echartsRecords.setOption(option);
},
error: function (xhr, type, errorThrown) {
popup.failure("api错误");
}
})
}
});
</script>
</body>
</html>
+1 -1
View File
@@ -66,7 +66,7 @@
form.on('submit(role-save)', function (data) { form.on('submit(role-save)', function (data) {
$.ajax({ $.ajax({
url: '/admin/role/save', url: '/admin/role/add',
data: JSON.stringify(data.field), data: JSON.stringify(data.field),
dataType: 'json', dataType: 'json',
contentType: 'application/json', contentType: 'application/json',
+4 -3
View File
@@ -32,9 +32,9 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">状态</label> <label class="layui-form-label">状态</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input type="radio" name="enable" {% if role.enable == 0 %}checked {% endif %}value="0" <input type="radio" name="enable" {% if role.enable == 1 %}checked {% endif %}value="0"
title="开启"> title="开启">
<input type="radio" name="enable" {% if role.enable == 1 %}checked {% endif %} value="1" <input type="radio" name="enable" {% if role.enable == 0 %}checked {% endif %} value="1"
title="关闭"> title="关闭">
</div> </div>
</div> </div>
@@ -78,7 +78,7 @@
form.on('submit(role-update)', function (data) { form.on('submit(role-update)', function (data) {
$.ajax({ $.ajax({
url: '/admin/role/update', url: '/admin/role/edit/' + data.field.roleId,
data: JSON.stringify(data.field), data: JSON.stringify(data.field),
dataType: 'json', dataType: 'json',
contentType: 'application/json', contentType: 'application/json',
@@ -96,6 +96,7 @@
}) })
return false return false
}) })
})
}) })
</script> </script>
<script> <script>
+5 -5
View File
@@ -137,14 +137,14 @@
form.on('switch(role-enable)', function (obj) { form.on('switch(role-enable)', function (obj) {
let operate let operate
if (obj.elem.checked) { if (obj.elem.checked) {
operate = 'enable' operate = 1
} else { } else {
operate = 'disable' operate = 0
} }
let loading = layer.load() let loading = layer.load()
$.ajax({ $.ajax({
url: '/admin/role/' + operate, url: '/admin/role/enable',
data: JSON.stringify({ roleId: this.value }), data: JSON.stringify({ roleId: this.value, operate: operate }),
dataType: 'json', dataType: 'json',
contentType: 'application/json', contentType: 'application/json',
type: 'put', type: 'put',
@@ -194,7 +194,7 @@
layer.close(index) layer.close(index)
let loading = layer.load() let loading = layer.load()
$.ajax({ $.ajax({
url: MODULE_PATH + 'remove/' + obj.data['id'], url: MODULE_PATH + 'role_power/' + obj.data['id'],
dataType: 'json', dataType: 'json',
type: 'delete', type: 'delete',
success: function (result) { success: function (result) {
+2 -2
View File
@@ -35,7 +35,7 @@
dtree.render({ dtree.render({
elem: '#role-power', elem: '#role-power',
method: 'get', method: 'get',
url: '/admin/role/getRolePower/' + {{id}}, url: '/admin/role/role_power/' + {{id}},
dataFormat: 'list', dataFormat: 'list',
checkbar: true, checkbar: true,
skin: 'layui', skin: 'layui',
@@ -56,7 +56,7 @@
data.field.powerIds = ids data.field.powerIds = ids
$.ajax({ $.ajax({
url: '/admin/role/saveRolePower', url: '/admin/role/role_power/' + data.field.roleId,
data: data.field, data: data.field,
dataType: 'json', dataType: 'json',
type: 'put', type: 'put',
+1 -1
View File
@@ -73,7 +73,7 @@
data.field.roleIds = roleIds data.field.roleIds = roleIds
$.ajax({ $.ajax({
url: '/admin/user/save', url: '/users/add',
data: JSON.stringify(data.field), data: JSON.stringify(data.field),
dataType: 'json', dataType: 'json',
contentType: 'application/json', contentType: 'application/json',
+1 -1
View File
@@ -258,7 +258,7 @@
layer.close(index) layer.close(index)
let loading = layer.load() let loading = layer.load()
$.ajax({ $.ajax({
url: MODULE_PATH + 'remove/' + obj.data['id'], url: MODULE_PATH + obj.data['id'],
dataType: 'json', dataType: 'json',
type: 'delete', type: 'delete',
success: function (result) { success: function (result) {
-2
View File
@@ -5,13 +5,11 @@ from applications.view.admin.index import admin_bp
from applications.view.admin.file import file_bp from applications.view.admin.file import file_bp
from applications.view.rights.role import role_bp from applications.view.rights.role import role_bp
from applications.view.company.users import users_bp from applications.view.company.users import users_bp
from applications.view.admin.monitor import admin_monitor_bp
def register_admin_views(app: Flask): def register_admin_views(app: Flask):
app.register_blueprint(admin_bp) app.register_blueprint(admin_bp)
app.register_blueprint(users_bp) app.register_blueprint(users_bp)
app.register_blueprint(file_bp) app.register_blueprint(file_bp)
app.register_blueprint(admin_monitor_bp)
app.register_blueprint(admin_log) app.register_blueprint(admin_log)
app.register_blueprint(role_bp) app.register_blueprint(role_bp)
-91
View File
@@ -1,91 +0,0 @@
import os
import platform
import re
from datetime import datetime
import time
import psutil
from flask import Blueprint, render_template, jsonify
from flask_marshmallow import Marshmallow
from applications.common.utils.rights import authorize
ma = Marshmallow()
admin_monitor_bp = Blueprint('adminMonitor', __name__, url_prefix='/admin/monitor')
# 系统监控
@admin_monitor_bp.get('/')
@authorize("admin:monitor:main", log=True)
def main():
# 主机名称
hostname = platform.node()
# 系统版本
system_version = platform.platform()
# python版本
python_version = platform.python_version()
# 逻辑cpu数量
cpu_count = psutil.cpu_count()
# cup使用率
cpus_percent = psutil.cpu_percent(interval=0.1)
# 内存
memory_information = psutil.virtual_memory()
# 内存使用率
memory_usage = memory_information.percent
memory_used = str(round(memory_information.used / 1024 / 1024))
memory_total = str(round(memory_information.total / 1024 / 1024))
memory_free = str(round(memory_information.free / 1024 / 1024))
# 磁盘信息
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)
up_time = datetime.now().replace(microsecond=0) - boot_time
up_time_list = re.split(r':', str(up_time))
up_time_format = " {} 小时{} 分钟{}".format(up_time_list[0], up_time_list[1], up_time_list[2])
# 当前时间
time_now = time.strftime('%H:%M:%S ', time.localtime(time.time()))
return render_template('admin/monitor.html',
hostname=hostname,
system_version=system_version,
python_version=python_version,
cpus_percent=cpus_percent,
memory_usage=memory_usage,
cpu_count=cpu_count,
memory_used=memory_used,
memory_total=memory_total,
memory_free=memory_free,
boot_time=boot_time,
up_time_format=up_time_format,
disk_partitions_list=disk_partitions_list,
time_now=time_now
)
# 图表 api
@admin_monitor_bp.get('/polling')
@authorize("admin:monitor:main")
def ajax_polling():
# 获取cup使用率
cpus_percent = psutil.cpu_percent(interval=0.1)
# 获取内存使用率
memory_information = psutil.virtual_memory()
memory_usage = memory_information.percent
time_now = time.strftime('%H:%M:%S ', time.localtime(time.time()))
return jsonify(cups_percent=cpus_percent, memory_used=memory_usage, time_now=time_now)
+41 -20
View File
@@ -1,9 +1,9 @@
from flask import Blueprint, request, render_template from flask import Blueprint, request, render_template
from flask_restful import Api from flask_restful import Api, reqparse
from applications.common.utils.http import table_api from applications.common.utils.http import table_api
from applications.common.utils.rights import authorize from applications.common.utils.rights import authorize
from applications.models import Role from applications.models import Role, User, Dept
users_bp = Blueprint('users', __name__, url_prefix='/users') users_bp = Blueprint('users', __name__, url_prefix='/users')
user_api = Api(users_bp) user_api = Api(users_bp)
@@ -13,27 +13,48 @@ user_api = Api(users_bp)
@users_bp.get('/data') @users_bp.get('/data')
@authorize("admin:user:main", log=True) @authorize("admin:user:main", log=True)
def data(): def data():
page = request.args.get('page', type=int) parser = reqparse.RequestParser()
limit = request.args.get('limit', type=int) parser.add_argument('page', type=int, default=1)
real_name = request.args.get('realName', type=str) parser.add_argument('limit', type=int, default=10)
username = request.args.get('username', type=str) parser.add_argument('realName', type=str, dest='real_name')
dept_id = request.args.get('deptId', type=int) parser.add_argument('username', type=str)
filters = {} parser.add_argument('deptId', type=int, dest='dept_id', default=0)
if real_name:
filters["realname"] = ('%' + real_name + '%') res = parser.parse_args()
if username:
filters["username"] = ('%' + username + '%') filters = []
user_data, count = user_curd.get_user_data_dict(page=page, limit=limit, filters=filters, deptId=dept_id)
return table_api(data=user_data, count=count) if res.real_name:
filters.append(User.realname.like('%' + res.real_name + '%'))
if res.username:
filters.append(User.username.like('%' + res.username + '%'))
if res.dept_id:
filters.append(User.dept_id == res.dept_id)
paginate = User.query.filter(*filters).paginate(page=res.page,
per_page=res.limit,
error_out=False)
dept_name = lambda dept_id: Dept.query.filter_by(id=dept_id).first().dept_name
user_data = [{
'id': item.id,
'username': item.username,
'realname': item.realname,
'enable': item.enable,
'create_at': item.create_at,
'update_at': item.update_at,
'dept': dept_name(item.dept_id),
} for item in paginate.items]
return table_api(data=user_data, count=paginate.total)
# 用户增加 # 用户增加
@users_bp.get('/add') @users_bp.get('/')
@authorize("admin:user:add", log=True) @authorize("admin:user:main", log=True)
def add(): def get():
roles = Role.query.all() return render_template('admin/user/main.html')
return render_template('admin/user/add.html', roles=roles)
from . import profile, user_curd from . import profile, _utils
from . import user_view from . import user_view
+55
View File
@@ -0,0 +1,55 @@
from flask import jsonify
from flask_login import current_user
from sqlalchemy import and_, desc
from applications.extensions import db
from applications.models import User
from applications.models import Role
from applications.models import AdminLog
def get_current_user_logs():
""" 获取当前用户日志 """
log = AdminLog.query.filter_by(url='/passport/login').filter_by(uid=current_user.id).order_by(
desc(AdminLog.create_time)).limit(10)
return log
def is_user_exists(username):
""" 判断用户是否存在 """
res = User.query.filter_by(username=username).count()
return bool(res)
def delete_by_id(_id):
""" 删除用户 """
user = User.query.filter_by(id=_id).first()
roles_id = []
for role in user.role:
roles_id.append(role.id)
roles = Role.query.filter(Role.id.in_(roles_id)).all()
for r in roles:
user.role.remove(r)
res = User.query.filter_by(id=_id).delete()
db.session.commit()
return res
def batch_remove(ids):
""" 批量删除 """
for _id in ids:
delete_by_id(_id)
def update_user_role(_id, roles_list):
user = User.query.filter_by(id=_id).first()
roles_id = []
for role in user.role:
roles_id.append(role.id)
roles = Role.query.filter(Role.id.in_(roles_id)).all()
for r in roles:
user.role.remove(r)
roles = Role.query.filter(Role.id.in_(roles_list)).all()
for r in roles:
user.role.append(r)
db.session.commit()
+39 -9
View File
@@ -1,18 +1,21 @@
# 个人中心 # 个人中心
from flask import render_template, request, make_response from flask import render_template, request, make_response, jsonify
from flask_login import login_required, current_user from flask_login import login_required, current_user
from flask_restful import Resource from flask_restful import Resource, reqparse
from sqlalchemy import desc
from applications.common.utils.http import fail_api, success_api from applications.common.utils.http import fail_api, success_api
from applications.extensions import db from applications.extensions import db
from applications.models import User from applications.models import User, AdminLog
from applications.view.company.users import users_bp, user_api, user_curd from applications.view.company.users import users_bp, user_api
@users_bp.get('/center') @users_bp.get('/center')
@login_required @login_required
def center(): def center():
user_info = current_user user_info = current_user
user_logs = user_curd.get_current_user_logs() user_logs = AdminLog.query.filter_by(url='/passport/login').filter_by(uid=current_user.id).order_by(
desc(AdminLog.create_time)).limit(10)
return render_template('admin/user/profile.html', user_info=user_info, user_logs=user_logs) return render_template('admin/user/profile.html', user_info=user_info, user_logs=user_logs)
@@ -36,8 +39,18 @@ class Avatar(Resource):
@users_bp.put('/updateInfo') @users_bp.put('/updateInfo')
@login_required @login_required
def update_info(): def update_info():
res_json = request.json
if not user_curd.update_current_user_info(req_json=res_json): parser = reqparse.RequestParser()
parser.add_argument('realname', type=str, dest='real_name')
parser.add_argument('remark', type=str)
parser.add_argument('details', type=str)
res = parser.parse_args()
ret = User.query.filter_by(
id=current_user.id).update({"realname": res.real_name,
"remark": res.details})
if not ret:
return fail_api(msg="出错啦") return fail_api(msg="出错啦")
return success_api(msg="更新成功") return success_api(msg="更新成功")
@@ -52,5 +65,22 @@ class EditPassword(Resource):
@login_required @login_required
def put(self): def put(self):
res_json = request.json parser = reqparse.RequestParser()
return user_curd.edit_password(res_json=res_json) 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='确认密码不能为空')
res = parser.parse_args()
if res.newPassword != res.confirmPassword:
return fail_api(msg='确认密码不一致')
""" 修改当前用户密码 """
is_right = current_user.validate_password(res.oldPassword)
if not is_right:
return jsonify(success=False, msg="旧密码错误")
current_user.set_password(res.newPassword)
db.session.add(current_user)
db.session.commit()
return jsonify(success=True, msg="更改成功")
@@ -1,161 +0,0 @@
from flask import jsonify
from flask_login import current_user
from sqlalchemy import and_, desc
from applications.extensions import db
from applications.models import User, UserSchema
from applications.models import Role
from applications.models import AdminLog
# 获取用户的 sqlalchemy 对象分页器
from applications.common.curd import model_to_dicts
def get_user_data(page, limit, filters, deptId):
if deptId:
user = User.query.filter_by(dept_id=deptId).filter(
and_(*[getattr(User, k).like(v) for k, v in filters.items()])).paginate(page=page,
per_page=limit,
error_out=False)
else:
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
def get_user_data_dict(page, limit, filters, deptId):
""" 获取用户的dict数据分页器 """
user, count = get_user_data(page, limit, filters, deptId)
data = model_to_dicts(Schema=UserSchema, model=user.items)
return data, count
def get_user_by_name(username):
""" 通过名称获取用户 """
return User.query.filter_by(username=username).first()
def get_current_user_logs():
""" 获取当前用户日志 """
log = AdminLog.query.filter_by(url='/admin/login').filter_by(uid=current_user.id).order_by(
desc(AdminLog.create_time)).limit(10)
return log
def is_user_exists(username):
""" 判断用户是否存在 """
res = User.query.filter_by(username=username).count()
return bool(res)
def add_user(username, real_name, password):
""" 增加用户 """
user = User()
user.username = username
user.realname = real_name
user.set_password(password)
db.session.add(user)
db.session.commit()
return user.id
def add_user_role(_id, roles_list):
""" 增加用户角色 """
user = User.query.filter_by(id=_id).first()
roles = Role.query.filter(Role.id.in_(roles_list)).all()
for r in roles:
user.role.append(r)
db.session.commit()
def update_avatar(url):
""" 更新用户头像 """
r = User.query.filter_by(id=current_user.id).update({"avatar": url})
db.session.commit()
return r
def update_user(_id, username, realname, deptId):
""" 更新用户信息 """
user = User.query.filter_by(id=_id).update({'username': username, 'realname': realname, 'dept_id': deptId})
db.session.commit()
return user
def update_current_user_info(req_json):
""" 更新当前用户信息 """
r = User.query.filter_by(id=current_user.id).update(
{"realname": req_json.get("realName"), "remark": req_json.get("details")})
db.session.commit()
return r
def edit_password(res_json):
""" 修改当前用户密码 """
if res_json.get("newPassword") == '':
return jsonify(success=False, msg="新密码不得为空")
if res_json.get("newPassword") != res_json.get("confirmPassword"):
return jsonify(success=False, msg="俩次密码不一样")
user = current_user
is_right = user.validate_password(res_json.get("oldPassword"))
if not is_right:
return jsonify(success=False, msg="旧密码错误")
user.set_password(res_json.get("newPassword"))
db.session.add(user)
db.session.commit()
return jsonify(success=True, msg="更改成功")
def delete_by_id(_id):
""" 删除用户 """
user = User.query.filter_by(id=_id).first()
roles_id = []
for role in user.role:
roles_id.append(role.id)
roles = Role.query.filter(Role.id.in_(roles_id)).all()
for r in roles:
user.role.remove(r)
res = User.query.filter_by(id=_id).delete()
db.session.commit()
return res
def enable_status(_id):
""" 启用用户 """
enable = 1
user = User.query.filter_by(id=_id).update({"enable": enable})
if user:
db.session.commit()
return True
return False
def disable_status(_id):
""" 停用用户 """
enable = 0
user = User.query.filter_by(id=_id).update({"enable": enable})
if user:
db.session.commit()
return True
return False
def batch_remove(ids):
""" 批量删除 """
for _id in ids:
delete_by_id(_id)
def update_user_role(_id, roles_list):
user = User.query.filter_by(id=_id).first()
roles_id = []
for role in user.role:
roles_id.append(role.id)
roles = Role.query.filter(Role.id.in_(roles_id)).all()
for r in roles:
user.role.remove(r)
roles = Role.query.filter(Role.id.in_(roles_list)).all()
for r in roles:
user.role.append(r)
db.session.commit()
+66 -44
View File
@@ -1,39 +1,51 @@
from flask import render_template, request, make_response from flask import render_template, request, make_response
from flask_restful import Resource from flask_restful import Resource, reqparse
from applications.extensions import db from applications.extensions import db
from applications.common.utils.http import fail_api, success_api from applications.common.utils.http import fail_api, success_api
from applications.common.utils.rights import authorize from applications.common.utils.rights import authorize
from applications.models import User, Role from applications.models import User, Role
from applications.view.company.users import user_api, users_bp, user_curd from applications.view.company.users import user_api, users_bp, _utils
@user_api.resource('/') @user_api.resource('/add')
class Users(Resource): class Users(Resource):
"""用户列表数据操作""" """用户列表数据操作"""
@authorize("admin:user:main", log=True) @authorize("admin:user:add", log=True)
def get(self): def get(self):
return make_response(render_template('admin/user/main.html')) roles = Role.query.all()
return make_response(render_template('admin/user/add.html', roles=roles))
@authorize("admin:user:add", log=True) @authorize("admin:user:add", log=True)
def post(self): def post(self):
"""新建单个用户""" """新建单个用户"""
req_json = request.json parser = reqparse.RequestParser()
a = req_json.get("roleIds") parser.add_argument("roleIds", type=str, dest='role_ids')
username = req_json.get('username') parser.add_argument("username", type=str, required=True, help="用户名不能为空")
real_name = req_json.get('realName') parser.add_argument("realName", type=str, required=True, help="真实姓名不能为空", dest='real_name')
password = req_json.get('password') parser.add_argument("password", type=str, required=True, help="密码不得为空")
role_ids = a.split(',')
if not username or not real_name or not password: res = parser.parse_args()
return fail_api(msg="账号姓名密码不得为空")
if user_curd.is_user_exists(username): role_ids = res.role_ids.split(',')
if _utils.is_user_exists(res.username):
return fail_api(msg="用户已经存在") return fail_api(msg="用户已经存在")
_id = user_curd.add_user(username, real_name, password) user = User()
user_curd.add_user_role(_id, role_ids) user.username = res.username
user.realname = res.real_name
user.set_password(res.password)
db.session.add(user)
db.session.commit()
""" 增加用户角色 """
user = User.query.filter_by(id=user.id).first()
roles = Role.query.filter(Role.id.in_(role_ids)).all()
for r in roles:
user.role.append(r)
db.session.commit()
return success_api(msg="增加成功") return success_api(msg="增加成功")
@@ -56,23 +68,32 @@ class CURDUser(Resource):
@authorize("admin:user:remove", log=True) @authorize("admin:user:remove", log=True)
def delete(self, user_id): def delete(self, user_id):
# 删除用户 # 删除用户
res = user_curd.delete_by_id(user_id) res = _utils.delete_by_id(user_id)
if not res: if not res:
return fail_api(msg="删除失败") return fail_api(msg="删除失败")
return success_api(msg="删除成功") return success_api(msg="删除成功")
@authorize("admin:user:edit", log=True) @authorize("admin:user:edit", log=True)
def put(self, user_id): def put(self, user_id):
parser = reqparse.RequestParser()
parser.add_argument('roleIds', type=str, dest='role_ids')
parser.add_argument('userId', type=str, dest='user_id')
parser.add_argument('username', type=str)
parser.add_argument('realName', type=str, dest='real_name')
parser.add_argument('deptId', type=str, dest='dept_id')
res = parser.parse_args()
role_ids = res.role_ids.split(',')
# 更新用户数据 # 更新用户数据
req_json = request.json User.query.filter_by(id=user_id).update({'username': res.username,
a = req_json.get("roleIds") 'realname': res.real_name,
_id = req_json.get("userId") 'dept_id': res.dept_id})
username = req_json.get('username') db.session.commit()
real_name = req_json.get('realName')
dept_id = req_json.get('deptId') _utils.update_user_role(user_id, role_ids)
role_ids = a.split(',')
user_curd.update_user(user_id, username, real_name, dept_id)
user_curd.update_user_role(_id, role_ids)
return success_api(msg="更新成功") return success_api(msg="更新成功")
@@ -81,27 +102,28 @@ class CURDUser(Resource):
@authorize("admin:user:remove", log=True) @authorize("admin:user:remove", log=True)
def batch_remove(): def batch_remove():
ids = request.form.getlist('ids[]') ids = request.form.getlist('ids[]')
user_curd.batch_remove(ids) _utils.batch_remove(ids)
return success_api(msg="批量删除成功") return success_api(msg="批量删除成功")
@users_bp.put('/enable') @users_bp.put('/enable')
def user_enable(): def user_enable():
# 启用或者禁用用户 enable disable # 启用或者禁用用户 enable disable
user_id = request.json.get('userId')
operate = request.json.get('operate') parser = reqparse.RequestParser()
user_id = int(user_id) parser.add_argument('userId', type=int, required=True, dest='user_id')
operate = int(operate) parser.add_argument('operate', type=int, required=True, dest='operate', choices=[0, 1])
if user_id:
if operate == 1: res = parser.parse_args()
user = User.query.filter_by(id=user_id).update({"enable": operate})
message = success_api(msg="启动成功") if res.operate == 1:
else: user = User.query.filter_by(id=res.user_id).update({"enable": res.operate})
user = User.query.filter_by(id=user_id).update({"enable": operate}) message = success_api(msg="启动成功")
message = success_api(msg="禁用成功") else:
if user: user = User.query.filter_by(id=res.user_id).update({"enable": res.operate})
db.session.commit() message = success_api(msg="禁用成功")
else: if user:
return fail_api(msg="出错啦") db.session.commit()
return message else:
return fail_api(msg="数据错误") return fail_api(msg="出错啦")
return message
+66 -1
View File
@@ -3,8 +3,11 @@ from collections import OrderedDict
from flask import current_app from flask import current_app
from flask_login import current_user from flask_login import current_user
from flask_restful import marshal
from applications.models import PowerSchema from applications.common.serialization import power_fields
from applications.extensions import db
from applications.models import PowerSchema, Power, Role, User
def get_render_config(): def get_render_config():
@@ -115,3 +118,65 @@ def make_menu_tree():
return menu_dict.get(0) return menu_dict.get(0)
# 选择父节点
def select_power_dict():
power = Power.query.all()
res = marshal(power, power_fields)
res.append({"powerId": 0, "powerName": "顶级权限", "parentId": -1})
return res
def get_power_dict():
power = Power.query.all()
res = marshal(power, power_fields)
return res
# 删除权限(目前没有判断父节点自动删除子节点)
def remove_power(power_id):
power = Power.query.filter_by(id=power_id).first()
role_id_list = []
roles = power.role
for role in roles:
role_id_list.append(role.id)
roles = Role.query.filter(Role.id.in_(role_id_list)).all()
for p in roles:
power.role.remove(p)
r = Power.query.filter_by(id=power_id).delete()
db.session.commit()
return r
# 批量删除权限
def batch_remove_power(ids):
for _id in ids:
remove_power(_id)
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_role(ids):
""" 批量删除 """
for _id in ids:
remove_role(_id)
+102 -71
View File
@@ -1,11 +1,22 @@
from flask import render_template, request, jsonify, make_response from flask import render_template, request, jsonify, make_response
from flask_restful import Resource, reqparse from flask_restful import Resource, reqparse
from . import rights_bp, rights_api, right_curd from . import rights_bp, rights_api
from ._utils import select_power_dict, get_power_dict, batch_remove_power
from ...common.utils.http import success_api, fail_api from ...common.utils.http import success_api, fail_api
from ...common.utils.rights import authorize from ...common.utils.rights import authorize
from ...extensions import db from ...extensions import db
from ...models import Power from ...models import Power, Role
parser_power = reqparse.RequestParser(bundle_errors=True)
parser_power.add_argument('icon', type=str)
parser_power.add_argument('openType', type=str, dest='open_type')
parser_power.add_argument('parentId', type=str, dest='parent_id')
parser_power.add_argument('powerCode', type=str, dest='power_code')
parser_power.add_argument('powerName', type=str, dest='power_name')
parser_power.add_argument('powerType', type=str, dest='power_type')
parser_power.add_argument('powerUrl', type=str, dest='power_url')
parser_power.add_argument('sort', type=int, dest='sort')
@rights_bp.get('/') @rights_bp.get('/')
@@ -17,32 +28,19 @@ def index():
@rights_bp.get('/data') @rights_bp.get('/data')
@authorize("admin:power:main", log=True) @authorize("admin:power:main", log=True)
def data(): def data():
power_data = right_curd.get_power_dict() power_data = get_power_dict()
res = { res = {
"data": power_data "data": power_data
} }
return jsonify(res) return jsonify(res)
@rights_api.resource('/power')
class AddRight(Resource):
@authorize("admin:power:add", log=True)
def get(self):
"""获取增加视图"""
return make_response(render_template('admin/rights/add.html'))
@authorize("admin:power:add", log=True)
def post(self):
req = request.json
right_curd.save_power(req)
return success_api(msg="成功")
@rights_bp.get('/selectParent') @rights_bp.get('/selectParent')
@authorize("admin:power:main", log=True) @authorize("admin:power:main", log=True)
def select_parent(): def select_parent():
"""获取选择父节点""" """获取选择父节点"""
power_data = right_curd.select_parent() power_data = select_power_dict()
res = { res = {
"status": {"code": 200, "message": "默认"}, "status": {"code": 200, "message": "默认"},
"data": power_data "data": power_data
@@ -51,57 +49,6 @@ def select_parent():
return jsonify(res) return jsonify(res)
@rights_api.resource('/power/<int:power_id>')
class RightsURD(Resource):
@authorize("admin:power:edit", log=True)
def get(self, power_id):
power = right_curd.get_power_by_id(power_id)
icon = str(power.icon).split()
if len(icon) == 2:
icon = icon[1]
else:
icon = None
return make_response(render_template('admin/rights/edit.html', power=power, icon=icon))
@authorize("admin:power:remove", log=True)
def delete(self, power_id):
r = right_curd.remove_power(power_id)
if r:
return success_api(msg="删除成功")
else:
return fail_api(msg="删除失败")
@authorize("admin:power:edit", log=True)
def put(self, power_id):
parser = reqparse.RequestParser(bundle_errors=True)
parser.add_argument('icon', type=str)
parser.add_argument('openType', type=str, dest='open_type')
parser.add_argument('parentId', type=str, dest='parent_id')
parser.add_argument('powerCode', type=str, dest='power_code')
parser.add_argument('powerName', type=str, dest='power_name')
parser.add_argument('powerType', type=str, dest='power_type')
parser.add_argument('powerUrl', type=str, dest='power_url')
parser.add_argument('sort', type=int, dest='sort')
res = parser.parse_args()
data = {
"icon": res.icon,
"open_type": res.open_type,
"parent_id": res.parent_id,
"code": res.power_code,
"name": res.power_name,
"type": res.power_type,
"url": res.power_url,
"sort": res.sort
}
power = Power.query.filter_by(id=power_id).update(data)
db.session.commit()
if not power:
return fail_api(msg="更新权限失败")
return success_api(msg="更新权限成功")
# 启用权限 # 启用权限
@rights_bp.put('/enable') @rights_bp.put('/enable')
@authorize("admin:power:edit", log=True) @authorize("admin:power:edit", log=True)
@@ -124,7 +71,91 @@ def enable():
# 批量删除 # 批量删除
@rights_bp.delete('/batchRemove') @rights_bp.delete('/batchRemove')
@authorize("admin:power:remove", log=True) @authorize("admin:power:remove", log=True)
def batch_remove(): def batch_remove_view():
ids = request.form.getlist('ids[]') ids = request.form.getlist('ids[]')
right_curd.batch_remove(ids) batch_remove_power(ids)
return success_api(msg="批量删除成功") return success_api(msg="批量删除成功")
@rights_api.resource('/power')
class AddRight(Resource):
@authorize("admin:power:add", log=True)
def get(self):
"""获取增加视图"""
return make_response(render_template('admin/rights/add.html'))
@authorize("admin:power:add", log=True)
def post(self):
res = parser_power.parse_args()
power = Power(
icon=res.icon,
open_type=res.open_type,
parent_id=res.parent_id,
code=res.power_code,
name=res.power_name,
type=res.power_type,
url=res.power_url,
sort=res.sort,
enable=1
)
try:
db.session.add(power)
db.session.commit()
except Exception as e:
print(e)
return fail_api(msg='数据提交失败')
return success_api(msg="成功")
@rights_api.resource('/power/<int:power_id>')
class RightsURD(Resource):
@authorize("admin:power:edit", log=True)
def get(self, power_id):
power = Power.query.filter_by(id=power_id).first()
icon = str(power.icon).split()
if len(icon) == 2:
icon = icon[1]
else:
icon = None
return make_response(render_template('admin/rights/edit.html', power=power, icon=icon))
@authorize("admin:power:remove", log=True)
def delete(self, power_id):
# 删除权限(目前没有判断父节点自动删除子节点)
power = Power.query.filter_by(id=power_id).first()
role_id_list = []
roles = power.role
for role in roles:
role_id_list.append(role.id)
roles = Role.query.filter(Role.id.in_(role_id_list)).all()
for p in roles:
power.role.remove(p)
r = Power.query.filter_by(id=power_id).delete()
db.session.commit()
if r:
return success_api(msg="删除成功")
else:
return fail_api(msg="删除失败")
@authorize("admin:power:edit", log=True)
def put(self, power_id):
res = parser_power.parse_args()
data = {
"icon": res.icon,
"open_type": res.open_type,
"parent_id": res.parent_id,
"code": res.power_code,
"name": res.power_name,
"type": res.power_type,
"url": res.power_url,
"sort": res.sort
}
power = Power.query.filter_by(id=power_id).update(data)
db.session.commit()
if not power:
return fail_api(msg="更新权限失败")
return success_api(msg="更新权限成功")
-113
View File
@@ -1,113 +0,0 @@
from applications.extensions import db
from applications.models.rights.power import Power
from applications.models import Role
from flask_restful import marshal
from applications.common.serialization import power_fields
def get_power_dict():
power = Power.query.all()
res = marshal(power, power_fields)
return res
# 选择父节点
def select_parent():
power = Power.query.all()
res = marshal(power, power_fields)
res.append({"powerId": 0, "powerName": "顶级权限", "parentId": -1})
return res
# 增加权限
def save_power(req):
icon = req.get("icon")
openType = req.get("openType")
parentId = req.get("parentId")
powerCode = req.get("powerCode")
powerName = req.get("powerName")
powerType = req.get("powerType")
powerUrl = req.get("powerUrl")
sort = req.get("sort")
power = Power(
icon=icon,
open_type=openType,
parent_id=parentId,
code=powerCode,
name=powerName,
type=powerType,
url=powerUrl,
sort=sort,
enable=1
)
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("powerId")
data = {
"icon": req_json.get("icon"),
"open_type": req_json.get("openType"),
"parent_id": req_json.get("parentId"),
"code": req_json.get("powerCode"),
"name": req_json.get("powerName"),
"type": req_json.get("powerType"),
"url": req_json.get("powerUrl"),
"sort": req_json.get("sort")
}
# print(data)
power = Power.query.filter_by(id=id).update(data)
db.session.commit()
# print(power)
return power
# 启动权限
def enable_status(id):
enable = 1
user = Power.query.filter_by(id=id).update({"enable": enable})
if user:
db.session.commit()
return True
return False
# 停用权限
def disable_status(id):
enable = 0
user = Power.query.filter_by(id=id).update({"enable": enable})
if user:
db.session.commit()
return True
return False
# 删除权限(目前没有判断父节点自动删除子节点)
def remove_power(id):
power = Power.query.filter_by(id=id).first()
role_id_list = []
roles = power.role
for role in roles:
role_id_list.append(role.id)
roles = Role.query.filter(Role.id.in_(role_id_list)).all()
for p in roles:
power.role.remove(p)
r = Power.query.filter_by(id=id).delete()
db.session.commit()
return r
# 批量删除权限
def batch_remove(ids):
for _id in ids:
remove_power(_id)
+132 -128
View File
@@ -1,18 +1,24 @@
from flask import Blueprint, render_template, request, jsonify from flask import Blueprint, render_template, request, jsonify, make_response
from flask_login import login_required from flask_login import login_required
from flask_restful import Resource, Api, reqparse
from applications.extensions import db from applications.extensions import db
from applications.models import Role, Power from applications.models import Role, Power
from applications.view.rights import role_curd # from applications.view.rights import role_curd
from applications.common.utils.http import table_api, success_api, fail_api from applications.common.utils.http import table_api, success_api, fail_api
from applications.common.utils.rights import authorize from applications.common.utils.rights import authorize
from flask_restful import reqparse, marshal from flask_restful import reqparse, marshal
from applications.common.serialization import power_fields from applications.common.serialization import power_fields
from ._utils import remove_role, batch_remove_role
role_bp = Blueprint('role', __name__, url_prefix='/admin/role') role_bp = Blueprint('role', __name__, url_prefix='/admin/role')
role_api = Api(role_bp)
# 用户管理 # 角色而管理
@role_bp.get('/') @role_bp.get('/')
@authorize("admin:role:main", log=True) @authorize("admin:role:main", log=True)
def main(): def main():
@@ -53,120 +59,137 @@ def table():
], count=paginate.total) ], count=paginate.total)
# 角色增加 @role_api.resource('/add')
@role_bp.get('/add') class AddRole(Resource):
@authorize("admin:role:add", log=True) @authorize("admin:role:add", log=True)
@login_required def get(self):
def add(): return make_response(render_template('admin/role/add.html'))
return render_template('admin/role/add.html')
@authorize("admin:role:add", log=True)
def post(self):
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="成功")
# 角色增加 # 角色授权操作
@role_bp.post('/save')
@authorize("admin:role:add", log=True)
def save():
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="成功")
# 角色授权
@role_bp.get('/power/<int:_id>') @role_bp.get('/power/<int:_id>')
@authorize("admin:role:power", log=True) @authorize("admin:role:power", log=True)
def power(_id): def power(_id):
return render_template('admin/role/power.html', id=_id) return render_template('admin/role/power.html', id=_id)
# 获取角色权限 @role_api.resource('/role_power/<int:role_id>')
@role_bp.get('/getRolePower/<int:_id>') class RolePower(Resource):
@authorize("admin:role:main", log=True)
def get_role_power(_id): @authorize("admin:role:main", log=True)
role = Role.query.filter_by(id=_id).first() def get(self, role_id):
# 获取权限列表的 id # 获取角色权限
check_powers_list = [rp.id for rp in role.power] role = Role.query.filter_by(id=role_id).first()
powers = Power.query.all() # 获取所有的权限 # 获取权限列表的 id
# power_schema = PowerSchema2(many=True) # 用已继承 ma.ModelSchema 类的自定制类生成序列化类 check_powers_list = [rp.id for rp in role.power]
# 所有的权限生产可序列化对象 json powers = Power.query.all() # 获取所有的权限
# powers = power_schema.dump(powers) # 生成序列化对象 # power_schema = PowerSchema2(many=True) # 用已继承 ma.ModelSchema 类的自定制类生成序列化
powers = marshal(powers, power_fields) # 将所有的权限生产可序列化对象 json
for i in powers: # powers = power_schema.dump(powers) # 生成可序列化对象
if int(i.get("powerId")) in check_powers_list: powers = marshal(powers, power_fields)
i["checkArr"] = "1" for i in powers:
else: if int(i.get("powerId")) in check_powers_list:
i["checkArr"] = "0" i["checkArr"] = "1"
res = { else:
"data": powers, i["checkArr"] = "0"
"status": {"code": 200, "message": "默认"} res = {
} "data": powers,
return jsonify(res) "status": {"code": 200, "message": "默认"}
}
return jsonify(res)
# 保存角色权限
@authorize("admin:role:edit", log=True)
def put(self, role_id):
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 = Role.query.filter_by(id=role_id).first()
power_id_list = []
for p in role.power:
power_id_list.append(p.id)
powers = Power.query.filter(Power.id.in_(power_id_list)).all()
for p in powers:
role.power.remove(p)
powers = Power.query.filter(Power.id.in_(power_list)).all()
for p in powers:
role.power.append(p)
db.session.commit()
return success_api(msg="授权成功")
# 角色删除
@authorize("admin:role:remove", log=True)
def delete(self, role_id):
print(role_id)
res = remove_role(role_id)
print(res)
if not res:
return fail_api(msg="角色删除失败")
return success_api(msg="角色删除成功")
# 保存角色权限 @role_api.resource('/edit/<int:role_id>')
@role_bp.put('/saveRolePower') class EditRole(Resource):
@authorize("admin:role:edit", log=True)
def save_role_power():
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(',') @authorize("admin:role:edit", log=True)
def get(self, role_id):
role = Role.query.filter_by(id=role_id).first()
return make_response(render_template('admin/role/edit.html', role=role))
role_curd.update_role_power(_id=res.role_id, power_list=power_list) # 更新角色
return success_api(msg="授权成功") @authorize("admin:role:edit", log=True)
def put(self, role_id):
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 = {
@role_bp.get('/edit/<int:_id>') "code": res.role_code,
@authorize("admin:role:edit", log=True) "name": res.role_name,
def edit(_id): "sort": res.sort,
role = Role.query.filter_by(id=_id).first() "enable": res.enable,
return render_template('admin/role/edit.html', role=role) "details": res.details
}
role = Role.query.filter_by(id=role_id).update(data)
# 更新角色 db.session.commit()
@role_bp.put('/update') if not role:
@authorize("admin:role:edit", log=True) return fail_api(msg="更新角色失败")
def update(): return success_api(msg="更新角色成功")
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="更新角色成功")
# 启用用户 # 启用用户
@@ -175,35 +198,16 @@ def update():
def enable(): def enable():
parser = reqparse.RequestParser() parser = reqparse.RequestParser()
parser.add_argument('roleId', dest='role_id', required=True, type=int) parser.add_argument('roleId', dest='role_id', required=True, type=int)
parser.add_argument('operate', required=True, type=int)
res = parser.parse_args() res = parser.parse_args()
ret = Role.query.filter_by(id=res.role_id).update({"enable": 1}) ret = Role.query.filter_by(id=res.role_id).update({"enable": res.operate})
db.session.commit() db.session.commit()
message = "启动成功" if res.operate else "禁用成功"
if not ret: if not ret:
return fail_api(msg="出错啦") return fail_api(msg="出错啦")
return success_api(msg="启动成功") return success_api(msg=message)
# 禁用用户
@role_bp.put('/disable')
@authorize("admin:role:edit", log=True)
def dis_enable():
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="禁用成功")
# 角色删除
@role_bp.delete('/remove/<int:_id>')
@authorize("admin:role:remove", log=True)
def remove(_id):
res = role_curd.remove_role(_id)
if not res:
return fail_api(msg="角色删除失败")
return success_api(msg="角色删除成功")
# 批量删除 # 批量删除
@@ -216,5 +220,5 @@ def batch_remove():
res = parser.parse_args() res = parser.parse_args()
role_curd.batch_remove(res.ids) batch_remove_role(res.ids)
return success_api(msg="批量删除成功") return success_api(msg="批量删除成功")
-74
View File
@@ -1,74 +0,0 @@
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)