修改目录结构2

This commit is contained in:
zhengxinonly
2021-06-23 23:56:04 +08:00
parent 6da6768f81
commit 0cb74c5eb7
21 changed files with 733 additions and 57 deletions
+16 -17
View File
@@ -1,4 +1,3 @@
from flask import escape
from applications.extensions import db
from applications.models.rights.power import Power, PowerSchema2
from applications.models import Role
@@ -21,14 +20,14 @@ def select_parent():
# 增加权限
def save_power(req):
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"))
icon = req.get("icon")
openType = req.get("openType")
parentId = req.get("parentId")
powerCode = req.get("powerCode")
powerName = req.get("powerName")
powerType = req.get("powerType")
powerUrl = req.get("powerUrl")
sort = req.get("sort")
power = Power(
icon=icon,
open_type=openType,
@@ -55,14 +54,14 @@ def get_power_by_id(id):
def update_power(req_json):
id = req_json.get("powerId")
data = {
"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"))
"icon": req_json.get("icon"),
"open_type": req_json.get("openType"),
"parent_id": req_json.get("parentId"),
"code": req_json.get("powerCode"),
"name": req_json.get("powerName"),
"type": req_json.get("powerType"),
"url": req_json.get("powerUrl"),
"sort": req_json.get("sort")
}
# print(data)
power = Power.query.filter_by(id=id).update(data)
@@ -1,5 +1,9 @@
import json
from flask import Flask
from applications.extensions.init_databases.data import user_data
def add_data(fields, data_list, obj):
from applications.extensions import db
@@ -284,6 +288,27 @@ def create_example():
add_data(_fields, _data_list, DictData)
course_data = [
{'id': 1, 'name': '基础课'},
{'id': 2, 'name': '进阶课'},
{'id': 3, 'name': '爬虫课'},
{'id': 4, 'name': '数据分析课'},
{'id': 5, 'name': '全栈课程'},
{'id': 6, 'name': '自动化办公专题'},
{'id': 7, 'name': '反反爬专题'},
{'id': 8, 'name': 'JavaScript解密专题'},
{'id': 9, 'name': 'Scrapy框架专题'},
]
phase_data = [
{'name': '基础课'},
{'name': '进阶'},
{'name': '爬虫'},
{'name': '数据分析'},
{'name': '全栈课程'}
]
def register_script(app: Flask):
@app.cli.command()
def init_db():
@@ -302,3 +327,110 @@ def register_script(app: Flask):
from applications.extensions import db
db.drop_all()
db.create_all()
@app.cli.command()
def init_vip_member():
from applications.models.vip import VipMember, Course, Phase
from applications.extensions import db
course_list = []
for data in course_data:
course = Course()
course.name = data.get('name')
db.session.add(course)
course_list.append(course_list)
for _phase in phase_data:
for i in range(1, 11):
print(_phase['name'], i)
phase = Phase()
phase.name = _phase['name']
phase.phase = i
db.session.add(phase)
db.session.commit()
base_course = Course.query.get(1)
adv_course = Course.query.get(2)
spider_course = Course.query.get(3)
ana_course = Course.query.get(4)
stack_course = Course.query.get(5)
for data in user_data:
user = VipMember()
user.id = int(data['id'])
user.create_at = data['date']
user.username = data['name']
user.wx = data['wx']
user.qq = data['qq']
user.account = data['account']
user.phase = int(data['phase'])
user.remark = data['remark']
print('rights', data['rights'])
rights = int(data['rights']) if data['rights'] else 0
user.courses.append(base_course)
if rights == 1:
user.courses.append(adv_course)
if rights == 3:
user.courses.append(spider_course)
if rights == 4:
user.courses.append(adv_course)
user.courses.append(base_course)
if rights == 5:
user.courses.append(ana_course)
if rights == 7:
user.courses.append(stack_course)
if rights == 8:
user.courses.append(spider_course)
user.courses.append(ana_course)
if rights == 9:
user.courses.append(adv_course)
user.courses.append(spider_course)
user.courses.append(ana_course)
if rights == 10:
user.courses.append(spider_course)
user.courses.append(stack_course)
if rights == 11:
user.courses.append(adv_course)
user.courses.append(spider_course)
user.courses.append(stack_course)
if rights == 16:
user.courses.append(adv_course)
user.courses.append(spider_course)
user.courses.append(ana_course)
user.courses.append(stack_course)
if data['base']:
base_list = data['base'].replace('', ',').split(',')
print(base_list)
for rou in base_list:
print('rou', rou)
x = Phase.query.filter(Phase.name == '基础课').filter(Phase.phase == int(rou)).first()
user.phases.append(x)
print(x)
if data['adv']:
adv_list = data['adv'].replace('', ',').split(',')
for rou in adv_list:
x = Phase.query.filter(Phase.name == '高级开发').filter(Phase.phase == int(rou)).first()
user.phases.append(x)
print(adv_list)
if data['spider']:
spider_list = data['spider'].replace('', ',').split(',')
for rou in spider_list:
x = Phase.query.filter(Phase.name == '爬虫').filter(Phase.phase == int(rou)).first()
user.phases.append(x)
print(spider_list)
if data['ana']:
ana_list = data['ana'].replace('', ',').split(',')
for rou in ana_list:
x = Phase.query.filter(Phase.name == '数据分析').filter(Phase.phase == int(rou)).first()
user.phases.append(x)
print(ana_list)
if data['stack']:
stack_list = data['stack'].replace('', ',').split(',')
for rou in stack_list:
x = Phase.query.filter(Phase.name == '全栈课程').filter(Phase.phase == int(rou)).first()
user.phases.append(x)
print(stack_list)
db.session.commit()
+1
View File
@@ -6,3 +6,4 @@ from applications.models.rights.power import Power, PowerSchema, PowerSchema2
from applications.models.rights.role import Role, RoleSchema
from applications.models.rights.role_power import role_power
from applications.models.rights.user_role import user_role
from applications.models.vip import VipMember, Course, Phase, course_phase, member_phase
+1
View File
@@ -18,6 +18,7 @@ class User(db.Model, UserMixin):
dept_id = db.Column(db.Integer, comment='部门id')
create_at = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
update_at = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='创建时间')
role = db.relationship('Role', secondary="rt_user_role", backref=db.backref('user'), lazy='dynamic')
def set_password(self, password):
+62
View File
@@ -0,0 +1,62 @@
from datetime import datetime
from applications.extensions import db
class VipMember(db.Model):
__tablename__ = 'vip_member'
id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='VIP用户ID')
username = db.Column(db.String(20), comment='用户名')
mobile = db.Column(db.String(11), comment='电话号码')
id_card = db.Column(db.String(16), comment='身份证号码')
wx = db.Column(db.String(50), comment='微信号')
qq = db.Column(db.String(20), comment='QQ号')
account = db.Column(db.String(50), comment='报名账号')
number = db.Column(db.String(12), comment='学号')
phase = db.Column(db.SMALLINT, comment='第几期')
avatar = db.Column(db.String(255), comment='头像', default="/static/admin/admin/images/avatar.jpg")
remark = db.Column(db.String(255), comment='备注')
password_hash = db.Column(db.String(128), comment='哈希密码')
enable = db.Column(db.Integer, default=0, comment='启用')
create_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')
update_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')
courses = db.relationship('Course', secondary="vip_member_course", backref=db.backref('members'), lazy='dynamic')
phases = db.relationship('Phase', secondary="vip_member_phase", backref=db.backref('members'), lazy='dynamic')
class Course(db.Model):
__tablename__ = 'vip_course'
id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='课程id')
name = db.Column(db.String(20), comment='课程名')
class Phase(db.Model):
__tablename__ = 'vip_phase'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(20), comment='课程名')
phase = db.Column(db.Integer, comment='第几期')
teacher = db.Column(db.String(20), comment='带课讲师')
# 创建中间表
member_phase = db.Table(
"vip_member_phase", # 中间表名称
db.Column("id", db.Integer, primary_key=True, autoincrement=True, comment='标识'), # 主键
db.Column("member_id", db.Integer, db.ForeignKey("vip_member.id"), comment='用户编号'), # 属性 外键
db.Column("phase_id", db.Integer, db.ForeignKey("vip_phase.id"), comment='期数编号'), # 属性 外键
)
# 创建中间表
course_phase = db.Table(
"vip_member_course", # 中间表名称
db.Column("id", db.Integer, primary_key=True, autoincrement=True, comment='标识'), # 主键
db.Column("member_id", db.Integer, db.ForeignKey("vip_member.id"), comment='用户编号'), # 属性 外键
db.Column("course_id", db.Integer, db.ForeignKey("vip_course.id"), comment='期数编号'), # 属性 外键
)
@@ -2024,7 +2024,7 @@ window.tinymce.Resource.add("tinymce.plugins.emoticons", {
category: "people"
},
school_satchel: {
keywords: [ "student", "education", "bag", "backpack" ],
keywords: [ "vip", "education", "bag", "backpack" ],
"char": '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udf92" src="1f392.png"/>',
fitzpatrick_scale: false,
category: "people"
@@ -5012,7 +5012,7 @@ window.tinymce.Resource.add("tinymce.plugins.emoticons", {
category: "travel_and_places"
},
school: {
keywords: [ "building", "student", "education", "learn", "teach" ],
keywords: [ "building", "vip", "education", "learn", "teach" ],
"char": '<img data-emoticon="true" style="width:1em;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em" draggable="false" alt="\ud83c\udfeb" src="1f3eb.png"/>',
fitzpatrick_scale: false,
category: "travel_and_places"
File diff suppressed because one or more lines are too long
@@ -2011,7 +2011,7 @@ window.tinymce.Resource.add("tinymce.plugins.emoticons", {
category: "people"
},
school_satchel: {
keywords: [ "student", "education", "bag", "backpack" ],
keywords: [ "vip", "education", "bag", "backpack" ],
"char": "\ud83c\udf92",
fitzpatrick_scale: false,
category: "people"
@@ -4999,7 +4999,7 @@ window.tinymce.Resource.add("tinymce.plugins.emoticons", {
category: "travel_and_places"
},
school: {
keywords: [ "building", "student", "education", "learn", "teach" ],
keywords: [ "building", "vip", "education", "learn", "teach" ],
"char": "\ud83c\udfeb",
fitzpatrick_scale: false,
category: "travel_and_places"
File diff suppressed because one or more lines are too long
@@ -12,6 +12,7 @@
<div class="layui-form-item">
<label class="layui-form-label">上级部门</label>
<div class="layui-input-block">
{#渲染树形选择器#}
<ul id="selectParent" name="parentId" class="dtree" data-id="0"></ul>
</div>
</div>
@@ -86,6 +87,7 @@
let $ = layui.jquery
let dtree = layui.dtree
/*渲染下拉选择组件*/
dtree.renderSelect({
elem: '#selectParent',
url: '/dept/tree',
@@ -97,6 +99,7 @@
selectInitVal: '1'
})
/*表单组件,提交按钮之后触发的事件*/
form.on('submit(dept-save)', function (data) {
$.ajax({
url: '/dept/save',
+1 -1
View File
@@ -33,7 +33,7 @@
</div>
<div class="layui-form-item">
<label class="layui-form-label">邮箱</label>
<div class="layui-input-block">x`
<div class="layui-input-block">
<input type="text" value="{{ dept.email }}" name="email" lay-verify="title" autocomplete="off"
placeholder="请输入标题"
class="layui-input">
+38 -22
View File
@@ -4,19 +4,24 @@
<title>部门新增</title>
{% include 'admin/common/header.html' %}
</head>
{#pear 后台边框#}
<body class="pear-container">
{#搜索框布局#}
<div class="layui-card">
<div class="layui-card-body">
<form class="layui-form" action="">
<div class="layui-form-item">
<label class="layui-form-label">部门名称</label>
<div class="layui-input-inline">
{#部门信息搜索字段#}
<input type="text" name="deptName" placeholder="" class="layui-input">
</div>
{#查询按钮--需要触发layui事件#}
<button class="pear-btn pear-btn-md pear-btn-primary" lay-submit lay-filter="dept-query">
<i class="layui-icon layui-icon-search"></i>
查询
</button>
{#重置按钮#}
<button type="reset" class="pear-btn pear-btn-md">
<i class="layui-icon layui-icon-refresh"></i>
重置
@@ -28,10 +33,12 @@
<div class="layui-card">
<div class="layui-card-body">
{#表格字段渲染#}
<table id="dept-table" lay-filter="dept-table"></table>
</div>
</div>
{#表格工具栏,需要在表格中绑定,且需要自定义事件#}
<script type="text/html" id="dept-toolbar">
{% if authorize("admin:dept:edit") %}
<button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add">
@@ -47,19 +54,17 @@
{% endif %}
</script>
{#操作字段,需要在表格中使用#}
<script type="text/html" id="dept-bar">
{% if authorize("admin:dept:edit") %}
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit"><i
class="layui-icon layui-icon-edit"></i>
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit">
<i class="layui-icon layui-icon-edit"></i>
</button>
{% endif %}
{% if authorize("admin:dept:remove") %}
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove"><i
class="layui-icon layui-icon-delete"></i>
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove">
<i class="layui-icon layui-icon-delete"></i>
</button>
{% endif %}
</script>
{#表格内的切换按钮#}
<script type="text/html" id="dept-status">
<input type="checkbox" name="status" value="{{ "{{ d.deptId }}" }}" lay-skin="switch" lay-text="启用|禁用"
lay-filter="dept-enable"
@@ -78,20 +83,23 @@
let treetable = layui.treetable
let popup = layui.popup
{#定义模块访问路径#}
let MODULE_PATH = '/dept/'
{#定义表格渲染函数#}
window.render = function () {
/*树形表格渲染*/
treetable.render({
treeColIndex: 1,
treeSpid: 0,
treeIdName: 'deptId',
treePidName: 'parentId',
treeIdName: 'deptId', /*表格的顶级字段*/
treePidName: 'parentId', /*父级id选项*/
skin: 'line',
method: 'post',
method: 'post', /**/
treeDefaultClose: false,
toolbar: '#dept-toolbar',
elem: '#dept-table',
url: '/dept/data',
toolbar: '#dept-toolbar', /*表格的工具栏*/
elem: '#dept-table', /*表格挂载的对象*/
url: '/dept/data', /*数据来源接口*/
page: false,
cols: [
[
@@ -105,19 +113,22 @@
{ field: 'sort', title: '排序', width: 100 },
{ title: '操作', templet: '#dept-bar', width: 120, align: 'center' }
]
]
]/*表格渲染的数据*/
})
}
/*查询表单按钮被点击的事件*/
form.on('submit(dept-query)', function (data) {
var keyword = data.field.deptName
var $tds = $('#dept-table').next('.treeTable').find('.layui-table-body tbody tr td')
let keyword = $.trim(data.field.deptName)
/*获取所有的公司节点*/
let $tds = $('#dept-table').next('.treeTable').find('.layui-table-body tbody tr td')
if (!keyword) {
$tds.css('background-color', 'transparent')
layer.msg('请输入关键字', { icon: 5 })
return
return false
}
var searchCount = 0
/*本地查询并且标注高亮*/
let searchCount = 0
$tds.each(function () {
$(this).css('background-color', 'transparent')
if ($(this).text().indexOf(keyword) >= 0) {
@@ -139,14 +150,18 @@
render()
/*表格的操作栏*/
table.on('tool(dept-table)', function (obj) {
if (obj.event === 'remove') {
/*移出事件*/
window.remove(obj)
} else if (obj.event === 'edit') {
/*编辑事件*/
window.edit(obj)
}
})
/*表格的工具栏*/
table.on('toolbar(dept-table)', function (obj) {
if (obj.event === 'add') {
window.add()
@@ -158,6 +173,7 @@
}
})
/*切换选择状态*/
form.on('switch(dept-enable)', function (obj) {
let operate
if (obj.elem.checked) {
@@ -188,8 +204,8 @@
type: 2,
title: '新增',
shade: 0.1,
area: ['450px', '500px'],
content: MODULE_PATH + 'add'
area: ['450px', '500px'], /*新增窗口的大小*/
content: MODULE_PATH + 'add' /*新增窗口从那里来*/
})
}
@@ -199,7 +215,7 @@
title: '修改',
shade: 0.1,
area: ['450px', '500px'],
content: MODULE_PATH + 'edit?deptId=' + obj.data['deptId']
content: MODULE_PATH + 'edit?deptId=' + obj.data['deptId'] /*编辑修改窗口从那里来*/
})
}
+1 -1
View File
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html>
<head>
<title>用户管理</title>
<title>角色管理</title>
{% include 'admin/common/header.html' %}</head>
<body class="pear-container">
<div class="layui-card">
@@ -93,7 +93,7 @@
roleIds = roleIds.substr(0, roleIds.length - 1)
data.field.roleIds = roleIds
$.ajax({
url: '/users/' + data.userId,
url: '/users/' + data.field.userId,
data: JSON.stringify(data.field),
dataType: 'json',
contentType: 'application/json',
@@ -0,0 +1,117 @@
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="en">
<head>
<title>用户编辑</title>
{% include 'admin/common/header.html' %}
</head>
<body>
<form class="layui-form" action="">
<div class="mainBox">
<div class="main-container">
<div class="main-container">
<div class="layui-form-item layui-hide">
<label class="layui-form-label">编号</label>
<div class="layui-input-block">
<input type="text" value="{{ user.id }}" name="userId" 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 type="text" value="{{ user.username }}" 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 type="text" value="{{ user.realname }}" name="realName" 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">
<ul id="selectParent" name="deptId" class="dtree" data-id="0"></ul>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">角色</label>
<div class="layui-input-block">
{% for role in roles %}
<input {% if role.id in checked_roles %}
checked
{% endif %}
value="{{ role.id }}" title="{{ role.name }}" type="checkbox"
name="roleIds" lay-skin="primary">
{% endfor %}
</div>
</div>
</div>
</div>
</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">
<i class="layui-icon layui-icon-ok"></i>
提交
</button>
<button type="reset" class="pear-btn pear-btn-sm">
<i class="layui-icon layui-icon-refresh"></i>
重置
</button>
</div>
</div>
</form>
{% include 'admin/common/footer.html' %}
<script>
layui.use(['form', 'jquery', 'dtree'], function () {
let form = layui.form
let $ = layui.jquery
let dtree = layui.dtree
dtree.renderSelect({
elem: '#selectParent',
url: '/dept/tree',
method: 'get',
selectInputName: { nodeId: 'deptId', context: 'deptName' },
skin: 'layui',
dataFormat: 'list',
response: { treeId: 'deptId', parentId: 'parentId', title: 'deptName' },
selectInitVal: "{{ user.dept_id }}"
})
form.on('submit(user-update)', function (data) {
let roleIds = ''
$('input[type=checkbox]:checked').each(function () {
roleIds += $(this).val() + ','
})
roleIds = roleIds.substr(0, roleIds.length - 1)
data.field.roleIds = roleIds
$.ajax({
url: '/users/' + data.field.userId,
data: JSON.stringify(data.field),
dataType: 'json',
contentType: 'application/json',
type: 'put',
success: function (result) {
if (result.success) {
layer.msg(result.msg, { icon: 1, time: 1000 }, function () {
parent.layer.close(parent.layer.getFrameIndex(window.name))//关闭当前页
parent.layui.table.reload('user-table')
})
} else {
layer.msg(result.msg, { icon: 2, time: 1000 })
}
}
})
return false
})
})
</script>
</body>
</html>
+285
View File
@@ -0,0 +1,285 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>付费学员管理</title>
{% include 'admin/common/header.html' %}
<link rel="stylesheet" href="{{ url_for('static', filename='/admin/admin/css/other/user.css') }}"/>
</head>
<body class="pear-container">
{# 查询表单 #}
<div class="layui-card">
<div class="layui-card-body">
<form class="layui-form" action="" lay-filter="user-query-form">
<div class="layui-form-item">
<label class="layui-form-label">用户</label>
<div class="layui-input-inline">
<input type="text" name="username" placeholder="" class="layui-input">
</div>
<label class="layui-form-label">微信</label>
<div class="layui-input-inline">
<input type="text" name="wx" placeholder="" class="layui-input">
</div>
<button class="pear-btn pear-btn-md pear-btn-primary" lay-submit lay-filter="user-query">
<i class="layui-icon layui-icon-search"></i>
查询
</button>
<button type="reset" class="pear-btn pear-btn-md">
<i class="layui-icon layui-icon-refresh"></i>
重置
</button>
</div>
</form>
</div>
</div>
{#影藏侧边栏#}
<div class="user-left user-collasped">
<div class="layui-card">
<div class="layui-card-body">
<div class="button button-primary user-group" user-group="1"> 进阶课</div>
<div class="button button-default user-group" user-group="2"> 爬虫课</div>
<div class="button button-default user-group" user-group="3"> 数据分析课</div>
<div style="overflow: auto">
{# <ul id="dept-tree" class="dept-tree" data-id="0"></ul>#}
</div>
</div>
</div>
</div>
{# 用户表格 #}
<div class="user-main user-collasped">
<div class="layui-card">
<div class="layui-card-body">
<table id="user-table" lay-filter="user-table"></table>
</div>
</div>
</div>
</body>
{% include 'admin/common/footer.html' %}
{# 用户更新时间 #}
<script type="text/html" id="user-updateTime">
{{ ' {{layui.util.toDateString(d.update_at, "yyyy-MM-dd HH:mm:ss")}' |safe }}}
</script>
{# 表格操作 #}
<script type="text/html" id="user-toolbar">
<button class="pear-btn pear-btn-primary pear-btn-md" lay-event="add">
<i class="pear-icon pear-icon-add"></i>
新增
</button>
<button class="pear-btn pear-btn-md" lay-event="batchRemove">
<i class="pear-icon pear-icon-ashbin"></i>
删除
</button>
<button class="pear-btn pear-btn-md" lay-event="collasped">
<i class="pear-icon pear-icon-modular"></i>
高级
</button>
</script>
{# 用户修改操作 #}
<script type="text/html" id="user-bar">
<button class="pear-btn pear-btn-primary pear-btn-sm" lay-event="edit">
<i class="pear-icon pear-icon-edit"></i>
</button>
<button class="pear-btn pear-btn-danger pear-btn-sm" lay-event="remove">
<i class="pear-icon pear-icon-ashbin"></i>
</button>
</script>
<script>
layui.use(['table', 'dtree', 'form', 'jquery', 'popup', 'common'], function () {
let table = layui.table
let form = layui.form
let $ = layui.jquery
let dtree = layui.dtree
let popup = layui.popup
let common = layui.common
let MODULE_PATH = '/vip/'
// 表格数据
let cols = [
[
{#{ type: 'checkbox' },#}
{ title: 'ID', field: 'id', align: 'center', width: 110 },
{ title: '期数', field: 'phase', align: 'center', width: 110 },
{ title: '用户名', field: 'username', align: 'center', width: 110 },
{ title: '电话号码', field: 'mobile', align: 'center', hide: true },
{ title: '身份证号', field: 'id_card', align: 'center', hide: true },
{ title: '微信号', field: 'wx', align: 'center' },
{ title: 'QQ号', field: 'qq', align: 'center' },
{ title: '报名账号', field: 'account', align: 'center' },
{ title: '学号', field: 'number', align: 'center' },
{ title: '创建时间', field: 'create_at', templet: '#user-updateTime', align: 'center' },
{ title: '操作', toolbar: '#user-bar', align: 'center', width: 130 }
]
]
// 渲染表格数据
table.render({
elem: '#user-table',
url: MODULE_PATH + 'data',
page: true,
cols: cols,
skin: 'line',
height: 'full-148',
toolbar: '#user-toolbar', /*工具栏*/
text: { none: '暂无人员信息' },
defaultToolbar: [{ layEvent: 'refresh', icon: 'layui-icon-refresh' }, 'filter', 'print', 'exports'] /*默认工具栏*/
})
//
$('.user-group').click(function () {
let group = $(this).attr('user-group')
let field = form.val('user-query-form')
field.class_level = group
$(this).removeClass('button-default')
$(this).siblings().removeClass('button-primary')
$(this).siblings().addClass('button-default')
$(this).addClass('button-primary')
window.refresh(field)
})
table.on('tool(user-table)', function (obj) {
if (obj.event === 'remove') {
window.remove(obj)
} else if (obj.event === 'edit') {
window.edit(obj)
}
})
table.on('toolbar(user-table)', function (obj) {
if (obj.event === 'add') {
window.add()
} else if (obj.event === 'refresh') {
window.refresh()
} else if (obj.event === 'batchRemove') {
window.batchRemove(obj)
} else if (obj.event === 'collasped') {
$('.user-left').toggleClass('user-collasped')
$('.user-main').toggleClass('user-collasped')
table.resize()
}
})
form.on('submit(user-query)', function (data) {
window.refresh(data.field)
return false
})
form.on('switch(user-enable)', function (obj) {
let operate
if (obj.elem.checked) {
operate = 1
} else {
operate = 0
}
let loading = layer.load()
$.ajax({
url: MODULE_PATH + 'enable',
data: JSON.stringify({ operate: operate, userId: this.value }),
dataType: 'json',
contentType: 'application/json',
type: 'put',
success: function (result) {
layer.close(loading)
if (result.success) {
popup.success(result.msg)
} else {
popup.failure(result.msg)
}
}
})
})
window.add = function () {
layer.open({
type: 2,
title: '新增',
shade: 0.1,
area: ['550px', '550px'],
content: MODULE_PATH + 'add'
})
}
window.edit = function (obj) {
layer.open({
type: 2,
title: '修改',
shade: 0.1,
area: ['550px', '500px'],
content: MODULE_PATH + obj.data['id']
})
}
window.remove = function (obj) {
layer.confirm('确定要删除该用户', { icon: 3, title: '提示' }, function (index) {
layer.close(index)
let loading = layer.load()
$.ajax({
url: MODULE_PATH + 'remove/' + obj.data['id'],
dataType: 'json',
type: 'delete',
success: function (result) {
layer.close(loading)
if (result.success) {
popup.success(result.msg, function () {
obj.del()
})
} else {
popup.failure(result.msg)
}
}
})
})
}
window.batchRemove = function (obj) {
let data = table.checkStatus(obj.config.id).data
if (data.length === 0) {
layer.msg('未选中数据', {
icon: 3,
time: 1000
})
return false
}
var ids = []
var hasCheck = table.checkStatus('user-table')
var hasCheckData = hasCheck.data
if (hasCheckData.length > 0) {
$.each(hasCheckData, function (index, element) {
ids.push(element.id)
})
}
{#console.log(ids);#}
layer.confirm('确定要删除选中角色', {
icon: 3,
title: '提示'
}, function (index) {
layer.close(index)
let loading = layer.load()
$.ajax({
url: MODULE_PATH + 'batchRemove',
data: { ids: ids },
dataType: 'json',
type: 'delete',
success: function (result) {
layer.close(loading)
if (result.success) {
popup.success(result.msg, function () {
table.reload('role-table')
})
} else {
popup.failure(result.msg)
}
}
})
})
}
window.refresh = function (param) {
table.reload('user-table', { where: param })
}
})
</script>
</html>
+2
View File
@@ -3,6 +3,7 @@ from applications.view.index import register_index_views
from applications.view.passport import register_passport_views
from applications.view.rights import register_rights_view
from applications.view.company.department import register_dept_views
from applications.view.vip import register_vip_view
def init_view(app):
@@ -11,3 +12,4 @@ def init_view(app):
register_rights_view(app)
register_passport_views(app)
register_dept_views(app)
register_vip_view(app)
+1 -1
View File
@@ -4,7 +4,7 @@ from applications.view.admin.admin_log import admin_log
from applications.view.admin.dict import admin_dict
from applications.view.admin.index import admin_bp
from applications.view.admin.file import admin_file
from applications.view.admin.role import admin_role
from applications.view.rights.role import admin_role
from applications.view.company.users import users_bp
from applications.view.admin.monitor import admin_monitor_bp
+1 -1
View File
@@ -72,7 +72,7 @@ class CURDUser(Resource):
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(user_id, username, real_name, dept_id)
user_curd.update_user_role(_id, role_ids)
return success_api(msg="更新成功")
@@ -5,7 +5,7 @@ from applications.common.utils.http import table_api, success_api, fail_api
from applications.common.utils.rights import authorize
admin_role = Blueprint('adminRole', __name__, url_prefix='/admin/role')
admin_role = Blueprint('role', __name__, url_prefix='/admin/role')
# 用户管理
@@ -57,10 +57,10 @@ def power(_id):
# 获取角色权限
@admin_role.get('/getRolePower/<int:id>')
@admin_role.get('/getRolePower/<int:_id>')
@authorize("admin:role:main", log=True)
def get_role_power(id):
powers = role_curd.get_role_power(id)
def get_role_power(_id):
powers = role_curd.get_role_power(_id)
res = {
"data": powers,
"status": {"code": 200, "message": "默认"}
@@ -76,7 +76,7 @@ def save_role_power():
power_ids = req_form.get("powerIds")
power_list = power_ids.split(',')
role_id = req_form.get("roleId")
role_curd.update_role_power(id=role_id, power_list=power_list)
role_curd.update_role_power(_id=role_id, power_list=power_list)
return success_api(msg="授权成功")
+58
View File
@@ -0,0 +1,58 @@
from flask import Blueprint, render_template, make_response, Flask, request
from flask_restful import Resource, Api, reqparse
from sqlalchemy import desc
from applications.common.utils.http import table_api
from applications.models import VipMember
vip_bp = Blueprint('vip', __name__, url_prefix='/vip')
vip_api = Api(vip_bp)
def register_vip_view(app: Flask):
app.register_blueprint(vip_bp)
@vip_api.resource('/member')
class Member(Resource):
def get(self):
return make_response(render_template('admin/vip/main.html'))
def post(self):
pass
# 用户分页查询
@vip_bp.get('/data')
def data():
parse = reqparse.RequestParser()
parse.add_argument('page', type=int, default=1)
parse.add_argument('limit', type=int, default=10)
parse.add_argument('wx', type=str, default="")
parse.add_argument('username', type=str, default="")
res = parse.parse_args()
filters = []
if res.username:
filters.append(VipMember.username.like('%{}%'.format(res.username)))
if res.wx:
filters.append(VipMember.wx.like('%{}%'.format(res.wx)))
paginate = VipMember.query.filter(*filters).paginate(
page=res.page, per_page=res.limit)
return table_api(data=[
{
'id': item.id,
'username': item.username,
'mobile': item.mobile,
'id_card': item.id_card,
'wx': item.wx,
'qq': item.qq,
'account': item.account,
'number': '{:0>2}{:0>4}'.format(item.phase, item.id),
'create_at': item.update_at,
'phase': item.phase,
} for item in paginate.items], count=paginate.total)