干过几个前后端分离的实战项目之后,再看"nodejs基于vue的养老院服务系统的设计与实现"这种题目,我第一反应是:这不就是典型的毕设/课设级全栈项目吗?很多人一拿到这种题,就急着找代码、扒模板,结果把系统做成了"Excel表格录入页面"——没有任何业务逻辑,也没有权限边界,答辩的时候一问就露馅。
所以这篇我打算换个思路,不贴一整段让你直接复制的完整代码。我更想把这套东西拆开讲清楚——为什么这个系统适合用Node.js + Vue这套组合来做、模块到底怎么切、表结构怎么设计、前后端联调的时候哪些地方最容易卡壳、以及上线部署前你还需要补哪些课。我自己在带人做同类项目时,发现大家踩的坑都高度一致:环境装不明白、跨域调不通、权限一张纸、路由守卫没概念。这篇文章就是把这些坑一个个填平。
1. 养老院服务系统的需求边界:先搞清楚你要做的是"管理系统"还是"业务平台"
1.1 第一件事不是写代码,是把"人"和"事"分清楚
养老院服务系统看起来是一个系统,但实际上使用者至少分四类:
- 管理员(院方):负责全院数据总览、护工分配、费用审核、床位管理。
- 护工:接收排班任务、填写老人日常护理记录、上报异常情况。
- 老人/家属:查看老人档案、费用明细、健康记录(有些系统还会做探访预约、请假申请)。
- 系统运维角色:基本可以归入管理员,但权限上要单独留接口。
很多初次做这个题的人犯的第一个错误,就是"只建一张user表,加一个role字段完事"。但你在设计数据库的时候如果不在逻辑上把这几类人彻底分开,后面做的每个页面都会越写越拧巴——护工给家属端留了删除按钮、家属端直接能看到整个养老院的床位图,这类事故我见太多了。
我的建议是,在建表前先画一张简单的业务流转图(不需要用专业工具,纸笔都行),把四个角色和核心实体(老人、床位、排班、费用、护理记录、家属)之间的关系落到纸面上:
- 一个老人对应一个床位,但可能有多个家属账号;
- 一个护工可以负责多个老人,但一个老人同一时间只归属于某个护工小组;
- 费用账单按月生成,关联护理等级和床位费;
- 排班记录关联到护工和日期,而不是关联到老人。
这些关系都捋清楚了,你再去写model和router,心里才会有底。
1.2 核心模块一共就那么几个:档案、排班、费用、健康记录
养老院业务看着复杂,抽掉枝枝叶叶,核心模块不会超过六块:
| 模块名称 | 核心功能 | 对应主要角色 |
|---|---|---|
| 老人档案管理 | 入住登记、家属绑定、护理等级评估、退住办理 | 管理员、护工 |
| 床位管理 | 床位分配、空闲/占用状态维护、楼层/房间维度 | 管理员 |
| 护工排班 | 排班表生成、换班申请、考勤统计 | 管理员、护工 |
| 健康/护理记录 | 日常护理登记、体征数据录入、异常预警 | 护工、家属 |
| 费用管理 | 月度账单生成、缴费记录、欠费提醒 | 管理员、家属 |
| 消息/公告 | 院内通知、个人消息推送 | 全部角色 |
我为什么要强调"模块"而不是"功能列表"?因为很多人在设计时把"功能"列得无比细致——多达三四十个菜单项,但数据表就三张。真按这个方案做完,前端页面会大量重复,后端接口也会变成一个巨型控制器。如果按照上面六大模块去切,每个模块单独一套controller/service/router/views,代码的可维护性会好很多,答辩的时候也更容易说清楚"我的系统是怎么分层的"。
1.3 业务流程闭环:从入住到退住,你要走通一条线
我自己判断一个养老院系统做得好不好,不看功能多不多,而是看能不能把"入住-在住-退住"这条主线走通:
- 老人入院,管理员登记身份证信息、上传体检报告、建立档案;
- 管理员分配床位(床位状态自动从"空闲"切为"占用");
- 为老人指定护理等级(自理/半自理/全护理),费用模块根据档案生成首月账单;
- 护工开始按排班表记录每日护理情况;
- 家属通过家属端查看记录、在线缴费;
- 老人退住时,系统生成结算单,床位释放。
你把这个闭环讲清楚了,系统就不是一堆孤立页面的拼凑,而是一个有业务语义的产品。这也是我反复和做毕设的朋友强调的一句话:"页面只是表现,流程才是灵魂。"
2. 技术选型逻辑:为什么我用Node.js + Vue,而不是Spring Boot
2.1 这套组合在中小型系统里的真实优势
现在很多课设和毕设依然首选Spring Boot,但我得说句公道话:如果你的目标是"快速交付一个逻辑完整、可演示、可部署的前后端分离项目",Node.js + Vue的组合其实更顺手。
第一,前后端语言统一。后端用Node.js写接口,前端用Vue写页面,两边都是JavaScript/TypeScript,数据类型、命名风格、JSON结构可以直接对齐,你不需要在"后端定义了一个long类型,前端却按string处理"这种问题上浪费时间。
第二,生态工具链成熟。Vue有Vite和Vue CLI,Node有Express或Koa,数据库用MySQL(配Sequelize)或MongoDB(配Mongoose),JWT做登录鉴权,Nodemon做热更新——整个工具链你一天就能搭完。对比Spring Boot要处理Maven依赖、Tomcat配置、XML/注解一堆东西,Node.js的启动速度确实是秒级的。
第三,更贴近前后端分离的真实协作模式。现在企业里前后端分离已经是标配,前端团队和后端团队各维护一套代码。你在这个项目里用Node.js写RESTful API,用Vue写SPA,联调用Axios,本身就是对"真实工程协作方式"的一次模拟。
2.2 后端选型:Express还是Koa
Express和Koa都是Node.js里非常成熟的Web框架。我的个人习惯是项目用Express,因为它中间件生态最全、入门资料最多、出问题一搜就有解决方案。
Koa的优势在于洋葱模型和async/await写起来更现代,但它的核心库非常精简,很多功能要自己组合中间件。对做课设/毕设的同学来说,Express的req.params、res.json()、next()这三个API你十分钟就能掌握。不要在这种选择上纠结太多,选成熟的那个,把时间留给业务逻辑。
2.3 前端选型:Vue 3 + Vite + Element Plus
现在做Vue项目,我建议直接用Vue 3。Vue 3的组合式API(Composition API)配合<script setup>,写起来比Vue 2的选项式API(Options API)更简洁,状态管理用Pinia,路由用Vue Router 4,UI组件库用Element Plus。这套组合几乎就是目前中型后台管理系统的主流标配。
这里多说一句:项目热词里有很多同学搜"vue组合式和选项式混合开发",说明大家容易在Vue 2和Vue 3之间摇摆。我的建议是做新项目就固定用Vue 3 + 组合式API,不要混合。混合两套写法最常见的后果是:同一个项目里某组件用export default { data(), methods },另一个组件用setup,后续维护的人每次都要先分辨"这是哪种写法"才能改代码。
2.4 数据库:MySQL还是MongoDB
如果只是做一个单机运行的课设,MySQL就够了,原因很简单:
- 养老院管理系统的数据以结构化数据为主——费用账单、床位状态、排班记录,用表格存最自然;
- 你答辩的时候,MySQL + Sequelize这种组合不会给自己挖坑;
- MySQL的图形化工具(Navicat / Workbench)能让你在出问题时快速看库里的数据对不对。
MongoDB适合档案、健康记录这类文档结构较多的场景,但如果你的数据量不大、关联关系又复杂,强行上MongoDB反而会让联表查询变成一场灾难。我可以负责任地说一句:以这类系统的复杂度,MySQL是永远不会选错的方案。
3. 环境搭建中最容易翻车的细节:Node.js安装、npm配置、前端脚手架
3.1 Node.js版本选择:不是越新越好
很多人在第一步就被Node.js困住了,而且栽在版本选择上。我见过有人装了最新的Node 22,结果某些原生模块编译不通过;也有人装了很老的Node 12,导致Vite要求Node >= 18直接启动失败。
我的建议是:装LTS版本(比如Node 18或Node 20),不要追最新版。判断标准很简单——打开 nodejs.org ,看左侧标着"LTS"的那个版本号,直接下载那个。LTS版本意味着社区验证充分、第三方依赖兼容性最好。
装完之后在终端验证:
node -v npm -v如果两个命令都能输出版本号,说明安装成功。注意:Windows安装包默认会勾选"Add to PATH"选项,这一步一定要保留勾选,否则后续命令行里找不到node命令。
3.2 全网高频报错:npm.ps1无法加载,PowerShell禁止运行脚本
这个报错出现频率高到什么程度?在Node.js相关热搜词里,几乎长期占据前三:
npm : 无法加载文件 D:\Program Files\nodejs\npm.ps1, 因为在此系统上禁止运行脚本。这个问题的本质不是npm坏了,而是Windows PowerShell的执行策略(Execution Policy)默认阻止了.ps1脚本运行。你在cmd里执行npm -v可能没问题,但一换到PowerShell就报这个错。
解决方案是打开PowerShell(以管理员身份),执行:
Set-ExecutionPolicy RemoteSigned然后输入Y确认。RemoteSigned的含义是:本地创建的脚本可以运行,从网上下载的脚本必须有数字签名。这是一个相对安全的策略,适用于开发场景。
如果你不想改全局策略,也可以只针对当前用户设置:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned设置完成后,重新打开PowerShell,npm -v就正常了。这个坑我会建议每个做Node.js项目的朋友都先踩一遍再填平,因为它几乎必然出现在每台新电脑上。
3.3 镜像源和全局配置:先配好这两样再动手
安装完Node.js后,建议立刻做两件小事:
- 配置npm镜像源。国内直连npm官方源经常超时,换成淘宝镜像(npmmirror):
npm config set registry https://registry.npmmirror.com验证方式:
npm config get registry最好再建立单独目录来管理全局包:
npm config set prefix "D:\nodejs_global" npm config set cache "D:\nodejs_cache"这样做的好处是:全局安装的包(比如@vue/cli、pm2、nodemon)不会堆到C盘系统目录里,后续装新模块时也不会出现权限报错。
- 安装Vite并创建Vue项目。我个人推荐用Vite创建项目,比Vue CLI更快:
npm create vite@latest elder-care-frontend -- --template vue cd elder-care-frontend npm install npm run dev如果你更习惯Vue CLI:
npm install -g @vue/cli vue create elder-care-frontend两种方式都能用,Vite是目前的趋势。项目创建完能正常打开页面后,再做下面的后端部分,不要两个一起开工——一面前端跑不起来一面后端报错,排查起来会非常痛苦。
3.4 后端项目初始化:Express + Sequelize
后端项目基本结构我习惯这样建:
elder-care-server/ ├── app.js # 入口文件 ├── config/ │ └── db.js # 数据库配置 ├── models/ # 数据模型(Sequelize Model) ├── controllers/ # 控制器(处理业务逻辑) ├── routes/ # 路由定义 ├── middleware/ # 中间件(JWT校验、错误处理) ├── utils/ # 工具函数 └── package.json初始化非常简单:
mkdir elder-care-server && cd elder-care-server npm init -y npm install express mysql2 sequelize cors jsonwebtoken bcryptjs npm install nodemon --save-devexpress:核心Web框架;mysql2:MySQL驱动,给Sequelize用;sequelize:ORM,让你用JS对象操作表记录;cors:解决跨域请求问题(前后端分离必装);jsonwebtoken:生成和校验JWT;bcryptjs:密码加密,不要明文存密码;nodemon:文件变更自动重启服务,开发神器。
3.5 数据库创建:编码问题一定要盯着看
用Sequelize连数据库之前,先手动建库:
CREATE DATABASE elder_care DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;注意一定要用utf8mb4而不是utf8。很多人的系统出现中文乱码、emoji存不进去,查半天发现是库的字符集用的是老的utf8。在创建库时就选utf8mb4_unicode_ci,后面所有表都默认继承这个编码,可以少掉一大半中文字符集问题。
4. 核心接口设计与前后端联动:从登录到业务模块走一遍
4.1 JWT登录鉴权:前后端分离的标准姿势
传统Session登录适合服务端渲染的架构,前后端分离之后,接口无状态化是基本要求。JWT的方案是:登录成功之后,后端签发一个token,前端存到localStorage或Pinia中,之后每个请求都在Authorization头带上token,后端中间件校验通过才放行。
后端登录接口示意:
// controllers/authController.js const jwt = require('jsonwebtoken'); const bcrypt = require('bcryptjs'); const { User } = require('../models'); exports.login = async (req, res) => { const { username, password } = req.body; const user = await User.findOne({ where: { username } }); if (!user) return res.status(401).json({ message: '用户不存在' }); const isValid = bcrypt.compareSync(password, user.password); if (!isValid) return res.status(401).json({ message: '密码错误' }); const token = jwt.sign( { id: user.id, role: user.role }, process.env.JWT_SECRET || 'elder-care-secret', { expiresIn: '2h' } ); res.json({ token, user: { id: user.id, username: user.username, role: user.role } }); };前端Axios拦截器统一带token:
// utils/request.js import axios from 'axios'; const request = axios.create({ baseURL: '/api', timeout: 10000 }); request.interceptors.request.use(config => { const token = localStorage.getItem('token'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }); export default request;4.2 路由守卫:前端页面不能让登录用户乱闯
只验证后端接口是不够的,前端还要做路由级拦截。Vue Router 4里的守卫写法:
// router/index.js router.beforeEach((to, from, next) => { const token = localStorage.getItem('token'); if (to.meta.requiresAuth && !token) { next('/login'); } else if (to.meta.role && to.meta.role !== localStorage.getItem('role')) { next('/403'); } else { next(); } });这样访问受保护页面时,如果没有token会直接跳登录页;如果需要管理员角色但当前登录的是护工,则跳到403页面。前后端双保险才是完整的权限方案,只做前端不做后端,接口被直接调用就暴露了;只做后端不做前端,页面体验就很差。
4.3 RESTful接口设计:以老人档案为例
我习惯的接口风格是这样的(RESTful语义 + 统一返回格式):
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/elders | 新增老人档案 |
| GET | /api/elders | 分页查询老人列表 |
| GET | /api/elders/:id | 查询老人详情 |
| PUT | /api/elders/:id | 更新老人档案 |
| DELETE | /api/elders/:id | 删除老人档案(建议逻辑删除) |
统一返回格式也很有必要,否则前端每次都要判断不同字段的存在性:
// utils/response.js exports.success = (res, data, message = 'ok') => { res.json({ code: 0, data, message }); }; exports.error = (res, message, code = 1) => { res.status(200).json({ code, message, data: null }); };把code放到响应体里,网络状态码一直保持200,前端只用判断code是否为0,很省事。
4.4 Vite代理解决跨域:开发环境的No.1问题
前后端分离开发时,前端跑在localhost:5173,后端跑在localhost:3000,Axios直接请求http://localhost:3000必然触发跨域。虽然你后端装了cors中间件可以放行,但更推荐的做法是在Vite里配代理,让前端代码里用相对路径/api开头,由Vite dev server转发到后端:
// vite.config.js export default defineConfig({ plugins: [vue()], server: { port: 5173, proxy: { '/api': { target: 'http://localhost:3000', changeOrigin: true } } } });这样前端里请求/api/elders,开发环境中实际上被转发到http://localhost:3000/api/elders。跨域问题消失,且代码里不需要写死后端地址,部署时也更灵活。
4.5 联调排查路线:前端报错先别急着改代码
我在给朋友做联调指导时,总结了一个"接口排查五步走":
- 打开浏览器开发者工具(F12),看Network里请求有没有发出;
- 看请求URL是否正确、请求头里有没有token;
- 看响应体里的
code是什么——业务错误还是网络错误; - 后端看终端日志,有没有走到对应的路由;
- 用Postman/Apifox单独测同一个接口,确认是后端问题还是前端问题。
很多同学一遇到"前端页面数据没显示",第一反应就是改前端代码,结果查了半天是后端接口500了。记住,数据链路是"页面 -> 接口 -> 数据库",排查也要按这个顺序来。
5. 运行过程中的疑难杂症:那些反复出现的报错和处理思路
5.1 Node.js版本升级:Windows上的版本切换
热搜词里有"windows如何升级nodejs版本",说明很多人被版本问题困扰。Windows不像Linux有nvm那么顺滑,最常见的两种方式是:
- 去 nodejs.org 下载最新LTS安装包,直接覆盖安装,
node -v就会变成新版本; - 用nvm-windows工具管理多版本:
nvm install 20、nvm use 20。
我的建议是:如果只是需要升到最新LTS,直接覆盖安装最省心;如果需要在多个项目之间切换不同Node版本(确实有老项目要求Node 14),那再上nvm-windows。
5.2 Vue Devtools装不上:确认版本匹配
Vue项目里调试状态和数据,vue-devtools几乎是必装的浏览器扩展。很多人在Chrome应用商店装完却发现图标是灰色的,根本原因是版本不匹配——Vue 2项目要装Vue.js devtools 6.x,Vue 3项目要装Vue.js devtools 7.x以上版本。
最稳妥的判断方法:打开一个已启动的Vue 3项目页面,如果Vue Devtools图标变亮并能打开组件树,那说明匹配成功。如果图标灰色,就换一个版本再试。
5.3 端口冲突:启动失败的头号嫌疑
Vite默认5173,Express默认3000。如果你之前启动过别的项目,这两个端口可能被占用。报错信息里通常直接告诉你:
Port 3000 is already in use解决办法有两个:
# 找到占用进程并结束 netstat -ano | findstr :3000 taskkill /PID <PID> /F或者在启动命令中指定别的端口:
// package.json "dev": "nodemon app.js"然后在app.js里:
const PORT = process.env.PORT || 3000;5.4 前端页面上有数据但页面空白:路由匹配、容器撑不开、循环key缺失
三个最常出现的情况:
- 动态路由没配置对:刷新
/elders/:id页面时组件没匹配上,URL对但页面空。 - El-Table/卡片容器高度为0:父容器没有撑开,内容渲染了但视觉上空白。
- 列表循环缺
:key:Vue警告但不至于白屏,不过性能和数据更新会出问题。
这类问题用Vue Devtools看组件树非常有效,组件树里有节点但页面不显示,优先怀疑CSS布局。如果组件树压根没有这个节点,优先怀疑路由和数据请求。
5.5 M3U8视频播放:如果系统里要嵌入监控/视频流
热搜词里出现了"vue播放m3u8播放器"。如果养老院系统要做到"房间摄像头画面实时查看"或"家属远程探视"这类功能,通常会涉及m3u8格式的视频流。
Vue 3中推荐hls.js这个库,核心用法是:
npm install hls.jsimport Hls from 'hls.js'; const video = document.getElementById('video'); if (Hls.isSupported()) { const hls = new Hls(); hls.loadSource('http://your-server/live/room1.m3u8'); hls.attachMedia(video); }注意:视频流地址务必通过后端接口返回,不要把内网IP和端口硬编码在前端,这也是安全性的一部分。
5.6 Electron打包Vue:如果之后想做成桌面端
热搜词里还有"electron打包vue项目"。这个方向我不建议在毕设主流程里做,但如果你学有余力,确实可以把Vue项目用Electron包成Windows桌面应用:
npm install electron --save-devElectron主进程负责创建窗口,渲染进程就是你的Vue应用。生产环境直接加载dist目录的文件,开发环境则加载http://localhost:5173。两者之间用IPC通信,记住一个原则:DOM操作在渲染进程,系统能力(文件、窗口、数据库)在主进程。
这个扩展如果做得顺,是可以写进答辩"项目创新与扩展"部分的。但前提是核心的养老院业务系统已经稳定跑通,不要本末倒置。
6. 上线之前,这些细节决定系统是"能跑"还是"经得起问"
6.1 密码加密、参数校验、错误处理三件套
很多课设系统最大的问题不是功能缺失,而是"太脆弱"。我验收别人的项目时,第一件事就是打开注册接口,看密码以什么形式落库——如果直接明文存MySQL,我基本可以确定这个项目的安全意识是零。
正确的做法是使用bcryptjs做哈希:
const bcrypt = require('bcryptjs'); const hashedPassword = bcrypt.hashSync(password, 10);参数校验也必须做。Express 4的写法是在路由层用中间件校验,或者直接在控制器里判断必填字段:
if (!req.body.name || !req.body.idCard) { return res.status(400).json({ code: 1, message: '缺少必要参数' }); }这些逻辑不能省,也不难写。答辩时老师问"你的系统安全性体现在哪里",你能说出"密码哈希加密 + JWT过期 + 参数校验 + 权限控制",就已经超过九成同题目的作品了。
6.2 分页、模糊搜索、数据隔离:管理系统必备三件套
如果做一个列表页只写SELECT * FROM elders然后一次全量返回,那数据量稍微上来一点系统就会卡。管理系统里分页是基本要求:
// controllers/elderController.js const { Op } = require('sequelize'); exports.list = async (req, res) => { const { page = 1, pageSize = 10, keyword = '' } = req.query; const offset = (page - 1) * pageSize; const result = await Elder.findAndCountAll({ where: { [Op.or]: [ { name: { [Op.like]: `%${keyword}%` } }, { idCard: { [Op.like]: `%${keyword}%` } } ] }, limit: Number(pageSize), offset: offset, order: [['createdAt', 'DESC']] }); res.json({ code: 0, data: { list: result.rows, total: result.count, page: Number(page), pageSize: Number(pageSize) } }); };前端配合Element Plus的el-pagination组件使用,接口层和展示层就都能交差了。
前端配合Element Plus的el-pagination组件使用。findAndCountAll是Sequelize自带的分页计数查询,一条语句同时返回列表和总数,比query两次要干净很多。
数据隔离这一条容易被忽略——护工登录后只能看自己负责的老人,而不能看全院的老人列表,这就要在查询条件里额外加一层where条件:
if (req.user.role === 'caregiver') { where.caregiverId = req.user.id; }这种按登录角色动态拼接查询条件的做法,才是"多角色系统"该有的样子。
6.3 日志记录与软删除:答辩时的高级话题
你可以在项目里加入一个简单的操作日志表operation_logs,记录用户的增删改操作。实现方法:
- 在需要记录的接口里调用
logger工具; - 或者在Express中间件层统一处理(改动用POST/PUT/DELETE方法判断)。
这不会花太多时间,但答辩时你可以说"系统具备操作审计能力",这个点是实打实的加分项。
删除功能建议用"软删除":给表加一个deletedAt字段,删除时只更新这个字段而非物理删除。Sequelize里只要在模型中配置paranoid: true就能自动实现。老人档案这种数据是不能说删就删的——万一误删,影响的是真实业务。
6.4 部署上线:云服务器 + PM2 + Nginx 的经典组合
如果你想在答辩时当场演示一个"互联网可访问"的系统,而不是一直localhost,那部署是绕不开的。经典方案是:
- 准备一台云服务器(2核4G肯定够);
- 服务器安装Node.js、MySQL、Nginx;
- 后端项目用PM2守护进程:
pm2 start app.js --name elder-care-server; - 前端项目执行
npm run build,生成dist目录; - Nginx配置:将
/api请求反向代理到http://localhost:3000,其余路径指向dist目录的静态文件。
Nginx关键配置片段:
server { listen 80; server_name your-domain.com; root /var/www/elder-care-frontend/dist; index index.html; location /api { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location / { try_files $uri $uri/ /index.html; } }这样前端的历史路由模式(createWebHistory)刷新时也不会404。PM2还可以帮你在服务器意外重启后自动拉起服务,这一点在答辩演示时很实用——不会出现"现场重启后系统起不来"的尴尬场面。
6.5 一个我建议你尽早做的"演示数据脚本"
很多人做这类系统,最后栽在"数据库里空荡荡,演示的时候页面大片空白"。我的建议是写一个seed.js脚本,预置好admin账号、若干个护工账号、几十个老人档案、一大片床位数据和费用记录,并保证数据之间有真实的关联关系。
这样做有两个好处:一是演示时打开页面就是丰富的数据,不用临时手工录入;二是答辩评委会觉得"这是一个经过实际测试的系统",而不是一个空壳原型。我见过太多人在答辩现场因为"添加按钮点了没反应""列表里没有数据"这种低级问题扣分,一个预置数据脚本就能避免。
6.6 时间规划:完成这个项目的合理节奏
最后给你一个实操层面的时间建议(以每周能投入10~15小时为例):
- 第1周:需求分析、模块拆分、建表、环境安装;
- 第2~3周:后端接口开发(先做登录和老人档案模块,跑通后再扩展);
- 第4~5周:前端页面开发(登录页、布局框架、各模块页面);
- 第6周:前后端联调、修登录态、调跨域、填权限;
- 第7周:部署上线、预置数据、写答辩稿/文档。
这个节奏不算紧张,但对每个环节都要有产出。我最怕遇到的情况是学生花了两周去折腾"用哪个UI框架""是Vue 2还是Vue 3""要不要上TypeScript"——这些决策最多花半天就该定下来,剩下的时间都应该给业务模块。做项目最怕的不是技术难,而是方向来回摇摆。
这套组合跑通的真实体感是:第一周你觉得全是坑,第二周理顺了以后,后面每个模块开发基本是复制粘贴加改字段。Node.js生态的好处就在这——核心框架学完一次,写业务逻辑就是在填数据。如果你正在做同类项目,跟着上面这些模块一个个打通,再按最后这节的部署方案丢到云服务器上,你应该能体会到"从代码到产品"那条路走通的完整过程。