修改目录结构

This commit is contained in:
zhengxinonly
2021-06-22 23:42:25 +08:00
parent 05dff28523
commit 6da6768f81
18 changed files with 637 additions and 626 deletions
+20 -20
View File
@@ -1,4 +1,4 @@
from applications.common.utils.validate import xss_escape from flask import escape
from applications.extensions import db from applications.extensions import db
from applications.models import DictType, DictData, DictTypeSchema, DictDataSchema from applications.models import DictType, DictData, DictTypeSchema, DictDataSchema
from applications.common.curd import model_to_dicts from applications.common.curd import model_to_dicts
@@ -39,10 +39,10 @@ def get_dict_data(page, limit, type_code):
# 增加 dict type # 增加 dict type
def save_dict_type(req_json): def save_dict_type(req_json):
description = xss_escape(req_json.get("description")) description = escape(req_json.get("description"))
enable = xss_escape(req_json.get("enable")) enable = escape(req_json.get("enable"))
type_code = xss_escape(req_json.get("typeCode")) type_code = escape(req_json.get("typeCode"))
type_name = xss_escape(req_json.get("typeName")) type_name = escape(req_json.get("typeName"))
d = DictType(type_name=type_name, type_code=type_code, enable=enable, description=description) d = DictType(type_name=type_name, type_code=type_code, enable=enable, description=description)
db.session.add(d) db.session.add(d)
db.session.commit() db.session.commit()
@@ -51,11 +51,11 @@ def save_dict_type(req_json):
# 编辑字典类型 # 编辑字典类型
def update_dict_type(req_json): def update_dict_type(req_json):
id = xss_escape(req_json.get("id")) id = escape(req_json.get("id"))
description = xss_escape(req_json.get("description")) description = escape(req_json.get("description"))
enable = xss_escape(req_json.get("enable")) enable = escape(req_json.get("enable"))
type_code = xss_escape(req_json.get("typeCode")) type_code = escape(req_json.get("typeCode"))
type_name = xss_escape(req_json.get("typeName")) type_name = escape(req_json.get("typeName"))
DictType.query.filter_by(id=id).update({ DictType.query.filter_by(id=id).update({
"description": description, "description": description,
"enable": enable, "enable": enable,
@@ -95,11 +95,11 @@ def delete_type_by_id(id):
# 增加dictdata # 增加dictdata
def save_dict_data(req_json): def save_dict_data(req_json):
data_label = xss_escape(req_json.get("dataLabel")) data_label = escape(req_json.get("dataLabel"))
data_value = xss_escape(req_json.get("dataValue")) data_value = escape(req_json.get("dataValue"))
enable = xss_escape(req_json.get("enable")) enable = escape(req_json.get("enable"))
remark = xss_escape(req_json.get("remark")) remark = escape(req_json.get("remark"))
type_code = xss_escape(req_json.get("typeCode")) type_code = escape(req_json.get("typeCode"))
d = DictData(data_label=data_label, data_value=data_value, enable=enable, remark=remark, type_code=type_code) d = DictData(data_label=data_label, data_value=data_value, enable=enable, remark=remark, type_code=type_code)
db.session.add(d) db.session.add(d)
db.session.commit() db.session.commit()
@@ -110,11 +110,11 @@ def save_dict_data(req_json):
def update_dict_data(req_json): def update_dict_data(req_json):
id = req_json.get("dataId") id = req_json.get("dataId")
DictData.query.filter_by(id=id).update({ DictData.query.filter_by(id=id).update({
"data_label": xss_escape(req_json.get("dataLabel")), "data_label": escape(req_json.get("dataLabel")),
"data_value": xss_escape(req_json.get("dataValue")), "data_value": escape(req_json.get("dataValue")),
"enable": xss_escape(req_json.get("enable")), "enable": escape(req_json.get("enable")),
"remark": xss_escape(req_json.get("remark")), "remark": escape(req_json.get("remark")),
"type_code": xss_escape(req_json.get("typeCode")) "type_code": escape(req_json.get("typeCode"))
}) })
db.session.commit() db.session.commit()
return return
+17 -17
View File
@@ -1,4 +1,4 @@
from applications.common.utils.validate import xss_escape from flask import escape
from applications.extensions import db from applications.extensions import db
from applications.models.rights.power import Power, PowerSchema2 from applications.models.rights.power import Power, PowerSchema2
from applications.models import Role from applications.models import Role
@@ -21,14 +21,14 @@ def select_parent():
# 增加权限 # 增加权限
def save_power(req): def save_power(req):
icon = xss_escape(req.get("icon")) icon = escape(req.get("icon"))
openType = xss_escape(req.get("openType")) openType = escape(req.get("openType"))
parentId = xss_escape(req.get("parentId")) parentId = escape(req.get("parentId"))
powerCode = xss_escape(req.get("powerCode")) powerCode = escape(req.get("powerCode"))
powerName = xss_escape(req.get("powerName")) powerName = escape(req.get("powerName"))
powerType = xss_escape(req.get("powerType")) powerType = escape(req.get("powerType"))
powerUrl = xss_escape(req.get("powerUrl")) powerUrl = escape(req.get("powerUrl"))
sort = xss_escape(req.get("sort")) sort = escape(req.get("sort"))
power = Power( power = Power(
icon=icon, icon=icon,
open_type=openType, open_type=openType,
@@ -55,14 +55,14 @@ def get_power_by_id(id):
def update_power(req_json): def update_power(req_json):
id = req_json.get("powerId") id = req_json.get("powerId")
data = { data = {
"icon": xss_escape(req_json.get("icon")), "icon": escape(req_json.get("icon")),
"open_type": xss_escape(req_json.get("openType")), "open_type": escape(req_json.get("openType")),
"parent_id": xss_escape(req_json.get("parentId")), "parent_id": escape(req_json.get("parentId")),
"code": xss_escape(req_json.get("powerCode")), "code": escape(req_json.get("powerCode")),
"name": xss_escape(req_json.get("powerName")), "name": escape(req_json.get("powerName")),
"type": xss_escape(req_json.get("powerType")), "type": escape(req_json.get("powerType")),
"url": xss_escape(req_json.get("powerUrl")), "url": escape(req_json.get("powerUrl")),
"sort": xss_escape(req_json.get("sort")) "sort": escape(req_json.get("sort"))
} }
# print(data) # print(data)
power = Power.query.filter_by(id=id).update(data) power = Power.query.filter_by(id=id).update(data)
+11 -11
View File
@@ -1,6 +1,5 @@
from sqlalchemy import and_ from sqlalchemy import and_
from applications.common.utils.validate import xss_escape
from applications.extensions import db from applications.extensions import db
from applications.models import Role, RoleSchema from applications.models import Role, RoleSchema
from applications.models.rights.power import Power, PowerSchema2 from applications.models.rights.power import Power, PowerSchema2
@@ -11,6 +10,7 @@ from applications.common.curd import model_to_dicts
def get_role_data(page, limit, filters): def get_role_data(page, limit, filters):
print(page, limit, filters)
role = Role.query.filter(and_(*[getattr(Role, k).like(v) for k, v in filters.items()])).paginate(page=page, role = Role.query.filter(and_(*[getattr(Role, k).like(v) for k, v in filters.items()])).paginate(page=page,
per_page=limit, per_page=limit,
error_out=False) error_out=False)
@@ -27,11 +27,11 @@ def get_role_data_dict(page, limit, filters):
def add_role(req): def add_role(req):
""" 增加角色 """ """ 增加角色 """
details = xss_escape(req.get("details")) details = req.get("details")
enable = xss_escape(req.get("enable")) enable = req.get("enable")
roleCode = xss_escape(req.get("roleCode")) roleCode = req.get("roleCode")
roleName = xss_escape(req.get("roleName")) roleName = req.get("roleName")
sort = xss_escape(req.get("sort")) sort = req.get("sort")
role = Role( role = Role(
details=details, details=details,
enable=enable, enable=enable,
@@ -53,11 +53,11 @@ def update_role(req_json):
""" 更新角色 """ """ 更新角色 """
_id = req_json.get("roleId") _id = req_json.get("roleId")
data = { data = {
"code": xss_escape(req_json.get("roleCode")), "code": req_json.get("roleCode"),
"name": xss_escape(req_json.get("roleName")), "name": req_json.get("roleName"),
"sort": xss_escape(req_json.get("sort")), "sort": req_json.get("sort"),
"enable": xss_escape(req_json.get("enable")), "enable": req_json.get("enable"),
"details": xss_escape(req_json.get("details")) "details": req_json.get("details")
} }
role = Role.query.filter_by(id=_id).update(data) role = Role.query.filter_by(id=_id).update(data)
db.session.commit() db.session.commit()
+1 -1
View File
@@ -39,7 +39,7 @@
</a> </a>
<!-- 功 能 菜 单 --> <!-- 功 能 菜 单 -->
<dl class="layui-nav-child"> <dl class="layui-nav-child">
<dd><a user-menu-url="/admin/user/center" user-menu-id="5555" user-menu-title="基本资料">基本资料</a></dd> <dd><a user-menu-url="/users/center" user-menu-id="5555" user-menu-title="基本资料">基本资料</a></dd>
<dd><a href="javascript:void(0);" class="logout">注销登录</a></dd> <dd><a href="javascript:void(0);" class="logout">注销登录</a></dd>
</dl> </dl>
</li> </li>
@@ -0,0 +1,126 @@
<!DOCTYPE html>
<html>
<head>
<title>头像上传</title>
{% include 'admin/common/header.html' %}
</head>
<body class="pear-container">
<div class="layui-row layui-col-space15">
<div class="layui-col-xs9">
<div style="height:325px;background-color: rgb(247, 247, 247);">
<img id="sourceImage" src="">
</div>
</div>
<div class="layui-col-xs3" style="padding-left:0px;">
<div id="previewImage"
style="width:210px;height:210px;border: 1px solid rgb(200, 200, 200);border-radius: 50%;overflow:hidden;">
</div>
</div>
</div>
<div class="layui-row">
<div class="layui-form-item">
<div class="layui-input-inline layui-btn-container" style="width: auto;vertical-align:top;">
<button class="pear-btn pear-btn-sm pear-btn-primary layui-icon layui-icon-left" cropper-event="rotate"
data-option="-15" title="左旋15°"></button>
<button class="pear-btn pear-btn-sm pear-btn-primary layui-icon layui-icon-right" cropper-event="rotate"
data-option="15" title="右旋15°"></button>
<button class="pear-btn pear-btn-sm pear-btn-danger layui-icon layui-icon-refresh" cropper-event="reset"
title="重置"></button>
<label for="uploadPicture" class="pear-btn pear-btn-sm pear-btn-primary layui-icon layui-icon-upload"
title="选择图片"></label>
<input class="layui-upload-file" id="uploadPicture" type="file" value="选择图片">
</div>
<div class="layui-form-mid layui-word-aux">建议:图片的尺寸宽高比为1:1,大小在5m以内。</div>
</div>
</div>
</body>
{% include 'admin/common/footer.html' %}
<script>
layui.use(['jquery', 'layer', 'cropper', 'popup'], function () {
let $ = layui.jquery
let layer = layui.layer
let cropper = layui.cropper
let popup = layui.popup
let options = {
aspectRatio: 1 / 1, // 裁剪框比例
preview: '#previewImage', // 预览div
viewmode: 1
}
$('#sourceImage').attr('src', parent.layui.$('#avatar').attr('src'))
$('#sourceImage').cropper(options)
window.submitForm = function () {
$('#sourceImage').crossOrigin = 'anonymous'//解决跨域图片问题
$('#sourceImage').cropper('getCroppedCanvas', {
width: 280,
height: 140
}).toBlob(function (blob) {
let timeStamp = Date.parse(new Date())
let fileName = timeStamp + '.jpg'
let formData = new FormData()
formData.append('file', blob, fileName)
formData.append('fileName', fileName)
formData.append('fileToken', timeStamp)
$.ajax({
method: 'post',
url: '/admin/file/upload', //用于文件上传的服务器端请求地址
data: formData,
processData: false,
contentType: false,
success: function (result) {
if (result.success) {
// 修改 avatar 字段
$.ajax({
method: 'put',
url: '/users/updateAvatar',
data: JSON.stringify({ avatar: result.data }),
dataType: 'json',
contentType: 'application/json',
success: function (res) {
if (res.success) {
// 关闭当前弹层
parent.layui.$('#avatar').attr('src', result.data.src)
top.layui.$('#avatar').attr('src', result.data.src)
parent.layer.close(parent.layer.getFrameIndex(window.name))
} else {
popup.failure('上传失败')
}
}
})
} else {
popup.failure('上传失败')
}
}
})
})
}
$('.pear-btn').on('click', function () {
let event = $(this).attr('cropper-event')
if (event === 'rotate') {
let option = $(this).attr('data-option')
$('#sourceImage').cropper('rotate', option)
} else if (event === 'reset') {
$('#sourceImage').cropper('reset')
}
$('#uploadPicture').change(function () {
let r = new FileReader()
let f = this.files[0]
let uploadFileSize = f.size / 1024
if (uploadFileSize > 5120) {
parent.layer.msg('上传文件不得超过5m', { icon: 5 })
return false
}
r.readAsDataURL(f)
r.onload = function (e) {
$('#sourceImage')
.cropper('destroy')
.attr('src', this.result)
.cropper(options)
}
})
})
})
</script>
@@ -1,227 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>个人中心</title>
{% include 'admin/common/header.html' %}
<style>
.layui-form-item {
margin-top: 17px !important;
margin-bottom: 17px !important;
}
</style>
</head>
<body class="pear-container">
<div class="layui-row layui-col-space10">
{# 左侧栏 #}
<div class="layui-col-md3">
{# 个人信息卡片 #}
<div class="layui-card">
<div class="layui-card-body" style="padding: 25px;">
<div class="text-center layui-text">
<div class="user-info-head" id="userInfoHead">
<img id="avatar" src="{{ user_info.avatar }}" width="115px" height="115px" alt="">
</div>
<h2 style="padding-top: 20px;font-size: 20px;">{{ user_info.realname }}</h2>
<p style="padding-top: 8px;margin-top: 10px;font-size: 13.5px;">China 中国</p>
</div>
</div>
<div style="height: 45px;border-top: 1px whitesmoke solid;text-align: center;line-height: 45px;font-size: 13.5px;">
<span>{{ user_info.remark }}</span>
</div>
</div>
{# 登录信息卡片 #}
<div class="layui-card">
<div class="layui-card-header">
登录记录
</div>
<div class="layui-card-body">
<ul class="list">
{% for log in user_logs %}
<li class="list-item">
<span class="title">{{ log.url }}</span>
<span class="footer">{{ log.create_time }}</span>
</li>
{% endfor %}
</ul>
</div>
</div>
</div>
{# 右侧栏 #}
<div class="layui-col-md9">
{# 个人信息卡片 #}
<div class="layui-card">
<div class="layui-card-header">个人信息</div>
<div class="layui-card-body">
<div class="layui-tab layui-tab-brief">
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<form class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">账号</label>
<div class="layui-input-block">
<input value="{{ user_info.username }}" type="text" readonly name="username"
lay-verify="title"
autocomplete="off" placeholder="请输入标题" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">姓名</label>
<div class="layui-input-block">
<input value="{{ user_info.realname }}" type="text" name="realName"
lay-verify="title"
autocomplete="off" placeholder="请输入标题" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">描述</label>
<div class="layui-input-block">
<textarea placeholder="请输入描述" name="details"
class="layui-textarea">{{ user_info.remark }}</textarea>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-submit
lay-filter="user-update">修改资料
</button>
<button class="pear-btn pear-btn-sm edit-password">更改密码</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
{# 个人文章记录 #}
<div class="layui-card">
<div class="layui-card-header">
我的文章
</div>
<div class="layui-card-body">
<div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<div class="layui-row layui-col-space10" style="margin: 15px;">
<div class="layui-col-md1">
<img src="{{ url_for('static', filename='admin/admin/images/act.jpg') }}"
style="width: 100%;height: 100%;border-radius: 5px;"/>
</div>
<div class="layui-col-md11" style="height: 80px;">
<div class="title">为什么程序员们愿意在GitHub上开源自己的成果给别人免费使用和学习?</div>
<div class="content">
“Git的精髓在于让所有人的贡献无缝合并。而GitHub的天才之处,在于理解了Git的精髓。”来一句我们程序员们接地气的话:分享是一种快乐~
</div>
<div class="comment">2020-06-12 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 评论 5 点赞 12 转发
4
</div>
</div>
</div>
<div class="layui-row layui-col-space10" style="margin: 15px;">
<div class="layui-col-md1">
<img src="{{ url_for('static', filename='admin/admin/images/act.jpg') }}"
style="width: 100%;height: 100%;border-radius: 5px;"/>
</div>
<div class="layui-col-md11" style="height: 80px;">
<div class="title">为什么程序员们愿意在GitHub上开源自己的成果给别人免费使用和学习?</div>
<div class="content">
“Git的精髓在于让所有人的贡献无缝合并。而GitHub的天才之处,在于理解了Git的精髓。”来一句我们程序员们接地气的话:分享是一种快乐~
</div>
<div class="comment">2020-06-12 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 评论 5 点赞 12 转发
4
</div>
</div>
</div>
<div class="layui-row layui-col-space10" style="margin: 15px;">
<div class="layui-col-md1">
<img src="{{ url_for('static', filename='admin/admin/images/act.jpg') }}"
style="width: 100%;height: 100%;border-radius: 5px;"/>
</div>
<div class="layui-col-md11" style="height: 80px;">
<div class="title">为什么程序员们愿意在GitHub上开源自己的成果给别人免费使用和学习?</div>
<div class="content">
“Git的精髓在于让所有人的贡献无缝合并。而GitHub的天才之处,在于理解了Git的精髓。”来一句我们程序员们接地气的话:分享是一种快乐~
</div>
<div class="comment">2020-06-12 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 评论 5 点赞 12 转发
4
</div>
</div>
</div>
<div class="layui-row layui-col-space10" style="margin: 15px;">
<div class="layui-col-md1">
<img src="{{ url_for('static', filename='admin/admin/images/act.jpg') }}"
style="width: 100%;height: 100%;border-radius: 5px;"/>
</div>
<div class="layui-col-md11" style="height: 80px;">
<div class="title">为什么程序员们愿意在GitHub上开源自己的成果给别人免费使用和学习?</div>
<div class="content">
“Git的精髓在于让所有人的贡献无缝合并。而GitHub的天才之处,在于理解了Git的精髓。”来一句我们程序员们接地气的话:分享是一种快乐~
</div>
<div class="comment">2020-06-12 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 评论 5 点赞 12 转发
4
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% include 'admin/common/footer.html' %}
<script>
layui.use(['element', 'jquery', 'layer', 'form'], function () {
let $ = layui.jquery
let layer = layui.layer
let form = layui.form
// 修改密码页面
$('.edit-password').click(function () {
layer.open({
type: 2,
title: '修改密码',
shade: 0.1,
area: ['550px', '280px'],
content: '/admin/user/editPassword'
})
return false
})
// 修改头像
$('#avatar').click(function () {
layer.open({
type: 2,
title: '更换图片',
shade: 0.1,
area: ['900px', '500px'],
content: '/admin/user/profile',
btn: ['确定', '取消'],
yes: function (index, layero) {
window['layui-layer-iframe' + index].submitForm()
}
})
})
// 表单提交更改个人信息数据
form.on('submit(user-update)', function (data) {
$.ajax({
url: '/admin/user/updateInfo',
data: JSON.stringify(data.field),
dataType: 'json',
contentType: 'application/json',
type: 'put',
success: function (result) {
if (result.success) {
layer.msg('修改成功', { icon: 1, time: 1000 })
} else {
layer.msg('修改失败', { icon: 2, time: 1000 })
}
}
})
return false
})
})
</script>
</body>
</html>
@@ -57,7 +57,7 @@
// 修改密码提交 // 修改密码提交
form.on('submit(edit-password)', function (data) { form.on('submit(edit-password)', function (data) {
$.ajax({ $.ajax({
url: '/admin/user/editPassword', url: '/users/editPassword',
data: JSON.stringify(data.field), data: JSON.stringify(data.field),
contentType: 'application/json', contentType: 'application/json',
dataType: 'json', dataType: 'json',
@@ -44,7 +44,7 @@
<label class="layui-form-label">角色</label> <label class="layui-form-label">角色</label>
<div class="layui-input-block"> <div class="layui-input-block">
{% for role in roles %} {% for role in roles %}
<input{% if role.id in checked_roles %} <input {% if role.id in checked_roles %}
checked checked
{% endif %} {% endif %}
value="{{ role.id }}" title="{{ role.name }}" type="checkbox" value="{{ role.id }}" title="{{ role.name }}" type="checkbox"
@@ -57,8 +57,7 @@
</div> </div>
<div class="bottom"> <div class="bottom">
<div class="button-container"> <div class="button-container">
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit="" <button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit="" lay-filter="user-update">
lay-filter="user-update">
<i class="layui-icon layui-icon-ok"></i> <i class="layui-icon layui-icon-ok"></i>
提交 提交
</button> </button>
@@ -94,7 +93,7 @@
roleIds = roleIds.substr(0, roleIds.length - 1) roleIds = roleIds.substr(0, roleIds.length - 1)
data.field.roleIds = roleIds data.field.roleIds = roleIds
$.ajax({ $.ajax({
url: '/admin/user/update', url: '/users/' + data.userId,
data: JSON.stringify(data.field), data: JSON.stringify(data.field),
dataType: 'json', dataType: 'json',
contentType: 'application/json', contentType: 'application/json',
+6 -6
View File
@@ -111,7 +111,7 @@
let dtree = layui.dtree let dtree = layui.dtree
let popup = layui.popup let popup = layui.popup
let common = layui.common let common = layui.common
let MODULE_PATH = '/admin/user/' let MODULE_PATH = '/users/'
// 表格数据 // 表格数据
let cols = [ let cols = [
@@ -211,14 +211,14 @@
form.on('switch(user-enable)', function (obj) { form.on('switch(user-enable)', function (obj) {
let operate let operate
if (obj.elem.checked) { if (obj.elem.checked) {
operate = 'enable' operate = 1
} else { } else {
operate = 'disable' operate = 0
} }
let loading = layer.load() let loading = layer.load()
$.ajax({ $.ajax({
url: '/admin/user/' + operate, url: MODULE_PATH + 'enable',
data: JSON.stringify({ userId: this.value }), data: JSON.stringify({ operate: operate, userId: this.value }),
dataType: 'json', dataType: 'json',
contentType: 'application/json', contentType: 'application/json',
type: 'put', type: 'put',
@@ -249,7 +249,7 @@
title: '修改', title: '修改',
shade: 0.1, shade: 0.1,
area: ['550px', '500px'], area: ['550px', '500px'],
content: MODULE_PATH + 'edit/' + obj.data['id'] content: MODULE_PATH + obj.data['id']
}) })
} }
+195 -94
View File
@@ -1,126 +1,227 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>头像上传</title> <title>个人中心</title>
{% include 'admin/common/header.html' %} {% include 'admin/common/header.html' %}
<style>
.layui-form-item {
margin-top: 17px !important;
margin-bottom: 17px !important;
}
</style>
</head> </head>
<body class="pear-container"> <body class="pear-container">
<div class="layui-row layui-col-space15"> <div class="layui-row layui-col-space10">
<div class="layui-col-xs9"> {# 左侧栏 #}
<div style="height:325px;background-color: rgb(247, 247, 247);"> <div class="layui-col-md3">
<img id="sourceImage" src=""> {# 个人信息卡片 #}
<div class="layui-card">
<div class="layui-card-body" style="padding: 25px;">
<div class="text-center layui-text">
<div class="user-info-head" id="userInfoHead">
<img id="avatar" src="{{ user_info.avatar }}" width="115px" height="115px" alt="">
</div>
<h2 style="padding-top: 20px;font-size: 20px;">{{ user_info.realname }}</h2>
<p style="padding-top: 8px;margin-top: 10px;font-size: 13.5px;">China 中国</p>
</div> </div>
</div> </div>
<div class="layui-col-xs3" style="padding-left:0px;"> <div style="height: 45px;border-top: 1px whitesmoke solid;text-align: center;line-height: 45px;font-size: 13.5px;">
<div id="previewImage" <span>{{ user_info.remark }}</span>
style="width:210px;height:210px;border: 1px solid rgb(200, 200, 200);border-radius: 50%;overflow:hidden;">
</div> </div>
</div> </div>
</div> {# 登录信息卡片 #}
<div class="layui-row"> <div class="layui-card">
<div class="layui-card-header">
登录记录
</div>
<div class="layui-card-body">
<ul class="list">
{% for log in user_logs %}
<li class="list-item">
<span class="title">{{ log.url }}</span>
<span class="footer">{{ log.create_time }}</span>
</li>
{% endfor %}
</ul>
</div>
</div>
</div>
{# 右侧栏 #}
<div class="layui-col-md9">
{# 个人信息卡片 #}
<div class="layui-card">
<div class="layui-card-header">个人信息</div>
<div class="layui-card-body">
<div class="layui-tab layui-tab-brief">
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<form class="layui-form">
<div class="layui-form-item"> <div class="layui-form-item">
<div class="layui-input-inline layui-btn-container" style="width: auto;vertical-align:top;"> <label class="layui-form-label">账号</label>
<button class="pear-btn pear-btn-sm pear-btn-primary layui-icon layui-icon-left" cropper-event="rotate" <div class="layui-input-block">
data-option="-15" title="左旋15°"></button> <input value="{{ user_info.username }}" type="text" readonly name="username"
<button class="pear-btn pear-btn-sm pear-btn-primary layui-icon layui-icon-right" cropper-event="rotate" lay-verify="title"
data-option="15" title="右旋15°"></button> autocomplete="off" placeholder="请输入标题" class="layui-input">
<button class="pear-btn pear-btn-sm pear-btn-danger layui-icon layui-icon-refresh" cropper-event="reset" </div>
title="重置"></button> </div>
<label for="uploadPicture" class="pear-btn pear-btn-sm pear-btn-primary layui-icon layui-icon-upload" <div class="layui-form-item">
title="选择图片"></label> <label class="layui-form-label">姓名</label>
<input class="layui-upload-file" id="uploadPicture" type="file" value="选择图片"> <div class="layui-input-block">
<input value="{{ user_info.realname }}" type="text" name="realName"
lay-verify="title"
autocomplete="off" placeholder="请输入标题" class="layui-input">
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">描述</label>
<div class="layui-input-block">
<textarea placeholder="请输入描述" name="details"
class="layui-textarea">{{ user_info.remark }}</textarea>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-submit
lay-filter="user-update">修改资料
</button>
<button class="pear-btn pear-btn-sm edit-password">更改密码</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
{# 个人文章记录 #}
<div class="layui-card">
<div class="layui-card-header">
我的文章
</div>
<div class="layui-card-body">
<div class="layui-tab layui-tab-brief" lay-filter="docDemoTabBrief">
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<div class="layui-row layui-col-space10" style="margin: 15px;">
<div class="layui-col-md1">
<img src="{{ url_for('static', filename='admin/admin/images/act.jpg') }}"
style="width: 100%;height: 100%;border-radius: 5px;"/>
</div>
<div class="layui-col-md11" style="height: 80px;">
<div class="title">为什么程序员们愿意在GitHub上开源自己的成果给别人免费使用和学习?</div>
<div class="content">
“Git的精髓在于让所有人的贡献无缝合并。而GitHub的天才之处,在于理解了Git的精髓。”来一句我们程序员们接地气的话:分享是一种快乐~
</div>
<div class="comment">2020-06-12 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 评论 5 点赞 12 转发
4
</div>
</div>
</div>
<div class="layui-row layui-col-space10" style="margin: 15px;">
<div class="layui-col-md1">
<img src="{{ url_for('static', filename='admin/admin/images/act.jpg') }}"
style="width: 100%;height: 100%;border-radius: 5px;"/>
</div>
<div class="layui-col-md11" style="height: 80px;">
<div class="title">为什么程序员们愿意在GitHub上开源自己的成果给别人免费使用和学习?</div>
<div class="content">
“Git的精髓在于让所有人的贡献无缝合并。而GitHub的天才之处,在于理解了Git的精髓。”来一句我们程序员们接地气的话:分享是一种快乐~
</div>
<div class="comment">2020-06-12 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 评论 5 点赞 12 转发
4
</div>
</div>
</div>
<div class="layui-row layui-col-space10" style="margin: 15px;">
<div class="layui-col-md1">
<img src="{{ url_for('static', filename='admin/admin/images/act.jpg') }}"
style="width: 100%;height: 100%;border-radius: 5px;"/>
</div>
<div class="layui-col-md11" style="height: 80px;">
<div class="title">为什么程序员们愿意在GitHub上开源自己的成果给别人免费使用和学习?</div>
<div class="content">
“Git的精髓在于让所有人的贡献无缝合并。而GitHub的天才之处,在于理解了Git的精髓。”来一句我们程序员们接地气的话:分享是一种快乐~
</div>
<div class="comment">2020-06-12 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 评论 5 点赞 12 转发
4
</div>
</div>
</div>
<div class="layui-row layui-col-space10" style="margin: 15px;">
<div class="layui-col-md1">
<img src="{{ url_for('static', filename='admin/admin/images/act.jpg') }}"
style="width: 100%;height: 100%;border-radius: 5px;"/>
</div>
<div class="layui-col-md11" style="height: 80px;">
<div class="title">为什么程序员们愿意在GitHub上开源自己的成果给别人免费使用和学习?</div>
<div class="content">
“Git的精髓在于让所有人的贡献无缝合并。而GitHub的天才之处,在于理解了Git的精髓。”来一句我们程序员们接地气的话:分享是一种快乐~
</div>
<div class="comment">2020-06-12 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 评论 5 点赞 12 转发
4
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div> </div>
<div class="layui-form-mid layui-word-aux">建议:图片的尺寸宽高比为1:1,大小在5m以内。</div>
</div> </div>
</div> </div>
</body>
{% include 'admin/common/footer.html' %} {% include 'admin/common/footer.html' %}
<script> <script>
layui.use(['jquery', 'layer', 'cropper', 'popup'], function () { layui.use(['element', 'jquery', 'layer', 'form'], function () {
let $ = layui.jquery let $ = layui.jquery
let layer = layui.layer let layer = layui.layer
let cropper = layui.cropper let form = layui.form
let popup = layui.popup // 修改密码页面
$('.edit-password').click(function () {
layer.open({
type: 2,
title: '修改密码',
shade: 0.1,
area: ['550px', '280px'],
content: '/users/editPassword'
})
return false
})
let options = { // 修改头像
aspectRatio: 1 / 1, // 裁剪框比例 $('#avatar').click(function () {
preview: '#previewImage', // 预览div layer.open({
viewmode: 1 type: 2,
title: '更换图片',
shade: 0.1,
area: ['900px', '500px'],
content: '/users/avatar',
btn: ['确定', '取消'],
yes: function (index, layero) {
window['layui-layer-iframe' + index].submitForm()
} }
})
})
$('#sourceImage').attr('src', parent.layui.$('#avatar').attr('src')) // 表单提交更改个人信息数据
$('#sourceImage').cropper(options) form.on('submit(user-update)', function (data) {
window.submitForm = function () {
$('#sourceImage').crossOrigin = 'anonymous'//解决跨域图片问题
$('#sourceImage').cropper('getCroppedCanvas', {
width: 280,
height: 140
}).toBlob(function (blob) {
let timeStamp = Date.parse(new Date())
let fileName = timeStamp + '.jpg'
let formData = new FormData()
formData.append('file', blob, fileName)
formData.append('fileName', fileName)
formData.append('fileToken', timeStamp)
$.ajax({ $.ajax({
method: 'post', url: '/users/updateInfo',
url: '/admin/file/upload', //用于文件上传的服务器端请求地址 data: JSON.stringify(data.field),
data: formData,
processData: false,
contentType: false,
success: function (result) {
if (result.success) {
// 修改 avatar 字段
$.ajax({
method: 'put',
url: '/admin/user/updateAvatar',
data: JSON.stringify({ avatar: result.data }),
dataType: 'json', dataType: 'json',
contentType: 'application/json', contentType: 'application/json',
success: function (res) { type: 'put',
if (res.success) { success: function (result) {
// 关闭当前弹层 if (result.success) {
parent.layui.$('#avatar').attr('src', result.data.src) layer.msg('修改成功', { icon: 1, time: 1000 })
top.layui.$('#avatar').attr('src', result.data.src)
parent.layer.close(parent.layer.getFrameIndex(window.name))
} else { } else {
popup.failure('上传失败') layer.msg('修改失败', { icon: 2, time: 1000 })
} }
} }
}) })
} else {
popup.failure('上传失败')
}
}
})
})
}
$('.pear-btn').on('click', function () {
let event = $(this).attr('cropper-event')
if (event === 'rotate') {
let option = $(this).attr('data-option')
$('#sourceImage').cropper('rotate', option)
} else if (event === 'reset') {
$('#sourceImage').cropper('reset')
}
$('#uploadPicture').change(function () {
let r = new FileReader()
let f = this.files[0]
let uploadFileSize = f.size / 1024
if (uploadFileSize > 5120) {
parent.layer.msg('上传文件不得超过5m', { icon: 5 })
return false return false
}
r.readAsDataURL(f)
r.onload = function (e) {
$('#sourceImage')
.cropper('destroy')
.attr('src', this.result)
.cropper(options)
}
})
}) })
}) })
</script> </script>
</body>
</html>
+2 -2
View File
@@ -5,13 +5,13 @@ 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 admin_file
from applications.view.admin.role import admin_role from applications.view.admin.role import admin_role
from applications.view.admin.user import admin_user 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
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(admin_user) app.register_blueprint(users_bp)
app.register_blueprint(admin_file) app.register_blueprint(admin_file)
app.register_blueprint(admin_monitor_bp) app.register_blueprint(admin_monitor_bp)
app.register_blueprint(admin_log) app.register_blueprint(admin_log)
+3 -3
View File
@@ -1,4 +1,4 @@
from flask import Blueprint, render_template, request, jsonify, escape from flask import Blueprint, render_template, request, jsonify
from applications.common.utils.http import table_api, success_api, fail_api from applications.common.utils.http import table_api, success_api, fail_api
from applications.common.utils.rights import authorize from applications.common.utils.rights import authorize
@@ -20,7 +20,7 @@ def main():
def dict_type_data(): def dict_type_data():
page = request.args.get('page', type=int) page = request.args.get('page', type=int)
limit = request.args.get('limit', type=int) limit = request.args.get('limit', type=int)
type_name = escape(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)
@@ -100,7 +100,7 @@ def dict_type_delete(_id):
def dict_code_data(): def dict_code_data():
page = request.args.get('page', type=int) page = request.args.get('page', type=int)
limit = request.args.get('limit', type=int) limit = request.args.get('limit', type=int)
type_code = escape(request.args.get('typeCode', type=str)) type_code = request.args.get('typeCode', type=str)
data, count = dict_curd.get_dict_data(page=page, limit=limit, type_code=type_code) data, count = dict_curd.get_dict_data(page=page, limit=limit, type_code=type_code)
return table_api(data=data,count=count) return table_api(data=data,count=count)
+3 -3
View File
@@ -1,4 +1,4 @@
from flask import Blueprint, render_template, request, jsonify, escape from flask import Blueprint, render_template, request, jsonify
from flask_login import login_required from flask_login import login_required
from applications.common.admin import role_curd from applications.common.admin import role_curd
from applications.common.utils.http import table_api, success_api, fail_api from applications.common.utils.http import table_api, success_api, fail_api
@@ -21,8 +21,8 @@ def main():
def table(): def table():
page = request.args.get('page', type=int) page = request.args.get('page', type=int)
limit = request.args.get('limit', type=int) limit = request.args.get('limit', type=int)
role_name = escape(request.args.get('roleName', type=str)) role_name = request.args.get('roleName', type=str)
role_code = escape(request.args.get('roleCode', type=str)) role_code = request.args.get('roleCode', type=str)
filters = {} filters = {}
if role_name: if role_name:
filters["name"] = ('%' + role_name + '%') filters["name"] = ('%' + role_name + '%')
-189
View File
@@ -1,189 +0,0 @@
from flask import Blueprint, render_template, request, escape
from flask_login import login_required, current_user
from applications.common.utils.http import table_api, fail_api, success_api
from applications.common.utils.rights import authorize
from applications.models import User
from applications.models import Role
from applications.common.admin import user_curd
admin_user = Blueprint('adminUser', __name__, url_prefix='/admin/user')
# 用户管理
@admin_user.get('/')
@authorize("admin:user:main", log=True)
def main():
return render_template('admin/user/main.html')
# 用户分页查询
@admin_user.get('/data')
@authorize("admin:user:main", log=True)
def data():
page = request.args.get('page', type=int)
limit = request.args.get('limit', type=int)
real_name = escape(request.args.get('realName', type=str))
username = escape(request.args.get('username', type=str))
dept_id = request.args.get('deptId', type=int)
filters = {}
if real_name:
filters["realname"] = ('%' + real_name + '%')
if username:
filters["username"] = ('%' + username + '%')
user_data, count = user_curd.get_user_data_dict(page=page, limit=limit, filters=filters, deptId=dept_id)
return table_api(data=user_data, count=count)
# 用户增加
@admin_user.get('/add')
@authorize("admin:user:add", log=True)
def add():
roles = Role.query.all()
return render_template('admin/user/add.html', roles=roles)
@admin_user.post('/save')
@authorize("admin:user:add", log=True)
def save():
req_json = request.json
a = req_json.get("roleIds")
username = escape(req_json.get('username'))
real_name = escape(req_json.get('realName'))
password = escape(req_json.get('password'))
role_ids = a.split(',')
if not username or not real_name or not password:
return fail_api(msg="账号姓名密码不得为空")
if user_curd.is_user_exists(username):
return fail_api(msg="用户已经存在")
_id = user_curd.add_user(username, real_name, password)
user_curd.add_user_role(_id, role_ids)
return success_api(msg="增加成功")
# 删除用户
@admin_user.delete('/remove/<int:_id>')
@authorize("admin:user:remove", log=True)
def delete(_id):
res = user_curd.delete_by_id(_id)
if not res:
return fail_api(msg="删除失败")
return success_api(msg="删除成功")
# 编辑用户
@admin_user.get('/edit/<int:_id>')
@authorize("admin:user:edit", log=True)
def edit(_id):
user = User.query.filter_by(id=_id).first()
roles = Role.query.all()
checked_roles = []
for r in user.role:
checked_roles.append(r.id)
return render_template('admin/user/edit.html', user=user, roles=roles, checked_roles=checked_roles)
# 编辑用户
@admin_user.put('/update')
@authorize("admin:user:edit", log=True)
def update():
req_json = request.json
a = escape(req_json.get("roleIds"))
_id = escape(req_json.get("userId"))
username = escape(req_json.get('username'))
real_name = escape(req_json.get('realName'))
dept_id = escape(req_json.get('deptId'))
role_ids = a.split(',')
user_curd.update_user(id, username, real_name, dept_id)
user_curd.update_user_role(_id, role_ids)
return success_api(msg="更新成功")
# 个人中心
@admin_user.get('/center')
@login_required
def center():
user_info = current_user
user_logs = user_curd.get_current_user_logs()
return render_template('admin/user/center.html', user_info=user_info, user_logs=user_logs)
# 修改头像
@admin_user.get('/profile')
@login_required
def profile():
return render_template('admin/user/profile.html')
# 修改头像
@admin_user.put('/updateAvatar')
@login_required
def update_avatar():
url = request.json.get("avatar").get("src")
if not user_curd.update_avatar(url):
return fail_api(msg="出错啦")
return success_api(msg="修改成功")
# 修改当前用户信息
@admin_user.put('/updateInfo')
@login_required
def update_info():
res_json = request.json
if not user_curd.update_current_user_info(req_json=res_json):
return fail_api(msg="出错啦")
return success_api(msg="更新成功")
# 修改当前用户密码
@admin_user.get('/editPassword')
@login_required
def edit_password():
return render_template('admin/user/edit_password.html')
# 修改当前用户密码
@admin_user.put('/editPassword')
@login_required
def edit_password_put():
res_json = request.json
return user_curd.edit_password(res_json=res_json)
# 启用用户
@admin_user.put('/enable')
@authorize("admin:user:edit", log=True)
def enable():
_id = request.json.get('userId')
if _id:
res = user_curd.enable_status(_id)
if not res:
return fail_api(msg="出错啦")
return success_api(msg="启动成功")
return fail_api(msg="数据错误")
# 禁用用户
@admin_user.put('/disable')
@authorize("admin:user:edit", log=True)
def dis_enable():
_id = request.json.get('userId')
if _id:
res = user_curd.disable_status(_id)
if not res:
return fail_api(msg="出错啦")
return success_api(msg="禁用成功")
return fail_api(msg="数据错误")
# 批量删除
@admin_user.delete('/batchRemove')
@authorize("admin:user:remove", log=True)
def batch_remove():
ids = request.form.getlist('ids[]')
user_curd.batch_remove(ids)
return success_api(msg="批量删除成功")
@@ -0,0 +1,40 @@
from flask import Blueprint, request, render_template
from flask_restful import Api
from applications.common.admin import user_curd
from applications.common.utils.http import table_api
from applications.common.utils.rights import authorize
from applications.models import Role
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():
page = request.args.get('page', type=int)
limit = request.args.get('limit', type=int)
real_name = request.args.get('realName', type=str)
username = request.args.get('username', type=str)
dept_id = request.args.get('deptId', type=int)
filters = {}
if real_name:
filters["realname"] = ('%' + real_name + '%')
if username:
filters["username"] = ('%' + username + '%')
user_data, count = user_curd.get_user_data_dict(page=page, limit=limit, filters=filters, deptId=dept_id)
return table_api(data=user_data, count=count)
# 用户增加
@users_bp.get('/add')
@authorize("admin:user:add", log=True)
def add():
roles = Role.query.all()
return render_template('admin/user/add.html', roles=roles)
from . import profile
from . import user_view
@@ -0,0 +1,56 @@
# 个人中心
from flask import render_template, request, make_response
from flask_login import login_required, current_user
from flask_restful import Resource, reqparse
from applications.common.admin import user_curd
from applications.common.utils.http import fail_api, success_api
from applications.view.company.users import users_bp, user_api
@users_bp.get('/center')
@login_required
def center():
user_info = current_user
user_logs = user_curd.get_current_user_logs()
return render_template('admin/user/profile.html', user_info=user_info, user_logs=user_logs)
# 修改头像
@users_bp.get('/avatar')
@login_required
def profile():
return render_template('admin/user/avatar.html')
# 修改头像
@users_bp.put('/updateAvatar')
@login_required
def update_avatar():
url = request.json.get("avatar").get("src")
if not user_curd.update_avatar(url):
return fail_api(msg="出错啦")
return success_api(msg="修改成功")
# 修改当前用户信息
@users_bp.put('/updateInfo')
@login_required
def update_info():
res_json = request.json
if not user_curd.update_current_user_info(req_json=res_json):
return fail_api(msg="出错啦")
return success_api(msg="更新成功")
@user_api.resource('/editPassword')
class EditPassword(Resource):
"""前用户密码"""
@login_required
def get(self):
return make_response(render_template('admin/user/edit_password.html'))
@login_required
def put(self):
res_json = request.json
return user_curd.edit_password(res_json=res_json)
@@ -0,0 +1,108 @@
from flask import render_template, request, make_response
from flask_restful import Resource
from applications.extensions import db
from applications.common.admin import user_curd
from applications.common.utils.http import fail_api, success_api
from applications.common.utils.rights import authorize
from applications.models import User, Role
from applications.view.company.users import user_api, users_bp
@user_api.resource('/')
class Users(Resource):
"""用户列表数据操作"""
@authorize("admin:user:main", log=True)
def get(self):
return make_response(render_template('admin/user/main.html'))
@authorize("admin:user:add", log=True)
def post(self):
"""新建单个用户"""
req_json = request.json
a = req_json.get("roleIds")
username = req_json.get('username')
real_name = req_json.get('realName')
password = req_json.get('password')
role_ids = a.split(',')
if not username or not real_name or not password:
return fail_api(msg="账号姓名密码不得为空")
if user_curd.is_user_exists(username):
return fail_api(msg="用户已经存在")
_id = user_curd.add_user(username, real_name, password)
user_curd.add_user_role(_id, role_ids)
return success_api(msg="增加成功")
@user_api.resource('/<user_id>')
class CURDUser(Resource):
"""修改用户数据"""
@authorize("admin:user:edit", log=True)
def get(self, user_id):
# 获取编辑用户信息
user = User.query.filter_by(id=user_id).first()
roles = Role.query.all()
checked_roles = []
for r in user.role:
checked_roles.append(r.id)
return make_response(
render_template('admin/user/edit_users.html', user=user, roles=roles, checked_roles=checked_roles))
@authorize("admin:user:remove", log=True)
def delete(self, user_id):
# 删除用户
res = user_curd.delete_by_id(user_id)
if not res:
return fail_api(msg="删除失败")
return success_api(msg="删除成功")
@authorize("admin:user:edit", log=True)
def put(self, user_id):
# 更新用户数据
req_json = request.json
a = req_json.get("roleIds")
_id = req_json.get("userId")
username = req_json.get('username')
real_name = req_json.get('realName')
dept_id = req_json.get('deptId')
role_ids = a.split(',')
user_curd.update_user(id, username, real_name, dept_id)
user_curd.update_user_role(_id, role_ids)
return success_api(msg="更新成功")
# 批量删除
@users_bp.delete('/batchRemove')
@authorize("admin:user:remove", log=True)
def batch_remove():
ids = request.form.getlist('ids[]')
user_curd.batch_remove(ids)
return success_api(msg="批量删除成功")
@users_bp.put('/enable')
def user_enable():
# 启用或者禁用用户 enable disable
user_id = request.json.get('userId')
operate = request.json.get('operate')
user_id = int(user_id)
operate = int(operate)
if user_id:
if operate == 1:
user = User.query.filter_by(id=user_id).update({"enable": operate})
message = success_api(msg="启动成功")
else:
user = User.query.filter_by(id=user_id).update({"enable": operate})
message = success_api(msg="禁用成功")
if user:
db.session.commit()
else:
return fail_api(msg="出错啦")
return message
return fail_api(msg="数据错误")
+18 -21
View File
@@ -1,12 +1,13 @@
from flask import Blueprint, session, redirect, url_for, render_template, request 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 applications.common.admin import index_curd 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
passport_bp = Blueprint('passport', __name__, url_prefix='/passport') passport_bp = Blueprint('passport', __name__, url_prefix='/passport')
passport_api = Api(passport_bp)
def register_passport_views(app): def register_passport_views(app):
@@ -21,32 +22,28 @@ def get_captcha():
return resp return resp
# 登录 @passport_api.resource('/login')
@passport_bp.get('/login') class Login(Resource):
def login(): 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: if current_user.is_authenticated:
return redirect(url_for('admin.index')) return redirect(url_for('admin.index'))
return render_template('admin/login.html')
return make_response(render_template('admin/login.html'))
# 登录 def post(self):
@passport_bp.post('/login')
def login_post(): req = self.login_req.parse_args()
req = request.form
username = req.get('username')
password = req.get('password')
code = req.get('captcha')
if not username or not password or not code:
return fail_api(msg="用户名或密码没有输入")
s_code = session.get("code", None) s_code = session.get("code", None)
if not all([code, s_code]): if req.captcha != s_code:
return fail_api(msg="参数错误")
if code != s_code:
return fail_api(msg="验证码错误") return fail_api(msg="验证码错误")
user = User.query.filter_by(username=username).first() user = User.query.filter_by(username=req.username).first()
if user is None: if user is None:
return fail_api(msg="不存在的用户") return fail_api(msg="不存在的用户")
@@ -54,7 +51,7 @@ def login_post():
if user.enable is 0: if user.enable is 0:
return fail_api(msg="用户被暂停使用") return fail_api(msg="用户被暂停使用")
if username == user.username and user.validate_password(password): if user.validate_password(req.password):
# 登录 # 登录
login_user(user) login_user(user)
# 记录登录日志 # 记录登录日志