SpringBoot+Vue+MySQL打造企业内部网络管理系统全流程实战

发布时间:2026/10/7 10:30:01
SpringBoot+Vue+MySQL打造企业内部网络管理系统全流程实战 做毕业设计最怕的不是题目难而是题目空。比如“基于大数据的××分析平台”听起来高大上但需求怎么定、功能怎么画、数据从哪来全是含糊的。相比之下企业内部小型网络管理系统这种题目的好处在于需求范围是看得见摸得着的技术栈又非常主流。我自己用SpringBootVueMySQL把这套系统完整走了一遍从画页面到写接口从建库到服务器部署中间踩了不少坑也沉淀了一些心得体会。这篇文章就围绕这个项目把选题思路、功能设计、数据库建表、前后端实现、部署上线、问题排查这些环节逐一展开希望能让后面做类似题目的同学少走弯路。这个项目适合谁参考第一类是准备做Web方向毕业设计的学生第二类是刚入行想练手全栈开发的工程师。系统本身是一个信息管理系统但它把登录鉴权、设备管理、IP资源分配、定时监控任务、告警处理、操作日志这些企业级Web开发的高频知识点都串起来了。如果你手里拿到的是这么一套源码加数据库加部署文档读完这篇文章你不仅能把它跑起来还能在答辩的时候把每个模块的设计理由讲得明明白白。1. 选题拆解与技术路线规划1.1 这个系统到底解决什么问题企业内部小型网络管理系统关键词落在“内部”和“小型”两个词上。它不是运营商级别的网管平台不需要复杂的SNMP协议栈和数据采集集群它面向的是一个几十人到几百人规模的企业局域网核心诉求是让网管人员能在一张网页上搞清楚三件事网里有哪些设备、每台设备现在通不通、IP资源都分配到哪里去了。这个定位对毕业设计非常友好边界清晰、需求明确、工作量可控。相比那些功能膨胀的选题网络管理系统的每个功能模块都能精确对应到实际场景。答辩的时候老师问你“系统有什么实际意义”你可以讲得非常具体新同事入职要分配IP地址、某台服务器连不上了要快速定位故障、设备台账还在用Excel导致信息不同步、设备故障后说不清是哪台机器谁负责的。这些问题每一个都能对应到系统里的一个功能模块这种“需求—功能—技术”的对应关系恰好是答辩评委最想看到的。系统需要管理的不只是电脑终端还包括路由器、交换机、服务器、打印机、无线AP这些常见网络设备。每种设备的属性不一样比如服务器关心CPU和内存交换机关心端口数打印机关心型号和耗材但它们也有公共属性IP地址、MAC地址、物理位置、责任人、在线状态。这些公共属性就是设备管理模块的建设基础。1.2 为什么是SpringBootVueMySQL这套组合说句实话这套组合已经成了毕业设计的事实标准。不全是跟风而是每样东西在“独立开发一个完整Web应用”这个场景下都是最优解。SpringBoot解决的是后端搭架子的问题。它把繁复的Spring配置变成了约定内嵌Tomcat一条命令就能启动。对于没有企业开发经验的同学来说SpringBoot的学习曲线比传统SSH、SSM组合友好得多而且在写代码的时候几乎感觉不到配置文件的存在注意力可以集中在业务逻辑上。Vue解决的是前端状态和组件维护的问题。设备列表页、监控状态页、弹窗表单、菜单路由天然适合用组件化来管理。Vue的响应式数据绑定让你在写设备列表和监控状态这类页面时不用手动操作DOM数据一变页面自动跟着更新开发体验比当年用jQuery拼接字符串不知道舒服了多少。MySQL则是数据存储层面的可靠选择。这种管理型系统是典型的OLTP场景表结构清晰、事务要求不高但必须有MySQL完全覆盖。而且它的资料最多遇到问题随便一搜就有答案这对时间紧张的毕业设计周期来说非常重要。这三个东西的分工你可以理解成MySQL是仓库SpringBoot是仓库管理系统Vue是给管理员看的实时看板。各管一段边界清晰出了问题也容易排查。2. 功能模块与数据库设计落地2.1 六个核心功能模块怎么拆我在设计这个系统的时候没有刻意追求功能数量而是先画了一张“用户走进系统后要完成哪些事”的流程图然后按流程把功能切成六个模块。切完之后我自己都觉得这个切法很自然因为每个模块之间的边界非常清晰可以并行开发互不干扰。模块核心功能对应页面后端核心接口设备管理设备台账增删改查、类型分类、状态展示设备列表、设备编辑弹窗/api/device/page、/api/device/saveIP资源管理网段划分、IP分配与回收、占用状态追踪IP网段列表、IP明细列表/api/ip/allocate、/api/ip/recycle网络监控ping探测、端口探测、定时巡检、状态历史监控状态页、历史记录/api/monitor/status、/api/monitor/history告警管理故障告警记录、确认与处理、处理状态流转告警列表/api/alarm/handle用户与权限登录认证、角色权限、操作日志登录页、用户管理页/api/auth/login、/api/user/manage系统配置巡检间隔、告警阈值等参数维护参数设置页/api/config/save设备管理是整个系统的基础没有设备台账监控和IP分配全是空中楼阁。我在实现时让设备表单除了基本信息外还能维护IP、MAC、所在位置、责任人。这样后面监控告警才能把“设备故障”落到“谁负责的哪台机器”上。特别提一个细节我在设备列表每一行加了一个展开按钮点击后能看到该设备最近10条监控记录和3条未处理告警。答辩展示这个细节很加分老师会觉得你有站在使用者角度思考问题。IP资源管理模块在实现上要区分“网段”和“IP地址”两个层级。网段代表一个CIDR块比如192.168.10.0/24IP地址是该网段下的具体条目。分配时不能只把IP标记为“已用”还得关联到具体设备和占用日期回收时解除关联。冲突检测的核心逻辑是分配前检查该IP是否已经在device表中有记录如果有就禁止再次分配。答辩演示时你可以手动构造一个冲突场景展示系统的拦截效果这个亮点很值钱。网络监控模块用的是SpringBoot的Scheduled定时任务。这个模块有一个我踩过的坑后面会专门说这里先提一句Java里自带的InetAddress.isReachable()方法在局域网环境下超时控制很迷经常误判后来我改成了调用系统ping命令解析结果在Windows和Linux下都稳定。也可以用另一种更贴近生产环境的方式尝试建立TCP Socket连接指定端口比如某台Web服务器你关心的不是ICMP通不通而是80端口能不能连上。告警管理模块就是个状态机告警产生时状态是“未处理”网管确认之后变成“处理中”修复完成后填个处理结果变成“已关闭”。整个流转逻辑不复杂但前端页面上要展示“未处理告警数量”的角标这算是一个小的红点需求做起来不费劲但很能体现完成度。2.2 数据库表结构设计哪些表必须建哪些坑必须躲数据库设计是这个项目的地基。表结构设计不合理后面写代码会越写越痛苦设计合理了写到Service层会非常顺手。我整理下来核心表一共九张。先看最核心的设备表。这是我建表时用的SQLCREATE TABLE device ( id bigint(20) NOT NULL AUTO_INCREMENT, device_name varchar(100) NOT NULL COMMENT 设备名称, device_type_id bigint(20) NOT NULL COMMENT 设备类型ID, ip_address varchar(50) DEFAULT NULL COMMENT 管理IP, mac_address varchar(50) DEFAULT NULL COMMENT MAC地址, location varchar(200) DEFAULT NULL COMMENT 物理位置, owner_user_id bigint(20) DEFAULT NULL COMMENT 责任人ID, status tinyint(4) DEFAULT 1 COMMENT 状态 1在线 0离线, remark varchar(500) DEFAULT NULL COMMENT 备注, create_time datetime DEFAULT NULL, update_time datetime DEFAULT NULL, PRIMARY KEY (id), KEY idx_ip (ip_address) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT设备台账表;类似的表还有device_type、ip_segment、ip_address、monitor_log、alarm、user、role、user_role、operate_log一共九张。其中monitor_log和operate_log是增长型表需要特别注意。建表时有四条经验值得记下来第一时间字段统一用datetime不要用int存时间戳。虽然int存时间戳节省存储空间但查询时可读性极差用Navicat看表数据还要在脑子里换算答辩时老师打开数据库看到一堆数字第一印象就不好。第二IP地址字段直接存varchar。有同学为了显得专业用INET_ATON把IP转成整数再存查询时再转换回来。这个方案在性能上确实更好但对小型系统完全没必要徒增代码复杂度。第三所有表都加create_time和update_time用MyBatis-Plus的自动填充功能。这样在操作日志和审计时非常方便而且几乎不增加编码量。第四监控记录表会持续增长必须为device_id和create_time建联合索引。实测下来几千条数据时不加索引也能秒开但如果把巡检间隔调到1分钟半个月就能攒两万多条记录没有索引时查询会明显变慢。建索引的SQL很简单ALTER TABLE monitor_log ADD INDEX idx_device_time (device_id, create_time);3. 后端SpringBoot实现从工程结构到核心代码3.1 工程分层与关键依赖后端的工程结构我采用了最标准的四层架构Controller层负责接收请求Service层负责业务逻辑Mapper层负责数据库访问Entity层映射数据表。除此之外增加vo包放前端展示对象config包放配置类common包放通用工具。选SpringBoot版本时有一个很实际的建议不要追新。我项目用的是2.7.18这个版本是2.x系列的最后一个版本稳定而且资料多。为什么不推荐3.x因为3.x要求JDK17而很多学校的实验室电脑和云服务器还是JDK8选题答辩时环境不兼容会非常难受。如果你用的也是JDK8直接选2.7.x别犹豫。依赖方面除了SpringBoot基础依赖我强烈建议引入MyBatis-Plus。这个框架最大的价值在于写CRUD时可以只写一个接口继承BaseMapper大量增删改查不用再写SQL开发效率至少提升三分之一而且它自带分页插件。如果你的源码里用的是原生MyBatis改造成MyBatis-Plus也不难逻辑代码基本不用动。3.2 统一返回值、异常处理与JWT登录鉴权写接口时最容易犯的错误是每个Controller各写各的返回格式有的返回Map有的返回一个实体类前端调起来非常痛苦。我在项目里定义了一个统一的Result类所有接口都返回这个结构public class ResultT { private Integer code; // 200成功非200失败 private String message; private T data; public static T ResultT ok(T data) { ResultT r new Result(); r.code 200; r.message success; r.data data; return r; } public static T ResultT error(String message) { ResultT r new Result(); r.code 500; r.message message; return r; } }配合全局异常处理器把业务异常和系统异常统一拦截前端只用判断code是否为200其他情况直接弹出message。这样前后的契约就固定了联调时少了一半扯皮。登录认证我选了JWT加拦截器的方案没有用Spring Security。原因很实际毕设系统不需要那么重的安全框架JWT轻量、代码可控、答辩时你能把原理讲清楚。Spring Security的过滤器链对新手来说是个黑盒被老师追问细节很容易答不上来。JWT的实现就三件事登录成功后签发token、拦截器校验token、前端请求头携带token。拦截器核心逻辑如下public class JwtInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 放行登录接口 if (request.getRequestURI().contains(/auth/login)) { return true; } String token request.getHeader(Authorization); if (token ! null token.startsWith(Bearer )) { token token.substring(7); } if (StringUtils.isBlank(token) || !JwtUtil.verify(token)) { response.setStatus(401); return false; } // 把用户ID放入请求上下文供后续Controller使用 request.setAttribute(userId, JwtUtil.getUserId(token)); return true; } }3.3 定时巡检任务与接口实现定时监控是整个系统里最像“网络管理”的部分。我用Scheduled写了一个巡检任务每隔固定时间遍历一次设备表逐个探测设备连通性然后把结果写入monitor_log表。配置很简单Component public class MonitorTask { Autowired private DeviceMapper deviceMapper; Autowired private MonitorLogMapper monitorLogMapper; Scheduled(fixedDelay 60000) // 每60秒执行一次上一次执行完才开始计时 public void checkDevices() throws InterruptedException { ListDevice devices deviceMapper.selectList(null); for (Device device : devices) { boolean reachable PingUtil.ping(device.getIpAddress(), 1000); MonitorLog log new MonitorLog(); log.setDeviceId(device.getId()); log.setStatus(reachable ? 1 : 0); log.setCheckTime(new Date()); monitorLogMapper.insert(log); // 如果状态变化则更新设备表和生成告警 } } }这里有两个容易忽略的地方。一是启动类上记得加EnableScheduling注解否则定时任务不生效。二是fixedDelay和fixedRate的区别要搞清楚fixedRate是固定频率不管上一次是否执行完下一次都会准时开始fixedDelay是固定延迟上一次执行完才开始计时。网络巡检这种可能执行时间不稳定的任务用fixedDelay更合适避免任务堆积。PingUtil这个工具类我最初用InetAddress.isReachable()实现但实测它在局域网下经常返回错误结果而且1000毫秒超时设置有时形同虚设。后来改成用ProcessBuilder调用系统ping命令public static boolean ping(String ip, int timeout) { try { ProcessBuilder builder; if (System.getProperty(os.name).toLowerCase().contains(win)) { builder new ProcessBuilder(ping, -n, 1, -w, String.valueOf(timeout), ip); } else { builder new ProcessBuilder(ping, -c, 1, -W, String.valueOf(timeout / 1000), ip); } Process process builder.start(); boolean success process.waitFor(3, TimeUnit.SECONDS); return success process.exitValue() 0; } catch (Exception e) { return false; } }4. 前端Vue实现框架搭建与页面联调4.1 环境搭建与UI选型前端这块脚手架用的是Vue CLI创建的Vue2工程UI库用的Element UI。先说明一下版本选择的逻辑目前网上大量现成的毕设源码和教程都是Vue2遇到问题时查博客、问学长都能很快找到答案。Vue3ViteElement Plus确实更好但如果你的节奏是“快速跑通并理解”Vue2的生态资料优势非常明显。如果你是从零开始且时间充裕直接上Vue3也是可以的组合式API写起来体验更好。前端工程内部结构分成三块router目录放路由配置api目录放接口请求定义views目录放页面组件。这里有一个习惯值得推荐api目录下每个模块建一个文件比如device.js里集中导出所有设备相关的接口函数。页面组件只负责调api不直接写axios请求后期维护时找接口非常快。创建项目的命令很简单vue create network-manage-web cd network-manage-web npm install element-ui axios npm run serve4.2 axios封装、路由守卫与动态菜单axios如果不做封装每个页面都要重复写获取token、拼接请求头、处理错误码的逻辑代码会非常脏。我在项目里做了统一拦截器在request拦截器里加token在response拦截器里统一处理业务错误和登录过期import axios from axios 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) { alert(res.message) return Promise.reject(new Error(res.message)) } return res }, error { if (error.response error.response.status 401) { localStorage.removeItem(token) window.location.href /login } return Promise.reject(error) } ) export default service路由守卫是控制页面访问权限的关键。简单版本就是没有token就跳登录页。但更完整的做法是加上动态路由——根据当前用户角色从后端拉取可访问的菜单用router.addRoutes动态注册。动态路由在答辩时可以作为一个亮点展示因为很多毕设系统只是把菜单隐藏了实际上未授权页面直接输入URL还是能进这属于安全隐患。动态路由直接从路由层面杜绝了越权访问。router.beforeEach((to, from, next) { const token localStorage.getItem(token) if (to.path /login) { next() } else if (!token) { next(/login) } else { next() } })4.3 监控页面实时刷新与组件拆分设备管理页面我拆成了三个子组件SearchBar负责搜索条件DeviceTable负责表格展示DeviceFormDialog负责新增和编辑弹窗。数据都放在父组件里管理子组件通过props往下传数据通过$emit往上报事件。这样拆的好处是每个组件只干一件事代码量适中答辩时讲组件通信机制也方便。监控页面的实时刷新核心逻辑是在created生命周期里启动一个定时器每10秒调用一次后端监控状态接口把最新的设备连通状态刷新到表格里。这里有一个必须注意的坑组件销毁前一定要清除定时器否则页面切换走了以后定时器还在跑浏览器控制台会持续报错严重时影响整体性能。data() { return { timer: null } }, created() { this.loadStatus() this.timer setInterval(this.loadStatus, 10000) }, beforeDestroy() { clearInterval(this.timer) }监控页面的展示我建议用表格加Tag标签的方式每一个设备一行状态列用在线/离线来区分显示最好还能附上这次的响应时长。现场演示的时候你拔掉一台设备的网线刷新页面看到状态变红再把网线插回去看到状态恢复这个演示效果比讲任何技术细节都直观。5. 本地开发到服务器部署完整流程实录5.1 本地开发环境搭建与启动顺序一个新人拿到这套源码最容易犯的错是上来就同时启动前端和后端结果一堆报错不知道先排查哪个。正确顺序是先把环境准备齐再逐个启动验证。第一步安装JDK8并配置JAVA_HOME命令行执行java -version确认版本。第二步安装Maven 3.6以上版本在settings.xml里配好阿里云镜像否则首次下载依赖会慢到怀疑人生。第三步装MySQL用Navicat或命令行执行一条建库语句CREATE DATABASE network_manage DEFAULT CHARACTER SET utf8mb4;然后把初始化SQL脚本导入进去。这里我加一句如果你拿到的源码包里数据库脚本叫init.sql或者network_manage.sql导入的时候一定要看清楚文件里有没有CREATE DATABASE语句如果没有自己先建好库再导入不然会报No database selected的错误。数据库准备好之后修改后端application.yml里的数据库账号密码就可以启动后端了。启动成功的标志是控制台出现“Started Application in x.xxx seconds”并且端口8080没有报占用。然后再启动前端npm install如果太慢可以把npm源切换到国内镜像再执行npm run serve。浏览器访问localhost:端口看到登录页就说明环境通了。5.2 服务器部署jar包加Nginx反向代理如果只在本机跑通答辩时还得自己带着电脑遇到投屏接口不兼容就更糟。建议把项目部署到一台实验室局域网内的Linux服务器上老师直接通过浏览器访问比你拿着自己的电脑演示稳得多。后端打包执行一条命令mvn clean package -DskipTeststarget目录下会生成一个jar包大概几十MB大小。把这个jar包传到服务器任意目录用nohup启动只是最草率的做法。一个更规范、对答辩加分的做法是用systemd管理服务这样系统重启后后端能自动拉起[Unit] DescriptionNetworkManageBackend Afternetwork.target [Service] Typesimple Useradmin WorkingDirectory/opt/network-manage ExecStart/usr/bin/java -Xms256m -Xmx512m -jar network-manage.jar Restarton-failure RestartSec10 [Install] WantedBymulti-user.target前端部署先执行npm run build生成dist目录然后配置Nginx。前端静态资源和后端接口分离通过Nginx反向代理落到同一个域下顺便解决跨域问题。server { listen 80; server_name 192.168.1.100; root /opt/network-manage/dist; 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; proxy_set_header X-Real-IP $remote_addr; } }配置完成后重启Nginxnginx -s reload。访问服务器IP如果能看到登录页前后端能正常登录恭喜你部署成功。5.3 部署文档应该包含的核心内容如果你手中的项目附带部署文档这个文档的完整程度决定了你能不能顺利把系统跑起来。我自己写部署文档的时候固定包含五大部分环境版本清单、数据库初始化步骤、后端启动配置说明、前端构建命令、Nginx关键配置示例。不管你是要自己用还是给别人用这五部分缺一不可。环境版本清单直接写明JDK版本号、Maven版本号、Node.js版本号、MySQL版本号、Nginx版本号不要写“jdk8及以上”这种含糊的话。版本不对引发的怪问题能淹死你。数据库初始化步骤要写清楚建库命令、脚本导入路径、初始化账号密码。后端启动配置要列明application.yml里哪些参数是必须要改的。前端构建要写清npm install和npm run build的执行顺序。这些内容看着琐碎但真到答辩演示或者换一台新电脑部署时你就知道这份文档多值钱了。我当初就是按照这个清单整理把项目从自己电脑迁移到服务器时全程照着文档操作一气呵成。6. 常见问题与排查技巧实录6.1 数据库连接与中文乱码问题后端启动报Access denied for user是最常见的问题超过一半的情况是application.yml里的密码和本地MySQL不一致。先检查配置文件再用命令行登录验证密码是否正确。如果用的是MySQL 8.0还有可能遇到Public Key Retrieval is not allowed的报错这是MySQL 8.0默认的caching_sha2_password认证方式导致的解决方法是JDBC连接串加上两个参数jdbc:mysql://localhost:3306/network_manage?useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/Shanghai中文乱码问题十有八九是建库时字符集没指定utf8mb4。我之前建库图省事直接执行CREATE DATABASE network_manage默认用了latin1导入的SQL里所有中文备注全部变成问号。如果你也遇到这类问题重置数据库字符集的方法在这里ALTER DATABASE network_manage DEFAULT CHARACTER SET utf8mb4;注意这个命令只对新建的表生效已经存在的表需要单独改。所以最省事的办法是删库重建这点牢记在心别重复踩坑。6.2 前后端联调与跨域问题解决思路本地开发环境下前端跑在8081端口后端跑在8080端口浏览器看到的就是典型的跨域请求页面和服务器的源不一致。解决跨域有两个经典方案方案一是在后端加CORS跨域配置全局放行方案二是在前端vue.config.js里配置开发代理。我推荐方案二理由很实际开发环境用代理模拟同源请求生产环境用Nginx反向代理也是同源请求两边行为一致代码里不用为了跨域做任何妥协。vue.config.js里的代理配置module.exports { devServer: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true, pathRewrite: { ^/api: /api } } } } }配置完成后一定要重启npm run serve代理才会生效这是很多人容易忽略的点。6.3 打包含部署的真实排障记录后端打包时用的Maven默认会在package阶段执行单元测试如果你的代码里有测试类且数据库连接不上的时候打包会直接失败。最简单的方式是用-DskipTests跳过测试但要注意如果你想执行测试但跳过打包那是另一套写法别混淆。最稳妥的打包命令mvn clean package -DskipTests前端打包后部署发现页面空白这是另一个高频问题前端路由用的history模式刷新某个子路由时Nginx不知道如何映射返回404。解决办法就是在Nginx配置里加try_files指令让所有路由都回退到index.html由前端路由接管。上面的Nginx配置里已经写好了。还有一个现象很迷惑人前后端各自都能启动页面访问正常但登录时一直报网络错误或500。排查这种问题要遵循“从外往里缩小范围”的思路。先看浏览器请求的URL是不是对的再直接访问后端接口地址看能否返回数据最后看后端控制台有没有报异常日志。这种分层排查比瞎猜快得多。我做了一个快速排查表格可以保存下来对照现象可能原因解决方案后端启动报Access denied数据库密码错误或MySQL版本认证问题检查application.yml连接串加allowPublicKeyRetrieval前端请求接口404代理未配置或后端路由不匹配检查vue.config.js和Controller请求路径浏览器报跨域错误前后端端口不一致开发环境用proxy生产环境用Nginx数据库中文乱码建库未指定utf8mb4重建数据库并指定字符集监控状态全部离线漏加EnableScheduling启动类加注解并确认日志有定时任务输出前端打包后空白history路由未配置try_filesNginx location / 加try_files时间差8小时JDBC连接串未指定时区serverTimezoneAsia/Shanghai最后再说一个非常隐蔽的情况服务器上后端服务起来了端口也监听了但局域网内其他电脑访问不了。排查顺序是先看本地curl能不能通再查防火墙有没有放行端口最后确认Nginx配置的server_name是不是绑定了具体的IP。防火墙问题通常执行firewall-cmd --add-port8080/tcp就能解掉但很多人根本想不到是防火墙拦了因为本机访问是通的换个电脑就不行了。做这个项目时我自己最有感触的一个阶段是最后一周的“删库重来”演练。我把服务器上的项目全部清掉按照部署文档从零开始重新部署结果发现文档里漏写了数据库初始化账号和密码当场又补了一版。这个事情给我的教训是部署文档不是写给别人看的是写给“失忆的你自己”看的。你也一样拿到源码后不要急着改代码先按它的部署文档把系统完整跑通一遍再动手研究代码逻辑这个顺序能帮你省下大量的排查时间。这个系统后续如果要延续下去扩展空间还很大接入Nacos做配置中心、把监控数据接入时序数据库、用WebSocket替代轮询实现实时刷新、增加扫码盘点资产功能都能成为新的独立课题点。至于现在先把这套SpringBootVueMySQL跑起来收获自己的第一份“全栈”手感才是正经事。