继续è°workflowï:调整目录结构
This commit is contained in:
@@ -0,0 +1,17 @@
|
|||||||
|
# MySql配置信息
|
||||||
|
MYSQL_HOST=127.0.0.1
|
||||||
|
MYSQL_PORT=3306
|
||||||
|
MYSQL_DATABASE=PearAdminFlask
|
||||||
|
MYSQL_USERNAME=root
|
||||||
|
MYSQL_PASSWORD=123456
|
||||||
|
|
||||||
|
# Redis 配置
|
||||||
|
REDIS_HOST=127.0.0.1
|
||||||
|
REDIS_PORT=6379
|
||||||
|
|
||||||
|
# 密钥配置
|
||||||
|
SECRET_KEY='pear-admin-flask2'
|
||||||
|
|
||||||
|
FLASK_ENV=development
|
||||||
|
FLASK_RUN_HOST=0.0.0.0
|
||||||
|
FLASK_APP='applications:create_app("development")'
|
||||||
|
|||||||
+7
-1
@@ -115,4 +115,10 @@ dmypy.json
|
|||||||
.pyre/
|
.pyre/
|
||||||
|
|
||||||
#ide
|
#ide
|
||||||
.idea/
|
.idea/
|
||||||
|
|
||||||
|
# 数据库文件
|
||||||
|
*.db
|
||||||
|
#上传到本地的图片文件
|
||||||
|
*upload*
|
||||||
|
migrations/
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
from applications.common.utils.validate import xss_escape
|
|
||||||
from applications.extensions import db
|
from applications.extensions import db
|
||||||
from applications.models import Dept, DeptSchema
|
from applications.models import Dept, DeptSchema
|
||||||
from applications.models import User
|
from applications.models import User
|
||||||
from applications.common.curd import model_to_dicts
|
from applications.common.curd import model_to_dicts
|
||||||
|
from flask import escape
|
||||||
|
|
||||||
|
|
||||||
def get_dept_dict():
|
def get_dept_dict():
|
||||||
@@ -12,14 +12,14 @@ def get_dept_dict():
|
|||||||
|
|
||||||
|
|
||||||
def save_dept(req):
|
def save_dept(req):
|
||||||
address = xss_escape(req.get("address"))
|
address = escape(req.get("address"))
|
||||||
deptName = xss_escape(req.get("deptName"))
|
deptName = escape(req.get("deptName"))
|
||||||
email = xss_escape(req.get("email"))
|
email = escape(req.get("email"))
|
||||||
leader = xss_escape(req.get("leader"))
|
leader = escape(req.get("leader"))
|
||||||
parentId = xss_escape(req.get("parentId"))
|
parentId = escape(req.get("parentId"))
|
||||||
phone = xss_escape(req.get("phone"))
|
phone = escape(req.get("phone"))
|
||||||
sort = xss_escape(req.get("sort"))
|
sort = escape(req.get("sort"))
|
||||||
status = xss_escape(req.get("status"))
|
status = escape(req.get("status"))
|
||||||
dept = Dept(
|
dept = Dept(
|
||||||
parent_id=parentId,
|
parent_id=parentId,
|
||||||
dept_name=deptName,
|
dept_name=deptName,
|
||||||
@@ -35,25 +35,26 @@ def save_dept(req):
|
|||||||
return r
|
return r
|
||||||
|
|
||||||
|
|
||||||
def get_dept_by_id(id):
|
def get_dept_by_id(_id):
|
||||||
d = Dept.query.filter_by(id=id).first()
|
"""根据 id 获取部门"""
|
||||||
|
d = Dept.query.filter_by(id=_id).first()
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
|
||||||
# 启动权限
|
def enable_status(_id):
|
||||||
def enable_status(id):
|
""" 启用权限 """
|
||||||
enable = 1
|
enable = 1
|
||||||
d = Dept.query.filter_by(id=id).update({"status": enable})
|
d = Dept.query.filter_by(id=_id).update({"status": enable})
|
||||||
if d:
|
if d:
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
# 停用权限
|
def disable_status(_id):
|
||||||
def disable_status(id):
|
""" 停用权限 """
|
||||||
enable = 0
|
enable = 0
|
||||||
d = Dept.query.filter_by(id=id).update({"status": enable})
|
d = Dept.query.filter_by(id=_id).update({"status": enable})
|
||||||
if d:
|
if d:
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return True
|
return True
|
||||||
@@ -61,27 +62,28 @@ def disable_status(id):
|
|||||||
|
|
||||||
|
|
||||||
def update_dept(json):
|
def update_dept(json):
|
||||||
id = json.get("deptId"),
|
""" 更新部门信息 """
|
||||||
|
_id = json.get("deptId"),
|
||||||
data = {
|
data = {
|
||||||
"dept_name": xss_escape(json.get("deptName")),
|
"dept_name": escape(json.get("deptName")),
|
||||||
"sort": xss_escape(json.get("sort")),
|
"sort": escape(json.get("sort")),
|
||||||
"leader": xss_escape(json.get("leader")),
|
"leader": escape(json.get("leader")),
|
||||||
"phone": xss_escape(json.get("phone")),
|
"phone": escape(json.get("phone")),
|
||||||
"email": xss_escape(json.get("email")),
|
"email": escape(json.get("email")),
|
||||||
"status": xss_escape(json.get("status")),
|
"status": escape(json.get("status")),
|
||||||
"address": xss_escape(json.get("address"))
|
"address": escape(json.get("address"))
|
||||||
}
|
}
|
||||||
d = Dept.query.filter_by(id=id).update(data)
|
d = Dept.query.filter_by(id=_id).update(data)
|
||||||
if not d:
|
if not d:
|
||||||
return False
|
return False
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def remove_dept(id):
|
def remove_dept(_id):
|
||||||
d = Dept.query.filter_by(id=id).delete()
|
d = Dept.query.filter_by(id=_id).delete()
|
||||||
if not d:
|
if not d:
|
||||||
return False
|
return False
|
||||||
User.query.filter_by(dept_id=id).update({"dept_id": None})
|
User.query.filter_by(dept_id=_id).update({"dept_id": None})
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return True
|
return True
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
from collections import OrderedDict
|
||||||
|
import copy
|
||||||
|
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
from flask import session, make_response, current_app
|
from flask import session, make_response, current_app
|
||||||
from flask_login import current_user
|
from flask_login import current_user
|
||||||
@@ -22,16 +25,8 @@ def add_auth_session():
|
|||||||
|
|
||||||
# 生成菜单树
|
# 生成菜单树
|
||||||
def make_menu_tree():
|
def make_menu_tree():
|
||||||
# power0 = Power.query.filter(
|
|
||||||
# Power.type == 0,
|
|
||||||
# ).all()
|
|
||||||
# power1 = Power.query.filter(
|
|
||||||
# Power.type == 1
|
|
||||||
# ).all()
|
|
||||||
# 获取当前用户的角色
|
|
||||||
role = current_user.role
|
role = current_user.role
|
||||||
power0 = []
|
powers = []
|
||||||
power1 = []
|
|
||||||
for i in role:
|
for i in role:
|
||||||
# 如果角色没有被启用就直接跳过
|
# 如果角色没有被启用就直接跳过
|
||||||
if i.enable == 0:
|
if i.enable == 0:
|
||||||
@@ -41,31 +36,28 @@ def make_menu_tree():
|
|||||||
# 如果权限关闭了就直接跳过
|
# 如果权限关闭了就直接跳过
|
||||||
if p.enable == 0:
|
if p.enable == 0:
|
||||||
continue
|
continue
|
||||||
# 一级菜单
|
# 一二级菜单
|
||||||
if int(p.type) == 0:
|
if p.type == 0 or p.type == 1:
|
||||||
power0.append(p)
|
powers.append(p)
|
||||||
# 二级菜单
|
|
||||||
else:
|
|
||||||
power1.append(p)
|
|
||||||
|
|
||||||
power_schema = PowerSchema(many=True) # 用已继承 ma.ModelSchema 类的自定制类生成序列化类
|
power_schema = PowerSchema(many=True) # 用已继承 ma.ModelSchema 类的自定制类生成序列化类
|
||||||
power0_dict = power_schema.dump(power0) # 生成可序列化对象
|
power_dict = power_schema.dump(powers) # 生成可序列化对象
|
||||||
power1_dict = power_schema.dump(power1) # 生成可序列化对象
|
power_dict.sort(key=lambda x: x['id'], reverse=True)
|
||||||
power0_dict = sorted(power0_dict, key=lambda i: i['sort'])
|
|
||||||
power1_dict = sorted(power1_dict, key=lambda i: i['sort'])
|
|
||||||
# print(power0)
|
|
||||||
# print(power1)
|
|
||||||
|
|
||||||
menu = []
|
menu_dict = OrderedDict()
|
||||||
|
for _dict in power_dict:
|
||||||
|
if _dict['id'] in menu_dict:
|
||||||
|
# 当前节点添加子节点
|
||||||
|
_dict['children'] = copy.deepcopy(menu_dict[_dict['id']])
|
||||||
|
# 删除子节点
|
||||||
|
del menu_dict[_dict['id']]
|
||||||
|
|
||||||
for p0 in power0_dict:
|
if _dict['parent_id'] not in menu_dict:
|
||||||
for p1 in power1_dict:
|
menu_dict[_dict['parent_id']] = [_dict]
|
||||||
if p0.get('id') == p1.get('parent_id'):
|
else:
|
||||||
if p0.get("children") is None:
|
menu_dict[_dict['parent_id']].append(_dict)
|
||||||
p0['children'] = []
|
|
||||||
p0['children'].append(p1)
|
return menu_dict.get(0)
|
||||||
menu.append(p0)
|
|
||||||
return menu
|
|
||||||
|
|
||||||
|
|
||||||
# 生成验证码
|
# 生成验证码
|
||||||
|
|||||||
@@ -108,5 +108,5 @@ def remove_power(id):
|
|||||||
|
|
||||||
# 批量删除权限
|
# 批量删除权限
|
||||||
def batch_remove(ids):
|
def batch_remove(ids):
|
||||||
for id in ids:
|
for _id in ids:
|
||||||
remove_power(id)
|
remove_power(_id)
|
||||||
|
|||||||
@@ -18,15 +18,15 @@ def get_role_data(page, limit, filters):
|
|||||||
return role, count
|
return role, count
|
||||||
|
|
||||||
|
|
||||||
# 获取角色dict
|
|
||||||
def get_role_data_dict(page, limit, filters):
|
def get_role_data_dict(page, limit, filters):
|
||||||
|
""" 获取角色dict """
|
||||||
role, count = get_role_data(page, limit, filters)
|
role, count = get_role_data(page, limit, filters)
|
||||||
data = model_to_dicts(Schema=RoleSchema, model=role.items)
|
data = model_to_dicts(Schema=RoleSchema, model=role.items)
|
||||||
return data, count
|
return data, count
|
||||||
|
|
||||||
|
|
||||||
# 增加角色
|
|
||||||
def add_role(req):
|
def add_role(req):
|
||||||
|
""" 增加角色 """
|
||||||
details = xss_escape(req.get("details"))
|
details = xss_escape(req.get("details"))
|
||||||
enable = xss_escape(req.get("enable"))
|
enable = xss_escape(req.get("enable"))
|
||||||
roleCode = xss_escape(req.get("roleCode"))
|
roleCode = xss_escape(req.get("roleCode"))
|
||||||
@@ -43,15 +43,15 @@ def add_role(req):
|
|||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
# 通过id获取角色
|
def get_role_by_id(_id):
|
||||||
def get_role_by_id(id):
|
""" 通过id获取角色 """
|
||||||
r = Role.query.filter_by(id=id).first()
|
r = Role.query.filter_by(id=_id).first()
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
|
||||||
# 更新角色
|
|
||||||
def update_role(req_json):
|
def update_role(req_json):
|
||||||
id = req_json.get("roleId")
|
""" 更新角色 """
|
||||||
|
_id = req_json.get("roleId")
|
||||||
data = {
|
data = {
|
||||||
"code": xss_escape(req_json.get("roleCode")),
|
"code": xss_escape(req_json.get("roleCode")),
|
||||||
"name": xss_escape(req_json.get("roleName")),
|
"name": xss_escape(req_json.get("roleName")),
|
||||||
@@ -59,14 +59,14 @@ def update_role(req_json):
|
|||||||
"enable": xss_escape(req_json.get("enable")),
|
"enable": xss_escape(req_json.get("enable")),
|
||||||
"details": xss_escape(req_json.get("details"))
|
"details": xss_escape(req_json.get("details"))
|
||||||
}
|
}
|
||||||
role = Role.query.filter_by(id=id).update(data)
|
role = Role.query.filter_by(id=_id).update(data)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return role
|
return role
|
||||||
|
|
||||||
|
|
||||||
# 获取角色的权限
|
def get_role_power(_id):
|
||||||
def get_role_power(id):
|
""" 获取角色的权限 """
|
||||||
role = Role.query.filter_by(id=id).first()
|
role = Role.query.filter_by(id=_id).first()
|
||||||
check_powers = role.power
|
check_powers = role.power
|
||||||
check_powers_list = []
|
check_powers_list = []
|
||||||
for cp in check_powers:
|
for cp in check_powers:
|
||||||
@@ -82,14 +82,12 @@ def get_role_power(id):
|
|||||||
return output
|
return output
|
||||||
|
|
||||||
|
|
||||||
# 更新角色权限
|
def update_role_power(_id, power_list):
|
||||||
def update_role_power(id, power_list):
|
""" 更新角色权限 """
|
||||||
role = Role.query.filter_by(id=id).first()
|
role = Role.query.filter_by(id=_id).first()
|
||||||
power_id_list = []
|
power_id_list = []
|
||||||
for p in role.power:
|
for p in role.power:
|
||||||
power_id_list.append(p.id)
|
power_id_list.append(p.id)
|
||||||
# print(p.id)
|
|
||||||
# print(power_id_list)
|
|
||||||
powers = Power.query.filter(Power.id.in_(power_id_list)).all()
|
powers = Power.query.filter(Power.id.in_(power_id_list)).all()
|
||||||
for p in powers:
|
for p in powers:
|
||||||
role.power.remove(p)
|
role.power.remove(p)
|
||||||
@@ -99,29 +97,29 @@ def update_role_power(id, power_list):
|
|||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
# 启动角色
|
def enable_status(_id):
|
||||||
def enable_status(id):
|
""" 启用角色 """
|
||||||
enable = 1
|
enable = 1
|
||||||
role = Role.query.filter_by(id=id).update({"enable": enable})
|
role = Role.query.filter_by(id=_id).update({"enable": enable})
|
||||||
if role:
|
if role:
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
# 停用角色
|
def disable_status(_id):
|
||||||
def disable_status(id):
|
""" 停用角色 """
|
||||||
enable = 0
|
enable = 0
|
||||||
role = Role.query.filter_by(id=id).update({"enable": enable})
|
role = Role.query.filter_by(id=_id).update({"enable": enable})
|
||||||
if role:
|
if role:
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
# 删除角色
|
def remove_role(_id):
|
||||||
def remove_role(id):
|
""" 删除角色 """
|
||||||
role = Role.query.filter_by(id=id).first()
|
role = Role.query.filter_by(id=_id).first()
|
||||||
# 删除该角色的权限
|
# 删除该角色的权限
|
||||||
power_id_list = []
|
power_id_list = []
|
||||||
for p in role.power:
|
for p in role.power:
|
||||||
@@ -141,9 +139,7 @@ def remove_role(id):
|
|||||||
return r
|
return r
|
||||||
|
|
||||||
|
|
||||||
# 批量删除
|
|
||||||
def batch_remove(ids):
|
def batch_remove(ids):
|
||||||
# role = Role.query.filter(Role.id.in_(ids)).delete(synchronize_session=False)
|
""" 批量删除 """
|
||||||
# db.session.commit()
|
for _id in ids:
|
||||||
for id in ids:
|
remove_role(_id)
|
||||||
remove_role(id)
|
|
||||||
|
|||||||
@@ -24,73 +24,75 @@ def get_user_data(page, limit, filters, deptId):
|
|||||||
return user, count
|
return user, count
|
||||||
|
|
||||||
|
|
||||||
# 获取用户的dict数据分页器
|
|
||||||
def get_user_data_dict(page, limit, filters, deptId):
|
def get_user_data_dict(page, limit, filters, deptId):
|
||||||
|
""" 获取用户的dict数据分页器 """
|
||||||
user, count = get_user_data(page, limit, filters, deptId)
|
user, count = get_user_data(page, limit, filters, deptId)
|
||||||
data = model_to_dicts(Schema=UserSchema, model=user.items)
|
data = model_to_dicts(Schema=UserSchema, model=user.items)
|
||||||
return data, count
|
return data, count
|
||||||
|
|
||||||
|
|
||||||
# 通过名称获取用户
|
|
||||||
def get_user_by_name(username):
|
def get_user_by_name(username):
|
||||||
|
""" 通过名称获取用户 """
|
||||||
return User.query.filter_by(username=username).first()
|
return User.query.filter_by(username=username).first()
|
||||||
|
|
||||||
|
|
||||||
# 获取当前用户日志
|
|
||||||
def get_current_user_logs():
|
def get_current_user_logs():
|
||||||
|
""" 获取当前用户日志 """
|
||||||
log = AdminLog.query.filter_by(url='/admin/login').filter_by(uid=current_user.id).order_by(
|
log = AdminLog.query.filter_by(url='/admin/login').filter_by(uid=current_user.id).order_by(
|
||||||
desc(AdminLog.create_time)).limit(10)
|
desc(AdminLog.create_time)).limit(10)
|
||||||
return log
|
return log
|
||||||
|
|
||||||
|
|
||||||
# 判断用户是否存在
|
|
||||||
def is_user_exists(username):
|
def is_user_exists(username):
|
||||||
|
""" 判断用户是否存在 """
|
||||||
res = User.query.filter_by(username=username).count()
|
res = User.query.filter_by(username=username).count()
|
||||||
return bool(res)
|
return bool(res)
|
||||||
|
|
||||||
|
|
||||||
# 增加用户
|
def add_user(username, real_name, password):
|
||||||
def add_user(username, realName, password):
|
""" 增加用户 """
|
||||||
user = User(username=username, realname=realName)
|
user = User()
|
||||||
|
user.username = username
|
||||||
|
user.realname = real_name
|
||||||
user.set_password(password)
|
user.set_password(password)
|
||||||
db.session.add(user)
|
db.session.add(user)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return user.id
|
return user.id
|
||||||
|
|
||||||
|
|
||||||
# 增加用户角色
|
def add_user_role(_id, roles_list):
|
||||||
def add_user_role(id, roles_list):
|
""" 增加用户角色 """
|
||||||
user = User.query.filter_by(id=id).first()
|
user = User.query.filter_by(id=_id).first()
|
||||||
roles = Role.query.filter(Role.id.in_(roles_list)).all()
|
roles = Role.query.filter(Role.id.in_(roles_list)).all()
|
||||||
for r in roles:
|
for r in roles:
|
||||||
user.role.append(r)
|
user.role.append(r)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
# 更新用户头像
|
|
||||||
def update_avatar(url):
|
def update_avatar(url):
|
||||||
|
""" 更新用户头像 """
|
||||||
r = User.query.filter_by(id=current_user.id).update({"avatar": url})
|
r = User.query.filter_by(id=current_user.id).update({"avatar": url})
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
|
||||||
# 更新用户信息
|
def update_user(_id, username, realname, deptId):
|
||||||
def update_user(id, username, realname, deptId):
|
""" 更新用户信息 """
|
||||||
user = User.query.filter_by(id=id).update({'username': username, 'realname': realname, 'dept_id': deptId})
|
user = User.query.filter_by(id=_id).update({'username': username, 'realname': realname, 'dept_id': deptId})
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return user
|
return user
|
||||||
|
|
||||||
|
|
||||||
# 更新当前用户信息
|
|
||||||
def update_current_user_info(req_json):
|
def update_current_user_info(req_json):
|
||||||
|
""" 更新当前用户信息 """
|
||||||
r = User.query.filter_by(id=current_user.id).update(
|
r = User.query.filter_by(id=current_user.id).update(
|
||||||
{"realname": req_json.get("realName"), "remark": req_json.get("details")})
|
{"realname": req_json.get("realName"), "remark": req_json.get("details")})
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
|
||||||
# 修改当前用户密码
|
|
||||||
def edit_password(res_json):
|
def edit_password(res_json):
|
||||||
|
""" 修改当前用户密码 """
|
||||||
if res_json.get("newPassword") == '':
|
if res_json.get("newPassword") == '':
|
||||||
return jsonify(success=False, msg="新密码不得为空")
|
return jsonify(success=False, msg="新密码不得为空")
|
||||||
if res_json.get("newPassword") != res_json.get("confirmPassword"):
|
if res_json.get("newPassword") != res_json.get("confirmPassword"):
|
||||||
@@ -105,48 +107,48 @@ def edit_password(res_json):
|
|||||||
return jsonify(success=True, msg="更改成功")
|
return jsonify(success=True, msg="更改成功")
|
||||||
|
|
||||||
|
|
||||||
# 删除用户
|
def delete_by_id(_id):
|
||||||
def delete_by_id(id):
|
""" 删除用户 """
|
||||||
user = User.query.filter_by(id=id).first()
|
user = User.query.filter_by(id=_id).first()
|
||||||
roles_id = []
|
roles_id = []
|
||||||
for role in user.role:
|
for role in user.role:
|
||||||
roles_id.append(role.id)
|
roles_id.append(role.id)
|
||||||
roles = Role.query.filter(Role.id.in_(roles_id)).all()
|
roles = Role.query.filter(Role.id.in_(roles_id)).all()
|
||||||
for r in roles:
|
for r in roles:
|
||||||
user.role.remove(r)
|
user.role.remove(r)
|
||||||
res = User.query.filter_by(id=id).delete()
|
res = User.query.filter_by(id=_id).delete()
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
# 启用用户
|
def enable_status(_id):
|
||||||
def enable_status(id):
|
""" 启用用户 """
|
||||||
enable = 1
|
enable = 1
|
||||||
user = User.query.filter_by(id=id).update({"enable": enable})
|
user = User.query.filter_by(id=_id).update({"enable": enable})
|
||||||
if user:
|
if user:
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
# 停用用户
|
def disable_status(_id):
|
||||||
def disable_status(id):
|
""" 停用用户 """
|
||||||
enable = 0
|
enable = 0
|
||||||
user = User.query.filter_by(id=id).update({"enable": enable})
|
user = User.query.filter_by(id=_id).update({"enable": enable})
|
||||||
if user:
|
if user:
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
# 批量删除
|
|
||||||
def batch_remove(ids):
|
def batch_remove(ids):
|
||||||
for id in ids:
|
""" 批量删除 """
|
||||||
delete_by_id(id)
|
for _id in ids:
|
||||||
|
delete_by_id(_id)
|
||||||
|
|
||||||
|
|
||||||
def update_user_role(id, roles_list):
|
def update_user_role(_id, roles_list):
|
||||||
user = User.query.filter_by(id=id).first()
|
user = User.query.filter_by(id=_id).first()
|
||||||
roles_id = []
|
roles_id = []
|
||||||
for role in user.role:
|
for role in user.role:
|
||||||
roles_id.append(role.id)
|
roles_id.append(role.id)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ def authorize(power: str, log: bool = False):
|
|||||||
@login_required
|
@login_required
|
||||||
@wraps(func)
|
@wraps(func)
|
||||||
def wrapper(*args, **kwargs):
|
def wrapper(*args, **kwargs):
|
||||||
if not power in session.get('permissions'):
|
if power not in session.get('permissions'):
|
||||||
if log:
|
if log:
|
||||||
admin_log(request=request, is_access=False)
|
admin_log(request=request, is_access=False)
|
||||||
if request.method == 'GET':
|
if request.method == 'GET':
|
||||||
|
|||||||
@@ -2,14 +2,6 @@
|
|||||||
from flask import abort, make_response, jsonify
|
from flask import abort, make_response, jsonify
|
||||||
|
|
||||||
|
|
||||||
def xss_escape(s: str):
|
|
||||||
if s is None:
|
|
||||||
return None
|
|
||||||
else:
|
|
||||||
return s.replace("&", "&").replace(">", ">").replace("<", "<").replace("'", "'").replace('"',
|
|
||||||
""")
|
|
||||||
|
|
||||||
|
|
||||||
def check_data(schema, data):
|
def check_data(schema, data):
|
||||||
errors = schema.validate(data)
|
errors = schema.validate(data)
|
||||||
for k, v in errors.items():
|
for k, v in errors.items():
|
||||||
|
|||||||
@@ -31,9 +31,12 @@ class TestingConfig(BaseConfig):
|
|||||||
|
|
||||||
class DevelopmentConfig(BaseConfig):
|
class DevelopmentConfig(BaseConfig):
|
||||||
""" 开发配置 """
|
""" 开发配置 """
|
||||||
|
# SQLALCHEMY_DATABASE_URI = r'sqlite:///../sql_pear_admin.db'
|
||||||
SQLALCHEMY_TRACK_MODIFICATIONS = True
|
SQLALCHEMY_TRACK_MODIFICATIONS = True
|
||||||
SQLALCHEMY_ECHO = False
|
SQLALCHEMY_ECHO = False
|
||||||
|
|
||||||
|
UPLOADED_PHOTOS_DEST = os.path.join(os.path.dirname(os.path.abspath(__name__)), 'applications', 'static', 'upload')
|
||||||
|
|
||||||
|
|
||||||
class ProductionConfig(BaseConfig):
|
class ProductionConfig(BaseConfig):
|
||||||
"""生成环境配置"""
|
"""生成环境配置"""
|
||||||
|
|||||||
@@ -3,13 +3,11 @@ from flask import Flask
|
|||||||
from .init_databases import register_script
|
from .init_databases import register_script
|
||||||
from .init_sqlalchemy import db, ma, init_databases
|
from .init_sqlalchemy import db, ma, init_databases
|
||||||
from .init_login import init_login_manager
|
from .init_login import init_login_manager
|
||||||
from .init_debug_tool import init_debug_tool
|
|
||||||
from .init_template_directives import init_template_directives
|
from .init_template_directives import init_template_directives
|
||||||
from .init_error_views import init_error_views
|
from .init_error_views import init_error_views
|
||||||
|
|
||||||
|
|
||||||
def init_plugs(app: Flask) -> None:
|
def init_plugs(app: Flask) -> None:
|
||||||
# init_debug_tool(app)
|
|
||||||
init_login_manager(app)
|
init_login_manager(app)
|
||||||
init_databases(app)
|
init_databases(app)
|
||||||
init_template_directives(app)
|
init_template_directives(app)
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ def create_admin_power():
|
|||||||
(1, '系统管理', '0', '', None, None, '0', 'layui-icon layui-icon-set-fill', 1, None, None, 1),
|
(1, '系统管理', '0', '', None, None, '0', 'layui-icon layui-icon-set-fill', 1, None, None, 1),
|
||||||
(3, '用户管理', '1', 'admin:user:main', '/admin/user/', '_iframe', '1',
|
(3, '用户管理', '1', 'admin:user:main', '/admin/user/', '_iframe', '1',
|
||||||
'layui-icon layui-icon layui-icon layui-icon layui-icon-rate', 1, None, None, 1),
|
'layui-icon layui-icon layui-icon layui-icon layui-icon-rate', 1, None, None, 1),
|
||||||
(4, '权限管理', '1', 'admin:power:main', '/admin/power/', '_iframe', '1', None, 2, None, None, 1),
|
(4, '权限管理', '1', 'admin:power:main', '/rights/', '_iframe', '1', None, 2, None, None, 1),
|
||||||
(9, '角色管理', '1', 'admin:role:main', '/admin/role', '_iframe', '1', 'layui-icon layui-icon-username', 2,
|
(9, '角色管理', '1', 'admin:role:main', '/admin/role', '_iframe', '1', 'layui-icon layui-icon-username', 2,
|
||||||
'2021-03-16 22:24:58', '2021-03-25 19:15:24', 1),
|
'2021-03-16 22:24:58', '2021-03-25 19:15:24', 1),
|
||||||
(
|
(
|
||||||
@@ -227,7 +227,7 @@ def create_admin_role_power():
|
|||||||
|
|
||||||
# add_data(_fields, _data_list, UserRole)
|
# add_data(_fields, _data_list, UserRole)
|
||||||
for data in _data_list:
|
for data in _data_list:
|
||||||
db.session.execute('insert into admin_role_power VALUES (%s, %s, %s);' % data)
|
db.session.execute('insert into rt_role_power VALUES (%s, %s, %s);' % data)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
@@ -260,7 +260,7 @@ def create_admin_user():
|
|||||||
add_data(_fields, _data_list, User)
|
add_data(_fields, _data_list, User)
|
||||||
|
|
||||||
|
|
||||||
def create_admin_user_role():
|
def create_admin_user_role() -> object:
|
||||||
from applications.extensions import db
|
from applications.extensions import db
|
||||||
|
|
||||||
_data_list = [
|
_data_list = [
|
||||||
@@ -271,7 +271,7 @@ def create_admin_user_role():
|
|||||||
|
|
||||||
# add_data(_fields, _data_list, UserRole)
|
# add_data(_fields, _data_list, UserRole)
|
||||||
for data in _data_list:
|
for data in _data_list:
|
||||||
db.session.execute('insert into admin_user_role VALUES (%s, %s, %s);' % data)
|
db.session.execute('insert into rt_user_role VALUES (%s, %s, %s);' % data)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
from flask import Flask
|
|
||||||
from flask_debugtoolbar import DebugToolbarExtension
|
|
||||||
|
|
||||||
|
|
||||||
def init_debug_tool(app: Flask):
|
|
||||||
toolbar = DebugToolbarExtension()
|
|
||||||
toolbar.init_app(app)
|
|
||||||
@@ -1,9 +1,8 @@
|
|||||||
from .dept import Dept, DeptSchema
|
from applications.models.company import Dept, DeptSchema, User, UserSchema
|
||||||
from .dict_models import DictType, DictData, DictTypeSchema, DictDataSchema
|
from .dict_models import DictType, DictData, DictTypeSchema, DictDataSchema
|
||||||
from .log import AdminLog, LogSchema
|
from .log import AdminLog, LogSchema
|
||||||
from applications.models.file.photo import Photo, PhotoSchema
|
from applications.models.file.photo import Photo, PhotoSchema
|
||||||
from applications.models.rights.power import Power, PowerSchema, PowerSchema2
|
from applications.models.rights.power import Power, PowerSchema, PowerSchema2
|
||||||
from applications.models.rights.role import Role, RoleSchema
|
from applications.models.rights.role import Role, RoleSchema
|
||||||
from applications.models.rights.role_power import role_power
|
from applications.models.rights.role_power import role_power
|
||||||
from applications.models.users.employee import User, UserSchema
|
|
||||||
from applications.models.rights.user_role import user_role
|
from applications.models.rights.user_role import user_role
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
from .dept import Dept, DeptSchema
|
||||||
|
from .users import User, UserSchema
|
||||||
@@ -4,7 +4,7 @@ from marshmallow import fields, validate
|
|||||||
|
|
||||||
|
|
||||||
class Dept(db.Model):
|
class Dept(db.Model):
|
||||||
__tablename__ = 'admin_dept'
|
__tablename__ = 'cp_dept'
|
||||||
id = db.Column(db.Integer, primary_key=True, comment="部门ID")
|
id = db.Column(db.Integer, primary_key=True, comment="部门ID")
|
||||||
parent_id = db.Column(db.Integer, comment="父级编号")
|
parent_id = db.Column(db.Integer, comment="父级编号")
|
||||||
dept_name = db.Column(db.String(50), comment="部门名称")
|
dept_name = db.Column(db.String(50), comment="部门名称")
|
||||||
@@ -3,14 +3,14 @@ from flask_login import UserMixin
|
|||||||
from werkzeug.security import generate_password_hash, check_password_hash
|
from werkzeug.security import generate_password_hash, check_password_hash
|
||||||
from applications.extensions import db, ma
|
from applications.extensions import db, ma
|
||||||
from marshmallow import fields
|
from marshmallow import fields
|
||||||
from applications.models import Dept
|
|
||||||
|
|
||||||
|
|
||||||
class User(db.Model, UserMixin):
|
class User(db.Model, UserMixin):
|
||||||
__tablename__ = 'admin_user'
|
__tablename__ = 'cp_user'
|
||||||
id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='用户ID')
|
id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='用户ID')
|
||||||
username = db.Column(db.String(20), comment='用户名')
|
username = db.Column(db.String(20), comment='用户名')
|
||||||
realname = db.Column(db.String(20), comment='真实名字')
|
realname = db.Column(db.String(20), comment='真实名字')
|
||||||
|
mobile = db.Column(db.String(11), comment='电话号码')
|
||||||
avatar = db.Column(db.String(255), comment='头像', default="/static/admin/admin/images/avatar.jpg")
|
avatar = db.Column(db.String(255), comment='头像', default="/static/admin/admin/images/avatar.jpg")
|
||||||
remark = db.Column(db.String(255), comment='备注')
|
remark = db.Column(db.String(255), comment='备注')
|
||||||
password_hash = db.Column(db.String(128), comment='哈希密码')
|
password_hash = db.Column(db.String(128), comment='哈希密码')
|
||||||
@@ -18,7 +18,7 @@ class User(db.Model, UserMixin):
|
|||||||
dept_id = db.Column(db.Integer, comment='部门id')
|
dept_id = db.Column(db.Integer, comment='部门id')
|
||||||
create_at = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
|
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='创建时间')
|
update_at = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='创建时间')
|
||||||
role = db.relationship('Role', secondary="admin_user_role", backref=db.backref('user'), lazy='dynamic')
|
role = db.relationship('Role', secondary="rt_user_role", backref=db.backref('user'), lazy='dynamic')
|
||||||
|
|
||||||
def set_password(self, password):
|
def set_password(self, password):
|
||||||
self.password_hash = generate_password_hash(password)
|
self.password_hash = generate_password_hash(password)
|
||||||
@@ -38,6 +38,7 @@ class UserSchema(ma.Schema):
|
|||||||
dept = fields.Method("get_dept")
|
dept = fields.Method("get_dept")
|
||||||
|
|
||||||
def get_dept(self, obj):
|
def get_dept(self, obj):
|
||||||
|
from applications.models import Dept
|
||||||
if obj.dept_id != None:
|
if obj.dept_id != None:
|
||||||
return Dept.query.filter_by(id=obj.dept_id).first().dept_name
|
return Dept.query.filter_by(id=obj.dept_id).first().dept_name
|
||||||
else:
|
else:
|
||||||
@@ -5,7 +5,7 @@ from marshmallow import fields
|
|||||||
|
|
||||||
|
|
||||||
class Photo(db.Model):
|
class Photo(db.Model):
|
||||||
__tablename__ = 'admin_photo'
|
__tablename__ = 'file_photo'
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
name = db.Column(db.String(255), nullable=False)
|
name = db.Column(db.String(255), nullable=False)
|
||||||
href = db.Column(db.String(255))
|
href = db.Column(db.String(255))
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import datetime
|
from datetime import datetime
|
||||||
from applications.extensions import db, ma
|
from applications.extensions import db, ma
|
||||||
from marshmallow import fields
|
from marshmallow import fields
|
||||||
|
|
||||||
@@ -13,7 +13,7 @@ class AdminLog(db.Model):
|
|||||||
ip = db.Column(db.String(255))
|
ip = db.Column(db.String(255))
|
||||||
success = db.Column(db.Integer)
|
success = db.Column(db.Integer)
|
||||||
user_agent = db.Column(db.Text)
|
user_agent = db.Column(db.Text)
|
||||||
create_time = db.Column(db.DateTime, default=datetime.datetime.now)
|
create_time = db.Column(db.DateTime, default=datetime.now)
|
||||||
|
|
||||||
|
|
||||||
class LogSchema(ma.Schema): # 序列化类
|
class LogSchema(ma.Schema): # 序列化类
|
||||||
|
|||||||
@@ -4,14 +4,14 @@ from marshmallow import fields
|
|||||||
|
|
||||||
|
|
||||||
class Power(db.Model):
|
class Power(db.Model):
|
||||||
__tablename__ = 'admin_power'
|
__tablename__ = 'rt_power'
|
||||||
id = db.Column(db.Integer, primary_key=True, comment='权限编号')
|
id = db.Column(db.Integer, primary_key=True, comment='权限编号')
|
||||||
name = db.Column(db.String(255), comment='权限名称')
|
name = db.Column(db.String(255), comment='权限名称')
|
||||||
type = db.Column(db.String(1), comment='权限类型')
|
type = db.Column(db.SMALLINT, comment='权限类型')
|
||||||
code = db.Column(db.String(30), comment='权限标识')
|
code = db.Column(db.String(30), comment='权限标识')
|
||||||
url = db.Column(db.String(255), comment='权限路径')
|
url = db.Column(db.String(255), comment='权限路径')
|
||||||
open_type = db.Column(db.String(10), comment='打开方式')
|
open_type = db.Column(db.String(10), comment='打开方式')
|
||||||
parent_id = db.Column(db.Integer, db.ForeignKey("admin_power.id"), comment='父类编号')
|
parent_id = db.Column(db.Integer, db.ForeignKey("rt_power.id"), comment='父类编号')
|
||||||
icon = db.Column(db.String(128), comment='图标')
|
icon = db.Column(db.String(128), comment='图标')
|
||||||
sort = db.Column(db.Integer, comment='排序')
|
sort = db.Column(db.Integer, comment='排序')
|
||||||
create_time = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
|
create_time = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
|
||||||
@@ -21,7 +21,7 @@ class Power(db.Model):
|
|||||||
parent = db.relationship("Power", remote_side=[id]) # 自关联
|
parent = db.relationship("Power", remote_side=[id]) # 自关联
|
||||||
|
|
||||||
|
|
||||||
# 权限models序列化类
|
# 权限 models 序列化类
|
||||||
class PowerSchema(ma.Schema):
|
class PowerSchema(ma.Schema):
|
||||||
id = fields.Integer()
|
id = fields.Integer()
|
||||||
title = fields.Str(attribute="name")
|
title = fields.Str(attribute="name")
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from marshmallow import fields
|
|||||||
|
|
||||||
|
|
||||||
class Role(db.Model):
|
class Role(db.Model):
|
||||||
__tablename__ = 'admin_role'
|
__tablename__ = 'rt_role'
|
||||||
id = db.Column(db.Integer, primary_key=True, comment='角色ID')
|
id = db.Column(db.Integer, primary_key=True, comment='角色ID')
|
||||||
name = db.Column(db.String(255), comment='角色名称')
|
name = db.Column(db.String(255), comment='角色名称')
|
||||||
code = db.Column(db.String(255), comment='角色标识')
|
code = db.Column(db.String(255), comment='角色标识')
|
||||||
@@ -14,7 +14,7 @@ class Role(db.Model):
|
|||||||
sort = db.Column(db.Integer, comment='排序')
|
sort = db.Column(db.Integer, comment='排序')
|
||||||
create_time = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
|
create_time = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
|
||||||
update_time = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='更新时间')
|
update_time = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='更新时间')
|
||||||
power = db.relationship('Power', secondary="admin_role_power", backref=db.backref('role'))
|
power = db.relationship('Power', secondary="rt_role_power", backref=db.backref('role'))
|
||||||
|
|
||||||
|
|
||||||
class RoleSchema(ma.Schema):
|
class RoleSchema(ma.Schema):
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ from applications.extensions import db
|
|||||||
|
|
||||||
# 创建中间表
|
# 创建中间表
|
||||||
role_power = db.Table(
|
role_power = db.Table(
|
||||||
"admin_role_power", # 中间表名称
|
"rt_role_power", # 中间表名称
|
||||||
db.Column("id", db.Integer, primary_key=True, autoincrement=True, comment='标识'), # 主键
|
db.Column("id", db.Integer, primary_key=True, autoincrement=True, comment='标识'), # 主键
|
||||||
db.Column("power_id", db.Integer, db.ForeignKey("admin_power.id"), comment='用户编号'), # 属性 外键
|
db.Column("power_id", db.Integer, db.ForeignKey("rt_power.id"), comment='用户编号'), # 属性 外键
|
||||||
db.Column("role_id", db.Integer, db.ForeignKey("admin_role.id"), comment='角色编号'), # 属性 外键
|
db.Column("role_id", db.Integer, db.ForeignKey("rt_role.id"), comment='角色编号'), # 属性 外键
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ from applications.extensions import db
|
|||||||
|
|
||||||
# 创建中间表
|
# 创建中间表
|
||||||
user_role = db.Table(
|
user_role = db.Table(
|
||||||
"admin_user_role", # 中间表名称
|
"rt_user_role", # 中间表名称
|
||||||
db.Column("id", db.Integer, primary_key=True, autoincrement=True, comment='标识'), # 主键
|
db.Column("id", db.Integer, primary_key=True, autoincrement=True, comment='标识'), # 主键
|
||||||
db.Column("user_id", db.Integer, db.ForeignKey("admin_user.id"), comment='用户编号'), # 属性 外键
|
db.Column("user_id", db.Integer, db.ForeignKey("cp_user.id"), comment='用户编号'), # 属性 外键
|
||||||
db.Column("role_id", db.Integer, db.ForeignKey("admin_role.id"), comment='角色编号'), # 属性 外键
|
db.Column("role_id", db.Integer, db.ForeignKey("rt_role.id"), comment='角色编号'), # 属性 外键
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ from applications.view.admin import register_admin_views
|
|||||||
from applications.view.index import register_index_views
|
from applications.view.index import register_index_views
|
||||||
from applications.view.passport import register_passport_views
|
from applications.view.passport import register_passport_views
|
||||||
from applications.view.rights import register_rights_view
|
from applications.view.rights import register_rights_view
|
||||||
from applications.view.department import register_dept_views
|
from applications.view.company.department import register_dept_views
|
||||||
|
|
||||||
|
|
||||||
def init_view(app):
|
def init_view(app):
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
from flask import Blueprint
|
|
||||||
|
|
||||||
admin_curd = Blueprint('adminCurd', __name__, url_prefix='/admin/curd')
|
|
||||||
|
|
||||||
|
|
||||||
@admin_curd.route('/')
|
|
||||||
def index():
|
|
||||||
return "功能开发中"
|
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
from flask import Blueprint, render_template, request, jsonify
|
from flask import Blueprint, render_template, request, jsonify, escape
|
||||||
|
|
||||||
from applications.common.utils.http import table_api, success_api, fail_api
|
from applications.common.utils.http import table_api, success_api, fail_api
|
||||||
from applications.common.utils.rights import authorize
|
from applications.common.utils.rights import authorize
|
||||||
from applications.common.utils.validate import xss_escape
|
|
||||||
from applications.models import DictType, DictData
|
from applications.models import DictType, DictData
|
||||||
from applications.common.admin import dict_curd
|
from applications.common.admin import dict_curd
|
||||||
|
|
||||||
@@ -21,7 +20,7 @@ def main():
|
|||||||
def dict_type_data():
|
def dict_type_data():
|
||||||
page = request.args.get('page', type=int)
|
page = request.args.get('page', type=int)
|
||||||
limit = request.args.get('limit', type=int)
|
limit = request.args.get('limit', type=int)
|
||||||
type_name = xss_escape(request.args.get('typeName', type=str))
|
type_name = escape(request.args.get('typeName', type=str))
|
||||||
data, count = dict_curd.get_dict_type(page=page, limit=limit, type_name=type_name)
|
data, count = dict_curd.get_dict_type(page=page, limit=limit, type_name=type_name)
|
||||||
return table_api(data=data,count=count)
|
return table_api(data=data,count=count)
|
||||||
|
|
||||||
@@ -101,7 +100,7 @@ def dict_type_delete(_id):
|
|||||||
def dict_code_data():
|
def dict_code_data():
|
||||||
page = request.args.get('page', type=int)
|
page = request.args.get('page', type=int)
|
||||||
limit = request.args.get('limit', type=int)
|
limit = request.args.get('limit', type=int)
|
||||||
type_code = xss_escape(request.args.get('typeCode', type=str))
|
type_code = escape(request.args.get('typeCode', type=str))
|
||||||
data, count = dict_curd.get_dict_data(page=page, limit=limit, type_code=type_code)
|
data, count = dict_curd.get_dict_data(page=page, limit=limit, type_code=type_code)
|
||||||
return table_api(data=data,count=count)
|
return table_api(data=data,count=count)
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
from flask import Blueprint, render_template, request, jsonify
|
from flask import Blueprint, render_template, request, jsonify, escape
|
||||||
from flask_login import login_required
|
from flask_login import login_required
|
||||||
from applications.common.admin import role_curd
|
from applications.common.admin import role_curd
|
||||||
from applications.common.utils.http import table_api, success_api, fail_api
|
from applications.common.utils.http import table_api, success_api, fail_api
|
||||||
from applications.common.utils.rights import authorize
|
from applications.common.utils.rights import authorize
|
||||||
from applications.common.utils.validate import xss_escape
|
|
||||||
|
|
||||||
admin_role = Blueprint('adminRole', __name__, url_prefix='/admin/role')
|
admin_role = Blueprint('adminRole', __name__, url_prefix='/admin/role')
|
||||||
|
|
||||||
@@ -21,8 +21,8 @@ def main():
|
|||||||
def table():
|
def table():
|
||||||
page = request.args.get('page', type=int)
|
page = request.args.get('page', type=int)
|
||||||
limit = request.args.get('limit', type=int)
|
limit = request.args.get('limit', type=int)
|
||||||
role_name = xss_escape(request.args.get('roleName', type=str))
|
role_name = escape(request.args.get('roleName', type=str))
|
||||||
role_code = xss_escape(request.args.get('roleCode', type=str))
|
role_code = escape(request.args.get('roleCode', type=str))
|
||||||
filters = {}
|
filters = {}
|
||||||
if role_name:
|
if role_name:
|
||||||
filters["name"] = ('%' + role_name + '%')
|
filters["name"] = ('%' + role_name + '%')
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
from flask import Blueprint, render_template, request
|
from flask import Blueprint, render_template, request, escape
|
||||||
from flask_login import login_required, current_user
|
from flask_login import login_required, current_user
|
||||||
|
|
||||||
from applications.common.utils.http import table_api, fail_api, success_api
|
from applications.common.utils.http import table_api, fail_api, success_api
|
||||||
from applications.common.utils.rights import authorize
|
from applications.common.utils.rights import authorize
|
||||||
from applications.common.utils.validate import xss_escape
|
|
||||||
from applications.models import User
|
from applications.models import User
|
||||||
from applications.models import Role
|
from applications.models import Role
|
||||||
from applications.common.admin import user_curd
|
from applications.common.admin import user_curd
|
||||||
@@ -24,8 +23,8 @@ def main():
|
|||||||
def data():
|
def data():
|
||||||
page = request.args.get('page', type=int)
|
page = request.args.get('page', type=int)
|
||||||
limit = request.args.get('limit', type=int)
|
limit = request.args.get('limit', type=int)
|
||||||
real_name = xss_escape(request.args.get('realName', type=str))
|
real_name = escape(request.args.get('realName', type=str))
|
||||||
username = xss_escape(request.args.get('username', type=str))
|
username = escape(request.args.get('username', type=str))
|
||||||
dept_id = request.args.get('deptId', type=int)
|
dept_id = request.args.get('deptId', type=int)
|
||||||
filters = {}
|
filters = {}
|
||||||
if real_name:
|
if real_name:
|
||||||
@@ -49,9 +48,9 @@ def add():
|
|||||||
def save():
|
def save():
|
||||||
req_json = request.json
|
req_json = request.json
|
||||||
a = req_json.get("roleIds")
|
a = req_json.get("roleIds")
|
||||||
username = xss_escape(req_json.get('username'))
|
username = escape(req_json.get('username'))
|
||||||
real_name = xss_escape(req_json.get('realName'))
|
real_name = escape(req_json.get('realName'))
|
||||||
password = xss_escape(req_json.get('password'))
|
password = escape(req_json.get('password'))
|
||||||
role_ids = a.split(',')
|
role_ids = a.split(',')
|
||||||
|
|
||||||
if not username or not real_name or not password:
|
if not username or not real_name or not password:
|
||||||
@@ -93,11 +92,11 @@ def edit(_id):
|
|||||||
@authorize("admin:user:edit", log=True)
|
@authorize("admin:user:edit", log=True)
|
||||||
def update():
|
def update():
|
||||||
req_json = request.json
|
req_json = request.json
|
||||||
a = xss_escape(req_json.get("roleIds"))
|
a = escape(req_json.get("roleIds"))
|
||||||
_id = xss_escape(req_json.get("userId"))
|
_id = escape(req_json.get("userId"))
|
||||||
username = xss_escape(req_json.get('username'))
|
username = escape(req_json.get('username'))
|
||||||
real_name = xss_escape(req_json.get('realName'))
|
real_name = escape(req_json.get('realName'))
|
||||||
dept_id = xss_escape(req_json.get('deptId'))
|
dept_id = escape(req_json.get('deptId'))
|
||||||
role_ids = a.split(',')
|
role_ids = a.split(',')
|
||||||
user_curd.update_user(id, username, real_name, dept_id)
|
user_curd.update_user(id, username, real_name, dept_id)
|
||||||
user_curd.update_user_role(_id, role_ids)
|
user_curd.update_user_role(_id, role_ids)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from flask import Blueprint
|
from flask import Blueprint
|
||||||
|
|
||||||
index_bp = Blueprint('Index', __name__, url_prefix='/')
|
index_bp = Blueprint('index', __name__, url_prefix='/')
|
||||||
|
|
||||||
from . import index
|
from . import index
|
||||||
|
|
||||||
|
|||||||
@@ -116,3 +116,11 @@ def batch_remove():
|
|||||||
ids = request.form.getlist('ids[]')
|
ids = request.form.getlist('ids[]')
|
||||||
rights_curd.batch_remove(ids)
|
rights_curd.batch_remove(ids)
|
||||||
return success_api(msg="批量删除成功")
|
return success_api(msg="批量删除成功")
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
https://developer.aliyun.com/article/778501
|
||||||
|
四位权限值: 增删改查
|
||||||
|
八位部门值: 流量 接待&转化 讲师 运营 1111 1111
|
||||||
|
四位公司值:
|
||||||
|
"""
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
Generic single-database configuration.
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
# A generic, single database configuration.
|
|
||||||
|
|
||||||
[alembic]
|
|
||||||
# template used to generate migration files
|
|
||||||
# file_template = %%(rev)s_%%(slug)s
|
|
||||||
|
|
||||||
# set to 'true' to run the environment during
|
|
||||||
# the 'revision' command, regardless of autogenerate
|
|
||||||
# revision_environment = false
|
|
||||||
|
|
||||||
|
|
||||||
# Logging configuration
|
|
||||||
[loggers]
|
|
||||||
keys = root,sqlalchemy,alembic,flask_migrate
|
|
||||||
|
|
||||||
[handlers]
|
|
||||||
keys = console
|
|
||||||
|
|
||||||
[formatters]
|
|
||||||
keys = generic
|
|
||||||
|
|
||||||
[logger_root]
|
|
||||||
level = WARN
|
|
||||||
handlers = console
|
|
||||||
qualname =
|
|
||||||
|
|
||||||
[logger_sqlalchemy]
|
|
||||||
level = WARN
|
|
||||||
handlers =
|
|
||||||
qualname = sqlalchemy.engine
|
|
||||||
|
|
||||||
[logger_alembic]
|
|
||||||
level = INFO
|
|
||||||
handlers =
|
|
||||||
qualname = alembic
|
|
||||||
|
|
||||||
[logger_flask_migrate]
|
|
||||||
level = INFO
|
|
||||||
handlers =
|
|
||||||
qualname = flask_migrate
|
|
||||||
|
|
||||||
[handler_console]
|
|
||||||
class = StreamHandler
|
|
||||||
args = (sys.stderr,)
|
|
||||||
level = NOTSET
|
|
||||||
formatter = generic
|
|
||||||
|
|
||||||
[formatter_generic]
|
|
||||||
format = %(levelname)-5.5s [%(name)s] %(message)s
|
|
||||||
datefmt = %H:%M:%S
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
from __future__ import with_statement
|
|
||||||
|
|
||||||
import logging
|
|
||||||
from logging.config import fileConfig
|
|
||||||
|
|
||||||
from flask import current_app
|
|
||||||
|
|
||||||
from alembic import context
|
|
||||||
|
|
||||||
# this is the Alembic Config object, which provides
|
|
||||||
# access to the values within the .ini file in use.
|
|
||||||
config = context.config
|
|
||||||
|
|
||||||
# Interpret the config file for Python logging.
|
|
||||||
# This line sets up loggers basically.
|
|
||||||
fileConfig(config.config_file_name)
|
|
||||||
logger = logging.getLogger('alembic.env')
|
|
||||||
|
|
||||||
# add your model's MetaData object here
|
|
||||||
# for 'autogenerate' support
|
|
||||||
# from myapp import mymodel
|
|
||||||
# target_metadata = mymodel.Base.metadata
|
|
||||||
config.set_main_option(
|
|
||||||
'sqlalchemy.url',
|
|
||||||
str(current_app.extensions['migrate'].db.get_engine().url).replace(
|
|
||||||
'%', '%%'))
|
|
||||||
target_metadata = current_app.extensions['migrate'].db.metadata
|
|
||||||
|
|
||||||
# other values from the config, defined by the needs of env.py,
|
|
||||||
# can be acquired:
|
|
||||||
# my_important_option = config.get_main_option("my_important_option")
|
|
||||||
# ... etc.
|
|
||||||
|
|
||||||
|
|
||||||
def run_migrations_offline():
|
|
||||||
"""Run migrations in 'offline' mode.
|
|
||||||
|
|
||||||
This configures the context with just a URL
|
|
||||||
and not an Engine, though an Engine is acceptable
|
|
||||||
here as well. By skipping the Engine creation
|
|
||||||
we don't even need a DBAPI to be available.
|
|
||||||
|
|
||||||
Calls to context.execute() here emit the given string to the
|
|
||||||
script output.
|
|
||||||
|
|
||||||
"""
|
|
||||||
url = config.get_main_option("sqlalchemy.url")
|
|
||||||
context.configure(
|
|
||||||
url=url, target_metadata=target_metadata, literal_binds=True
|
|
||||||
)
|
|
||||||
|
|
||||||
with context.begin_transaction():
|
|
||||||
context.run_migrations()
|
|
||||||
|
|
||||||
|
|
||||||
def run_migrations_online():
|
|
||||||
"""Run migrations in 'online' mode.
|
|
||||||
|
|
||||||
In this scenario we need to create an Engine
|
|
||||||
and associate a connection with the context.
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
# this callback is used to prevent an auto-migration from being generated
|
|
||||||
# when there are no changes to the schema
|
|
||||||
# reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html
|
|
||||||
def process_revision_directives(context, revision, directives):
|
|
||||||
if getattr(config.cmd_opts, 'autogenerate', False):
|
|
||||||
script = directives[0]
|
|
||||||
if script.upgrade_ops.is_empty():
|
|
||||||
directives[:] = []
|
|
||||||
logger.info('No changes in schema detected.')
|
|
||||||
|
|
||||||
connectable = current_app.extensions['migrate'].db.get_engine()
|
|
||||||
|
|
||||||
with connectable.connect() as connection:
|
|
||||||
context.configure(
|
|
||||||
connection=connection,
|
|
||||||
target_metadata=target_metadata,
|
|
||||||
process_revision_directives=process_revision_directives,
|
|
||||||
**current_app.extensions['migrate'].configure_args
|
|
||||||
)
|
|
||||||
|
|
||||||
with context.begin_transaction():
|
|
||||||
context.run_migrations()
|
|
||||||
|
|
||||||
|
|
||||||
if context.is_offline_mode():
|
|
||||||
run_migrations_offline()
|
|
||||||
else:
|
|
||||||
run_migrations_online()
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
"""${message}
|
|
||||||
|
|
||||||
Revision ID: ${up_revision}
|
|
||||||
Revises: ${down_revision | comma,n}
|
|
||||||
Create Date: ${create_date}
|
|
||||||
|
|
||||||
"""
|
|
||||||
from alembic import op
|
|
||||||
import sqlalchemy as sa
|
|
||||||
${imports if imports else ""}
|
|
||||||
|
|
||||||
# revision identifiers, used by Alembic.
|
|
||||||
revision = ${repr(up_revision)}
|
|
||||||
down_revision = ${repr(down_revision)}
|
|
||||||
branch_labels = ${repr(branch_labels)}
|
|
||||||
depends_on = ${repr(depends_on)}
|
|
||||||
|
|
||||||
|
|
||||||
def upgrade():
|
|
||||||
${upgrades if upgrades else "pass"}
|
|
||||||
|
|
||||||
|
|
||||||
def downgrade():
|
|
||||||
${downgrades if downgrades else "pass"}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
"""changge
|
|
||||||
|
|
||||||
Revision ID: 0893a714a376
|
|
||||||
Revises: 296c80a9d6e8
|
|
||||||
Create Date: 2021-06-14 01:21:16.185099
|
|
||||||
|
|
||||||
"""
|
|
||||||
from alembic import op
|
|
||||||
import sqlalchemy as sa
|
|
||||||
|
|
||||||
|
|
||||||
# revision identifiers, used by Alembic.
|
|
||||||
revision = '0893a714a376'
|
|
||||||
down_revision = '296c80a9d6e8'
|
|
||||||
branch_labels = None
|
|
||||||
depends_on = None
|
|
||||||
|
|
||||||
|
|
||||||
def upgrade():
|
|
||||||
# ### commands auto generated by Alembic - please adjust! ###
|
|
||||||
op.create_foreign_key(None, 'admin_power', 'admin_power', ['parent_id'], ['id'])
|
|
||||||
op.create_foreign_key(None, 'admin_role_power', 'admin_role', ['role_id'], ['id'])
|
|
||||||
op.create_foreign_key(None, 'admin_role_power', 'admin_power', ['power_id'], ['id'])
|
|
||||||
op.create_foreign_key(None, 'admin_user_role', 'admin_role', ['role_id'], ['id'])
|
|
||||||
op.create_foreign_key(None, 'admin_user_role', 'admin_user', ['user_id'], ['id'])
|
|
||||||
# ### end Alembic commands ###
|
|
||||||
|
|
||||||
|
|
||||||
def downgrade():
|
|
||||||
# ### commands auto generated by Alembic - please adjust! ###
|
|
||||||
op.drop_constraint(None, 'admin_user_role', type_='foreignkey')
|
|
||||||
op.drop_constraint(None, 'admin_user_role', type_='foreignkey')
|
|
||||||
op.drop_constraint(None, 'admin_role_power', type_='foreignkey')
|
|
||||||
op.drop_constraint(None, 'admin_role_power', type_='foreignkey')
|
|
||||||
op.drop_constraint(None, 'admin_power', type_='foreignkey')
|
|
||||||
# ### end Alembic commands ###
|
|
||||||
@@ -1,151 +0,0 @@
|
|||||||
"""init
|
|
||||||
|
|
||||||
Revision ID: 296c80a9d6e8
|
|
||||||
Revises:
|
|
||||||
Create Date: 2021-06-14 00:44:22.947817
|
|
||||||
|
|
||||||
"""
|
|
||||||
from alembic import op
|
|
||||||
import sqlalchemy as sa
|
|
||||||
|
|
||||||
|
|
||||||
# revision identifiers, used by Alembic.
|
|
||||||
revision = '296c80a9d6e8'
|
|
||||||
down_revision = None
|
|
||||||
branch_labels = None
|
|
||||||
depends_on = None
|
|
||||||
|
|
||||||
|
|
||||||
def upgrade():
|
|
||||||
# ### commands auto generated by Alembic - please adjust! ###
|
|
||||||
op.create_table('admin_admin_log',
|
|
||||||
sa.Column('id', sa.Integer(), nullable=False),
|
|
||||||
sa.Column('method', sa.String(length=10), nullable=True),
|
|
||||||
sa.Column('uid', sa.Integer(), nullable=True),
|
|
||||||
sa.Column('url', sa.String(length=255), nullable=True),
|
|
||||||
sa.Column('desc', sa.Text(), nullable=True),
|
|
||||||
sa.Column('ip', sa.String(length=255), nullable=True),
|
|
||||||
sa.Column('success', sa.Integer(), nullable=True),
|
|
||||||
sa.Column('user_agent', sa.Text(), nullable=True),
|
|
||||||
sa.Column('create_time', sa.DateTime(), nullable=True),
|
|
||||||
sa.PrimaryKeyConstraint('id')
|
|
||||||
)
|
|
||||||
op.create_table('admin_dept',
|
|
||||||
sa.Column('id', sa.Integer(), nullable=False, comment='部门ID'),
|
|
||||||
sa.Column('parent_id', sa.Integer(), nullable=True, comment='父级编号'),
|
|
||||||
sa.Column('dept_name', sa.String(length=50), nullable=True, comment='部门名称'),
|
|
||||||
sa.Column('sort', sa.Integer(), nullable=True, comment='排序'),
|
|
||||||
sa.Column('leader', sa.String(length=50), nullable=True, comment='负责人'),
|
|
||||||
sa.Column('phone', sa.String(length=20), nullable=True, comment='联系方式'),
|
|
||||||
sa.Column('email', sa.String(length=50), nullable=True, comment='邮箱'),
|
|
||||||
sa.Column('status', sa.Integer(), nullable=True, comment='状态(1开启,0关闭)'),
|
|
||||||
sa.Column('remark', sa.Text(), nullable=True, comment='备注'),
|
|
||||||
sa.Column('address', sa.String(length=255), nullable=True, comment='详细地址'),
|
|
||||||
sa.Column('create_at', sa.DateTime(), nullable=True, comment='创建时间'),
|
|
||||||
sa.Column('update_at', sa.DateTime(), nullable=True, comment='创建时间'),
|
|
||||||
sa.PrimaryKeyConstraint('id')
|
|
||||||
)
|
|
||||||
op.create_table('admin_dict_data',
|
|
||||||
sa.Column('id', sa.Integer(), nullable=False),
|
|
||||||
sa.Column('data_label', sa.String(length=255), nullable=True, comment='字典类型名称'),
|
|
||||||
sa.Column('data_value', sa.String(length=255), nullable=True, comment='字典类型标识'),
|
|
||||||
sa.Column('type_code', sa.String(length=255), nullable=True, comment='字典类型描述'),
|
|
||||||
sa.Column('is_default', sa.Integer(), nullable=True, comment='是否默认'),
|
|
||||||
sa.Column('enable', sa.Integer(), nullable=True, comment='是否开启'),
|
|
||||||
sa.Column('remark', sa.String(length=255), nullable=True, comment='备注'),
|
|
||||||
sa.Column('create_time', sa.DateTime(), nullable=True, comment='创建时间'),
|
|
||||||
sa.Column('update_time', sa.DateTime(), nullable=True, comment='更新时间'),
|
|
||||||
sa.PrimaryKeyConstraint('id')
|
|
||||||
)
|
|
||||||
op.create_table('admin_dict_type',
|
|
||||||
sa.Column('id', sa.Integer(), nullable=False),
|
|
||||||
sa.Column('type_name', sa.String(length=255), nullable=True, comment='字典类型名称'),
|
|
||||||
sa.Column('type_code', sa.String(length=255), nullable=True, comment='字典类型标识'),
|
|
||||||
sa.Column('description', sa.String(length=255), nullable=True, comment='字典类型描述'),
|
|
||||||
sa.Column('enable', sa.Integer(), nullable=True, comment='是否开启'),
|
|
||||||
sa.Column('create_time', sa.DateTime(), nullable=True, comment='创建时间'),
|
|
||||||
sa.Column('update_time', sa.DateTime(), nullable=True, comment='更新时间'),
|
|
||||||
sa.PrimaryKeyConstraint('id')
|
|
||||||
)
|
|
||||||
op.create_table('admin_photo',
|
|
||||||
sa.Column('id', sa.Integer(), nullable=False),
|
|
||||||
sa.Column('name', sa.String(length=255), nullable=False),
|
|
||||||
sa.Column('href', sa.String(length=255), nullable=True),
|
|
||||||
sa.Column('mime', sa.CHAR(length=50), nullable=False),
|
|
||||||
sa.Column('size', sa.CHAR(length=30), nullable=False),
|
|
||||||
sa.Column('create_time', sa.DateTime(), nullable=True),
|
|
||||||
sa.PrimaryKeyConstraint('id')
|
|
||||||
)
|
|
||||||
op.create_table('admin_power',
|
|
||||||
sa.Column('id', sa.Integer(), nullable=False, comment='权限编号'),
|
|
||||||
sa.Column('name', sa.String(length=255), nullable=True, comment='权限名称'),
|
|
||||||
sa.Column('type', sa.SmallInteger(), nullable=True, comment='权限类型'),
|
|
||||||
sa.Column('code', sa.String(length=30), nullable=True, comment='权限标识'),
|
|
||||||
sa.Column('url', sa.String(length=255), nullable=True, comment='权限路径'),
|
|
||||||
sa.Column('open_type', sa.String(length=10), nullable=True, comment='打开方式'),
|
|
||||||
sa.Column('icon', sa.String(length=128), nullable=True, comment='图标'),
|
|
||||||
sa.Column('sort', sa.Integer(), nullable=True, comment='排序'),
|
|
||||||
sa.Column('create_time', sa.DateTime(), nullable=True, comment='创建时间'),
|
|
||||||
sa.Column('update_time', sa.DateTime(), nullable=True, comment='更新时间'),
|
|
||||||
sa.Column('enable', sa.Integer(), nullable=True, comment='是否开启'),
|
|
||||||
sa.Column('parent_id', sa.Integer(), nullable=True, comment='父类编号'),
|
|
||||||
sa.ForeignKeyConstraint(['parent_id'], ['admin_power.id'], ),
|
|
||||||
sa.PrimaryKeyConstraint('id')
|
|
||||||
)
|
|
||||||
op.create_table('admin_role',
|
|
||||||
sa.Column('id', sa.Integer(), nullable=False, comment='角色ID'),
|
|
||||||
sa.Column('name', sa.String(length=255), nullable=True, comment='角色名称'),
|
|
||||||
sa.Column('code', sa.String(length=255), nullable=True, comment='角色标识'),
|
|
||||||
sa.Column('enable', sa.Integer(), nullable=True, comment='是否启用'),
|
|
||||||
sa.Column('remark', sa.String(length=255), nullable=True, comment='备注'),
|
|
||||||
sa.Column('details', sa.String(length=255), nullable=True, comment='详情'),
|
|
||||||
sa.Column('sort', sa.Integer(), nullable=True, comment='排序'),
|
|
||||||
sa.Column('create_time', sa.DateTime(), nullable=True, comment='创建时间'),
|
|
||||||
sa.Column('update_time', sa.DateTime(), nullable=True, comment='更新时间'),
|
|
||||||
sa.PrimaryKeyConstraint('id')
|
|
||||||
)
|
|
||||||
op.create_table('admin_user',
|
|
||||||
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False, comment='用户ID'),
|
|
||||||
sa.Column('username', sa.String(length=20), nullable=True, comment='用户名'),
|
|
||||||
sa.Column('realname', sa.String(length=20), nullable=True, comment='真实名字'),
|
|
||||||
sa.Column('avatar', sa.String(length=255), nullable=True, comment='头像'),
|
|
||||||
sa.Column('remark', sa.String(length=255), nullable=True, comment='备注'),
|
|
||||||
sa.Column('password_hash', sa.String(length=128), nullable=True, comment='哈希密码'),
|
|
||||||
sa.Column('enable', sa.Integer(), nullable=True, comment='启用'),
|
|
||||||
sa.Column('dept_id', sa.Integer(), nullable=True, comment='部门id'),
|
|
||||||
sa.Column('create_at', sa.DateTime(), nullable=True, comment='创建时间'),
|
|
||||||
sa.Column('update_at', sa.DateTime(), nullable=True, comment='创建时间'),
|
|
||||||
sa.PrimaryKeyConstraint('id')
|
|
||||||
)
|
|
||||||
op.create_table('admin_role_power',
|
|
||||||
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False, comment='标识'),
|
|
||||||
sa.Column('power_id', sa.Integer(), nullable=True, comment='用户编号'),
|
|
||||||
sa.Column('role_id', sa.Integer(), nullable=True, comment='角色编号'),
|
|
||||||
sa.ForeignKeyConstraint(['power_id'], ['admin_power.id'], ),
|
|
||||||
sa.ForeignKeyConstraint(['role_id'], ['admin_role.id'], ),
|
|
||||||
sa.PrimaryKeyConstraint('id')
|
|
||||||
)
|
|
||||||
op.create_table('admin_user_role',
|
|
||||||
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False, comment='标识'),
|
|
||||||
sa.Column('user_id', sa.Integer(), nullable=True, comment='用户编号'),
|
|
||||||
sa.Column('role_id', sa.Integer(), nullable=True, comment='角色编号'),
|
|
||||||
sa.ForeignKeyConstraint(['role_id'], ['admin_role.id'], ),
|
|
||||||
sa.ForeignKeyConstraint(['user_id'], ['admin_user.id'], ),
|
|
||||||
sa.PrimaryKeyConstraint('id')
|
|
||||||
)
|
|
||||||
# ### end Alembic commands ###
|
|
||||||
|
|
||||||
|
|
||||||
def downgrade():
|
|
||||||
# ### commands auto generated by Alembic - please adjust! ###
|
|
||||||
op.drop_table('admin_user_role')
|
|
||||||
op.drop_table('admin_role_power')
|
|
||||||
op.drop_table('admin_user')
|
|
||||||
op.drop_table('admin_role')
|
|
||||||
op.drop_table('admin_power')
|
|
||||||
op.drop_table('admin_photo')
|
|
||||||
op.drop_table('admin_dict_type')
|
|
||||||
op.drop_table('admin_dict_data')
|
|
||||||
op.drop_table('admin_dept')
|
|
||||||
op.drop_table('admin_admin_log')
|
|
||||||
# ### end Alembic commands ###
|
|
||||||
@@ -1,24 +1,26 @@
|
|||||||
blinker==1.4
|
alembic==1.6.5
|
||||||
captcha==0.3
|
captcha==0.3
|
||||||
click==8.0.1
|
click==8.0.1
|
||||||
colorama==0.4.4
|
colorama==0.4.4
|
||||||
Flask==2.0.1
|
Flask==2.0.1
|
||||||
Flask-DebugToolbar==0.11.0
|
|
||||||
Flask-Login==0.5.0
|
Flask-Login==0.5.0
|
||||||
flask-marshmallow==0.14.0
|
flask-marshmallow==0.14.0
|
||||||
|
Flask-Migrate==3.0.1
|
||||||
Flask-SQLAlchemy==2.5.1
|
Flask-SQLAlchemy==2.5.1
|
||||||
Flask-Uploads==0.2.1
|
Flask-Uploads==0.2.1
|
||||||
greenlet==1.1.0
|
greenlet==1.1.0
|
||||||
itsdangerous==2.0.1
|
itsdangerous==2.0.1
|
||||||
Jinja2==3.0.1
|
Jinja2==3.0.1
|
||||||
|
Mako==1.1.4
|
||||||
MarkupSafe==2.0.1
|
MarkupSafe==2.0.1
|
||||||
marshmallow==3.12.1
|
marshmallow==3.12.1
|
||||||
marshmallow-sqlalchemy==0.26.1
|
marshmallow-sqlalchemy==0.26.1
|
||||||
Pillow==8.2.0
|
Pillow==8.2.0
|
||||||
psutil==5.8.0
|
psutil==5.8.0
|
||||||
PyMySQL==1.0.2
|
PyMySQL==1.0.2
|
||||||
python-dotenv==0.17.1
|
python-dateutil==2.8.1
|
||||||
|
python-dotenv==0.18.0
|
||||||
|
python-editor==1.0.4
|
||||||
six==1.16.0
|
six==1.16.0
|
||||||
SQLAlchemy==1.4.18
|
SQLAlchemy==1.4.18
|
||||||
sqlparse==0.4.1
|
|
||||||
Werkzeug==2.0.1
|
Werkzeug==2.0.1
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 68 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 77 KiB |
Reference in New Issue
Block a user