调整魔目录结构
This commit is contained in:
@@ -2,7 +2,6 @@ from applications.extensions import db
|
||||
from applications.models import Dept, DeptSchema
|
||||
from applications.models import User
|
||||
from applications.common.curd import model_to_dicts
|
||||
from flask import escape
|
||||
|
||||
|
||||
def get_dept_dict():
|
||||
@@ -12,14 +11,14 @@ def get_dept_dict():
|
||||
|
||||
|
||||
def save_dept(req):
|
||||
address = escape(req.get("address"))
|
||||
deptName = escape(req.get("deptName"))
|
||||
email = escape(req.get("email"))
|
||||
leader = escape(req.get("leader"))
|
||||
parentId = escape(req.get("parentId"))
|
||||
phone = escape(req.get("phone"))
|
||||
sort = escape(req.get("sort"))
|
||||
status = escape(req.get("status"))
|
||||
address = req.get("address")
|
||||
deptName = req.get("deptName")
|
||||
email = req.get("email")
|
||||
leader = req.get("leader")
|
||||
parentId = req.get("parentId")
|
||||
phone = req.get("phone")
|
||||
sort = req.get("sort")
|
||||
status = req.get("status")
|
||||
dept = Dept(
|
||||
parent_id=parentId,
|
||||
dept_name=deptName,
|
||||
@@ -65,13 +64,13 @@ def update_dept(json):
|
||||
""" 更新部门信息 """
|
||||
_id = json.get("deptId"),
|
||||
data = {
|
||||
"dept_name": escape(json.get("deptName")),
|
||||
"sort": escape(json.get("sort")),
|
||||
"leader": escape(json.get("leader")),
|
||||
"phone": escape(json.get("phone")),
|
||||
"email": escape(json.get("email")),
|
||||
"status": escape(json.get("status")),
|
||||
"address": escape(json.get("address"))
|
||||
"dept_name": json.get("deptName"),
|
||||
"sort": json.get("sort"),
|
||||
"leader": json.get("leader"),
|
||||
"phone": json.get("phone"),
|
||||
"email": json.get("email"),
|
||||
"status": json.get("status"),
|
||||
"address": json.get("address")
|
||||
}
|
||||
d = Dept.query.filter_by(id=_id).update(data)
|
||||
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 = [
|
||||
{'name': '基础课'},
|
||||
{'name': '进阶'},
|
||||
{'name': '高级开发'},
|
||||
{'name': '爬虫'},
|
||||
{'name': '数据分析'},
|
||||
{'name': '全栈课程'}
|
||||
|
||||
@@ -12,14 +12,14 @@
|
||||
<div class="layui-tab layui-tab-card">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this">登录日志</li>
|
||||
<li>操作日志</li>
|
||||
<li>访问日志</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show">
|
||||
<table style="margin-top: 10px;" id="log-login-table" lay-filter="log-login-table"></table>
|
||||
</div>
|
||||
<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>
|
||||
@@ -44,7 +44,7 @@
|
||||
let table = layui.table
|
||||
let form = layui.form
|
||||
|
||||
let MODULE_PATH = '/admin/log/'
|
||||
let MODULE_PATH = '/logs/'
|
||||
|
||||
let cols = [
|
||||
[
|
||||
@@ -61,8 +61,8 @@
|
||||
]
|
||||
|
||||
table.render({
|
||||
elem: '#log-operate-table',
|
||||
url: MODULE_PATH + 'operateLog',
|
||||
elem: '#log-access-table',
|
||||
url: MODULE_PATH + 'access_log',
|
||||
page: true,
|
||||
cols: cols,
|
||||
skin: 'line',
|
||||
@@ -71,7 +71,7 @@
|
||||
|
||||
table.render({
|
||||
elem: '#log-login-table',
|
||||
url: MODULE_PATH + 'loginLog',
|
||||
url: MODULE_PATH + 'login_log',
|
||||
page: true,
|
||||
cols: cols,
|
||||
skin: 'line',
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
let form = layui.form
|
||||
let $ = layui.jquery
|
||||
|
||||
// 当点击更新之后,获取数据
|
||||
form.on('submit(dept-update)', function (data) {
|
||||
$.ajax({
|
||||
url: '/dept/update',
|
||||
@@ -107,7 +108,7 @@
|
||||
success: function (result) {
|
||||
if (result.success) {
|
||||
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()
|
||||
})
|
||||
} else {
|
||||
|
||||
@@ -163,13 +163,16 @@
|
||||
|
||||
/*表格的工具栏*/
|
||||
table.on('toolbar(dept-table)', function (obj) {
|
||||
console.log(obj)
|
||||
if (obj.event === 'add') {
|
||||
window.add()
|
||||
} else if (obj.event === 'refresh') {
|
||||
window.refresh()
|
||||
} else if (obj.event === 'batchRemove') {
|
||||
{#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) {
|
||||
if (result.success) {
|
||||
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')
|
||||
})
|
||||
} else {
|
||||
|
||||
@@ -92,7 +92,9 @@
|
||||
</script>
|
||||
|
||||
<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 {{# } }}" }}>
|
||||
</script>
|
||||
|
||||
@@ -108,9 +110,11 @@
|
||||
</script>
|
||||
|
||||
<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 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>
|
||||
</script>
|
||||
|
||||
|
||||
+1
-1
@@ -210,7 +210,7 @@
|
||||
layer.close(index)
|
||||
let loading = layer.load()
|
||||
$.ajax({
|
||||
url: "{{ url_for('adminFile.batch_remove') }}",
|
||||
url: "{{ url_for('file.batch_remove') }}",
|
||||
data: { ids: ids },
|
||||
dataType: 'json',
|
||||
type: 'POST',
|
||||
+1
-1
@@ -43,7 +43,7 @@
|
||||
//选完文件后不自动上传
|
||||
upload.render({
|
||||
elem: '#logo-img'
|
||||
, url: "{{ url_for('adminFile.upload') }}"
|
||||
, url: "{{ url_for('file.upload') }}"
|
||||
, auto: false
|
||||
, exts: 'jpg|png|gif|bmp|jpeg'
|
||||
, size: 1000
|
||||
@@ -17,9 +17,12 @@
|
||||
<div class="layui-header">
|
||||
<!-- 顶 部 左 侧 功 能 -->
|
||||
<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="refresh layui-nav-item"><a href="#" class="layui-icon layui-icon-refresh-1" title="刷新页面"
|
||||
loading=600></a></li>
|
||||
<li class="collaspe layui-nav-item">
|
||||
<a href="#" class="layui-icon layui-icon-shrink-right"></a>
|
||||
</li>
|
||||
<li class="refresh layui-nav-item">
|
||||
<a href="#" class="layui-icon layui-icon-refresh-1" title="刷新页面" loading=600></a>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- 顶 部 右 侧 菜 单 -->
|
||||
<div id="control" class="layui-layout-control"></div>
|
||||
@@ -66,7 +69,9 @@
|
||||
<!-- 遮 盖 层 -->
|
||||
<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"></div>
|
||||
|
||||
@@ -39,51 +39,56 @@
|
||||
</form>
|
||||
{% include 'admin/common/footer.html' %}
|
||||
<script>
|
||||
layui.use(['form', 'jquery', 'layer', 'button', 'popup'], function () {
|
||||
let form = layui.form;
|
||||
let $ = layui.jquery;
|
||||
let layer = layui.layer;
|
||||
let button = layui.button;
|
||||
let popup = layui.popup;
|
||||
let captchaPath = "{{ url_for('passport.get_captcha') }}";
|
||||
layui.use(['form', 'jquery', 'layer', 'button', 'popup'], function () {
|
||||
let form = layui.form
|
||||
let $ = layui.jquery
|
||||
let layer = layui.layer
|
||||
let button = layui.button
|
||||
let popup = layui.popup
|
||||
let captchaPath = "{{ url_for('passport.get_captcha') }}"
|
||||
|
||||
form.on('submit(login)', function (data) {
|
||||
let loader = layer.load();
|
||||
let btn = button.load({elem: '.login'});
|
||||
$.ajax({
|
||||
data: data.field,
|
||||
type: "post",
|
||||
dataType: 'json',
|
||||
success: function (result) {
|
||||
layer.close(loader);
|
||||
btn.stop(function () {
|
||||
if (result.success) {
|
||||
popup.success(result.msg, function () {
|
||||
location.href = "{{ url_for('admin.index') }}";
|
||||
})
|
||||
} else {
|
||||
popup.failure(result.msg, function () {
|
||||
document.getElementById("captchaImage").src = captchaPath + "?" + Math.random();
|
||||
});
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
$("#captchaImage").click(function () {
|
||||
document.getElementById("captchaImage").src = captchaPath + "?" + Math.random();
|
||||
});
|
||||
setInterval(function () {
|
||||
document.getElementById("captchaImage").src = captchaPath + "?" + Math.random();
|
||||
}, 30 * 1000);
|
||||
form.on('submit(login)', function (data) {
|
||||
// data 是表单的数据
|
||||
let loader = layer.load() // 加载按钮
|
||||
let btn = button.load({ elem: '.login' })
|
||||
$.ajax({
|
||||
data: data.field,
|
||||
type: 'post',
|
||||
dataType: 'json',
|
||||
// 请求成功之后返回的数据
|
||||
success: function (result) {
|
||||
layer.close(loader) // 关闭加载按钮
|
||||
btn.stop(function () {
|
||||
if (result.success) {
|
||||
popup.success(result.msg, function () {
|
||||
location.href = "{{ url_for('admin.index') }}"
|
||||
})
|
||||
} else {
|
||||
popup.failure(result.msg, function () {
|
||||
document.getElementById('captchaImage').src = captchaPath + '?' + Math.random()
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
return false
|
||||
})
|
||||
|
||||
// 点击按钮更新验证码
|
||||
$('#captchaImage').click(function () {
|
||||
document.getElementById('captchaImage').src = captchaPath + '?' + Math.random()
|
||||
})
|
||||
|
||||
// 定时器,定时更新验证码
|
||||
setInterval(function () {
|
||||
document.getElementById('captchaImage').src = captchaPath + '?' + Math.random()
|
||||
}, 30 * 1000)
|
||||
})
|
||||
</script>
|
||||
<script>
|
||||
if (window !== top) {
|
||||
top.location.href = location.href;
|
||||
}
|
||||
if (window !== top) {
|
||||
top.location.href = location.href
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -137,8 +137,9 @@
|
||||
|
||||
form.on('submit(power-save)', function (data) {
|
||||
data.field.icon = 'layui-icon ' + data.field.icon
|
||||
console.log(data.field)
|
||||
$.ajax({
|
||||
url: '{{ url_for('rights.update') }}',
|
||||
url: '/rights/power/' + data.field.powerId ,
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
toolbar: '#power-toolbar',
|
||||
elem: '#power-table',
|
||||
url: '{{ url_for('rights.data') }}',
|
||||
page: false,
|
||||
page: false,
|
||||
cols: [
|
||||
[
|
||||
{% if authorize("admin:role:remove") %}
|
||||
@@ -212,7 +212,7 @@
|
||||
title: '修改',
|
||||
shade: 0.1,
|
||||
area: ['450px', '500px'],
|
||||
content: MODULE_PATH + 'edit/' + obj.data['powerId']
|
||||
content: MODULE_PATH + 'power/' + obj.data['powerId']
|
||||
})
|
||||
}
|
||||
window.remove = function (obj) {
|
||||
@@ -220,7 +220,7 @@
|
||||
layer.close(index)
|
||||
let loading = layer.load()
|
||||
$.ajax({
|
||||
url: MODULE_PATH + 'remove/' + obj.data['powerId'],
|
||||
url: MODULE_PATH + 'power/' + obj.data['powerId'],
|
||||
dataType: 'json',
|
||||
type: 'delete',
|
||||
success: function (result) {
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
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.index import admin_bp
|
||||
from applications.view.admin.file import admin_file
|
||||
from applications.view.rights.role import admin_role
|
||||
from applications.view.admin.file import file_bp
|
||||
from applications.view.rights.role import role_bp
|
||||
from applications.view.company.users import users_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):
|
||||
app.register_blueprint(admin_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_log)
|
||||
app.register_blueprint(admin_role)
|
||||
app.register_blueprint(role_bp)
|
||||
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)
|
||||
type_name = request.args.get('typeName', type=str)
|
||||
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')
|
||||
|
||||
@@ -7,18 +7,18 @@ from applications.extensions import db
|
||||
from applications.models import Photo
|
||||
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)
|
||||
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)
|
||||
def table():
|
||||
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)
|
||||
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)
|
||||
def upload_api():
|
||||
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)
|
||||
def delete():
|
||||
_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)
|
||||
def batch_remove():
|
||||
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_login import current_user, login_user, login_required, logout_user
|
||||
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.utils.http import fail_api, success_api
|
||||
from applications.models import User
|
||||
from ._utils import get_captcha_image, add_auth_session
|
||||
|
||||
passport_bp = Blueprint('passport', __name__, url_prefix='/passport')
|
||||
passport_api = Api(passport_bp)
|
||||
@@ -17,7 +17,7 @@ def register_passport_views(app):
|
||||
# 获取验证码
|
||||
@passport_bp.get('/getCaptcha')
|
||||
def get_captcha():
|
||||
resp, code = index_curd.get_captcha()
|
||||
resp, code = get_captcha_image()
|
||||
session["code"] = code
|
||||
return resp
|
||||
|
||||
@@ -57,7 +57,7 @@ class Login(Resource):
|
||||
# 记录登录日志
|
||||
login_log(request, uid=user.id, is_access=True)
|
||||
# 存入权限
|
||||
index_curd.add_auth_session()
|
||||
add_auth_session()
|
||||
return success_api(msg="登录成功")
|
||||
login_log(request, uid=user.id, is_access=False)
|
||||
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_restful import Api
|
||||
|
||||
rights_bp = Blueprint('rights', __name__, url_prefix='/rights')
|
||||
rights_api = Api(rights_bp)
|
||||
|
||||
from . import routes
|
||||
from . import view
|
||||
|
||||
@@ -1,75 +1,10 @@
|
||||
from collections import OrderedDict
|
||||
import copy
|
||||
from collections import OrderedDict
|
||||
|
||||
from io import BytesIO
|
||||
from flask import session, make_response, current_app
|
||||
from flask import current_app
|
||||
from flask_login import current_user
|
||||
|
||||
from applications.common.utils.gen_captcha import gen_captcha
|
||||
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
|
||||
from applications.models import PowerSchema
|
||||
|
||||
|
||||
def get_render_config():
|
||||
@@ -142,3 +77,41 @@ def get_render_config():
|
||||
"autoHead": False
|
||||
}, header=False)
|
||||
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
|
||||
|
||||
|
||||
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)
|
||||
def main():
|
||||
return render_template('admin/role/main.html')
|
||||
|
||||
|
||||
# 表格数据
|
||||
@admin_role.get('/data')
|
||||
@role_bp.get('/data')
|
||||
@authorize("admin:role:main", log=True)
|
||||
def table():
|
||||
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)
|
||||
@login_required
|
||||
def add():
|
||||
@@ -41,7 +41,7 @@ def add():
|
||||
|
||||
|
||||
# 角色增加
|
||||
@admin_role.post('/save')
|
||||
@role_bp.post('/save')
|
||||
@authorize("admin:role:add", log=True)
|
||||
def save():
|
||||
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)
|
||||
def power(_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)
|
||||
def 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)
|
||||
def save_role_power():
|
||||
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)
|
||||
def edit(_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)
|
||||
def update():
|
||||
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)
|
||||
def enable():
|
||||
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)
|
||||
def dis_enable():
|
||||
_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)
|
||||
def remove(_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)
|
||||
@login_required
|
||||
def batch_remove():
|
||||
|
||||
@@ -3,18 +3,19 @@ from flask import jsonify
|
||||
from flask_login import login_required
|
||||
|
||||
from . import rights_bp
|
||||
from ...common.admin import index_curd
|
||||
|
||||
from ._utils import get_render_config, make_menu_tree
|
||||
|
||||
|
||||
@rights_bp.get('/configs')
|
||||
@login_required
|
||||
def configs():
|
||||
return index_curd.get_render_config()
|
||||
return get_render_config()
|
||||
|
||||
|
||||
# 菜单
|
||||
@rights_bp.get('/menu')
|
||||
@login_required
|
||||
def menu():
|
||||
menu_tree = index_curd.make_menu_tree()
|
||||
menu_tree = make_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.utils.http import success_api, fail_api
|
||||
from ...common.utils.rights import authorize
|
||||
@@ -25,12 +26,14 @@ def data():
|
||||
@rights_bp.get('/add')
|
||||
@authorize("admin:power:add", log=True)
|
||||
def add():
|
||||
"""获取增加视图"""
|
||||
return render_template('admin/power/add.html')
|
||||
|
||||
|
||||
@rights_bp.get('/selectParent')
|
||||
@authorize("admin:power:main", log=True)
|
||||
def select_parent():
|
||||
"""获取选择父节点"""
|
||||
power_data = rights_curd.select_parent()
|
||||
res = {
|
||||
"status": {"code": 200, "message": "默认"},
|
||||
@@ -49,36 +52,41 @@ def save():
|
||||
return success_api(msg="成功")
|
||||
|
||||
|
||||
# 权限编辑
|
||||
@rights_bp.get('/edit/<int:_id>')
|
||||
@authorize("admin:power:edit", log=True)
|
||||
def edit(_id):
|
||||
power = rights_curd.get_power_by_id(_id)
|
||||
icon = str(power.icon).split()
|
||||
if len(icon) == 2:
|
||||
icon = icon[1]
|
||||
else:
|
||||
icon = None
|
||||
return render_template('admin/power/edit.html', power=power, icon=icon)
|
||||
@rights_api.resource('/power/<int:power_id>')
|
||||
class RightsURD(Resource):
|
||||
@authorize("admin:power:edit", log=True)
|
||||
def get(self, power_id):
|
||||
power = rights_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/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="删除失败")
|
||||
|
||||
# 权限更新
|
||||
@rights_bp.put('/update')
|
||||
@authorize("admin:power:edit", log=True)
|
||||
def update():
|
||||
res = rights_curd.update_power(request.json)
|
||||
if not res:
|
||||
return fail_api(msg="更新权限失败")
|
||||
return success_api(msg="更新权限成功")
|
||||
@authorize("admin:power:edit", log=True)
|
||||
def put(self, power_id):
|
||||
res = rights_curd.update_power(request.json)
|
||||
if not res:
|
||||
return fail_api(msg="更新权限失败")
|
||||
return success_api(msg="更新权限成功")
|
||||
|
||||
|
||||
# 启用权限
|
||||
@rights_bp.put('/enable')
|
||||
@authorize("admin:power:edit", log=True)
|
||||
def enable():
|
||||
_id = request.json.get('powerId')
|
||||
power_id = request.json.get('powerId')
|
||||
if id:
|
||||
res = rights_curd.enable_status(_id)
|
||||
res = rights_curd.enable_status(power_id)
|
||||
if not res:
|
||||
return fail_api(msg="出错啦")
|
||||
return success_api(msg="启用成功")
|
||||
@@ -98,17 +106,6 @@ def dis_enable():
|
||||
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')
|
||||
@authorize("admin:power:remove", log=True)
|
||||
|
||||
Reference in New Issue
Block a user