继续è°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/
#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.models import Dept, DeptSchema
from applications.models import User
from applications.common.curd import model_to_dicts
from flask import escape
def get_dept_dict():
@@ -12,14 +12,14 @@ def get_dept_dict():
def save_dept(req):
address = xss_escape(req.get("address"))
deptName = xss_escape(req.get("deptName"))
email = xss_escape(req.get("email"))
leader = xss_escape(req.get("leader"))
parentId = xss_escape(req.get("parentId"))
phone = xss_escape(req.get("phone"))
sort = xss_escape(req.get("sort"))
status = xss_escape(req.get("status"))
address = escape(req.get("address"))
deptName = escape(req.get("deptName"))
email = escape(req.get("email"))
leader = escape(req.get("leader"))
parentId = escape(req.get("parentId"))
phone = escape(req.get("phone"))
sort = escape(req.get("sort"))
status = escape(req.get("status"))
dept = Dept(
parent_id=parentId,
dept_name=deptName,
@@ -35,25 +35,26 @@ def save_dept(req):
return r
def get_dept_by_id(id):
d = Dept.query.filter_by(id=id).first()
def get_dept_by_id(_id):
"""根据 id 获取部门"""
d = Dept.query.filter_by(id=_id).first()
return d
# 启动权限
def enable_status(id):
def enable_status(_id):
""" 启用权限 """
enable = 1
d = Dept.query.filter_by(id=id).update({"status": enable})
d = Dept.query.filter_by(id=_id).update({"status": enable})
if d:
db.session.commit()
return True
return False
# 停用权限
def disable_status(id):
def disable_status(_id):
""" 停用权限 """
enable = 0
d = Dept.query.filter_by(id=id).update({"status": enable})
d = Dept.query.filter_by(id=_id).update({"status": enable})
if d:
db.session.commit()
return True
@@ -61,27 +62,28 @@ def disable_status(id):
def update_dept(json):
id = json.get("deptId"),
""" 更新部门信息 """
_id = json.get("deptId"),
data = {
"dept_name": xss_escape(json.get("deptName")),
"sort": xss_escape(json.get("sort")),
"leader": xss_escape(json.get("leader")),
"phone": xss_escape(json.get("phone")),
"email": xss_escape(json.get("email")),
"status": xss_escape(json.get("status")),
"address": xss_escape(json.get("address"))
"dept_name": escape(json.get("deptName")),
"sort": escape(json.get("sort")),
"leader": escape(json.get("leader")),
"phone": escape(json.get("phone")),
"email": escape(json.get("email")),
"status": escape(json.get("status")),
"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:
return False
db.session.commit()
return True
def remove_dept(id):
d = Dept.query.filter_by(id=id).delete()
def remove_dept(_id):
d = Dept.query.filter_by(id=_id).delete()
if not d:
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()
return True
+22 -30
View File
@@ -1,3 +1,6 @@
from collections import OrderedDict
import copy
from io import BytesIO
from flask import session, make_response, current_app
from flask_login import current_user
@@ -22,16 +25,8 @@ def add_auth_session():
# 生成菜单树
def make_menu_tree():
# power0 = Power.query.filter(
# Power.type == 0,
# ).all()
# power1 = Power.query.filter(
# Power.type == 1
# ).all()
# 获取当前用户的角色
role = current_user.role
power0 = []
power1 = []
powers = []
for i in role:
# 如果角色没有被启用就直接跳过
if i.enable == 0:
@@ -41,31 +36,28 @@ def make_menu_tree():
# 如果权限关闭了就直接跳过
if p.enable == 0:
continue
# 一级菜单
if int(p.type) == 0:
power0.append(p)
# 二级菜单
else:
power1.append(p)
# 一级菜单
if p.type == 0 or p.type == 1:
powers.append(p)
power_schema = PowerSchema(many=True) # 用已继承 ma.ModelSchema 类的自定制类生成序列化类
power0_dict = power_schema.dump(power0) # 生成可序列化对象
power1_dict = power_schema.dump(power1) # 生成可序列化对象
power0_dict = sorted(power0_dict, key=lambda i: i['sort'])
power1_dict = sorted(power1_dict, key=lambda i: i['sort'])
# print(power0)
# print(power1)
power_dict = power_schema.dump(powers) # 生成可序列化对象
power_dict.sort(key=lambda x: x['id'], reverse=True)
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:
for p1 in power1_dict:
if p0.get('id') == p1.get('parent_id'):
if p0.get("children") is None:
p0['children'] = []
p0['children'].append(p1)
menu.append(p0)
return menu
if _dict['parent_id'] not in menu_dict:
menu_dict[_dict['parent_id']] = [_dict]
else:
menu_dict[_dict['parent_id']].append(_dict)
return menu_dict.get(0)
# 生成验证码
+2 -2
View File
@@ -108,5 +108,5 @@ def remove_power(id):
# 批量删除权限
def batch_remove(ids):
for id in ids:
remove_power(id)
for _id in ids:
remove_power(_id)
+26 -30
View File
@@ -18,15 +18,15 @@ def get_role_data(page, limit, filters):
return role, count
# 获取角色dict
def get_role_data_dict(page, limit, filters):
""" 获取角色dict """
role, count = get_role_data(page, limit, filters)
data = model_to_dicts(Schema=RoleSchema, model=role.items)
return data, count
# 增加角色
def add_role(req):
""" 增加角色 """
details = xss_escape(req.get("details"))
enable = xss_escape(req.get("enable"))
roleCode = xss_escape(req.get("roleCode"))
@@ -43,15 +43,15 @@ def add_role(req):
db.session.commit()
# 通过id获取角色
def get_role_by_id(id):
r = Role.query.filter_by(id=id).first()
def get_role_by_id(_id):
""" 通过id获取角色 """
r = Role.query.filter_by(id=_id).first()
return r
# 更新角色
def update_role(req_json):
id = req_json.get("roleId")
""" 更新角色 """
_id = req_json.get("roleId")
data = {
"code": xss_escape(req_json.get("roleCode")),
"name": xss_escape(req_json.get("roleName")),
@@ -59,14 +59,14 @@ def update_role(req_json):
"enable": xss_escape(req_json.get("enable")),
"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()
return role
# 获取角色的权限
def get_role_power(id):
role = Role.query.filter_by(id=id).first()
def get_role_power(_id):
""" 获取角色的权限 """
role = Role.query.filter_by(id=_id).first()
check_powers = role.power
check_powers_list = []
for cp in check_powers:
@@ -82,14 +82,12 @@ def get_role_power(id):
return output
# 更新角色权限
def update_role_power(id, power_list):
role = Role.query.filter_by(id=id).first()
def update_role_power(_id, power_list):
""" 更新角色权限 """
role = Role.query.filter_by(id=_id).first()
power_id_list = []
for p in role.power:
power_id_list.append(p.id)
# print(p.id)
# print(power_id_list)
powers = Power.query.filter(Power.id.in_(power_id_list)).all()
for p in powers:
role.power.remove(p)
@@ -99,29 +97,29 @@ def update_role_power(id, power_list):
db.session.commit()
# 启动角色
def enable_status(id):
def enable_status(_id):
""" 启用角色 """
enable = 1
role = Role.query.filter_by(id=id).update({"enable": enable})
role = Role.query.filter_by(id=_id).update({"enable": enable})
if role:
db.session.commit()
return True
return False
# 停用角色
def disable_status(id):
def disable_status(_id):
""" 停用角色 """
enable = 0
role = Role.query.filter_by(id=id).update({"enable": enable})
role = Role.query.filter_by(id=_id).update({"enable": enable})
if role:
db.session.commit()
return True
return False
# 删除角色
def remove_role(id):
role = Role.query.filter_by(id=id).first()
def remove_role(_id):
""" 删除角色 """
role = Role.query.filter_by(id=_id).first()
# 删除该角色的权限
power_id_list = []
for p in role.power:
@@ -141,9 +139,7 @@ def remove_role(id):
return r
# 批量删除
def batch_remove(ids):
# role = Role.query.filter(Role.id.in_(ids)).delete(synchronize_session=False)
# db.session.commit()
for id in ids:
remove_role(id)
""" 批量删除 """
for _id in ids:
remove_role(_id)
+33 -31
View File
@@ -24,73 +24,75 @@ def get_user_data(page, limit, filters, deptId):
return user, count
# 获取用户的dict数据分页器
def get_user_data_dict(page, limit, filters, deptId):
""" 获取用户的dict数据分页器 """
user, count = get_user_data(page, limit, filters, deptId)
data = model_to_dicts(Schema=UserSchema, model=user.items)
return data, count
# 通过名称获取用户
def get_user_by_name(username):
""" 通过名称获取用户 """
return User.query.filter_by(username=username).first()
# 获取当前用户日志
def get_current_user_logs():
""" 获取当前用户日志 """
log = AdminLog.query.filter_by(url='/admin/login').filter_by(uid=current_user.id).order_by(
desc(AdminLog.create_time)).limit(10)
return log
# 判断用户是否存在
def is_user_exists(username):
""" 判断用户是否存在 """
res = User.query.filter_by(username=username).count()
return bool(res)
# 增加用户
def add_user(username, realName, password):
user = User(username=username, realname=realName)
def add_user(username, real_name, password):
""" 增加用户 """
user = User()
user.username = username
user.realname = real_name
user.set_password(password)
db.session.add(user)
db.session.commit()
return user.id
# 增加用户角色
def add_user_role(id, roles_list):
user = User.query.filter_by(id=id).first()
def add_user_role(_id, roles_list):
""" 增加用户角色 """
user = User.query.filter_by(id=_id).first()
roles = Role.query.filter(Role.id.in_(roles_list)).all()
for r in roles:
user.role.append(r)
db.session.commit()
# 更新用户头像
def update_avatar(url):
""" 更新用户头像 """
r = User.query.filter_by(id=current_user.id).update({"avatar": url})
db.session.commit()
return r
# 更新用户信息
def update_user(id, username, realname, deptId):
user = User.query.filter_by(id=id).update({'username': username, 'realname': realname, 'dept_id': deptId})
def update_user(_id, username, realname, deptId):
""" 更新用户信息 """
user = User.query.filter_by(id=_id).update({'username': username, 'realname': realname, 'dept_id': deptId})
db.session.commit()
return user
# 更新当前用户信息
def update_current_user_info(req_json):
""" 更新当前用户信息 """
r = User.query.filter_by(id=current_user.id).update(
{"realname": req_json.get("realName"), "remark": req_json.get("details")})
db.session.commit()
return r
# 修改当前用户密码
def edit_password(res_json):
""" 修改当前用户密码 """
if res_json.get("newPassword") == '':
return jsonify(success=False, msg="新密码不得为空")
if res_json.get("newPassword") != res_json.get("confirmPassword"):
@@ -105,48 +107,48 @@ def edit_password(res_json):
return jsonify(success=True, msg="更改成功")
# 删除用户
def delete_by_id(id):
user = User.query.filter_by(id=id).first()
def delete_by_id(_id):
""" 删除用户 """
user = User.query.filter_by(id=_id).first()
roles_id = []
for role in user.role:
roles_id.append(role.id)
roles = Role.query.filter(Role.id.in_(roles_id)).all()
for r in roles:
user.role.remove(r)
res = User.query.filter_by(id=id).delete()
res = User.query.filter_by(id=_id).delete()
db.session.commit()
return res
# 启用用户
def enable_status(id):
def enable_status(_id):
""" 启用用户 """
enable = 1
user = User.query.filter_by(id=id).update({"enable": enable})
user = User.query.filter_by(id=_id).update({"enable": enable})
if user:
db.session.commit()
return True
return False
# 停用用户
def disable_status(id):
def disable_status(_id):
""" 停用用户 """
enable = 0
user = User.query.filter_by(id=id).update({"enable": enable})
user = User.query.filter_by(id=_id).update({"enable": enable})
if user:
db.session.commit()
return True
return False
# 批量删除
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):
user = User.query.filter_by(id=id).first()
def update_user_role(_id, roles_list):
user = User.query.filter_by(id=_id).first()
roles_id = []
for role in user.role:
roles_id.append(role.id)
+1 -1
View File
@@ -9,7 +9,7 @@ def authorize(power: str, log: bool = False):
@login_required
@wraps(func)
def wrapper(*args, **kwargs):
if not power in session.get('permissions'):
if power not in session.get('permissions'):
if log:
admin_log(request=request, is_access=False)
if request.method == 'GET':
-8
View File
@@ -2,14 +2,6 @@
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):
errors = schema.validate(data)
for k, v in errors.items():
+3
View File
@@ -31,9 +31,12 @@ class TestingConfig(BaseConfig):
class DevelopmentConfig(BaseConfig):
""" 开发配置 """
# SQLALCHEMY_DATABASE_URI = r'sqlite:///../sql_pear_admin.db'
SQLALCHEMY_TRACK_MODIFICATIONS = True
SQLALCHEMY_ECHO = False
UPLOADED_PHOTOS_DEST = os.path.join(os.path.dirname(os.path.abspath(__name__)), 'applications', 'static', 'upload')
class ProductionConfig(BaseConfig):
"""生成环境配置"""
-2
View File
@@ -3,13 +3,11 @@ from flask import Flask
from .init_databases import register_script
from .init_sqlalchemy import db, ma, init_databases
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_error_views import init_error_views
def init_plugs(app: Flask) -> None:
# init_debug_tool(app)
init_login_manager(app)
init_databases(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),
(3, '用户管理', '1', 'admin:user:main', '/admin/user/', '_iframe', '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,
'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)
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()
@@ -260,7 +260,7 @@ def create_admin_user():
add_data(_fields, _data_list, User)
def create_admin_user_role():
def create_admin_user_role() -> object:
from applications.extensions import db
_data_list = [
@@ -271,7 +271,7 @@ def create_admin_user_role():
# add_data(_fields, _data_list, UserRole)
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()
@@ -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 .log import AdminLog, LogSchema
from applications.models.file.photo import Photo, PhotoSchema
from applications.models.rights.power import Power, PowerSchema, PowerSchema2
from applications.models.rights.role import Role, RoleSchema
from applications.models.rights.role_power import role_power
from applications.models.users.employee import User, UserSchema
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):
__tablename__ = 'admin_dept'
__tablename__ = 'cp_dept'
id = db.Column(db.Integer, primary_key=True, comment="部门ID")
parent_id = db.Column(db.Integer, 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 applications.extensions import db, ma
from marshmallow import fields
from applications.models import Dept
class User(db.Model, UserMixin):
__tablename__ = 'admin_user'
__tablename__ = 'cp_user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='用户ID')
username = 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")
remark = db.Column(db.String(255), 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')
create_at = db.Column(db.DateTime, default=datetime.datetime.now, comment='创建时间')
update_at = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='创建时间')
role = db.relationship('Role', secondary="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):
self.password_hash = generate_password_hash(password)
@@ -38,6 +38,7 @@ class UserSchema(ma.Schema):
dept = fields.Method("get_dept")
def get_dept(self, obj):
from applications.models import Dept
if obj.dept_id != None:
return Dept.query.filter_by(id=obj.dept_id).first().dept_name
else:
+1 -1
View File
@@ -5,7 +5,7 @@ from marshmallow import fields
class Photo(db.Model):
__tablename__ = 'admin_photo'
__tablename__ = 'file_photo'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255), nullable=False)
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 marshmallow import fields
@@ -13,7 +13,7 @@ class AdminLog(db.Model):
ip = db.Column(db.String(255))
success = db.Column(db.Integer)
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): # 序列化类
+4 -4
View File
@@ -4,14 +4,14 @@ from marshmallow import fields
class Power(db.Model):
__tablename__ = 'admin_power'
__tablename__ = 'rt_power'
id = db.Column(db.Integer, primary_key=True, 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='权限标识')
url = db.Column(db.String(255), 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='图标')
sort = db.Column(db.Integer, 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]) # 自关联
# 权限models序列化类
# 权限 models 序列化类
class PowerSchema(ma.Schema):
id = fields.Integer()
title = fields.Str(attribute="name")
+2 -2
View File
@@ -4,7 +4,7 @@ from marshmallow import fields
class Role(db.Model):
__tablename__ = 'admin_role'
__tablename__ = 'rt_role'
id = db.Column(db.Integer, primary_key=True, comment='角色ID')
name = 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='排序')
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='更新时间')
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):
+3 -3
View File
@@ -2,8 +2,8 @@ from applications.extensions import db
# 创建中间表
role_power = db.Table(
"admin_role_power", # 中间表名称
"rt_role_power", # 中间表名称
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("role_id", db.Integer, db.ForeignKey("admin_role.id"), comment='角色编号'), # 属性 外键
db.Column("power_id", db.Integer, db.ForeignKey("rt_power.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(
"admin_user_role", # 中间表名称
"rt_user_role", # 中间表名称
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("role_id", db.Integer, db.ForeignKey("admin_role.id"), comment='角色编号'), # 属性 外键
db.Column("user_id", db.Integer, db.ForeignKey("cp_user.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.passport import register_passport_views
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):
-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.rights import authorize
from applications.common.utils.validate import xss_escape
from applications.models import DictType, DictData
from applications.common.admin import dict_curd
@@ -21,7 +20,7 @@ def main():
def dict_type_data():
page = request.args.get('page', type=int)
limit = request.args.get('limit', type=int)
type_name = 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)
return table_api(data=data,count=count)
@@ -101,7 +100,7 @@ def dict_type_delete(_id):
def dict_code_data():
page = request.args.get('page', type=int)
limit = request.args.get('limit', type=int)
type_code = 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)
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 applications.common.admin import role_curd
from applications.common.utils.http import table_api, success_api, fail_api
from applications.common.utils.rights import authorize
from applications.common.utils.validate import xss_escape
admin_role = Blueprint('adminRole', __name__, url_prefix='/admin/role')
@@ -21,8 +21,8 @@ def main():
def table():
page = request.args.get('page', type=int)
limit = request.args.get('limit', type=int)
role_name = xss_escape(request.args.get('roleName', type=str))
role_code = xss_escape(request.args.get('roleCode', type=str))
role_name = escape(request.args.get('roleName', type=str))
role_code = escape(request.args.get('roleCode', type=str))
filters = {}
if 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 applications.common.utils.http import table_api, fail_api, success_api
from applications.common.utils.rights import authorize
from applications.common.utils.validate import xss_escape
from applications.models import User
from applications.models import Role
from applications.common.admin import user_curd
@@ -24,8 +23,8 @@ def main():
def data():
page = request.args.get('page', type=int)
limit = request.args.get('limit', type=int)
real_name = xss_escape(request.args.get('realName', type=str))
username = xss_escape(request.args.get('username', type=str))
real_name = escape(request.args.get('realName', type=str))
username = escape(request.args.get('username', type=str))
dept_id = request.args.get('deptId', type=int)
filters = {}
if real_name:
@@ -49,9 +48,9 @@ def add():
def save():
req_json = request.json
a = req_json.get("roleIds")
username = xss_escape(req_json.get('username'))
real_name = xss_escape(req_json.get('realName'))
password = xss_escape(req_json.get('password'))
username = escape(req_json.get('username'))
real_name = escape(req_json.get('realName'))
password = escape(req_json.get('password'))
role_ids = a.split(',')
if not username or not real_name or not password:
@@ -93,11 +92,11 @@ def edit(_id):
@authorize("admin:user:edit", log=True)
def update():
req_json = request.json
a = xss_escape(req_json.get("roleIds"))
_id = xss_escape(req_json.get("userId"))
username = xss_escape(req_json.get('username'))
real_name = xss_escape(req_json.get('realName'))
dept_id = xss_escape(req_json.get('deptId'))
a = escape(req_json.get("roleIds"))
_id = escape(req_json.get("userId"))
username = escape(req_json.get('username'))
real_name = escape(req_json.get('realName'))
dept_id = escape(req_json.get('deptId'))
role_ids = a.split(',')
user_curd.update_user(id, username, real_name, dept_id)
user_curd.update_user_role(_id, role_ids)
+1 -1
View File
@@ -1,6 +1,6 @@
from flask import Blueprint
index_bp = Blueprint('Index', __name__, url_prefix='/')
index_bp = Blueprint('index', __name__, url_prefix='/')
from . import index
+8
View File
@@ -116,3 +116,11 @@ def batch_remove():
ids = request.form.getlist('ids[]')
rights_curd.batch_remove(ids)
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
click==8.0.1
colorama==0.4.4
Flask==2.0.1
Flask-DebugToolbar==0.11.0
Flask-Login==0.5.0
flask-marshmallow==0.14.0
Flask-Migrate==3.0.1
Flask-SQLAlchemy==2.5.1
Flask-Uploads==0.2.1
greenlet==1.1.0
itsdangerous==2.0.1
Jinja2==3.0.1
Mako==1.1.4
MarkupSafe==2.0.1
marshmallow==3.12.1
marshmallow-sqlalchemy==0.26.1
Pillow==8.2.0
psutil==5.8.0
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
SQLAlchemy==1.4.18
sqlparse==0.4.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