Compare commits
13 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c415dfa8e1 | ||
![]() |
5765e967ae | ||
![]() |
1ba4d959ce | ||
![]() |
df8ab6bc55 | ||
![]() |
ca6668331f | ||
![]() |
d49d05b776 | ||
![]() |
d8e3f7dca1 | ||
![]() |
5ee1a64587 | ||
![]() |
9a31c21943 | ||
![]() |
e52f0f42cb | ||
![]() |
1f51525dfa | ||
![]() |
a1c77829cd | ||
![]() |
07771c180d |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -18,6 +18,7 @@ lib64/
|
|||||||
parts/
|
parts/
|
||||||
sdist/
|
sdist/
|
||||||
var/
|
var/
|
||||||
|
vf_admin/
|
||||||
wheels/
|
wheels/
|
||||||
share/python-wheels/
|
share/python-wheels/
|
||||||
*.egg-info/
|
*.egg-info/
|
||||||
|
11
README.md
11
README.md
@@ -1,22 +1,17 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-d3d0a9303e11d522a06cd263f3079027715.png">
|
<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-d3d0a9303e11d522a06cd263f3079027715.png">
|
||||||
</p>
|
</p>
|
||||||
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi-Vue3-FastAPI v1.3.0</h1>
|
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi-Vue3-FastAPI v1.3.2</h1>
|
||||||
<h4 align="center">基于RuoYi-Vue3+FastAPI前后端分离的快速开发框架</h4>
|
<h4 align="center">基于RuoYi-Vue3+FastAPI前后端分离的快速开发框架</h4>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI/stargazers"><img src="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI/badge/star.svg?theme=dark"></a>
|
<a href="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI/stargazers"><img src="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI/badge/star.svg?theme=dark"></a>
|
||||||
<a href="https://github.com/insistence/RuoYi-Vue3-FastAPI"><img src="https://img.shields.io/github/stars/insistence/RuoYi-Vue3-FastAPI?style=social"></a>
|
<a href="https://github.com/insistence/RuoYi-Vue3-FastAPI"><img src="https://img.shields.io/github/stars/insistence/RuoYi-Vue3-FastAPI?style=social"></a>
|
||||||
<a href="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI"><img src="https://img.shields.io/badge/RuoYiVue3FastAPI-v1.3.0-brightgreen.svg"></a>
|
<a href="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI"><img src="https://img.shields.io/badge/RuoYiVue3FastAPI-v1.3.2-brightgreen.svg"></a>
|
||||||
<a href="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
|
<a href="https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
|
||||||
<img src="https://img.shields.io/badge/python-≥3.8-blue">
|
<img src="https://img.shields.io/badge/python-≥3.9-blue">
|
||||||
<img src="https://img.shields.io/badge/MySQL-≥5.7-blue">
|
<img src="https://img.shields.io/badge/MySQL-≥5.7-blue">
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 平台简介
|
## 平台简介
|
||||||
|
|
||||||
RuoYi-Vue3-FastAPI是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
|
RuoYi-Vue3-FastAPI是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
|
||||||
|
@@ -10,7 +10,7 @@ APP_HOST = '0.0.0.0'
|
|||||||
# 应用端口
|
# 应用端口
|
||||||
APP_PORT = 9099
|
APP_PORT = 9099
|
||||||
# 应用版本
|
# 应用版本
|
||||||
APP_VERSION= '1.3.0'
|
APP_VERSION= '1.3.2'
|
||||||
# 应用是否开启热重载
|
# 应用是否开启热重载
|
||||||
APP_RELOAD = true
|
APP_RELOAD = true
|
||||||
# 应用是否开启IP归属区域查询
|
# 应用是否开启IP归属区域查询
|
||||||
|
@@ -10,7 +10,7 @@ APP_HOST = '0.0.0.0'
|
|||||||
# 应用端口
|
# 应用端口
|
||||||
APP_PORT = 9099
|
APP_PORT = 9099
|
||||||
# 应用版本
|
# 应用版本
|
||||||
APP_VERSION= '1.3.0'
|
APP_VERSION= '1.3.2'
|
||||||
# 应用是否开启热重载
|
# 应用是否开启热重载
|
||||||
APP_RELOAD = false
|
APP_RELOAD = false
|
||||||
# 应用是否开启IP归属区域查询
|
# 应用是否开启IP归属区域查询
|
||||||
|
@@ -76,7 +76,7 @@ class JobConstant:
|
|||||||
"""
|
"""
|
||||||
定时任务常量
|
定时任务常量
|
||||||
|
|
||||||
JOB_ERROR_LIST: 定时任务禁止调用模块列表
|
JOB_ERROR_LIST: 定时任务禁止调用模块及违规字符串列表
|
||||||
JOB_WHITE_LIST: 定时任务允许调用模块列表
|
JOB_WHITE_LIST: 定时任务允许调用模块列表
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -84,11 +84,46 @@ class JobConstant:
|
|||||||
'app',
|
'app',
|
||||||
'config',
|
'config',
|
||||||
'exceptions',
|
'exceptions',
|
||||||
|
'import ',
|
||||||
'middlewares',
|
'middlewares',
|
||||||
'module_admin',
|
'module_admin',
|
||||||
|
'open(',
|
||||||
|
'os.',
|
||||||
'server',
|
'server',
|
||||||
'sub_applications',
|
'sub_applications',
|
||||||
|
'subprocess.',
|
||||||
|
'sys.',
|
||||||
'utils',
|
'utils',
|
||||||
|
'while ',
|
||||||
|
'__import__',
|
||||||
|
'"',
|
||||||
|
"'",
|
||||||
|
',',
|
||||||
|
'?',
|
||||||
|
':',
|
||||||
|
';',
|
||||||
|
'/',
|
||||||
|
'|',
|
||||||
|
'+',
|
||||||
|
'-',
|
||||||
|
'=',
|
||||||
|
'~',
|
||||||
|
'!',
|
||||||
|
'#',
|
||||||
|
'$',
|
||||||
|
'%',
|
||||||
|
'^',
|
||||||
|
'&',
|
||||||
|
'*',
|
||||||
|
'<',
|
||||||
|
'>',
|
||||||
|
'(',
|
||||||
|
')',
|
||||||
|
'[',
|
||||||
|
']',
|
||||||
|
'{',
|
||||||
|
'}',
|
||||||
|
' ',
|
||||||
]
|
]
|
||||||
JOB_WHITE_LIST = ['module_task']
|
JOB_WHITE_LIST = ['module_task']
|
||||||
|
|
||||||
|
@@ -221,39 +221,40 @@ class SchedulerUtil:
|
|||||||
if event_type == 'JobExecutionEvent' and event.exception:
|
if event_type == 'JobExecutionEvent' and event.exception:
|
||||||
exception_info = str(event.exception)
|
exception_info = str(event.exception)
|
||||||
status = '1'
|
status = '1'
|
||||||
job_id = event.job_id
|
if hasattr(event, 'job_id'):
|
||||||
query_job = cls.get_scheduler_job(job_id=job_id)
|
job_id = event.job_id
|
||||||
if query_job:
|
query_job = cls.get_scheduler_job(job_id=job_id)
|
||||||
query_job_info = query_job.__getstate__()
|
if query_job:
|
||||||
# 获取任务名称
|
query_job_info = query_job.__getstate__()
|
||||||
job_name = query_job_info.get('name')
|
# 获取任务名称
|
||||||
# 获取任务组名
|
job_name = query_job_info.get('name')
|
||||||
job_group = query_job._jobstore_alias
|
# 获取任务组名
|
||||||
# 获取任务执行器
|
job_group = query_job._jobstore_alias
|
||||||
job_executor = query_job_info.get('executor')
|
# 获取任务执行器
|
||||||
# 获取调用目标字符串
|
job_executor = query_job_info.get('executor')
|
||||||
invoke_target = query_job_info.get('func')
|
# 获取调用目标字符串
|
||||||
# 获取调用函数位置参数
|
invoke_target = query_job_info.get('func')
|
||||||
job_args = ','.join(query_job_info.get('args'))
|
# 获取调用函数位置参数
|
||||||
# 获取调用函数关键字参数
|
job_args = ','.join(query_job_info.get('args'))
|
||||||
job_kwargs = json.dumps(query_job_info.get('kwargs'))
|
# 获取调用函数关键字参数
|
||||||
# 获取任务触发器
|
job_kwargs = json.dumps(query_job_info.get('kwargs'))
|
||||||
job_trigger = str(query_job_info.get('trigger'))
|
# 获取任务触发器
|
||||||
# 构造日志消息
|
job_trigger = str(query_job_info.get('trigger'))
|
||||||
job_message = f"事件类型: {event_type}, 任务ID: {job_id}, 任务名称: {job_name}, 执行于{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
|
# 构造日志消息
|
||||||
job_log = JobLogModel(
|
job_message = f"事件类型: {event_type}, 任务ID: {job_id}, 任务名称: {job_name}, 执行于{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
|
||||||
jobName=job_name,
|
job_log = JobLogModel(
|
||||||
jobGroup=job_group,
|
jobName=job_name,
|
||||||
jobExecutor=job_executor,
|
jobGroup=job_group,
|
||||||
invokeTarget=invoke_target,
|
jobExecutor=job_executor,
|
||||||
jobArgs=job_args,
|
invokeTarget=invoke_target,
|
||||||
jobKwargs=job_kwargs,
|
jobArgs=job_args,
|
||||||
jobTrigger=job_trigger,
|
jobKwargs=job_kwargs,
|
||||||
jobMessage=job_message,
|
jobTrigger=job_trigger,
|
||||||
status=status,
|
jobMessage=job_message,
|
||||||
exceptionInfo=exception_info,
|
status=status,
|
||||||
createTime=datetime.now(),
|
exceptionInfo=exception_info,
|
||||||
)
|
createTime=datetime.now(),
|
||||||
session = SessionLocal()
|
)
|
||||||
JobLogService.add_job_log_services(session, job_log)
|
session = SessionLocal()
|
||||||
session.close()
|
JobLogService.add_job_log_services(session, job_log)
|
||||||
|
session.close()
|
||||||
|
@@ -3,6 +3,12 @@ from fastapi.middleware.cors import CORSMiddleware
|
|||||||
|
|
||||||
|
|
||||||
def add_cors_middleware(app: FastAPI):
|
def add_cors_middleware(app: FastAPI):
|
||||||
|
"""
|
||||||
|
添加跨域中间件
|
||||||
|
|
||||||
|
:param app: FastAPI对象
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
# 前端页面url
|
# 前端页面url
|
||||||
origins = [
|
origins = [
|
||||||
'http://localhost:80',
|
'http://localhost:80',
|
||||||
|
12
ruoyi-fastapi-backend/middlewares/gzip_middleware.py
Normal file
12
ruoyi-fastapi-backend/middlewares/gzip_middleware.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
from fastapi import FastAPI
|
||||||
|
from starlette.middleware.gzip import GZipMiddleware
|
||||||
|
|
||||||
|
|
||||||
|
def add_gzip_middleware(app: FastAPI):
|
||||||
|
"""
|
||||||
|
添加gzip压缩中间件
|
||||||
|
|
||||||
|
:param app: FastAPI对象
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
app.add_middleware(GZipMiddleware, minimum_size=1000, compresslevel=9)
|
@@ -1,5 +1,6 @@
|
|||||||
from fastapi import FastAPI
|
from fastapi import FastAPI
|
||||||
from middlewares.cors_middleware import add_cors_middleware
|
from middlewares.cors_middleware import add_cors_middleware
|
||||||
|
from middlewares.gzip_middleware import add_gzip_middleware
|
||||||
|
|
||||||
|
|
||||||
def handle_middleware(app: FastAPI):
|
def handle_middleware(app: FastAPI):
|
||||||
@@ -8,3 +9,5 @@ def handle_middleware(app: FastAPI):
|
|||||||
"""
|
"""
|
||||||
# 加载跨域中间件
|
# 加载跨域中间件
|
||||||
add_cors_middleware(app)
|
add_cors_middleware(app)
|
||||||
|
# 加载gzip压缩中间件
|
||||||
|
add_gzip_middleware(app)
|
||||||
|
@@ -15,6 +15,8 @@ from module_admin.service.log_service import LoginLogService, OperationLogServic
|
|||||||
from module_admin.service.login_service import LoginService
|
from module_admin.service.login_service import LoginService
|
||||||
from config.enums import BusinessType
|
from config.enums import BusinessType
|
||||||
from config.env import AppConfig
|
from config.env import AppConfig
|
||||||
|
from exceptions.exception import LoginException, ServiceException, ServiceWarning
|
||||||
|
from utils.response_util import ResponseUtil
|
||||||
|
|
||||||
|
|
||||||
class Log:
|
class Log:
|
||||||
@@ -111,8 +113,17 @@ class Log:
|
|||||||
loginTime=oper_time.strftime('%Y-%m-%d %H:%M:%S'),
|
loginTime=oper_time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||||
)
|
)
|
||||||
kwargs['form_data'].login_info = login_log
|
kwargs['form_data'].login_info = login_log
|
||||||
# 调用原始函数
|
try:
|
||||||
result = await func(*args, **kwargs)
|
# 调用原始函数
|
||||||
|
result = await func(*args, **kwargs)
|
||||||
|
except LoginException as e:
|
||||||
|
result = ResponseUtil.failure(data=e.data, msg=e.message)
|
||||||
|
except ServiceException as e:
|
||||||
|
result = ResponseUtil.error(data=e.data, msg=e.message)
|
||||||
|
except ServiceWarning as e:
|
||||||
|
result = ResponseUtil.failure(data=e.data, msg=e.message)
|
||||||
|
except Exception as e:
|
||||||
|
result = ResponseUtil.error(msg=str(e))
|
||||||
# 获取请求耗时
|
# 获取请求耗时
|
||||||
cost_time = float(time.time() - start_time) * 100
|
cost_time = float(time.time() - start_time) * 100
|
||||||
# 判断请求是否来自api文档
|
# 判断请求是否来自api文档
|
||||||
@@ -281,8 +292,17 @@ def log_decorator(
|
|||||||
loginTime=oper_time.strftime('%Y-%m-%d %H:%M:%S'),
|
loginTime=oper_time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||||
)
|
)
|
||||||
kwargs['form_data'].login_info = login_log
|
kwargs['form_data'].login_info = login_log
|
||||||
# 调用原始函数
|
try:
|
||||||
result = await func(*args, **kwargs)
|
# 调用原始函数
|
||||||
|
result = await func(*args, **kwargs)
|
||||||
|
except LoginException as e:
|
||||||
|
result = ResponseUtil.failure(data=e.data, msg=e.message)
|
||||||
|
except ServiceException as e:
|
||||||
|
result = ResponseUtil.error(data=e.data, msg=e.message)
|
||||||
|
except ServiceWarning as e:
|
||||||
|
result = ResponseUtil.failure(data=e.data, msg=e.message)
|
||||||
|
except Exception as e:
|
||||||
|
result = ResponseUtil.error(msg=str(e))
|
||||||
# 获取请求耗时
|
# 获取请求耗时
|
||||||
cost_time = float(time.time() - start_time) * 100
|
cost_time = float(time.time() - start_time) * 100
|
||||||
# 判断请求是否来自api文档
|
# 判断请求是否来自api文档
|
||||||
|
@@ -71,7 +71,7 @@ class PageUtil:
|
|||||||
paginated_data.append(row[0])
|
paginated_data.append(row[0])
|
||||||
else:
|
else:
|
||||||
paginated_data.append(row)
|
paginated_data.append(row)
|
||||||
has_next = True if math.ceil(len(paginated_data) / page_size) > page_num else False
|
has_next = math.ceil(total / page_size) > page_num
|
||||||
result = PageResponseModel(
|
result = PageResponseModel(
|
||||||
rows=CamelCaseUtil.transform_result(paginated_data),
|
rows=CamelCaseUtil.transform_result(paginated_data),
|
||||||
pageNum=page_num,
|
pageNum=page_num,
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "vfadmin",
|
"name": "vfadmin",
|
||||||
"version": "1.3.0",
|
"version": "1.3.2",
|
||||||
"description": "vfadmin管理系统",
|
"description": "vfadmin管理系统",
|
||||||
"author": "insistence",
|
"author": "insistence",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
Reference in New Issue
Block a user