refactor(重构程序&目录结构)
This commit is contained in:
@@ -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'
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
from applications import create_app
|
||||||
|
|
||||||
|
app = create_app()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run()
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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="删除成功")
|
||||||
|
|||||||
@@ -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="不存在的用户")
|
||||||
|
|||||||
@@ -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="旧密码错误")
|
||||||
|
|||||||
@@ -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 +0,0 @@
|
|||||||
from .config import config
|
|
||||||
@@ -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
|
|
||||||
@@ -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()
|
|
||||||
@@ -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
|
|
||||||
@@ -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 +0,0 @@
|
|||||||
from .photo import FilePhoto
|
|
||||||
@@ -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)
|
|
||||||
@@ -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='角色编号'), # 属性 外键
|
|
||||||
)
|
|
||||||
@@ -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]) # 自关联
|
|
||||||
@@ -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'))
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
from .dept import CompanyDepartment
|
|
||||||
from .users import CompanyUser
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -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,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')
|
||||||
|
|||||||
@@ -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 = [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
from .file import PhotoModels
|
||||||
|
from .rights import RightModels, RoleModels
|
||||||
|
from .system import LogModel
|
||||||
|
from .users import UserModels, DepartmentModels
|
||||||
@@ -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='更新时间')
|
||||||
@@ -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
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
gunicorn==20.1.0
|
|
||||||
-r requirement-dev.txt
|
|
||||||
@@ -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: '排序' },
|
||||||
|
|||||||
Reference in New Issue
Block a user