zy-b / module_admin /controller /designer_public_controller.py
spongyicybulk's picture
Deploy zy-b backend
96cbd66 verified
Raw
History Blame Contribute Delete
11.6 kB
from typing import Annotated
from fastapi import Path, Query, Request, Response
from sqlalchemy.ext.asyncio import AsyncSession
from common.aspect.db_seesion import DBSessionDependency
from common.router import APIRouterPro
from common.vo import DataResponseModel, PageResponseModel
from exceptions.exception import ServiceWarning
from module_admin.dao.designer_dao import DesignerWorkDao
from module_admin.entity.vo.designer_vo import (
DesignerCategoryModel,
DesignerCategoryPageQueryModel,
DesignerProfileModel,
DesignerProfilePageQueryModel,
DesignerWorkModel,
DesignerWorkPageQueryModel,
)
from module_admin.service.designer_service import DesignerCategoryService, DesignerProfileService, DesignerWorkService
from utils.log_util import logger
from utils.response_util import ResponseUtil
designer_public_controller = APIRouterPro(
prefix='/public/designer', order_num=21, tags=['设计师公开主页']
)
async def _get_profile_by_slug_or_404(query_db: AsyncSession, designer_slug: str) -> DesignerProfileModel:
profile_result = await DesignerProfileService.get_profile_by_slug_services(
query_db, designer_slug=designer_slug, only_active=True
)
if not profile_result.profile_id:
raise ServiceWarning(message='设计师不存在或未启用')
return profile_result
@designer_public_controller.get(
'/default',
summary='获取默认设计师公开档案接口',
description='用于获取默认设计师公开档案信息',
response_model=DataResponseModel[DesignerProfileModel],
)
async def get_default_public_designer_profile(
request: Request,
query_db: Annotated[AsyncSession, DBSessionDependency()],
) -> Response:
profile_result = await DesignerProfileService.get_default_profile_services(query_db)
if not profile_result.profile_id:
raise ServiceWarning(message='默认设计师未配置')
logger.info('获取默认设计师公开档案成功')
return ResponseUtil.success(data=profile_result)
@designer_public_controller.get(
'/list',
summary='获取公开设计师列表接口',
description='用于官网获取启用中的设计师档案列表(支持关键词搜索、分页)',
response_model=PageResponseModel[DesignerProfileModel],
)
async def get_public_designer_list(
request: Request,
profile_page_query: Annotated[DesignerProfilePageQueryModel, Query()],
query_db: Annotated[AsyncSession, DBSessionDependency()],
) -> Response:
profile_page_query.status = '0'
profile_list_result = await DesignerProfileService.get_profile_list_services(
query_db, profile_page_query, is_page=True
)
logger.info('获取公开设计师列表成功')
return ResponseUtil.success(model_content=profile_list_result)
@designer_public_controller.get(
'/slug/{designer_slug}/profile',
summary='根据slug获取设计师公开档案接口',
description='用于根据设计师slug获取公开档案信息',
response_model=DataResponseModel[DesignerProfileModel],
)
async def get_public_designer_profile_by_slug(
request: Request,
designer_slug: Annotated[str, Path(description='设计师访问标识')],
query_db: Annotated[AsyncSession, DBSessionDependency()],
) -> Response:
profile_result = await _get_profile_by_slug_or_404(query_db, designer_slug)
logger.info(f'获取slug为{designer_slug}的公开档案成功')
return ResponseUtil.success(data=profile_result)
@designer_public_controller.get(
'/slug/{designer_slug}/categories',
summary='根据slug获取设计师公开分类列表接口',
description='用于根据设计师slug获取公开作品分类列表',
)
async def get_public_designer_categories_by_slug(
request: Request,
designer_slug: Annotated[str, Path(description='设计师访问标识')],
query_db: Annotated[AsyncSession, DBSessionDependency()],
) -> Response:
profile_result = await _get_profile_by_slug_or_404(query_db, designer_slug)
query_object = DesignerCategoryPageQueryModel(profileId=profile_result.profile_id, status='0')
category_list_result = await DesignerCategoryService.get_category_list_services(
query_db, query_object, is_page=False
)
logger.info(f'获取slug为{designer_slug}的公开分类列表成功')
return ResponseUtil.success(data=category_list_result)
@designer_public_controller.get(
'/slug/{designer_slug}/works',
summary='根据slug获取设计师公开作品列表接口',
description='用于根据设计师slug获取已发布的作品列表(支持分类筛选、分页)',
response_model=PageResponseModel[DesignerWorkModel],
)
async def get_public_designer_works_by_slug(
request: Request,
designer_slug: Annotated[str, Path(description='设计师访问标识')],
work_page_query: Annotated[DesignerWorkPageQueryModel, Query()],
query_db: Annotated[AsyncSession, DBSessionDependency()],
) -> Response:
profile_result = await _get_profile_by_slug_or_404(query_db, designer_slug)
work_page_query.profile_id = profile_result.profile_id
work_page_query.status = '0'
work_list_result = await DesignerWorkService.get_work_list_services(query_db, work_page_query, is_page=True)
logger.info(f'获取slug为{designer_slug}的公开作品列表成功')
return ResponseUtil.success(model_content=work_list_result)
@designer_public_controller.get(
'/slug/{designer_slug}/works/{work_id}',
summary='根据slug获取设计师作品详情接口',
description='用于根据设计师slug获取作品详情并增加浏览次数',
response_model=DataResponseModel[DesignerWorkModel],
)
async def get_public_designer_work_detail_by_slug(
request: Request,
designer_slug: Annotated[str, Path(description='设计师访问标识')],
work_id: Annotated[int, Path(description='作品ID')],
query_db: Annotated[AsyncSession, DBSessionDependency()],
) -> Response:
profile_result = await _get_profile_by_slug_or_404(query_db, designer_slug)
work_detail_result = await DesignerWorkService.work_detail_services(query_db, work_id)
if work_detail_result.profile_id != profile_result.profile_id:
return ResponseUtil.failure(msg='作品不存在')
await DesignerWorkDao.increment_view_count(query_db, work_id)
await query_db.commit()
work_detail_result = await DesignerWorkService.work_detail_services(query_db, work_id)
logger.info(f'获取slug为{designer_slug}、work_id为{work_id}的作品详情成功')
return ResponseUtil.success(data=work_detail_result)
@designer_public_controller.get(
'/slug/{designer_slug}/featured',
summary='根据slug获取设计师精选作品接口',
description='用于根据设计师slug获取精选作品列表',
)
async def get_public_designer_featured_works_by_slug(
request: Request,
designer_slug: Annotated[str, Path(description='设计师访问标识')],
query_db: Annotated[AsyncSession, DBSessionDependency()],
) -> Response:
profile_result = await _get_profile_by_slug_or_404(query_db, designer_slug)
query_object = DesignerWorkPageQueryModel(profileId=profile_result.profile_id, isFeatured='1', status='0')
featured_list_result = await DesignerWorkService.get_work_list_services(query_db, query_object, is_page=False)
logger.info(f'获取slug为{designer_slug}的精选作品列表成功')
return ResponseUtil.success(data=featured_list_result)
@designer_public_controller.get(
'/{profile_id}/profile',
summary='获取设计师公开档案接口',
description='用于获取设计师公开档案信息',
response_model=DataResponseModel[DesignerProfileModel],
)
async def get_public_designer_profile(
request: Request,
profile_id: Annotated[int, Path(description='设计师档案ID')],
query_db: Annotated[AsyncSession, DBSessionDependency()],
) -> Response:
profile_result = await DesignerProfileService.get_profile_services(query_db, profile_id)
logger.info(f'获取profile_id为{profile_id}的公开档案成功')
return ResponseUtil.success(data=profile_result)
@designer_public_controller.get(
'/{profile_id}/categories',
summary='获取设计师作品分类列表接口',
description='用于获取设计师公开作品分类列表',
)
async def get_public_designer_categories(
request: Request,
profile_id: Annotated[int, Path(description='设计师档案ID')],
query_db: Annotated[AsyncSession, DBSessionDependency()],
) -> Response:
query_object = DesignerCategoryPageQueryModel(profileId=profile_id, status='0')
category_list_result = await DesignerCategoryService.get_category_list_services(
query_db, query_object, is_page=False
)
logger.info(f'获取profile_id为{profile_id}的分类列表成功')
return ResponseUtil.success(data=category_list_result)
@designer_public_controller.get(
'/{profile_id}/works',
summary='获取设计师公开作品列表接口',
description='用于获取设计师已发布的作品列表(支持分类筛选、分页)',
response_model=PageResponseModel[DesignerWorkModel],
)
async def get_public_designer_works(
request: Request,
profile_id: Annotated[int, Path(description='设计师档案ID')],
work_page_query: Annotated[DesignerWorkPageQueryModel, Query()],
query_db: Annotated[AsyncSession, DBSessionDependency()],
) -> Response:
work_page_query.profile_id = profile_id
work_page_query.status = '0'
work_list_result = await DesignerWorkService.get_work_list_services(query_db, work_page_query, is_page=True)
logger.info(f'获取profile_id为{profile_id}的公开作品列表成功')
return ResponseUtil.success(model_content=work_list_result)
@designer_public_controller.get(
'/{profile_id}/works/{work_id}',
summary='获取设计师作品详情接口',
description='用于获取设计师作品详情并增加浏览次数',
response_model=DataResponseModel[DesignerWorkModel],
)
async def get_public_designer_work_detail(
request: Request,
profile_id: Annotated[int, Path(description='设计师档案ID')],
work_id: Annotated[int, Path(description='作品ID')],
query_db: Annotated[AsyncSession, DBSessionDependency()],
) -> Response:
await DesignerWorkDao.increment_view_count(query_db, work_id)
await query_db.commit()
work_detail_result = await DesignerWorkService.work_detail_services(query_db, work_id)
logger.info(f'获取work_id为{work_id}的作品详情成功')
return ResponseUtil.success(data=work_detail_result)
@designer_public_controller.get(
'/{profile_id}/featured',
summary='获取设计师精选作品接口',
description='用于获取设计师精选作品列表',
)
async def get_public_designer_featured_works(
request: Request,
profile_id: Annotated[int, Path(description='设计师档案ID')],
query_db: Annotated[AsyncSession, DBSessionDependency()],
) -> Response:
query_object = DesignerWorkPageQueryModel(profileId=profile_id, isFeatured='1', status='0')
featured_list_result = await DesignerWorkService.get_work_list_services(query_db, query_object, is_page=False)
logger.info(f'获取profile_id为{profile_id}的精选作品列表成功')
return ResponseUtil.success(data=featured_list_result)