Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
refactor(backend): 重构任务模块并优化菜单权限
- 移除系统模块中的任务相关代码
- 新增批量设置字典类型和数据状态的功能
- 更新菜单权限获取逻辑,增加对链接类型菜单的支持
- 调整任务模块到 monitor 监控模块下
  • Loading branch information
zhangtao
zhangtao committed Jul 16, 2025
commit d8bac53c72b68f4eec623ff9d6f3b77b5d88330b
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,16 @@ fastapi_vue3_amdin/devops/devops/nginx/nginx.conf
- [RuoYi-Vue3-FastAPI 项目](https://gitee.com/insistence2022/RuoYi-Vue3-FastAPI)
- [APScheduler 项目](https://github.com/agronholm/apscheduler)
- [Vite 项目](https://github.com/vitejs/vite)

## Project Source Code

| Project | Gitee | Github | GitCode|
| ---- | ----| ---- | ---- |
| vue3-element-admin ✅| [vue3-element-admin](https://gitee.com/youlaiorg/vue3-element-admin) | [vue3-element-admin](https://github.com/youlaitech/vue3-element-admin) | [vue3-element-admin](https://gitcode.com/youlai/vue3-element-admin) |
| vue3-element-admin JS Version| [vue3-element-admin-js](https://gitee.com/youlaiorg/vue3-element-admin-js) | [vue3-element-admin-js](https://github.com/youlaitech/vue3-element-admin-js) | [vue3-element-admin-js](https://gitcode.com/youlai/vue3-element-admin-js) |
| vue3-element-admin Lite Version | [vue3-element-template](https://gitee.com/youlaiorg/vue3-element-template) | [vue3-element-template](https://github.com/youlaitech/vue3-element-template) |[vue3-element-template](https://gitcode.com/youlai/vue3-element-template)|
| vue-uniapp-admin Mobile Version | [vue-uniapp-admin](https://gitee.com/youlaiorg/vue-uniapp-admin) | [vue-uniapp-admin](https://github.com/youlaitech/vue-uniapp-admin) |[vue-uniapp-admin](https://gitcode.com/youlai/vue-uniapp-admin)|
| Java Backend | [youlai-boot](https://gitee.com/youlaiorg/youlai-boot) | [youlai-boot](https://github.com/haoxianrui/youlai-boot.git) |[youlai-boot](https://gitcode.com/youlai/youlai-boot.git)|
| Node Backend | [youlai-nest](https://gitee.com/youlaiorg/youlai-nest) | [youlai-nest](https://github.com/haoxianrui/youlai-nest.git) |[youlai-nest](https://gitcode.com/youlai/youlai-nest.git)|
---

## 🎨 社区
Expand Down
2 changes: 1 addition & 1 deletion backend/app/alembic/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
from app.api.v1.models.system.notice_model import *
from app.api.v1.models.system.config_model import *
from app.api.v1.models.system.dict_model import *
from app.api.v1.models.system.job_model import *
from app.api.v1.models.monitor.job_model import *
from app.core.base_model import ModelBase
target_metadata = ModelBase.metadata

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
from app.common.request import PaginationService
from app.utils.common_util import bytes2file_response
from app.api.v1.schemas.system.auth_schema import AuthSchema
from app.api.v1.params.system.job_param import JobQueryParams
from app.api.v1.services.system.job_service import JobService
from app.api.v1.schemas.system.job_schema import (
from app.api.v1.params.monitor.job_param import JobQueryParams
from app.api.v1.services.monitor.job_service import JobService
from app.api.v1.schemas.monitor.job_schema import (
JobCreateSchema,
JobUpdateSchema
)
Expand Down
19 changes: 19 additions & 0 deletions backend/app/api/v1/controllers/system/dict_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

from app.common.response import StreamResponse, SuccessResponse
from app.core.base_params import PaginationQueryParams
from app.core.base_schema import BatchSetAvailable
from app.core.dependencies import AuthPermission, redis_getter
from app.core.router_class import OperationLogRoute
from app.core.logger import logger
Expand Down Expand Up @@ -83,6 +84,15 @@ async def delete_type_controller(
logger.info(f"删除字典类型成功: {id}")
return SuccessResponse(msg="删除字典类型成功")

@router.patch("/type/available/setting", summary="批量修改公告状态", description="批量修改公告状态")
async def batch_set_available_obj_controller(
data: BatchSetAvailable,
auth: AuthSchema = Depends(AuthPermission(permissions=["system:dict_type:patch"]))
) -> JSONResponse:
await DictTypeService.set_obj_available_service(auth=auth, data=data)
logger.info(f"批量修改字典类型状态成功: {data.ids}")
return SuccessResponse(msg="批量修改字典类型状态成功")

@router.post('/type/export', summary="导出字典类型", description="导出字典类型")
async def export_type_list_controller(
search: DictTypeQueryParams = Depends(),
Expand Down Expand Up @@ -151,6 +161,15 @@ async def delete_data_controller(
logger.info(f"删除字典数据成功: {id}")
return SuccessResponse(msg="删除字典数据成功")

@router.patch("/data/available/setting", summary="批量修改字典数据状态", description="批量修改字典数据状态")
async def batch_set_available_obj_controller(
data: BatchSetAvailable,
auth: AuthSchema = Depends(AuthPermission(permissions=["system:dict_data:patch"]))
) -> JSONResponse:
await DictDataService.set_obj_available_service(auth=auth, data=data)
logger.info(f"批量修改字典数据状态成功: {data.ids}")
return SuccessResponse(msg="批量修改字典数据状态成功")

@router.post('/data/export', summary="导出字典数据", description="导出字典数据")
async def export_data_list_controller(
search: DictDataQueryParams = Depends(),
Expand Down
3 changes: 1 addition & 2 deletions backend/app/api/v1/controllers/system/menu_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ async def get_obj_list_controller(
) -> JSONResponse:
result_dict_list = await MenuService.get_menu_list_service(search=search, auth=auth)
menu_items = await MenuService.convert_to_menu(result_dict_list)
result_dict = await PaginationService.get_page_obj(data_list=menu_items, page_no=page.page_no,
page_size=page.page_size)
result_dict = await PaginationService.get_page_obj(data_list=menu_items, page_no=page.page_no, page_size=page.page_size)
logger.info(f"查询菜单成功")
return SuccessResponse(data=result_dict, msg="查询菜单成功")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ async def get_obj_list_controller(

@router.get("/detail", summary="日志详情", description="日志详情")
async def get_obj_detail_controller(
id: int = Body(..., description="操作日志ID"),
id: int = Query(..., description="操作日志ID"),
auth: AuthSchema = Depends(AuthPermission(permissions=["system:log:query"]))
) -> JSONResponse:
""" 详情日志 """
Expand Down
2 changes: 2 additions & 0 deletions backend/app/api/v1/cruds/monitor/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-

Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
from typing import Dict, List, Optional, Sequence

from app.core.base_crud import CRUDBase
from app.api.v1.models.system.job_model import JobModel
from app.api.v1.schemas.system.job_schema import JobCreateSchema,JobUpdateSchema
from app.api.v1.models.monitor.job_model import JobModel
from app.api.v1.schemas.monitor.job_schema import JobCreateSchema,JobUpdateSchema
from app.api.v1.schemas.system.auth_schema import AuthSchema


Expand Down
2 changes: 2 additions & 0 deletions backend/app/api/v1/models/monitor/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-

Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# -*- coding: utf-8 -*-

from datetime import datetime
import stat
from sqlalchemy import Boolean, Column, DateTime, Float, ForeignKey, Integer, String, Text
from sqlalchemy.orm import relationship

Expand Down
1 change: 1 addition & 0 deletions backend/app/api/v1/models/system/menu_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ class MenuModel(ModelBase):
1: 目录
2: 菜单
3: 按钮/权限
4: 链接
"""
__tablename__ = "system_menu"
__table_args__ = ({'comment': '菜单表'})
Expand Down
2 changes: 2 additions & 0 deletions backend/app/api/v1/schemas/monitor/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-

2 changes: 2 additions & 0 deletions backend/app/api/v1/schemas/system/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-

2 changes: 2 additions & 0 deletions backend/app/api/v1/services/monitor/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-

Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
from app.core.exceptions import CustomException
from app.utils.cron_util import CronUtil
from app.utils.excel_util import ExcelUtil
from app.api.v1.schemas.system.job_schema import JobCreateSchema, JobUpdateSchema, JobOutSchema
from app.api.v1.params.system.job_param import JobQueryParams
from app.api.v1.cruds.system.job_crud import JobCRUD
from app.api.v1.schemas.monitor.job_schema import JobCreateSchema, JobUpdateSchema, JobOutSchema
from app.api.v1.params.monitor.job_param import JobQueryParams
from app.api.v1.cruds.monitor.job_crud import JobCRUD


class JobService:
Expand Down
2 changes: 2 additions & 0 deletions backend/app/api/v1/services/system/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-

3 changes: 1 addition & 2 deletions backend/app/api/v1/services/system/config_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@
from app.core.redis_crud import RedisCURD
from app.utils.excel_util import ExcelUtil
from app.utils.upload_util import UploadUtil
from app.core.base_schema import DeleteIdsSchema, UploadResponseSchema
from app.core.base_schema import UploadResponseSchema
from app.core.exceptions import CustomException
from app.config.setting import settings
from app.core.logger import logger


Expand Down
11 changes: 9 additions & 2 deletions backend/app/api/v1/services/system/dict_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@
from app.common.enums import RedisInitKeyConfig
from app.api.v1.params.system.dict_param import DictDataQueryParams, DictTypeQueryParams
from app.api.v1.cruds.system.dict_crud import DictDataCRUD, DictTypeCRUD
from app.core.base_schema import BatchSetAvailable
from app.core.redis_crud import RedisCURD
from app.core.exceptions import CustomException
from app.utils.excel_util import ExcelUtil
from app.core.logger import logger
from app.config.setting import settings

class DictTypeService:
"""
Expand Down Expand Up @@ -136,7 +136,10 @@ async def delete_obj_service(cls, auth: AuthSchema, redis: Redis, ids: list[int]
logger.error(f"删除字典类型失败: {e}")
raise CustomException(msg=f"删除字典类型失败")
await DictTypeCRUD(auth).delete_obj_crud(ids=ids)


@classmethod
async def set_obj_available_service(cls, auth: AuthSchema, data: BatchSetAvailable) -> None:
await DictTypeCRUD(auth).set_obj_available_crud(ids=data.ids, status=data.status)

@classmethod
async def export_obj_service(cls, data_list: List[Dict[str, Any]]) -> bytes:
Expand Down Expand Up @@ -316,6 +319,10 @@ async def delete_obj_service(cls, auth: AuthSchema, redis: Redis, ids: list[int]
raise CustomException(msg=f"删除字典数据失败 {e}")
await DictDataCRUD(auth).delete_obj_crud(ids=ids)

@classmethod
async def set_obj_available_service(cls, auth: AuthSchema, data: BatchSetAvailable) -> None:
await DictDataCRUD(auth).set_obj_available_crud(ids=data.ids, status=data.status)

@classmethod
async def export_obj_service(cls, data_list: List[Dict[str, Any]]) -> bytes:
"""导出字典数据列表"""
Expand Down
2 changes: 1 addition & 1 deletion backend/app/api/v1/services/system/user_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ async def get_current_user_info_service(cls, auth: AuthSchema) -> Dict:

# 获取菜单权限
if auth.user.is_superuser:
menu_all = await MenuCRUD(auth).get_list_crud(search={'type': ('in', [1, 2]), 'status': True})
menu_all = await MenuCRUD(auth).get_list_crud(search={'type': ('in', [1, 2, 4]), 'status': True})
menus = [MenuOutSchema.model_validate(menu).model_dump() for menu in menu_all]
else:
menus = [
Expand Down
2 changes: 2 additions & 0 deletions backend/app/api/v1/urls/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-

5 changes: 3 additions & 2 deletions backend/app/api/v1/urls/monitor_url.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
from app.api.v1.controllers.monitor.cache_controller import router as CacheRouter
from app.api.v1.controllers.monitor.online_controller import router as OnlineRouter
from app.api.v1.controllers.monitor.server_controller import router as ServerRouter

from app.api.v1.controllers.monitor.job_controller import router as JobRouter


MonitorApiRouter = APIRouter(prefix="/monitor")


MonitorApiRouter.include_router(router=JobRouter, prefix="/job", tags=["任务模块"])
MonitorApiRouter.include_router(router=CacheRouter, prefix="/cache", tags=["缓存模块"])
MonitorApiRouter.include_router(router=OnlineRouter, prefix="/online", tags=["在线用户模块"])
MonitorApiRouter.include_router(router=ServerRouter, prefix="/server", tags=["服务器模块"])
MonitorApiRouter.include_router(router=ServerRouter, prefix="/server", tags=["服务器模块"])
4 changes: 2 additions & 2 deletions backend/app/api/v1/urls/system_url.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from app.api.v1.controllers.system.notice_controller import router as NoticeRouter
from app.api.v1.controllers.system.config_controller import router as ConfigRouter
from app.api.v1.controllers.system.dict_controller import router as DictRouter
from app.api.v1.controllers.system.job_controller import router as JobRouter


SystemApiRouter = APIRouter(prefix="/system")

Expand All @@ -26,4 +26,4 @@
SystemApiRouter.include_router(router=NoticeRouter, prefix="/notice", tags=["通知模块"])
SystemApiRouter.include_router(router=ConfigRouter, prefix="/config", tags=["配置模块"])
SystemApiRouter.include_router(router=DictRouter, prefix="/dict", tags=["字典模块"])
SystemApiRouter.include_router(router=JobRouter, prefix="/job", tags=["任务模块"])

4 changes: 2 additions & 2 deletions backend/app/core/ap_scheduler.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@
from app.core.database import session_connect
from app.core.exceptions import CustomException
from app.core.logger import logger
from app.api.v1.cruds.system.job_crud import JobCRUD
from app.api.v1.models.system.job_model import JobModel
from app.api.v1.cruds.monitor.job_crud import JobCRUD
from app.api.v1.models.monitor.job_model import JobModel

# job 存储
# 处理Redis 5.0+ ACL格式的用户名:密码
Expand Down
4 changes: 2 additions & 2 deletions backend/app/core/dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,12 +155,12 @@ async def __call__(
if self.check_data_scope:
# 严格模式:要求所有权限都满足
if not all(perm in user_permissions for perm in self.permissions):
logger.error(f"用户 缺少所需的权限: {self.permissions}")
logger.error(f"用户缺少所需的权限: {self.permissions}")
raise CustomException(msg="无权限操作")
else:
# 非严格模式:满足任一权限即可
if not any(perm in user_permissions for perm in self.permissions):
logger.error(f"用户 缺少任何所需的权限: {self.permissions}")
logger.error(f"用户缺少任何所需的权限: {self.permissions}")
raise CustomException(msg="无权限操作")

return auth
Loading