修改目录结构
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.models import DictType, DictData, DictTypeSchema, DictDataSchema
|
||||
from applications.common.curd import model_to_dicts
|
||||
@@ -39,10 +39,10 @@ def get_dict_data(page, limit, type_code):
|
||||
|
||||
# 增加 dict type
|
||||
def save_dict_type(req_json):
|
||||
description = xss_escape(req_json.get("description"))
|
||||
enable = xss_escape(req_json.get("enable"))
|
||||
type_code = xss_escape(req_json.get("typeCode"))
|
||||
type_name = xss_escape(req_json.get("typeName"))
|
||||
description = escape(req_json.get("description"))
|
||||
enable = escape(req_json.get("enable"))
|
||||
type_code = escape(req_json.get("typeCode"))
|
||||
type_name = escape(req_json.get("typeName"))
|
||||
d = DictType(type_name=type_name, type_code=type_code, enable=enable, description=description)
|
||||
db.session.add(d)
|
||||
db.session.commit()
|
||||
@@ -51,11 +51,11 @@ def save_dict_type(req_json):
|
||||
|
||||
# 编辑字典类型
|
||||
def update_dict_type(req_json):
|
||||
id = xss_escape(req_json.get("id"))
|
||||
description = xss_escape(req_json.get("description"))
|
||||
enable = xss_escape(req_json.get("enable"))
|
||||
type_code = xss_escape(req_json.get("typeCode"))
|
||||
type_name = xss_escape(req_json.get("typeName"))
|
||||
id = escape(req_json.get("id"))
|
||||
description = escape(req_json.get("description"))
|
||||
enable = escape(req_json.get("enable"))
|
||||
type_code = escape(req_json.get("typeCode"))
|
||||
type_name = escape(req_json.get("typeName"))
|
||||
DictType.query.filter_by(id=id).update({
|
||||
"description": description,
|
||||
"enable": enable,
|
||||
@@ -95,11 +95,11 @@ def delete_type_by_id(id):
|
||||
|
||||
# 增加dictdata
|
||||
def save_dict_data(req_json):
|
||||
data_label = xss_escape(req_json.get("dataLabel"))
|
||||
data_value = xss_escape(req_json.get("dataValue"))
|
||||
enable = xss_escape(req_json.get("enable"))
|
||||
remark = xss_escape(req_json.get("remark"))
|
||||
type_code = xss_escape(req_json.get("typeCode"))
|
||||
data_label = escape(req_json.get("dataLabel"))
|
||||
data_value = escape(req_json.get("dataValue"))
|
||||
enable = escape(req_json.get("enable"))
|
||||
remark = escape(req_json.get("remark"))
|
||||
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)
|
||||
db.session.add(d)
|
||||
db.session.commit()
|
||||
@@ -110,11 +110,11 @@ def save_dict_data(req_json):
|
||||
def update_dict_data(req_json):
|
||||
id = req_json.get("dataId")
|
||||
DictData.query.filter_by(id=id).update({
|
||||
"data_label": xss_escape(req_json.get("dataLabel")),
|
||||
"data_value": xss_escape(req_json.get("dataValue")),
|
||||
"enable": xss_escape(req_json.get("enable")),
|
||||
"remark": xss_escape(req_json.get("remark")),
|
||||
"type_code": xss_escape(req_json.get("typeCode"))
|
||||
"data_label": escape(req_json.get("dataLabel")),
|
||||
"data_value": escape(req_json.get("dataValue")),
|
||||
"enable": escape(req_json.get("enable")),
|
||||
"remark": escape(req_json.get("remark")),
|
||||
"type_code": escape(req_json.get("typeCode"))
|
||||
})
|
||||
db.session.commit()
|
||||
return
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from applications.common.utils.validate import xss_escape
|
||||
from flask import escape
|
||||
from applications.extensions import db
|
||||
from applications.models.rights.power import Power, PowerSchema2
|
||||
from applications.models import Role
|
||||
@@ -21,14 +21,14 @@ def select_parent():
|
||||
|
||||
# 增加权限
|
||||
def save_power(req):
|
||||
icon = xss_escape(req.get("icon"))
|
||||
openType = xss_escape(req.get("openType"))
|
||||
parentId = xss_escape(req.get("parentId"))
|
||||
powerCode = xss_escape(req.get("powerCode"))
|
||||
powerName = xss_escape(req.get("powerName"))
|
||||
powerType = xss_escape(req.get("powerType"))
|
||||
powerUrl = xss_escape(req.get("powerUrl"))
|
||||
sort = xss_escape(req.get("sort"))
|
||||
icon = escape(req.get("icon"))
|
||||
openType = escape(req.get("openType"))
|
||||
parentId = escape(req.get("parentId"))
|
||||
powerCode = escape(req.get("powerCode"))
|
||||
powerName = escape(req.get("powerName"))
|
||||
powerType = escape(req.get("powerType"))
|
||||
powerUrl = escape(req.get("powerUrl"))
|
||||
sort = escape(req.get("sort"))
|
||||
power = Power(
|
||||
icon=icon,
|
||||
open_type=openType,
|
||||
@@ -55,14 +55,14 @@ def get_power_by_id(id):
|
||||
def update_power(req_json):
|
||||
id = req_json.get("powerId")
|
||||
data = {
|
||||
"icon": xss_escape(req_json.get("icon")),
|
||||
"open_type": xss_escape(req_json.get("openType")),
|
||||
"parent_id": xss_escape(req_json.get("parentId")),
|
||||
"code": xss_escape(req_json.get("powerCode")),
|
||||
"name": xss_escape(req_json.get("powerName")),
|
||||
"type": xss_escape(req_json.get("powerType")),
|
||||
"url": xss_escape(req_json.get("powerUrl")),
|
||||
"sort": xss_escape(req_json.get("sort"))
|
||||
"icon": escape(req_json.get("icon")),
|
||||
"open_type": escape(req_json.get("openType")),
|
||||
"parent_id": escape(req_json.get("parentId")),
|
||||
"code": escape(req_json.get("powerCode")),
|
||||
"name": escape(req_json.get("powerName")),
|
||||
"type": escape(req_json.get("powerType")),
|
||||
"url": escape(req_json.get("powerUrl")),
|
||||
"sort": escape(req_json.get("sort"))
|
||||
}
|
||||
# print(data)
|
||||
power = Power.query.filter_by(id=id).update(data)
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from sqlalchemy import and_
|
||||
|
||||
from applications.common.utils.validate import xss_escape
|
||||
from applications.extensions import db
|
||||
from applications.models import Role, RoleSchema
|
||||
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):
|
||||
print(page, limit, filters)
|
||||
role = Role.query.filter(and_(*[getattr(Role, k).like(v) for k, v in filters.items()])).paginate(page=page,
|
||||
per_page=limit,
|
||||
error_out=False)
|
||||
@@ -27,11 +27,11 @@ def get_role_data_dict(page, limit, filters):
|
||||
|
||||
def add_role(req):
|
||||
""" 增加角色 """
|
||||
details = xss_escape(req.get("details"))
|
||||
enable = xss_escape(req.get("enable"))
|
||||
roleCode = xss_escape(req.get("roleCode"))
|
||||
roleName = xss_escape(req.get("roleName"))
|
||||
sort = xss_escape(req.get("sort"))
|
||||
details = req.get("details")
|
||||
enable = req.get("enable")
|
||||
roleCode = req.get("roleCode")
|
||||
roleName = req.get("roleName")
|
||||
sort = req.get("sort")
|
||||
role = Role(
|
||||
details=details,
|
||||
enable=enable,
|
||||
@@ -53,11 +53,11 @@ def update_role(req_json):
|
||||
""" 更新角色 """
|
||||
_id = req_json.get("roleId")
|
||||
data = {
|
||||
"code": xss_escape(req_json.get("roleCode")),
|
||||
"name": xss_escape(req_json.get("roleName")),
|
||||
"sort": xss_escape(req_json.get("sort")),
|
||||
"enable": xss_escape(req_json.get("enable")),
|
||||
"details": xss_escape(req_json.get("details"))
|
||||
"code": req_json.get("roleCode"),
|
||||
"name": req_json.get("roleName"),
|
||||
"sort": req_json.get("sort"),
|
||||
"enable": req_json.get("enable"),
|
||||
"details": req_json.get("details")
|
||||
}
|
||||
role = Role.query.filter_by(id=_id).update(data)
|
||||
db.session.commit()
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
</a>
|
||||
<!-- 功 能 菜 单 -->
|
||||
<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>
|
||||
</dl>
|
||||
</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) {
|
||||
$.ajax({
|
||||
url: '/admin/user/editPassword',
|
||||
url: '/users/editPassword',
|
||||
data: JSON.stringify(data.field),
|
||||
contentType: 'application/json',
|
||||
dataType: 'json',
|
||||
|
||||
+3
-4
@@ -44,7 +44,7 @@
|
||||
<label class="layui-form-label">角色</label>
|
||||
<div class="layui-input-block">
|
||||
{% for role in roles %}
|
||||
<input{% if role.id in checked_roles %}
|
||||
<input {% if role.id in checked_roles %}
|
||||
checked
|
||||
{% endif %}
|
||||
value="{{ role.id }}" title="{{ role.name }}" type="checkbox"
|
||||
@@ -57,8 +57,7 @@
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<div class="button-container">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit=""
|
||||
lay-filter="user-update">
|
||||
<button type="submit" class="pear-btn pear-btn-primary pear-btn-sm" lay-submit="" lay-filter="user-update">
|
||||
<i class="layui-icon layui-icon-ok"></i>
|
||||
提交
|
||||
</button>
|
||||
@@ -94,7 +93,7 @@
|
||||
roleIds = roleIds.substr(0, roleIds.length - 1)
|
||||
data.field.roleIds = roleIds
|
||||
$.ajax({
|
||||
url: '/admin/user/update',
|
||||
url: '/users/' + data.userId,
|
||||
data: JSON.stringify(data.field),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
@@ -111,7 +111,7 @@
|
||||
let dtree = layui.dtree
|
||||
let popup = layui.popup
|
||||
let common = layui.common
|
||||
let MODULE_PATH = '/admin/user/'
|
||||
let MODULE_PATH = '/users/'
|
||||
|
||||
// 表格数据
|
||||
let cols = [
|
||||
@@ -211,14 +211,14 @@
|
||||
form.on('switch(user-enable)', function (obj) {
|
||||
let operate
|
||||
if (obj.elem.checked) {
|
||||
operate = 'enable'
|
||||
operate = 1
|
||||
} else {
|
||||
operate = 'disable'
|
||||
operate = 0
|
||||
}
|
||||
let loading = layer.load()
|
||||
$.ajax({
|
||||
url: '/admin/user/' + operate,
|
||||
data: JSON.stringify({ userId: this.value }),
|
||||
url: MODULE_PATH + 'enable',
|
||||
data: JSON.stringify({ operate: operate, userId: this.value }),
|
||||
dataType: 'json',
|
||||
contentType: 'application/json',
|
||||
type: 'put',
|
||||
@@ -249,7 +249,7 @@
|
||||
title: '修改',
|
||||
shade: 0.1,
|
||||
area: ['550px', '500px'],
|
||||
content: MODULE_PATH + 'edit/' + obj.data['id']
|
||||
content: MODULE_PATH + obj.data['id']
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -1,126 +1,227 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>头像上传</title>
|
||||
<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-space15">
|
||||
<div class="layui-col-xs9">
|
||||
<div style="height:325px;background-color: rgb(247, 247, 247);">
|
||||
<img id="sourceImage" src="">
|
||||
<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-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 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>
|
||||
<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 () {
|
||||
layui.use(['element', 'jquery', 'layer', 'form'], 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: '/admin/user/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('上传失败')
|
||||
}
|
||||
}
|
||||
})
|
||||
let form = layui.form
|
||||
// 修改密码页面
|
||||
$('.edit-password').click(function () {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '修改密码',
|
||||
shade: 0.1,
|
||||
area: ['550px', '280px'],
|
||||
content: '/users/editPassword'
|
||||
})
|
||||
}
|
||||
return false
|
||||
})
|
||||
|
||||
$('.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)
|
||||
// 修改头像
|
||||
$('#avatar').click(function () {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '更换图片',
|
||||
shade: 0.1,
|
||||
area: ['900px', '500px'],
|
||||
content: '/users/avatar',
|
||||
btn: ['确定', '取消'],
|
||||
yes: function (index, layero) {
|
||||
window['layui-layer-iframe' + index].submitForm()
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
// 表单提交更改个人信息数据
|
||||
form.on('submit(user-update)', function (data) {
|
||||
$.ajax({
|
||||
url: '/users/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>
|
||||
</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.file import admin_file
|
||||
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
|
||||
|
||||
|
||||
def register_admin_views(app: Flask):
|
||||
app.register_blueprint(admin_bp)
|
||||
app.register_blueprint(admin_user)
|
||||
app.register_blueprint(users_bp)
|
||||
app.register_blueprint(admin_file)
|
||||
app.register_blueprint(admin_monitor_bp)
|
||||
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.rights import authorize
|
||||
@@ -20,7 +20,7 @@ def main():
|
||||
def dict_type_data():
|
||||
page = request.args.get('page', 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)
|
||||
return table_api(data=data,count=count)
|
||||
|
||||
@@ -100,7 +100,7 @@ def dict_type_delete(_id):
|
||||
def dict_code_data():
|
||||
page = request.args.get('page', 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)
|
||||
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 applications.common.admin import role_curd
|
||||
from applications.common.utils.http import table_api, success_api, fail_api
|
||||
@@ -21,8 +21,8 @@ def main():
|
||||
def table():
|
||||
page = request.args.get('page', type=int)
|
||||
limit = request.args.get('limit', type=int)
|
||||
role_name = escape(request.args.get('roleName', type=str))
|
||||
role_code = escape(request.args.get('roleCode', type=str))
|
||||
role_name = request.args.get('roleName', type=str)
|
||||
role_code = request.args.get('roleCode', type=str)
|
||||
filters = {}
|
||||
if 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_restful import Resource, Api, reqparse
|
||||
from applications.common.admin import index_curd
|
||||
from applications.common.admin_log import login_log
|
||||
from applications.common.utils.http import fail_api, success_api
|
||||
from applications.models import User
|
||||
|
||||
passport_bp = Blueprint('passport', __name__, url_prefix='/passport')
|
||||
passport_api = Api(passport_bp)
|
||||
|
||||
|
||||
def register_passport_views(app):
|
||||
@@ -21,49 +22,45 @@ def get_captcha():
|
||||
return resp
|
||||
|
||||
|
||||
# 登录
|
||||
@passport_bp.get('/login')
|
||||
def login():
|
||||
if current_user.is_authenticated:
|
||||
return redirect(url_for('admin.index'))
|
||||
return render_template('admin/login.html')
|
||||
@passport_api.resource('/login')
|
||||
class Login(Resource):
|
||||
login_req = reqparse.RequestParser(bundle_errors=True)
|
||||
login_req.add_argument('username', type=str, help='请输入用户名', required=True)
|
||||
login_req.add_argument('password', type=str, help='请输入密码', required=True)
|
||||
login_req.add_argument('captcha', type=str, help='请输入验证码', required=True)
|
||||
|
||||
def get(self):
|
||||
if current_user.is_authenticated:
|
||||
return redirect(url_for('admin.index'))
|
||||
|
||||
# 登录
|
||||
@passport_bp.post('/login')
|
||||
def login_post():
|
||||
req = request.form
|
||||
username = req.get('username')
|
||||
password = req.get('password')
|
||||
code = req.get('captcha')
|
||||
return make_response(render_template('admin/login.html'))
|
||||
|
||||
if not username or not password or not code:
|
||||
return fail_api(msg="用户名或密码没有输入")
|
||||
s_code = session.get("code", None)
|
||||
def post(self):
|
||||
|
||||
if not all([code, s_code]):
|
||||
return fail_api(msg="参数错误")
|
||||
req = self.login_req.parse_args()
|
||||
|
||||
if code != s_code:
|
||||
return fail_api(msg="验证码错误")
|
||||
user = User.query.filter_by(username=username).first()
|
||||
s_code = session.get("code", None)
|
||||
|
||||
if user is None:
|
||||
return fail_api(msg="不存在的用户")
|
||||
if req.captcha != s_code:
|
||||
return fail_api(msg="验证码错误")
|
||||
user = User.query.filter_by(username=req.username).first()
|
||||
|
||||
if user.enable is 0:
|
||||
return fail_api(msg="用户被暂停使用")
|
||||
if user is None:
|
||||
return fail_api(msg="不存在的用户")
|
||||
|
||||
if username == user.username and user.validate_password(password):
|
||||
# 登录
|
||||
login_user(user)
|
||||
# 记录登录日志
|
||||
login_log(request, uid=user.id, is_access=True)
|
||||
# 存入权限
|
||||
index_curd.add_auth_session()
|
||||
return success_api(msg="登录成功")
|
||||
login_log(request, uid=user.id, is_access=False)
|
||||
return fail_api(msg="用户名或密码错误")
|
||||
if user.enable is 0:
|
||||
return fail_api(msg="用户被暂停使用")
|
||||
|
||||
if user.validate_password(req.password):
|
||||
# 登录
|
||||
login_user(user)
|
||||
# 记录登录日志
|
||||
login_log(request, uid=user.id, is_access=True)
|
||||
# 存入权限
|
||||
index_curd.add_auth_session()
|
||||
return success_api(msg="登录成功")
|
||||
login_log(request, uid=user.id, is_access=False)
|
||||
return fail_api(msg="用户名或密码错误")
|
||||
|
||||
|
||||
# 退出登录
|
||||
|
||||
Reference in New Issue
Block a user