ARTICLE DETAIL

资讯详情

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

Spring Boot+Vue集团门户网站源码解析:搭建、部署与改造全攻略

Spring Boot+Vue集团门户网站源码解析:搭建、部署与改造全攻略 简介这是一份基于Spring Boot与Vue前后端分离架构的集团门户网站毕业设计源码曾获导师指导认可的98分高分项目适合计算机、电子信息工程、数学等专业的学生用于毕业设计、课程设计或期末大作业也可作为入门企业级开发的实战练习。包内共包含890个文件、压缩包大小29.55MB涵盖前端Vue组件、JavaScript逻辑、SVG图标、CSS样式等页面资源以及后端Java源码、XML配置等核心代码并附有安装、运行和构建批处理脚本代码经严格调试、可直接运行另含docx、pdf等文档资料便于对照学习。目前已有235人学习下载。读者可获得完整的集团门户网站实现方案包括前后端完整工程、页面展示与后台接口以及清晰的项目目录结构便于二次开发、功能扩展或撰写毕设文档同时适合希望提升Spring Boot与Vue实战能力的开发者按需拆解学习。1. 集团门户网站源码这个 Spring Boot Vue 组合能帮你省掉至少两周工作量每年毕设季都会遇到同一类问题题目是“集团门户网站”听起来不难但真动手才发现又要写后端、又要写前端、还要保证答辩时有东西可演示。我手上这份基于 Spring Boot Vue 的集团门户网站源码属于典型的前后端分离毕设项目结构后端负责接口和数据存储前端负责门户展示和后台管理整套流程能直接从零跑通。对正在赶毕设的学生来说它的价值在于省去从空项目开始搭框架的时间可以直接把精力花在业务定制上对于想快速搭建企业门户站点的开发者它也是一个可以改改就能用的基础模板。但别误以为下载下来就能直接交差——“能跑”和“能答辩”之间还隔着配置、联调和改造三步。2. 拆解这套源码的结构先搞清楚 Spring Boot 后端和 Vue 前端各自负责什么2.1 后端项目目录Spring Boot 的 Controller、Service、Mapper 三层到底怎么分工拿到源码压缩包后别急着跑先花十五分钟看清楚目录结构。Spring Boot 项目的分层习惯基本是通用的这套门户网站的代码也不例外。我一般会先打开后端的src/main/java目录看包名下的类分布com.example.groupportal ├── controller # 接口层接收前端请求 │ ├── LoginController.java │ ├── ArticleController.java │ └── MenuController.java ├── service # 业务层处理具体逻辑 │ ├── ArticleService.java │ └── MenuService.java ├── mapper # 数据访问层操作数据库 │ ├── ArticleMapper.java │ └── UserMapper.java ├── entity # 实体类对应数据库表 │ ├── Article.java │ └── User.java ├── interceptor # 拦截器处理登录校验 │ └── AuthInterceptor.java └── GroupPortalApplication.java # 启动类画这张目录树的目的是让你理解请求是怎么走的前端点击页面 → 访问controller里的接口 →service处理业务判断 →mapper操作数据库 → 数据原路返回。搞清楚这条链路后面改任何功能都知道往哪个文件里找。这个项目里我注意到一个经验性的设计所有接口统一返回一个Result对象包含 code、message、data 三个字段这是一种非常通用的前后端约定。你拿到源码后先搜一下有没有这个类如果没有说明接口返回值可能不统一那就要在联调时特别留意。判断一个端口源码质量高不高先看接口返回值是否规范再看拦截器是否存在——这两个点能帮你避开后面很多的乱象。这个项目两者都有所以整体上属于能直接上手的水平。2.2 数据库脚本与数据模型门户网站的栏目、文章、用户这三类核心表门户网站的业务核心就三块栏目菜单、文章内容、用户权限。打开源码包中的sql或db文件夹通常会有一个.sql文件里面建表的顺序是有讲究的先建用户表再建栏目表最后建文章表因为文章表的外键要引用前两者。CREATE TABLE sys_user ( id int(11) NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL, password varchar(100) NOT NULL, role varchar(20) DEFAULT admin, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE portal_menu ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(100) NOT NULL, parent_id int(11) DEFAULT 0, sort int(11) DEFAULT 0, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE portal_article ( id int(11) NOT NULL AUTO_INCREMENT, title varchar(200) NOT NULL, content text, menu_id int(11) DEFAULT NULL, publish_time datetime DEFAULT NULL, PRIMARY KEY (id), KEY idx_menu_id (menu_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;执行完这三张表你就拥有了一个门户网站的最小数据基础。注意portal_menu里的parent_id字段这个字段用来支持多级栏目值为 0 表示是一级菜单非 0 表示归属哪个父栏目。后端查询时用递归或者一次性查出来在内存中组装成树形结构前端再用递归组件渲染成导航菜单。这是门户网站类项目最核心的数据结构没有之一。我在拆这个包时有个固定习惯打开.sql文件后CtrlF搜索INSERT INTO看预置了哪些数据。如果源码自带了初始化的管理员账号通常默认是admin/admin123之类那启动后会省掉很多麻烦如果预置数据很少那你得自己先插入一条管理员的记录再启动否则前端登录入口就是失效的。这一点后面在第 3 章会详细说。2.3 Vue 前端结构路由、Axios 封装和登录态是怎么串起来的前端的核心代码在src目录下。Vue 项目结构在工程化之后基本想关的模块是固定的router管路由、api管请求、views管页面、store管全局状态。这套源码的前端目录大致是这样src ├── api # 封装所有的后端请求 │ ├── login.js │ └── article.js ├── router # 路由配置 │ └── index.js ├── views │ ├── portal # 门户展示页面 │ │ ├── Home.vue │ │ ├── NewsList.vue │ │ └── ArticleDetail.vue │ └── admin # 后台管理页面 │ ├── Login.vue │ └── Dashboard.vue ├── App.vue ├── main.js └── utils └── request.js # Axios 拦截器封装重点看utils/request.js这是前后端联调的关键文件。它一般会做两件事在请求发出前把登录后存下来的 Token 塞进请求头在响应返回后统一判断状态码。代码逻辑大概是这样的import axios from axios const request axios.create({ baseURL: /api, // 走 vue.config.js 里的代理 timeout: 10000 }) // 请求拦截器把 Token 放到 header 里 request.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers[Authorization] token } return config }) // 响应拦截器统一处理接口返回 request.interceptors.response.use( response { const res response.data if (res.code 200) { return res.data } else { alert(res.message || 请求失败) return Promise.reject(res) } }, error { if (error.response error.response.status 401) { localStorage.removeItem(token) this.$router.push(/login) } return Promise.reject(error) } ) export default request这段代码里最关键的是baseURL和Authorization两个位置。baseURL设成/api意味着前端所有请求都会带上这个前缀再由开发服务器的代理转发给后端真正端口从而避免跨域。Token 的存放位置决定你登录之后刷新页面会不会掉线——这里存的localStorage属于持久化存储浏览器关掉再打开 Token 还在如果存的是sessionStorage关掉浏览器就没登录态了。这套方案没有大的毛病唯一的坑是响应拦截器里用了this.$router如果这段代码不在组件上下文中执行会报错这一点在避坑章节再细说。路由配置也可以顺带看一眼。门户网站的页面一般有两类一类是游客可见的门户首页和新闻列表另一类是需要登录才能进的后台管理页。后者在router/index.js里常会加一个meta: { requiresAuth: true }标记再配合路由守卫做跳转判断router.beforeEach((to, from, next) { const token localStorage.getItem(token) if (to.meta.requiresAuth !token) { next(/login) } else { next() } })逻辑很简单通俗没 Token 就别进后台强行访问就被弹回登录页。这种设计不算高级但非常稳定适合作为毕设代码讲解。看到这里你应该对自己手上这份源码的技术栈和实现方式有了整体认知可以开始把它跑起来了。3. 把源码在本地跑起来环境准备、数据库初始化与前后端联调3.1 环境清单JDK、Maven、Node 的版本怎么匹配才不翻车很多项目跑不起来的第一个原因不是代码问题而是环境版本不对。Spring Boot 对 JDK 版本敏感度非常高。这份源码如果用的是 Spring Boot 2.x那 JDK 8 或 JDK 11 都能跑但如果源码用的是 Spring Boot 3.x那强制要求 JDK 17。你先打开后端pom.xml文件看parent标签里的版本号再决定安装哪个 JDK。我的建议是优先使用 JDK 8因为这个项目是典型的高分毕设源码它面向的是大多数学校机房和二手笔记本的环境JDK 8 是兼容性最稳的选择。如果源码里已经指定了更高版本那就老老实实用对应的 JDK不要用自己的旧环境去硬顶。Maven 版本影响相对小只要不是太老3.6 以上基本没问题。Node 方面看前端package.json里的依赖版本Vue2 项目用 Node 14 或 16 是最稳的。Node 版本太高反而会翻车——比如 Node 18 跑 Vue2 项目偶尔会在node-sass编译时报错因为这个库对新版 Node 的支持早就停了。准备环境时做一个版本记录表免得排查问题时晕头转向组件推荐版本注意事项JDK8 或 11Spring Boot 2.x 用 83.x 必须 17Maven3.6 以上阿里云镜像可加速依赖下载Node14.x 或 16.x高于 18 容易触发 node-sass 报错MySQL5.7 或 8.0注意 8.0 的驱动和时区问题IDEIDEA 2021自带 Maven 和 Node 插件版本选对了后面所有步骤都会省心很多。确认环境没冲突之后下一步就是搞数据库。3.2 初始化数据库与后端启动改配置、导 SQL、点启动类后端启动的流程是固定的先建库再改配置最后启动。这是大多数 Java 毕设项目的通用启动方式套路固定所以特别好排查。先在 MySQL 里建一个空库再把源码包里的 SQL 文件导进去。建议用命令行操作而非图形工具这样能看到完整的报错信息mysql -u root -p CREATE DATABASE group_portal DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE group_portal; SOURCE /你的路径/group_portal.sql;用 utf8mb4 字符集是一个经验决定——很多门户网站项目都栽在中文乱码上用 utf8mb4 能从根源上避免。“SOURCE 后面跟绝对路径”比复制粘贴 SQL 内容更可靠因为文件里可能有多条语句命令行整文件执行不会漏。导完之后用SHOW TABLES;验证一下看到三张以上的业务表就说明导入成功。接着打开application.yml配置文件修改数据库连接信息server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/group_portal?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 你的密码 driver-class-name: com.mysql.cj.jdbc.Driver这段配置里最容易被忽略的是serverTimezoneAsia/Shanghai。MySQL 8.0 默认时区和本地时区不一致不加这个参数插入时间字段时会报空指针或时间偏移的错。如果不确定 MySQL 里有没有已存在的管理员账号顺手用命令行插入一条INSERT INTO sys_user (username, password, role) VALUES (admin, 123456, admin);密码这一栏需要看源码里UserService是怎么处理密码的。如果源码用的是明文比对直接存明文没问题如果用了 MD5 加密你就得找找utils里是否有对应的加密工具类或者从别的渠道获取已经加密好的初始密码。搞完这些就可以启动后端了。在 IDEA 里直接运行GroupPortalApplication的main方法或者用命令行执行mvn spring-boot:run看到类似Tomcat started on port(s): 8080的日志就代表启动成功。启动后先用浏览器访问http://localhost:8080/portal/menu/list之类的接口具体路径看 Controller 里的注解能返回 JSON 数据说明后端整体通畅。3.3 前端依赖安装与启动npm install 和 vue.config.js 代理设置前端的启动比后端多一个依赖安装的过程。打开前端目录执行npm install这一步有个高概率遇见的问题如果报错信息里出现node-sass相关字样说明本机 Node 版本和这个库不兼容。现在的处理办法是换源安装或者干脆删除node_modules目录后改用cnpm install重试一次。这是前端项目经典翻车点不要着急不是你操作不对是版本兼容问题。依赖装好之后检查vue.config.js里的代理配置。因为后端跑在 8080前端 dev 服务器默认跑在 8081 或 8082如果不是同一个端口就要靠代理转发module.exports { devServer: { port: 8081, proxy: { /api: { target: http://localhost:8080, changeOrigin: true, pathRewrite: { ^/api: } } } } }这个配置的含义是前端发出的/api开头的请求会被转发到http://localhost:8080同时把 URL 前缀/api去掉。用这种代理方案联调阶段就绕开了跨域问题浏览器的同源策略限制的是端口不同代理让前后端看起来“同源”。注意pathRewrite的^/api: 非常关键——如果后端 Controller 里的路径本来就带/api那就不需要这段重写如果后端路径是/portal/article/list这种必须靠这个重写把/api剥掉否则后端匹配不到路由直接 404。安装完成后启动npm run serve看到Compiled successfully之后浏览器访问前端地址这时候应该能打开门户首页的雏形。功能层面能不能用得看联调是否成功。3.4 联调验证登录、首页数据、后台管理三条链路联调是整个项目从“能访问”到“能用”的分水岭。我的习惯是依次验证下面几条链路每一条都确认成功后再走下一条第一条是登录链路。打开后台登录页输入预置的管理员账号密码点击登录后观察浏览器开发者工具F12里的 Network 面板。正常情况会发出一个 POST 请求返回的 JSON 里带 token前端把 token 存进 localStorage。如果请求显示 404说明代理规则没匹配对如果是 401说明用户名或密码不对如果是 500说明后端接口报错切到后端的控制台日志里看异常信息。第二条是首页数据链路。门户首页一般会展示轮播图、新闻列表、通知公告几个区域。挨个刷新页面看每个区域的请求是否返回数据。如果某一个区域空着大概率是 SQL 数据里没有对应分类的文章或者前端取字段的名字和后端返回的字段名不一致。字段名不对这个情况很常见——后端返回publishTime前端却写了publish_time页面就是渲染不出来控制台也不报错。这时候把 Network 里的返回 JSON 展开看字段名再和页面对照。第三条是后台管理链路。进入后台后尝试新增一篇文章或者修改一条新闻然后回到门户首页刷新看新内容是否同步。这条链路通了说明增删改查完整走通项目核心功能就没有问题了。我通常会把这几条链路验证结果记下来文字记录即可这些到时候在答辩过程中是很好的讲稿素材比背代码强得多。4. 把模板改成你自己的门户四个能落地的定制改造方向4.1 改门户首页轮播图和新闻列表的数据源替换毕设答辩最忌讳的是打开页面一眼被看出是下载的模板——而换个项目名、改个 logo、换几张轮播图是成本最低但见效最快的定制方法。首页数据源一般在controller层的首页接口里方法内部调用 service 查询几个固定栏目下的文章列表GetMapping(/portal/home) public Result getHomeData() { ListArticle newsList articleService.getLatestByMenuId(1, 8); ListArticle noticeList articleService.getLatestByMenuId(2, 4); MapString, Object map new HashMap(); map.put(news, newsList); map.put(notice, noticeList); return Result.success(map); }看懂这段代码之后改造的思路就非常清楚轮播图对应的是数据库里某个栏目的文章新闻列表又是另一个栏目。你只需要在后台管理界面把对应栏目的内容替换成自己的文章不用改代码就能让首页变成你自己的网站。记住一个额外要点前端在展示文章标题时可能会截断成固定长度比如标题超过 20 个字就加省略号如果发现自己的标题显示不全不要怀疑数据丢了那是前端的截断逻辑在起作用。4.2 后台上传功能图片和附件的保存路径调整门户网站后台必定有文章发布功能发布就得支持上传图片或附件。源码里一般会有一个专门的FileUploadController来处理上传请求逻辑多半是PostMapping(/file/upload) public Result upload(RequestParam(file) MultipartFile file) { String originalFilename file.getOriginalFilename(); String suffix originalFilename.substring(originalFilename.lastIndexOf(.)); String fileName UUID.randomUUID() suffix; String filePath uploadDir fileName; file.transferTo(new File(filePath)); return Result.success(fileName); }这段代码里uploadDir是一个路径变量可能写在配置文件中。你把它改成自己电脑上的一个实际目录比如upload: dir: D:/group_portal/upload这样上传的文件就会落到这个文件夹里不再占用项目里的空间。这里有一个很隐蔽的问题上传成功后编辑器里显示的图片地址是什么样的如果返回的是相对路径比如/files/xxx.jpg你需要再确认项目里有没有配置静态资源映射——也就是把/files/**这个 URL 映射到D:/group_portal/upload这个目录。没有配置的话图片会传不上去或者传上去之后显示不出来Configuration public class WebConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/files/**) .addResourceHandler(file: uploadDir); } }这段配置就相当于告诉 Spring Boot遇到以/files/开头的请求去本地磁盘目录D:/group_portal/upload找文件。不写这个映射上传功能就是坏的很多人在这一步卡住半天也不知道原因。4.3 权限模型扩展从单一管理员到多角色多部门原始源码的权限模型往往很简陋一张用户表加一个 role 字段校验时看一眼是不是 admin。应对毕设答辩你需要演示的不只是“能登录”而是“不同的角色看到的管理菜单不一样”。改造成本不必太高在用户表里加一个dept_id字段再在菜单表里加visible_roles字段后端接口里根据当前登录人角色查询可见菜单GetMapping(/menu/list) public Result getMenuList(HttpServletRequest request) { String role TokenUtil.getRoleFromRequest(request); ListMenu menus menuService.getMenusByRole(role); return Result.success(menus); }可以看出思路是前端加载动态路由之前先请求一次菜单接口后端根据角色返回不同菜单。前端在登录成功之后拿到菜单列表再用router.addRoutes动态挂载路由就实现了不同角色登录后看到不同页面的效果。这种做法对应了动态路由的常见使用场景稍微复杂一点需要你把前端的路由表拆成静态路由和动态路由两部分静态部分是登录页、首页这些所有角色都能看见的动态部分从接口获取。这部分改造工作量不大但在答辩时能讲述的内容明显变多而且能体现你理解了前后端协作的核心机制。5. 部署复现避坑这个源码项目里最容易踩的六个实际问题5.1 node-sass 安装失败导致前端装不了依赖现象执行npm install时报错关键信息是node-sass编译失败node-gyp报出一长串红色日志。原因node-sass 的编译依赖本机 Node 版本高版本 Node18 及以上和这个库早期的二进制文件不兼容。很多基于 Vue2 的毕设前端都用到了 node-sass新版 Node 上没有对应预编译版本就会现场编译然后失败。解决换用 Node 14 或 16 环境是最省事的办法。不想换版本的话试试把package.json里的node-sass换成sassDart Sass它对新版 Node 的支持更友好。具体操作删除node_modules目录、修改package.json中依赖名为sass、运行npm install重新安装。如果源码用了sass-loader且版本是旧版升级一下sass-loader到 10 以上问题通常就消停了。5.2 后端端口 8080 被占用现象启动 Spring Boot 时日志报错Port 8080 was already in use页面访问localhost:8080打不开。原因本机有别的程序把 8080 抢占了常见干这个事的是 systemctl 挂的进程或者其他 Java 服务。解决优先在配置里换端口把application.yml的端口改成 8081然后前端vue.config.js的代理 target 同步改成http://localhost:8081。要是想保留又不想动别的服务也可以找到占用进程并结束它。Windows 下用netstat -ano | findstr 8080查出 PID再taskkill /PID 用这个PID /F结束进程Mac 下是lsof -i :8080加kill -9 进程号。5.3 MySQL 8.0 连接报时区错误或驱动找不到现象后端启动时报错The server time zone value Öйú±ê׼ʱ¼ä is unrecognized或者ClassNotFoundException: com.mysql.jdbc.Driver。原因MySQL 8.0 的驱动类名改成了com.mysql.cj.jdbc.Driver老配置文件里写的是com.mysql.jdbc.Driver自然无法加载。时区错误则是 8.0 新引入的校验机制旧版不需要指定时区。解决驱动类名改成com.mysql.cj.jdbc.Driver同时确认pom.xml里的 mysql-connector 依赖版本是 8.x。这两处改完后时区问题由连接串里的serverTimezoneAsia/Shanghai处理好。这里还建议在 MySQL 里执行set global time_zone 08:00;双保险。5.4 前端打包后放进 Spring Boot 出现页面 404现象npm run build生成 dist 目录后把静态资源放到 Spring Boot 的src/main/resources/static下访问首页能打开但刷新某个子页面就 404。原因Vue 用的是 HTML5 History 路由模式路径切换是前端路由控制的相比 hash 模式URL 里带#路径变化时服务器端看不到这个页面也匹配不到对应的静态文件于是返回 404。解决有两条路。第一条是改路由模式在router/index.js里把mode: history改成mode: hash重新打包。用 hash 模式成本最低推荐毕设项目首选。第二条是保持 history 模式在 Spring Boot 里加一个转发规则把所有非静态资源的请求转发到index.html。第二种方案更专业适合想演示完整路由功能的项目。5.5 登录接口始终返回 401现象前端发起登录请求后后端立即返回 401但用户名密码明明是对的。原因常见的多处原因。登录请求没走拦截器白名单或前端没有正确传参后端要username/password两个字段前端传了userName/password又或者前端请求头里带了过期的非 Token 信息被拦截器判定为非法请求。解决先打开后端拦截器代码看preHandle方法里的白名单放行逻辑。正常的拦截器会对/login等路径放行。把登录接口的路径放行即可。第二部打开浏览器 F12 Network看登录请求的 Payload 是什么格式检查参数名是否和后端实体字段一致。还有一个细节如果源码使用了 JWT注意前端请求头加的是Authorization还是token两边对不上后端就会默认你没带 Token 然后 401。5.6 Spring Boot 版本过高导致的依赖冲突现象导入项目后 Maven 依赖大量报红或者启动时报No qualifying bean之类的奇怪错误。原因有些毕设源码写于较早年份用的 Spring Boot 2.1 或 2.3而本机 IDEA 里默认的 Maven 仓库是下载好的高版本依赖。当源码pom.xml指定了较老版本而仓库里有更高的版本缓存依赖解析时产生不可名状的冲突。解决最稳妥的办法是先在 IDEA 右侧 Maven 面板里点一下刷新按钮让它重新下载源码指定的版本依赖。如果还不行就打开pom.xml后按住 Ctrl 点击某个依赖看依赖的 class 文件是否存在。依赖冲突深挖起来很花时间兜底方案是检查pom.xml里的spring-boot-starter-parent版本并把它改为 2.5 左右的稳定版大多数毕设源码在这个版本下都能存续。改版本之后继续启动不行再逐一点击右键“排除冲突依赖”。6. 把源码变成自己的毕设作品用访问量统计验证你对代码的掌控力拿到了源码、跑通了整套系统、改完了主页下一步就是让答辩老师相信“这项目是你做的”。验收自己熟练程度最好的方法不是复述代码而是往里面加一个原先没有的功能。我推荐你做访问量统计因为这个功能逻辑足够简单却要动到前端展示、后端接口、数据库设计三个层面一套走下来你对这套代码的掌控力就体现出来了。先加一张表CREATE TABLE portal_counter ( id int(11) NOT NULL AUTO_INCREMENT, page_url varchar(200) NOT NULL, count int(11) DEFAULT 1, PRIMARY KEY (id), KEY idx_page_url (page_url) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;后端加一个查询接口统计所有页面的访问总量再给首页接口加一段逻辑每次调用时把对应页面的 count 值加 1。实现时注意一点统计代码不要直接写在 Controller 里放到 Service 方法里保持分层职责清晰。前端在首页底部组件挂载时调用一次查询接口把返回的总数渲染到页脚。这套流程走完你至少做了建表、写 Mapper、写 Service、写 Controller、前端调接口和渲染六件事每一件都落在这个源码的既有框架里。答辩老师问“你对这个项目做了什么改动”你就能摊开讲从数据库到页面的完整链路。这段经历比任何“我会 Spring Boot”的空洞回答都更有说服力。最后说一点我的个人习惯从那以后我每次拿到新的源码包都强制走一遍“读目录结构 → 跑通前后端 → 改一个小功能”的流程。跑不通的源码直接换掉跑通了就动手改改了才觉得这代码是自己的。每份下载的源码都只是一个起点把它变成你能讲清楚每一行来龙去脉的东西才算真正消化了它。希望这套思路能帮到你无论是完成毕设还是入门 Spring Boot 与 Vue 的前后端分离开发。本文还有配套的精品资源点击获取
返回列表