修改目录结构2
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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='期数编号'), # 属性 外键
|
||||
)
|
||||
+2
-2
@@ -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"
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+2
-2
@@ -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"
|
||||
|
||||
Vendored
+1
-1
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',
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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,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>
|
||||
@@ -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>
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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="授权成功")
|
||||
|
||||
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user