资讯动态

SpringBoot+Vue疫情管理系统开发:前后端分离实战详解

发布时间:2026/10/16 10:01:19 来源:尧图企业网站定制
1. 项目拆解与架构选型先把这个项目标题拆开看核心是什么SpringBoot Vue 前后端分离、MyBatis 持久层、MySQL 数据库再加一个业务背景——疫情管理系统。2025年再看这套组合说实话没有太多新奇的技术但它恰恰是市面上“最稳妥也最实用”的组合之一。特别是对于做毕设、写简历项目、或者给中小型单位做内部信息管理系统的同学来说这套技术栈足够成熟、生态完善、网上能查到的资料也多真踩到坑了不至于孤立无援。先解释一下为什么是这些技术而不是去追新。SpringBoot 的定位是“简化 Spring 开发的脚手架”内置 Tomcat、自动配置、起步依赖能把过去 Spring MVC 项目里繁琐的 XML 配置全部干掉。Vue 则是目前国内前端圈占有率极高的渐进式框架配合 Element UI 或 Element Plus 这类组件库做后台管理界面效率非常高。MyBatis 半自动 ORM 框架SQL 由开发者自己控制在报表统计、多表联查这类场景下灵活性远超 JPA 那种全自动框架。MySQL 是开源关系型数据库里综合表现最稳的那个性能、运维成本、学习资料都平衡得很好。那这个系统的业务模块应该怎么设计我按最典型的结构拆一下系统登录与权限模块登录认证、验证码、角色权限控制管理员、普通用户、医护人员等人员信息管理模块居民或员工的基础信息维护包括健康状态、行程记录、疫苗接种情况健康上报模块每日体温上报、健康状况登记、异常情况标注出入登记模块进出场所的记录包括时间、体温、目的地数据统计与可视化模块区域风险等级、感染人数趋势、疫苗接种覆盖率等图表展示系统管理模块用户管理、角色管理、菜单权限配置这套东西做完一个完整的全栈项目练习闭环就有了。更关键的是它能体现你掌握了几项日常开发中最常见的能力CRUD 操作、关联表查询、权限拦截、文件上传、数据可视化。面试的时候聊起来能讲的东西非常具体远比背八股文有说服力。1.1 前后端分离到底解决什么问题很多初学者不理解为什么非要把一个系统拆成两个项目跑直接在 SpringBoot 的 templates 目录里放 Vue 打包后的文件不就完了吗这么做确实能跑但开发体验和工程维护完全是两码事。前后端分离的核心逻辑是“各司其职”。后端团队只管 API 接口、业务逻辑、数据安全前端团队只管页面交互、状态管理、UI 表现。两边通过 HTTP 接口通信用 JSON 传递数据。开发时前端起一个 Node 开发服务器配置代理转发把 /api 开头的请求打到后端的 8080 端口上。部署时前端打包成静态文件扔到 Nginx再把 /api 反代到后端服务。这种做法对团队协作、持续集成、独立扩展都非常友好。对单人去写这类项目的同学来说前后端分离还有一个隐性好处心理压力小。后端写挂了不用像模板渲染那样连带页面一起挂掉前端样式调错了也不会影响接口逻辑两边独立的调试空间很充裕。1.2 技术选型的几个关键考量SpringBoot 版本2025 年的现在SpringBoot 2.7.x 和 3.x 都有人用。如果 JDK 是 8老老实实选 2.7.xJDK 17 可以上 3.x。但注意SpringBoot 3 的 javax 包名彻底迁到了 jakarta很多老教程里的 import 全要改对新手不友好我建议毕设项目默认 2.7.18 JDK8稳如老狗。MyBatis 版本搭配 spring-boot-starter 的 mybatis-spring-boot-starter 2.3.x 就很好不要追新版本。能用启动器解决的别手动引一堆 jar。Vue 版本Vue2 Element UI还是 Vue3 Element Plus如果项目从零开始写建议 Vue2 Element UI原因不是它比 Vue3 好而是网上的资料、踩坑记录、开源模板几乎都是这套组合。等以后有时间再接轨 Vue3。MySQL 版本8.0 以上是常态8.0 以下也够用。注意 8.0 的驱动名称改成了 com.mysql.cj.jdbc.Driver时区参数 serverTimezone 也得配否则默认时区报错。注意做技术选型时最忌讳的是“哪个版本最新选哪个”。项目要的是跑通、可维护、好解释。哪怕你用了最新版本面试官问一句“你为什么要用这个版本”回答不出来反而减分。1.3 项目的业务边界不要贪多疫情管理系统的业务可以做得非常庞大——密接追踪、流调分析、物资管理、核酸采样点调度这些模块单独拎出来都能做一个大型系统。但作为个人项目过度设计是大忌。贪多求全的结果通常是每个模块都写得潦草Bug 一堆反而暴露技术短板。我建议把这个项目的能力边界清晰定义为面向社区或中小企业内部以健康信息管理为核心的后台管理系统。重点打磨 2~3 个核心环节比如“每日健康上报流程”和“异常人员管理流程”把这两个流程从前端页面到后端接口到数据库表全部串通做到逻辑闭环。剩下那些锦上添花的模块宁可砍掉也别硬凑。这才是面试时的加分逻辑在有限的能力圈内把事情做透而不是用技术名词堆砌出一个空架子。2. 数据库设计是系统的地基数据表设计得好不好直接决定后面写接口的顺畅程度。我见过不少人上来就写代码写到联调阶段发现表结构缺字段、字段类型不合理再回头改表连带改一堆 SQL非常耗时间。正确顺序是先花 2~3 小时把表设计好再写业务代码后面基本一路绿灯。这个系统的核心表我建议这样设计2.1 用户与角色表sys_user用户表字段包括 id、username、password、real_name、phone、avatar、status、create_time。密码不要存明文用 BCrypt 加密后的哈希值。sys_role角色表字段包括 id、role_name、role_code、remark。角色建议设计成“超级管理员、普通管理员、普通用户”三档。sys_user_role用户角色关联表字段包括 id、user_id、role_id。sys_menu菜单权限表字段包括 id、parent_id、menu_name、menu_type、path、component、perms、icon、sort、visible。sys_role_menu角色菜单关联表字段包括 id、role_id、menu_id。很多同学做权限系统时喜欢用“硬编码角色判断”比如在拦截器里写死只有 admin 角色能访问某个接口。这样做在小项目里能跑但角色一变代码就得改。用 RBAC 模型就等于把“角色”和“权限”解耦开新增一个角色只需要在数据库里配好菜单权限代码一行不用动。这个设计思想是面试常考点值得好好拿捏。2.2 业务数据表疫情管理系统的业务核心是“人和状态的关系”所以围绕人建表。基础信息建议单独放一张patient_info表避免和登录用户表耦合过深。字段包括 id、user_id关联登录账号可空、name、id_card、gender、age、phone、address、health_status、vaccination_status、risk_level、remark。再建一张health_report每日健康上报表字段包括 id、user_id、report_date、temperature、is_normal、symptom_desc、contact_history、create_time。这里注意上报数据是典型的高频插入、低频修改场景适合加上联合索引(user_id, report_date)查询某人某段时间的报表会非常快。出入登记表access_record字段包括 id、user_id、place_name、entry_time、exit_time、temperature、is_risk_area、remark。这张表的数据会越来越多后期按日期分区或归档都是可扩展方向。如果要做疫苗接种管理加一张vaccine_record字段包括 id、user_id、dose_number、vaccine_name、inoculation_date、hospital_name。2.3 数据表设计的三条实战经验第一所有表都必须有 id 主键和 create_time 字段。哪怕你觉得“这张表好像用不到时间”将来排查数据、做统计时一定会后悔没加。这是我在项目里踩过最频繁的坑。第二逻辑删除优先于物理删除。业务表加一个deleted字段0 表示未删除1 表示已删除。用户误删数据时还能恢复也避免外键关联的连锁问题。物理删除后想找回数据那是要出事故的。第三金额、体温、百分比这些数值一律用 DECIMAL不要用 FLOAT 或 DOUBLE。浮点类型在二进制运算中有精度误差体温数据如果显示成 36.59999999 就很尴尬。2.4 初始化数据脚本要一并写好项目里必须带一个init.sql或schema.sql里面包含建表语句和初始化数据。初始化数据的意义很大一是你自己调试联调的时候需要用二是别人拿到源码后能快速跑起来。我见过不少项目源码缺失初始化数据代码里明明引用了某个菜单 ID数据库里却没有直接白屏报错。这种情况特别打击体验。初始化数据里至少要有一个超级管理员账号admin/admin123、一个普通管理员账号、两三个普通测试用户、若干条健康上报记录和出入记录。数据不需要多但类型要齐全方便你测试各种查询条件。3. 后端核心代码的实现思路后端工程建议按经典分层结构组织别图省事把逻辑全塞在 Controller 里。分层不是为了好看是为了出问题的时候能快速定位以及后续好扩展。标准结构是com.example.epidemic ├── controller // 接收请求、返回响应 ├── service // 业务逻辑层接口实现类 ├── mapper // MyBatis 数据访问层 ├── entity // 实体类 ├── dto // 数据传输对象 ├── vo // 视图对象 ├── config // 配置类跨域、拦截器、安全等 ├── common // 通用工具、结果封装、异常处理 ├── utils // JWT、日期处理等工具类3.1 统一结果返回与全局异常处理前后端分离项目里接口返回的数据结构必须统一。我习惯用一个ResultT类包装所有响应结构是{ code: 200, message: 操作成功, data: {} }如果接口自己返回各种乱七八糟的格式前端解析逻辑就会写得非常痛苦一会 res.data.list一会 res.list一会又是 res.data.data。统一返回结构之后前端只需要判断 code 是否为 200剩下的闭着眼睛取 data 就行。全局异常处理用RestControllerAdvice注解实现。捕获所有业务异常、参数校验异常、未知异常分别映射到不同的 code 和 message。这里还有个细节不要把异常堆栈信息原样返回到前端日志里打全接口只返回友好提示避免泄露内部信息。3.2 登录认证与 Token 机制登录流程是每个管理系统的门面实现得好不好直接体现基本功。推荐方案是 JWT 拦截器流程如下用户提交用户名密码。后端校验验证码用 Redis 存验证码key 为 UUIDvalue 为验证码内容。校验用户名密码是否正确如果 5 次错误则锁定账号 10 分钟可以在 Redis 里记一个 fail_count。生成 JWT Token载荷里放 userId 和 roleCode签名密钥配置在 application.yml 中。前端把 Token 存到 localStorage每次请求在请求头里加Authorization: Bearer token。后端写一个拦截器校验 Token放行白名单接口登录接口、验证码接口等。JWT 的签名密钥一定要放在配置文件里不要硬编码在代码里。项目传到公开仓库前务必把真实密钥改成占位符。// JWT 工具类核心方法 public String generateToken(Long userId, String roleCode) { return Jwts.builder() .setSubject(String.valueOf(userId)) .claim(roleCode, roleCode) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() EXPIRE_TIME)) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); }3.3 MyBatis 动态 SQL 写法的关键细节MyBatis 最大的优势在于动态 SQL。比如健康上报列表查询需要支持按上报日期范围、体温范围、人员姓名、状态等多个条件组合筛选用 JPA 写这种动态条件会比较费劲MyBatis 的where和if标签天然就为此设计select idselectReportList resultTypeHealthReportVO SELECT hr.*, ui.real_name, ui.phone FROM health_report hr LEFT JOIN user_info ui ON hr.user_id ui.id where if testrealName ! null and realName ! AND ui.real_name LIKE CONCAT(%, #{realName}, %) /if if teststartDate ! null AND hr.report_date gt; #{startDate} /if if testendDate ! null AND hr.report_date lt; #{endDate} /if if testtemperature ! null AND hr.temperature gt; #{temperature} /if /where ORDER BY hr.create_time DESC /select两个注意点大于号和小于号在 XML 里必须转义成gt;和lt;否则 XML 解析直接报错。这个坑我踩了好几次现在写动态 SQL 第一反应就是把比较符号转义掉。参数名要和 Mapper 接口里Param注解指定的名称保持一致否则 MyBatis 找不到参数报 BindingException。3.4 统计报表接口的 SQL 优化数据可视化模块通常需要按日期统计上报人数、异常人数、疫苗接种覆盖率。SQL 写法上有几个值得注意的点按日统计上报人数SELECT DATE_FORMAT(report_date, %Y-%m-%d) AS date, COUNT(*) AS total_count, SUM(CASE WHEN temperature 37.3 THEN 1 ELSE 0 END) AS fever_count FROM health_report WHERE report_date DATE_SUB(CURDATE(), INTERVAL 7 DAY) GROUP BY DATE_FORMAT(report_date, %Y-%m-%d)这个 SQL 用了 DATE_FORMAT 做分组性能上的优化空间是给 report_date 建索引。数据量较小时无所谓但数据量达到几十万条时没有索引的全表扫描会把 MySQL 的 CPU 打满。做统计查询时尽量把过滤条件放在索引字段上减少扫描范围。经验分享写过一段时间的统计 SQL 后你会发现“让数据库少干活”是核心原则。分组、排序、聚合虽然 SQL 写起来痛快但一旦数据量大代价极高。前端能做的筛选别丢给后端后端能做的聚合别丢给前端职责要分清。3.5 接口幂等性处理健康上报接口是典型的重复提交高发场景用户在页面上点了两次“提交”如果后端不做处理数据库里就会出现两条上报记录报表数据全乱。最简单的处理方案上报前先查一下当天是否已经上报过如果存在就直接返回“今天已上报”同时在后端做一个短时防重复提交的校验比如基于 Redis 的 setnx 操作在用户第一次请求时设置一个 key过期时间设为 1 秒1 秒内第二次请求直接拒绝。这个方案实现成本低效果也很明显。4. 前端界面的设计与功能落地后端接口写得再好前端页面不上档次整个项目的观感还是会被拉垮。面试官看项目时第一印象就是界面交互所以前端的功夫值得花。4.1 项目初始化和路由设计前端工程建议用 Vue CLI 创建脚手架生成后是标准的 src 目录结构。引入 Element UI、Axios、Vue Router、Vuex/Pinia、ECharts这些基本就齐活了。路由设计上重点是用动态路由还是静态路由。个人项目建议还是静态路由就是在router/index.js里把所有页面路径写死登录后根据用户角色控制菜单显隐。这个做法的优点是代码直观、改动简单、不会出现权限配置错误导致页面空白的问题。动态路由是后端根据用户权限返回路由表前端 addRoute 动态添加效果确实好但调试成本高新手容易在刷新页面后路由丢失个人项目不推荐优先尝试。4.2 Axios 封装与拦截器Axios 必须做统一封装这是前端项目的基本功。核心逻辑是// request.js const service axios.create({ baseURL: /api, timeout: 10000 }) // 请求拦截器 service.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers[Authorization] Bearer token } return config }) // 响应拦截器 service.interceptors.response.use( response { const res response.data if (res.code ! 200) { // 处理业务错误 if (res.code 401) { // Token 过期跳转登录页 localStorage.removeItem(token) router.push(/login) } return Promise.reject(new Error(res.message)) } return res.data }, error { // 处理网络错误 } )统一封装之后业务代码里调用接口非常干净不用每个页面都写一遍 token 获取和错误处理逻辑。但要注意响应拦截器返回的是res.data那么业务代码里取值就是response.data不要在那个基础上又包一层。4.3 权限控制的前端实现前端做权限控制的核心是“菜单渲染”和“路由守卫”。菜单渲染登录成功后后端返回当前用户的菜单列表前端根据roleCode过滤出可见菜单再动态渲染到侧边栏。这个过程可以简单做也可以用递归组件处理多级菜单后者更通用。路由守卫router.beforeEach里判断用户是否已登录。如果访问的路径不在白名单里且没有 token强制跳转到登录页。如果已登录但访问的是登录页跳转到首页。router.beforeEach((to, from, next) { const token localStorage.getItem(token) if (to.path /login) { token ? next(/) : next() } else { token ? next() : next(/login) } })注意路由守卫只是用户体验层面的事情真正的安全校验永远在后端。前端把菜单藏掉只是不显示有人直接调 API 还是能访问所以后端接口的权限校验必须到位。4.4 数据可视化的实现疫情管理系统的核心价值很大程度体现在数据报表上。ECharts 是首选方案图表类型建议做这几种折线图最近 14 天上报人数趋势、体温异常人数趋势。柱状图各区域疫苗接种覆盖率对比。饼图当前人员的健康状态分布、风险等级占比。地图可选如果数据精细到省市区可以做热力图。ECharts 的基本用法是初始化实例、设置 option、调用 setOption。实际开发中注意几点图表容器要有固定高度否则图表不显示组件销毁时要调用dispose方法释放实例否则内存泄漏数据量大时开启dataZoom组件做缩放体验好很多。initChart() { this.chart echarts.init(this.$refs.chartRef) this.chart.setOption({ tooltip: { trigger: axis }, legend: { data: [上报人数, 异常人数] }, grid: { left: 3%, right: 4%, bottom: 3%, containLabel: true }, xAxis: { type: category, data: this.dateList }, yAxis: { type: value }, series: [ { name: 上报人数, type: line, data: this.totalList }, { name: 异常人数, type: line, data: this.feverList } ] }) }4.5 前端表单校验别嫌麻烦后端接口要做参数校验前端表单同样要做。Element UI 的 Form 组件自带校验规则必填、长度限制、手机号格式、身份证格式这些都加上。校验规则的体验提升非常明显比如用户填了手机号点击提交直接提示“手机号格式不正确”比提交到后端再返回错误信息快得多也算减少后端无效请求。有一点值得注意前端的校验永远是体验优化后端必须重新校验。前端校验可以被绕过后端校验才是安全底线。这个意识要贯穿整个项目。5. 前后端联调、部署与常见问题排查5.1 前端代理配置开发环境下前端请求/api开头的接口需要代理到后端。在vue.config.js里配置module.exports { devServer: { port: 8081, proxy: { /api: { target: http://localhost:8080, changeOrigin: true, pathRewrite: { ^/api: } } } } }pathRewrite这里要特别小心。如果后端接口路径是/api/report/list前端请求路径也是/api/report/list那代理就不要 rewrite直接透传。如果后端路径没有/api前缀才需要把/api去掉。这个配置不对会导致 404而且是那种让你怀疑人生、怎么查都查不出问题的 404。5.2 后端跨域配置虽然前端做了代理但后端最好还是把跨域配置好防止直接访问后端接口时被浏览器拦截。最简单的方案是写一个 WebMvcConfigurer 配置类Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowCredentials(true) .maxAge(3600); } }注意allowCredentials(true)时allowedOriginPatterns(*)的写法老版本的allowedOrigins(*)会和allowCredentials(true)冲突SpringBoot 2.4 之后要改用allowedOriginPatterns。5.3 部署方案部署是项目实战能力的试金石。最典型的方案是后端打 jar 包跑在一台服务器上前端打包成 dist 目录扔给 Nginx 托管Nginx 再把/api反向代理到后端地址。后端打 jar 用 Mavenmvn clean package -DskipTests java -jar epidemic-system.jar --spring.profiles.activeprod前端打包npm install npm run buildNginx 核心配置server { listen 80; server_name your_domain.com; root /usr/share/nginx/html; index index.html; location / { try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; } }try_files $uri $uri/ /index.html这一行是单页应用部署的灵魂不加的话刷新页面就 404。5.4 常见问题速查表问题现象排查方向解决思路前端请求接口 404代理路径配置、后端 context-path检查 pathRewrite 是否把前缀改写对了前端请求接口 403跨域配置、权限拦截器后端加 CORS 配置检查拦截器白名单登录成功但跳转后报错Token 存储、路由守卫逻辑检查 localStorage 取值、路由守卫判断条件数据库中文乱码连接串、表字符集连接串加 characterEncodingutf8建库用 utf8mb4MyBatis 映射错误Mapper XML 路径、namespace检查 XML 文件位置和 mapper 接口全限定名打包后页面白屏静态资源路径vue.config.js 中 publicPath 设置为 ./启动报端口占用端口冲突换端口或杀掉占用进程5.5 值得记录的避坑细节第一个坑JDBC 连接串时区问题。MySQL 8.0 的连接串至少是这样jdbc:mysql://localhost:3306/epidemic?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai缺了serverTimezone会直接报一堆时区相关的异常这个错几乎每个写 MySQL 8.0 SpringBoot 的都遇到过。第二个坑返回给前端的日期格式。后端 LocalDateTime 默认序列化格式是带毫秒的 ISO 格式前端显示效果很差。在 application.yml 里配一下全局格式spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT8配完以后所有接口返回的日期都统一成2025-03-20 10:30:00这样的格式前端不用再做二次转换。第三个坑excel 导出功能。很多疫情管理系统会做导出报表POI EasyExcel 是常用方案。EasyExcel 比原版 POI 省内存得多写起来也更顺手。但导出接口在数据量大的时候会长时间占用连接前端 Axios 超时时间要适当调大否则 Export 一半就断掉。5.6 安全问题预防疫情管理系统涉及人员健康数据属于敏感度较高的信息。虽然个人项目不需要做成等保密评水平但基本的安全习惯必须有密码用 BCrypt 加密存储严禁明文。BCrypt 自带盐同一密码每次加密结果都不同安全性吊打 MD5。使用参数绑定#{}防止 SQL 注入。MyBatis 里用${}拼接 SQL 等于把注入漏洞直接送给黑客能用#{}或concat解决的绝不用${}。接口层的权限控制不要只依赖前端隐藏。后端拦截器一定要校验 RBAC 权限。对异常请求频率做限制。登录接口是最容易被暴力破解的至少做一个验证码校验有余力再加 IP 维度限流。6. 项目扩展方向与简历呈现建议系统做完能跑只是第一步怎么把它变成面试亮点和简历上的加分项同样重要。这部分分享一下我的观察和实操建议。6.1 哪些扩展方向性价比高导入导出功能把人员信息和健康报表导出成 Excel这是管理系统的刚需。用 EasyExcel 实现给项目增加一个“报表导出”能力面试时可以展开讲大数据量导出的内存优化。消息通知当检测到异常上报时通过邮件或者短信通知管理员。引入 Spring Boot 的邮件发送模块技术难度不大但业务场景闭环价值很高。这一步能把“数据采集-分析-预警-处置”的业务链路串起来。Redis 缓存高频读取的配置数据、验证码、Token 黑名单都可以放 Redis顺理成章地讲缓存穿透、缓存击穿这些面试常考点。数据脱敏身份证号、手机号在页面显示时做掩码处理如110***********1234这是现在隐私合规的大趋势也是面试官比较关注的点。6.2 简历上怎么描述这个项目项目描述不是把代码贴上去而是用简洁清晰的语言把“背景-方案-亮点-结果”讲清楚。推荐结构是项目名称那边就写疫情管理系统前后端分离架构技术栈SpringBoot MyBatis MySQL Vue Element UI ECharts项目描述面向社区/企业内部实现人员健康信息管理、每日健康上报、异常预警、出入登记和可视化统计通过 RBAC 权限模型实现不同角色的菜单和接口级权限控制。个人职责负责数据库设计与搭建完成后端接口 20 个包括认证授权、健康上报、报表统计独立实现前端页面 10 个完成前后端联调与部署。项目亮点那里挑 2~3 个你在开发时真实解决过的问题来写比如“通过 Redis 做验证码存储和短时防重复提交解决了接口幂等性问题”“通过索引优化和 SQL 改写将日报表查询时间从 2 秒降到 0.3 秒”。这个写出来比我前面说的任何建议都值钱。6.3 我个人对这套项目的复盘写到这儿聊一点超出技术本身的话。疫情管理系统这个题材不同人写出来的东西完全不一样。有的人整一个全是增删改查页面丑得没法看有的人把权限、缓存、报表、通知都串起来看起来就像一个能真正落地的产品。差距不在于技术学得多少而在于有没有用“做产品”的角度去审视自己写的代码。说白了技术栈只是工具真正漂亮的项目是业务流程清晰、代码结构清爽、关键细节经得起追问。哪怕你只做了健康上报和异常管理这两个模块只要把这两条链路做得闭环通透讲得出每一步“为什么这么做”就已经超过大多数照搬模板的人了。最后再说一句SpringBoot Vue 这套组合虽然不新但它不过时。能把这套东西讲清楚、用熟练后面学什么新框架都只是迁移成本的问题。项目本身不是终点理解它背后的设计思想才是你真正能带走的东西。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑