diff --git a/.flaskenv b/.flaskenv index e69de29..007748f 100644 --- a/.flaskenv +++ b/.flaskenv @@ -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")' diff --git a/.gitignore b/.gitignore index 935a2f8..3dae7c4 100644 --- a/.gitignore +++ b/.gitignore @@ -115,4 +115,10 @@ dmypy.json .pyre/ #ide -.idea/ \ No newline at end of file +.idea/ + +# 数据库文件 +*.db +#上传到本地的图片文件 +*upload* +migrations/ \ No newline at end of file diff --git a/app.py b/app.py deleted file mode 100644 index fa30dc2..0000000 --- a/app.py +++ /dev/null @@ -1,3 +0,0 @@ -from applications import create_app - -app = create_app() diff --git a/applications/models/users/__init__.py b/applications/api/__init__.py similarity index 100% rename from applications/models/users/__init__.py rename to applications/api/__init__.py diff --git a/applications/common/admin/dept_curd.py b/applications/common/admin/dept_curd.py index ba5b05f..0e0a978 100644 --- a/applications/common/admin/dept_curd.py +++ b/applications/common/admin/dept_curd.py @@ -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 diff --git a/applications/common/admin/index_curd.py b/applications/common/admin/index_curd.py index de233fb..5c9de03 100644 --- a/applications/common/admin/index_curd.py +++ b/applications/common/admin/index_curd.py @@ -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) # 生成验证码 diff --git a/applications/common/admin/rights_curd.py b/applications/common/admin/rights_curd.py index cb68ad9..3114f5a 100644 --- a/applications/common/admin/rights_curd.py +++ b/applications/common/admin/rights_curd.py @@ -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) diff --git a/applications/common/admin/role_curd.py b/applications/common/admin/role_curd.py index 989cb9b..90f3a97 100644 --- a/applications/common/admin/role_curd.py +++ b/applications/common/admin/role_curd.py @@ -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) diff --git a/applications/common/admin/user_curd.py b/applications/common/admin/user_curd.py index 2fb4ab9..a606528 100644 --- a/applications/common/admin/user_curd.py +++ b/applications/common/admin/user_curd.py @@ -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) diff --git a/applications/common/utils/rights.py b/applications/common/utils/rights.py index 0243872..f110059 100644 --- a/applications/common/utils/rights.py +++ b/applications/common/utils/rights.py @@ -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': diff --git a/applications/common/utils/validate.py b/applications/common/utils/validate.py index 2921f8c..cf00959 100644 --- a/applications/common/utils/validate.py +++ b/applications/common/utils/validate.py @@ -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("&", "&").replace(">", ">").replace("<", "<").replace("'", "'").replace('"', - """) - - def check_data(schema, data): errors = schema.validate(data) for k, v in errors.items(): diff --git a/applications/configs/config.py b/applications/configs/config.py index b40fb10..2a2f471 100644 --- a/applications/configs/config.py +++ b/applications/configs/config.py @@ -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): """生成环境配置""" diff --git a/applications/extensions/__init__.py b/applications/extensions/__init__.py index 3e6bf46..4d09791 100644 --- a/applications/extensions/__init__.py +++ b/applications/extensions/__init__.py @@ -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) diff --git a/applications/extensions/init_databases/__init__.py b/applications/extensions/init_databases/__init__.py index c703257..cc731de 100644 --- a/applications/extensions/init_databases/__init__.py +++ b/applications/extensions/init_databases/__init__.py @@ -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() diff --git a/applications/extensions/init_debug_tool.py b/applications/extensions/init_debug_tool.py deleted file mode 100644 index 8182457..0000000 --- a/applications/extensions/init_debug_tool.py +++ /dev/null @@ -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) diff --git a/applications/models/__init__.py b/applications/models/__init__.py index c3b8bcb..b60ee8e 100644 --- a/applications/models/__init__.py +++ b/applications/models/__init__.py @@ -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 diff --git a/applications/models/company/__init__.py b/applications/models/company/__init__.py new file mode 100644 index 0000000..57d4357 --- /dev/null +++ b/applications/models/company/__init__.py @@ -0,0 +1,2 @@ +from .dept import Dept, DeptSchema +from .users import User, UserSchema diff --git a/applications/models/dept.py b/applications/models/company/dept.py similarity index 97% rename from applications/models/dept.py rename to applications/models/company/dept.py index b4826e6..d57abcd 100644 --- a/applications/models/dept.py +++ b/applications/models/company/dept.py @@ -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="部门名称") diff --git a/applications/models/users/employee.py b/applications/models/company/users.py similarity index 87% rename from applications/models/users/employee.py rename to applications/models/company/users.py index 0883e77..c0b3a12 100644 --- a/applications/models/users/employee.py +++ b/applications/models/company/users.py @@ -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: diff --git a/applications/models/file/photo.py b/applications/models/file/photo.py index 299e932..7d64cee 100644 --- a/applications/models/file/photo.py +++ b/applications/models/file/photo.py @@ -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)) diff --git a/applications/models/log.py b/applications/models/log.py index d2339bb..dbc6f32 100644 --- a/applications/models/log.py +++ b/applications/models/log.py @@ -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): # 序列化类 diff --git a/applications/models/rights/power.py b/applications/models/rights/power.py index 4314dbe..8f54da8 100644 --- a/applications/models/rights/power.py +++ b/applications/models/rights/power.py @@ -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") diff --git a/applications/models/rights/role.py b/applications/models/rights/role.py index 802d4ff..69605ec 100644 --- a/applications/models/rights/role.py +++ b/applications/models/rights/role.py @@ -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): diff --git a/applications/models/rights/role_power.py b/applications/models/rights/role_power.py index 9758953..929f581 100644 --- a/applications/models/rights/role_power.py +++ b/applications/models/rights/role_power.py @@ -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='角色编号'), # 属性 外键 ) diff --git a/applications/models/rights/user_role.py b/applications/models/rights/user_role.py index b293329..78aa1eb 100644 --- a/applications/models/rights/user_role.py +++ b/applications/models/rights/user_role.py @@ -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='角色编号'), # 属性 外键 ) diff --git a/applications/view/__init__.py b/applications/view/__init__.py index bec7989..09f144e 100644 --- a/applications/view/__init__.py +++ b/applications/view/__init__.py @@ -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): diff --git a/applications/view/admin/curd.py b/applications/view/admin/curd.py deleted file mode 100644 index d58814c..0000000 --- a/applications/view/admin/curd.py +++ /dev/null @@ -1,8 +0,0 @@ -from flask import Blueprint - -admin_curd = Blueprint('adminCurd', __name__, url_prefix='/admin/curd') - - -@admin_curd.route('/') -def index(): - return "功能开发中" diff --git a/applications/view/admin/dict.py b/applications/view/admin/dict.py index a9ee920..a57f4e2 100644 --- a/applications/view/admin/dict.py +++ b/applications/view/admin/dict.py @@ -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) diff --git a/applications/view/admin/role.py b/applications/view/admin/role.py index eb08507..96ec8e9 100644 --- a/applications/view/admin/role.py +++ b/applications/view/admin/role.py @@ -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 + '%') diff --git a/applications/view/admin/user.py b/applications/view/admin/user.py index c837784..9a86e3b 100644 --- a/applications/view/admin/user.py +++ b/applications/view/admin/user.py @@ -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) diff --git a/applications/view/company/__init__.py b/applications/view/company/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/applications/view/department/__init__.py b/applications/view/company/department/__init__.py similarity index 100% rename from applications/view/department/__init__.py rename to applications/view/company/department/__init__.py diff --git a/applications/view/index/__init__.py b/applications/view/index/__init__.py index 382c14f..ad62adf 100644 --- a/applications/view/index/__init__.py +++ b/applications/view/index/__init__.py @@ -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 diff --git a/applications/view/rights/view.py b/applications/view/rights/view.py index 8dc3605..c7a06c1 100644 --- a/applications/view/rights/view.py +++ b/applications/view/rights/view.py @@ -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 + 四位公司值: +""" diff --git a/migrations/README b/migrations/README deleted file mode 100644 index 98e4f9c..0000000 --- a/migrations/README +++ /dev/null @@ -1 +0,0 @@ -Generic single-database configuration. \ No newline at end of file diff --git a/migrations/alembic.ini b/migrations/alembic.ini deleted file mode 100644 index ec9d45c..0000000 --- a/migrations/alembic.ini +++ /dev/null @@ -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 diff --git a/migrations/env.py b/migrations/env.py deleted file mode 100644 index 68feded..0000000 --- a/migrations/env.py +++ /dev/null @@ -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() diff --git a/migrations/script.py.mako b/migrations/script.py.mako deleted file mode 100644 index 2c01563..0000000 --- a/migrations/script.py.mako +++ /dev/null @@ -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"} diff --git a/migrations/versions/0893a714a376_changge.py b/migrations/versions/0893a714a376_changge.py deleted file mode 100644 index 7a80ea1..0000000 --- a/migrations/versions/0893a714a376_changge.py +++ /dev/null @@ -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 ### diff --git a/migrations/versions/296c80a9d6e8_init.py b/migrations/versions/296c80a9d6e8_init.py deleted file mode 100644 index 802f7a8..0000000 --- a/migrations/versions/296c80a9d6e8_init.py +++ /dev/null @@ -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 ### diff --git a/requirement/requirement-dev.txt b/requirement/requirement-dev.txt index cd41a41..319021a 100644 --- a/requirement/requirement-dev.txt +++ b/requirement/requirement-dev.txt @@ -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 diff --git a/static/upload/1623509219000.jpg b/static/upload/1623509219000.jpg deleted file mode 100644 index 6836126..0000000 Binary files a/static/upload/1623509219000.jpg and /dev/null differ diff --git a/static/upload/1623509456000.jpg b/static/upload/1623509456000.jpg deleted file mode 100644 index b360fbd..0000000 Binary files a/static/upload/1623509456000.jpg and /dev/null differ