修改目录结构
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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 评论 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 评论 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 评论 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 评论 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',
|
||||||
|
|||||||
+2
-3
@@ -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',
|
||||||
@@ -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']
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 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>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-row">
|
{# 右侧栏 #}
|
||||||
|
<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">
|
||||||
</div>
|
<input value="{{ user_info.realname }}" type="text" name="realName"
|
||||||
<div class="layui-form-mid layui-word-aux">建议:图片的尺寸宽高比为1:1,大小在5m以内。</div>
|
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 评论 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 评论 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 评论 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 评论 5 点赞 12 转发
|
||||||
|
4
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</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>
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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 + '%')
|
||||||
|
|||||||
@@ -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="数据错误")
|
||||||
@@ -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)
|
||||||
# 记录登录日志
|
# 记录登录日志
|
||||||
|
|||||||
Reference in New Issue
Block a user