# LynxHire-PC **Repository Path**: cmdszqs/LynxHire-PC ## Basic Information - **Project Name**: LynxHire-PC - **Description**: PC端主要包含b端(hr工作台)和平台端(平台管理员工作台) - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-03 - **Last Updated**: 2026-08-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 灵犀互聘 前端仓库 单仓库承载 **B 端 HR 企业工作台** 与 **C 端候选人门户**(均 PC 网页),两端共享同一套 Umi 工程。 基于 `@umijs/max` 4.x + antd 5.x + useModel,依据《灵犀互聘-前端系分总文档 V1.3-FE》搭建。 ## 快速开始 ```bash npm install npm run dev ``` - 开发环境访问 `http://localhost:8000`,`/v1` 接口已代理到 `http://localhost:8080` - `mock/` 目录提供本地 mock,前端可独立运行(mock 优先级高于 proxy) - 登录验证码固定 `123456` ## 技术栈 | 层面 | 选型 | | --- | --- | | 框架 | @umijs/max 4.x | | UI | antd 5.x + @ant-design/pro-components | | 状态管理 | useModel(Umi 内置数据流) | | HTTP | @umijs/max 内置 request + useRequest | | SSE | fetch + ReadableStream + AbortController | | WebSocket | 原生 WebSocket 封装(指数退避重连) | ## 目录结构 ``` src/ pages/ b/ ← B 端 HR 企业工作台(业务代码都在这) components/ ← B 端专属组件(JobForm / InviteModal / MatchBar / SSEHandler 等) login/ ← B 端登录页 job/ ← 岗位管理 talent/ ← 人才库 question/ ← 模拟出题 message/ ← 消息中心 settings/ ← 企业设置 c/ ← C 端候选人门户(自包含) api.ts ← C 端接口 types.ts ← C 端类型 token.ts ← candidate_token 存取 layout.tsx ← C 端顶栏布局 guard.tsx ← C 端登录守卫(未登录跳 /c/login) login/ home.tsx jobs.tsx jobDetail.tsx applications.tsx index.tsx ← 根路径 / 重定向(按登录态 -> /c 或 /jobs 或 /login) 403.tsx 404.tsx app.tsx ← Umi 运行时:request 拦截器 / getInitialState / layout / access access.ts ← Umi 权限定义(isLogin / isCandidateLogin) models/ ← Umi 约定目录:全局状态(useModel('app') / useModel('auth')) wrappers/ ← Umi 约定目录:路由守卫(当前未启用) api/ ← 共享:后端接口封装(B 端接口;C 端接口在 pages/c/api.ts) types/ ← 共享:业务类型(B 端领域类型;C 端类型在 pages/c/types.ts) utils/ ← 共享:token / constants / crypto / sse / websocket 等 mock/ ← 开发环境 mock(auth/enterprise/job/talent/question/message/candidate) ``` ### 代码该写哪 | 你要改什么 | 去哪里 | | --- | --- | | B 端 HR 页面(岗位/人才/出题/消息/设置) | `src/pages/b/` | | B 端 HR 接口 | `src/api/`(如 `job.ts`、`talent.ts`) | | B 端 HR 专属组件 | `src/pages/b/components/` | | C 端候选人页面 | `src/pages/c/` | | C 端候选人接口 / 类型 / token | `src/pages/c/` 内的 `api.ts` / `types.ts` / `token.ts` | | 两端共用的接口类型 | `src/api/types.ts` | | 两端共用工具 | `src/utils/` | | 全局状态(useModel) | `src/models/` | | mock 接口 | `mock/` | | 路由表 | `.umirc.ts` `routes` | ### 核心约定 - **B 端路由**:`/jobs`、`/talent`、`/question`、`/message`、`/settings`,走 ProLayout,`access: 'isLogin'` - **C 端路由**:`/c/*`,全部 `layout: false`(不用 B 端 ProLayout),登录态由页面内部 `guard.tsx` 自查 - **登录态隔离**:B 端存 `localStorage hr_token`(`src/utils/token.ts`),C 端存 `candidate_token`(`src/pages/c/token.ts`),互不覆盖 - **请求头**:request 拦截器按登录态自动设 `X-Client-Type: HR_WEB / CANDIDATE_WEB` - **401**:按当前登录态跳对应登录页(`/login` 或 `/c/login`) - `models/` / `wrappers/` / `access.ts` 是 Umi 约定位置,不要移动 ## 登录 ### B 端(HR 工作台) - 账号由企业入驻审核通过后创建,不支持自助注册 - 手机号 + 密码 + 短信验证码三要素登录 - 登录成功后将 token 存储于 `localStorage.hr_token` ### C 端(候选人门户) - 账号由企业邀约或自主注册后创建 - 手机号 + 短信验证码登录 - 登录成功后将 token 存储于 `localStorage.candidate_token`