122 lines
4.0 KiB
Python
122 lines
4.0 KiB
Python
"""技能差距分析 + 定制简历 Schema
|
|
|
|
请求参数 Param、响应 Dto、Redis 缓存模型。
|
|
字段命名使用 camelCase alias,与前端 JSON 对齐。
|
|
"""
|
|
|
|
from typing import Literal
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
# 定制简历可优化模块
|
|
OptimizeModule = Literal["summary", "skills", "experience"]
|
|
|
|
|
|
# ===== 请求参数 =====
|
|
|
|
class SkillGapParam(BaseModel):
|
|
job_id: int = Field(..., alias="jobId")
|
|
|
|
|
|
class CustomizeResumeParam(BaseModel):
|
|
job_id: int = Field(..., alias="jobId")
|
|
resume_id: int = Field(..., alias="resumeId")
|
|
optimize_modules: list[OptimizeModule] = Field(..., alias="optimizeModules")
|
|
add_skills: list[str] = Field(default_factory=list, alias="addSkills")
|
|
|
|
|
|
ChatRole = Literal["user", "assistant"]
|
|
|
|
|
|
class ChatMessage(BaseModel):
|
|
role: ChatRole
|
|
content: str
|
|
|
|
|
|
class AiEditParam(BaseModel):
|
|
job_id: int = Field(..., alias="jobId")
|
|
instruction: str = Field(...)
|
|
chat_history: list[ChatMessage] = Field(default_factory=list, alias="chatHistory")
|
|
|
|
|
|
# ===== Redis 缓存子模型 =====
|
|
|
|
class _AliasModel(BaseModel):
|
|
"""带 alias 的基类,允许同时用 alias 和字段名赋值"""
|
|
model_config = {"populate_by_name": True}
|
|
|
|
|
|
class Paragraph(_AliasModel):
|
|
id: str = Field(...)
|
|
text: str = Field(default="")
|
|
|
|
|
|
class ResumeProfile(_AliasModel):
|
|
avatar_url: str = Field(default="", alias="avatarUrl")
|
|
name: str = Field(default="")
|
|
email: str = Field(default="")
|
|
mobile_number: str = Field(default="", alias="mobileNumber")
|
|
city: str = Field(default="")
|
|
wechat_number: str = Field(default="", alias="wechatNumber")
|
|
portfolio_url: str = Field(default="", alias="portfolioUrl")
|
|
skills: list[str] = Field(default_factory=list)
|
|
certificates: list[str] = Field(default_factory=list)
|
|
summary: str = Field(default="")
|
|
|
|
|
|
class Education(_AliasModel):
|
|
id: str = Field(default="")
|
|
school: str = Field(default="")
|
|
major: str = Field(default="")
|
|
degree: str = Field(default="")
|
|
study_type: str = Field(default="", alias="studyType")
|
|
start_date: str = Field(default="", alias="startDate")
|
|
end_date: str = Field(default="", alias="endDate")
|
|
description: list[Paragraph] = Field(default_factory=list)
|
|
|
|
|
|
class Work(_AliasModel):
|
|
id: str = Field(default="")
|
|
company_name: str = Field(default="", alias="companyName")
|
|
position: str = Field(default="")
|
|
start_date: str = Field(default="", alias="startDate")
|
|
end_date: str = Field(default="", alias="endDate")
|
|
description: list[Paragraph] = Field(default_factory=list)
|
|
|
|
|
|
class Internship(_AliasModel):
|
|
id: str = Field(default="")
|
|
company_name: str = Field(default="", alias="companyName")
|
|
position: str = Field(default="")
|
|
start_date: str = Field(default="", alias="startDate")
|
|
end_date: str = Field(default="", alias="endDate")
|
|
description: list[Paragraph] = Field(default_factory=list)
|
|
|
|
|
|
class Project(_AliasModel):
|
|
id: str = Field(default="")
|
|
company_name: str = Field(default="", alias="companyName")
|
|
project_name: str = Field(default="", alias="projectName")
|
|
role: str = Field(default="")
|
|
start_date: str = Field(default="", alias="startDate")
|
|
end_date: str = Field(default="", alias="endDate")
|
|
description: list[Paragraph] = Field(default_factory=list)
|
|
|
|
|
|
class Competition(_AliasModel):
|
|
id: str = Field(default="")
|
|
competition_name: str = Field(default="", alias="competitionName")
|
|
award: str = Field(default="")
|
|
award_date: str = Field(default="", alias="awardDate")
|
|
description: list[Paragraph] = Field(default_factory=list)
|
|
|
|
|
|
class CustomizeResume(_AliasModel):
|
|
"""定制简历 Redis 缓存结构"""
|
|
resume: ResumeProfile = Field(default_factory=ResumeProfile)
|
|
education: list[Education] = Field(default_factory=list)
|
|
work: list[Work] = Field(default_factory=list)
|
|
internship: list[Internship] = Field(default_factory=list)
|
|
project: list[Project] = Field(default_factory=list)
|
|
competition: list[Competition] = Field(default_factory=list)
|