继续è°workflowï:调整目录结构

This commit is contained in:
zhengxinonly
2021-06-22 03:18:44 +08:00
parent d7c7237cd4
commit 05dff28523
43 changed files with 203 additions and 556 deletions
+17
View File
@@ -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
View File
@@ -115,4 +115,10 @@ dmypy.json
.pyre/ .pyre/
#ide #ide
.idea/ .idea/
# 数据库文件
*.db
#上传到本地的图片文件
*upload*
migrations/
-3
View File
@@ -1,3 +0,0 @@
from applications import create_app
app = create_app()
+31 -29
View File
@@ -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
+22 -30
View File
@@ -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
# 生成验证码 # 生成验证码
+2 -2
View File
@@ -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)
+26 -30
View File
@@ -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)
+33 -31
View File
@@ -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)
+1 -1
View File
@@ -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':
-8
View File
@@ -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("&", "&amp;").replace(">", "&gt;").replace("<", "&lt;").replace("'", "&#39;").replace('"',
"&#34;")
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():
+3
View File
@@ -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):
"""生成环境配置""" """生成环境配置"""
-2
View File
@@ -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 -2
View File
@@ -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
+2
View File
@@ -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:
+1 -1
View File
@@ -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))
+2 -2
View File
@@ -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 -4
View File
@@ -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")
+2 -2
View File
@@ -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):
+3 -3
View File
@@ -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='角色编号'), # 属性 外键
) )
+3 -3
View File
@@ -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='角色编号'), # 属性 外键
) )
+1 -1
View File
@@ -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):
-8
View File
@@ -1,8 +0,0 @@
from flask import Blueprint
admin_curd = Blueprint('adminCurd', __name__, url_prefix='/admin/curd')
@admin_curd.route('/')
def index():
return "功能开发中"
+3 -4
View File
@@ -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)
+4 -4
View File
@@ -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 + '%')
+11 -12
View File
@@ -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 -1
View File
@@ -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
+8
View File
@@ -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
View File
@@ -1 +0,0 @@
Generic single-database configuration.
-50
View File
@@ -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
-91
View File
@@ -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()
-24
View File
@@ -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 ###
-151
View File
@@ -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 ###
+6 -4
View File
@@ -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