Initial commit: obsidian to gitea

This commit is contained in:
2026-05-07 15:04:41 +08:00
commit a57afa86b4
323 changed files with 42569 additions and 0 deletions

View File

@@ -0,0 +1,85 @@
<mxfile host="Electron" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/28.2.8 Chrome/140.0.7339.240 Electron/38.4.0 Safari/537.36" version="28.2.8">
<diagram name="Page-1" id="page-1">
<mxGraphModel dx="784" dy="671" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="6" value="配置岗位需求" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;fontColor=#232F3E;fontSize=12;strokeColor=#3399FF;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="250" y="120" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="7" value="配置试题策略" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;fontColor=#232F3E;fontSize=12;strokeColor=#3399FF;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="250" y="180" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="9" value="在线答题" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;fontColor=#232F3E;fontSize=12;strokeColor=#3399FF;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="250" y="360" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="10" value="查看成绩与统计" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;fontColor=#232F3E;fontSize=12;strokeColor=#3399FF;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="250" y="240" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="11" value="提交试题反馈" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;fontColor=#232F3E;fontSize=12;strokeColor=#3399FF;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="250" y="300" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="12" value="题库管理与题目淘汰" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;fontColor=#232F3E;fontSize=12;strokeColor=#3399FF;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="250" y="420" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="13" value="企业接入与运营配置" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;fontColor=#232F3E;fontSize=12;strokeColor=#3399FF;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="250" y="490" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="14" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-22" target="6" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="170" y="180" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="15" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-22" target="7" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="170" y="180" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="16" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-22" target="10" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="170" y="180" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="17" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-22" target="11" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="170" y="180" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="18" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=1;entryY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-23" target="9" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="650" y="180" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="19" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=1;entryY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-23" target="10" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="650" y="180" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="20" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=1;entryY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-23" target="11" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="650" y="180" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="21" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-27" target="12" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="410" y="490" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="22" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-27" target="13" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="410" y="490" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="dYsEw_TpROWio0KKOCtD-22" value="招聘企业 HR" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;fillColor=#f0a30a;strokeColor=#BD7000;fontColor=#000000;" vertex="1" parent="1">
<mxGeometry x="130" y="210" width="30" height="60" as="geometry" />
</mxCell>
<mxCell id="dYsEw_TpROWio0KKOCtD-23" value="应聘者" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;fillColor=#f0a30a;fontColor=#000000;strokeColor=#BD7000;" vertex="1" parent="1">
<mxGeometry x="440" y="295" width="30" height="60" as="geometry" />
</mxCell>
<mxCell id="dYsEw_TpROWio0KKOCtD-27" value="平台管理员" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;fillColor=#f0a30a;fontColor=#000000;strokeColor=#BD7000;" vertex="1" parent="1">
<mxGeometry x="440" y="450" width="30" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -0,0 +1,43 @@
flowchart TD
%% ======== 样式定义 ========
classDef roleHR fill:#fff7e6,stroke:#fa8c16,stroke-width:1px;
classDef roleCandidate fill:#e6fffb,stroke:#13c2c2,stroke-width:1px;
classDef roleSystem fill:#f0f5ff,stroke:#2f54eb,stroke-width:1px;
%% ======== 开始与结束 ========
Start([开始])
End([结束])
%% ======== HR 泳道 ========
subgraph HRLane[招聘企业 HR]
HR1[填写岗位需求<br/>与能力要求]:::roleHR
HR2[配置试题策略]:::roleHR
HR3[查看考试统计报表]:::roleHR
HR4[评价试题质量与效果]:::roleHR
end
%% ======== 平台后端 泳道 ========
subgraph SystemLane[平台后端]
S1[解析岗位并抽取技能标签]:::roleSystem
S2[生成试卷模板]:::roleSystem
S3[为候选人实例化试卷]:::roleSystem
S4[记录作答过程与答案]:::roleSystem
S5[自动评分并生成结果]:::roleSystem
S6[更新题目统计指标]:::roleSystem
S7[判定题目是否进入淘汰池]:::roleSystem
end
%% ======== 应聘者 泳道 ========
subgraph CandLane[应聘者 Candidate]
C1[注册 / 登录]:::roleCandidate
C2[选择岗位并领取试卷]:::roleCandidate
C3[在线作答]:::roleCandidate
C4[查看成绩与解析]:::roleCandidate
C5[填写试题反馈]:::roleCandidate
end
%% ======== 活动流转 ========
Start --> HR1 --> S1 --> S2 --> HR2 --> S3
S3 --> C1 --> C2 --> C3 --> S4 --> S5 --> C4 --> C5 --> S6
S6 --> HR3 --> HR4 --> S6
S6 --> S7 --> End

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 KiB

View File

@@ -0,0 +1,114 @@
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 KiB

View File

@@ -0,0 +1,8 @@
#!/bin/bash
for f in *.mmd; do
base=$(basename "$f" .mmd)
echo "Converting $f → figs/${base}.png"
mmdc -i "$f" -o "${base}.png" -s 3
done

View File

@@ -0,0 +1,113 @@
erDiagram
USER {
int id
int company_id
string name
string email
string role
}
COMPANY {
int id
string name
string industry
string size
}
CANDIDATE_PROFILE {
int id
int user_id
string degree
int years_experience
string skill_tags
string resume_url
}
JOB_POSITION {
int id
int company_id
string title
string level
string required_skills
string description
string exam_policy_id
}
EXAM_POLICY {
string id
int total_questions
float easy_ratio
float medium_ratio
float hard_ratio
string type_ratio
}
QUESTION {
int id
string content
string type
string skill_tag
int difficulty
string source
bool is_active
}
QUESTION_STATS {
int question_id
int used_count
float avg_score
float correct_rate
float discrimination
float feedback_score
datetime last_used_at
}
EXAM_TEMPLATE {
int id
int job_id
string policy_id
string question_slots
}
EXAM_SESSION {
int id
int candidate_id
int job_id
int template_id
datetime start_time
datetime submit_time
float total_score
string status
}
ANSWER {
int id
int session_id
int question_id
string content
float score
float time_taken
}
QUESTION_FEEDBACK {
int id
int question_id
int from_user_id
int session_id
int rating
string comment
datetime created_at
}
COMPANY ||--o{ USER : has
USER ||--o{ CANDIDATE_PROFILE : has
COMPANY ||--o{ JOB_POSITION : posts
EXAM_POLICY ||--o{ JOB_POSITION : configures
JOB_POSITION ||--o{ EXAM_TEMPLATE : uses
EXAM_TEMPLATE ||--o{ EXAM_SESSION : instantiates
USER ||--o{ EXAM_SESSION : takes
EXAM_SESSION ||--o{ ANSWER : contains
QUESTION ||--o{ ANSWER : answered_in
QUESTION ||--|| QUESTION_STATS : stats
QUESTION ||--o{ QUESTION_FEEDBACK : receives
USER ||--o{ QUESTION_FEEDBACK : writes

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 KiB

View File

@@ -0,0 +1,31 @@
sequenceDiagram
autonumber
actor HR as 招聘企业HR
participant Web as HR Web前端
participant ExamSvc as 考试服务
participant QSvc as 试题生成服务
participant Cand as 应聘者客户端
participant Score as 评分服务
participant DB as 数据库
HR ->> Web: 配置岗位与试题策略
Web ->> QSvc: 创建/更新试卷模板
QSvc ->> DB: 读取题库与统计数据
QSvc -->> Web: 返回模板ID
HR ->> Web: 发布在线考试
Cand ->> Cand: 注册 / 登录
Cand ->> ExamSvc: 请求领取试卷(jobId, candidateId)
ExamSvc ->> QSvc: 实例化个性化试卷(templateId, profile)
QSvc -->> ExamSvc: 返回题目列表
ExamSvc -->> Cand: 下发试卷内容
Cand ->> ExamSvc: 提交全部答案
ExamSvc ->> Score: 发送作答数据
Score ->> DB: 读取标准答案与评分规则
Score -->> ExamSvc: 返回评分结果
ExamSvc ->> DB: 保存成绩与答案明细
Cand -->> ExamSvc: 查询成绩与解析
ExamSvc -->> Cand: 返回成绩、解析与评价入口

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

View File

@@ -0,0 +1,91 @@
<mxfile host="Electron" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/28.2.8 Chrome/140.0.7339.240 Electron/38.4.0 Safari/537.36" version="28.2.8">
<diagram name="Page-1" id="KaNmNEmE_Qx5MvW_SbqB">
<mxGraphModel dx="1009" dy="863" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="40E4A47yQaY0a98WVuZL-61" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b0e3e6;strokeColor=#0e8088;" vertex="1" parent="1">
<mxGeometry x="280" y="140" width="680" height="110" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-57" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
<mxGeometry x="280" y="250" width="680" height="110" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-56" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fad9d5;strokeColor=#ae4132;" vertex="1" parent="1">
<mxGeometry x="280" y="570" width="680" height="130" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-55" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="280" y="360" width="680" height="210" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-1" value="客户端层" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=16;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="295" y="175" width="20" height="40" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-2" value="接入层&amp;nbsp;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=16;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="300" y="285" width="10" height="40" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-3" value="应用服务层&amp;nbsp;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=16;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="290" y="442" width="30" height="46" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-4" value="数据层" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=16;fontStyle=1;" vertex="1" parent="1">
<mxGeometry x="295" y="617.5" width="20" height="35" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-5" value="HR APP 前端&lt;br&gt;Vue / React" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e6fffb;strokeColor=#13c2c2;strokeWidth=2;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="410" y="165" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-6" value="应聘者 APP&lt;br&gt;Candidate App" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e6fffb;strokeColor=#13c2c2;strokeWidth=2;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="770" y="165" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-7" value="API Gateway / ALB&#xa;HTTPS 终止 + 负载均衡" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff7e6;strokeColor=#fa8c16;strokeWidth=2;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="570" y="275" width="160" height="60" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-8" value="Auth Service&#xa;认证授权" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f0f5ff;strokeColor=#2f54eb;strokeWidth=2;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="360" y="380" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-10" value="Question Service&#xa;题库管理" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f0f5ff;strokeColor=#2f54eb;strokeWidth=2;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="480" y="380" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-54" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="40E4A47yQaY0a98WVuZL-11" target="40E4A47yQaY0a98WVuZL-10">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-11" value="Exam Service&#xa;考试流程管理" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f0f5ff;strokeColor=#2f54eb;strokeWidth=2;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="720" y="380" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-12" value="Scoring Service&#xa;自动评分" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f0f5ff;strokeColor=#2f54eb;strokeWidth=2;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="720" y="490" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-13" value="ML / Recommend&#xa;智能选题与评估" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f0f5ff;strokeColor=#2f54eb;strokeWidth=2;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="480" y="490" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-15" value="关系型数据库&lt;br&gt;MySQL / PostgreSQL" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff1f0;strokeColor=#f5222d;strokeWidth=2;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="380" y="600" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-16" value="Redis 缓存" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff1f0;strokeColor=#f5222d;strokeWidth=2;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="520" y="600" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-17" value="S3 对象存储&lt;br&gt;题目附件" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff1f0;strokeColor=#f5222d;strokeWidth=2;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="660" y="600" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-18" value="日志 / 分析存储" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff1f0;strokeColor=#f5222d;strokeWidth=2;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="800" y="600" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=classic;" edge="1" parent="1" source="40E4A47yQaY0a98WVuZL-11" target="40E4A47yQaY0a98WVuZL-12">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=classic;" edge="1" parent="1" source="40E4A47yQaY0a98WVuZL-10" target="40E4A47yQaY0a98WVuZL-13">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-14" value="Admin Console&#xa;运营后台" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f0f5ff;strokeColor=#2f54eb;strokeWidth=2;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="840" y="380" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-9" value="Job &amp; Company&#xa;岗位与企业管理" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f0f5ff;strokeColor=#2f54eb;strokeWidth=2;fontSize=11;" vertex="1" parent="1">
<mxGeometry x="600" y="380" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="40E4A47yQaY0a98WVuZL-62" value="" style="endArrow=none;html=1;rounded=0;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="330" y="700" as="sourcePoint" />
<mxPoint x="330" y="140" as="targetPoint" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -0,0 +1,60 @@
flowchart LR
%% ======== 样式定义 ========
classDef client fill:#e6fffb,stroke:#13c2c2,stroke-width:1px;
classDef gateway fill:#fff7e6,stroke:#fa8c16,stroke-width:1px;
classDef service fill:#f0f5ff,stroke:#2f54eb,stroke-width:1px;
classDef data fill:#fff1f0,stroke:#f5222d,stroke-width:1px;
%% ======== 客户端层 ========
subgraph Clients[客户端层]
HRWeb[HR Web 前端<br/>Vue / React]:::client
CandApp[应聘者 Web / APP]:::client
end
%% ======== 接入层 ========
subgraph Gateway[接入层]
Nginx[Nginx 反向代理<br/>HTTPS 终止 + 负载均衡]:::gateway
end
%% ======== 应用服务层 ========
subgraph Services[应用服务层]
AuthSvc[Auth Service<br/>认证授权]:::service
JobSvc[Job & Company Service<br/>岗位与企业管理]:::service
QSvc[Question Service<br/>题库管理]:::service
ExamSvc[Exam Service<br/>考试流程管理]:::service
ScoreSvc[Scoring Service<br/>自动评分]:::service
MLSvc[ML / Recommend Service<br/>智能选题与评估]:::service
AdminSvc[Admin Console<br/>运营后台]:::service
end
%% ======== 数据层 ========
subgraph DataLayer[数据层]
DB[(关系型数据库<br/>MySQL / PostgreSQL)]:::data
Cache[(Redis 缓存)]:::data
ObjStore[(对象存储<br/>题目附件)]:::data
LogStore[(日志 / 分析存储)]:::data
end
%% ======== 连接关系 ========
HRWeb --> Nginx
CandApp --> Nginx
Nginx --> AuthSvc
Nginx --> JobSvc
Nginx --> QSvc
Nginx --> ExamSvc
Nginx --> AdminSvc
ExamSvc --> ScoreSvc
ExamSvc --> QSvc
QSvc --> MLSvc
AuthSvc --> DB
JobSvc --> DB
QSvc --> DB
ExamSvc --> DB
ScoreSvc --> DB
Services --> Cache
Services --> ObjStore
Services --> LogStore

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

View File

@@ -0,0 +1,85 @@
<mxfile host="Electron" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/28.2.8 Chrome/140.0.7339.240 Electron/38.4.0 Safari/537.36" version="28.2.8">
<diagram name="Page-1" id="page-1">
<mxGraphModel dx="706" dy="604" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="6" value="配置岗位需求" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;fontColor=#232F3E;fontSize=12;strokeColor=#3399FF;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="250" y="120" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="7" value="配置试题策略" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;fontColor=#232F3E;fontSize=12;strokeColor=#3399FF;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="250" y="180" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="9" value="在线答题" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;fontColor=#232F3E;fontSize=12;strokeColor=#3399FF;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="250" y="360" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="10" value="查看成绩与统计" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;fontColor=#232F3E;fontSize=12;strokeColor=#3399FF;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="250" y="240" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="11" value="提交试题反馈" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;fontColor=#232F3E;fontSize=12;strokeColor=#3399FF;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="250" y="300" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="12" value="题库管理与题目淘汰" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;fontColor=#232F3E;fontSize=12;strokeColor=#3399FF;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="250" y="430" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="13" value="企业接入与运营配置" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFFF;fontColor=#232F3E;fontSize=12;strokeColor=#3399FF;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="250" y="490" width="100" height="50" as="geometry" />
</mxCell>
<mxCell id="14" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-22" target="6" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="170" y="180" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="15" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-22" target="7" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="170" y="180" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="16" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-22" target="10" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="170" y="180" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="17" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-22" target="11" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="170" y="180" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="18" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=1;entryY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-23" target="9" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="650" y="180" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="19" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=1;entryY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-23" target="10" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="650" y="180" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="20" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=1;entryY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-23" target="11" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="650" y="180" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="21" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-27" target="12" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="410" y="490" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="22" style="endArrow=none;html=1;rounded=0;strokeColor=#232F3E;strokeWidth=2;exitX=0.5;exitY=0.5;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="dYsEw_TpROWio0KKOCtD-27" target="13" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="410" y="490" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="dYsEw_TpROWio0KKOCtD-22" value="招聘企业 HR" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;fillColor=#f0a30a;strokeColor=#BD7000;fontColor=#000000;" parent="1" vertex="1">
<mxGeometry x="130" y="210" width="30" height="60" as="geometry" />
</mxCell>
<mxCell id="dYsEw_TpROWio0KKOCtD-23" value="应聘者" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;fillColor=#f0a30a;fontColor=#000000;strokeColor=#BD7000;" parent="1" vertex="1">
<mxGeometry x="440" y="295" width="30" height="60" as="geometry" />
</mxCell>
<mxCell id="dYsEw_TpROWio0KKOCtD-27" value="平台管理员" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;fillColor=#f0a30a;fontColor=#000000;strokeColor=#BD7000;" parent="1" vertex="1">
<mxGeometry x="440" y="450" width="30" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -0,0 +1,47 @@
graph LR
%% ======== 样式定义 ========
classDef actor fill:#fff7e6,stroke:#fa8c16,stroke-width:1px;
classDef system fill:#f0f5ff,stroke:#2f54eb,stroke-width:1px;
classDef usecase fill:#ffffff,stroke:#595959,stroke-width:1px,rx:20,ry:20;
%% ======== 系统边界 ========
System[招聘试题定制平台]:::system
%% ======== 参与者Actors ========
HR(招聘企业 HR):::actor
Candidate(应聘者):::actor
Admin(平台管理员):::actor
%% ======== 用例Use Cases ========
UC_ConfigJob(配置岗位需求):::usecase
UC_ConfigPolicy(配置试题策略):::usecase
UC_GenerateExam(自动生成试卷):::usecase
UC_TakeExam(在线答题):::usecase
UC_ViewResult(查看成绩与统计):::usecase
UC_Feedback(提交试题反馈):::usecase
UC_ManageBank(题库管理与题目淘汰):::usecase
UC_ManageTenant(企业接入与运营配置):::usecase
%% ======== 系统与用例关系 ========
System --- UC_ConfigJob
System --- UC_ConfigPolicy
System --- UC_GenerateExam
System --- UC_TakeExam
System --- UC_ViewResult
System --- UC_Feedback
System --- UC_ManageBank
System --- UC_ManageTenant
%% ======== Actor 与 Use Case 关系 ========
HR --- UC_ConfigJob
HR --- UC_ConfigPolicy
HR --- UC_ViewResult
HR --- UC_Feedback
Candidate --- UC_TakeExam
Candidate --- UC_ViewResult
Candidate --- UC_Feedback
Admin --- UC_ManageBank
Admin --- UC_ManageTenant

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB