This commit is contained in:
aaron 2025-03-09 23:37:33 +08:00
parent b1b7e05b99
commit 1dabf231b1
9 changed files with 406 additions and 2 deletions

View File

@ -164,4 +164,19 @@ async def delete_community(
return error_response(code=404, message="社区不存在")
db.commit()
return success_response(message="社区已删除")
return success_response(message="社区已删除")
#查询小区
@router.get("/search_by_name/{name}", response_model=ResponseModel)
async def search_community_by_name(
name: str,
db: Session = Depends(get_db)
):
"""通过小区名称搜索小区"""
communities = db.query(CommunityDB).filter(CommunityDB.name.ilike(f"%{name}%")).all()
results=[]
for community in communities:
results.append(CommunityInfo.model_validate(community))
return success_response(data=results)

View File

@ -0,0 +1,172 @@
from fastapi import APIRouter, Depends, HTTPException, Query, Path
from sqlalchemy.orm import Session
from typing import List, Optional
from pydantic import BaseModel, Field
from app.models.database import get_db
from app.models.community_set import CommunitySet
from app.api.deps import get_current_user, get_admin_user
from app.models.user import UserDB
from app.models.community import CommunityDB
from app.models.community_set_mapping import CommunitySetMapping
from datetime import datetime
from app.core.response import success_response, error_response
router = APIRouter()
# 请求和响应模型
class CommunitySetCreate(BaseModel):
set_name: str = Field(..., min_length=1, max_length=100, description="集合名称")
user_id: int = Field(..., description="用户ID")
class CommunitySetUpdate(BaseModel):
set_name: str = Field(..., min_length=1, max_length=100, description="集合名称")
user_id: int = Field(..., description="用户ID")
class CommunitySetInfo(BaseModel):
id: int
set_name: str
user_id: int
create_time: datetime
update_time: datetime
user_name: Optional[str] = None
class Config:
from_attributes = True
# 创建社区集合
@router.post("/", response_model=CommunitySetInfo)
async def create_community_set(
community_set: CommunitySetCreate,
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_admin_user)
):
"""创建社区集合"""
new_set = CommunitySet(
set_name=community_set.set_name,
user_id=community_set.user_id
)
db.add(new_set)
db.commit()
db.refresh(new_set)
return success_response(data=CommunitySetInfo.model_validate(new_set))
# 获取当前用户的所有社区集合
@router.get("/list/user", response_model=List[CommunitySetInfo])
async def get_user_community_sets(
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user),
skip: int = Query(0, ge=0),
limit: int = Query(100, ge=1, le=100)
):
"""获取当前用户的所有社区集合"""
sets = db.query(CommunitySet).filter(
CommunitySet.user_id == current_user.userid
).offset(skip).limit(limit).all()
results = [CommunitySetInfo.model_validate(set) for set in sets]
total = db.query(CommunitySet).filter(
CommunitySet.user_id == current_user.userid
).count()
return success_response(data={"total": total, "items": results})
# 获取特定社区集合
@router.get("/{set_id}", response_model=CommunitySetInfo)
async def get_community_set(
set_id: int = Path(..., ge=1),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user)
):
"""获取特定社区集合"""
community_set = db.query(CommunitySet).filter(
CommunitySet.id == set_id,
CommunitySet.user_id == current_user.userid
).first()
if not community_set:
raise HTTPException(status_code=404, detail="社区集合不存在")
result = CommunitySetInfo.model_validate(community_set)
return success_response(data=result)
# 管理员获取所有社区集合
@router.get("/list/all", response_model=List[CommunitySetInfo])
async def get_all_community_sets(
skip: int = Query(0, ge=0),
limit: int = Query(20, ge=1, le=100),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_admin_user)
):
"""管理员获取所有社区集合"""
# 获取所有社区集合, join 社区名字和 用户名字
sets = db.query(CommunitySet, UserDB.nickname.label("user_name")).join(UserDB, CommunitySet.user_id == UserDB.userid).offset(skip).limit(limit).all()
results = []
for set in sets:
# 查询集合下有多少个社区
community_count = db.query(CommunitySetMapping).filter(
CommunitySetMapping.set_id == set.CommunitySet.id
).count()
result= {
"id": set.CommunitySet.id,
"set_name": set.CommunitySet.set_name,
"user_id": set.CommunitySet.user_id,
"user_name": set.user_name,
"create_time": set.CommunitySet.create_time,
"update_time": set.CommunitySet.update_time,
"community_count": community_count
}
results.append(result)
total = db.query(CommunitySet).count()
return success_response(data={"total": total, "items": results})
# 更新社区集合
@router.put("/{set_id}", response_model=CommunitySetInfo)
async def update_community_set(
community_set: CommunitySetUpdate,
set_id: int = Path(..., ge=1),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_admin_user)
):
"""更新社区集合"""
db_set = db.query(CommunitySet).filter(
CommunitySet.id == set_id
).first()
if not db_set:
return error_response(code=404, message="社区集合不存在")
db_set.set_name = community_set.set_name
db_set.user_id = community_set.user_id
db.commit()
db.refresh(db_set)
return success_response(data= CommunitySetInfo.model_validate(db_set))
# 删除社区集合
@router.delete("/{set_id}", response_model=dict)
async def delete_community_set(
set_id: int = Path(..., ge=1),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user)
):
"""删除社区集合"""
db_set = db.query(CommunitySet).filter(
CommunitySet.id == set_id,
CommunitySet.user_id == current_user.userid
).first()
if not db_set:
return error_response(code=404, message="社区集合不存在")
db.delete(db_set)
db.commit()
return success_response(data={"message": "社区集合已删除"})

View File

@ -0,0 +1,163 @@
from fastapi import APIRouter, Depends, HTTPException, Query, Path
from sqlalchemy.orm import Session
from typing import List, Optional
from pydantic import BaseModel, Field
from app.models.database import get_db
from app.models.community_set_mapping import CommunitySetMapping
from app.models.community_set import CommunitySet
from app.models.community import CommunityDB
from app.api.deps import get_current_user, get_admin_user
from app.models.user import UserDB
from datetime import datetime
from app.core.response import success_response, error_response
router = APIRouter()
# 请求和响应模型
class CommunitySetMappingCreate(BaseModel):
set_id: int = Field(..., ge=1, description="社区集合ID")
community_id: int = Field(..., ge=1, description="社区ID")
class CommunitySetMappingResponse(BaseModel):
id: int
set_id: int
community_id: int
create_time: datetime
update_time: datetime
# 包含社区集合名称和社区名称
set_name: Optional[str] = None
community_name: Optional[str] = None
address: Optional[str] = None
class Config:
from_attributes = True
# 创建社区集合映射
@router.post("/", response_model=CommunitySetMappingResponse)
async def create_community_set_mapping(
mapping: CommunitySetMappingCreate,
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_admin_user)
):
"""创建社区集合映射"""
# 检查社区集合是否存在
community_set = db.query(CommunitySet).filter(CommunitySet.id == mapping.set_id).first()
if not community_set:
return error_response(code=404, message="社区集合不存在")
# 检查社区是否存在
community = db.query(CommunityDB).filter(CommunityDB.id == mapping.community_id).first()
if not community:
return error_response(code=404, message="社区不存在")
# 检查映射是否已存在
existing_mapping = db.query(CommunitySetMapping).filter(
CommunitySetMapping.set_id == mapping.set_id,
CommunitySetMapping.community_id == mapping.community_id
).first()
if existing_mapping:
return error_response(code=400, message="该映射关系已存在")
# 创建新映射
new_mapping = CommunitySetMapping(
set_id=mapping.set_id,
community_id=mapping.community_id
)
db.add(new_mapping)
db.commit()
db.refresh(new_mapping)
# 添加社区集合名称和社区名称
result = CommunitySetMappingResponse.model_validate(new_mapping)
result.set_name = community_set.set_name
result.community_name = community.name
return success_response(data=result)
# 获取社区集合的所有社区
@router.get("/set/{set_id}/communities", response_model=List[CommunitySetMappingResponse])
async def get_communities_by_set(
set_id: int = Path(..., ge=1),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user),
skip: int = Query(0, ge=0),
limit: int = Query(100, ge=1, le=100)
):
"""获取社区集合的所有社区"""
# 检查社区集合是否存在
community_set = db.query(CommunitySet).filter(CommunitySet.id == set_id).first()
if not community_set:
return error_response(code=404, message="社区集合不存在")
# 获取映射
mappings = db.query(CommunitySetMapping).filter(
CommunitySetMapping.set_id == set_id
).offset(skip).limit(limit).all()
# 添加社区集合名称和社区名称
results = []
for mapping in mappings:
community = db.query(CommunityDB).filter(CommunityDB.id == mapping.community_id).first()
result = CommunitySetMappingResponse.model_validate(mapping)
result.set_name = community_set.set_name
result.community_name = community.name if community else None
result.address = community.address if community else None
results.append(result)
total = db.query(CommunitySetMapping).filter(
CommunitySetMapping.set_id == set_id
).count()
return success_response(data={"total": total, "items": results})
# 获取社区所属的所有集合
@router.get("/community/{community_id}/sets", response_model=List[CommunitySetMappingResponse])
async def get_sets_by_community(
community_id: int = Path(..., ge=1),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_current_user),
skip: int = Query(0, ge=0),
limit: int = Query(100, ge=1, le=100)
):
"""获取社区所属的所有集合"""
# 检查社区是否存在
community = db.query(CommunityDB).filter(CommunityDB.id == community_id).first()
if not community:
return error_response(code=404, message="社区不存在")
# 获取映射
mappings = db.query(CommunitySetMapping).filter(
CommunitySetMapping.community_id == community_id
).offset(skip).limit(limit).all()
# 添加社区集合名称和社区名称
results = []
for mapping in mappings:
community_set = db.query(CommunitySet).filter(CommunitySet.id == mapping.set_id).first()
result = CommunitySetMappingResponse.model_validate(mapping)
result.set_name = community_set.set_name if community_set else None
result.community_name = community.name
results.append(result)
return success_response(data=results)
# 删除社区集合映射
@router.delete("/{mapping_id}", response_model=dict)
async def delete_community_set_mapping(
mapping_id: int = Path(..., ge=1),
db: Session = Depends(get_db),
current_user: UserDB = Depends(get_admin_user)
):
"""删除社区集合映射"""
mapping = db.query(CommunitySetMapping).filter(CommunitySetMapping.id == mapping_id).first()
if not mapping:
return error_response(code=404, message="映射关系不存在")
db.delete(mapping)
db.commit()
return success_response(data={"message": "映射关系已删除"})

View File

@ -527,3 +527,23 @@ async def get_user_auth(
auth_info.id_number = masked_id_number
return success_response(data=auth_info)
#通过手机号搜索用户
@router.get("/search_by_phone/{phone}", response_model=ResponseModel)
async def search_user_by_phone(
phone: str,
role: Optional[str] = None,
db: Session = Depends(get_db)
):
"""通过手机号搜索用户"""
user = db.query(UserDB).filter(UserDB.phone == phone).first()
if not user:
return error_response(code=404, message="用户不存在")
if role:
user.roles = list(set(user.roles)) # 去重
if role not in user.roles:
return error_response(code=404, message="该用户没有运营商权限")
return success_response(data=UserInfo.model_validate(user))

View File

@ -1,6 +1,6 @@
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from app.api.endpoints import wechat,user, address, community, station, order, coupon, community_building, upload, merchant, merchant_product, merchant_order, point, config, merchant_category, log, account,merchant_pay_order, message, bank_card, withdraw, mp, point_product, point_product_order, coupon_activity, dashboard, wecom, feedback, timeperiod, community_timeperiod, order_additional_fee, ai
from app.api.endpoints import wechat,user, address, community, station, order, coupon, community_building, upload, merchant, merchant_product, merchant_order, point, config, merchant_category, log, account,merchant_pay_order, message, bank_card, withdraw, mp, point_product, point_product_order, coupon_activity, dashboard, wecom, feedback, timeperiod, community_timeperiod, order_additional_fee, ai, community_set, community_set_mapping
from app.models.database import Base, engine
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
@ -59,6 +59,8 @@ app.include_router(account.router, prefix="/api/account", tags=["账户"])
app.include_router(address.router, prefix="/api/address", tags=["配送地址"])
app.include_router(community.router, prefix="/api/community", tags=["社区"])
app.include_router(community_building.router, prefix="/api/community/building", tags=["社区楼栋"])
app.include_router(community_set.router, prefix="/api/community-sets", tags=["社区集合"])
app.include_router(community_set_mapping.router, prefix="/api/community-set-mappings", tags=["社区集合映射"])
app.include_router(timeperiod.router, prefix="/api/time-periods", tags=["配送时段"])
app.include_router(community_timeperiod.router, prefix="/api/community-time-periods", tags=["社区配送时段"])
app.include_router(station.router, prefix="/api/station", tags=["驿站"])

View File

@ -4,7 +4,9 @@ from sqlalchemy import Column, Integer, String, DECIMAL, DateTime, Enum
from sqlalchemy.sql import func
from pydantic import BaseModel, Field
from .database import Base
from sqlalchemy.orm import relationship
from app.core.imageprocessor import process_image, ImageFormat
class CommunityStatus(str, enum.Enum):
UNOPEN = "UNOPEN" # 未运营
OPENING = "OPENING" # 已运营

View File

@ -0,0 +1,14 @@
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
from sqlalchemy.orm import relationship
from app.models.database import Base
import datetime
class CommunitySet(Base):
"""社区集合模型"""
__tablename__ = "community_sets"
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
set_name = Column(String(100), nullable=False, comment="集合名称")
user_id = Column(Integer, ForeignKey("users.userid"), nullable=False, comment="创建用户ID")
create_time = Column(DateTime, default=datetime.datetime.now, comment="创建时间")
update_time = Column(DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment="更新时间")

View File

@ -0,0 +1,14 @@
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
from sqlalchemy.orm import relationship
from app.models.database import Base
import datetime
class CommunitySetMapping(Base):
"""社区集合映射模型,用于保存社区集合和社区的一对多关系"""
__tablename__ = "community_set_mappings"
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
set_id = Column(Integer, ForeignKey("community_sets.id"), nullable=False, comment="社区集合ID")
community_id = Column(Integer, ForeignKey("communities.id"), nullable=False, comment="社区ID")
create_time = Column(DateTime, default=datetime.datetime.now, comment="创建时间")
update_time = Column(DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now, comment="更新时间")

View File

@ -9,6 +9,8 @@ import enum
import random
import string
from app.core.imageprocessor import process_image, ImageFormat
from sqlalchemy.orm import relationship
class UserRole(str, enum.Enum):
USER = "user"
DELIVERYMAN = "deliveryman"