upload project source code

This commit is contained in:
2026-04-30 18:49:43 +08:00
commit 9b394ba682
2277 changed files with 660945 additions and 0 deletions

View File

@@ -0,0 +1 @@
# -*- coding: utf-8 -*-

View File

@@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from app.common.response import SuccessResponse
from app.core.dependencies import db_getter, get_current_user
from app.api.v1.module_system.auth.schema import AuthSchema
from app.api.v1.module_common.activity.crud import ActivityCRUD
# 定义路由前缀
ActivityRouter = APIRouter(prefix="/activity", tags=["活动记录"])
@ActivityRouter.get("/display", summary="获取活动展示列表", description="获取前端展示格式的用户活动记录(无需登录)")
async def get_activity_display(
limit: int = 10,
db: AsyncSession = Depends(db_getter)
) -> SuccessResponse:
"""
获取活动展示列表(公开接口,无需登录)
返回格式: ["张** 预约了 宝宝起名 服务", "李** 完成了 个人改名 测算", ...]
"""
# 创建一个不需要用户信息的 auth 对象
auth = AuthSchema(db=db, check_data_scope=False)
crud = ActivityCRUD(auth)
data = await crud.get_display_list(limit=limit)
return SuccessResponse(data=data)
@ActivityRouter.post("/create", summary="创建活动记录", description="创建活动记录(需要登录)")
async def create_activity(
user_name: str,
action: str,
service_name: str,
service_type: str = None,
sort_order: int = 0,
auth: AuthSchema = Depends(get_current_user)
) -> SuccessResponse:
"""
创建活动记录(需要登录)
"""
crud = ActivityCRUD(auth)
data = {
"user_name": user_name,
"action": action,
"service_name": service_name,
"service_type": service_type,
"sort_order": sort_order
}
result = await crud.create(data)
return SuccessResponse(data={"id": result.id}, msg="创建成功")

View File

@@ -0,0 +1,37 @@
# -*- coding: utf-8 -*-
from typing import List
from app.core.base_crud import CRUDBase
from app.api.v1.module_common.activity.model import ActivityModel
from app.api.v1.module_common.activity.schema import ActivityCreate, ActivityUpdate
from app.api.v1.module_system.auth.schema import AuthSchema
class ActivityCRUD(CRUDBase[ActivityModel, ActivityCreate, ActivityUpdate]):
"""活动记录CRUD"""
def __init__(self, auth: AuthSchema) -> None:
super().__init__(ActivityModel, auth)
async def get_display_list(self, limit: int = 10) -> List[str]:
"""
获取前端展示格式的活动列表
参数:
- limit: 返回数量限制
返回:
- List[str]: 格式化的活动文本列表
"""
activities = await self.list(
search={"status": "0"},
order_by=[{"sort_order": "asc"}, {"created_time": "desc"}]
)
result = []
for activity in activities[:limit]:
text = f"{activity.user_name} {activity.action}{activity.service_name} {activity.service_type or ''}".strip()
result.append(text)
return result

View File

@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from sqlalchemy import String, Integer
from sqlalchemy.orm import Mapped, mapped_column
from app.core.base_model import ModelMixin
class ActivityModel(ModelMixin):
"""用户活动记录表"""
__tablename__ = "biz_activity"
user_name: Mapped[str] = mapped_column(String(50), nullable=False, comment="用户名(脱敏)")
action: Mapped[str] = mapped_column(String(50), nullable=False, comment="操作类型(预约/完成/购买/查看)")
service_name: Mapped[str] = mapped_column(String(100), nullable=False, comment="服务名称")
service_type: Mapped[str] = mapped_column(String(50), nullable=True, comment="服务类型")
sort_order: Mapped[int] = mapped_column(Integer, default=0, nullable=False, comment="排序顺序")

View File

@@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
from pydantic import BaseModel, Field
from typing import Optional
from datetime import datetime
class ActivityBase(BaseModel):
"""活动记录基础模型"""
user_name: str = Field(..., max_length=50, description="用户名(脱敏)")
action: str = Field(..., max_length=50, description="操作类型")
service_name: str = Field(..., max_length=100, description="服务名称")
service_type: Optional[str] = Field(None, max_length=50, description="服务类型")
sort_order: int = Field(default=0, description="排序顺序")
class ActivityCreate(ActivityBase):
"""创建活动记录"""
pass
class ActivityUpdate(BaseModel):
"""更新活动记录"""
user_name: Optional[str] = Field(None, max_length=50)
action: Optional[str] = Field(None, max_length=50)
service_name: Optional[str] = Field(None, max_length=100)
service_type: Optional[str] = Field(None, max_length=50)
sort_order: Optional[int] = None
class ActivityOut(ActivityBase):
"""活动记录输出模型"""
id: int
created_time: datetime
class Config:
from_attributes = True
class ActivityDisplay(BaseModel):
"""前端展示格式"""
text: str = Field(..., description="展示文本")