From ef7e2b073fdf0d52ff0d70b028bc5e2fff22fd93 Mon Sep 17 00:00:00 2001 From: haotian <2421912570@qq.com> Date: Mon, 28 Jul 2025 14:22:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BC=95=E5=AF=BC=E8=AF=8D?= =?UTF-8?q?=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-fastapi-backend/config/__init__.py | 0 ruoyi-fastapi-backend/exceptions/__init__.py | 0 ruoyi-fastapi-backend/middlewares/__init__.py | 0 .../module_admin/__init__.py | 0 .../module_admin/annotation/__init__.py | 0 .../module_admin/aspect/__init__.py | 0 .../module_admin/controller/__init__.py | 0 .../controller/words_controller.py | 106 ++++++++++++++ .../module_admin/dao/__init__.py | 0 .../module_admin/dao/words_dao.py | 118 ++++++++++++++++ .../module_admin/entity/do/__init__.py | 0 .../module_admin/entity/do/words_do.py | 22 +++ .../module_admin/entity/vo/__init__.py | 0 .../module_admin/entity/vo/words_vo.py | 63 +++++++++ .../module_admin/service/__init__.py | 0 .../module_admin/service/words_service.py | 133 ++++++++++++++++++ ruoyi-fastapi-backend/server.py | 2 + 17 files changed, 444 insertions(+) create mode 100644 ruoyi-fastapi-backend/config/__init__.py create mode 100644 ruoyi-fastapi-backend/exceptions/__init__.py create mode 100644 ruoyi-fastapi-backend/middlewares/__init__.py create mode 100644 ruoyi-fastapi-backend/module_admin/__init__.py create mode 100644 ruoyi-fastapi-backend/module_admin/annotation/__init__.py create mode 100644 ruoyi-fastapi-backend/module_admin/aspect/__init__.py create mode 100644 ruoyi-fastapi-backend/module_admin/controller/__init__.py create mode 100644 ruoyi-fastapi-backend/module_admin/controller/words_controller.py create mode 100644 ruoyi-fastapi-backend/module_admin/dao/__init__.py create mode 100644 ruoyi-fastapi-backend/module_admin/dao/words_dao.py create mode 100644 ruoyi-fastapi-backend/module_admin/entity/do/__init__.py create mode 100644 ruoyi-fastapi-backend/module_admin/entity/do/words_do.py create mode 100644 ruoyi-fastapi-backend/module_admin/entity/vo/__init__.py create mode 100644 ruoyi-fastapi-backend/module_admin/entity/vo/words_vo.py create mode 100644 ruoyi-fastapi-backend/module_admin/service/__init__.py create mode 100644 ruoyi-fastapi-backend/module_admin/service/words_service.py diff --git a/ruoyi-fastapi-backend/config/__init__.py b/ruoyi-fastapi-backend/config/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ruoyi-fastapi-backend/exceptions/__init__.py b/ruoyi-fastapi-backend/exceptions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ruoyi-fastapi-backend/middlewares/__init__.py b/ruoyi-fastapi-backend/middlewares/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ruoyi-fastapi-backend/module_admin/__init__.py b/ruoyi-fastapi-backend/module_admin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ruoyi-fastapi-backend/module_admin/annotation/__init__.py b/ruoyi-fastapi-backend/module_admin/annotation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ruoyi-fastapi-backend/module_admin/aspect/__init__.py b/ruoyi-fastapi-backend/module_admin/aspect/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ruoyi-fastapi-backend/module_admin/controller/__init__.py b/ruoyi-fastapi-backend/module_admin/controller/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ruoyi-fastapi-backend/module_admin/controller/words_controller.py b/ruoyi-fastapi-backend/module_admin/controller/words_controller.py new file mode 100644 index 0000000..d00a43d --- /dev/null +++ b/ruoyi-fastapi-backend/module_admin/controller/words_controller.py @@ -0,0 +1,106 @@ +from datetime import datetime +from fastapi import APIRouter, Depends, Form, Request +from pydantic_validation_decorator import ValidateFields +from sqlalchemy.ext.asyncio import AsyncSession +from config.enums import BusinessType +from config.get_db import get_db +from module_admin.annotation.log_annotation import Log +from module_admin.aspect.interface_auth import CheckUserInterfaceAuth +from module_admin.entity.vo.user_vo import CurrentUserModel +from module_admin.service.login_service import LoginService +from module_admin.service.words_service import WordsService +from module_admin.entity.vo.words_vo import DeleteWordsModel, WordsModel, WordsPageQueryModel +from utils.common_util import bytes2file_response +from utils.log_util import logger +from utils.page_util import PageResponseModel +from utils.response_util import ResponseUtil + + + +wordsController = APIRouter(prefix='/guide/words', dependencies=[Depends(LoginService.get_current_user)]) + + +@wordsController.post( + '/list', response_model=PageResponseModel + # , dependencies=[Depends(CheckUserInterfaceAuth('guide:words:list'))] +) +async def get_guide_words_list( + request: Request, + words_page_query: WordsPageQueryModel = Depends(WordsPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + # 获取分页数据 + words_page_query_result = await WordsService.get_words_list_services(query_db, words_page_query, is_page=True) + logger.info('获取成功') + + return ResponseUtil.success(model_content=words_page_query_result) + + +@wordsController.post('', dependencies=[Depends(CheckUserInterfaceAuth('guide:words:add'))]) +@ValidateFields(validate_model='add_words') +@Log(title='引导词', business_type=BusinessType.INSERT) +async def add_guide_words( + request: Request, + add_words: WordsModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + add_words.create_time = datetime.now() + add_words.update_time = datetime.now() + add_words.create_by = current_user.user.user_name + add_words_result = await WordsService.add_words_services(query_db, add_words) + logger.info(add_words_result.message) + + return ResponseUtil.success(msg=add_words_result.message) + + +@wordsController.put('', dependencies=[Depends(CheckUserInterfaceAuth('guide:words:edit'))]) +@ValidateFields(validate_model='edit_words') +@Log(title='引导词', business_type=BusinessType.UPDATE) +async def edit_guide_words( + request: Request, + edit_words: WordsModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + edit_words.update_by = current_user.user.user_name + edit_words.update_time = datetime.now() + edit_words_result = await WordsService.edit_words_services(query_db, edit_words) + logger.info(edit_words_result.message) + + return ResponseUtil.success(msg=edit_words_result.message) + + +@wordsController.delete('/{guide_ids}', dependencies=[Depends(CheckUserInterfaceAuth('guide:words:remove'))]) +@Log(title='引导词', business_type=BusinessType.DELETE) +async def delete_guide_words(request: Request, guide_ids: str, query_db: AsyncSession = Depends(get_db)): + delete_words = DeleteWordsModel(guideIds=guide_ids) + delete_words_result = await WordsService.delete_words_services(query_db, delete_words) + logger.info(delete_words_result.message) + + return ResponseUtil.success(msg=delete_words_result.message) + + +@wordsController.get( + '/{guide_id}', response_model=WordsModel, dependencies=[Depends(CheckUserInterfaceAuth('guide:words:query'))] +) +async def query_detail_guide_words(request: Request, guide_id: int, query_db: AsyncSession = Depends(get_db)): + words_detail_result = await WordsService.words_detail_services(query_db, guide_id) + logger.info(f'获取guide_id为{guide_id}的信息成功') + + return ResponseUtil.success(data=words_detail_result) + + +@wordsController.post('/export', dependencies=[Depends(CheckUserInterfaceAuth('guide:words:export'))]) +@Log(title='引导词', business_type=BusinessType.EXPORT) +async def export_guide_words_list( + request: Request, + words_page_query: WordsPageQueryModel = Form(), + query_db: AsyncSession = Depends(get_db), +): + # 获取全量数据 + words_query_result = await WordsService.get_words_list_services(query_db, words_page_query, is_page=False) + words_export_result = await WordsService.export_words_list_services(words_query_result) + logger.info('导出成功') + + return ResponseUtil.streaming(data=bytes2file_response(words_export_result)) diff --git a/ruoyi-fastapi-backend/module_admin/dao/__init__.py b/ruoyi-fastapi-backend/module_admin/dao/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ruoyi-fastapi-backend/module_admin/dao/words_dao.py b/ruoyi-fastapi-backend/module_admin/dao/words_dao.py new file mode 100644 index 0000000..fb3c8cf --- /dev/null +++ b/ruoyi-fastapi-backend/module_admin/dao/words_dao.py @@ -0,0 +1,118 @@ +from sqlalchemy import delete, select, update +from sqlalchemy.ext.asyncio import AsyncSession +from module_admin.entity.do.words_do import GuideWords +from module_admin.entity.vo.words_vo import WordsModel, WordsPageQueryModel +from utils.page_util import PageUtil + + +class WordsDao: + """ + 引导词模块数据库操作层 + """ + + @classmethod + async def get_words_detail_by_id(cls, db: AsyncSession, guide_id: int): + """ + 根据引导词id获取引导词详细信息 + + :param db: orm对象 + :param guide_id: 引导词id + :return: 引导词信息对象 + """ + words_info = ( + ( + await db.execute( + select(GuideWords) + .where( + GuideWords.guide_id == guide_id + ) + ) + ) + .scalars() + .first() + ) + + return words_info + + @classmethod + async def get_words_detail_by_info(cls, db: AsyncSession, words: WordsModel): + """ + 根据引导词参数获取引导词信息 + + :param db: orm对象 + :param words: 引导词参数对象 + :return: 引导词信息对象 + """ + words_info = ( + ( + await db.execute( + select(GuideWords).where( + ) + ) + ) + .scalars() + .first() + ) + + return words_info + + @classmethod + async def get_words_list(cls, db: AsyncSession, query_object: WordsPageQueryModel, is_page: bool = False): + """ + 根据查询参数获取引导词列表信息 + + :param db: orm对象 + :param query_object: 查询参数对象 + :param is_page: 是否开启分页 + :return: 引导词列表信息对象 + """ + query = ( + select(GuideWords) + .where( + GuideWords.type == query_object.type if query_object.type else True, + GuideWords.text == query_object.text if query_object.text else True, + ) + .order_by(GuideWords.guide_id) + .distinct() + ) + words_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) + + return words_list + + @classmethod + async def add_words_dao(cls, db: AsyncSession, words: WordsModel): + """ + 新增引导词数据库操作 + + :param db: orm对象 + :param words: 引导词对象 + :return: + """ + db_words = GuideWords(**words.model_dump(exclude={})) + db.add(db_words) + await db.flush() + + return db_words + + @classmethod + async def edit_words_dao(cls, db: AsyncSession, words: dict): + """ + 编辑引导词数据库操作 + + :param db: orm对象 + :param words: 需要更新的引导词字典 + :return: + """ + await db.execute(update(GuideWords), [words]) + + @classmethod + async def delete_words_dao(cls, db: AsyncSession, words: WordsModel): + """ + 删除引导词数据库操作 + + :param db: orm对象 + :param words: 引导词对象 + :return: + """ + await db.execute(delete(GuideWords).where(GuideWords.guide_id.in_([words.guide_id]))) + diff --git a/ruoyi-fastapi-backend/module_admin/entity/do/__init__.py b/ruoyi-fastapi-backend/module_admin/entity/do/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ruoyi-fastapi-backend/module_admin/entity/do/words_do.py b/ruoyi-fastapi-backend/module_admin/entity/do/words_do.py new file mode 100644 index 0000000..12a680f --- /dev/null +++ b/ruoyi-fastapi-backend/module_admin/entity/do/words_do.py @@ -0,0 +1,22 @@ +from sqlalchemy import CHAR, Column, DateTime, String, BigInteger +from config.database import Base + + +class GuideWords(Base): + """ + 引导词表 + """ + + __tablename__ = 'guide_words' + + guide_id = Column(BigInteger, primary_key=True, autoincrement=True, nullable=False, comment='引导词id') + type = Column(String(2), nullable=True, comment='引导词类型') + text = Column(String(1024), nullable=True, comment='文本内容') + create_time = Column(DateTime, nullable=True, comment='创建时间') + update_time = Column(DateTime, nullable=True, comment='修改时间') + create_by = Column(String(64), nullable=True, comment='创建者') + remark = Column(String(500), nullable=True, comment='备注') + del_flag = Column(CHAR(1), nullable=False, comment='删除标志(0代表存在 2代表删除)') + + + diff --git a/ruoyi-fastapi-backend/module_admin/entity/vo/__init__.py b/ruoyi-fastapi-backend/module_admin/entity/vo/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ruoyi-fastapi-backend/module_admin/entity/vo/words_vo.py b/ruoyi-fastapi-backend/module_admin/entity/vo/words_vo.py new file mode 100644 index 0000000..7ce91a5 --- /dev/null +++ b/ruoyi-fastapi-backend/module_admin/entity/vo/words_vo.py @@ -0,0 +1,63 @@ +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field +from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import NotBlank +from typing import Optional +from module_admin.annotation.pydantic_annotation import as_query + + + + +class WordsModel(BaseModel): + """ + 引导词表对应pydantic模型 + """ + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + guide_id: Optional[int] = Field(default=None, description='引导词id') + type: Optional[str] = Field(default=None, description='引导词类型') + text: Optional[str] = Field(default=None, description='文本内容') + create_time: Optional[datetime] = Field(default=None, description='创建时间') + update_time: Optional[datetime] = Field(default=None, description='修改时间') + create_by: Optional[str] = Field(default=None, description='创建者') + remark: Optional[str] = Field(default=None, description='备注') + del_flag: Optional[str] = Field(default=None, description='删除标志(0代表存在 2代表删除)') + + + + + @NotBlank(field_name='del_flag', message='删除标志不能为空') + def get_del_flag(self): + return self.del_flag + + def validate_fields(self): + self.get_del_flag() + + + + +class WordsQueryModel(WordsModel): + """ + 引导词不分页查询模型 + """ + pass + + +@as_query +class WordsPageQueryModel(WordsQueryModel): + """ + 引导词分页查询模型 + """ + + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') + + +class DeleteWordsModel(BaseModel): + """ + 删除引导词模型 + """ + + model_config = ConfigDict(alias_generator=to_camel) + + guide_ids: str = Field(description='需要删除的引导词id') diff --git a/ruoyi-fastapi-backend/module_admin/service/__init__.py b/ruoyi-fastapi-backend/module_admin/service/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ruoyi-fastapi-backend/module_admin/service/words_service.py b/ruoyi-fastapi-backend/module_admin/service/words_service.py new file mode 100644 index 0000000..7837b23 --- /dev/null +++ b/ruoyi-fastapi-backend/module_admin/service/words_service.py @@ -0,0 +1,133 @@ +from sqlalchemy.ext.asyncio import AsyncSession +from typing import List +from config.constant import CommonConstant +from exceptions.exception import ServiceException +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.dao.words_dao import WordsDao +from module_admin.entity.vo.words_vo import DeleteWordsModel, WordsModel, WordsPageQueryModel +from utils.common_util import CamelCaseUtil +from utils.excel_util import ExcelUtil + + +class WordsService: + """ + 引导词模块服务层 + """ + + @classmethod + async def get_words_list_services( + cls, query_db: AsyncSession, query_object: WordsPageQueryModel, is_page: bool = False + ): + """ + 获取引导词列表信息service + + :param query_db: orm对象 + :param query_object: 查询参数对象 + :param is_page: 是否开启分页 + :return: 引导词列表信息对象 + """ + words_list_result = await WordsDao.get_words_list(query_db, query_object, is_page) + + return words_list_result + + + @classmethod + async def add_words_services(cls, query_db: AsyncSession, page_object: WordsModel): + """ + 新增引导词信息service + + :param query_db: orm对象 + :param page_object: 新增引导词对象 + :return: 新增引导词校验结果 + """ + try: + await WordsDao.add_words_dao(query_db, page_object) + await query_db.commit() + return CrudResponseModel(is_success=True, message='新增成功') + except Exception as e: + await query_db.rollback() + raise e + + @classmethod + async def edit_words_services(cls, query_db: AsyncSession, page_object: WordsModel): + """ + 编辑引导词信息service + + :param query_db: orm对象 + :param page_object: 编辑引导词对象 + :return: 编辑引导词校验结果 + """ + edit_words = page_object.model_dump(exclude_unset=True, exclude={'create_time', 'create_by', }) + words_info = await cls.words_detail_services(query_db, page_object.guide_id) + if words_info.guide_id: + try: + await WordsDao.edit_words_dao(query_db, edit_words) + await query_db.commit() + return CrudResponseModel(is_success=True, message='更新成功') + except Exception as e: + await query_db.rollback() + raise e + else: + raise ServiceException(message='引导词不存在') + + @classmethod + async def delete_words_services(cls, query_db: AsyncSession, page_object: DeleteWordsModel): + """ + 删除引导词信息service + + :param query_db: orm对象 + :param page_object: 删除引导词对象 + :return: 删除引导词校验结果 + """ + if page_object.guide_ids: + guide_id_list = page_object.guide_ids.split(',') + try: + for guide_id in guide_id_list: + await WordsDao.delete_words_dao(query_db, WordsModel(guideId=guide_id)) + await query_db.commit() + return CrudResponseModel(is_success=True, message='删除成功') + except Exception as e: + await query_db.rollback() + raise e + else: + raise ServiceException(message='传入引导词id为空') + + @classmethod + async def words_detail_services(cls, query_db: AsyncSession, guide_id: int): + """ + 获取引导词详细信息service + + :param query_db: orm对象 + :param guide_id: 引导词id + :return: 引导词id对应的信息 + """ + words = await WordsDao.get_words_detail_by_id(query_db, guide_id=guide_id) + if words: + result = WordsModel(**CamelCaseUtil.transform_result(words)) + else: + result = WordsModel(**dict()) + + return result + + @staticmethod + async def export_words_list_services(words_list: List): + """ + 导出引导词信息service + + :param words_list: 引导词信息列表 + :return: 引导词信息对应excel的二进制数据 + """ + # 创建一个映射字典,将英文键映射到中文键 + mapping_dict = { + 'guideId': '引导词id', + 'type': '引导词类型', + 'text': '文本内容', + 'createTime': '创建时间', + 'updateTime': '修改时间', + 'createBy': '创建者', + 'remark': '备注', + 'delFlag': '删除标志', + } + binary_data = ExcelUtil.export_list2excel(words_list, mapping_dict) + + return binary_data diff --git a/ruoyi-fastapi-backend/server.py b/ruoyi-fastapi-backend/server.py index 2668621..31ad36c 100644 --- a/ruoyi-fastapi-backend/server.py +++ b/ruoyi-fastapi-backend/server.py @@ -23,6 +23,7 @@ from module_admin.controller.role_controller import roleController from module_admin.controller.server_controller import serverController from module_admin.controller.user_controller import userController from module_admin.controller.test_controller import testController +from module_admin.controller.words_controller import wordsController from module_generator.controller.gen_controller import genController from sub_applications.handle import handle_sub_applications from utils.common_util import worship @@ -81,6 +82,7 @@ controller_list = [ {'router': commonController, 'tags': ['通用模块']}, {'router': genController, 'tags': ['代码生成']}, {'router': testController, 'tags': ['测试模块']}, + {'router': wordsController, 'tags': ['引导词管理']} ] for controller in controller_list: