前后端全面升级

This commit is contained in:
pycook
2023-07-10 17:42:15 +08:00
parent c444fed436
commit db5ff60aff
629 changed files with 97789 additions and 23995 deletions

View File

@@ -0,0 +1,43 @@
# -*- coding:utf-8 -*-
from flask import abort
from flask import request
from api.lib.common_setting.company_info import CompanyInfoCRUD
from api.lib.common_setting.resp_format import ErrFormat
from api.resource import APIView
prefix = '/company'
class CompanyInfoView(APIView):
url_prefix = (f'{prefix}/info',)
def get(self):
return self.jsonify(CompanyInfoCRUD.get())
def post(self):
info = CompanyInfoCRUD.get()
if info:
abort(400, ErrFormat.company_info_is_already_existed)
data = {
'info': {
**request.values
}
}
d = CompanyInfoCRUD.create(**data)
res = d.to_dict()
return self.jsonify(res)
class CompanyInfoViewWithId(APIView):
url_prefix = (f'{prefix}/info/<int:_id>',)
def put(self, _id):
data = {
'info': {
**request.values
}
}
d = CompanyInfoCRUD.update(_id, **data)
res = d.to_dict()
return self.jsonify(res)

View File

@@ -0,0 +1,111 @@
# -*- coding:utf-8 -*-
from flask import abort
from flask import request
from werkzeug.datastructures import MultiDict
from api.lib.common_setting.department import DepartmentCRUD
from api.lib.common_setting.department import DepartmentTree, DepartmentForm
from api.lib.common_setting.employee import EmployeeCRUD
from api.lib.common_setting.resp_format import ErrFormat
from api.resource import APIView
prefix = '/department'
class DepartmentAllView(APIView):
url_prefix = (f'{prefix}/all',)
def get(self):
is_tree = int(request.args.get('is_tree', 1))
res = DepartmentTree().get_all_departments(is_tree)
return self.jsonify(res)
class DepartmentAllViewWithEmployee(APIView):
url_prefix = (f'{prefix}/all_with_employee',)
def get(self):
block = int(request.args.get('block', -1))
try:
res = DepartmentCRUD.get_all_departments_with_employee(block)
return self.jsonify(res)
except Exception as e:
abort(500, str(e))
class DepartmentView(APIView):
url_prefix = (f'{prefix}',)
def get(self):
department_parent_id = request.args.get('department_parent_id', 0)
block = int(request.args.get('block', 0))
departments, department_id_list = DepartmentCRUD.get_departments_and_ids(
department_parent_id, block)
employees = EmployeeCRUD.get_employees_by_department_id(
department_parent_id, block)
return self.jsonify(departments=departments, employees=employees)
def post(self):
form = DepartmentForm(MultiDict(request.json))
if not form.validate():
abort(400, ','.join(['{}: {}'.format(filed, ','.join(msg))
for filed, msg in form.errors.items()]))
data = DepartmentCRUD.add(**form.data)
return self.jsonify(data.to_dict())
class DepartmentIDView(APIView):
url_prefix = (f'{prefix}/<int:_id>',)
def get(self, _id):
form = DepartmentForm(MultiDict(request.json))
if not form.validate():
abort(400, ','.join(['{}: {}'.format(filed, ','.join(msg))
for filed, msg in form.errors.items()]))
department_parent_id = form.data.get('department_parent_id')
if int(_id) == int(department_parent_id):
abort(400, ErrFormat.parent_department_is_not_self)
data = DepartmentCRUD.edit(_id, **form.data)
return self.jsonify(data.to_dict())
def delete(self, _id):
if _id in [-1, 0]:
abort(400, ErrFormat.delete_reserved_department_name)
DepartmentCRUD.delete(_id)
return self.jsonify(status='success')
class DepartmentParentView(APIView):
url_prefix = (f'{prefix}/allow_parent',)
def get(self):
department_id = request.args.get('department_id', None)
if department_id is None:
abort(400, ErrFormat.department_id_is_required)
p_department_list = DepartmentCRUD.get_allow_parent_d_id_by(
int(department_id))
return self.jsonify(p_department_list)
class DepartmentSortView(APIView):
url_prefix = (f'{prefix}/update_sort',)
def put(self):
"""
修改部门排序,只能在同一个上级内排序
"""
department_list = request.json.get('department_list', None)
if department_list is None:
abort(400, ErrFormat.department_list_is_required)
result = DepartmentCRUD.update_department_sort(department_list)
return self.jsonify(result)

View File

@@ -0,0 +1,187 @@
# -*- coding:utf-8 -*-
import os
from flask import abort, current_app, send_from_directory
from flask import request
from werkzeug.datastructures import MultiDict
from api.lib.common_setting.employee import EmployeeCRUD, EmployeeAddForm, EmployeeUpdateByUidForm
from api.lib.common_setting.resp_format import ErrFormat
from api.resource import APIView
prefix = '/employee'
class EmployeeView(APIView):
url_prefix = (f'{prefix}',)
def get(self):
department_id = int(request.args.get('department_id', 0))
page = int(request.args.get('page', 1))
page_size = int(request.args.get('page_size', 10))
search = request.args.get('search', '')
order = request.args.get('order', '')
block_status = int(request.args.get('block_status', -1))
employee_list = EmployeeCRUD.get_employee_list_by(
department_id, block_status, search, order, page, page_size)
return self.jsonify(employee_list)
def post(self):
form = EmployeeAddForm(MultiDict(request.json))
if not form.validate():
abort(400, ','.join(['{}: {}'.format(filed, ','.join(msg))
for filed, msg in form.errors.items()]))
data = EmployeeCRUD.add(**form.data)
return self.jsonify(data.to_dict())
class EmployeeFilterView(APIView):
url_prefix = (f'{prefix}/filter',)
def post(self):
params = request.json
department_id = int(params.get('department_id', 0))
page = int(params.get('page', 1))
page_size = int(params.get('page_size', 10))
search = params.get('search', '')
order = params.get('order', '')
block_status = int(params.get('block_status', -1))
conditions = list(params.get("conditions", []))
employee_list = EmployeeCRUD.get_employee_list_by_body(department_id, block_status, search, order, conditions,
page, page_size)
return self.jsonify(employee_list)
class EmployeeViewWithId(APIView):
url_prefix = (f'{prefix}/<int:_id>',)
def get(self, _id):
data = EmployeeCRUD.get_employee_by_id(_id)
return self.jsonify(data.to_dict())
def put(self, _id):
params = request.json
direct_supervisor_id = params.get('direct_supervisor_id', None)
if direct_supervisor_id and int(_id) == int(direct_supervisor_id):
abort(400, ErrFormat.direct_supervisor_is_not_self)
data = EmployeeCRUD.update(_id, **params)
return self.jsonify(data.to_dict())
class EmployeeCountView(APIView):
url_prefix = (f'{prefix}/count',)
def get(self):
block_status = int(request.args.get('block_status', -1))
employee_count = EmployeeCRUD.get_employee_count(block_status)
return self.jsonify(employee_count=employee_count)
class EmployeeImportView(APIView):
url_prefix = (f'{prefix}/import',)
def post(self):
employee_list = request.json.get('employee_list', [])
if not employee_list:
abort(400, ErrFormat.employee_list_is_empty)
result = EmployeeCRUD.import_employee(employee_list)
return self.jsonify(result)
class EmployeeBatchView(APIView):
url_prefix = (f'{prefix}/batch',)
def post(self):
params = request.json
column_name = params.get('column_name', None)
employee_id_list = params.get('employee_id_list', None)
column_value = params.get('column_value', None)
if column_name not in ['department_id', 'direct_supervisor_id', 'position_name', 'password', 'block']:
abort(400, ErrFormat.column_name_not_support)
result = EmployeeCRUD.batch_employee(
column_name, column_value, employee_id_list)
return self.jsonify(result)
class EmployeeViewWithACLID(APIView):
url_prefix = (f'{prefix}/by_uid/<int:_uid>',)
def get(self, _uid):
result = EmployeeCRUD.get_employee_by_uid_with_create(_uid)
return self.jsonify(result)
def put(self, _uid):
form = EmployeeUpdateByUidForm(MultiDict(request.json))
if not form.validate():
abort(400, ','.join(['{}: {}'.format(filed, ','.join(msg))
for filed, msg in form.errors.items()]))
data = EmployeeCRUD.edit_employee_by_uid(_uid, **form.data)
return self.jsonify(data.to_dict())
class EmployeeChangePasswordWithACLID(APIView):
url_prefix = (f'{prefix}/by_uid/change_password/<int:_uid>',)
def put(self, _uid):
password = request.json.get('password', None)
if not password:
abort(400, ErrFormat.password_is_required)
data = EmployeeCRUD.change_password_by_uid(_uid, password)
return self.jsonify(200)
class EmployeePositionView(APIView):
url_prefix = (f'{prefix}/position',)
def get(self):
""""""
result = EmployeeCRUD.get_all_position()
return self.jsonify(result)
class EmployeeViewExportExcel(APIView):
url_prefix = (f'{prefix}/export_all',)
def get(self):
col_desc_map = {
'nickname': "姓名",
'email': '邮箱',
'sex': '性别',
'mobile': '手机号',
'department_name': '部门',
'position_name': '岗位',
'nickname_direct_supervisor': '直接上级',
'last_login': '上次登录时间',
}
# 规定了静态文件的存储位置
excel_filename = 'all_employee_info.xlsx'
excel_path = current_app.config['UPLOAD_DIRECTORY_FULL']
excel_path_with_filename = os.path.join(excel_path, excel_filename)
# 根据parameter查表自连接通过上级id获取上级名字列
block_status = int(request.args.get('block_status', -1))
df = EmployeeCRUD.get_export_employee_df(block_status)
# 改变列名为中文head
try:
df = df.rename(columns=col_desc_map)
except Exception as e:
abort(500, ErrFormat.rename_columns_failed.format(str(e)))
# 生成静态excel文件
try:
df.to_excel(excel_path_with_filename,
sheet_name='Sheet1', index=False, encoding="utf-8")
except Exception as e:
current_app.logger.error(e)
abort(500, ErrFormat.generate_excel_failed.format(str(e)))
return send_from_directory(excel_path, excel_filename, as_attachment=True)

View File

@@ -0,0 +1,63 @@
# -*- coding:utf-8 -*-
import os
from flask import request, abort, current_app, send_from_directory
from werkzeug.utils import secure_filename
from api.lib.common_setting.resp_format import ErrFormat
from api.lib.common_setting.upload_file import allowed_file, generate_new_file_name
from api.resource import APIView
prefix = '/file'
ALLOWED_EXTENSIONS = {
'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'xls', 'xlsx', 'doc', 'docx', 'ppt', 'pptx', 'csv'
}
class FileExtensionAllowView(APIView):
url_prefix = (f'{prefix}/allow_extensions',)
def get(self):
extensions = current_app.config.get('ALLOWED_EXTENSIONS', ALLOWED_EXTENSIONS)
extensions = list(extensions)
return self.jsonify(extensions)
class GetFileView(APIView):
url_prefix = (f'{prefix}/<string:_filename>',)
def get(self, _filename):
return send_from_directory(current_app.config['UPLOAD_DIRECTORY_FULL'], _filename, as_attachment=True)
class PostFileView(APIView):
url_prefix = (f'{prefix}',)
def post(self):
# check if the post request has the file part
if 'file' not in request.files:
abort(400, ErrFormat.no_file_part)
file = request.files['file']
if not file:
abort(400, ErrFormat.file_is_required)
extension = file.mimetype.split('/')[-1]
if file.filename == '':
filename = f'.{extension}'
else:
if extension not in file.filename:
filename = file.filename + f".{extension}"
else:
filename = file.filename
if allowed_file(filename, current_app.config.get('ALLOWED_EXTENSIONS', ALLOWED_EXTENSIONS)):
filename = generate_new_file_name(filename)
filename = secure_filename(filename)
file.save(os.path.join(
current_app.config['UPLOAD_DIRECTORY_FULL'], filename))
return self.jsonify(file_name=filename)
abort(400, 'Extension not allow')