⚒️ 重大重构 LoveACE V2
引入了 mongodb 对数据库进行了一定程度的数据加密 性能改善 代码简化 统一错误模型和响应 使用 apifox 作为文档
This commit is contained in:
1
loveace/router/endpoint/ldjlb/model/__init__.py
Normal file
1
loveace/router/endpoint/ldjlb/model/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
# 劳动俱乐部数据模型
|
||||
22
loveace/router/endpoint/ldjlb/model/base.py
Normal file
22
loveace/router/endpoint/ldjlb/model/base.py
Normal file
@@ -0,0 +1,22 @@
|
||||
from pathlib import Path
|
||||
|
||||
from loveace.config.manager import config_manager
|
||||
|
||||
settings = config_manager.get_settings()
|
||||
|
||||
|
||||
class LDJLBConfig:
|
||||
"""劳动俱乐部模块配置常量"""
|
||||
|
||||
BASE_URL = "http://api-ldjlb-ac-acxk-net.vpn2.aufe.edu.cn:8118"
|
||||
WEB_URL = "http://ldjlb-ac-acxk-net.vpn2.aufe.edu.cn:8118"
|
||||
LOGIN_SERVICE_URL = "http://uaap-aufe-edu-cn.vpn2.aufe.edu.cn:8118/cas/login?service=http%3a%2f%2fapi.ldjlb.ac.acxk.net%2fUser%2fIndex%2fCoreLoginCallback%3fisCASGateway%3dtrue"
|
||||
RSA_PRIVATE_KEY_PATH = str(
|
||||
Path(settings.app.rsa_protect_key_path).joinpath("aac_private_key.pem")
|
||||
)
|
||||
|
||||
def to_full_url(self, path: str) -> str:
|
||||
"""将路径转换为完整URL"""
|
||||
if path.startswith("http://") or path.startswith("https://"):
|
||||
return path
|
||||
return self.BASE_URL.rstrip("/") + "/" + path.lstrip("/")
|
||||
198
loveace/router/endpoint/ldjlb/model/ldjlb.py
Normal file
198
loveace/router/endpoint/ldjlb/model/ldjlb.py
Normal file
@@ -0,0 +1,198 @@
|
||||
from typing import List, Optional
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
|
||||
class LDJLBProgressInfo(BaseModel):
|
||||
"""劳动俱乐部修课进度信息"""
|
||||
|
||||
finish_count: int = Field(0, alias="data", description="已完成的活动数量")
|
||||
|
||||
@property
|
||||
def progress_percentage(self) -> float:
|
||||
"""计算修课进度百分比(满分10次)"""
|
||||
return min((self.finish_count / 10.0) * 100, 100.0)
|
||||
|
||||
|
||||
class LDJLBPageInfo(BaseModel):
|
||||
"""分页信息"""
|
||||
|
||||
total_item_count: int = Field(0, alias="TotalItemCount", description="总条目数")
|
||||
page_size: int = Field(20, alias="PageSize", description="每页大小")
|
||||
current_page_index: int = Field(1, alias="CurrentPageIndex", description="当前页码")
|
||||
|
||||
|
||||
class LDJLBActivity(BaseModel):
|
||||
"""劳动俱乐部活动信息"""
|
||||
|
||||
id: str = Field("", alias="ID", description="活动ID")
|
||||
ico: Optional[str] = Field(None, alias="Ico", description="活动图标")
|
||||
state: int = Field(0, alias="State", description="活动状态代码")
|
||||
state_name: str = Field("", alias="StateName", description="活动状态名称")
|
||||
type_id: str = Field("", alias="TypeID", description="活动类型ID")
|
||||
type_name: str = Field("", alias="TypeName", description="活动类型名称")
|
||||
title: str = Field("", alias="Title", description="活动标题")
|
||||
start_time: str = Field("", alias="StartTime", description="活动开始时间")
|
||||
end_time: str = Field("", alias="EndTime", description="活动结束时间")
|
||||
charge_user_no: str = Field("", alias="ChargeUserNo", description="负责人工号")
|
||||
charge_user_name: str = Field("", alias="ChargeUserName", description="负责人姓名")
|
||||
club_id: str = Field("", alias="ClubID", description="所属俱乐部ID")
|
||||
club_name: str = Field("", alias="ClubName", description="所属俱乐部名称")
|
||||
member_num: int = Field(0, alias="MemberNum", description="已报名人数")
|
||||
add_time: str = Field("", alias="AddTime", description="活动添加时间")
|
||||
people_num: int = Field(0, alias="PeopleNum", description="活动人数限制")
|
||||
people_num_min: Optional[int] = Field(None, alias="PeopleNumMin", description="最小人数限制")
|
||||
is_join: Optional[bool] = Field(None, alias="IsJson", description="是否已加入")
|
||||
is_close: Optional[bool] = Field(None, alias="IsClose", description="是否已关闭")
|
||||
sign_up_start_time: str = Field("", alias="SignUpStartTime", description="报名开始时间")
|
||||
sign_up_end_time: str = Field("", alias="SignUpEndTime", description="报名结束时间")
|
||||
|
||||
|
||||
class LDJLBActivityListResponse(BaseModel):
|
||||
"""劳动俱乐部活动列表响应"""
|
||||
|
||||
activities: List[LDJLBActivity] = Field([], alias="data", description="活动列表")
|
||||
page_info: LDJLBPageInfo = Field(..., alias="pageInfo", description="分页信息")
|
||||
|
||||
|
||||
class LDJLBClub(BaseModel):
|
||||
"""劳动俱乐部信息"""
|
||||
|
||||
id: str = Field("", alias="ID", description="俱乐部ID")
|
||||
name: str = Field("", alias="Name", description="俱乐部名称")
|
||||
type_id: str = Field("", alias="TypeID", description="俱乐部类型ID")
|
||||
people_num: int = Field(0, alias="PeopleNum", description="俱乐部总人数")
|
||||
project_id: str = Field("", alias="ProjectID", description="项目ID")
|
||||
project_name: str = Field("", alias="PorjectName", description="项目名称")
|
||||
type_name: str = Field("", alias="TypeName", description="类型名称")
|
||||
ico: str = Field("", alias="Ico", description="俱乐部图标")
|
||||
desc: Optional[str] = Field(None, alias="Desc", description="俱乐部描述")
|
||||
chairman_no: str = Field("", alias="ChairmanNo", description="主席工号")
|
||||
chairman_name: str = Field("", alias="CairmanName", description="主席姓名")
|
||||
depart_code: str = Field("", alias="DepartCode", description="部门代码")
|
||||
contact: Optional[str] = Field(None, alias="Contact", description="联系方式")
|
||||
is_enable: bool = Field(True, alias="IsEnable", description="是否启用")
|
||||
depart_name: str = Field("", alias="DpeartName", description="部门名称")
|
||||
member_num: int = Field(0, alias="MemberNum", description="俱乐部成员数")
|
||||
|
||||
|
||||
class LDJLBClubListResponse(BaseModel):
|
||||
"""劳动俱乐部列表响应"""
|
||||
|
||||
clubs: List[LDJLBClub] = Field([], alias="data", description="俱乐部列表")
|
||||
|
||||
|
||||
class LDJLBApplyResponse(BaseModel):
|
||||
"""劳动俱乐部报名响应"""
|
||||
|
||||
code: int = Field(0, description="响应代码")
|
||||
msg: str = Field("", description="响应消息")
|
||||
|
||||
|
||||
class ScanSignRequest(BaseModel):
|
||||
"""扫码签到请求模型"""
|
||||
|
||||
content: str = Field(..., description="扫码结果内容")
|
||||
location: str = Field(..., description="位置信息,格式: 经度,纬度")
|
||||
|
||||
|
||||
class ScanSignResponse(BaseModel):
|
||||
"""扫码签到响应模型"""
|
||||
|
||||
code: int = Field(..., description="响应码,0表示成功")
|
||||
msg: Optional[str] = Field(None, description="响应消息")
|
||||
data: Optional[dict] = Field(None, description="响应数据")
|
||||
|
||||
|
||||
class SignItem(BaseModel):
|
||||
"""签到项信息"""
|
||||
|
||||
id: str = Field("", alias="ID", description="签到项ID")
|
||||
type: int = Field(1, alias="Type", description="类型,1=签到")
|
||||
type_name: str = Field("", alias="TypeName", description="类型名称")
|
||||
start_time: str = Field("", alias="StartTime", description="签到开始时间")
|
||||
end_time: str = Field("", alias="EndTime", description="签到结束时间")
|
||||
is_sign: bool = Field(False, alias="IsSign", description="是否已签到")
|
||||
sign_time: str = Field("", alias="SignTime", description="签到时间")
|
||||
|
||||
|
||||
class SignListResponse(BaseModel):
|
||||
"""签到列表响应模型"""
|
||||
|
||||
code: int = Field(0, description="响应码,0表示成功")
|
||||
data: List[SignItem] = Field(default_factory=list, description="签到列表数据")
|
||||
|
||||
|
||||
class FormField(BaseModel):
|
||||
"""活动表单字段"""
|
||||
|
||||
id: str = Field("", alias="ID", description="字段ID")
|
||||
name: str = Field("", alias="Name", description="字段名称")
|
||||
is_must: bool = Field(False, alias="IsMust", description="是否必填")
|
||||
field_type: int = Field(1, alias="FieldType", description="字段类型")
|
||||
value: str = Field("", alias="Value", description="字段值")
|
||||
|
||||
|
||||
class FlowData(BaseModel):
|
||||
"""活动审批流程数据"""
|
||||
|
||||
id: str = Field("", alias="ID", description="流程ID")
|
||||
is_adopt: bool = Field(False, alias="IsAdopt", description="是否通过")
|
||||
flow_type: int = Field(0, alias="FlowType", description="流程类型")
|
||||
flow_type_name: str = Field("", alias="FlowTypeName", description="流程类型名称")
|
||||
user_no: Optional[str] = Field(None, alias="UserNo", description="用户工号")
|
||||
user_name: str = Field("", alias="UserName", description="用户姓名")
|
||||
exam_user_no: str = Field("", alias="ExamUserNo", description="审批人工号")
|
||||
exam_user_name: str = Field("", alias="ExamUserName", description="审批人姓名")
|
||||
exam_comment: str = Field("", alias="ExamComment", description="审批意见")
|
||||
add_time: str = Field("", alias="AddTime", description="提交时间")
|
||||
exam_time: str = Field("", alias="ExamTime", description="审批时间")
|
||||
|
||||
|
||||
class Teacher(BaseModel):
|
||||
"""活动教师信息"""
|
||||
|
||||
user_name: str = Field("", alias="UserName", description="教师姓名")
|
||||
id: str = Field("", alias="ID", description="记录ID")
|
||||
activity_id: str = Field("", alias="ActivityID", description="活动ID")
|
||||
user_no: str = Field("", alias="UserNo", description="教师工号")
|
||||
add_time: str = Field("", alias="AddTime", description="添加时间")
|
||||
add_user_no: str = Field("", alias="AddUserNo", description="添加人工号")
|
||||
|
||||
|
||||
class ActivityDetailData(BaseModel):
|
||||
"""活动详细信息数据"""
|
||||
|
||||
id: str = Field("", alias="ID", description="活动ID")
|
||||
title: str = Field("", alias="Title", description="活动标题")
|
||||
state: int = Field(0, alias="State", description="活动状态")
|
||||
ico: Optional[str] = Field(None, alias="Ico", description="活动图标")
|
||||
type_id: str = Field("", alias="TypeID", description="活动类型ID")
|
||||
type_name: str = Field("", alias="TypeName", description="活动类型名称")
|
||||
start_time: str = Field("", alias="StartTime", description="活动开始时间")
|
||||
end_time: str = Field("", alias="EndTime", description="活动结束时间")
|
||||
charge_user_no: str = Field("", alias="ChargeUserNo", description="负责人工号")
|
||||
charge_user_name: str = Field("", alias="ChargeUserName", description="负责人姓名")
|
||||
club_id: str = Field("", alias="ClubID", description="所属俱乐部ID")
|
||||
club_name: str = Field("", alias="ClubName", description="所属俱乐部名称")
|
||||
member_num: int = Field(0, alias="MemberNum", description="已报名人数")
|
||||
add_time: str = Field("", alias="AddTime", description="活动添加时间")
|
||||
apply_is_need_exam: bool = Field(False, alias="ApplyIsNeedExam", description="报名是否需要审批")
|
||||
is_member: bool = Field(False, alias="IsMember", description="是否为成员")
|
||||
is_manager: bool = Field(False, alias="IsManager", description="是否为管理员")
|
||||
people_num: int = Field(0, alias="PeopleNum", description="活动人数限制")
|
||||
people_num_min: Optional[int] = Field(None, alias="PeopleNumMin", description="最小人数限制")
|
||||
is_close: Optional[bool] = Field(None, alias="IsClose", description="是否已关闭")
|
||||
sign_up_start_time: str = Field("", alias="SignUpStartTime", description="报名开始时间")
|
||||
sign_up_end_time: str = Field("", alias="SignUpEndTime", description="报名结束时间")
|
||||
|
||||
|
||||
class ActivityDetailResponse(BaseModel):
|
||||
"""活动详情响应模型"""
|
||||
|
||||
code: int = Field(0, description="响应码,0表示成功")
|
||||
data: Optional[ActivityDetailData] = Field(None, description="活动详细信息")
|
||||
form_data: List[FormField] = Field(default_factory=list, alias="formData", description="表单数据")
|
||||
flow_data: List[FlowData] = Field(default_factory=list, alias="flowData", description="审批流程数据")
|
||||
venue_reserve_data: List = Field(default_factory=list, alias="VenueReserveData", description="场地预约数据")
|
||||
teacher_list: List[Teacher] = Field(default_factory=list, alias="teacherList", description="教师列表")
|
||||
Reference in New Issue
Block a user