27 Commits

Author SHA1 Message Date
insistence
c6c9020d89 !18 RuoYi-Vue3-FastAPI v1.4.0
Merge pull request !18 from insistence/develop
2024-09-29 02:24:08 +00:00
insistence
df1929ab24 docs: 更新README文档 2024-09-29 09:50:32 +08:00
insistence
3d15c37182 chore: 升级版本至1.4.0 2024-09-29 09:50:23 +08:00
insistence
d9810bfb67 perf: 优化前端登录请求方法 2024-09-29 09:47:25 +08:00
insistence
5a04889f84 refactor: 基于fastapi0.115.0版本新特性,直接使用pydantic模型接收查询参数和表单数据,移除as_query和as_form使用方式 2024-09-29 09:43:38 +08:00
insistence
8a964bf3f5 chore: 更新fastapi版本至0.115.0 2024-09-29 09:39:56 +08:00
insistence
f573e3e93b style: 修复书写错误 2024-09-24 20:20:04 +08:00
insistence
84a02a42aa !17 RuoYi-Vue3-FastAPI v1.3.3
Merge pull request !17 from insistence/develop
2024-09-04 01:16:02 +00:00
insistence
c750908c04 docs: 更新README文档 2024-09-04 09:07:42 +08:00
insistence
af89388294 chore: 升级版本至1.3.3 2024-09-04 09:07:34 +08:00
insistence
09380dc94f chore: 更新pydantic-validation-decorator版本为0.1.4,修复了一些底层bug 2024-09-04 09:02:13 +08:00
insistence
82c84b2afe perf: 日志装饰器异常处理增加logger打印日志 2024-09-04 09:01:41 +08:00
insistence
f404aba689 fix: 修复在线用户模块条件查询无效的问题 2024-08-17 16:52:46 +08:00
insistence
9013b1917e perf: 优化在线用户模块前后端字段描述一致 2024-08-17 16:51:38 +08:00
insistence
c415dfa8e1 !16 RuoYi-Vue3-FastAPI v1.3.2
Merge pull request !16 from insistence/develop
2024-08-08 01:38:22 +00:00
insistence
5765e967ae docs: 更新README文档 2024-08-08 09:28:33 +08:00
insistence
1ba4d959ce chore: 升级版本至1.3.2 2024-08-08 09:27:51 +08:00
insistence
df8ab6bc55 chore: 调整.gitignore策略 2024-08-08 09:24:09 +08:00
insistence
ca6668331f style: 优化添加中间件函数注释 2024-08-08 09:20:57 +08:00
insistence
d49d05b776 feat: 新增gzip压缩中间件 2024-08-08 09:18:07 +08:00
insistence
d8e3f7dca1 fix: 修复定时任务监听函数中事件没有job_id报错的问题 2024-08-07 14:41:57 +08:00
insistence
5ee1a64587 fix: 修复分页函数计算has_next错误的问题 #10 2024-08-02 10:27:06 +08:00
insistence
9a31c21943 !15 RuoYi-Vue3-FastAPI v1.3.1
Merge pull request !15 from insistence/develop
2024-07-31 03:24:06 +00:00
insistence
e52f0f42cb docs: 更新README文档 2024-07-31 11:14:38 +08:00
insistence
1f51525dfa chore: 升级版本至1.3.1 2024-07-31 11:13:57 +08:00
insistence
a1c77829cd perf: 补充定时任务违规字符串 2024-07-31 10:59:01 +08:00
insistence
07771c180d fix: 修复1.3.0版本采用新的异常处理机制后日志装饰器无法记录异常日志的问题 2024-07-27 16:31:01 +08:00
38 changed files with 189 additions and 153 deletions

1
.gitignore vendored
View File

@@ -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/

View File

@@ -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.4.0</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.4.0-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是一套全部开源的快速开发平台毫无保留给个人及企业免费使用。

View File

@@ -10,7 +10,7 @@ APP_HOST = '0.0.0.0'
# 应用端口 # 应用端口
APP_PORT = 9099 APP_PORT = 9099
# 应用版本 # 应用版本
APP_VERSION= '1.3.0' APP_VERSION= '1.4.0'
# 应用是否开启热重载 # 应用是否开启热重载
APP_RELOAD = true APP_RELOAD = true
# 应用是否开启IP归属区域查询 # 应用是否开启IP归属区域查询

View File

@@ -10,7 +10,7 @@ APP_HOST = '0.0.0.0'
# 应用端口 # 应用端口
APP_PORT = 9099 APP_PORT = 9099
# 应用版本 # 应用版本
APP_VERSION= '1.3.0' APP_VERSION= '1.4.0'
# 应用是否开启热重载 # 应用是否开启热重载
APP_RELOAD = false APP_RELOAD = false
# 应用是否开启IP归属区域查询 # 应用是否开启IP归属区域查询

View File

@@ -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']

View File

@@ -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()

View File

@@ -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',

View 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)

View File

@@ -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)

View File

@@ -15,6 +15,9 @@ 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.log_util import logger
from utils.response_util import ResponseUtil
class Log: class Log:
@@ -111,8 +114,18 @@ 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, ServiceWarning) as e:
logger.warning(e.message)
result = ResponseUtil.failure(data=e.data, msg=e.message)
except ServiceException as e:
logger.error(e.message)
result = ResponseUtil.error(data=e.data, msg=e.message)
except Exception as e:
logger.exception(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 +294,18 @@ 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, ServiceWarning) as e:
logger.warning(e.message)
result = ResponseUtil.failure(data=e.data, msg=e.message)
except ServiceException as e:
logger.error(e.message)
result = ResponseUtil.error(data=e.data, msg=e.message)
except Exception as e:
logger.exception(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文档

View File

@@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Form, Query, Request
from pydantic_validation_decorator import ValidateFields from pydantic_validation_decorator import ValidateFields
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from config.enums import BusinessType from config.enums import BusinessType
@@ -24,7 +24,7 @@ configController = APIRouter(prefix='/system/config', dependencies=[Depends(Logi
) )
async def get_system_config_list( async def get_system_config_list(
request: Request, request: Request,
config_page_query: ConfigPageQueryModel = Depends(ConfigPageQueryModel.as_query), config_page_query: ConfigPageQueryModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取分页数据 # 获取分页数据
@@ -112,7 +112,7 @@ async def query_system_config(request: Request, config_key: str):
@Log(title='参数管理', business_type=BusinessType.EXPORT) @Log(title='参数管理', business_type=BusinessType.EXPORT)
async def export_system_config_list( async def export_system_config_list(
request: Request, request: Request,
config_page_query: ConfigPageQueryModel = Depends(ConfigPageQueryModel.as_form), config_page_query: ConfigPageQueryModel = Form(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取全量数据 # 获取全量数据

View File

@@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Query, Request
from pydantic_validation_decorator import ValidateFields from pydantic_validation_decorator import ValidateFields
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from typing import List from typing import List
@@ -42,7 +42,7 @@ async def get_system_dept_tree_for_edit_option(
) )
async def get_system_dept_list( async def get_system_dept_list(
request: Request, request: Request,
dept_query: DeptQueryModel = Depends(DeptQueryModel.as_query), dept_query: DeptQueryModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
data_scope_sql: str = Depends(GetDataScope('SysDept')), data_scope_sql: str = Depends(GetDataScope('SysDept')),
): ):

View File

@@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Form, Query, Request
from pydantic_validation_decorator import ValidateFields from pydantic_validation_decorator import ValidateFields
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from typing import List from typing import List
@@ -32,7 +32,7 @@ dictController = APIRouter(prefix='/system/dict', dependencies=[Depends(LoginSer
) )
async def get_system_dict_type_list( async def get_system_dict_type_list(
request: Request, request: Request,
dict_type_page_query: DictTypePageQueryModel = Depends(DictTypePageQueryModel.as_query), dict_type_page_query: DictTypePageQueryModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取分页数据 # 获取分页数据
@@ -123,7 +123,7 @@ async def query_detail_system_dict_type(request: Request, dict_id: int, query_db
@Log(title='字典类型', business_type=BusinessType.EXPORT) @Log(title='字典类型', business_type=BusinessType.EXPORT)
async def export_system_dict_type_list( async def export_system_dict_type_list(
request: Request, request: Request,
dict_type_page_query: DictTypePageQueryModel = Depends(DictTypePageQueryModel.as_form), dict_type_page_query: DictTypePageQueryModel = Form(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取全量数据 # 获取全量数据
@@ -152,7 +152,7 @@ async def query_system_dict_type_data(request: Request, dict_type: str, query_db
) )
async def get_system_dict_data_list( async def get_system_dict_data_list(
request: Request, request: Request,
dict_data_page_query: DictDataPageQueryModel = Depends(DictDataPageQueryModel.as_query), dict_data_page_query: DictDataPageQueryModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取分页数据 # 获取分页数据
@@ -226,7 +226,7 @@ async def query_detail_system_dict_data(request: Request, dict_code: int, query_
@Log(title='字典数据', business_type=BusinessType.EXPORT) @Log(title='字典数据', business_type=BusinessType.EXPORT)
async def export_system_dict_data_list( async def export_system_dict_data_list(
request: Request, request: Request,
dict_data_page_query: DictDataPageQueryModel = Depends(DictDataPageQueryModel.as_form), dict_data_page_query: DictDataPageQueryModel = Form(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取全量数据 # 获取全量数据

View File

@@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Form, Query, Request
from pydantic_validation_decorator import ValidateFields from pydantic_validation_decorator import ValidateFields
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from config.enums import BusinessType from config.enums import BusinessType
@@ -32,7 +32,7 @@ jobController = APIRouter(prefix='/monitor', dependencies=[Depends(LoginService.
) )
async def get_system_job_list( async def get_system_job_list(
request: Request, request: Request,
job_page_query: JobPageQueryModel = Depends(JobPageQueryModel.as_query), job_page_query: JobPageQueryModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取分页数据 # 获取分页数据
@@ -132,7 +132,7 @@ async def query_detail_system_job(request: Request, job_id: int, query_db: Async
@Log(title='定时任务', business_type=BusinessType.EXPORT) @Log(title='定时任务', business_type=BusinessType.EXPORT)
async def export_system_job_list( async def export_system_job_list(
request: Request, request: Request,
job_page_query: JobPageQueryModel = Depends(JobPageQueryModel.as_form), job_page_query: JobPageQueryModel = Form(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取全量数据 # 获取全量数据
@@ -148,7 +148,7 @@ async def export_system_job_list(
) )
async def get_system_job_log_list( async def get_system_job_log_list(
request: Request, request: Request,
job_log_page_query: JobLogPageQueryModel = Depends(JobLogPageQueryModel.as_query), job_log_page_query: JobLogPageQueryModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取分页数据 # 获取分页数据
@@ -183,7 +183,7 @@ async def delete_system_job_log(request: Request, job_log_ids: str, query_db: As
@Log(title='定时任务调度日志', business_type=BusinessType.EXPORT) @Log(title='定时任务调度日志', business_type=BusinessType.EXPORT)
async def export_system_job_log_list( async def export_system_job_log_list(
request: Request, request: Request,
job_log_page_query: JobLogPageQueryModel = Depends(JobLogPageQueryModel.as_form), job_log_page_query: JobLogPageQueryModel = Form(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取全量数据 # 获取全量数据

View File

@@ -1,4 +1,4 @@
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Form, Query, Request
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from config.enums import BusinessType from config.enums import BusinessType
from config.get_db import get_db from config.get_db import get_db
@@ -29,7 +29,7 @@ logController = APIRouter(prefix='/monitor', dependencies=[Depends(LoginService.
) )
async def get_system_operation_log_list( async def get_system_operation_log_list(
request: Request, request: Request,
operation_log_page_query: OperLogPageQueryModel = Depends(OperLogPageQueryModel.as_query), operation_log_page_query: OperLogPageQueryModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取分页数据 # 获取分页数据
@@ -66,7 +66,7 @@ async def delete_system_operation_log(request: Request, oper_ids: str, query_db:
@Log(title='操作日志', business_type=BusinessType.EXPORT) @Log(title='操作日志', business_type=BusinessType.EXPORT)
async def export_system_operation_log_list( async def export_system_operation_log_list(
request: Request, request: Request,
operation_log_page_query: OperLogPageQueryModel = Depends(OperLogPageQueryModel.as_form), operation_log_page_query: OperLogPageQueryModel = Form(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取全量数据 # 获取全量数据
@@ -88,7 +88,7 @@ async def export_system_operation_log_list(
) )
async def get_system_login_log_list( async def get_system_login_log_list(
request: Request, request: Request,
login_log_page_query: LoginLogPageQueryModel = Depends(LoginLogPageQueryModel.as_query), login_log_page_query: LoginLogPageQueryModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取分页数据 # 获取分页数据
@@ -137,7 +137,7 @@ async def unlock_system_user(request: Request, user_name: str, query_db: AsyncSe
@Log(title='登录日志', business_type=BusinessType.EXPORT) @Log(title='登录日志', business_type=BusinessType.EXPORT)
async def export_system_login_log_list( async def export_system_login_log_list(
request: Request, request: Request,
login_log_page_query: LoginLogPageQueryModel = Depends(LoginLogPageQueryModel.as_form), login_log_page_query: LoginLogPageQueryModel = Form(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取全量数据 # 获取全量数据

View File

@@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Query, Request
from pydantic_validation_decorator import ValidateFields from pydantic_validation_decorator import ValidateFields
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from typing import List from typing import List
@@ -48,7 +48,7 @@ async def get_system_role_menu_tree(
) )
async def get_system_menu_list( async def get_system_menu_list(
request: Request, request: Request,
menu_query: MenuQueryModel = Depends(MenuQueryModel.as_query), menu_query: MenuQueryModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user), current_user: CurrentUserModel = Depends(LoginService.get_current_user),
): ):

View File

@@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Query, Request
from pydantic_validation_decorator import ValidateFields from pydantic_validation_decorator import ValidateFields
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from config.enums import BusinessType from config.enums import BusinessType
@@ -23,7 +23,7 @@ noticeController = APIRouter(prefix='/system/notice', dependencies=[Depends(Logi
) )
async def get_system_notice_list( async def get_system_notice_list(
request: Request, request: Request,
notice_page_query: NoticePageQueryModel = Depends(NoticePageQueryModel.as_query), notice_page_query: NoticePageQueryModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取分页数据 # 获取分页数据

View File

@@ -1,4 +1,4 @@
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Query, Request
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from config.enums import BusinessType from config.enums import BusinessType
from config.get_db import get_db from config.get_db import get_db
@@ -18,9 +18,7 @@ onlineController = APIRouter(prefix='/monitor/online', dependencies=[Depends(Log
@onlineController.get( @onlineController.get(
'/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:online:list'))] '/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:online:list'))]
) )
async def get_monitor_online_list( async def get_monitor_online_list(request: Request, online_page_query: OnlineQueryModel = Query()):
request: Request, online_page_query: OnlineQueryModel = Depends(OnlineQueryModel.as_query)
):
# 获取全量数据 # 获取全量数据
online_query_result = await OnlineService.get_online_list_services(request, online_page_query) online_query_result = await OnlineService.get_online_list_services(request, online_page_query)
logger.info('获取成功') logger.info('获取成功')

View File

@@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Form, Query, Request
from pydantic_validation_decorator import ValidateFields from pydantic_validation_decorator import ValidateFields
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from config.enums import BusinessType from config.enums import BusinessType
@@ -24,7 +24,7 @@ postController = APIRouter(prefix='/system/post', dependencies=[Depends(LoginSer
) )
async def get_system_post_list( async def get_system_post_list(
request: Request, request: Request,
post_page_query: PostPageQueryModel = Depends(PostPageQueryModel.as_query), post_page_query: PostPageQueryModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取分页数据 # 获取分页数据
@@ -94,7 +94,7 @@ async def query_detail_system_post(request: Request, post_id: int, query_db: Asy
@Log(title='岗位管理', business_type=BusinessType.EXPORT) @Log(title='岗位管理', business_type=BusinessType.EXPORT)
async def export_system_post_list( async def export_system_post_list(
request: Request, request: Request,
post_page_query: PostPageQueryModel = Depends(PostPageQueryModel.as_form), post_page_query: PostPageQueryModel = Form(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
# 获取全量数据 # 获取全量数据

View File

@@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Form, Query, Request
from pydantic_validation_decorator import ValidateFields from pydantic_validation_decorator import ValidateFields
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from config.enums import BusinessType from config.enums import BusinessType
@@ -43,7 +43,7 @@ async def get_system_role_dept_tree(
) )
async def get_system_role_list( async def get_system_role_list(
request: Request, request: Request,
role_page_query: RolePageQueryModel = Depends(RolePageQueryModel.as_query), role_page_query: RolePageQueryModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
data_scope_sql: str = Depends(GetDataScope('SysDept')), data_scope_sql: str = Depends(GetDataScope('SysDept')),
): ):
@@ -165,7 +165,7 @@ async def query_detail_system_role(
@Log(title='角色管理', business_type=BusinessType.EXPORT) @Log(title='角色管理', business_type=BusinessType.EXPORT)
async def export_system_role_list( async def export_system_role_list(
request: Request, request: Request,
role_page_query: RolePageQueryModel = Depends(RolePageQueryModel.as_form), role_page_query: RolePageQueryModel = Form(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
data_scope_sql: str = Depends(GetDataScope('SysDept')), data_scope_sql: str = Depends(GetDataScope('SysDept')),
): ):
@@ -211,7 +211,7 @@ async def reset_system_role_status(
) )
async def get_system_allocated_user_list( async def get_system_allocated_user_list(
request: Request, request: Request,
user_role: UserRolePageQueryModel = Depends(UserRolePageQueryModel.as_query), user_role: UserRolePageQueryModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
data_scope_sql: str = Depends(GetDataScope('SysUser')), data_scope_sql: str = Depends(GetDataScope('SysUser')),
): ):
@@ -230,7 +230,7 @@ async def get_system_allocated_user_list(
) )
async def get_system_unallocated_user_list( async def get_system_unallocated_user_list(
request: Request, request: Request,
user_role: UserRolePageQueryModel = Depends(UserRolePageQueryModel.as_query), user_role: UserRolePageQueryModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
data_scope_sql: str = Depends(GetDataScope('SysUser')), data_scope_sql: str = Depends(GetDataScope('SysUser')),
): ):
@@ -246,7 +246,7 @@ async def get_system_unallocated_user_list(
@Log(title='角色管理', business_type=BusinessType.GRANT) @Log(title='角色管理', business_type=BusinessType.GRANT)
async def add_system_role_user( async def add_system_role_user(
request: Request, request: Request,
add_role_user: CrudUserRoleModel = Depends(CrudUserRoleModel.as_query), add_role_user: CrudUserRoleModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user), current_user: CurrentUserModel = Depends(LoginService.get_current_user),
data_scope_sql: str = Depends(GetDataScope('SysDept')), data_scope_sql: str = Depends(GetDataScope('SysDept')),
@@ -274,7 +274,7 @@ async def cancel_system_role_user(
@Log(title='角色管理', business_type=BusinessType.GRANT) @Log(title='角色管理', business_type=BusinessType.GRANT)
async def batch_cancel_system_role_user( async def batch_cancel_system_role_user(
request: Request, request: Request,
batch_cancel_user_role: CrudUserRoleModel = Depends(CrudUserRoleModel.as_query), batch_cancel_user_role: CrudUserRoleModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
): ):
batch_cancel_user_role_result = await UserService.delete_user_role_services(query_db, batch_cancel_user_role) batch_cancel_user_role_result = await UserService.delete_user_role_services(query_db, batch_cancel_user_role)

View File

@@ -1,6 +1,6 @@
import os import os
from datetime import datetime from datetime import datetime
from fastapi import APIRouter, Depends, File, Query, Request, UploadFile from fastapi import APIRouter, Depends, File, Form, Query, Request, UploadFile
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from typing import Optional, Union from typing import Optional, Union
from pydantic_validation_decorator import ValidateFields from pydantic_validation_decorator import ValidateFields
@@ -57,7 +57,7 @@ async def get_system_dept_tree(
) )
async def get_system_user_list( async def get_system_user_list(
request: Request, request: Request,
user_page_query: UserPageQueryModel = Depends(UserPageQueryModel.as_query), user_page_query: UserPageQueryModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
data_scope_sql: str = Depends(GetDataScope('SysUser')), data_scope_sql: str = Depends(GetDataScope('SysUser')),
): ):
@@ -296,7 +296,7 @@ async def change_system_user_profile_info(
@Log(title='个人信息', business_type=BusinessType.UPDATE) @Log(title='个人信息', business_type=BusinessType.UPDATE)
async def reset_system_user_password( async def reset_system_user_password(
request: Request, request: Request,
reset_password: ResetPasswordModel = Depends(ResetPasswordModel.as_query), reset_password: ResetPasswordModel = Query(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user), current_user: CurrentUserModel = Depends(LoginService.get_current_user),
): ):
@@ -344,7 +344,7 @@ async def export_system_user_template(request: Request, query_db: AsyncSession =
@Log(title='用户管理', business_type=BusinessType.EXPORT) @Log(title='用户管理', business_type=BusinessType.EXPORT)
async def export_system_user_list( async def export_system_user_list(
request: Request, request: Request,
user_page_query: UserPageQueryModel = Depends(UserPageQueryModel.as_form), user_page_query: UserPageQueryModel = Form(),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
data_scope_sql: str = Depends(GetDataScope('SysUser')), data_scope_sql: str = Depends(GetDataScope('SysUser')),
): ):

View File

@@ -3,7 +3,6 @@ from pydantic import BaseModel, ConfigDict, Field
from pydantic.alias_generators import to_camel from pydantic.alias_generators import to_camel
from pydantic_validation_decorator import NotBlank, Size from pydantic_validation_decorator import NotBlank, Size
from typing import Literal, Optional from typing import Literal, Optional
from module_admin.annotation.pydantic_annotation import as_form, as_query
class ConfigModel(BaseModel): class ConfigModel(BaseModel):
@@ -54,8 +53,6 @@ class ConfigQueryModel(ConfigModel):
end_time: Optional[str] = Field(default=None, description='结束时间') end_time: Optional[str] = Field(default=None, description='结束时间')
@as_query
@as_form
class ConfigPageQueryModel(ConfigQueryModel): class ConfigPageQueryModel(ConfigQueryModel):
""" """
参数配置管理分页查询模型 参数配置管理分页查询模型

View File

@@ -3,7 +3,6 @@ from pydantic import BaseModel, ConfigDict, Field
from pydantic.alias_generators import to_camel from pydantic.alias_generators import to_camel
from pydantic_validation_decorator import Network, NotBlank, Size from pydantic_validation_decorator import Network, NotBlank, Size
from typing import Literal, Optional from typing import Literal, Optional
from module_admin.annotation.pydantic_annotation import as_query
class DeptModel(BaseModel): class DeptModel(BaseModel):
@@ -53,7 +52,6 @@ class DeptModel(BaseModel):
self.get_email() self.get_email()
@as_query
class DeptQueryModel(DeptModel): class DeptQueryModel(DeptModel):
""" """
部门管理不分页查询模型 部门管理不分页查询模型

View File

@@ -3,7 +3,6 @@ from pydantic import BaseModel, ConfigDict, Field
from pydantic.alias_generators import to_camel from pydantic.alias_generators import to_camel
from pydantic_validation_decorator import NotBlank, Pattern, Size from pydantic_validation_decorator import NotBlank, Pattern, Size
from typing import Literal, Optional from typing import Literal, Optional
from module_admin.annotation.pydantic_annotation import as_form, as_query
class DictTypeModel(BaseModel): class DictTypeModel(BaseModel):
@@ -100,8 +99,6 @@ class DictTypeQueryModel(DictTypeModel):
end_time: Optional[str] = Field(default=None, description='结束时间') end_time: Optional[str] = Field(default=None, description='结束时间')
@as_query
@as_form
class DictTypePageQueryModel(DictTypeQueryModel): class DictTypePageQueryModel(DictTypeQueryModel):
""" """
字典类型管理分页查询模型 字典类型管理分页查询模型
@@ -130,8 +127,6 @@ class DictDataQueryModel(DictDataModel):
end_time: Optional[str] = Field(default=None, description='结束时间') end_time: Optional[str] = Field(default=None, description='结束时间')
@as_query
@as_form
class DictDataPageQueryModel(DictDataQueryModel): class DictDataPageQueryModel(DictDataQueryModel):
""" """
字典数据管理分页查询模型 字典数据管理分页查询模型

View File

@@ -3,7 +3,6 @@ from pydantic import BaseModel, ConfigDict, Field
from pydantic.alias_generators import to_camel from pydantic.alias_generators import to_camel
from pydantic_validation_decorator import NotBlank, Size from pydantic_validation_decorator import NotBlank, Size
from typing import Literal, Optional from typing import Literal, Optional
from module_admin.annotation.pydantic_annotation import as_form, as_query
class JobModel(BaseModel): class JobModel(BaseModel):
@@ -77,8 +76,6 @@ class JobQueryModel(JobModel):
end_time: Optional[str] = Field(default=None, description='结束时间') end_time: Optional[str] = Field(default=None, description='结束时间')
@as_query
@as_form
class JobPageQueryModel(JobQueryModel): class JobPageQueryModel(JobQueryModel):
""" """
定时任务管理分页查询模型 定时任务管理分页查询模型
@@ -115,8 +112,6 @@ class JobLogQueryModel(JobLogModel):
end_time: Optional[str] = Field(default=None, description='结束时间') end_time: Optional[str] = Field(default=None, description='结束时间')
@as_query
@as_form
class JobLogPageQueryModel(JobLogQueryModel): class JobLogPageQueryModel(JobLogQueryModel):
""" """
定时任务日志管理分页查询模型 定时任务日志管理分页查询模型

View File

@@ -2,7 +2,6 @@ from datetime import datetime
from pydantic import BaseModel, ConfigDict, Field from pydantic import BaseModel, ConfigDict, Field
from pydantic.alias_generators import to_camel from pydantic.alias_generators import to_camel
from typing import Literal, Optional from typing import Literal, Optional
from module_admin.annotation.pydantic_annotation import as_form, as_query
class OperLogModel(BaseModel): class OperLogModel(BaseModel):
@@ -68,8 +67,6 @@ class OperLogQueryModel(OperLogModel):
end_time: Optional[str] = Field(default=None, description='结束时间') end_time: Optional[str] = Field(default=None, description='结束时间')
@as_query
@as_form
class OperLogPageQueryModel(OperLogQueryModel): class OperLogPageQueryModel(OperLogQueryModel):
""" """
操作日志管理分页查询模型 操作日志管理分页查询模型
@@ -102,8 +99,6 @@ class LoginLogQueryModel(LogininforModel):
end_time: Optional[str] = Field(default=None, description='结束时间') end_time: Optional[str] = Field(default=None, description='结束时间')
@as_query
@as_form
class LoginLogPageQueryModel(LoginLogQueryModel): class LoginLogPageQueryModel(LoginLogQueryModel):
""" """
登录日志管理分页查询模型 登录日志管理分页查询模型

View File

@@ -3,7 +3,6 @@ from pydantic import BaseModel, ConfigDict, Field
from pydantic.alias_generators import to_camel from pydantic.alias_generators import to_camel
from pydantic_validation_decorator import NotBlank, Size from pydantic_validation_decorator import NotBlank, Size
from typing import Literal, Optional from typing import Literal, Optional
from module_admin.annotation.pydantic_annotation import as_query
class MenuModel(BaseModel): class MenuModel(BaseModel):
@@ -68,7 +67,6 @@ class MenuModel(BaseModel):
self.get_perms() self.get_perms()
@as_query
class MenuQueryModel(MenuModel): class MenuQueryModel(MenuModel):
""" """
菜单管理不分页查询模型 菜单管理不分页查询模型

View File

@@ -3,7 +3,6 @@ from pydantic import BaseModel, ConfigDict, Field
from pydantic.alias_generators import to_camel from pydantic.alias_generators import to_camel
from pydantic_validation_decorator import NotBlank, Size, Xss from pydantic_validation_decorator import NotBlank, Size, Xss
from typing import Literal, Optional from typing import Literal, Optional
from module_admin.annotation.pydantic_annotation import as_form, as_query
class NoticeModel(BaseModel): class NoticeModel(BaseModel):
@@ -43,8 +42,6 @@ class NoticeQueryModel(NoticeModel):
end_time: Optional[str] = Field(default=None, description='结束时间') end_time: Optional[str] = Field(default=None, description='结束时间')
@as_query
@as_form
class NoticePageQueryModel(NoticeQueryModel): class NoticePageQueryModel(NoticeQueryModel):
""" """
通知公告管理分页查询模型 通知公告管理分页查询模型

View File

@@ -2,7 +2,6 @@ from datetime import datetime
from pydantic import BaseModel, ConfigDict, Field from pydantic import BaseModel, ConfigDict, Field
from pydantic.alias_generators import to_camel from pydantic.alias_generators import to_camel
from typing import Optional from typing import Optional
from module_admin.annotation.pydantic_annotation import as_query
class OnlineModel(BaseModel): class OnlineModel(BaseModel):
@@ -13,16 +12,15 @@ class OnlineModel(BaseModel):
model_config = ConfigDict(alias_generator=to_camel) model_config = ConfigDict(alias_generator=to_camel)
token_id: Optional[str] = Field(default=None, description='会话编号') token_id: Optional[str] = Field(default=None, description='会话编号')
user_name: Optional[str] = Field(default=None, description='部门名称') user_name: Optional[str] = Field(default=None, description='登录名称')
dept_name: Optional[str] = Field(default=None, description='用户名称') dept_name: Optional[str] = Field(default=None, description='所属部门')
ipaddr: Optional[str] = Field(default=None, description='登录IP地址') ipaddr: Optional[str] = Field(default=None, description='主机')
login_location: Optional[str] = Field(default=None, description='登录地') login_location: Optional[str] = Field(default=None, description='登录地')
browser: Optional[str] = Field(default=None, description='浏览器类型') browser: Optional[str] = Field(default=None, description='浏览器类型')
os: Optional[str] = Field(default=None, description='操作系统') os: Optional[str] = Field(default=None, description='操作系统')
login_time: Optional[datetime] = Field(default=None, description='登录时间') login_time: Optional[datetime] = Field(default=None, description='登录时间')
@as_query
class OnlineQueryModel(OnlineModel): class OnlineQueryModel(OnlineModel):
""" """
岗位管理不分页查询模型 岗位管理不分页查询模型

View File

@@ -3,7 +3,6 @@ from pydantic import BaseModel, ConfigDict, Field
from pydantic.alias_generators import to_camel from pydantic.alias_generators import to_camel
from pydantic_validation_decorator import NotBlank, Size from pydantic_validation_decorator import NotBlank, Size
from typing import Literal, Optional from typing import Literal, Optional
from module_admin.annotation.pydantic_annotation import as_form, as_query
class PostModel(BaseModel): class PostModel(BaseModel):
@@ -53,8 +52,6 @@ class PostQueryModel(PostModel):
end_time: Optional[str] = Field(default=None, description='结束时间') end_time: Optional[str] = Field(default=None, description='结束时间')
@as_query
@as_form
class PostPageQueryModel(PostQueryModel): class PostPageQueryModel(PostQueryModel):
""" """
岗位管理分页查询模型 岗位管理分页查询模型

View File

@@ -3,7 +3,6 @@ from pydantic import BaseModel, ConfigDict, Field, field_validator, model_valida
from pydantic.alias_generators import to_camel from pydantic.alias_generators import to_camel
from pydantic_validation_decorator import NotBlank, Size from pydantic_validation_decorator import NotBlank, Size
from typing import List, Literal, Optional, Union from typing import List, Literal, Optional, Union
from module_admin.annotation.pydantic_annotation import as_form, as_query
class RoleModel(BaseModel): class RoleModel(BaseModel):
@@ -104,8 +103,6 @@ class RoleQueryModel(RoleModel):
end_time: Optional[str] = Field(default=None, description='结束时间') end_time: Optional[str] = Field(default=None, description='结束时间')
@as_query
@as_form
class RolePageQueryModel(RoleQueryModel): class RolePageQueryModel(RoleQueryModel):
""" """
角色管理分页查询模型 角色管理分页查询模型

View File

@@ -5,7 +5,6 @@ from pydantic.alias_generators import to_camel
from pydantic_validation_decorator import Network, NotBlank, Size, Xss from pydantic_validation_decorator import Network, NotBlank, Size, Xss
from typing import List, Literal, Optional, Union from typing import List, Literal, Optional, Union
from exceptions.exception import ModelValidatorException from exceptions.exception import ModelValidatorException
from module_admin.annotation.pydantic_annotation import as_form, as_query
from module_admin.entity.vo.dept_vo import DeptModel from module_admin.entity.vo.dept_vo import DeptModel
from module_admin.entity.vo.post_vo import PostModel from module_admin.entity.vo.post_vo import PostModel
from module_admin.entity.vo.role_vo import RoleModel from module_admin.entity.vo.role_vo import RoleModel
@@ -162,8 +161,6 @@ class UserQueryModel(UserModel):
end_time: Optional[str] = Field(default=None, description='结束时间') end_time: Optional[str] = Field(default=None, description='结束时间')
@as_query
@as_form
class UserPageQueryModel(UserQueryModel): class UserPageQueryModel(UserQueryModel):
""" """
用户管理分页查询模型 用户管理分页查询模型
@@ -191,7 +188,6 @@ class EditUserModel(AddUserModel):
role: Optional[List] = Field(default=[], description='角色信息') role: Optional[List] = Field(default=[], description='角色信息')
@as_query
class ResetPasswordModel(BaseModel): class ResetPasswordModel(BaseModel):
""" """
重置密码模型 重置密码模型
@@ -241,7 +237,6 @@ class UserRoleQueryModel(UserModel):
role_id: Optional[int] = Field(default=None, description='角色ID') role_id: Optional[int] = Field(default=None, description='角色ID')
@as_query
class UserRolePageQueryModel(UserRoleQueryModel): class UserRolePageQueryModel(UserRoleQueryModel):
""" """
用户角色关联管理分页查询模型 用户角色关联管理分页查询模型
@@ -270,7 +265,6 @@ class UserRoleResponseModel(BaseModel):
user: UserInfoModel = Field(description='用户信息') user: UserInfoModel = Field(description='用户信息')
@as_query
class CrudUserRoleModel(BaseModel): class CrudUserRoleModel(BaseModel):
""" """
新增、删除用户关联角色及角色关联用户模型 新增、删除用户关联角色及角色关联用户模型

View File

@@ -22,7 +22,7 @@ class OnlineService:
:param query_object: 查询参数对象 :param query_object: 查询参数对象
:return: 在线用户列表信息 :return: 在线用户列表信息
""" """
access_token_keys = await request.app.state.redis.keys(f"{RedisInitKeyConfig.ACCESS_TOKEN.key}*") access_token_keys = await request.app.state.redis.keys(f'{RedisInitKeyConfig.ACCESS_TOKEN.key}*')
if not access_token_keys: if not access_token_keys:
access_token_keys = [] access_token_keys = []
access_token_values_list = [await request.app.state.redis.get(key) for key in access_token_keys] access_token_values_list = [await request.app.state.redis.get(key) for key in access_token_keys]
@@ -40,11 +40,11 @@ class OnlineService:
login_time=payload.get('login_info').get('loginTime'), login_time=payload.get('login_info').get('loginTime'),
) )
if query_object.user_name and not query_object.ipaddr: if query_object.user_name and not query_object.ipaddr:
if query_object.user_name == payload.get('login_info').get('ipaddr'): if query_object.user_name == payload.get('user_name'):
online_info_list = [online_dict] online_info_list = [online_dict]
break break
elif not query_object.user_name and query_object.ipaddr: elif not query_object.user_name and query_object.ipaddr:
if query_object.ipaddr == payload.get('ipaddr'): if query_object.ipaddr == payload.get('login_info').get('ipaddr'):
online_info_list = [online_dict] online_info_list = [online_dict]
break break
elif query_object.user_name and query_object.ipaddr: elif query_object.user_name and query_object.ipaddr:
@@ -70,7 +70,7 @@ class OnlineService:
if page_object.token_ids: if page_object.token_ids:
token_id_list = page_object.token_ids.split(',') token_id_list = page_object.token_ids.split(',')
for token_id in token_id_list: for token_id in token_id_list:
await request.app.state.redis.delete(f"{RedisInitKeyConfig.ACCESS_TOKEN.key}:{token_id}") await request.app.state.redis.delete(f'{RedisInitKeyConfig.ACCESS_TOKEN.key}:{token_id}')
return CrudResponseModel(is_success=True, message='强退成功') return CrudResponseModel(is_success=True, message='强退成功')
else: else:
raise ServiceException(message='传入session_id为空') raise ServiceException(message='传入session_id为空')

View File

@@ -144,9 +144,9 @@ class RoleService:
""" """
add_role = RoleModel(**page_object.model_dump(by_alias=True)) add_role = RoleModel(**page_object.model_dump(by_alias=True))
if not await cls.check_role_name_unique_services(query_db, page_object): if not await cls.check_role_name_unique_services(query_db, page_object):
raise ServiceException(message=f'新增角色{page_object.post_name}失败,角色名称已存在') raise ServiceException(message=f'新增角色{page_object.role_name}失败,角色名称已存在')
elif not await cls.check_role_key_unique_services(query_db, page_object): elif not await cls.check_role_key_unique_services(query_db, page_object):
raise ServiceException(message=f'新增角色{page_object.post_name}失败,角色权限已存在') raise ServiceException(message=f'新增角色{page_object.role_name}失败,角色权限已存在')
else: else:
try: try:
add_result = await RoleDao.add_role_dao(query_db, add_role) add_result = await RoleDao.add_role_dao(query_db, add_role)
@@ -178,9 +178,9 @@ class RoleService:
if role_info: if role_info:
if page_object.type != 'status': if page_object.type != 'status':
if not await cls.check_role_name_unique_services(query_db, page_object): if not await cls.check_role_name_unique_services(query_db, page_object):
raise ServiceException(message=f'修改角色{page_object.post_name}失败,角色名称已存在') raise ServiceException(message=f'修改角色{page_object.role_name}失败,角色名称已存在')
elif not await cls.check_role_key_unique_services(query_db, page_object): elif not await cls.check_role_key_unique_services(query_db, page_object):
raise ServiceException(message=f'修改角色{page_object.post_name}失败,角色权限已存在') raise ServiceException(message=f'修改角色{page_object.role_name}失败,角色权限已存在')
try: try:
await RoleDao.edit_role_dao(query_db, edit_role) await RoleDao.edit_role_dao(query_db, edit_role)
if page_object.type != 'status': if page_object.type != 'status':

View File

@@ -1,14 +1,14 @@
APScheduler==3.10.4 APScheduler==3.10.4
asyncmy==0.2.9 asyncmy==0.2.9
DateTime==5.5 DateTime==5.5
fastapi[all]==0.111.1 fastapi[all]==0.115.0
loguru==0.7.2 loguru==0.7.2
openpyxl==3.1.5 openpyxl==3.1.5
pandas==2.2.2 pandas==2.2.2
passlib[bcrypt]==1.7.4 passlib[bcrypt]==1.7.4
Pillow==10.4.0 Pillow==10.4.0
psutil==6.0.0 psutil==6.0.0
pydantic-validation-decorator==0.1.2 pydantic-validation-decorator==0.1.4
PyJWT[crypto]==2.8.0 PyJWT[crypto]==2.8.0
PyMySQL==1.1.1 PyMySQL==1.1.1
redis==5.0.7 redis==5.0.7

View File

@@ -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,

View File

@@ -1,6 +1,6 @@
{ {
"name": "vfadmin", "name": "vfadmin",
"version": "1.3.0", "version": "1.4.0",
"description": "vfadmin管理系统", "description": "vfadmin管理系统",
"author": "insistence", "author": "insistence",
"license": "MIT", "license": "MIT",

View File

@@ -2,11 +2,12 @@ import request from '@/utils/request'
// 登录方法 // 登录方法
export function login(username, password, code, uuid) { export function login(username, password, code, uuid) {
const data = new FormData(); const data = {
data.append("username", username); username,
data.append("password", password); password,
data.append("code", code); code,
data.append("uuid", uuid); uuid
}
return request({ return request({
url: '/login', url: '/login',
headers: { headers: {