Files
obsidian/study/courses/pm/report.figs/class.mmd

115 lines
2.6 KiB
Plaintext

classDiagram
class User {
+int id
+string name
+string email
+string role // HR, CANDIDATE, ADMIN
+datetime createdAt
}
class Company {
+int id
+string name
+string industry
+string size
}
class CandidateProfile {
+int id
+int userId
+string degree
+int yearsExperience
+string skillTags
+string resumeUrl
}
class JobPosition {
+int id
+int companyId
+string title
+string level
+string requiredSkills
+string description
+string examPolicyId
}
class ExamPolicy {
+string id
+int totalQuestions
+float easyRatio
+float mediumRatio
+float hardRatio
+string typeRatio // JSON: 单选/多选/编程 等比例
}
class Question {
+int id
+string content
+string type
+string skillTag
+int difficulty
+string source // 企业题/通用题
+bool isActive
}
class QuestionStats {
+int questionId
+int usedCount
+float avgScore
+float correctRate
+float discrimination
+float feedbackScore
+datetime lastUsedAt
}
class ExamTemplate {
+int id
+int jobId
+string policyId
+string questionSlots // JSON: 题目占位信息
}
class ExamSession {
+int id
+int candidateId
+int jobId
+int templateId
+datetime startTime
+datetime submitTime
+float totalScore
+string status // ONGOING / DONE
}
class Answer {
+int id
+int sessionId
+int questionId
+string content
+float score
+float timeTaken
}
class QuestionFeedback {
+int id
+int questionId
+int fromUserId
+int sessionId
+int rating // 1~5
+string comment
+datetime createdAt
}
Company "1" o-- "0..*" User : employs
User "1" o-- "0..1" CandidateProfile : has
Company "1" o-- "0..*" JobPosition : posts
JobPosition "1" o-- "0..*" ExamTemplate : uses
ExamPolicy "1" o-- "0..*" ExamTemplate : governs
Question "1" o-- "1" QuestionStats : has
ExamTemplate "1" o-- "0..*" ExamSession : instantiates
CandidateProfile "1" o-- "0..*" ExamSession : takes
ExamSession "1" o-- "0..*" Answer : contains
Question "1" o-- "0..*" Answer : answeredIn
Question "1" o-- "0..*" QuestionFeedback : receives
User "1" o-- "0..*" QuestionFeedback : writes