调整魔目录结构
This commit is contained in:
@@ -2,7 +2,6 @@ from applications.extensions import db
|
|||||||
from applications.models import Dept, DeptSchema
|
from applications.models import Dept, DeptSchema
|
||||||
from applications.models import User
|
from applications.models import User
|
||||||
from applications.common.curd import model_to_dicts
|
from applications.common.curd import model_to_dicts
|
||||||
from flask import escape
|
|
||||||
|
|
||||||
|
|
||||||
def get_dept_dict():
|
def get_dept_dict():
|
||||||
@@ -12,14 +11,14 @@ def get_dept_dict():
|
|||||||
|
|
||||||
|
|
||||||
def save_dept(req):
|
def save_dept(req):
|
||||||
address = escape(req.get("address"))
|
address = req.get("address")
|
||||||
deptName = escape(req.get("deptName"))
|
deptName = req.get("deptName")
|
||||||
email = escape(req.get("email"))
|
email = req.get("email")
|
||||||
leader = escape(req.get("leader"))
|
leader = req.get("leader")
|
||||||
parentId = escape(req.get("parentId"))
|
parentId = req.get("parentId")
|
||||||
phone = escape(req.get("phone"))
|
phone = req.get("phone")
|
||||||
sort = escape(req.get("sort"))
|
sort = req.get("sort")
|
||||||
status = escape(req.get("status"))
|
status = req.get("status")
|
||||||
dept = Dept(
|
dept = Dept(
|
||||||
parent_id=parentId,
|
parent_id=parentId,
|
||||||
dept_name=deptName,
|
dept_name=deptName,
|
||||||
@@ -65,13 +64,13 @@ def update_dept(json):
|
|||||||
""" 更新部门信息 """
|
""" 更新部门信息 """
|
||||||
_id = json.get("deptId"),
|
_id = json.get("deptId"),
|
||||||
data = {
|
data = {
|
||||||
"dept_name": escape(json.get("deptName")),
|
"dept_name": json.get("deptName"),
|
||||||
"sort": escape(json.get("sort")),
|
"sort": json.get("sort"),
|
||||||
"leader": escape(json.get("leader")),
|
"leader": json.get("leader"),
|
||||||
"phone": escape(json.get("phone")),
|
"phone": json.get("phone"),
|
||||||
"email": escape(json.get("email")),
|
"email": json.get("email"),
|
||||||
"status": escape(json.get("status")),
|
"status": json.get("status"),
|
||||||
"address": escape(json.get("address"))
|
"address": json.get("address")
|
||||||
}
|
}
|
||||||
d = Dept.query.filter_by(id=_id).update(data)
|
d = Dept.query.filter_by(id=_id).update(data)
|
||||||
if not d:
|
if not d:
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
from captcha.image import ImageCaptcha
|
|
||||||
|
|
||||||
from PIL import Image
|
|
||||||
from random import choices
|
|
||||||
|
|
||||||
|
|
||||||
def gen_captcha(content='0123456789'):
|
|
||||||
""" 生成验证码 """
|
|
||||||
image = ImageCaptcha()
|
|
||||||
# 获取字符串
|
|
||||||
captcha_text = "".join(choices(content, k=4))
|
|
||||||
# 生成图像
|
|
||||||
captcha_image = Image.open(image.generate(captcha_text))
|
|
||||||
return captcha_text, captcha_image
|
|
||||||
|
|||||||
@@ -302,7 +302,7 @@ course_data = [
|
|||||||
|
|
||||||
phase_data = [
|
phase_data = [
|
||||||
{'name': '基础课'},
|
{'name': '基础课'},
|
||||||
{'name': '进阶'},
|
{'name': '高级开发'},
|
||||||
{'name': '爬虫'},
|
{'name': '爬虫'},
|
||||||
{'name': '数据分析'},
|
{'name': '数据分析'},
|
||||||
{'name': '全栈课程'}
|
{'name': '全栈课程'}
|
||||||
|
|||||||
@@ -12,14 +12,14 @@
|
|||||||
<div class="layui-tab layui-tab-card">
|
<div class="layui-tab layui-tab-card">
|
||||||
<ul class="layui-tab-title">
|
<ul class="layui-tab-title">
|
||||||
<li class="layui-this">登录日志</li>
|
<li class="layui-this">登录日志</li>
|
||||||
<li>操作日志</li>
|
<li>访问日志</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="layui-tab-content">
|
<div class="layui-tab-content">
|
||||||
<div class="layui-tab-item layui-show">
|
<div class="layui-tab-item layui-show">
|
||||||
<table style="margin-top: 10px;" id="log-login-table" lay-filter="log-login-table"></table>
|
<table style="margin-top: 10px;" id="log-login-table" lay-filter="log-login-table"></table>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-tab-item">
|
<div class="layui-tab-item">
|
||||||
<table style="margin-top: 10px;" id="log-operate-table" lay-filter="log-operate-table"></table>
|
<table style="margin-top: 10px;" id="log-access-table" lay-filter="log-access-table"></table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
let table = layui.table
|
let table = layui.table
|
||||||
let form = layui.form
|
let form = layui.form
|
||||||
|
|
||||||
let MODULE_PATH = '/admin/log/'
|
let MODULE_PATH = '/logs/'
|
||||||
|
|
||||||
let cols = [
|
let cols = [
|
||||||
[
|
[
|
||||||
@@ -61,8 +61,8 @@
|
|||||||
]
|
]
|
||||||
|
|
||||||
table.render({
|
table.render({
|
||||||
elem: '#log-operate-table',
|
elem: '#log-access-table',
|
||||||
url: MODULE_PATH + 'operateLog',
|
url: MODULE_PATH + 'access_log',
|
||||||
page: true,
|
page: true,
|
||||||
cols: cols,
|
cols: cols,
|
||||||
skin: 'line',
|
skin: 'line',
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
|
|
||||||
table.render({
|
table.render({
|
||||||
elem: '#log-login-table',
|
elem: '#log-login-table',
|
||||||
url: MODULE_PATH + 'loginLog',
|
url: MODULE_PATH + 'login_log',
|
||||||
page: true,
|
page: true,
|
||||||
cols: cols,
|
cols: cols,
|
||||||
skin: 'line',
|
skin: 'line',
|
||||||
|
|||||||
@@ -97,6 +97,7 @@
|
|||||||
let form = layui.form
|
let form = layui.form
|
||||||
let $ = layui.jquery
|
let $ = layui.jquery
|
||||||
|
|
||||||
|
// 当点击更新之后,获取数据
|
||||||
form.on('submit(dept-update)', function (data) {
|
form.on('submit(dept-update)', function (data) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/dept/update',
|
url: '/dept/update',
|
||||||
@@ -107,7 +108,7 @@
|
|||||||
success: function (result) {
|
success: function (result) {
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
layer.msg(result.msg, { icon: 1, time: 1000 }, function () {
|
layer.msg(result.msg, { icon: 1, time: 1000 }, function () {
|
||||||
parent.layer.close(parent.layer.getFrameIndex(window.name))//关闭当前页
|
parent.layer.close(parent.layer.getFrameIndex(window.name)) //关闭当前页
|
||||||
parent.render()
|
parent.render()
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -163,13 +163,16 @@
|
|||||||
|
|
||||||
/*表格的工具栏*/
|
/*表格的工具栏*/
|
||||||
table.on('toolbar(dept-table)', function (obj) {
|
table.on('toolbar(dept-table)', function (obj) {
|
||||||
|
console.log(obj)
|
||||||
if (obj.event === 'add') {
|
if (obj.event === 'add') {
|
||||||
window.add()
|
window.add()
|
||||||
} else if (obj.event === 'refresh') {
|
} else if (obj.event === 'refresh') {
|
||||||
window.refresh()
|
window.refresh()
|
||||||
} else if (obj.event === 'batchRemove') {
|
} else if (obj.event === 'batchRemove') {
|
||||||
{#window.batchRemove(obj)#}
|
{#window.batchRemove(obj)#}
|
||||||
console.log(table.checkStatus(obj.config.id).data)
|
layer.msg('禁止批量删除')
|
||||||
|
return false
|
||||||
|
{#console.log(table.checkStatus(obj.config.id).data)#}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,7 @@
|
|||||||
success: function (result) {
|
success: function (result) {
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
layer.msg(result.msg, { icon: 1, time: 1000 }, function () {
|
layer.msg(result.msg, { icon: 1, time: 1000 }, function () {
|
||||||
parent.layer.close(parent.layer.getFrameIndex(window.name))//关闭当前页
|
parent.layer.close(parent.layer.getFrameIndex(window.name)) //关闭当前页
|
||||||
parent.layui.table.reload('dict-type-table')
|
parent.layui.table.reload('dict-type-table')
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -92,7 +92,9 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/html" id="dict-type-enable">
|
<script type="text/html" id="dict-type-enable">
|
||||||
<input type="checkbox" value="{{ "{{ d.id }}" }}" lay-skin="switch" lay-text="启用|禁用" lay-filter="dict-type-enable"
|
<input type="checkbox" value="{{ "{{ d.id }}" }}"
|
||||||
|
lay-skin="switch" lay-text="启用|禁用"
|
||||||
|
lay-filter="dict-type-enable"
|
||||||
{{ "{{# if(d.enable==1){ }} checked {{# } }}" }}>
|
{{ "{{# if(d.enable==1){ }} checked {{# } }}" }}>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -108,9 +110,11 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/html" id="dict-data-bar">
|
<script type="text/html" id="dict-data-bar">
|
||||||
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>
|
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit">
|
||||||
|
<i class="layui-icon layui-icon-edit"></i>
|
||||||
</button>
|
</button>
|
||||||
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i class="layui-icon layui-icon-delete"></i>
|
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove">
|
||||||
|
<i class="layui-icon layui-icon-delete"></i>
|
||||||
</button>
|
</button>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -210,7 +210,7 @@
|
|||||||
layer.close(index)
|
layer.close(index)
|
||||||
let loading = layer.load()
|
let loading = layer.load()
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: "{{ url_for('adminFile.batch_remove') }}",
|
url: "{{ url_for('file.batch_remove') }}",
|
||||||
data: { ids: ids },
|
data: { ids: ids },
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
+1
-1
@@ -43,7 +43,7 @@
|
|||||||
//选完文件后不自动上传
|
//选完文件后不自动上传
|
||||||
upload.render({
|
upload.render({
|
||||||
elem: '#logo-img'
|
elem: '#logo-img'
|
||||||
, url: "{{ url_for('adminFile.upload') }}"
|
, url: "{{ url_for('file.upload') }}"
|
||||||
, auto: false
|
, auto: false
|
||||||
, exts: 'jpg|png|gif|bmp|jpeg'
|
, exts: 'jpg|png|gif|bmp|jpeg'
|
||||||
, size: 1000
|
, size: 1000
|
||||||
@@ -17,9 +17,12 @@
|
|||||||
<div class="layui-header">
|
<div class="layui-header">
|
||||||
<!-- 顶 部 左 侧 功 能 -->
|
<!-- 顶 部 左 侧 功 能 -->
|
||||||
<ul class="layui-nav layui-layout-left">
|
<ul class="layui-nav layui-layout-left">
|
||||||
<li class="collaspe layui-nav-item"><a href="#" class="layui-icon layui-icon-shrink-right"></a></li>
|
<li class="collaspe layui-nav-item">
|
||||||
<li class="refresh layui-nav-item"><a href="#" class="layui-icon layui-icon-refresh-1" title="刷新页面"
|
<a href="#" class="layui-icon layui-icon-shrink-right"></a>
|
||||||
loading=600></a></li>
|
</li>
|
||||||
|
<li class="refresh layui-nav-item">
|
||||||
|
<a href="#" class="layui-icon layui-icon-refresh-1" title="刷新页面" loading=600></a>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<!-- 顶 部 右 侧 菜 单 -->
|
<!-- 顶 部 右 侧 菜 单 -->
|
||||||
<div id="control" class="layui-layout-control"></div>
|
<div id="control" class="layui-layout-control"></div>
|
||||||
@@ -66,7 +69,9 @@
|
|||||||
<!-- 遮 盖 层 -->
|
<!-- 遮 盖 层 -->
|
||||||
<div class="pear-cover"></div>
|
<div class="pear-cover"></div>
|
||||||
<!-- 移 动 端 便 捷 操 作 -->
|
<!-- 移 动 端 便 捷 操 作 -->
|
||||||
<div class="pear-collasped-pe collaspe"><a href="#" class="layui-icon layui-icon-shrink-right"></a></div>
|
<div class="pear-collasped-pe collaspe">
|
||||||
|
<a href="#" class="layui-icon layui-icon-shrink-right"></a>
|
||||||
|
</div>
|
||||||
<!-- 加 载 动 画-->
|
<!-- 加 载 动 画-->
|
||||||
<div class="loader-main">
|
<div class="loader-main">
|
||||||
<div class="loader"></div>
|
<div class="loader"></div>
|
||||||
|
|||||||
@@ -39,51 +39,56 @@
|
|||||||
</form>
|
</form>
|
||||||
{% include 'admin/common/footer.html' %}
|
{% include 'admin/common/footer.html' %}
|
||||||
<script>
|
<script>
|
||||||
layui.use(['form', 'jquery', 'layer', 'button', 'popup'], function () {
|
layui.use(['form', 'jquery', 'layer', 'button', 'popup'], function () {
|
||||||
let form = layui.form;
|
let form = layui.form
|
||||||
let $ = layui.jquery;
|
let $ = layui.jquery
|
||||||
let layer = layui.layer;
|
let layer = layui.layer
|
||||||
let button = layui.button;
|
let button = layui.button
|
||||||
let popup = layui.popup;
|
let popup = layui.popup
|
||||||
let captchaPath = "{{ url_for('passport.get_captcha') }}";
|
let captchaPath = "{{ url_for('passport.get_captcha') }}"
|
||||||
|
|
||||||
form.on('submit(login)', function (data) {
|
form.on('submit(login)', function (data) {
|
||||||
let loader = layer.load();
|
// data 是表单的数据
|
||||||
let btn = button.load({elem: '.login'});
|
let loader = layer.load() // 加载按钮
|
||||||
$.ajax({
|
let btn = button.load({ elem: '.login' })
|
||||||
data: data.field,
|
$.ajax({
|
||||||
type: "post",
|
data: data.field,
|
||||||
dataType: 'json',
|
type: 'post',
|
||||||
success: function (result) {
|
dataType: 'json',
|
||||||
layer.close(loader);
|
// 请求成功之后返回的数据
|
||||||
btn.stop(function () {
|
success: function (result) {
|
||||||
if (result.success) {
|
layer.close(loader) // 关闭加载按钮
|
||||||
popup.success(result.msg, function () {
|
btn.stop(function () {
|
||||||
location.href = "{{ url_for('admin.index') }}";
|
if (result.success) {
|
||||||
})
|
popup.success(result.msg, function () {
|
||||||
} else {
|
location.href = "{{ url_for('admin.index') }}"
|
||||||
popup.failure(result.msg, function () {
|
})
|
||||||
document.getElementById("captchaImage").src = captchaPath + "?" + Math.random();
|
} else {
|
||||||
});
|
popup.failure(result.msg, function () {
|
||||||
}
|
document.getElementById('captchaImage').src = captchaPath + '?' + Math.random()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
return false;
|
}
|
||||||
});
|
})
|
||||||
|
return false
|
||||||
$("#captchaImage").click(function () {
|
|
||||||
document.getElementById("captchaImage").src = captchaPath + "?" + Math.random();
|
|
||||||
});
|
|
||||||
setInterval(function () {
|
|
||||||
document.getElementById("captchaImage").src = captchaPath + "?" + Math.random();
|
|
||||||
}, 30 * 1000);
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 点击按钮更新验证码
|
||||||
|
$('#captchaImage').click(function () {
|
||||||
|
document.getElementById('captchaImage').src = captchaPath + '?' + Math.random()
|
||||||
|
})
|
||||||
|
|
||||||
|
// 定时器,定时更新验证码
|
||||||
|
setInterval(function () {
|
||||||
|
document.getElementById('captchaImage').src = captchaPath + '?' + Math.random()
|
||||||
|
}, 30 * 1000)
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
<script>
|
<script>
|
||||||
if (window !== top) {
|
if (window !== top) {
|
||||||
top.location.href = location.href;
|
top.location.href = location.href
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -137,8 +137,9 @@
|
|||||||
|
|
||||||
form.on('submit(power-save)', function (data) {
|
form.on('submit(power-save)', function (data) {
|
||||||
data.field.icon = 'layui-icon ' + data.field.icon
|
data.field.icon = 'layui-icon ' + data.field.icon
|
||||||
|
console.log(data.field)
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '{{ url_for('rights.update') }}',
|
url: '/rights/power/' + data.field.powerId ,
|
||||||
data: JSON.stringify(data.field),
|
data: JSON.stringify(data.field),
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
contentType: 'application/json',
|
contentType: 'application/json',
|
||||||
|
|||||||
@@ -106,7 +106,7 @@
|
|||||||
toolbar: '#power-toolbar',
|
toolbar: '#power-toolbar',
|
||||||
elem: '#power-table',
|
elem: '#power-table',
|
||||||
url: '{{ url_for('rights.data') }}',
|
url: '{{ url_for('rights.data') }}',
|
||||||
page: false,
|
page: false,
|
||||||
cols: [
|
cols: [
|
||||||
[
|
[
|
||||||
{% if authorize("admin:role:remove") %}
|
{% if authorize("admin:role:remove") %}
|
||||||
@@ -212,7 +212,7 @@
|
|||||||
title: '修改',
|
title: '修改',
|
||||||
shade: 0.1,
|
shade: 0.1,
|
||||||
area: ['450px', '500px'],
|
area: ['450px', '500px'],
|
||||||
content: MODULE_PATH + 'edit/' + obj.data['powerId']
|
content: MODULE_PATH + 'power/' + obj.data['powerId']
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
window.remove = function (obj) {
|
window.remove = function (obj) {
|
||||||
@@ -220,7 +220,7 @@
|
|||||||
layer.close(index)
|
layer.close(index)
|
||||||
let loading = layer.load()
|
let loading = layer.load()
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: MODULE_PATH + 'remove/' + obj.data['powerId'],
|
url: MODULE_PATH + 'power/' + obj.data['powerId'],
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
type: 'delete',
|
type: 'delete',
|
||||||
success: function (result) {
|
success: function (result) {
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
from flask import Flask
|
from flask import Flask
|
||||||
|
|
||||||
from applications.view.admin.admin_log import admin_log
|
from applications.view.admin.logs import admin_log
|
||||||
from applications.view.admin.dict import admin_dict
|
from applications.view.admin.dict import admin_dict
|
||||||
from applications.view.admin.index import admin_bp
|
from applications.view.admin.index import admin_bp
|
||||||
from applications.view.admin.file import admin_file
|
from applications.view.admin.file import file_bp
|
||||||
from applications.view.rights.role import admin_role
|
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
|
from applications.view.admin.monitor import admin_monitor_bp
|
||||||
|
|
||||||
@@ -12,8 +12,8 @@ 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(admin_file)
|
app.register_blueprint(file_bp)
|
||||||
app.register_blueprint(admin_monitor_bp)
|
app.register_blueprint(admin_monitor_bp)
|
||||||
app.register_blueprint(admin_log)
|
app.register_blueprint(admin_log)
|
||||||
app.register_blueprint(admin_role)
|
app.register_blueprint(role_bp)
|
||||||
app.register_blueprint(admin_dict)
|
app.register_blueprint(admin_dict)
|
||||||
|
|||||||
@@ -1,58 +0,0 @@
|
|||||||
from flask import Blueprint, request, render_template
|
|
||||||
from sqlalchemy import desc
|
|
||||||
|
|
||||||
from applications.common.utils.http import table_api
|
|
||||||
from applications.common.utils.rights import authorize
|
|
||||||
from applications.models import AdminLog, LogSchema
|
|
||||||
from applications.common.curd import model_to_dicts
|
|
||||||
|
|
||||||
admin_log = Blueprint('adminLog', __name__, url_prefix='/admin/log')
|
|
||||||
|
|
||||||
|
|
||||||
# ----------------------------------------------------------
|
|
||||||
# ------------------------- 日志管理 --------------------------
|
|
||||||
# ----------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
@admin_log.get('/')
|
|
||||||
@authorize("admin:log:main")
|
|
||||||
def index():
|
|
||||||
return render_template('admin/admin_log/main.html')
|
|
||||||
|
|
||||||
|
|
||||||
# ==========================================================
|
|
||||||
# 登录日志
|
|
||||||
# ==========================================================
|
|
||||||
|
|
||||||
|
|
||||||
@admin_log.get('/loginLog')
|
|
||||||
@authorize("admin:log:main")
|
|
||||||
def login_log():
|
|
||||||
page = request.args.get('page', type=int)
|
|
||||||
limit = request.args.get('limit', type=int)
|
|
||||||
log = AdminLog.query.filter_by(url='/admin/login').order_by(desc(AdminLog.create_time)).paginate(page=page,
|
|
||||||
per_page=limit,
|
|
||||||
error_out=False)
|
|
||||||
count = AdminLog.query.filter_by(url='/admin/login').count()
|
|
||||||
data = model_to_dicts(Schema=LogSchema, model=log.items)
|
|
||||||
|
|
||||||
return table_api(data=data, count=count)
|
|
||||||
|
|
||||||
|
|
||||||
# ==========================================================
|
|
||||||
# 操作日志
|
|
||||||
# ==========================================================
|
|
||||||
|
|
||||||
|
|
||||||
@admin_log.get('/operateLog')
|
|
||||||
@authorize("admin:log:main")
|
|
||||||
def operate_log():
|
|
||||||
page = request.args.get('page', type=int)
|
|
||||||
limit = request.args.get('limit', type=int)
|
|
||||||
log = AdminLog.query.filter(
|
|
||||||
AdminLog.url != '/admin/login').order_by(
|
|
||||||
desc(AdminLog.create_time)).paginate(
|
|
||||||
page=page, per_page=limit, error_out=False)
|
|
||||||
count = AdminLog.query.filter(AdminLog.url != '/admin/login').count()
|
|
||||||
data = model_to_dicts(Schema=LogSchema, model=log.items)
|
|
||||||
return table_api(data=data, count=count)
|
|
||||||
@@ -22,7 +22,7 @@ def dict_type_data():
|
|||||||
limit = request.args.get('limit', type=int)
|
limit = request.args.get('limit', type=int)
|
||||||
type_name = request.args.get('typeName', type=str)
|
type_name = request.args.get('typeName', type=str)
|
||||||
data, count = dict_curd.get_dict_type(page=page, limit=limit, type_name=type_name)
|
data, count = dict_curd.get_dict_type(page=page, limit=limit, type_name=type_name)
|
||||||
return table_api(data=data,count=count)
|
return table_api(data=data, count=count)
|
||||||
|
|
||||||
|
|
||||||
@admin_dict.get('/dictType/add')
|
@admin_dict.get('/dictType/add')
|
||||||
|
|||||||
@@ -7,18 +7,18 @@ from applications.extensions import db
|
|||||||
from applications.models import Photo
|
from applications.models import Photo
|
||||||
from applications.common.admin import file_curd
|
from applications.common.admin import file_curd
|
||||||
|
|
||||||
admin_file = Blueprint('adminFile', __name__, url_prefix='/admin/file')
|
file_bp = Blueprint('file', __name__, url_prefix='/file')
|
||||||
|
|
||||||
|
|
||||||
# 图片管理
|
# 图片管理
|
||||||
@admin_file.get('/')
|
@file_bp.get('/')
|
||||||
@authorize("admin:file:main", log=True)
|
@authorize("admin:file:main", log=True)
|
||||||
def index():
|
def index():
|
||||||
return render_template('admin/photo/photo.html')
|
return render_template('admin/file/photo.html')
|
||||||
|
|
||||||
|
|
||||||
# 图片数据
|
# 图片数据
|
||||||
@admin_file.get('/table')
|
@file_bp.get('/table')
|
||||||
@authorize("admin:file:main", log=True)
|
@authorize("admin:file:main", log=True)
|
||||||
def table():
|
def table():
|
||||||
page = request.args.get('page', type=int)
|
page = request.args.get('page', type=int)
|
||||||
@@ -28,14 +28,14 @@ def table():
|
|||||||
|
|
||||||
|
|
||||||
# 上传
|
# 上传
|
||||||
@admin_file.get('/upload')
|
@file_bp.get('/upload')
|
||||||
@authorize("admin:file:add", log=True)
|
@authorize("admin:file:add", log=True)
|
||||||
def upload():
|
def upload():
|
||||||
return render_template('admin/photo/photo_add.html')
|
return render_template('admin/file/photo_add.html')
|
||||||
|
|
||||||
|
|
||||||
# 上传接口
|
# 上传接口
|
||||||
@admin_file.post('/upload')
|
@file_bp.post('/upload')
|
||||||
@authorize("admin:file:add", log=True)
|
@authorize("admin:file:add", log=True)
|
||||||
def upload_api():
|
def upload_api():
|
||||||
if 'file' in request.files:
|
if 'file' in request.files:
|
||||||
@@ -54,7 +54,7 @@ def upload_api():
|
|||||||
|
|
||||||
|
|
||||||
# 图片删除
|
# 图片删除
|
||||||
@admin_file.route('/delete', methods=['GET', 'POST'])
|
@file_bp.route('/delete', methods=['GET', 'POST'])
|
||||||
@authorize("admin:file:delete", log=True)
|
@authorize("admin:file:delete", log=True)
|
||||||
def delete():
|
def delete():
|
||||||
_id = request.form.get('id')
|
_id = request.form.get('id')
|
||||||
@@ -66,7 +66,7 @@ def delete():
|
|||||||
|
|
||||||
|
|
||||||
# 图片批量删除
|
# 图片批量删除
|
||||||
@admin_file.route('/batchRemove', methods=['GET', 'POST'])
|
@file_bp.route('/batchRemove', methods=['GET', 'POST'])
|
||||||
@authorize("admin:file:delete", log=True)
|
@authorize("admin:file:delete", log=True)
|
||||||
def batch_remove():
|
def batch_remove():
|
||||||
ids = request.form.getlist('ids[]')
|
ids = request.form.getlist('ids[]')
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
from flask import Blueprint, request, render_template
|
||||||
|
from sqlalchemy import desc
|
||||||
|
|
||||||
|
from applications.common.utils.http import table_api
|
||||||
|
from applications.common.utils.rights import authorize
|
||||||
|
from applications.models import AdminLog, LogSchema
|
||||||
|
from applications.common.curd import model_to_dicts
|
||||||
|
|
||||||
|
admin_log = Blueprint('logs', __name__, url_prefix='/logs')
|
||||||
|
|
||||||
|
|
||||||
|
@admin_log.get('/')
|
||||||
|
@authorize("admin:log:main")
|
||||||
|
def index():
|
||||||
|
return render_template('admin/admin_log/main.html')
|
||||||
|
|
||||||
|
|
||||||
|
@admin_log.get('/login_log')
|
||||||
|
@authorize("admin:log:main")
|
||||||
|
def login_log():
|
||||||
|
page = request.args.get('page', type=int)
|
||||||
|
limit = request.args.get('limit', type=int)
|
||||||
|
log_paginate = AdminLog.query.filter_by(
|
||||||
|
url='/passport/login').order_by(
|
||||||
|
desc(AdminLog.create_time)).paginate(
|
||||||
|
page=page, per_page=limit, error_out=False)
|
||||||
|
data = model_to_dicts(Schema=LogSchema, model=log_paginate.items)
|
||||||
|
|
||||||
|
return table_api(data=data, count=log_paginate.total)
|
||||||
|
|
||||||
|
|
||||||
|
@admin_log.get('/access_log')
|
||||||
|
@authorize("admin:log:main")
|
||||||
|
def operate_log():
|
||||||
|
page = request.args.get('page', type=int)
|
||||||
|
limit = request.args.get('limit', type=int)
|
||||||
|
log = AdminLog.query.filter(
|
||||||
|
AdminLog.url != '/passport/login').order_by(
|
||||||
|
desc(AdminLog.create_time)).paginate(
|
||||||
|
page=page, per_page=limit, error_out=False)
|
||||||
|
count = AdminLog.query.filter(AdminLog.url != '/admin/login').count()
|
||||||
|
data = model_to_dicts(Schema=LogSchema, model=log.items)
|
||||||
|
return table_api(data=data, count=count)
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
from flask import Blueprint, session, redirect, url_for, render_template, request, make_response
|
from flask import Blueprint, session, redirect, url_for, render_template, request, make_response
|
||||||
from flask_login import current_user, login_user, login_required, logout_user
|
from flask_login import current_user, login_user, login_required, logout_user
|
||||||
from flask_restful import Resource, Api, reqparse
|
from flask_restful import Resource, Api, reqparse
|
||||||
from applications.common.admin import index_curd
|
|
||||||
from applications.common.admin_log import login_log
|
from applications.common.admin_log import login_log
|
||||||
from applications.common.utils.http import fail_api, success_api
|
from applications.common.utils.http import fail_api, success_api
|
||||||
from applications.models import User
|
from applications.models import User
|
||||||
|
from ._utils import get_captcha_image, add_auth_session
|
||||||
|
|
||||||
passport_bp = Blueprint('passport', __name__, url_prefix='/passport')
|
passport_bp = Blueprint('passport', __name__, url_prefix='/passport')
|
||||||
passport_api = Api(passport_bp)
|
passport_api = Api(passport_bp)
|
||||||
@@ -17,7 +17,7 @@ def register_passport_views(app):
|
|||||||
# 获取验证码
|
# 获取验证码
|
||||||
@passport_bp.get('/getCaptcha')
|
@passport_bp.get('/getCaptcha')
|
||||||
def get_captcha():
|
def get_captcha():
|
||||||
resp, code = index_curd.get_captcha()
|
resp, code = get_captcha_image()
|
||||||
session["code"] = code
|
session["code"] = code
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ class Login(Resource):
|
|||||||
# 记录登录日志
|
# 记录登录日志
|
||||||
login_log(request, uid=user.id, is_access=True)
|
login_log(request, uid=user.id, is_access=True)
|
||||||
# 存入权限
|
# 存入权限
|
||||||
index_curd.add_auth_session()
|
add_auth_session()
|
||||||
return success_api(msg="登录成功")
|
return success_api(msg="登录成功")
|
||||||
login_log(request, uid=user.id, is_access=False)
|
login_log(request, uid=user.id, is_access=False)
|
||||||
return fail_api(msg="用户名或密码错误")
|
return fail_api(msg="用户名或密码错误")
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
from captcha.image import ImageCaptcha
|
||||||
|
from io import BytesIO
|
||||||
|
from PIL import Image
|
||||||
|
from random import choices
|
||||||
|
|
||||||
|
from flask import session, make_response
|
||||||
|
from flask_login import current_user
|
||||||
|
|
||||||
|
|
||||||
|
def gen_captcha(content='0123456789'):
|
||||||
|
""" 生成验证码 """
|
||||||
|
image = ImageCaptcha()
|
||||||
|
# 获取字符串
|
||||||
|
captcha_text = "".join(choices(content, k=4))
|
||||||
|
# 生成图像
|
||||||
|
captcha_image = Image.open(image.generate(captcha_text))
|
||||||
|
return captcha_text, captcha_image
|
||||||
|
|
||||||
|
|
||||||
|
# 生成验证码
|
||||||
|
def get_captcha_image():
|
||||||
|
code, image = gen_captcha()
|
||||||
|
out = BytesIO()
|
||||||
|
session["code"] = code
|
||||||
|
image.save(out, 'png')
|
||||||
|
out.seek(0)
|
||||||
|
resp = make_response(out.read())
|
||||||
|
resp.content_type = 'image/png'
|
||||||
|
return resp, code
|
||||||
|
|
||||||
|
|
||||||
|
# 授权路由存入session
|
||||||
|
def add_auth_session():
|
||||||
|
role = current_user.role
|
||||||
|
user_power = []
|
||||||
|
for i in role:
|
||||||
|
if i.enable == 0:
|
||||||
|
continue
|
||||||
|
for p in i.power:
|
||||||
|
if p.enable == 0:
|
||||||
|
continue
|
||||||
|
user_power.append(p.code)
|
||||||
|
session['permissions'] = user_power
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
from flask import Blueprint, Flask
|
from flask import Blueprint, Flask
|
||||||
|
from flask_restful import Api
|
||||||
|
|
||||||
rights_bp = Blueprint('rights', __name__, url_prefix='/rights')
|
rights_bp = Blueprint('rights', __name__, url_prefix='/rights')
|
||||||
|
rights_api = Api(rights_bp)
|
||||||
|
|
||||||
from . import routes
|
from . import routes
|
||||||
from . import view
|
from . import view
|
||||||
|
|||||||
@@ -1,75 +1,10 @@
|
|||||||
from collections import OrderedDict
|
|
||||||
import copy
|
import copy
|
||||||
|
from collections import OrderedDict
|
||||||
|
|
||||||
from io import BytesIO
|
from flask import current_app
|
||||||
from flask import session, make_response, current_app
|
|
||||||
from flask_login import current_user
|
from flask_login import current_user
|
||||||
|
|
||||||
from applications.common.utils.gen_captcha import gen_captcha
|
from applications.models import PowerSchema
|
||||||
from applications.models.rights.power import PowerSchema
|
|
||||||
|
|
||||||
|
|
||||||
# 授权路由存入session
|
|
||||||
def add_auth_session():
|
|
||||||
role = current_user.role
|
|
||||||
user_power = []
|
|
||||||
for i in role:
|
|
||||||
if i.enable == 0:
|
|
||||||
continue
|
|
||||||
for p in i.power:
|
|
||||||
if p.enable == 0:
|
|
||||||
continue
|
|
||||||
user_power.append(p.code)
|
|
||||||
session['permissions'] = user_power
|
|
||||||
|
|
||||||
|
|
||||||
# 生成菜单树
|
|
||||||
def make_menu_tree():
|
|
||||||
role = current_user.role
|
|
||||||
powers = []
|
|
||||||
for i in role:
|
|
||||||
# 如果角色没有被启用就直接跳过
|
|
||||||
if i.enable == 0:
|
|
||||||
continue
|
|
||||||
# 变量角色用户的权限
|
|
||||||
for p in i.power:
|
|
||||||
# 如果权限关闭了就直接跳过
|
|
||||||
if p.enable == 0:
|
|
||||||
continue
|
|
||||||
# 一二级菜单
|
|
||||||
if p.type == 0 or p.type == 1:
|
|
||||||
powers.append(p)
|
|
||||||
|
|
||||||
power_schema = PowerSchema(many=True) # 用已继承 ma.ModelSchema 类的自定制类生成序列化类
|
|
||||||
power_dict = power_schema.dump(powers) # 生成可序列化对象
|
|
||||||
power_dict.sort(key=lambda x: x['id'], reverse=True)
|
|
||||||
|
|
||||||
menu_dict = OrderedDict()
|
|
||||||
for _dict in power_dict:
|
|
||||||
if _dict['id'] in menu_dict:
|
|
||||||
# 当前节点添加子节点
|
|
||||||
_dict['children'] = copy.deepcopy(menu_dict[_dict['id']])
|
|
||||||
# 删除子节点
|
|
||||||
del menu_dict[_dict['id']]
|
|
||||||
|
|
||||||
if _dict['parent_id'] not in menu_dict:
|
|
||||||
menu_dict[_dict['parent_id']] = [_dict]
|
|
||||||
else:
|
|
||||||
menu_dict[_dict['parent_id']].append(_dict)
|
|
||||||
|
|
||||||
return menu_dict.get(0)
|
|
||||||
|
|
||||||
|
|
||||||
# 生成验证码
|
|
||||||
def get_captcha():
|
|
||||||
code, image = gen_captcha()
|
|
||||||
out = BytesIO()
|
|
||||||
session["code"] = code
|
|
||||||
image.save(out, 'png')
|
|
||||||
out.seek(0)
|
|
||||||
resp = make_response(out.read())
|
|
||||||
resp.content_type = 'image/png'
|
|
||||||
return resp, code
|
|
||||||
|
|
||||||
|
|
||||||
def get_render_config():
|
def get_render_config():
|
||||||
@@ -142,3 +77,41 @@ def get_render_config():
|
|||||||
"autoHead": False
|
"autoHead": False
|
||||||
}, header=False)
|
}, header=False)
|
||||||
return config
|
return config
|
||||||
|
|
||||||
|
|
||||||
|
# 生成菜单树
|
||||||
|
def make_menu_tree():
|
||||||
|
role = current_user.role
|
||||||
|
powers = []
|
||||||
|
for i in role:
|
||||||
|
# 如果角色没有被启用就直接跳过
|
||||||
|
if i.enable == 0:
|
||||||
|
continue
|
||||||
|
# 变量角色用户的权限
|
||||||
|
for p in i.power:
|
||||||
|
# 如果权限关闭了就直接跳过
|
||||||
|
if p.enable == 0:
|
||||||
|
continue
|
||||||
|
# 一二级菜单
|
||||||
|
if p.type == 0 or p.type == 1:
|
||||||
|
powers.append(p)
|
||||||
|
|
||||||
|
power_schema = PowerSchema(many=True) # 用已继承 ma.ModelSchema 类的自定制类生成序列化类
|
||||||
|
power_dict = power_schema.dump(powers) # 生成可序列化对象
|
||||||
|
power_dict.sort(key=lambda x: x['id'], reverse=True)
|
||||||
|
|
||||||
|
menu_dict = OrderedDict()
|
||||||
|
for _dict in power_dict:
|
||||||
|
if _dict['id'] in menu_dict:
|
||||||
|
# 当前节点添加子节点
|
||||||
|
_dict['children'] = copy.deepcopy(menu_dict[_dict['id']])
|
||||||
|
# 删除子节点
|
||||||
|
del menu_dict[_dict['id']]
|
||||||
|
|
||||||
|
if _dict['parent_id'] not in menu_dict:
|
||||||
|
menu_dict[_dict['parent_id']] = [_dict]
|
||||||
|
else:
|
||||||
|
menu_dict[_dict['parent_id']].append(_dict)
|
||||||
|
|
||||||
|
return menu_dict.get(0)
|
||||||
|
|
||||||
@@ -5,18 +5,18 @@ 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
|
||||||
|
|
||||||
|
|
||||||
admin_role = Blueprint('role', __name__, url_prefix='/admin/role')
|
role_bp = Blueprint('role', __name__, url_prefix='/admin/role')
|
||||||
|
|
||||||
|
|
||||||
# 用户管理
|
# 用户管理
|
||||||
@admin_role.get('/')
|
@role_bp.get('/')
|
||||||
@authorize("admin:role:main", log=True)
|
@authorize("admin:role:main", log=True)
|
||||||
def main():
|
def main():
|
||||||
return render_template('admin/role/main.html')
|
return render_template('admin/role/main.html')
|
||||||
|
|
||||||
|
|
||||||
# 表格数据
|
# 表格数据
|
||||||
@admin_role.get('/data')
|
@role_bp.get('/data')
|
||||||
@authorize("admin:role:main", log=True)
|
@authorize("admin:role:main", log=True)
|
||||||
def table():
|
def table():
|
||||||
page = request.args.get('page', type=int)
|
page = request.args.get('page', type=int)
|
||||||
@@ -33,7 +33,7 @@ def table():
|
|||||||
|
|
||||||
|
|
||||||
# 角色增加
|
# 角色增加
|
||||||
@admin_role.get('/add')
|
@role_bp.get('/add')
|
||||||
@authorize("admin:role:add", log=True)
|
@authorize("admin:role:add", log=True)
|
||||||
@login_required
|
@login_required
|
||||||
def add():
|
def add():
|
||||||
@@ -41,7 +41,7 @@ def add():
|
|||||||
|
|
||||||
|
|
||||||
# 角色增加
|
# 角色增加
|
||||||
@admin_role.post('/save')
|
@role_bp.post('/save')
|
||||||
@authorize("admin:role:add", log=True)
|
@authorize("admin:role:add", log=True)
|
||||||
def save():
|
def save():
|
||||||
req = request.json
|
req = request.json
|
||||||
@@ -50,14 +50,14 @@ def save():
|
|||||||
|
|
||||||
|
|
||||||
# 角色授权
|
# 角色授权
|
||||||
@admin_role.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)
|
||||||
|
|
||||||
|
|
||||||
# 获取角色权限
|
# 获取角色权限
|
||||||
@admin_role.get('/getRolePower/<int:_id>')
|
@role_bp.get('/getRolePower/<int:_id>')
|
||||||
@authorize("admin:role:main", log=True)
|
@authorize("admin:role:main", log=True)
|
||||||
def get_role_power(_id):
|
def get_role_power(_id):
|
||||||
powers = role_curd.get_role_power(_id)
|
powers = role_curd.get_role_power(_id)
|
||||||
@@ -69,7 +69,7 @@ def get_role_power(_id):
|
|||||||
|
|
||||||
|
|
||||||
# 保存角色权限
|
# 保存角色权限
|
||||||
@admin_role.put('/saveRolePower')
|
@role_bp.put('/saveRolePower')
|
||||||
@authorize("admin:role:edit", log=True)
|
@authorize("admin:role:edit", log=True)
|
||||||
def save_role_power():
|
def save_role_power():
|
||||||
req_form = request.form
|
req_form = request.form
|
||||||
@@ -81,7 +81,7 @@ def save_role_power():
|
|||||||
|
|
||||||
|
|
||||||
# 角色编辑
|
# 角色编辑
|
||||||
@admin_role.get('/edit/<int:_id>')
|
@role_bp.get('/edit/<int:_id>')
|
||||||
@authorize("admin:role:edit", log=True)
|
@authorize("admin:role:edit", log=True)
|
||||||
def edit(_id):
|
def edit(_id):
|
||||||
role = role_curd.get_role_by_id(_id)
|
role = role_curd.get_role_by_id(_id)
|
||||||
@@ -89,7 +89,7 @@ def edit(_id):
|
|||||||
|
|
||||||
|
|
||||||
# 更新角色
|
# 更新角色
|
||||||
@admin_role.put('/update')
|
@role_bp.put('/update')
|
||||||
@authorize("admin:role:edit", log=True)
|
@authorize("admin:role:edit", log=True)
|
||||||
def update():
|
def update():
|
||||||
res = role_curd.update_role(request.json)
|
res = role_curd.update_role(request.json)
|
||||||
@@ -99,7 +99,7 @@ def update():
|
|||||||
|
|
||||||
|
|
||||||
# 启用用户
|
# 启用用户
|
||||||
@admin_role.put('/enable')
|
@role_bp.put('/enable')
|
||||||
@authorize("admin:role:edit", log=True)
|
@authorize("admin:role:edit", log=True)
|
||||||
def enable():
|
def enable():
|
||||||
id = request.json.get('roleId')
|
id = request.json.get('roleId')
|
||||||
@@ -113,7 +113,7 @@ def enable():
|
|||||||
|
|
||||||
|
|
||||||
# 禁用用户
|
# 禁用用户
|
||||||
@admin_role.put('/disable')
|
@role_bp.put('/disable')
|
||||||
@authorize("admin:role:edit", log=True)
|
@authorize("admin:role:edit", log=True)
|
||||||
def dis_enable():
|
def dis_enable():
|
||||||
_id = request.json.get('roleId')
|
_id = request.json.get('roleId')
|
||||||
@@ -126,7 +126,7 @@ def dis_enable():
|
|||||||
|
|
||||||
|
|
||||||
# 角色删除
|
# 角色删除
|
||||||
@admin_role.delete('/remove/<int:_id>')
|
@role_bp.delete('/remove/<int:_id>')
|
||||||
@authorize("admin:role:remove", log=True)
|
@authorize("admin:role:remove", log=True)
|
||||||
def remove(_id):
|
def remove(_id):
|
||||||
res = role_curd.remove_role(_id)
|
res = role_curd.remove_role(_id)
|
||||||
@@ -136,7 +136,7 @@ def remove(_id):
|
|||||||
|
|
||||||
|
|
||||||
# 批量删除
|
# 批量删除
|
||||||
@admin_role.delete('/batchRemove')
|
@role_bp.delete('/batchRemove')
|
||||||
@authorize("admin:role:remove", log=True)
|
@authorize("admin:role:remove", log=True)
|
||||||
@login_required
|
@login_required
|
||||||
def batch_remove():
|
def batch_remove():
|
||||||
|
|||||||
@@ -3,18 +3,19 @@ from flask import jsonify
|
|||||||
from flask_login import login_required
|
from flask_login import login_required
|
||||||
|
|
||||||
from . import rights_bp
|
from . import rights_bp
|
||||||
from ...common.admin import index_curd
|
|
||||||
|
from ._utils import get_render_config, make_menu_tree
|
||||||
|
|
||||||
|
|
||||||
@rights_bp.get('/configs')
|
@rights_bp.get('/configs')
|
||||||
@login_required
|
@login_required
|
||||||
def configs():
|
def configs():
|
||||||
return index_curd.get_render_config()
|
return get_render_config()
|
||||||
|
|
||||||
|
|
||||||
# 菜单
|
# 菜单
|
||||||
@rights_bp.get('/menu')
|
@rights_bp.get('/menu')
|
||||||
@login_required
|
@login_required
|
||||||
def menu():
|
def menu():
|
||||||
menu_tree = index_curd.make_menu_tree()
|
menu_tree = make_menu_tree()
|
||||||
return jsonify(menu_tree)
|
return jsonify(menu_tree)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
from flask import render_template, request, jsonify
|
from flask import render_template, request, jsonify, make_response
|
||||||
|
from flask_restful import Resource, reqparse
|
||||||
|
|
||||||
from . import rights_bp
|
from . import rights_bp, rights_api
|
||||||
from ...common.admin import rights_curd
|
from ...common.admin import rights_curd
|
||||||
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
|
||||||
@@ -25,12 +26,14 @@ def data():
|
|||||||
@rights_bp.get('/add')
|
@rights_bp.get('/add')
|
||||||
@authorize("admin:power:add", log=True)
|
@authorize("admin:power:add", log=True)
|
||||||
def add():
|
def add():
|
||||||
|
"""获取增加视图"""
|
||||||
return render_template('admin/power/add.html')
|
return render_template('admin/power/add.html')
|
||||||
|
|
||||||
|
|
||||||
@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 = rights_curd.select_parent()
|
power_data = rights_curd.select_parent()
|
||||||
res = {
|
res = {
|
||||||
"status": {"code": 200, "message": "默认"},
|
"status": {"code": 200, "message": "默认"},
|
||||||
@@ -49,36 +52,41 @@ def save():
|
|||||||
return success_api(msg="成功")
|
return success_api(msg="成功")
|
||||||
|
|
||||||
|
|
||||||
# 权限编辑
|
@rights_api.resource('/power/<int:power_id>')
|
||||||
@rights_bp.get('/edit/<int:_id>')
|
class RightsURD(Resource):
|
||||||
@authorize("admin:power:edit", log=True)
|
@authorize("admin:power:edit", log=True)
|
||||||
def edit(_id):
|
def get(self, power_id):
|
||||||
power = rights_curd.get_power_by_id(_id)
|
power = rights_curd.get_power_by_id(power_id)
|
||||||
icon = str(power.icon).split()
|
icon = str(power.icon).split()
|
||||||
if len(icon) == 2:
|
if len(icon) == 2:
|
||||||
icon = icon[1]
|
icon = icon[1]
|
||||||
else:
|
else:
|
||||||
icon = None
|
icon = None
|
||||||
return render_template('admin/power/edit.html', power=power, icon=icon)
|
return make_response(render_template('admin/power/edit.html', power=power, icon=icon))
|
||||||
|
|
||||||
|
@authorize("admin:power:remove", log=True)
|
||||||
|
def delete(self, power_id):
|
||||||
|
r = rights_curd.remove_power(power_id)
|
||||||
|
if r:
|
||||||
|
return success_api(msg="删除成功")
|
||||||
|
else:
|
||||||
|
return fail_api(msg="删除失败")
|
||||||
|
|
||||||
# 权限更新
|
@authorize("admin:power:edit", log=True)
|
||||||
@rights_bp.put('/update')
|
def put(self, power_id):
|
||||||
@authorize("admin:power:edit", log=True)
|
res = rights_curd.update_power(request.json)
|
||||||
def update():
|
if not res:
|
||||||
res = rights_curd.update_power(request.json)
|
return fail_api(msg="更新权限失败")
|
||||||
if not res:
|
return success_api(msg="更新权限成功")
|
||||||
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)
|
||||||
def enable():
|
def enable():
|
||||||
_id = request.json.get('powerId')
|
power_id = request.json.get('powerId')
|
||||||
if id:
|
if id:
|
||||||
res = rights_curd.enable_status(_id)
|
res = rights_curd.enable_status(power_id)
|
||||||
if not res:
|
if not res:
|
||||||
return fail_api(msg="出错啦")
|
return fail_api(msg="出错啦")
|
||||||
return success_api(msg="启用成功")
|
return success_api(msg="启用成功")
|
||||||
@@ -98,17 +106,6 @@ def dis_enable():
|
|||||||
return fail_api(msg="数据错误")
|
return fail_api(msg="数据错误")
|
||||||
|
|
||||||
|
|
||||||
# 权限删除
|
|
||||||
@rights_bp.delete('/remove/<int:_id>')
|
|
||||||
@authorize("admin:power:remove", log=True)
|
|
||||||
def remove(_id):
|
|
||||||
r = rights_curd.remove_power(_id)
|
|
||||||
if r:
|
|
||||||
return success_api(msg="删除成功")
|
|
||||||
else:
|
|
||||||
return fail_api(msg="删除失败")
|
|
||||||
|
|
||||||
|
|
||||||
# 批量删除
|
# 批量删除
|
||||||
@rights_bp.delete('/batchRemove')
|
@rights_bp.delete('/batchRemove')
|
||||||
@authorize("admin:power:remove", log=True)
|
@authorize("admin:power:remove", log=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user