ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

JavaWeb开发者学Vue:从环境搭建到SpringBoot部署全攻略

JavaWeb开发者学Vue:从环境搭建到SpringBoot部署全攻略 这篇JavaWeb开发学习日记的第三篇讲讲Vue基础。坦白说序列到第三篇才写Vue我自己都觉得有点晚——现在的JavaWeb项目里前端几乎都是Vue或React的天下纯JSP或者Thymeleaf硬怼的形态已经越来越少。而在这两者之间Vue对Java后端开发者尤其友好它的渐进式设计让你不用一上来就被工程化那套东西劝退可以先在页面上写几个{{}}表达式尝尝鲜再慢慢过渡到组件、路由、状态管理整套体系。这篇日记面向的读者是和我一样从Java/SpringBoot这边半路出家的开发者。我会按照自己实际的学习路径来写先搞清楚Vue在JavaWeb项目里到底扮演什么角色再把环境装好接着过一遍核心语法聊完组件和路由最后重点讲一下怎么把Vue打包部署进SpringBoot以及那些绕不开的坑。内容偏实战代码能跑为准理论点到为止。本系列前两篇分别写了JavaWeb基础和SpringBoot实战这篇就把前端这一环补上。1. 为什么学完JavaWeb还要啃Vue1.1 前后端分离是现实不是选择题我先说说自己理解的前后端分离。我第一次做JavaWeb项目还是JSP时代一个页面里Java代码和HTML混在一起String name request.getParameter(name)然后拼到页面上输出。项目小的时候还能忍一旦业务复杂起来JSP页面的维护成本真的让人头大——前端改样式要小心翼翼后端改逻辑也要小心翼翼两边都怕动到对方的地方。后来接触了前后端分离才真正理解这种架构的价值前端负责页面渲染和交互后端只提供数据接口。Vue就是前端这一环的解决方案。为什么在JavaWeb生态里Vue特别流行我觉得有几个原因。第一Vue的学习曲线相对平缓一个Java开发者只要理解了数据驱动视图这个核心思想基本就能上手写页面第二它的中文文档和社区资源非常丰富遇到问题搜一下就能找到答案第三Vue与SpringBoot的组合已经成了很多企业项目的标配网上类似的完整项目案例一大把搜springboot vue能出来大量可参考的项目。我见过不少后端同事被问为什么不直接用JSP原因很简单现在的项目大多采用前后端分离开发模式前端团队和后端团队可以并行工作后端接口定义好之后前端用Mock数据先行开发互不阻塞。这种协作模式决定了Vue这类前端框架已经是绕不开的技术栈而不是可选项。1.2 Vue在SpringBoot项目里的真实定位在SpringBoot项目里Vue一般扮演的是前端展示层的角色。数据从MySQL取出来经过MyBatis或JPA映射成Java对象再通过Controller层以JSON格式暴露给前端Vue拿到JSON后渲染成页面。这个链条里Vue完全不关心数据从哪里来只关心拿到数据之后怎么展示、怎么交互。这个定位对Java开发者来说其实是个好消息——你不需要把Vue理解成一个庞大的框架它就是一个从接口拿数据并渲染到页面的工具。搞清楚这件事后很多学习焦虑就消失了不用试图一开始就掌握Vue Router、Vuex、服务端渲染先把最基础的模板语法和组件通信玩明白就足够支撑大部分业务开发。提示JavaWeb开发者学Vue的第一个误区是试图把它当Java一样先啃完所有理论再动手。Vue的实践性很强先做一个小功能比翻十篇教程都管用。我的建议路径是模板语法 → 组件通信 → 路由 → 打包部署四个阶段走完就够应对绝大多数工作了。2. Vue环境搭建比想象中简单也比想象中坑多2.1 Node.js和npm的版本陷阱环境搭建这一步网上教程很多但版本问题是大家踩得最频繁的坑。Vue工具链的底层依赖是Node.jsnpm是Node.js自带的包管理器。很多人直接下载最新版Node.js结果跟着老教程操作某些包安装失败或者报错一脸懵。我个人的建议是安装Node.js的LTS版本而不是最新版。LTS是长期维护版本各种工具链的兼容性最好。另一个高频问题是npm官方源在国内访问速度很慢建议配置淘宝镜像。npm config set registry https://registry.npmmirror.com npm config get registry配置完成后用npm install安装依赖的速度会有非常明显的提升。如果环境已经装好但Vite或Vue CLI创建项目时各种依赖安装失败优先排查Node版本和镜像源这两个原因占了八成。2.2 用Vue CLI还是Vite我踩过的坑创建Vue项目有两个常见选择Vue CLI和Vite。Vue CLI基于Webpack曾经是主流脚手架Vite后来出现基于ESM启动速度和构建速度都明显更快。我的建议是新项目直接用Vite原因很简单——快。我第一次用Vue CLI创建项目npm run serve启动要等十几秒而Vite几乎是秒开。对于需要频繁启动前端的开发场景这个体验差距非常明显。用Vite创建Vue项目的基础命令npm create vitelatest my-vue-app -- --template vue cd my-vue-app npm install npm run devVite官方默认的Vue模板不会带路由需要自己手动安装vue-router。很多人创建完项目发现没有路由文件以为装错了其实只是模板精简而已。另外要注意Vite要求Node.js版本不能太低如果启动报错提示版本不支持先升级Node。2.3 在IDEA中配置Vue开发环境很多JavaWeb开发者的主力工具是IDEA而不是VSCode这点和纯前端开发者很不一样。IDEA对Vue的支持做得相当好装了Vue.js插件之后.vue文件有语法高亮和代码提示。几个细节值得注意第一IDEA中打开Vue项目时建议直接用Open选择项目目录IDEA会自动识别为前端项目不要用导入Maven项目的方式第二IDEA自带的Terminal可以直接跑npm命令多数时候不需要额外开一个终端窗口第三如果代码提示不生效检查插件市场里Vue.js插件是否已安装以及项目有没有被正确识别为前端项目类型。再分享一个实操经验IDEA里运行Vue项目直接在Terminal执行npm run dev然后浏览器访问本地地址就行不需要额外配置什么运行环境。有人习惯配置npm run dev的Run Configuration也可以但本质上没有区别。我实际用下来IDEA的前端开发体验并没有比VSCode差太多所以后端开发者没必要为了写Vue专门换编辑器除非你特别喜欢VSCode的插件生态。3. Vue核心语法从模板到双向绑定3.1 插值表达式和指令先告别DOM操作Vue的核心思想是数据驱动视图最直观的体现就是模板语法。你在页面中写一个{{ message }}data里维护message这个值就自动渲染出来了。修改data里的值页面自动跟着变不需要手动操作DOM也不需要刷新页面。template div p{{ message }}/p p v-textmessage/p /div /template script export default { data() { return { message: Hello Vue } } } /script上面这段代码里插值表达式和v-text指令的效果完全一样。指令是Vue模板中带v-前缀的特殊属性比如v-bind、v-model、v-if、v-for等每个指令承担不同的职责。对Java后端开发者来说这里最需要转换的观念是Vue的页面是数据和模板的产物不要去操作DOM元素的innerHTML而是去修改数据源。有些刚转Vue的开发者会问这跟JSP里的${}有什么区别区别在于JSP在服务端渲染数据在服务端拼好再发给浏览器Vue在浏览器端渲染数据从接口拿到后动态更新页面。这个模型差异是理解前后端分离的关键。我在实际项目里体会到一旦习惯了数据驱动就再也不想回到手动拼接HTML的方式了。3.2 v-model双向绑定表单开发的核心要说Vue对开发效率的提升最明显的应该是v-model。在传统JSP里做一个表单通常要写大量value属性绑定和事件监听代码在Vue里一个v-model就搞定了。template div input v-modelusername placeholder用户名 / p你输入的内容是{{ username }}/p /div /template输入框里打字下面的p标签内容实时变化不需要任何额外代码。v-model的本质是语法糖它同时绑定了value属性和input事件。但我还是建议初学者在入门阶段就理解这个本质而不是只停留在哦这个可以双向绑定的层面。理解了本质你才能解决为什么v-model了但数据没变化这类问题。v-model的典型使用场景是表单元素包括input、textarea、select、checkbox、radio。对Java后端开发来说表单处理是日常最高频的需求之一v-model省下的代码量非常可观。一个稍微复杂的表单传统写法可能要写几十行事件绑定Vue里就是逐行v-model的事。如果表单需要初始化数据、提交前校验、回显数据配合computed计算属性和watch监听器基本上各种场景都覆盖了。3.3 v-if和v-show条件渲染怎么选v-if和v-show都能控制元素显示和隐藏但原理完全不同。v-if是真正的条件渲染条件为假时元素根本不会渲染到DOM中v-show则是始终渲染元素只是通过CSS的display:none控制显示状态。所以使用场景也很清晰需要频繁切换显示状态用v-show因为只是切换CSS属性性能消耗小条件很少变动或者初始时就不需要渲染用v-if因为它能节省初始渲染成本。热词里有个vue 内容折叠展开展开折叠这种高频切换场景用v-show就非常合适而根据用户角色显示不同菜单这种低频条件渲染用v-if更合理。注意实际业务中经常看到有人把v-if和v-for写在同一个元素上。Vue官方文档明确不建议这么做因为v-for的优先级高于v-if导致每次渲染都要遍历整个列表再判断条件。推荐的做法是把v-if放到外层元素上或者使用计算属性先对数据做过滤。这个点也是面试高频题踩过坑的自然记得住。4. 组件化开发JavaWeb开发者的思维转换4.1 用Java类的思路理解Vue组件组件是Vue最核心的概念。我学组件时找到了一个特别好的类比方式把组件想象成Java的类。组件里的data类似类的成员变量methods类似类的方法props类似构造方法的入参模板则类似类的展示形式——定义了实例渲染出来长什么样。这种类比不要求完全精确但对Java后端开发者来说非常友好能帮助你快速建立组件化思维。看一个简单例子template div classcard h3{{ title }}/h3 p{{ content }}/p /div /template script export default { name: CardItem, props: { title: String, content: String } } /script这个CardItem组件定义好后在其他组件里可以这样使用template div CardItem title通知 content这是一个通知内容 / CardItem title公告 content这是一个公告内容 / /div /template script import CardItem from ./components/CardItem.vue export default { components: { CardItem } } /script每个使用组件的地方相当于new了一个CardItem实例传入不同的props页面渲染出不同的内容。这就是组件复用的基本方式。我在项目里最常用的是把弹窗、表格、分页器、上传按钮封装成组件一处定义全项目复用改动时只需要改组件本身所有引用处自动生效。4.2 props传参和自定义事件父子组件通信组件定义好了之后父子组件之间怎么通信这里需要转换一个观念Vue中的父子通信是单向数据流。父组件通过props向子组件传值子组件不能直接修改父组件传进来的值而是要触发表单事件通知父组件去修改。子组件如何通知父组件我想修改你传进来的值标准方式是使用this.$emit触发事件父组件监听事件后再执行对应的修改逻辑。!-- 子组件 -- script export default { props: { count: Number }, methods: { increment() { this.$emit(increase, this.count 1) } } } /script !-- 父组件 -- template div ChildComponent :counttotal increasetotal $event / /div /template这个模式的本质是数据在哪一层修改数据的逻辑就应该在哪一层。父组件持有数据子组件只能发出修改请求。规则虽然看起来繁琐但能有效防止数据流混乱在大型项目中尤其重要。我一开始写组件时经常忍不住在子组件里直接改props结果页面数据错乱了都找不到原因后来才明白这个单向数据流设计的意义——它让数据流向变得可预期、可追踪。4.3 slot插槽解决布局复用问题slot插槽可能是Vue里对Java开发者来说最不直观的概念因为它解决的是布局复用问题而不是逻辑复用问题。想象一个弹窗组件弹窗的外层结构遮罩、头部、关闭按钮在所有场景下都一样但内容区域每个页面都不一样。如果只用props来传传字符串还行传复杂HTML结构就非常别扭。slot就是为这种场景设计的——把组件做成外壳把可变化的内容留给使用者往里面放。!-- 弹窗组件 MyModal.vue -- template div classmodal div classmodal-header span{{ title }}/span button click$emit(close)X/button /div div classmodal-body slot/slot /div /div /template使用方template MyModal title用户信息 p这里的内容会被插入到slot的位置/p button确认/button /MyModal /template热词里slot vue和vue插槽的搜索量一直不小说明这是很多初学者卡住的地方。我的理解方式是插槽就相当于是组件留出来的占位符调用方往这个占位符里填什么内容都行。Vue 2.6之后还有具名插槽和作用域插槽具名插槽让一个组件里可以有多个插槽位置作用域插槽则让组件可以把自己的数据传给插槽内容使用。这两个高级用法建议掌握了基础插槽后再学关键是先理解插槽的设计意图——模板的开闭原则组件骨架封闭内容开放扩展。5. Vue Router从href跳转到单页路由5.1 路由的基本配置与懒加载在传统Web开发中页面跳转就是a标签跳到新URL。在Vue单页应用里没有传统意义上的多页面跳转所有页面都在一个HTML文件内部通过JavaScript动态切换Vue Router就是管理这种切换的工具。安装路由npm install vue-router4在Vite创建的Vue 3项目中路由配置大致如下// router/index.js import { createRouter, createWebHistory } from vue-router import Home from ../views/Home.vue import About from ../views/About.vue const routes [ { path: /, component: Home }, { path: /about, component: About } ] const router createRouter({ history: createWebHistory(), routes }) export default router然后在main.js中注册routerimport { createApp } from vue import router from ./router import App from ./App.vue createApp(App).use(router).mount(#app)这里有个重要知识点路由懒加载。上面代码直接在头部import了组件意味着主包会一次性包含所有页面代码。如果页面很多打包出来的JS会很大首屏加载速度受影响。懒加载的思路是只有访问到某个路由时才去加载对应的组件代码。const routes [ { path: /, component: () import(../views/Home.vue) }, { path: /about, component: () import(../views/About.vue) } ]() import(...)这种写法会把每个路由对应的组件拆成独立的代码块。对JavaWeb项目来说这个优化体现得很直接首屏加载体积变小用户打开页面更快。我自己做项目时除了首屏页面其余全部用懒加载。5.2 路由参数和动态路由从列表页跳详情页实际业务中经常有这种需求用户点击一个商品跳转到商品详情页详情页要根据商品ID去请求接口获取详情。Vue Router里用动态路由参数来解决。const routes [ { path: /detail/:id, component: () import(../views/Detail.vue) } ]在Detail.vue中获取参数import { useRoute } from vue-router const route useRoute() const id route.params.id还有一种更推荐的方式用props传参const routes [ { path: /detail/:id, component: () import(../views/Detail.vue), props: true } ]组件的props属性会自动接收id。这种方式的好处是组件复用性更强——同一个组件既可以放在路由下也可以在别处当普通组件使用不依赖路由上下文。热词里反复出现vue路由参数和vue动态路由说明这是面试常考点也是实际开发里绕不开的操作。需要区分的是params传参和query传参。params对应动态路由/detail/:id适合必填参数query对应URL上的?userId1格式适合可选参数。理解了这两个差异接口设计时参数该怎么传就很清楚了详情页用params筛选条件用query。5.3 嵌套路由与路由守卫嵌套路由解决的是页面里包含子页面的场景。典型例子是后台管理系统左侧菜单栏固定右侧内容区域根据路由变化。const routes [ { path: /admin, component: () import(../layouts/AdminLayout.vue), children: [ { path: user, component: () import(../views/UserManage.vue) }, { path: order, component: () import(../views/OrderManage.vue) } ] } ]AdminLayout.vue中需要放置一个router-view /子路由的内容就会渲染在这个位置。这种多层嵌套的结构配合菜单配置就能实现权限控制中的不同用户看到不同菜单路由守卫和动态路由结合可以做到前端根据用户的角色动态生成可访问的路由表。路由守卫是在路由跳转过程中起作用的拦截器类似于JavaWeb中的过滤器Filter。最常见的应用是登录校验未登录用户访问需要权限的页面时跳转到登录页。router.beforeEach((to, from, next) { const isLoggedIn localStorage.getItem(token) if (to.path ! /login !isLoggedIn) { next(/login) } else { next() } })热词里提到vue 按钮权限 怎么控制按钮级权限本质上是在路由守卫之外再叠加一层控制用自定义指令或v-if配合用户角色来判断按钮是否渲染。路由守卫管的是页面级权限按钮级权限管的是操作级权限两者配合使用。后端接口仍然要做权限校验前端权限只是体验层面的控制不能作为安全边界。6. Vue打包部署进SpringBoot一体化部署方案6.1 打包流程与静态资源路径配置写好的Vue项目总要部署到服务器上。最常见的方式之一就是把Vue打包后的静态文件放到SpringBoot的src/main/resources/static目录下由SpringBoot统一提供服务。好处是只需要部署一个Java应用不需要单独配置Nginx或Tomcat。打包命令很简单npm run build打包后的静态文件默认生成在dist目录下。但直接把dist里的内容复制到static目录还不够有一个关键点必须处理Vue项目的静态资源路径。默认情况下Vue打包后的静态资源引用路径是绝对路径比如/assets/index.js。如果SpringBoot部署时项目的context-path不是根路径或者你通过某个前缀路径访问这些绝对路径就会失效页面白屏。解决办法是在vite.config.js中设置base// vite.config.js export default { base: ./, plugins: [vue()] }设置为相对路径后打包出的资源引用会变成相对路径部署时只要静态文件保持相对结构就能正常工作。这个坑我在第一个SpringBootVue项目里踩过第一次部署完打开页面全是白屏浏览器控制台一堆资源404排查了半天才定位到是路径问题。6.2 部署细节与接口路径协调具体操作步骤先把Vue项目npm run build打包然后把dist目录下的所有文件复制到SpringBoot的src/main/resources/static目录下。重新编译打包SpringBoot应用启动后访问根路径就能看到Vue页面。这里有个常被忽略的细节使用HTML5 History模式的路由直接访问一个子路由路径比如/orderSpringBoot会返回404因为它找不到对应的Controller映射。这个问题具体怎么解决我放到6.3节单独讲。另一个细节是接口路径的协调。本地开发时Vue项目运行在本地一个端口SpringBoot运行在8080存在跨域。解决方式有两种开发环境配置Vite代理生产环境直接用同源部署避免跨域。Vite代理配置// vite.config.js export default { server: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } }这样前端发请求到/api/xxx会被代理到后端8080端口浏览器看起来是同源的不存在跨域问题。这个方案绕开了SpringBoot的CORS配置减少了很多联调时的困扰。生产环境同源部署就更省事了前端和后端都在同一个域下天然同源。6.3 解决刷新404问题的根源与方案这是Vue部署到SpringBoot后最经典的一个坑。使用HTML5 History模式的路由在路由跳转到/order后刷新页面浏览器会向服务器请求/order这个URL服务器端根本没有这个路径的映射就返回404。解决问题的本质是让服务器端在找不到路径时统一返回index.html由前端路由接管实际渲染。在SpringBoot中可以通过一个转发Controller来解决Controller public class ViewController { RequestMapping(value {/{path:[^\\.]*}, /**/{path:[^\\.]*}}) public String forward() { return forward:/index.html; } }这个Controller的作用是当请求路径不包含点号也就是不是静态资源文件时统一转发到index.html。静态资源请求如.js、.css文件有扩展名会被SpringBoot正常处理不会被这个转发拦截。提示如果项目使用了Spring Security还需要确保前端路由路径是公开可访问的否则会被Security拦截跳转到登录页用户连登录页都看不到。这种情况要在SecurityConfig的permitAll配置里放行对应的前端路由前缀或者统一放行根路径和静态资源。7. 常见问题与避坑指南7.1 VSCode点Vue标签不跳转以及IDEA里的对等处理如果你使用VSCode编写Vue有一个非常影响效率的痛点在template中点击自定义组件的标签经常不能跳转到对应的组件文件。VSCode默认的TS检测对.vue文件支持不够好需要安装Vue官方插件Volar并禁用之前推荐的Vetur插件两者同时启用会互相冲突。更关键的是如果项目中使用了TypeScript要让Volar接管语言服务在tsconfig.json里做配置后Volar的跳转功能才能生效。装了插件还是不跳转时可以试试重启VSCode的TypeScript语言服务命令在命令面板里可以找到。用IDEA的开发者对应的问题则是代码提示不完整或者路由跳转失效。优先确认IDEA里Vue.js插件是否安装以及项目是否被识别成前端项目。IDEA对Vue的跳转支持做得其实不错问题多半出在项目类型识别上。7.2 Vue和Edge浏览器冲突的排查思路在一些Windows电脑上Vue项目在Edge中会出现样式错乱或者页面无法正常渲染的现象。这里要区分几种可能第一种是浏览器缓存了旧版本JS文件导致新旧代码混杂这种情况最常见强制刷新CtrlShiftR或者清除浏览器缓存就能解决第二种是Edge的某些设置阻断了本地开发服务器的连接需要在Windows防火墙中放行对应端口第三种是Edge对部分CSS特性的支持与Chrome有细微差异比如backdrop-filter这类较新的属性需要具体样式具体排查。我遇到过一次比较典型的Edge打不开Vue项目但在Chrome正常的情况最后定位是本地开发服务器监听的端口被防火墙拦截Edge报错和Chrome完全不一样Chrome直接提示连接被拒绝Edge报了个看起来无关的错误码。排查思路是先做最小化验证换个浏览器试试换个端口试试直接访问静态资源试试把问题缩小到具体环节再处理。7.3 关于m3u8视频播放、PDF显示这类具体需求的思考方式热词里出现了vue播放m3u8免安装、vue .acc播放器、vue image能显示pdf吗这些都是典型的Vue里怎么接某个前端能力的问题。m3u8是HLS协议的播放清单文件浏览器原生不支持直接播放m3u8格式需要借助video.js或者hls.js等库。在Vue中使用这些库并不复杂封装一个播放器组件即可。但需要注意的是m3u8播放对后端也有要求服务器要正确返回m3u8文件的Content-Type也就是application/vnd.apple.mpegurl还要配置跨域响应头否则前端播放器无法拉取视频流。关于PDF显示Vue的img标签不能直接显示PDF文件这是明确的。如果需要在线预览PDF原生方案是用iframe进阶方案是用pdf.js或者vue-pdf这类库来提取和渲染PDF内容。选型取决于业务需求只是简单预览就用iframe需要做高亮、批注、分页控制等功能就得上pdf.js。页面里需要地图时腾讯地图、高德地图这类服务都有现成的JS SDK在Vue里用其实就是在mounted生命周期里初始化地图实例然后封装成组件复用。这类问题的共性思考方式是Vue本身不限制你使用任何Web能力它只是构建界面的框架。遇到具体需求时先想清楚浏览器原生支持什么、有哪些现成库可用、怎么封装成Vue组件这个思考路径比记住某个具体库的用法更值钱。7.4 与SpringBoot联调时的高频问题联调阶段有几个典型问题我遇到的频率非常高。第一个是Mock和环境切换。开发时前端经常使用Mock数据热词里vue mock版本 增加修改删除和mock是怎么体现的就是在问这个但上线前要切换成真实接口。我的做法是在Vite的.env.development和.env.production里配置不同的API基础路径代码里用环境变量读取Mock只存在于开发环境生产环境自动走真实接口不会出现遗漏。第二个是接口数据的格式约定。SpringBoot后端返回的JSON格式需要跟前端约定好包括状态码语义、数据层级、时间格式等。这些约定要写成接口文档或者用Swagger/OpenAPI生成否则联调时来回拉扯会消耗大量时间。开发Vue页面时对接口返回数据做容错处理也很重要后端字段名一旦变动前端要能快速定位。实际项目中我在axios的响应拦截器统一做了错误提示状态码非200时自动弹提示不用每个页面单独处理。第三个是热词里提到的vue python sse这类场景。SSEServer-Sent Events在Java后端可以用SseEmitter来实现Vue前端通过EventSource接收服务端推送。这种需求并不复杂但涉及长连接、断线重连、事件格式约定等问题联调时容易忽略。建议在项目里封装统一的SSE连接管理工具避免页面销毁后连接泄漏。8. 结尾如果用一句话总结这篇学习日记JavaWeb开发者学Vue最大的转变不是学会一套新语法而是切换成数据驱动视图的思维模式。前端和后端的边界不是靠技术隔离出来的而是靠清晰地知道每一层该做什么、不该做什么——后端管好数据前端管好展示和交互。根据我自己一路踩坑过来的体会Vue在JavaWeb开发中的价值体现在两个层面。一个是开发效率组件化开发和数据驱动让前端代码的复用与维护成本大幅下降你不需要再为了一个下拉联动写几十行DOM操作另一个是协作效率前后端分离后后端专注接口、前端专注交互职责边界清晰项目推进更顺畅。本系列前两篇的JavaWeb基础和SpringBoot实战加上这篇Vue基础算是把完整的开发链条打通了。我后面准备以基于springboot vue的商品管理系统为案例把从数据库设计到前后端联调的全过程完整串一遍到时候接着写第四篇。
返回列表