refactor(重构程序&目录结构)

This commit is contained in:
zhengxinonly
2022-01-23 00:43:39 +08:00
parent 3453b01938
commit 6978002393
60 changed files with 374 additions and 462 deletions
+1 -15
View File
@@ -1,17 +1,3 @@
# 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_ENV=development
FLASK_RUN_HOST=0.0.0.0 FLASK_RUN_HOST=0.0.0.0
FLASK_APP='applications:create_app("development")' FLASK_APP='applications:create_app'
+6
View File
@@ -0,0 +1,6 @@
from applications import create_app
app = create_app()
if __name__ == '__main__':
app.run()
+6 -12
View File
@@ -1,26 +1,20 @@
import os import os
from flask import Flask from flask import Flask
from applications.common.flask_uploads import configure_uploads from common.flask_uploads import configure_uploads
from applications.common.utils.upload import photos from common.utils.upload import photos
from applications.configs import common from extensions import init_plugs
from applications.extensions import init_plugs
from applications.view import init_view from applications.view import init_view
from applications.api import init_api from applications.api import init_api
from applications.configs import config import config
def create_app(config_name=None): def create_app():
app = Flask('pear-admin-flask') app = Flask('pear-admin-flask')
if not config_name:
# 尝试从本地环境中读取
config_name = os.getenv('FLASK_CONFIG', 'development')
# 引入数据库配置 # 引入数据库配置
app.config.from_object(common) app.config.from_object(config)
app.config.from_object(config[config_name])
# 注册各种插件 # 注册各种插件
init_plugs(app) init_plugs(app)
+10 -11
View File
@@ -1,20 +1,19 @@
from flask import jsonify from flask import jsonify
from flask_restful import Resource, reqparse from flask_restful import Resource, reqparse
from applications.common.utils.http import success_api, fail_api from common.utils.http import success_api, fail_api
from applications.extensions import db from extensions import db
from applications.models import CompanyDepartment, CompanyUser from models import DepartmentModels, UserModels
class DepartmentsResource(Resource): class DepartmentsResource(Resource):
def get(self): def get(self):
dept_data = CompanyDepartment.query.order_by(CompanyDepartment.sort).all() dept_data = DepartmentModels.query.order_by(DepartmentModels.sort).all()
# TODO dtree 需要返回状态信息 # TODO dtree 需要返回状态信息
res = { res = {
"status": {"code": 200, "message": "默认"}, "status": {"code": 200, "message": "默认"},
"data": [ "data": [
{ {
'deptId': item.id, 'deptId': item.id,
'parentId': item.parent_id, 'parentId': item.parent_id,
@@ -45,7 +44,7 @@ class DepartmentsResource(Resource):
res = parser.parse_args() res = parser.parse_args()
dept = CompanyDepartment( dept = DepartmentModels(
parent_id=res.parent_id, parent_id=res.parent_id,
dept_name=res.dept_name, dept_name=res.dept_name,
sort=res.sort, sort=res.sort,
@@ -63,7 +62,7 @@ class DepartmentsResource(Resource):
class DepartmentResource(Resource): class DepartmentResource(Resource):
def get(self, dept_id): def get(self, dept_id):
dept = CompanyDepartment.query.filter_by(id=dept_id).first() dept = DepartmentModels.query.filter_by(id=dept_id).first()
dept_data = { dept_data = {
'id': dept.id, 'id': dept.id,
'dept_name': dept.dept_name, 'dept_name': dept.dept_name,
@@ -96,15 +95,15 @@ class DepartmentResource(Resource):
"status": res.status, "status": res.status,
"address": res.address "address": res.address
} }
res = CompanyDepartment.query.filter_by(id=dept_id).update(data) res = DepartmentModels.query.filter_by(id=dept_id).update(data)
if not res: if not res:
return fail_api(message="更新失败") return fail_api(message="更新失败")
db.session.commit() db.session.commit()
return success_api(message="更新成功") return success_api(message="更新成功")
def delete(self, dept_id): def delete(self, dept_id):
ret = CompanyDepartment.query.filter_by(id=dept_id).delete() ret = DepartmentModels.query.filter_by(id=dept_id).delete()
CompanyUser.query.filter_by(dept_id=dept_id).update({"dept_id": None}) UserModels.query.filter_by(dept_id=dept_id).update({"dept_id": None})
db.session.commit() db.session.commit()
if ret: if ret:
return success_api(message="删除成功") return success_api(message="删除成功")
@@ -113,7 +112,7 @@ class DepartmentResource(Resource):
class DeptEnableResource(Resource): class DeptEnableResource(Resource):
def put(self, dept_id): def put(self, dept_id):
d = CompanyDepartment.query.get(dept_id) d = DepartmentModels.query.get(dept_id)
if d: if d:
d.status = not d.status d.status = not d.status
db.session.commit() db.session.commit()
+14 -19
View File
@@ -5,9 +5,9 @@ from flask import request, jsonify, current_app
from flask_login import current_user from flask_login import current_user
from flask_restful import Resource, reqparse from flask_restful import Resource, reqparse
from applications.common.utils.http import success_api, fail_api from common.utils.http import success_api, fail_api
from applications.extensions import db from extensions import db
from applications.models import RightsPower, RightsRole from models import RightModels, RoleModels
def get_render_config(): def get_render_config():
@@ -105,7 +105,6 @@ def make_menu_tree():
if p.type == 0 or p.type == 1: if p.type == 0 or p.type == 1:
powers.append(p) powers.append(p)
# power_dict = marshal(powers, RightsPower.fields2()) # 生成可序列化对象
power_dict = [ power_dict = [
{ {
'id': item.id, 'id': item.id,
@@ -118,8 +117,6 @@ def make_menu_tree():
'icon': item.icon, 'icon': item.icon,
'sort': item.sort, 'sort': item.sort,
'enable': item.enable, 'enable': item.enable,
'update_at': item.update_at.strftime('%Y-%m-%d %H:%M:%S'),
'create_at': item.create_at.strftime('%Y-%m-%d %H:%M:%S'),
} for item in powers } for item in powers
] ]
power_dict.sort(key=lambda x: x['id'], reverse=True) power_dict.sort(key=lambda x: x['id'], reverse=True)
@@ -143,15 +140,15 @@ def make_menu_tree():
# 删除权限(目前没有判断父节点自动删除子节点) # 删除权限(目前没有判断父节点自动删除子节点)
def remove_power(power_id): def remove_power(power_id):
power = RightsPower.query.filter_by(id=power_id).first() power = RightModels.query.filter_by(id=power_id).first()
role_id_list = [] role_id_list = []
roles = power.role roles = power.role
for role in roles: for role in roles:
role_id_list.append(role.id) role_id_list.append(role.id)
roles = RightsRole.query.filter(RightsRole.id.in_(role_id_list)).all() roles = RoleModels.query.filter(RoleModels.id.in_(role_id_list)).all()
for p in roles: for p in roles:
power.role.remove(p) power.role.remove(p)
r = RightsPower.query.filter_by(id=power_id).delete() r = RightModels.query.filter_by(id=power_id).delete()
db.session.commit() db.session.commit()
return r return r
@@ -177,8 +174,8 @@ class RightRightsResource(Resource):
def get(self): def get(self):
"""获取选择父节点""" """获取选择父节点"""
power = RightsPower.query.all() power = RightModels.query.all()
# power_data = marshal(power, RightsPower.fields()) # power_data = marshal(power, RightModels.fields())
power_data = [ power_data = [
{ {
'powerId': item.id, 'powerId': item.id,
@@ -189,8 +186,6 @@ class RightRightsResource(Resource):
'parentId': item.parent_id, 'parentId': item.parent_id,
'icon': item.icon, 'icon': item.icon,
'sort': item.sort, 'sort': item.sort,
'create_at': item.create_at.strftime('%Y-%m-%d %H:%M:%S'),
'update_at': item.update_at.strftime('%Y-%m-%d %H:%M:%S'),
'enable': item.enable, 'enable': item.enable,
} for item in power } for item in power
] ]
@@ -211,7 +206,7 @@ class RightPowerResource(Resource):
def post(self, power_id): def post(self, power_id):
res = parser_power.parse_args() res = parser_power.parse_args()
power = RightsPower( power = RightModels(
icon=res.icon, icon=res.icon,
open_type=res.open_type, open_type=res.open_type,
parent_id=res.parent_id, parent_id=res.parent_id,
@@ -233,15 +228,15 @@ class RightPowerResource(Resource):
def delete(self, power_id): def delete(self, power_id):
# 删除权限(目前没有判断父节点自动删除子节点) # 删除权限(目前没有判断父节点自动删除子节点)
power = RightsPower.query.filter_by(id=power_id).first() power = RightModels.query.filter_by(id=power_id).first()
role_id_list = [] role_id_list = []
roles = power.role roles = power.role
for role in roles: for role in roles:
role_id_list.append(role.id) role_id_list.append(role.id)
roles = RightsRole.query.filter(RightsRole.id.in_(role_id_list)).all() roles = RoleModels.query.filter(RoleModels.id.in_(role_id_list)).all()
for p in roles: for p in roles:
power.role.remove(p) power.role.remove(p)
r = RightsPower.query.filter_by(id=power_id).delete() r = RightModels.query.filter_by(id=power_id).delete()
db.session.commit() db.session.commit()
if r: if r:
@@ -262,7 +257,7 @@ class RightPowerResource(Resource):
"url": res.power_url, "url": res.power_url,
"sort": res.sort "sort": res.sort
} }
power = RightsPower.query.filter_by(id=power_id).update(data) power = RightModels.query.filter_by(id=power_id).update(data)
db.session.commit() db.session.commit()
if not power: if not power:
@@ -273,7 +268,7 @@ class RightPowerResource(Resource):
class RightPowerEnableResource(Resource): class RightPowerEnableResource(Resource):
def put(self, right_id): def put(self, right_id):
power = RightsPower.query.get(right_id) power = RightModels.query.get(right_id)
if power: if power:
power.enable = not power.enable power.enable = not power.enable
db.session.commit() db.session.commit()
+20 -20
View File
@@ -1,28 +1,28 @@
from flask_restful import Resource, reqparse, marshal from flask_restful import Resource, reqparse, marshal
from applications.common.utils.http import table_api, success_api, fail_api from common.utils.http import table_api, success_api, fail_api
from applications.extensions import db from extensions import db
from applications.models import RightsPower, RightsRole, CompanyUser from models import RightModels, RoleModels, UserModels
def remove_role(role_id): def remove_role(role_id):
""" 删除角色 """ """ 删除角色 """
role = RightsRole.query.filter_by(id=role_id).first() role = RoleModels.query.filter_by(id=role_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)
powers = RightsPower.query.filter(RightsPower.id.in_(power_id_list)).all() powers = RightModels.query.filter(RightModels.id.in_(power_id_list)).all()
for p in powers: for p in powers:
role.power.remove(p) role.power.remove(p)
user_id_list = [] user_id_list = []
for u in role.user: for u in role.user:
user_id_list.append(u.id) user_id_list.append(u.id)
users = CompanyUser.query.filter(CompanyUser.id.in_(user_id_list)).all() users = UserModels.query.filter(UserModels.id.in_(user_id_list)).all()
for u in users: for u in users:
role.user.remove(u) role.user.remove(u)
r = RightsRole.query.filter_by(id=role_id).delete() r = RoleModels.query.filter_by(id=role_id).delete()
db.session.commit() db.session.commit()
return r return r
@@ -46,11 +46,11 @@ class RoleRolesResource(Resource):
filters = [] filters = []
if res.role_name: if res.role_name:
filters.append(RightsRole.name.like('%' + res.role_name + '%')) filters.append(RoleModels.name.like('%' + res.role_name + '%'))
if res.role_code: if res.role_code:
filters.append(RightsRole.code.like('%' + res.role_code + '%')) filters.append(RoleModels.code.like('%' + res.role_code + '%'))
paginate = RightsRole.query.filter(*filters).paginate(page=res.page, per_page=res.limit, error_out=False) paginate = RoleModels.query.filter(*filters).paginate(page=res.page, per_page=res.limit, error_out=False)
return table_api(result={'items': [{'id': item.id, return table_api(result={'items': [{'id': item.id,
'roleName': item.name, 'roleName': item.name,
@@ -59,7 +59,7 @@ class RoleRolesResource(Resource):
'comment': item.comment, 'comment': item.comment,
'details': item.details, 'details': item.details,
'sort': item.sort, 'sort': item.sort,
'create_at': str(item.create_at), } for item in paginate.items], } for item in paginate.items],
'total': paginate.total} 'total': paginate.total}
, code=0) , code=0)
@@ -85,7 +85,7 @@ class RoleRoleResource(Resource):
res = parser.parse_args() res = parser.parse_args()
role = RightsRole( role = RoleModels(
details=res.details, details=res.details,
enable=res.enable, enable=res.enable,
code=res.role_code, code=res.role_code,
@@ -116,7 +116,7 @@ class RoleRoleResource(Resource):
"details": res.details "details": res.details
} }
role = RightsRole.query.filter_by(id=role_id).update(data) role = RoleModels.query.filter_by(id=role_id).update(data)
db.session.commit() db.session.commit()
if not role: if not role:
return fail_api(message="更新角色失败") return fail_api(message="更新角色失败")
@@ -127,7 +127,7 @@ class RoleEnableResource(Resource):
"""启用用户""" """启用用户"""
def put(self, role_id): def put(self, role_id):
ret = RightsRole.query.get(role_id) ret = RoleModels.query.get(role_id)
ret.enable = not ret.enable ret.enable = not ret.enable
db.session.commit() db.session.commit()
@@ -141,11 +141,11 @@ class RolePowerResource(Resource):
def get(self, role_id): def get(self, role_id):
# 获取角色权限 # 获取角色权限
role = RightsRole.query.filter_by(id=role_id).first() role = RoleModels.query.filter_by(id=role_id).first()
# 获取权限列表的 id # 获取权限列表的 id
check_powers_list = [rp.id for rp in role.power] check_powers_list = [rp.id for rp in role.power]
powers = RightsPower.query.all() # 获取所有的权限 powers = RightModels.query.all() # 获取所有的权限
powers = marshal(powers, RightsPower.fields()) powers = marshal(powers, RightModels.fields())
for i in powers: for i in powers:
if int(i.get("powerId")) in check_powers_list: if int(i.get("powerId")) in check_powers_list:
i["checkArr"] = "1" i["checkArr"] = "1"
@@ -166,14 +166,14 @@ class RolePowerResource(Resource):
power_list = res.power_ids.split(',') power_list = res.power_ids.split(',')
""" 更新角色权限 """ """ 更新角色权限 """
role = RightsRole.query.filter_by(id=role_id).first() role = RoleModels.query.filter_by(id=role_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)
powers = RightsPower.query.filter(RightsPower.id.in_(power_id_list)).all() powers = RightModels.query.filter(RightModels.id.in_(power_id_list)).all()
for p in powers: for p in powers:
role.power.remove(p) role.power.remove(p)
powers = RightsPower.query.filter(RightsPower.id.in_(power_list)).all() powers = RightModels.query.filter(RightModels.id.in_(power_list)).all()
for p in powers: for p in powers:
role.power.append(p) role.power.append(p)
db.session.commit() db.session.commit()
+7 -8
View File
@@ -4,10 +4,10 @@ from flask import request, jsonify, current_app
from flask_restful import Resource from flask_restful import Resource
from sqlalchemy import desc from sqlalchemy import desc
from applications.common.utils.http import fail_api, success_api, table_api from common.utils.http import fail_api, success_api, table_api
from applications.common.utils.upload import upload_one, delete_photo_by_id from common.utils.upload import upload_one, delete_photo_by_id
from applications.extensions import db from extensions import db
from applications.models import FilePhoto from models import PhotoModels
class FilePhotosResource(Resource): class FilePhotosResource(Resource):
@@ -15,11 +15,10 @@ class FilePhotosResource(Resource):
def get(self): def get(self):
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)
photo_paginate = FilePhoto.query.order_by(desc(FilePhoto.create_at) photo_paginate = PhotoModels.query.order_by(desc(PhotoModels.create_at)
).paginate(page=page, ).paginate(page=page,
per_page=limit, per_page=limit,
error_out=False) error_out=False)
# data = marshal(photo_paginate.items, FilePhoto.fields())
data = [ data = [
{ {
'id': item.id, 'id': item.id,
@@ -55,11 +54,11 @@ class FilePhotosResource(Resource):
"""图片批量删除""" """图片批量删除"""
# TODO bugs 图片删除失败 # TODO bugs 图片删除失败
ids = request.form.getlist('ids[]') ids = request.form.getlist('ids[]')
photo_name = FilePhoto.query.filter(FilePhoto.id.in_(ids)).all() photo_name = PhotoModels.query.filter(PhotoModels.id.in_(ids)).all()
upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST") upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST")
for p in photo_name: for p in photo_name:
os.remove(upload_url + '/' + p.name) os.remove(upload_url + '/' + p.name)
photo = FilePhoto.query.filter(FilePhoto.id.in_(ids)).delete(synchronize_session=False) photo = PhotoModels.query.filter(PhotoModels.id.in_(ids)).delete(synchronize_session=False)
db.session.commit() db.session.commit()
if photo: if photo:
return success_api(message="删除成功") return success_api(message="删除成功")
+5 -5
View File
@@ -3,10 +3,10 @@ from flask import session, redirect, url_for
from flask_login import current_user, login_user from flask_login import current_user, login_user
from flask_restful import Resource, reqparse from flask_restful import Resource, reqparse
from applications.common.gen_captcha import add_auth_session from common.gen_captcha import add_auth_session
from applications.common.utils.http import fail_api, success_api from common.utils.http import fail_api, success_api
from applications.common.utils.rights import record_logging from common.utils.rights import record_logging
from applications.models import CompanyUser from models import UserModels
class LoginResource(Resource): class LoginResource(Resource):
@@ -28,7 +28,7 @@ class LoginResource(Resource):
if req.captcha != s_code: if req.captcha != s_code:
return fail_api(message="验证码错误") return fail_api(message="验证码错误")
user = CompanyUser.query.filter_by(username=req.username).first() user = UserModels.query.filter_by(username=req.username).first()
if user is None: if user is None:
return fail_api(message="不存在的用户") return fail_api(message="不存在的用户")
+8 -9
View File
@@ -1,11 +1,10 @@
# 个人中心 # 个人中心
from flask import request, jsonify from flask import request, jsonify
from flask_login import login_required
from flask_restful import Resource, reqparse from flask_restful import Resource, reqparse
from applications.common.utils.http import fail_api, success_api from common.utils.http import fail_api, success_api
from applications.extensions import db from extensions import db
from applications.models import CompanyUser from models import UserModels
class UserStatusResource(Resource): class UserStatusResource(Resource):
@@ -19,11 +18,11 @@ class UserStatusResource(Resource):
res = parser.parse_args() res = parser.parse_args()
if res.operate == 1: if res.operate == 1:
user = CompanyUser.query.get(user_id) user = UserModels.query.get(user_id)
user.enable = res.operate user.enable = res.operate
message = success_api(message="启动成功") message = success_api(message="启动成功")
else: else:
user = CompanyUser.query.filter_by(id=res.user_id).update({"enable": res.operate}) user = UserModels.query.filter_by(id=res.user_id).update({"enable": res.operate})
message = success_api(message="禁用成功") message = success_api(message="禁用成功")
if user: if user:
db.session.commit() db.session.commit()
@@ -37,7 +36,7 @@ class UserAvatarResource(Resource):
def put(self, user_id): def put(self, user_id):
url = request.json.get("avatar").get("src") url = request.json.get("avatar").get("src")
ret = CompanyUser.query.get(user_id) ret = UserModels.query.get(user_id)
ret.avatar = url ret.avatar = url
db.session.commit() db.session.commit()
if not ret: if not ret:
@@ -56,7 +55,7 @@ class UserInfoResource(Resource):
res = parser.parse_args() res = parser.parse_args()
ret = CompanyUser.query.get(user_id) ret = UserModels.query.get(user_id)
ret.username = res.username ret.username = res.username
ret.realname = res.real_name ret.realname = res.real_name
ret.remark = res.details ret.remark = res.details
@@ -81,7 +80,7 @@ class UserPasswordResource(Resource):
return fail_api(message='确认密码不一致') return fail_api(message='确认密码不一致')
""" 修改当前用户密码 """ """ 修改当前用户密码 """
user = CompanyUser.query.get(user_id) user = UserModels.query.get(user_id)
is_right = user.validate_password(res.oldPassword) is_right = user.validate_password(res.oldPassword)
if not is_right: if not is_right:
return jsonify(success=False, message="旧密码错误") return jsonify(success=False, message="旧密码错误")
+25 -25
View File
@@ -3,35 +3,35 @@ from flask_login import current_user
from flask_restful import Resource, reqparse from flask_restful import Resource, reqparse
from sqlalchemy import desc from sqlalchemy import desc
from applications.common.utils.http import fail_api, success_api, table_api from common.utils.http import fail_api, success_api, table_api
from applications.extensions import db from extensions import db
from applications.models import CompanyUser, RightsRole, CompanyDepartment from models import UserModels, RoleModels, DepartmentModels
from applications.models import LoggingModel from models import LogModel
def get_current_user_logs(): def get_current_user_logs():
""" 获取当前用户日志 """ """ 获取当前用户日志 """
log = LoggingModel.query.filter_by(url='/passport/login').filter_by(uid=current_user.id).order_by( log = LogModel.query.filter_by(url='/passport/login').filter_by(uid=current_user.id).order_by(
desc(LoggingModel.create_at)).limit(10) desc(LogModel.create_at)).limit(10)
return log return log
def is_user_exists(username): def is_user_exists(username):
""" 判断用户是否存在 """ """ 判断用户是否存在 """
res = CompanyUser.query.filter_by(username=username).count() res = UserModels.query.filter_by(username=username).count()
return bool(res) return bool(res)
def delete_by_id(_id): def delete_by_id(_id):
""" 删除用户 """ """ 删除用户 """
user = CompanyUser.query.filter_by(id=_id).first() user = UserModels.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 = RightsRole.query.filter(RightsRole.id.in_(roles_id)).all() roles = RoleModels.query.filter(RoleModels.id.in_(roles_id)).all()
for r in roles: for r in roles:
user.role.remove(r) user.role.remove(r)
res = CompanyUser.query.filter_by(id=_id).delete() res = UserModels.query.filter_by(id=_id).delete()
db.session.commit() db.session.commit()
return res return res
@@ -43,14 +43,14 @@ def batch_remove(ids):
def update_user_role(_id, roles_list): def update_user_role(_id, roles_list):
user = CompanyUser.query.filter_by(id=_id).first() user = UserModels.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 = RightsRole.query.filter(RightsRole.id.in_(roles_id)).all() roles = RoleModels.query.filter(RoleModels.id.in_(roles_id)).all()
for r in roles: for r in roles:
user.role.remove(r) user.role.remove(r)
roles = RightsRole.query.filter(RightsRole.id.in_(roles_list)).all() roles = RoleModels.query.filter(RoleModels.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()
@@ -72,17 +72,17 @@ class UserUsersResource(Resource):
filters = [] filters = []
if res.real_name: if res.real_name:
filters.append(CompanyUser.realname.like('%' + res.real_name + '%')) filters.append(UserModels.realname.like('%' + res.real_name + '%'))
if res.username: if res.username:
filters.append(CompanyUser.username.like('%' + res.username + '%')) filters.append(UserModels.username.like('%' + res.username + '%'))
if res.dept_id: if res.dept_id:
filters.append(CompanyUser.dept_id == res.dept_id) filters.append(UserModels.dept_id == res.dept_id)
paginate = CompanyUser.query.filter(*filters).paginate(page=res.page, paginate = UserModels.query.filter(*filters).paginate(page=res.page,
per_page=res.limit, per_page=res.limit,
error_out=False) error_out=False)
dept_name = lambda dept_id: CompanyDepartment.query.filter_by(id=dept_id).first().dept_name if dept_id else "" dept_name = lambda dept_id: DepartmentModels.query.filter_by(id=dept_id).first().dept_name if dept_id else ""
user_data = [{ user_data = [{
'id': item.id, 'id': item.id,
'username': item.username, 'username': item.username,
@@ -111,7 +111,7 @@ class UserUsersResource(Resource):
if is_user_exists(res.username): if is_user_exists(res.username):
return fail_api(message="用户已经存在") return fail_api(message="用户已经存在")
user = CompanyUser() user = UserModels()
user.username = res.username user.username = res.username
user.realname = res.real_name user.realname = res.real_name
user.set_password(res.password) user.set_password(res.password)
@@ -119,8 +119,8 @@ class UserUsersResource(Resource):
db.session.commit() db.session.commit()
""" 增加用户角色 """ """ 增加用户角色 """
user = CompanyUser.query.filter_by(id=user.id).first() user = UserModels.query.filter_by(id=user.id).first()
roles = RightsRole.query.filter(RightsRole.id.in_(role_ids)).all() roles = RoleModels.query.filter(RoleModels.id.in_(role_ids)).all()
for r in roles: for r in roles:
user.role.append(r) user.role.append(r)
db.session.commit() db.session.commit()
@@ -152,7 +152,7 @@ class UserUserResource(Resource):
if is_user_exists(res.username): if is_user_exists(res.username):
return fail_api(message="用户已经存在") return fail_api(message="用户已经存在")
user = CompanyUser() user = UserModels()
user.username = res.username user.username = res.username
user.realname = res.real_name user.realname = res.real_name
user.set_password(res.password) user.set_password(res.password)
@@ -160,8 +160,8 @@ class UserUserResource(Resource):
db.session.commit() db.session.commit()
""" 增加用户角色 """ """ 增加用户角色 """
user = CompanyUser.query.filter_by(id=user.id).first() user = UserModels.query.filter_by(id=user.id).first()
roles = RightsRole.query.filter(RightsRole.id.in_(role_ids)).all() roles = RoleModels.query.filter(RoleModels.id.in_(role_ids)).all()
for r in roles: for r in roles:
user.role.append(r) user.role.append(r)
db.session.commit() db.session.commit()
@@ -189,7 +189,7 @@ class UserRoleResource(Resource):
role_ids = res.role_ids.split(',') role_ids = res.role_ids.split(',')
# 更新用户数据 # 更新用户数据
CompanyUser.query.filter_by(id=user_id).update({'username': res.username, UserModels.query.filter_by(id=user_id).update({'username': res.username,
'realname': res.real_name, 'realname': res.real_name,
'dept_id': res.dept_id}) 'dept_id': res.dept_id})
db.session.commit() db.session.commit()
-1
View File
@@ -1 +0,0 @@
from .config import config
-24
View File
@@ -1,24 +0,0 @@
SYSTEM_NAME = "Pear Admin"
# 主题面板的链接列表配置
SYSTEM_PANEL_LINKS = [
{
"icon": "layui-icon layui-icon-auz",
"title": "官方网站",
"href": "http://www.pearadmin.com"
},
{
"icon": "layui-icon layui-icon-auz",
"title": "开发文档",
"href": "http://www.pearadmin.com"
},
{
"icon": "layui-icon layui-icon-auz",
"title": "开源地址",
"href": "https://gitee.com/Jmysy/Pear-Admin-Layui"
}
]
UPLOADED_PHOTOS_DEST = 'static/upload'
UPLOADED_FILES_ALLOW = ['gif', 'jpg']
# JSON配置
JSON_AS_ASCII = False
-54
View File
@@ -1,54 +0,0 @@
import logging
import os
class BaseConfig:
SECRET_KEY = os.getenv('SECRET_KEY', 'dev key')
# redis配置
REDIS_HOST = os.getenv('REDIS_HOST') or "127.0.0.1"
REDIS_PORT = int(os.getenv('REDIS_PORT') or 6379)
# mysql 配置
MYSQL_USERNAME = os.getenv('MYSQL_USERNAME') or "root"
MYSQL_PASSWORD = os.getenv('MYSQL_PASSWORD') or "123456"
MYSQL_HOST = os.getenv('MYSQL_HOST') or "127.0.0.1"
MYSQL_PORT = int(os.getenv('MYSQL_PORT') or 3306)
MYSQL_DATABASE = os.getenv('MYSQL_DATABASE') or "PearAdminFlask"
UPLOADED_PHOTOS_DEST = '/static'
# mysql 数据库的配置信息
SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://{MYSQL_USERNAME}:{MYSQL_PASSWORD}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}"
# 默认日志等级
LOG_LEVEL = logging.WARN
class TestingConfig(BaseConfig):
""" 测试配置 """
SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:' # 内存数据库
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__)), 'static', 'upload')
class ProductionConfig(BaseConfig):
"""生成环境配置"""
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = False
SQLALCHEMY_POOL_RECYCLE = 8
LOG_LEVEL = logging.ERROR
config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig
}
@@ -1,11 +0,0 @@
import json
import os
path = os.path.dirname(os.path.abspath(__file__))
cp_dept_data_list = json.loads(open(os.path.join(path, 'cp_dept.json'), encoding='utf-8').read())
cp_user_data_list = json.loads(open(os.path.join(path, 'cp_user.json'), encoding='utf-8').read())
file_photo_data_list = json.loads(open(os.path.join(path, 'file_photo.json'), encoding='utf-8').read())
rt_power_data_list = json.loads(open(os.path.join(path, 'rt_power.json'), encoding='utf-8').read())
rt_role_data_list = json.loads(open(os.path.join(path, 'rt_role.json'), encoding='utf-8').read())
rt_role_power_data_list = json.loads(open(os.path.join(path, 'rt_role_power.json'), encoding='utf-8').read())
rt_user_role_data_list = json.loads(open(os.path.join(path, 'rt_user_role.json'), encoding='utf-8').read())
@@ -1,76 +0,0 @@
from flask import Flask
import re
from datetime import datetime
date_str = re.compile('\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d$')
def add_data(data_list, obj):
from applications.extensions import db
for _data in data_list:
dept = obj()
for key, value in _data.items():
if isinstance(value, str) and date_str.match(value):
value = datetime.strptime(value, "%Y-%m-%d %H:%M:%S")
setattr(dept, key, value)
db.session.add(dept)
db.session.commit()
def register_script(app: Flask):
@app.cli.command()
def init_db():
"""数据库初始化"""
# 创建化部门数据
from applications.models import CompanyDepartment
from applications.configs.init_data import cp_dept_data_list
add_data(cp_dept_data_list, CompanyDepartment)
# 图片数据
from applications.models import FilePhoto
from applications.configs.init_data import file_photo_data_list
add_data(file_photo_data_list, FilePhoto)
# 初始化权限表数据
from applications.models import RightsPower
from applications.configs.init_data import rt_power_data_list
add_data(rt_power_data_list, RightsPower)
# 初始化角色表
from applications.models import RightsRole
from applications.configs.init_data import rt_role_data_list
# 角色权限关系表
from applications.extensions import db
from applications.configs.init_data import rt_role_power_data_list
for data in rt_role_power_data_list:
db.session.execute('insert into rt_role_power VALUES (%s, %s, %s);' % tuple(data))
db.session.commit()
add_data(rt_role_data_list, RightsRole)
# 管理员用户
from applications.models import CompanyUser
from applications.configs.init_data import cp_user_data_list
add_data(cp_user_data_list, CompanyUser)
# 用户角色表
from applications.extensions import db
from applications.configs.init_data import rt_user_role_data_list
for data in rt_user_role_data_list:
db.session.execute('insert into rt_user_role VALUES (%s, %s, %s);' % tuple(data))
db.session.commit()
@app.cli.command()
def turn():
"""清空数据库"""
from applications.extensions import db
db.drop_all()
db.create_all()
-4
View File
@@ -1,4 +0,0 @@
from applications.models.file import FilePhoto
from applications.models.log import LoggingModel
from applications.models.rights import RightsPower, RightsRole, role_power, user_role
from applications.models.users import CompanyDepartment, CompanyUser
-8
View File
@@ -1,8 +0,0 @@
from datetime import datetime
from applications.extensions import db
class BaseModel(object):
create_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')
update_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')
-1
View File
@@ -1 +0,0 @@
from .photo import FilePhoto
-12
View File
@@ -1,12 +0,0 @@
from applications.extensions import db
from ..base import BaseModel
class FilePhoto(db.Model, BaseModel):
__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))
mime = db.Column(db.CHAR(50), nullable=False)
size = db.Column(db.CHAR(30), nullable=False)
-19
View File
@@ -1,19 +0,0 @@
from applications.extensions import db
from .power import RightsPower
from .role import RightsRole
# 创建中间表
user_role = db.Table(
"rt_user_role", # 中间表名称
db.Column("id", db.Integer, primary_key=True, autoincrement=True, 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='角色编号'), # 属性 外键
)
# 创建中间表
role_power = db.Table(
"rt_role_power", # 中间表名称
db.Column("id", db.Integer, primary_key=True, autoincrement=True, 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='角色编号'), # 属性 外键
)
-18
View File
@@ -1,18 +0,0 @@
from applications.extensions import db
from ..base import BaseModel
class RightsPower(db.Model, BaseModel):
__tablename__ = 'rt_power'
id = db.Column(db.Integer, primary_key=True, comment='权限编号')
name = db.Column(db.String(255), 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("rt_power.id"), comment='父类编号')
icon = db.Column(db.String(128), comment='图标')
sort = db.Column(db.Integer, comment='排序')
enable = db.Column(db.Boolean, comment='是否开启')
parent = db.relationship("RightsPower", remote_side=[id]) # 自关联
-17
View File
@@ -1,17 +0,0 @@
from flask_restful import fields
from applications.extensions import db
from ..base import BaseModel
class RightsRole(db.Model, BaseModel):
__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='角色标识')
enable = db.Column(db.Boolean, comment='是否启用')
comment = db.Column(db.String(255), comment='备注')
details = db.Column(db.String(255), comment='详情')
sort = db.Column(db.Integer, comment='排序')
power = db.relationship('RightsPower', secondary="rt_role_power", backref=db.backref('role'))
-2
View File
@@ -1,2 +0,0 @@
from .dept import CompanyDepartment
from .users import CompanyUser
-37
View File
@@ -1,37 +0,0 @@
from flask_restful import fields
from applications.extensions import db
from ..base import BaseModel
class CompanyDepartment(db.Model, BaseModel):
__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="部门名称")
leader = db.Column(db.String(50), comment="负责人")
phone = db.Column(db.String(20), comment="联系方式")
email = db.Column(db.String(50), comment="邮箱")
status = db.Column(db.Boolean, comment='状态(1开启,0关闭)')
comment = db.Column(db.Text, comment="备注")
address = db.Column(db.String(255), comment="详细地址")
sort = db.Column(db.Integer, comment="排序")
@staticmethod
def fields():
"""
定义模型的常用输出字段,新手请忽略。可以简化字段序列化操作,
详细操作请查看 flask-restful marshal 的用法
"""
return {
'deptId': fields.Integer(attribute="id"),
'parentId': fields.Integer(attribute="parent_id"),
'deptName': fields.String(attribute="dept_name"),
'sort': fields.Integer,
'leader': fields.String,
'phone': fields.String,
'email': fields.String,
'status': fields.Boolean,
'comment': fields.String,
'address': fields.String,
'create_at': fields.DateTime
}
+3 -3
View File
@@ -1,7 +1,7 @@
from flask import render_template, request from flask import render_template, request
from applications.common.utils.rights import permission_required, view_logging_required from models import DepartmentModels
from applications.models import CompanyDepartment from common.utils.rights import permission_required, view_logging_required
from applications.view import index_bp from applications.view import index_bp
@@ -24,5 +24,5 @@ def add():
@permission_required("admin:dept:edit") @permission_required("admin:dept:edit")
def edit(): def edit():
dept_id = request.args.get("deptId", type=int) dept_id = request.args.get("deptId", type=int)
dept = CompanyDepartment.query.get(dept_id) dept = DepartmentModels.query.get(dept_id)
return render_template('admin/department/dept_edit.html', dept=dept) return render_template('admin/department/dept_edit.html', dept=dept)
+1 -1
View File
@@ -1,7 +1,7 @@
from flask import render_template from flask import render_template
from applications.view import index_bp from applications.view import index_bp
from applications.common.utils.rights import view_logging_required, permission_required from common.utils.rights import view_logging_required, permission_required
@index_bp.get('/file') @index_bp.get('/file')
+8 -8
View File
@@ -1,9 +1,9 @@
from flask import Blueprint, request, render_template from flask import Blueprint, request, render_template
from sqlalchemy import desc from sqlalchemy import desc
from applications.common.utils.http import table_api from common.utils.http import table_api
from applications.common.utils.rights import permission_required from common.utils.rights import permission_required
from applications.models import LoggingModel from models import LogModel
logs_bp = Blueprint('logs', __name__, url_prefix='/logs') logs_bp = Blueprint('logs', __name__, url_prefix='/logs')
@@ -19,9 +19,9 @@ def index():
def login_log(): def login_log():
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)
log_paginate = LoggingModel.query.filter_by( log_paginate = LogModel.query.filter_by(
url='/api/v1/passport/login').order_by( url='/api/v1/passport/login').order_by(
desc(LoggingModel.create_at)).paginate( desc(LogModel.create_at)).paginate(
page=page, per_page=limit, error_out=False) page=page, per_page=limit, error_out=False)
data = [ data = [
{ {
@@ -47,9 +47,9 @@ def login_log():
def operate_log(): def operate_log():
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)
log_paginate = LoggingModel.query.filter( log_paginate = LogModel.query.filter(
LoggingModel.url != '/api/v1/passport/login').order_by( LogModel.url != '/api/v1/passport/login').order_by(
desc(LoggingModel.create_at)).paginate( desc(LogModel.create_at)).paginate(
page=page, per_page=limit, error_out=False) page=page, per_page=limit, error_out=False)
data = [ data = [
{ {
+3 -3
View File
@@ -1,8 +1,8 @@
from flask import Blueprint, session, redirect, render_template, url_for from flask import session, redirect, render_template, url_for
from flask_login import login_required, logout_user, current_user from flask_login import login_required, logout_user, current_user
from applications.common.gen_captcha import get_captcha_image from common.gen_captcha import get_captcha_image
from applications.common.utils.http import success_api from common.utils.http import success_api
# 获取验证码 # 获取验证码
from applications.view import index_bp from applications.view import index_bp
+3 -3
View File
@@ -1,7 +1,7 @@
from flask import render_template from flask import render_template
from applications.common.utils.rights import permission_required, view_logging_required from common.utils.rights import permission_required, view_logging_required
from applications.models import RightsPower from models import RightModels
from applications.view import index_bp from applications.view import index_bp
@@ -16,7 +16,7 @@ def rights_index():
@view_logging_required @view_logging_required
@permission_required("admin:power:edit") @permission_required("admin:power:edit")
def rights_edit(power_id): def rights_edit(power_id):
power = RightsPower.query.filter_by(id=power_id).first() power = RightModels.query.filter_by(id=power_id).first()
icon = str(power.icon).split() icon = str(power.icon).split()
if len(icon) == 2: if len(icon) == 2:
icon = icon[1] icon = icon[1]
+3 -3
View File
@@ -1,8 +1,8 @@
from flask import Blueprint, render_template from flask import Blueprint, render_template
from applications.common.utils.rights import permission_required, view_logging_required from common.utils.rights import permission_required, view_logging_required
from applications.models import RightsRole from models import RoleModels
role_bp = Blueprint('role', __name__, url_prefix='/admin/role') role_bp = Blueprint('role', __name__, url_prefix='/admin/role')
@@ -28,7 +28,7 @@ def power(role_id):
@view_logging_required @view_logging_required
@permission_required("admin:role:edit") @permission_required("admin:role:edit")
def role_editor(role_id): def role_editor(role_id):
role = RightsRole.query.filter_by(id=role_id).first() role = RoleModels.query.filter_by(id=role_id).first()
return render_template('admin/roles/roles_edit.html', role=role) return render_template('admin/roles/roles_edit.html', role=role)
+7 -7
View File
@@ -2,8 +2,8 @@ from flask import render_template
from flask_login import login_required, current_user from flask_login import login_required, current_user
from sqlalchemy import desc from sqlalchemy import desc
from applications.common.utils.rights import permission_required, view_logging_required from common.utils.rights import permission_required, view_logging_required
from applications.models import LoggingModel, RightsRole, CompanyUser from models import LogModel, RoleModels, UserModels
from . import index_bp from . import index_bp
@@ -19,7 +19,7 @@ def users_main():
@view_logging_required @view_logging_required
@permission_required("admin:user:add") @permission_required("admin:user:add")
def users_add_view(): def users_add_view():
roles = RightsRole.query.all() roles = RoleModels.query.all()
return render_template('admin/users/users_add.html', roles=roles) return render_template('admin/users/users_add.html', roles=roles)
@@ -28,8 +28,8 @@ def users_add_view():
@permission_required("admin:user:edit") @permission_required("admin:user:edit")
def users_user_id_view(user_id): def users_user_id_view(user_id):
# 获取编辑用户信息 # 获取编辑用户信息
user = CompanyUser.query.filter_by(id=user_id).first() user = UserModels.query.filter_by(id=user_id).first()
roles = RightsRole.query.all() roles = RoleModels.query.all()
checked_roles = [] checked_roles = []
for r in user.role: for r in user.role:
checked_roles.append(r.id) checked_roles.append(r.id)
@@ -39,8 +39,8 @@ def users_user_id_view(user_id):
@index_bp.get('/users/center') @index_bp.get('/users/center')
@login_required @login_required
def users_center(): def users_center():
user_logs = LoggingModel.query.filter_by(url='/passport/login').filter_by(uid=current_user.id).order_by( user_logs = LogModel.query.filter_by(url='/passport/login').filter_by(uid=current_user.id).order_by(
desc(LoggingModel.create_at)).limit(10) desc(LogModel.create_at)).limit(10)
return render_template('admin/users/profile.html', user_info=current_user, user_logs=user_logs) return render_template('admin/users/profile.html', user_info=current_user, user_logs=user_logs)
@@ -5,8 +5,8 @@ from flask import abort, request, jsonify, session
from flask_login import login_required from flask_login import login_required
from flask_login import current_user from flask_login import current_user
from applications.extensions import db from extensions import db
from applications.models import LoggingModel from models import LogModel
def record_logging(success: bool = True) -> None: def record_logging(success: bool = True) -> None:
@@ -22,7 +22,7 @@ def record_logging(success: bool = True) -> None:
'uid': current_user.id, 'uid': current_user.id,
'success': success 'success': success
} }
log = LoggingModel() log = LogModel()
for key, value in info.items(): for key, value in info.items():
setattr(log, key, value) setattr(log, key, value)
@@ -2,9 +2,9 @@ import os
from flask import current_app from flask import current_app
from applications.common.flask_uploads import UploadSet, IMAGES from common.flask_uploads import UploadSet, IMAGES
from applications.extensions import db from extensions import db
from applications.models import FilePhoto from models import PhotoModels
photos = UploadSet('photos', IMAGES) photos = UploadSet('photos', IMAGES)
@@ -15,15 +15,15 @@ def upload_one(photo, mime):
upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST") upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST")
size = os.path.getsize(upload_url + '/' + filename) size = os.path.getsize(upload_url + '/' + filename)
photo = FilePhoto(name=filename, href=file_url, mime=mime, size=size) photo = PhotoModels(name=filename, href=file_url, mime=mime, size=size)
db.session.add(photo) db.session.add(photo)
db.session.commit() db.session.commit()
return file_url return file_url
def delete_photo_by_id(_id): def delete_photo_by_id(_id):
photo_name = FilePhoto.query.filter_by(id=_id).first().name photo_name = PhotoModels.query.filter_by(id=_id).first().name
photo = FilePhoto.query.filter_by(id=_id).delete() photo = PhotoModels.query.filter_by(id=_id).delete()
db.session.commit() db.session.commit()
upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST") upload_url = current_app.config.get("UPLOADED_PHOTOS_DEST")
os.remove(upload_url + '/' + photo_name) os.remove(upload_url + '/' + photo_name)
+51
View File
@@ -0,0 +1,51 @@
import logging
import os
# 主题面板的链接列表配置
SYSTEM_NAME = "Pear Admin"
SYSTEM_PANEL_LINKS = [
{
"icon": "layui-icon layui-icon-auz",
"title": "官方网站",
"href": "http://www.pearadmin.com"
},
{
"icon": "layui-icon layui-icon-auz",
"title": "开发文档",
"href": "http://www.pearadmin.com"
},
{
"icon": "layui-icon layui-icon-auz",
"title": "开源地址",
"href": "https://gitee.com/Jmysy/Pear-Admin-Layui"
}
]
SECRET_KEY = os.getenv('SECRET_KEY', 'dev key')
# mysql 配置
MYSQL_USERNAME = "root"
MYSQL_PASSWORD = "123456"
MYSQL_HOST = "127.0.0.1"
MYSQL_PORT = 3306
MYSQL_DATABASE = "PearAdminFlask"
# redis 配置
REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
""" Sqlalchemy 配置 """
SQLALCHEMY_DATABASE_URI = r'sqlite:///pear_admin.db'
SQLALCHEMY_TRACK_MODIFICATIONS = True
SQLALCHEMY_ECHO = False
SQLALCHEMY_POOL_RECYCLE = 8
# SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://{MYSQL_USERNAME}:{MYSQL_PASSWORD}@\
# {MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}"
LOG_LEVEL = logging.ERROR
# 图片文件存放位置
UPLOADED_PHOTOS_DEST = os.path.join(os.path.dirname(os.path.abspath(__name__)), 'static', 'upload')
UPLOADED_FILES_ALLOW = ['gif', 'jpg']
# JSON配置
JSON_AS_ASCII = False
+82
View File
@@ -0,0 +1,82 @@
from flask import Flask
import re
from datetime import datetime
date_str = re.compile('\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d$')
def add_data(data_list, obj):
from extensions import db
for _data in data_list:
dept = obj()
for key, value in _data.items():
if isinstance(value, str) and date_str.match(value):
value = datetime.strptime(value, "%Y-%m-%d %H:%M:%S")
setattr(dept, key, value)
db.session.add(dept)
db.session.commit()
def register_script(app: Flask):
@app.cli.command()
def init_db():
import json
import os
path = os.path.dirname(os.path.abspath(__name__))
path = os.path.join(path, 'static', 'data')
cp_dept_data_list = json.loads(open(os.path.join(path, 'cp_dept.json'), encoding='utf-8').read())
cp_user_data_list = json.loads(open(os.path.join(path, 'cp_user.json'), encoding='utf-8').read())
file_photo_data_list = json.loads(open(os.path.join(path, 'file_photo.json'), encoding='utf-8').read())
rt_power_data_list = json.loads(open(os.path.join(path, 'rt_power.json'), encoding='utf-8').read())
rt_role_data_list = json.loads(open(os.path.join(path, 'rt_role.json'), encoding='utf-8').read())
rt_role_power_data_list = json.loads(open(os.path.join(path, 'rt_role_power.json'), encoding='utf-8').read())
rt_user_role_data_list = json.loads(open(os.path.join(path, 'rt_user_role.json'), encoding='utf-8').read())
"""数据库初始化"""
# 创建化部门数据
from models import DepartmentModels
add_data(cp_dept_data_list, DepartmentModels)
# 图片数据
from models import PhotoModels
add_data(file_photo_data_list, PhotoModels)
# 初始化权限表数据
from models import RightModels
add_data(rt_power_data_list, RightModels)
# 初始化角色表
from models import RoleModels
# 角色权限关系表
from extensions import db
for data in rt_role_power_data_list:
db.session.execute('insert into rt_role_power VALUES (%s, %s, %s);' % tuple(data))
db.session.commit()
add_data(rt_role_data_list, RoleModels)
# 管理员用户
from models import UserModels
add_data(cp_user_data_list, UserModels)
# 用户角色表
from extensions import db
for data in rt_user_role_data_list:
db.session.execute('insert into rt_user_role VALUES (%s, %s, %s);' % tuple(data))
db.session.commit()
@app.cli.command()
def turn():
"""清空数据库"""
from extensions import db
db.drop_all()
db.create_all()
@@ -10,6 +10,6 @@ def init_login_manager(app):
@login_manager.user_loader @login_manager.user_loader
def load_user(user_id): def load_user(user_id):
from applications.models import CompanyUser from models import UserModels
user = CompanyUser.query.get(int(user_id)) user = UserModels.query.get(int(user_id))
return user return user
+4
View File
@@ -0,0 +1,4 @@
from .file import PhotoModels
from .rights import RightModels, RoleModels
from .system import LogModel
from .users import UserModels, DepartmentModels
+15
View File
@@ -0,0 +1,15 @@
from datetime import datetime
from extensions import db
class PhotoModels(db.Model):
__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))
mime = db.Column(db.CHAR(50), nullable=False)
size = db.Column(db.CHAR(30), nullable=False)
create_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')
update_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')
+46
View File
@@ -0,0 +1,46 @@
from extensions import db
# 创建中间表
user_role = db.Table(
"rt_user_role", # 中间表名称
db.Column("id", db.Integer, primary_key=True, autoincrement=True, 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='角色编号'), # 属性 外键
)
# 创建中间表
role_power = db.Table(
"rt_role_power", # 中间表名称
db.Column("id", db.Integer, primary_key=True, autoincrement=True, 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='角色编号'), # 属性 外键
)
class RightModels(db.Model):
__tablename__ = 'rt_power'
id = db.Column(db.Integer, primary_key=True, comment='权限编号')
name = db.Column(db.String(255), 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("rt_power.id"), comment='父类编号')
icon = db.Column(db.String(128), comment='图标')
sort = db.Column(db.Integer, comment='排序')
enable = db.Column(db.Boolean, comment='是否开启')
parent = db.relationship("RightModels", remote_side=[id]) # 自关联
class RoleModels(db.Model):
__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='角色标识')
enable = db.Column(db.Boolean, comment='是否启用')
comment = db.Column(db.String(255), comment='备注')
details = db.Column(db.String(255), comment='详情')
sort = db.Column(db.Integer, comment='排序')
power = db.relationship('RightModels', secondary="rt_role_power", backref=db.backref('role'))
@@ -1,10 +1,9 @@
from flask_restful import fields from datetime import datetime
from applications.extensions import db from extensions import db
from .base import BaseModel
class LoggingModel(db.Model, BaseModel): class LogModel(db.Model):
__tablename__ = 'lg_logging' __tablename__ = 'lg_logging'
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
method = db.Column(db.String(10)) method = db.Column(db.String(10))
@@ -14,3 +13,6 @@ class LoggingModel(db.Model, BaseModel):
ip = db.Column(db.String(255)) ip = db.Column(db.String(255))
success = db.Column(db.Boolean, default=True) success = db.Column(db.Boolean, default=True)
user_agent = db.Column(db.Text) user_agent = db.Column(db.Text)
create_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')
update_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')
@@ -1,12 +1,12 @@
from datetime import datetime
from flask_login import UserMixin 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 flask_restful import fields
from applications.extensions import db from extensions import db
from ..base import BaseModel
class CompanyUser(db.Model, UserMixin, BaseModel): class UserModels(db.Model, UserMixin):
__tablename__ = 'cp_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='用户名')
@@ -18,7 +18,7 @@ class CompanyUser(db.Model, UserMixin, BaseModel):
enable = db.Column(db.Integer, default=0, comment='启用') enable = db.Column(db.Integer, default=0, comment='启用')
dept_id = db.Column(db.Integer, comment='部门id') dept_id = db.Column(db.Integer, comment='部门id')
role = db.relationship('RightsRole', secondary="rt_user_role", backref=db.backref('user'), lazy='dynamic') role = db.relationship('RoleModels', secondary="rt_user_role", backref=db.backref('user'), lazy='dynamic')
def set_password(self, password): def set_password(self, password):
"""设置密码,对密码进行加密存储""" """设置密码,对密码进行加密存储"""
@@ -27,3 +27,22 @@ class CompanyUser(db.Model, UserMixin, BaseModel):
def validate_password(self, password): def validate_password(self, password):
"""校验密码方法""" """校验密码方法"""
return check_password_hash(self.password_hash, password) return check_password_hash(self.password_hash, password)
create_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')
update_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')
class DepartmentModels(db.Model):
__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="部门名称")
leader = db.Column(db.String(50), comment="负责人")
phone = db.Column(db.String(20), comment="联系方式")
email = db.Column(db.String(50), comment="邮箱")
status = db.Column(db.Boolean, comment='状态(1开启,0关闭)')
comment = db.Column(db.Text, comment="备注")
address = db.Column(db.String(255), comment="详细地址")
sort = db.Column(db.Integer, comment="排序")
create_at = db.Column(db.DateTime, default=datetime.now, comment='创建时间')
@@ -23,3 +23,4 @@ pytz==2021.1
six==1.16.0 six==1.16.0
SQLAlchemy==1.4.18 SQLAlchemy==1.4.18
Werkzeug==2.0.1 Werkzeug==2.0.1
gunicorn==20.1.0
-2
View File
@@ -1,2 +0,0 @@
gunicorn==20.1.0
-r requirement-dev.txt
+1 -1
View File
@@ -83,7 +83,7 @@
field: 'enable', title: '是否可用', templet: (d) => { field: 'enable', title: '是否可用', templet: (d) => {
// TODO 修改禁用启动逻辑 // TODO 修改禁用启动逻辑
return `<input type="checkbox" name="enable" value="${d.powerId}" lay-skin="switch" lay-text="启用|禁用" lay-filter="tool-switch" ${d.enable === return `<input type="checkbox" name="enable" value="${d.powerId}" lay-skin="switch" lay-text="启用|禁用" lay-filter="tool-switch" ${d.enable ===
1 ? 'checked=checked' : ''}>` true ? 'checked=checked' : ''}>`
}, },
}, },
{ field: 'sort', title: '排序' }, { field: 'sort', title: '排序' },