菜单

简历评审系统

相关源文件

目的与范围

简历审核系统是Tech Interview Handbook门户的核心功能,它允许用户上传、浏览、审核和评论简历。本文档详细介绍了简历审核功能的技​​术架构、组件和工作流程。

该系统允许用户

  • 提交简历供同行评审
  • 按各种标准浏览和过滤简历
  • 查看和评论简历的特定部分
  • 对有帮助的评论进行投票
  • 跟踪星标简历和审核状态

来源: apps/portal/src/pages/resumes/index.tsx42-44 apps/portal/src/pages/resumes/[resumeId].tsx:42-43, apps/portal/src/pages/resumes/submit.tsx70-73

系统架构

系统概览

来源: apps/portal/src/pages/resumes/submit.tsx apps/portal/src/pages/resumes/index.tsx apps/portal/src/pages/resumes/[resumeId].tsx, apps/portal/src/server/router/resumes/resumes-resume-router.ts

数据流

来源: apps/portal/src/pages/resumes/submit.tsx141-195 apps/portal/src/pages/resumes/index.tsx185-246 apps/portal/src/pages/resumes/[resumeId].tsx:42-105, apps/portal/src/components/resumes/comments/ResumeCommentsForm.tsx78-103

核心组件和数据模型

简历数据模型

主要的Resume实体包含以下属性

来源: apps/portal/src/types/resume.d.ts1-16

主要数据库表

表名目的关键字段
ResumesResume存储简历元数据和PDF的URLid, title, url, role, experience, locationId, isResolved, userId
ResumeComment存储简历上的评论id, resumeId, section, description, parentId, userId
ResumesStar跟踪哪些用户收藏了哪些简历id, resumeId, userId
CommentVote跟踪评论的点赞/点踩id, commentId, userId, value

来源: apps/portal/src/server/router/resumes/resumes-resume-router.ts apps/portal/src/server/router/resumes/resumes-resume-user-router.ts

组件关系

来源: apps/portal/src/pages/resumes/index.tsx apps/portal/src/pages/resumes/[resumeId].tsx, apps/portal/src/components/resumes/comments/ResumeCommentListItem.tsx

用户界面组件

简历浏览页面

简历浏览页面(index.tsx)提供以下功能

  • 用于“所有简历”、“星标简历”和“我的简历”的选项卡式界面
  • 职位、经验水平和地点的过滤器
  • 可搜索的简历列表,附带排序选项
  • 分页控件
  • 常用过滤配置的快捷访问方式

该页面使用多种可重用组件

  • ResumeListItems:简历列表项的容器
  • ResumeListItem:单个简历条目
  • 职位、经验和地点的自动完成输入框
  • 用于快捷访问的过滤器 Pills

来源: apps/portal/src/pages/resumes/index.tsx93-759 apps/portal/src/components/resumes/browse/ResumeListItem.tsx24-98

简历详情页面

简历详情页面([resumeId].tsx)提供

  • 简历元数据(标题、职位、经验水平、地点)
  • 带缩放控件的 PDF 查看器
  • 按简历部分组织的评论
  • 评论投票、编辑和回复功能
  • 所有者控件(编辑、删除、标记为已解决)
  • 星标/取消星标功能

关键组件

  • ResumePdf:PDF 查看器组件
  • ResumeCommentsList:评论显示组件
  • ResumeCommentsForm:评论提交表单
  • ResumeCommentListItem:单个评论显示

来源: apps/portal/src/pages/resumes/[resumeId].tsx:42-527, apps/portal/src/components/resumes/ResumePdf.tsx17-93

简历提交表单

简历提交表单(submit.tsx)处理

  • 简历元数据录入(标题、职位、经验水平、地点)
  • PDF文件上传(带文件类型和大小验证)
  • 附加信息录入
  • 表单验证

该表单实现了

  • 使用react-hook-form进行受控表单管理
  • 使用react-dropzone进行文件上传
  • 用于职位和地点选择的自定义自动完成组件

来源: apps/portal/src/pages/resumes/submit.tsx70-470

后端 API

tRPC 路由器

简历审核系统使用tRPC进行类型安全的API通信

路由器类型描述
resumes.resume.findAll查询获取所有简历的带分页、过滤的列表
resumes.resume.findOne查询按ID获取单个简历
resumes.resume.starMutation收藏简历
resumes.resume.unstarMutation取消收藏简历
resumes.resume.user.upsertMutation创建或更新简历(需要认证)
resumes.resume.user.resolveMutation将简历标记为已解决/未解决(需要认证)
resumes.resume.user.deleteMutation删除简历(需要认证)
resumes.resume.user.findUserStarred查询获取当前用户收藏的简历(需要认证)
resumes.resume.user.findUserCreated查询获取当前用户创建的简历(需要认证)
resumes.comments.list查询获取简历的评论
resumes.comments.user.createMutation创建评论(需要认证)
resumes.comments.user.replyMutation回复评论(需要认证)
resumes.comments.user.editMutation编辑评论(需要认证)
resumes.comments.user.deleteMutation删除评论(需要认证)
resumes.comments.votes.list查询获取评论的投票
resumes.comments.votes.user.upsertMutation给评论点赞或点踩(需要认证)
resumes.comments.votes.user.deleteMutation从评论中移除投票(需要认证)

来源: apps/portal/src/server/router/resumes/resumes-resume-router.ts14-336 apps/portal/src/server/router/resumes/resumes-resume-user-router.ts13-452

关键用户工作流

简历提交工作流

  1. 用户导航到/resumes/submit
  2. 用户填写简历详情表单
    • 标题
    • 职位(从自动完成中选择)
    • 地点(从自动完成中选择)
    • 经验水平
    • PDF简历文件(3MB限制)
    • 附加信息(可选)
  3. 表单验证输入
  4. 提交时
    • PDF文件上传至存储API
    • 简历元数据通过resumes.resume.user.upsert保存到数据库
    • 用户被重定向到浏览页面

来源: apps/portal/src/pages/resumes/submit.tsx141-195

简历审核工作流

  1. 用户在/resumes页面使用过滤器或搜索浏览简历
  2. 用户点击简历以导航到/resumes/[resumeId]
  3. 用户阅读简历PDF
  4. 用户点击“添加您的评论”以打开评论表单
  5. 用户在一个或多个部分添加评论
    • 通用
    • 教育背景
    • 经验
    • 项目
    • 技能
  6. 评论通过resumes.comments.user.create提交
  7. 评论显示在相应部分
  8. 其他用户可以使用resumes.comments.votes.user.upsert对评论进行投票
  9. 用户可以通过resumes.comments.user.reply回复评论

来源: apps/portal/src/pages/resumes/[resumeId].tsx:229-249, apps/portal/src/components/resumes/comments/ResumeCommentsForm.tsx25-216 apps/portal/src/components/resumes/comments/comment/ResumeCommentVoteButtons.tsx17-149

简历管理工作流

简历所有者可以

  1. 通过“编辑”按钮编辑其简历详情
  2. 通过 resumes.resume.user.resolve 将简历标记为“已审核”或“未审核”
  3. 通过 resumes.resume.user.delete 删除其简历及相关评论

任何已登录用户可以

  1. 通过 resumes.resume.starresumes.resume.unstar 收藏/取消收藏简历
  2. 过滤以查看他们收藏的简历或提交的简历

来源: apps/portal/src/pages/resumes/[resumeId].tsx:176-227

过滤和搜索

系统支持复杂的过滤和搜索功能

筛选类型

  • 职位筛选:按职位(工程、产品等)进行筛选
  • 经验筛选:按经验级别(实习、入门级等)进行筛选
  • 地点筛选:按国家进行筛选
  • 自定义筛选:
    • 仅显示未审核的简历
    • 显示最受欢迎的10份简历

筛选实现

筛选是通过以下组合实现的:

  • 前端状态管理,使用 useState 和 URL 参数
  • 后端查询参数,用于生成 SQL WHERE 子句
  • 缓存筛选计数,以提供快速的UI反馈

来源: apps/portal/src/utils/resumes/resumeFilters.ts11-36 apps/portal/src/utils/resumes/resumePrismaUtils.ts41-57

简历评论系统

评论系统允许对简历的特定部分进行结构化反馈

评论版块

评论被组织在预定义的简历版块中

  • 通用
  • 教育背景
  • 经验
  • 项目
  • 技能

评论功能

  • 层级评论:支持嵌套回复
  • 投票系统:每条评论都有点赞和点踩
  • 编辑/删除:用户可以编辑或删除自己的评论
  • 可展开文本:长评论可以折叠/展开

来源: apps/portal/src/components/resumes/comments/ResumeCommentsList.tsx24-104 apps/portal/src/components/resumes/comments/ResumeCommentListItem.tsx19-180 apps/portal/src/components/resumes/shared/ResumeExpandableText.tsx8-47

集成点

简历审核系统与多个其他组件集成

认证系统

  • 使用 next-auth 进行用户身份验证
  • 简历提交和评论的受保护路由
  • 用户特定视图(我的简历、收藏的简历)

文件存储系统

  • 用于 PDF 文件存储的自定义 API 端点
  • 支持文件大小限制和类型验证
  • 简历删除时删除文件

Google Analytics

  • 用户交互跟踪
    • 简历列表视图
    • 简历详情视图
    • 评论提交
    • 收藏/取消收藏操作
    • 筛选器使用情况

来源: apps/portal/src/pages/resumes/[resumeId].tsx:46-50, apps/portal/src/pages/resumes/submit.tsx155-161

结论

简历审核系统为用户提供了一个全面的平台,用于接收和提供简历反馈。其模块化架构由浏览、提交、查看和评论组件组成,它们协同工作以创造无缝的用户体验。该系统利用 tRPC 进行类型安全的 API 通信,并与更广泛的 Tech Interview Handbook 平台集成。