ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Node.js+Vue全栈开发学生就业信息管理系统实战指南

Node.js+Vue全栈开发学生就业信息管理系统实战指南 前阵子接了个全栈项目要做一套学生就业信息管理系统技术栈指定了 Node.js Vue。这类系统在高校里属于典型的信息化管理需求——就业指导中心每天要面对大量学生简历、企业招聘信息、投递记录和统计报表光靠 Excel 和邮件来回倒腾效率低还容易丢数据所以需要一个统一平台把这些数据全部管理起来。系统本身的业务逻辑不算复杂但把前端框架、后端接口、数据库设计、部署运维这套全流程走下来对技术积累是全面的检验。这篇文章把我从设计思路、环境搭建、数据库设计、前后端联调到最终部署上线踩过的坑全部整理出来给正在做类似毕业设计或全栈项目的朋友一份可以直接参考的实操经验。先说一下这个系统最后做出来是什么样。整个项目分为三个角色端学生端可以维护个人简历、浏览招聘信息、投递职位、查看投递进度企业端可以注册入驻、发布职位、查看收到的简历管理员端负责审核企业资质、管理用户和职位、发布公告以及查看统计报表。前后端采用完全分离的架构后端是 Node.js Express MySQL前端是 Vue 3 Vue Router Element Plus通过 RESTful API 通信。看完这篇文章你不仅能复现这套系统还能理解为什么我要在每一步做那样的技术取舍。1. 项目定位与整体设计思路1.1 学生就业信息管理系统到底在解决什么问题先别急着谈技术这个系统的核心是业务问题。很多学校现在的就业管理方式非常原始就业信息发在班级QQ群里简历通过邮箱收投递状态靠学生自己问统计就业率时再让辅导员一个个催。这种模式下学生容易错过招聘节点企业也愁找不到匹配的人学校更没法学数据层面掌握就业情况。所以我做这个系统时第一件事不是写代码而是把角色和流程梳理清楚。系统里有三类用户每类用户关心的东西完全不一样。学生关心的是有什么岗位适合我、投了没被查看企业关心的是发布的职位有没有人投、来的简历跟岗位匹配不匹配管理员关心的是企业入驻是否合规、整体就业情况如何。三套诉求如果混在一个页面里体验一定崩。所以要拆成三个端口每个端口一套独立的页面和接口权限。这也顺带决定了整个项目的边界需要用户注册登录、需要角色区分、需要职位发布与检索、需要简历投递流程、需要简单的统计看板。把这些功能范围圈定好后面设计和写代码才不会跑偏。很多新手做系统爱堆功能但真实的项目要做减法。这个系统里我特意砍掉了在线面试、薪酬对比、论坛社区这些锦上添花的功能因为就业信息管理系统现阶段最核心的诉求就是把信息流跑通把状态记录清楚其他都可以等二期。1.2 为什么选 Node.js Vue 这个技术组合关于技术选型我挨个说说理由。后端选 Node.js 主要看中三点第一JavaScript 一门语言通吃前后端你写业务逻辑、处理 JSON 数据时的心智负担会小很多不用在多种语言之间来回切换第二Express 框架非常轻中间件机制直观适合快速搭建 RESTful API第三异步非阻塞 I/O 在应对高并发读请求上有天然优势像职位列表、投递状态查询这类高频读接口Node.js 的并发表现完全够用。前端选 Vue 的理由更简单。Vue 的响应式数据和组件化开发模式非常适合这种页面多、交互逻辑相似的后台管理系统。比如学生信息页、企业信息页、职位卡片列表拆成组件后到处复用开发效率提升非常明显。Vue 3 的组合式 API 对逻辑组织也更友好一个业务功能相关的响应式变量和方法放一起维护起来不会乱。搭配 Element Plus 组件库表格、表单、弹窗、分页这些后台系统最常用的组件开箱即用省下了大量调 UI 的时间。数据存储这块选了 MySQL原因是系统里大多是结构化的关系数据——用户、职位、投递记录天然适合用表来存而且 MySQL 的生态成熟部署和备份方案都很稳定。有人会问为什么不用 MongoDB对这类强关系、强事务的场景比如一笔投递操作需要同时更新投递表和职位状态关系型数据库的事务保障会让你少操很多心。2. 开发环境搭建与工具链配置2.1 Node.js 安装与环境变量配置的坑这个环节看着简单其实翻车率极高尤其是对刚接触 Node.js 的同学。我建议直接去官网下载 LTS 版本不要追最新版LTS 版本意味着长时间维护、稳定可靠和项目里依赖包兼容性也最好。安装包默认会帮你勾选 Add to PATH推荐保留这个选项否则装完还要手动配环境变量。不过这里有个细节要重点提醒尽量不要把 Node.js 安装到带中文或空格的路径下。我看到很多人装到了D:\Program Files\这种路径后续在使用很多命令行工具时容易出幺蛾子。我之前就遇到过因为路径空格导致某个 Node 的原生模块编译失败排查了半天才定位到是路径问题。如果确实已经装错了最简单的办法就是卸载重装到D:\nodejs这种纯英文路径千万不要将就。安装完成后打开终端输入node -v和npm -v能正常输出版本号就说明成功了。如果提示无法识别 node 命令大概率是 PATH 没配好系统找不到可执行文件。手动配置环境变量的做法是在系统变量里新建NODE_HOME指向 Node.js 安装目录然后把%NODE_HOME%追加到 PATH 变量里。改完记得重新打开终端窗口环境变量不会在已打开的窗口里自动生效。顺带多说一句我推荐安装一个 nvmNode Version Manager。做多个项目时经常遇到版本冲突——老项目需要 Node 12新项目要 Node 20用 nvm 切换就在一条命令之间。这是当年切到全栈开发后最后悔没有早点养成的工具习惯。2.2 npm 脚本执行策略问题一个高频踩坑点第一次用 Windows PowerShell 执行npm install的人大概率会撞上这个经典报错npm : 无法加载文件 ...\npm.ps1因为在此系统上禁止运行脚本。这个问题本质不是 npm 坏了而是 PowerShell 的脚本执行策略默认是 Restricted禁止运行 .ps1 脚本文件。解决方法很简单在 PowerShell 里执行下面这一行把执行策略改成当前用户级别允许运行本地脚本Set-ExecutionPolicy RemoteSigned -Scope CurrentUser这里解释一下RemoteSigned的含义本地创建的脚本可以运行从网上下载的脚本必须有可信签名才能运行。这个策略对日常开发来说足够安全不明来源的脚本不会在你不知情的情况下被执行。执行后它会弹出确认提示输入Y回车。如果公司电脑有组策略限制改执行策略被拒绝那还有一个更省事的方案直接用 Git Bash 或者 CMD 执行 npm 命令这两个终端不受 PowerShell 执行策略影响。我个人的习惯是 Windows 下统一用 Git Bash既能跑 npm 命令又能用 Linux 风格的命令语法舒适度提升不止一个档次。另外npm 安装依赖慢的问题也值得操心一下。国内直连 npm 官方源经常慢到怀疑人生一条提速方案是把默认 registry 切换到国内镜像源npm config set registry https://registry.npmmirror.com切换之后用npm config get registry检查一下生效没有。以后装包速度会快非常多。2.3 前端项目脚手架与目录结构Vue 项目我推荐用 Vite 来初始化相比 Vue CLIVite 的冷启动速度是真的快开发体验好不少。用下面的命令就能快速创建一个 Vue 3 项目npm create vitelatest student-employment-frontend -- --template vue安装依赖并启动开发服务器cd student-employment-frontend npm install npm run devVite 的默认脚手架生成的项目结构比较精简我会手动做一层目录规划把业务模块拆分清楚因为后面项目一大目录乱就全乱了。我的习惯是在src下建这些目录api目录统一放接口请求封装每个模块一个文件比如user.js、job.js、application.jsviews目录按角色拆页面文件夹比如student/、company/、admin/router目录放路由配置文件store目录放 Pinia 状态管理components目录放通用组件比如JobCard.vue、PageTable.vue这样规划的一个直接好处是后期加功能时代码应该放哪里不用想跟着目录名走就行。很多同学习惯把业务逻辑全堆在页面组件里一个文件上千行后面几乎没法维护。组件拆分的原则是同一代码块在两个及以上页面复用就提取比如职位列表卡片、用户表格这种就必须做成通用组件。3. 数据库设计与核心模块拆分3.1 功能模块划分与角色权限数据库设计之前先把系统的模块边界画清楚。我的设计是四大模块第一个是用户与权限模块包含用户注册、登录、角色校验。角色我用了最简单的方式——在用户表里加一个role字段值有student、company、admin三种。网上很多教程推荐用独立的角色表和权限表可以做细粒度权限控制但对这个项目而言有点过度设计。三个角色的权限差异可以用中间件轻松控制单独建几张关联表反而是给自己找麻烦。第二个是学生信息模块。学生登录后要维护扩展信息比如真实姓名、专业、学历、毕业年份、联系方式、个人简历等。这些字段和用户表是 1 对 1 的关系单独拆一张学生信息表和用户表通过user_id关联。为什么不直接存在用户表因为学生字段较多且只对学生角色有意义拆开可以让用户表保持精简。第三个是企业与职位模块。企业账号注册后需要填写企业名称、行业类型、规模、简介、地址管理员审核通过后才能发布职位。职位表存企业 ID、职位名称、招聘类型校招/社招、薪资范围、学历要求、工作地点、职位描述、发布时间、状态等字段。第四个是投递与统计模块。学生投递职位会生成一条投递记录记录里包含学生 ID、职位 ID、投递状态待查看/已查看/已通知/不合适、投递时间。统计模块就可以基于这张表做各种聚合查询比如某企业的职位投递量、某学校的就业率统计。角色与模块的对应关系如下表角色可用模块关键权限说明学生个人信息、简历、职位检索、投递投递操作只能对学生角色开放企业企业资料、职位管理、投递列表只能操作本企业的数据和职位管理员用户管理、企业审核、公告、统计所有数据可看可管3.2 表结构设计要点接下来是重头戏数据库表结构设计。这一步如果设计不好后面写接口时会发现自己不断在拼接 SQL 和跟表关系打架。我的核心表是六张分别说明每张表的用途和关键字段。用户表users字段如下字段类型说明idbigint 主键自增用户唯一标识usernamevarchar(50) 唯一登录名passwordvarchar(100)加密后的密码rolevarchar(20)student/company/adminstatustinyint1 可用0 禁用created_atdatetime注册时间密码字段必须强调一点不要明文存储。我用了bcryptjs对密码做哈希登录时比对哈希值。这样做的好处是即使数据库泄露用户的密码原文也不会直接暴露。这个习惯在任何项目中都应该坚持。学生信息表student_profiles通过user_id关联users表字段包含真实姓名、性别、专业、学院、学历、毕业年份、手机号、邮箱、个人简介、简历文件路径。简历我会以文件 URL 的形式存路径而不是直接存文件本身文件上传到服务器指定目录数据库只留相对路径。企业信息表company_profiles包含企业名称、统一社会信用代码、所属行业、企业规模、官网地址、企业简介、所在城市、审核状态。审核状态这个字段很关键企业注册后默认为待审核管理员后台审核通过后才能发布职位。职位表jobs字段比较多包括职位标题、所属企业 ID、招聘类型、薪资下限、薪资上限、学历要求、工作地点、职位描述、截止时间、状态。薪资用两个整数而不是一个字符串是为了后续能按薪资区间筛选如果存成 10-20k 这种字符串排序和筛选都会很难受。投递记录表applications有四个核心字段学生 ID、职位 ID、状态、投递时间。为了防重复投递我在学生 ID 和职位 ID 上建立了唯一索引保证同一个人不能对同一职位投两次。这个设计是从业务角度出发的因为重复投递对企业和学生都没有意义。所有表都加上了created_at和updated_at字段这是基本操作定时任务或统计时非常有用。4. 后端接口开发与核心逻辑实现4.1 Express 服务搭建与路由组织后端我用 Express 搭建项目结构比前端还讲究模块化三个字。一个典型的 Express 项目目录长这样server/ ├── app.js ├── routes/ │ ├── userRoutes.js │ ├── jobRoutes.js │ ├── applicationRoutes.js │ └── statsRoutes.js ├── controllers/ ├── middleware/ │ ├── auth.js │ └── errorHandler.js ├── config/ └── models/express项目初始化很简单核心代码就一行const express require(express); const app express(); app.use(express.json());但真正写项目时一定要把路由拆到独立文件夹里而不是全部堆在app.js。比如用户相关的接口统一挂载在/api/user前缀下职位相关的挂在/api/job下代码结构一眼就懂。路由文件里只做路由匹配和参数校验具体业务逻辑放到控制器里这种 MVC 分层思想在 Node 后端同样适用。连接 MySQL 我用了mysql2这个包因为它支持 Promise配合async/await写起来非常舒服。和数据库相关的公共逻辑封装成一个db.js模块导出连接池其他业务模块直接调用。这里有个关键点一定要用连接池而不是每次查询都新建连接否则并发稍微上来数据库瞬间就会被拖垮。const mysql require(mysql2/promise); const pool mysql.createPool({ host: localhost, user: root, password: ..., database: student_employment, waitForConnections: true, connectionLimit: 10, }); module.exports pool;关于 API 响应格式我建议在全项目统一一个包裹格式{ code: 0, message: success, data: ... }。前端拿到响应后先判断code是否为 0再做业务处理。统一格式带来的好处是明显且长期的——前端拦截器可以统一处理错误提示不用每个接口单独写一套判断逻辑。4.2 登录认证与权限控制JWT 的落地登录认证部分我选了 JWTJSON Web Token方案而非传统的 Session。原因在于前后端分离架构下JWT 天然适合后端不存储会话状态token 由客户端保存并在每次请求时携带服务器无状态化部署和横向扩展会简单很多。流程是用户登录成功后后端用jsonwebtoken库签发一个 token里面包含用户 ID 和角色信息设置过期时间比如 24 小时。前端将 token 存在 localStorage 里然后在 axios 请求拦截器里把 token 加到请求头的Authorization字段上格式是Bearer token。// 登录成功签发 token const token jwt.sign( { userId: user.id, role: user.role }, process.env.JWT_SECRET, { expiresIn: 24h } );后端写一个authMiddleware来统一校验 tokenconst authMiddleware (req, res, next) { const authHeader req.headers.authorization || ; const token authHeader.split( )[1]; if (!token) return res.status(401).json({ code: 401, message: 未登录 }); try { const payload jwt.verify(token, process.env.JWT_SECRET); req.user payload; next(); } catch (e) { return res.status(401).json({ code: 401, message: 登录已过期 }); } };在需要角色控制的接口上再包一层requireRole中间件判断当前用户角色是否在允许列表里。比如职位发布接口只有企业角色能调管理员接口只有 admin 能访问。中间件组合式的写法让权限控制非常灵活新增接口时按需叠加中间件就行。这里提醒一点JWT 无状态是有代价的无法在服务端主动吊销某个 token。如果遇到安全事件需要踢人下线只能等 token 自然过期。对这个系统来说页面操作时如果返回 401前端会自动清掉本地 token 并跳转到登录页这样流程上基本够用。4.3 就业信息推荐的核心实现系统里有一个让我花时间最多的功能是针对学生的职位推荐。我不打算引入什么复杂的机器学习模型因为数据量完全撑不起来更容易解释也实用的方案是基于关键词匹配的评分推荐。思路很简单每个职位都有标题和描述每个学生档案里有专业、个人简介。从这些字段中提取关键词计算职位内容和学生信息之间的匹配度打分。比如一个计算机专业的学生看到职位描述里出现 Java、Vue、Node.js 这些词命中数量多分数就高推荐排前。具体做法是用一个简单的分词匹配器把职位描述拆成小写单词数组把学生专业和简介里的关键词也拆成数组然后统计共同词的个数再结合职位发布时间做时间衰减。最终评分公式简化成score 匹配词数量 * 0.6 学历匹配加分 * 0.4。学历匹配加分是职位要求的学历不高于学生学历时加 10 分。这个功能虽然逻辑简单但实际效果已经足够好学生登录后发现推荐栏里的职位确实比全部列表更精准这也说明一个问题——很多看起来很智能的功能用朴素但合理的规则实现性价比是最高的。5. Vue 前端开发与前后端联调5.1 Vue Router 路由配置与登录守卫前端路由我用 Vue Router 4配置方式上有个很实用的设计路由拆成静态两步走。第一步是公共路由比如登录页、注册页所有人可访问第二步是带认证的业务路由比如学生中心、企业管理台、管理员列表页这些页面必须在登录状态下才能访问。登录守卫是通过路由的beforeEach钩子实现的router.beforeEach((to, from, next) { const token localStorage.getItem(token); if (to.meta.requiresAuth !token) { next({ path: /login, query: { redirect: to.fullPath } }); } else { next(); } });to.meta.requiresAuth是在路由配置里给每个页面标记的元信息。这样设计的好处是哪些页面需要登录一看路由表就清楚新加页面时只要在 meta 里声明requiresAuth: true就能自动加上守卫。深入一点说真正严谨的权限控制一定要前后端同时做。前端守卫只能防君子——用户打开页面组件之前就被拦截体验好但后端接口的权限校验才是最终防线不然懂点技术的人完全可以绕过前端直接调用接口拿数据。这也是我上面设计requireRole中间件的原因两边配合才叫完整的权限闭环。5.2 Axios 二次封装与跨域处理前后端分离开发时跨域问题是最容易劝退新手的坎。开发环境下我用 Vite 的代理解决跨域配置在vite.config.js里server: { proxy: { /api: { target: http://localhost:3000, changeOrigin: true, } } }这样前端请求/api/user/login时Vite 开发服务器会自动把请求代理到后端http://localhost:3000浏览器的同源限制就被绕过了。生产环境这个问题由 Nginx 反向代理来解决可以在 Nginx 配置里把/api前缀的请求转发到后端服务。所以跨域问题的根本解法是不要在前端代码里写死后端地址而是用相对路径 代理层转发。请求封装这里要单独说。我在src/api/request.js里创建了一个 axios 实例做两层拦截器请求拦截器自动带上 token响应拦截器统一处理错误码和 401。前端每个页面里就不会出现裸的axios.get了都走封装好的request.get(/job/list)代码可读性和可维护性都好不少。Element Plus 的负责展示这一层省了我非常多事。比如后台管理页的用户表格用el-table加几个属性就是分页、排序全都有搜索表单用el-form快速搭弹窗确认用el-message-box整体界面做出来整洁又专业。前端界面这块日常开发真的不需要从零写 CSS用成熟组件库是省力且正确的选择。5.3 页面模块开发与组件复用页面开发走中我的经验是先搭公共布局再填业务页面。后台系统的布局套路基本固定左边侧边栏菜单、顶部用户信息、中间内容区。这部分我直接封装成一个Layout.vue公共组件所有业务页面都渲染在内容区router-view /里菜单项根据角色动态渲染——学生看到的是职位大厅、我的投递企业看到的是职位管理、简历收件箱管理员看到的是用户管理、企业审核、数据统计。组件复用上最有价值的一个案例是职位卡片组件JobCard.vue。它在三个地方都用到了学生的职位列表中、企业的已发布职位里、管理员的职位管理页。设计时我把职位数据和操作按钮作为插槽暴露出去展示逻辑保持统一操作逻辑由使用方定制。这样职位卡片的样式改了三处页面同步更新不用处处去调。状态管理用了 Pinia。主要存两个全局状态当前登录用户的基本信息和侧边栏折叠状态。有些同学会把所有接口返回的数据都放进 store这其实没必要。只有被多个组件共享、且需要保持一致性的数据才值得进全局 store其他数据放在各自页面组件里管理就好了过度使用全局状态反而让数据流变得神秘而不便。6. 部署上线与常见问题排查实录6.1 前端打包与 Nginx 部署开发完成后部署阶段又是一轮新的挑战。前端需要先打包出静态文件命令是npm run build产物在dist目录。把这dist目录里的文件放到服务器上的 Nginx 静态目录里比如/var/www/student-employment-frontend/。Nginx 配置里除了静态文件托管还必须要配置/api路径的反向代理把接口请求转发到 Node.js 服务的监听端口server { listen 80; server_name your-domain.com; root /var/www/student-employment-frontend; index index.html; location /api { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location / { try_files $uri $uri/ /index.html; } }这一行try_files $uri $uri/ /index.html;是必不可少的。SPA 单页应用的路由是前端动态管理的直接访问https://xxx.com/student/profile时服务器上并没有这个物理文件如果不把请求回退到index.html刷新就白屏、报 404。这个坑当年愣是让我排查了一个小时几乎每个部署 Vue 项目的人都会撞上记住了就不会难受。6.2 后端服务部署与进程守护Node.js 后端部署时不能直接在服务器上挂一个node app.js就完事。首先这家伙是前台进程SSH 窗口一关进程就没了。其次进程一旦崩溃不会自动重启服务就停了。我用了 PM2 来做进程守护npm install -g pm2 pm2 start app.js --name student-employment-server pm2 savePM2 稳定提供了开机自启、日志收集、内存监控等能力对单机部署运维来说完全够用。日常看日志用pm2 logs student-employment-server看状态用pm2 status服务崩了 PM2 几秒内就能自动拉起。环境变量这块也要注意比如数据库密码和 JWT_SECRET不要把真实值写死在代码里。我在服务器上创建了一个.env文件存放这些敏感配置代码里用process.env.DB_PASSWORD读取。这样做的好处是即使代码上传到 GitHub 被公开敏感信息也不会泄露。6.3 高频问题排查速查表整个项目从开发到上线跑下来我记录了一堆踩过的坑挑出现频率最高的做成一个排查速查表希望能帮你少走些弯路错误现象根本原因解决方案启动后端口被占用前一个进程没关干净lsof -i:3000找到进程 PID 后杀掉或者换端口启动前端请求接口返回 404Nginx 没配置/api代理或后端没启动检查 Nginxlocation /api配置用curl http://127.0.0.1:3000/api/...先本地测试请求返回 502 Bad Gateway后端服务崩了或挂了pm2 status查看进程状态pm2 logs看具体报错登录后刷新页面跳回登录页刷新后没有重新校验 token或 token 过期被拦截前端启动时读取本地 token调用/api/user/info拉取用户信息并恢复登录态中文乱码数据库连接配置少了字符集参数建连接池时添加charset: utf8mb4数据库连接数耗尽每次查询都新建连接没复用使用连接池mysql2.createPool避免逐条 query 新建连接npm 安装依赖后启动报缺少模块package.json 里依赖版本不一致删除node_modules和package-lock.json后重新npm install接口数据返回后表格不渲染数据结构不匹配或响应格式不统一对照后端响应包裹结构{ code, message, data }和前端字段名这上面每一个问题我都实际遇到过而且说实话它们不是写项目能力的问题是新人对工具链和运行机制不熟悉导致的。把这套排查表走一遍很多莫名其妙的 Bug 都能稳住心神找到原因。6.4 项目体验优化与安全加固要点系统功能跑通之后不要急着收工。还有一批不做不行的体验与安全层面的优化点这里单独列一下安全层面密码存储必须用bcryptjs加盐哈希登录接口要做好基础的频率限制防止被暴力尝试。所有删除类的敏感操作必须有角色校验不能让普通学生直接调接口删职位。文件上传做一个类型白名单校验只允许上传 JPG、PNG、PDF并且重命名为随机文件名避免用户可执行文件上传导致的安全问题。体验层面用户操作后必须要有反馈不管是提交成功还是失败都要有明确的提示。比如投递职位时如果用户没有完善简历系统应先提示请先完善简历而不是直接投递投递成功后再跳转到投递记录页。职位列表使用分页而不是一次性全量返回页面上加上搜索关键词和筛选条件方便学生快速找到目标职位。性能层面职位列表接口避免直接查全表再排序充分利用 MySQL 的索引。推荐列表的评分计算不要每次请求都重新跑一遍可以加一层简单缓存比如职位数据一小时更新一次。这些优化对这个体量的系统不是必须的但养成了习惯做大型项目时受益无穷。最后再分享一个和这个项目相关的小心得。如果你是要把这套系统写成毕业设计论文最好把思路从我完成了系统调整为我解决了什么问题。论文的章节结构可以跟着背景与意义、需求分析、系统设计、系统实现、系统测试这个脉络走但重点放在需求分析里的用例梳理、系统设计里的模块与数据库设计、系统实现里的核心代码片段解释。代码和细节不是靠粘贴大段源码凑数而是靠清晰的逻辑和自己的语言讲明白为什么这样做。做完系统再回头看论文会发现写起来顺手很多——因为它是真实从实践里生长出来的每一个章节都有实际对应物的。这个系统做完之后我的体会是全栈项目的核心不是某一门技术学得多深而是把每层技术串起来的能力。你开发环境配置明白了、路由守卫会写了、Express 中间件玩转了、Nginx 配置懂了独立完成一个小型系统不成问题。下一步可以在这个系统上继续扩展点个人感兴趣的功能比如简历自动解析、职位推荐算法优化、或是把统计报表做成可视化图表每一步扩展都会让你对整个技术栈的理解更深一层。
返回列表