refactor(api):前后端半分离
This commit is contained in:
@@ -30,29 +30,9 @@ def create_app(config_name=None):
|
||||
configure_uploads(app, photos)
|
||||
|
||||
logo()
|
||||
register_shell(app)
|
||||
return app
|
||||
|
||||
|
||||
def register_shell(app: Flask):
|
||||
@app.cli.command()
|
||||
def create():
|
||||
"""测试关系"""
|
||||
from .extensions import db
|
||||
from .models import Power, User
|
||||
from .models import PowerSchema
|
||||
power_schema = PowerSchema(many=True) # 用已继承 ma.ModelSchema 类的自定制类生成序列化类
|
||||
user = User.query.get(1)
|
||||
power_list = []
|
||||
for role in user.role:
|
||||
if role.enable:
|
||||
for power in role.power:
|
||||
# 权限被启用
|
||||
if power.enable and power:
|
||||
power_list.append(power)
|
||||
power_dict = sorted(power_list, key=lambda i: i['sort'])
|
||||
|
||||
|
||||
def logo():
|
||||
print('''
|
||||
_____ _ _ ______ _ _
|
||||
|
||||
@@ -11,5 +11,5 @@ def init_plugs(app: Flask) -> None:
|
||||
init_login_manager(app)
|
||||
init_databases(app)
|
||||
init_template_directives(app)
|
||||
init_error_views(app)
|
||||
# init_error_views(app)
|
||||
register_script(app)
|
||||
|
||||
@@ -10,6 +10,29 @@
|
||||
<table id="dataTable" lay-filter="dataTable"></table>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
{#添加文件内容#}
|
||||
<div id="add_view" class="layui-row layui-col-space15 " style="margin: 10px;display: none">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-tab-content">
|
||||
<fieldset class="layui-elem-field layui-field-title">
|
||||
<legend>新增图片</legend>
|
||||
</fieldset>
|
||||
<form class="layui-form edit-form">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">
|
||||
新增图片
|
||||
</label>
|
||||
<button type="button" class="layui-btn layui-btn-normal" id="logo-img">选择文件</button>
|
||||
<button type="button" class="layui-btn" id="logo-upload-button">开始上传</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/html" id="toolbar">
|
||||
{% if authorize("admin:file:add") %}
|
||||
@@ -28,19 +51,23 @@
|
||||
|
||||
<script type="text/html" id="user-bar">
|
||||
{% if authorize("admin:file:delete") %}
|
||||
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i
|
||||
class="layui-icon layui-icon-delete"></i></button>
|
||||
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove">
|
||||
<i class="layui-icon layui-icon-delete"></i>
|
||||
</button>
|
||||
{% endif %}
|
||||
</script>
|
||||
<script type="text/html" id="file-uploadTime">
|
||||
{{ ' {{layui.util.toDateString(d.create_time, "yyyy-MM-dd HH:mm:ss")}' |safe }}}
|
||||
</script>
|
||||
|
||||
{% include 'admin/common/footer.html' %}
|
||||
<script>
|
||||
layui.use(['table', 'form', 'jquery'], function () {
|
||||
layui.use(['table', 'form', 'jquery', 'element', 'form', 'upload'], function () {
|
||||
let table = layui.table
|
||||
let form = layui.form
|
||||
let $ = layui.jquery
|
||||
let upload = layui.upload
|
||||
|
||||
let cols = [
|
||||
[
|
||||
{
|
||||
@@ -145,12 +172,12 @@
|
||||
|
||||
window.add = function () {
|
||||
layer.open({
|
||||
type: 2,
|
||||
type: 1,
|
||||
maxmin: true,
|
||||
title: '新增图片',
|
||||
shade: 0.1,
|
||||
area: screen(),
|
||||
content: 'upload'
|
||||
content: $('#add_view')
|
||||
})
|
||||
}
|
||||
|
||||
@@ -266,5 +293,26 @@
|
||||
}
|
||||
}
|
||||
|
||||
/*上次文件部分*/
|
||||
// 选完文件后不自动上传
|
||||
upload.render({
|
||||
elem: '#logo-img'
|
||||
, url: "{{ url_for('file.upload') }}"
|
||||
, auto: false
|
||||
, exts: 'jpg|png|gif|bmp|jpeg'
|
||||
, size: 1000
|
||||
, bindAction: '#logo-upload-button'
|
||||
, done: function (res) {
|
||||
if (res.success) {
|
||||
layer.msg(res.msg, { icon: 1, time: 500 }, function () {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window.name))//关闭当前页
|
||||
window.parent.location.reload()
|
||||
})
|
||||
} else {
|
||||
layer.msg(res.msg, { icon: 2 })
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
</script>
|
||||
</script>
|
||||
</html>
|
||||
@@ -1,65 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
{% include 'admin/common/header.html' %}
|
||||
<style>
|
||||
.pear-container {
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 10px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="layui-row layui-col-space15">
|
||||
<div class="layui-col-md12">
|
||||
<div class="layui-card">
|
||||
<div class="layui-tab-content">
|
||||
<fieldset class="layui-elem-field layui-field-title">
|
||||
<legend>新增图片</legend>
|
||||
</fieldset>
|
||||
<form class="layui-form edit-form">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">
|
||||
新增图片
|
||||
</label>
|
||||
<button type="button" class="layui-btn layui-btn-normal" id="logo-img">选择文件</button>
|
||||
<button type="button" class="layui-btn" id="logo-upload-button">开始上传</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% include 'admin/common/footer.html' %}
|
||||
<script>
|
||||
layui.use(['jquery', 'element', 'form', 'upload'], function () {
|
||||
var $ = layui.jquery;
|
||||
var element = layui.element;
|
||||
var form = layui.form;
|
||||
var upload = layui.upload;
|
||||
//选完文件后不自动上传
|
||||
upload.render({
|
||||
elem: '#logo-img'
|
||||
, url: "{{ url_for('file.upload') }}"
|
||||
, auto: false
|
||||
, exts: 'jpg|png|gif|bmp|jpeg'
|
||||
, size: 1000
|
||||
, bindAction: '#logo-upload-button'
|
||||
, done: function (res) {
|
||||
if (res.success) {
|
||||
layer.msg(res.msg, {icon: 1, time: 500}, function () {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window.name));//关闭当前页
|
||||
window.parent.location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.msg(res.msg, {icon: 2});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -61,7 +61,7 @@
|
||||
btn.stop(function () {
|
||||
if (result.success) {
|
||||
popup.success(result.msg, function () {
|
||||
location.href = "{{ url_for('admin.index') }}"
|
||||
location.href = "{{ url_for('index.admin_index') }}"
|
||||
})
|
||||
} else {
|
||||
popup.failure(result.msg, function () {
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
formData.append('fileToken', timeStamp)
|
||||
$.ajax({
|
||||
method: 'post',
|
||||
url: '/admin/file/upload', //用于文件上传的服务器端请求地址
|
||||
url: '/file/upload', //用于文件上传的服务器端请求地址
|
||||
data: formData,
|
||||
processData: false,
|
||||
contentType: false,
|
||||
|
||||
@@ -23,10 +23,14 @@
|
||||
<body>
|
||||
<!-- header -->
|
||||
<div class="ew-header">
|
||||
<img class="layui-logo" src="{{ url_for('static', filename='/index/images/un28.svg') }}"
|
||||
style="height:50px;padding: 10px;"/>
|
||||
<img class="layui-logo"
|
||||
src="{{ url_for('static', filename='/index/images/un28.svg') }}"
|
||||
style="height:50px;padding: 10px;"
|
||||
/>
|
||||
<div class="ew-nav-group">
|
||||
<div class="nav-toggle"><i class="layui-icon layui-icon-more-vertical"></i></div>
|
||||
<div class="nav-toggle">
|
||||
<i class="layui-icon layui-icon-more-vertical"></i>
|
||||
</div>
|
||||
<ul class="layui-nav" lay-filter="ew-header-nav">
|
||||
<li class="layui-nav-item">
|
||||
<a lay-href="/">首页</a>
|
||||
|
||||
@@ -1,13 +1,21 @@
|
||||
from applications.view.system import register_system_views
|
||||
from applications.view.index import register_index_views
|
||||
from applications.view.passport import register_passport_views
|
||||
from applications.view.rights import register_rights_view
|
||||
from applications.view.department import register_dept_views
|
||||
from flask import Flask
|
||||
|
||||
from .department import dept_bp
|
||||
from .file import file_bp
|
||||
from .index import index_bp
|
||||
from .logs_view import logs_bp
|
||||
from .passport import passport_bp
|
||||
from .rights import rights_bp
|
||||
from .roles import role_bp
|
||||
from .users import users_bp
|
||||
|
||||
|
||||
def init_view(app):
|
||||
register_system_views(app)
|
||||
register_index_views(app)
|
||||
register_rights_view(app)
|
||||
register_passport_views(app)
|
||||
register_dept_views(app)
|
||||
def init_view(app: Flask):
|
||||
app.register_blueprint(dept_bp)
|
||||
app.register_blueprint(file_bp)
|
||||
app.register_blueprint(index_bp)
|
||||
app.register_blueprint(logs_bp)
|
||||
app.register_blueprint(passport_bp)
|
||||
app.register_blueprint(rights_bp)
|
||||
app.register_blueprint(role_bp)
|
||||
app.register_blueprint(users_bp)
|
||||
|
||||
@@ -11,10 +11,6 @@ dept_bp = Blueprint('dept', __name__, url_prefix='/dept')
|
||||
dept_api = Api(dept_bp)
|
||||
|
||||
|
||||
def register_dept_views(app):
|
||||
app.register_blueprint(dept_bp)
|
||||
|
||||
|
||||
@dept_bp.get('/')
|
||||
@authorize("admin:dept:main", log=True)
|
||||
def main():
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
import os
|
||||
|
||||
from flask import Blueprint, request, render_template, current_app
|
||||
from flask_restful import marshal
|
||||
from sqlalchemy import desc
|
||||
|
||||
from applications.common.serialization import photo_fields
|
||||
from applications.common.utils.http import table_api, success_api, fail_api
|
||||
from applications.common.utils.rights import authorize
|
||||
from applications.extensions import db
|
||||
from applications.models import Photo
|
||||
|
||||
file_bp = Blueprint('file', __name__, url_prefix='/file')
|
||||
|
||||
|
||||
# 图片管理
|
||||
@file_bp.get('/')
|
||||
@authorize("admin:file:main", log=True)
|
||||
def index():
|
||||
return render_template('admin/file/photo.html')
|
||||
|
||||
|
||||
# 图片数据
|
||||
@file_bp.get('/table')
|
||||
@authorize("admin:file:main", log=True)
|
||||
def table():
|
||||
page = request.args.get('page', type=int)
|
||||
limit = request.args.get('limit', type=int)
|
||||
photo_paginate = Photo.query.order_by(desc(Photo.create_time)).paginate(page=page, per_page=limit, error_out=False)
|
||||
data = marshal(photo_paginate.items, photo_fields)
|
||||
return table_api(data=data, count=photo_paginate.total)
|
||||
|
||||
|
||||
# 图片批量删除
|
||||
@file_bp.route('/batchRemove', methods=['GET', 'POST'])
|
||||
@authorize("admin:file:delete", log=True)
|
||||
def batch_remove():
|
||||
ids = request.form.getlist('ids[]')
|
||||
photo_name = Photo.query.filter(Photo.id.in_(ids)).all()
|
||||
upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST")
|
||||
for p in photo_name:
|
||||
os.remove(upload_url + '/' + p.name)
|
||||
photo = Photo.query.filter(Photo.id.in_(ids)).delete(synchronize_session=False)
|
||||
db.session.commit()
|
||||
if photo:
|
||||
return success_api(msg="删除成功")
|
||||
else:
|
||||
return fail_api(msg="删除失败")
|
||||
|
||||
|
||||
from . import file
|
||||
|
||||
@@ -1,43 +1,19 @@
|
||||
import os
|
||||
from flask import Blueprint, request, render_template, jsonify, current_app, make_response
|
||||
from flask_restful import Api, Resource, marshal
|
||||
from sqlalchemy import desc
|
||||
from flask import request, jsonify
|
||||
from flask_restful import Api, Resource
|
||||
|
||||
from applications.common.serialization import photo_fields
|
||||
from applications.common.utils.http import fail_api, success_api, table_api
|
||||
from applications.common.utils.http import fail_api, success_api
|
||||
from applications.common.utils.rights import authorize
|
||||
from applications.extensions import db
|
||||
from applications.models import Photo
|
||||
from applications.view.file import file_bp
|
||||
from applications.view.file._utils import upload_one, delete_photo_by_id
|
||||
|
||||
from applications.view.file._utils import delete_photo_by_id, upload_one
|
||||
|
||||
file_bp = Blueprint('file', __name__, url_prefix='/file')
|
||||
file_api = Api(file_bp)
|
||||
|
||||
|
||||
# 图片管理
|
||||
@file_bp.get('/')
|
||||
@authorize("admin:file:main", log=True)
|
||||
def index():
|
||||
return render_template('admin/file/photo.html')
|
||||
|
||||
|
||||
# 图片数据
|
||||
@file_bp.get('/table')
|
||||
@authorize("admin:file:main", log=True)
|
||||
def table():
|
||||
page = request.args.get('page', type=int)
|
||||
limit = request.args.get('limit', type=int)
|
||||
photo_paginate = Photo.query.order_by(desc(Photo.create_time)).paginate(page=page, per_page=limit, error_out=False)
|
||||
data = marshal(photo_paginate.items, photo_fields)
|
||||
return table_api(data=data, count=photo_paginate.total)
|
||||
|
||||
|
||||
@file_api.resource('/upload')
|
||||
class Upload(Resource):
|
||||
@authorize("admin:file:add", log=True)
|
||||
def get(self):
|
||||
return make_response(render_template('admin/file/photo_add.html'))
|
||||
# @authorize("admin:file:add", log=True)
|
||||
# def get(self):
|
||||
# return make_response(render_template('admin/file/photo_add.html'))
|
||||
|
||||
@authorize("admin:file:add", log=True)
|
||||
def post(self):
|
||||
@@ -66,18 +42,3 @@ class Upload(Resource):
|
||||
return fail_api(msg="删除失败")
|
||||
|
||||
|
||||
# 图片批量删除
|
||||
@file_bp.route('/batchRemove', methods=['GET', 'POST'])
|
||||
@authorize("admin:file:delete", log=True)
|
||||
def batch_remove():
|
||||
ids = request.form.getlist('ids[]')
|
||||
photo_name = Photo.query.filter(Photo.id.in_(ids)).all()
|
||||
upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST")
|
||||
for p in photo_name:
|
||||
os.remove(upload_url + '/' + p.name)
|
||||
photo = Photo.query.filter(Photo.id.in_(ids)).delete(synchronize_session=False)
|
||||
db.session.commit()
|
||||
if photo:
|
||||
return success_api(msg="删除成功")
|
||||
else:
|
||||
return fail_api(msg="删除失败")
|
||||
|
||||
@@ -1,14 +1,24 @@
|
||||
from flask import Blueprint
|
||||
from flask import render_template
|
||||
from flask_login import login_required, current_user
|
||||
|
||||
index_bp = Blueprint('index', __name__, url_prefix='/')
|
||||
|
||||
from . import index
|
||||
index_bp = Blueprint('index', __name__)
|
||||
|
||||
|
||||
def register_index_views(app):
|
||||
"""
|
||||
初始化蓝图
|
||||
@index_bp.route('/')
|
||||
def index():
|
||||
return render_template('index/index.html')
|
||||
|
||||
"""
|
||||
|
||||
app.register_blueprint(index_bp)
|
||||
# 首页
|
||||
@index_bp.get('/admin')
|
||||
@login_required
|
||||
def admin_index():
|
||||
return render_template('admin/index.html', user=current_user)
|
||||
|
||||
|
||||
# 控制台页面
|
||||
@index_bp.get('/admin/welcome')
|
||||
@login_required
|
||||
def welcome():
|
||||
return render_template('admin/console/welcome.html')
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
from flask import render_template
|
||||
|
||||
from . import index_bp
|
||||
|
||||
|
||||
@index_bp.route('/')
|
||||
def index():
|
||||
return render_template('index/index.html')
|
||||
@@ -7,16 +7,16 @@ from applications.common.utils.http import table_api
|
||||
from applications.common.utils.rights import authorize
|
||||
from applications.models import AdminLog
|
||||
|
||||
admin_log = Blueprint('logs', __name__, url_prefix='/logs')
|
||||
logs_bp = Blueprint('logs', __name__, url_prefix='/logs')
|
||||
|
||||
|
||||
@admin_log.get('/')
|
||||
@logs_bp.get('/')
|
||||
@authorize("admin:log:main")
|
||||
def index():
|
||||
return render_template('admin/admin_log/main.html')
|
||||
|
||||
|
||||
@admin_log.get('/login_log')
|
||||
@logs_bp.get('/login_log')
|
||||
@authorize("admin:log:main")
|
||||
def login_log():
|
||||
page = request.args.get('page', type=int)
|
||||
@@ -30,7 +30,7 @@ def login_log():
|
||||
return table_api(data=data, count=log_paginate.total)
|
||||
|
||||
|
||||
@admin_log.get('/access_log')
|
||||
@logs_bp.get('/access_log')
|
||||
@authorize("admin:log:main")
|
||||
def operate_log():
|
||||
page = request.args.get('page', type=int)
|
||||
@@ -1,17 +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_log import login_log
|
||||
from applications.common.utils.http import fail_api, success_api
|
||||
from applications.models import User
|
||||
from flask import Blueprint, session
|
||||
from flask_login import login_required, logout_user
|
||||
|
||||
from applications.common.utils.http import success_api
|
||||
from ._utils import get_captcha_image, add_auth_session
|
||||
|
||||
passport_bp = Blueprint('passport', __name__, url_prefix='/passport')
|
||||
passport_api = Api(passport_bp)
|
||||
|
||||
|
||||
def register_passport_views(app):
|
||||
app.register_blueprint(passport_bp)
|
||||
|
||||
|
||||
# 获取验证码
|
||||
@@ -22,47 +15,6 @@ def get_captcha():
|
||||
return resp
|
||||
|
||||
|
||||
@passport_api.resource('/login')
|
||||
class Login(Resource):
|
||||
login_req = reqparse.RequestParser(bundle_errors=True)
|
||||
login_req.add_argument('username', type=str, help='请输入用户名', required=True)
|
||||
login_req.add_argument('password', type=str, help='请输入密码', required=True)
|
||||
login_req.add_argument('captcha', type=str, help='请输入验证码', required=True)
|
||||
|
||||
def get(self):
|
||||
if current_user.is_authenticated:
|
||||
return redirect(url_for('admin.index'))
|
||||
|
||||
return make_response(render_template('admin/login.html'))
|
||||
|
||||
def post(self):
|
||||
|
||||
req = self.login_req.parse_args()
|
||||
|
||||
s_code = session.get("code", None)
|
||||
|
||||
if req.captcha != s_code:
|
||||
return fail_api(msg="验证码错误")
|
||||
user = User.query.filter_by(username=req.username).first()
|
||||
|
||||
if user is None:
|
||||
return fail_api(msg="不存在的用户")
|
||||
|
||||
if user.enable is 0:
|
||||
return fail_api(msg="用户被暂停使用")
|
||||
|
||||
if user.validate_password(req.password):
|
||||
# 登录
|
||||
login_user(user)
|
||||
# 记录登录日志
|
||||
login_log(request, uid=user.id, is_access=True)
|
||||
# 存入权限
|
||||
add_auth_session()
|
||||
return success_api(msg="登录成功")
|
||||
login_log(request, uid=user.id, is_access=False)
|
||||
return fail_api(msg="用户名或密码错误")
|
||||
|
||||
|
||||
# 退出登录
|
||||
@passport_bp.post('/logout')
|
||||
@login_required
|
||||
@@ -70,3 +22,6 @@ def logout():
|
||||
logout_user()
|
||||
session.pop('permissions')
|
||||
return success_api(msg="注销成功")
|
||||
|
||||
|
||||
from . import api
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
from flask import session, redirect, url_for, request
|
||||
from flask_login import current_user, login_user
|
||||
from flask_restful import Resource, reqparse, Api
|
||||
from applications.common.admin_log import login_log
|
||||
from applications.common.utils.http import fail_api, success_api
|
||||
from applications.models import User
|
||||
from . import passport_bp
|
||||
from ._utils import add_auth_session
|
||||
|
||||
from flask import render_template, make_response
|
||||
|
||||
passport_api = Api(passport_bp)
|
||||
|
||||
|
||||
@passport_api.resource('/login')
|
||||
class Login(Resource):
|
||||
login_req = reqparse.RequestParser(bundle_errors=True)
|
||||
login_req.add_argument('username', type=str, help='请输入用户名', required=True)
|
||||
login_req.add_argument('password', type=str, help='请输入密码', required=True)
|
||||
login_req.add_argument('captcha', type=str, help='请输入验证码', required=True)
|
||||
|
||||
def get(self):
|
||||
if current_user.is_authenticated:
|
||||
return redirect(url_for('admin.index'))
|
||||
# TODO 分离视图操作 最终实现接口登录与视图登录两套逻辑
|
||||
return make_response(render_template('admin/login.html'))
|
||||
|
||||
def post(self):
|
||||
|
||||
req = self.login_req.parse_args()
|
||||
|
||||
s_code = session.get("code", None)
|
||||
|
||||
if req.captcha != s_code:
|
||||
return fail_api(msg="验证码错误")
|
||||
user = User.query.filter_by(username=req.username).first()
|
||||
|
||||
if user is None:
|
||||
return fail_api(msg="不存在的用户")
|
||||
|
||||
if user.enable is 0:
|
||||
return fail_api(msg="用户被暂停使用")
|
||||
|
||||
if user.validate_password(req.password):
|
||||
# 登录
|
||||
login_user(user)
|
||||
# 记录登录日志
|
||||
login_log(request, uid=user.id, is_access=True)
|
||||
# 存入权限
|
||||
add_auth_session()
|
||||
return success_api(msg="登录成功")
|
||||
login_log(request, uid=user.id, is_access=False)
|
||||
return fail_api(msg="用户名或密码错误")
|
||||
@@ -1,12 +1,17 @@
|
||||
from flask import Blueprint, Flask
|
||||
from flask import Blueprint, render_template
|
||||
from flask_restful import Api
|
||||
|
||||
from ...common.utils.rights import authorize
|
||||
|
||||
rights_bp = Blueprint('rights', __name__, url_prefix='/rights')
|
||||
rights_api = Api(rights_bp)
|
||||
|
||||
|
||||
@rights_bp.get('/')
|
||||
@authorize("admin:power:main", log=True)
|
||||
def index():
|
||||
return render_template('admin/rights/main.html')
|
||||
|
||||
|
||||
from . import routes
|
||||
from . import right
|
||||
|
||||
|
||||
def register_rights_view(app: Flask):
|
||||
app.register_blueprint(rights_bp)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from flask import render_template, request, jsonify, make_response
|
||||
from flask import request, jsonify
|
||||
from flask_restful import Resource, reqparse
|
||||
|
||||
from . import rights_bp, rights_api
|
||||
@@ -8,6 +8,9 @@ from ...common.utils.rights import authorize
|
||||
from ...extensions import db
|
||||
from ...models import Power, Role
|
||||
|
||||
# TODO 分离视图操作
|
||||
from flask import render_template, make_response
|
||||
|
||||
parser_power = reqparse.RequestParser(bundle_errors=True)
|
||||
parser_power.add_argument('icon', type=str)
|
||||
parser_power.add_argument('openType', type=str, dest='open_type')
|
||||
@@ -19,12 +22,6 @@ parser_power.add_argument('powerUrl', type=str, dest='power_url')
|
||||
parser_power.add_argument('sort', type=int, dest='sort')
|
||||
|
||||
|
||||
@rights_bp.get('/')
|
||||
@authorize("admin:power:main", log=True)
|
||||
def index():
|
||||
return render_template('admin/rights/main.html')
|
||||
|
||||
|
||||
@rights_bp.get('/data')
|
||||
@authorize("admin:power:main", log=True)
|
||||
def data():
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
from flask import Blueprint, render_template
|
||||
|
||||
from applications.common.utils.rights import authorize
|
||||
|
||||
from applications.view.roles._utils import remove_role, batch_remove_role
|
||||
|
||||
role_bp = Blueprint('role', __name__, url_prefix='/admin/role')
|
||||
|
||||
|
||||
# 角色而管理
|
||||
@role_bp.get('/')
|
||||
@authorize("admin:role:main", log=True)
|
||||
def main():
|
||||
return render_template('admin/role/main.html')
|
||||
|
||||
|
||||
# 角色授权操作
|
||||
@role_bp.get('/power/<int:_id>')
|
||||
@authorize("admin:role:power", log=True)
|
||||
def power(_id):
|
||||
return render_template('admin/role/power.html', id=_id)
|
||||
|
||||
|
||||
from . import role
|
||||
@@ -2,9 +2,9 @@ from applications.extensions import db
|
||||
from applications.models import Power, Role, User
|
||||
|
||||
|
||||
def remove_role(_id):
|
||||
def remove_role(role_id):
|
||||
""" 删除角色 """
|
||||
role = Role.query.filter_by(id=_id).first()
|
||||
role = Role.query.filter_by(id=role_id).first()
|
||||
# 删除该角色的权限
|
||||
power_id_list = []
|
||||
for p in role.power:
|
||||
@@ -19,12 +19,12 @@ def remove_role(_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()
|
||||
r = Role.query.filter_by(id=role_id).delete()
|
||||
db.session.commit()
|
||||
return r
|
||||
|
||||
|
||||
def batch_remove_role(ids):
|
||||
def batch_remove_role(role_ids):
|
||||
""" 批量删除 """
|
||||
for _id in ids:
|
||||
remove_role(_id)
|
||||
for role_id in role_ids:
|
||||
remove_role(role_id)
|
||||
|
||||
@@ -1,29 +1,22 @@
|
||||
from flask import Blueprint, render_template, jsonify, make_response
|
||||
from flask import jsonify
|
||||
from flask_login import login_required
|
||||
|
||||
from flask_restful import Resource, Api, reqparse
|
||||
from flask_restful import Resource, Api, reqparse, marshal
|
||||
|
||||
from applications.extensions import db
|
||||
from applications.models import Role, Power
|
||||
from applications.common.utils.http import table_api, success_api, fail_api
|
||||
from applications.common.utils.rights import authorize
|
||||
from flask_restful import reqparse, marshal
|
||||
|
||||
from applications.common.serialization import power_fields
|
||||
|
||||
from applications.view.roles._utils import remove_role, batch_remove_role
|
||||
from . import role_bp
|
||||
from ._utils import remove_role, batch_remove_role
|
||||
|
||||
# TODO 分离视图操作
|
||||
from flask import render_template, make_response
|
||||
|
||||
role_bp = Blueprint('role', __name__, url_prefix='/admin/role')
|
||||
role_api = Api(role_bp)
|
||||
|
||||
|
||||
# 角色而管理
|
||||
@role_bp.get('/')
|
||||
@authorize("admin:role:main", log=True)
|
||||
def main():
|
||||
return render_template('admin/role/main.html')
|
||||
|
||||
|
||||
# 表格数据
|
||||
@role_bp.get('/data')
|
||||
@authorize("admin:role:main", log=True)
|
||||
@@ -87,13 +80,6 @@ class AddRole(Resource):
|
||||
return success_api(msg="成功")
|
||||
|
||||
|
||||
# 角色授权操作
|
||||
@role_bp.get('/power/<int:_id>')
|
||||
@authorize("admin:role:power", log=True)
|
||||
def power(_id):
|
||||
return render_template('admin/role/power.html', id=_id)
|
||||
|
||||
|
||||
@role_api.resource('/role_power/<int:role_id>')
|
||||
class RolePower(Resource):
|
||||
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
from flask import Flask
|
||||
|
||||
from applications.view.system.logs import admin_log
|
||||
from applications.view.system.index import admin_bp
|
||||
from applications.view.file.file import file_bp
|
||||
from applications.view.roles.role import role_bp
|
||||
from applications.view.users import users_bp
|
||||
|
||||
|
||||
def register_system_views(app: Flask):
|
||||
app.register_blueprint(admin_bp)
|
||||
app.register_blueprint(users_bp)
|
||||
app.register_blueprint(file_bp)
|
||||
app.register_blueprint(admin_log)
|
||||
app.register_blueprint(role_bp)
|
||||
@@ -1,19 +0,0 @@
|
||||
from flask import Blueprint, render_template
|
||||
from flask_login import login_required, current_user
|
||||
|
||||
admin_bp = Blueprint('admin', __name__, url_prefix='/admin')
|
||||
|
||||
|
||||
# 首页
|
||||
@admin_bp.get('/')
|
||||
@login_required
|
||||
def index():
|
||||
user = current_user
|
||||
return render_template('admin/index.html', user=user)
|
||||
|
||||
|
||||
# 控制台页面
|
||||
@admin_bp.get('/welcome')
|
||||
@login_required
|
||||
def welcome():
|
||||
return render_template('admin/console/welcome.html')
|
||||
@@ -1,52 +1,12 @@
|
||||
from flask import Blueprint, request, render_template
|
||||
from flask_restful import Api, reqparse
|
||||
from flask import Blueprint, render_template
|
||||
from flask_login import login_required, current_user
|
||||
from flask_restful import Api
|
||||
from sqlalchemy import desc
|
||||
|
||||
from applications.common.utils.http import table_api
|
||||
from applications.common.utils.rights import authorize
|
||||
from applications.models import Role, User, Dept
|
||||
from ...models import AdminLog
|
||||
|
||||
users_bp = Blueprint('users', __name__, url_prefix='/users')
|
||||
user_api = Api(users_bp)
|
||||
|
||||
|
||||
# 用户分页查询
|
||||
@users_bp.get('/data')
|
||||
@authorize("admin:user:main", log=True)
|
||||
def data():
|
||||
parser = reqparse.RequestParser()
|
||||
parser.add_argument('page', type=int, default=1)
|
||||
parser.add_argument('limit', type=int, default=10)
|
||||
parser.add_argument('realName', type=str, dest='real_name')
|
||||
parser.add_argument('username', type=str)
|
||||
parser.add_argument('deptId', type=int, dest='dept_id', default=0)
|
||||
|
||||
res = parser.parse_args()
|
||||
|
||||
filters = []
|
||||
|
||||
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)
|
||||
|
||||
|
||||
# 用户增加
|
||||
@@ -56,5 +16,14 @@ def get():
|
||||
return render_template('admin/user/main.html')
|
||||
|
||||
|
||||
@users_bp.get('/center')
|
||||
@login_required
|
||||
def center():
|
||||
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=current_user, user_logs=user_logs)
|
||||
|
||||
|
||||
user_api = Api(users_bp)
|
||||
from . import profile, _utils
|
||||
from . import user_view
|
||||
|
||||
@@ -1,22 +1,15 @@
|
||||
# 个人中心
|
||||
from flask import render_template, request, make_response, jsonify
|
||||
from flask import request, jsonify
|
||||
from flask_login import login_required, current_user
|
||||
from flask_restful import Resource, reqparse
|
||||
from sqlalchemy import desc
|
||||
|
||||
from applications.common.utils.http import fail_api, success_api
|
||||
from applications.extensions import db
|
||||
from applications.models import User, AdminLog
|
||||
from applications.models import User
|
||||
from applications.view.users import users_bp, user_api
|
||||
|
||||
|
||||
@users_bp.get('/center')
|
||||
@login_required
|
||||
def center():
|
||||
user_info = current_user
|
||||
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)
|
||||
# TODO 分离视图操作
|
||||
from flask import render_template, make_response
|
||||
|
||||
|
||||
@user_api.resource('/avatar')
|
||||
@@ -39,7 +32,6 @@ class Avatar(Resource):
|
||||
@users_bp.put('/updateInfo')
|
||||
@login_required
|
||||
def update_info():
|
||||
|
||||
parser = reqparse.RequestParser()
|
||||
parser.add_argument('realname', type=str, dest='real_name')
|
||||
parser.add_argument('remark', type=str)
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
from flask import render_template, request, make_response
|
||||
from flask import request
|
||||
from flask_restful import Resource, reqparse
|
||||
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, table_api
|
||||
from applications.common.utils.rights import authorize
|
||||
from applications.models import User, Role
|
||||
from applications.models import User, Role, Dept
|
||||
from applications.view.users import user_api, users_bp, _utils
|
||||
|
||||
# TODO 分离视图操作
|
||||
from flask import render_template, make_response
|
||||
|
||||
|
||||
@user_api.resource('/add')
|
||||
class Users(Resource):
|
||||
@@ -127,3 +130,42 @@ def user_enable():
|
||||
else:
|
||||
return fail_api(msg="出错啦")
|
||||
return message
|
||||
|
||||
|
||||
@users_bp.get('/data')
|
||||
@authorize("admin:user:main", log=True)
|
||||
def data():
|
||||
parser = reqparse.RequestParser()
|
||||
parser.add_argument('page', type=int, default=1)
|
||||
parser.add_argument('limit', type=int, default=10)
|
||||
parser.add_argument('realName', type=str, dest='real_name')
|
||||
parser.add_argument('username', type=str)
|
||||
parser.add_argument('deptId', type=int, dest='dept_id', default=0)
|
||||
|
||||
res = parser.parse_args()
|
||||
|
||||
filters = []
|
||||
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user