news 2026/10/5 2:56:39

虚拟机搭建Linux环境全指南:从选型配置到开发排错

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
虚拟机搭建Linux环境全指南:从选型配置到开发排错

很多朋友一听到“搭建虚拟机环境Linux”,脑子里第一个动作就是去下载VMware、拉一个ISO镜像,然后一路下一步。等你真正装完开始用,才会发现里面的细节多到让人头疼:镜像选哪个版本、磁盘怎么分、网络配不通、宿主机蓝屏、虚拟机连不上。这篇我用实际经验把整条路再走一遍,从选型到安装,再到日常开发和排错,一次性捋清楚。

我做这套环境主要服务两类需求:一类是学习Linux命令、熟悉服务部署,另一类是在Windows宿主机上跑一个贴近生产环境的开发机,用来调Nginx、编译代码、跑脚本。如果你也是其中一种,那这篇内容大概率能帮你省下不少折腾时间。

1. 用虚拟机跑Linux,先想明白这三件事

1.1 需求决定选型:你到底是哪种用法

虚拟机这个东西,本质上就是在你的物理机上模拟出一整套计算机硬件,让Linux以为自己在独立机器上运行。它和我们常说的双系统不一样,双系统每次只能进一个,虚拟机则可以在Windows窗口里随时启动、暂停、快照,两个系统互相不打扰。但这个“不打扰”是有代价的,虚拟化有性能损耗,同时宿主机还得持续供电和供资源。

所以第一个要解决的问题,是弄清楚自己属于哪一类用户:

  • 刚入门,想学命令行和Shell脚本:这种情况不需要太高的性能,VirtualBox或者VMware Player足够,重点是系统要稳定、资料多。
  • 后端开发调试:业务代码要跑在Linux服务器上,本地虚拟机就要尽量接近生产环境,网络模式、端口转发、目录挂载都得认真配。
  • 运维测试人员:经常要在干净的系统里验证部署脚本、软件包、配置文件,这时候快照和克隆能力最值钱,改坏了立刻回滚。
  • 嵌入式或内核方向:这类需求不只看系统能不能跑起来,还要看能否加载内核模块、直通USB调试器、访问串口。虚拟机里做嵌入式,很多坑源自虚拟化设备与真实硬件驱动的差异。

我身边一个真实的例子:有朋友听说Ubuntu好用,直接装了最新桌面版,结果他要跑的中间件只提供CentOS版本的安装包,折腾半天最后全部推翻重来。所以在动手前,先回答一个问题——你要在这个虚拟机环境里跑什么?这个答案会直接决定后续所有选择。

1.2 主机系统与虚拟机软件的组合考量

虚拟机软件选型,常年纠结在VMware Workstation和VirtualBox之间。我把实际使用的对比放在这里:

对比项VMware Workstation ProVirtualBox
付费模式商业软件,但历史上有过免费个人版开源免费
图形性能3D加速较好,跑桌面Linux更流畅桌面体验弱一些,做服务环境够用
网络管理NAT、桥接、仅主机三模式直观可靠支持完整网络模式,配置稍繁琐
快照克隆操作方便,面板清晰支持,但界面和导出略老
资源占用偏高更轻量

我自己长期用VMware,因为它的网络配置和快照管理确实省心。但如果你只是要一个能跑命令的Linux,VirtualBox完全够用,而且少了很多授权上的顾虑。

这里还要提一个目前很常见的替代品:Windows Subsystem for Linux。WSL的启动速度快、资源占用少,做一个命令行环境很舒服。但它和完整虚拟机有本质区别——没有完整虚拟硬件、不模拟BIOS引导、systemd行为不标准,跑网络服务、内核模块这类场景会和真实Linux有偏差。你要是想深入学习Linux,或者要复现服务器环境,还是老老实实用完整虚拟机。

1.3 BIOS里那个被忽略的开关

很多人装虚拟机卡在“系统无法启动”“CPU不兼容”这类问题上,翻来覆去找原因,最后发现是BIOS里的虚拟化开关没开。

Intel平台的叫Intel Virtualization Technology,AMD平台叫SVM Mode。有些品牌机默认是关闭的,需要在开机按Del或F2进入BIOS,在Advanced或者Security菜单里找到并开启。这个操作特别基础,但影响特别大。不开虚拟化的情况下,VMware启动虚拟机经常直接黑屏或报错,VirtualBox更是会明确提示“VT-x is not available”。

你在安装虚拟机软件之前,可以先打开任务管理器,切到“性能”标签,看“虚拟化”那一项是否显示“已启用”。如果显示“已禁用”,大概率是BIOS层面的问题,而不是软件设置能解决的。

2. 环境准备:镜像下载、虚拟化开关和虚拟机创建参数

2.1 镜像版本选择与软件源的关系

Linux发行版那么多,选型逻辑其实就两条:目标生态和更新周期。开发环境偏Debian/Ubuntu,资料多、软件新、遇到问题容易搜索;服务端生产环境则很多沿用RHEL系,比如Rocky Linux、AlmaLinux,它们可以兼容过去CentOS的运维习惯。

镜像下载别去官网硬磕,国内环境用阿里云镜像、清华TUNA、中科大镜像站,速度差距非常明显。下载的时候注意区分桌面版和Server版,还要注意架构,普通PC选x86_64,Apple芯片的机器做ARM虚拟机又是另一套玩法。

另外一个特别容易踩的坑:很多人只在下载镜像时想到了“换源”,装完系统以后才发现apt或者yum装个包慢得像爬,这才意识到软件源还没换。安装介质用的镜像源和系统内部包管理器的软件源是两个概念,要在系统里把/etc/apt/sources.list或/etc/yum.repos.d/下的配置一并换成国内源,后面的体验才会顺畅。

至于银河麒麟这类面向特定场景的产品,官方会提供适配虚拟化平台的镜像或安装文档。装这类系统我建议直接查官方资料,不要完全依赖论坛碎片教程,因为版本匹配要求比社区发行版更严格,自己乱试容易浪费时间。

2.2 虚拟机硬件分配的逻辑

创建虚拟机的参数设置,看似简单,其实暗含一套资源分配逻辑。用通俗的话讲:你是在跟宿主机的操作系统“合租”这台电脑,你不能把所有资源都抢走。

内存分配是我见过问题最多的地方。总的原则是宿主机至少留2GB给自己,其余再考虑虚拟机。16GB内存的机器,给虚拟机4GB是比较稳妥的数值;如果直接分出12GB,一旦编译或跑服务,宿主机先卡死,虚拟机也跟着遭殃。

CPU分配也常见误区。物理机如果只有4核8线程,那分配给虚拟机的逻辑处理器数量不宜超过4个,给2到4个都比较合理。有些人觉得核数越多编译越快,拉到8个去跑,结果调度的开销比收益还大,性能反而变差。

磁盘设置同样有讲究。创建虚拟磁盘时,通常会让选择“拆分成多个文件”还是“单个文件存储”。拆分模式方便复制和迁移,单个文件性能略优;如果你不需要频繁搬动虚拟机,选单个文件更顺畅。动态分配磁盘适合大多数人,空间用多少占多少;但如果你对磁盘I/O有较高要求,固定大小磁盘会更稳,代价是创建时就占满空间。

还有一个小细节:创建向导里让你选择客户机操作系统的类型和版本,别随便选,也别选错了。它会影响虚拟机固件、驱动适配和后续增强工具的安装方式。拿Debian的模板去装Ubuntu,一般能跑,但一些小毛病会让人摸不着头脑。

3. 安装过程全实录:引导、分区、系统初始化

3.1 从镜像启动到分区安装的关键动作

安装Linux的过程,现在绝大多数发行版都图形化了,难度比几十年前低太多。难点往往集中在两处:ISO挂载方式和磁盘分区。

先说明一下挂载方式,VMware中可以直接把下载好的ISO文件配置到“CD/DVD驱动器”,勾选“启动时连接”,然后启动虚拟机。虚拟机能不能从ISO引导,和虚拟机固件类型有关,传统BIOS和UEFI的引导流程不一样。如果你的物理机用了UEFI,建议虚拟机选择UEFI固件,装一些较新的发行版更省心。

进入安装界面以后,语言、键盘、时区这类选项没什么好说的。重点说分区。

如果你不想因为分区问题卡住,最稳的方案是选择整个磁盘自动分区。很多人看教程喜欢手动分/boot、/、/home和swap,但对初学者来说,手动分区最容易出现的问题是根分区空间不够。比如有人分给/只有20GB,装完系统、再装一两个开发环境,磁盘直接见底。

我的建议是:如果不是有明确的生产要求,就选“使用整个磁盘并配置LVM”或者“使用整个磁盘”。系统自己管理磁盘布局,后续要扩容也有余地。LVM概念不复杂,可以把它理解成一块可以动态调节分区大小的空间池,比传统固定分区灵活,值得优先考虑。

swap分区的大小,不必像老教程说的“内存两倍”。如果虚拟机内存分配了4GB以上,swap给2GB足够;如果跑编译任务,可以考虑给4GB,但不要舍本逐末去追求所谓“标准值”。

安装过程中还会让你创建用户和密码,建议创建一个普通用户用于日常操作,不要直接用root。很多发行版安装器会询问“是否使用root登录”,生产习惯和练习习惯不同,我倾向于默认禁止root直接登录,用sudo提权就够了。

3.2 安装后第一件事:网络打通与SSH配置

系统装完重启,第一件事不是打开桌面东点西点,而是确认网络通不通。

先用几个命令快速判断:

ip addr # 查看网卡和IP地址 ip route # 看网关 ping -c 4 223.5.5.5 # 测试外网连通性 ping -c 4 baidu.com # 测试DNS解析

如果 ping IP 通、ping 域名不通,那基本是 DNS 配置问题。临时测试可以用echo "nameserver 223.5.5.5" | sudo tee /etc/resolv.conf先顶上,但要注意,很多系统里这个文件会被系统服务接管,重启后可能被覆盖。想固化配置,Debian系和RHEL系改法不一样:一个是/etc/network/interfaces或 Netplan,另一个是/etc/sysconfig/network-scripts/下的网卡配置文件。

开SSH也很关键,毕竟虚拟机里操作窗口再方便,也比不上从Windows终端直接SSH进去顺手。Ubuntu Server默认可能不装SSH服务端,需要手动执行:

sudo apt update sudo apt install -y openssh-server sudo systemctl enable --now sshd

之后在Windows端用ssh 用户名@虚拟机IP就能连了。如果连不上,优先查两件事:一是虚拟机防火墙是否放行22端口,二是虚拟机的网络模式是不是NAT,NAT模式下宿主机访问虚拟机需要额外的端口转发配置,这个下一节详细说。

创建一个日常使用的用户也很基础:

sudo useradd -m -G sudo dev sudo passwd dev

这样你就有一个带管理员权限的日常账号,而不是一直顶着root干活。

4. 真正好用的虚拟机环境:网络、文件共享与开发环境

4.1 三种网络模式与IP规划

VMware和VirtualBox都提供三种网络模式,很多人只知道其一,不知道三种模式在什么时候该用哪个,其实这个决定了你能不能顺利访问到虚拟机里的服务。

NAT模式是最省心的选择,宿主机和虚拟机之间通过一个虚拟NAT设备通信,虚拟机能上网,宿主机能访问虚拟机,虚拟机对外不可见。适合绝大多数开发场景。桥接模式则是让虚拟机和宿主机一样,直接在局域网里拿一个真实IP,外部设备也能直接访问虚拟机,适合部署测试服务。仅主机模式则是一个完全隔离的虚拟网络,虚拟机之间和宿主机之间互通,但默认上不了外网。

搞清楚模式之后,修改IP就顺理成章了。Debian系用Netplan的,配置文件写法大概是:

sudo vim /etc/netplan/01-network-manager-all.yaml
network: version: 2 ethernets: ens33: dhcp4: no addresses: - 192.168.100.128/24 routes: - to: default via: 192.168.100.2 nameservers: addresses: - 223.5.5.5

然后执行sudo netplan apply。注意别把网关地址写错,NAT模式下VMware的默认网关通常是192.168.x.2,VirtualBox是10.0.2.2,具体以实际为准。

很多朋友改完IP重启失效,原因往往是在用DHCP的机器上手动改IP,却没有阻止DHCP客户端的覆盖行为。要么在配置里去掉dhcp4,要么直接改成静态地址。

顺便提一句,挂载NAS存储或远程目录也是虚拟机环境里很常见的需求。Linux下用mount.cifs挂载Windows共享:

sudo apt install -y cifs-utils sudo mkdir -p /mnt/nas sudo mount -t cifs //192.168.1.10/share /mnt/nas -o username=dev,uid=1000,gid=1000

这样虚拟机里的开发目录就能和物理机共享,不用每次拷来拷去。

4.2 端口转发与Nginx多站点自定义域名

“本地+虚拟机 多端口Nginx 开发环境多站点自定义域名配置”,这个场景很典型。需求是这样的:你在Windows宿主机上开发,代码跑在虚拟机里的Nginx上,希望通过自定义域名myproject.test来访问,而且虚拟机里有多个站点。

先把主流程拆解一下:

  1. 虚拟机里装好Nginx,配置多个服务站点,监听不同端口或用不同server_name区分;
  2. 设置VMware NAT端口转发,把宿主机端口映射到虚拟机端口;
  3. Windows hosts文件里把域名指向本机地址,实现“免部署”的本地开发体验。

Nginx配置多站点,核心是虚拟主机。假设虚拟机IP是192.168.100.128,站点A监听8081,站点B监听8082:

server { listen 8081; server_name projecta.test; root /var/www/projecta; index index.html index.php; } server { listen 8082; server_name projectb.test; root /var/www/projectb; index index.html index.php; }

然后在VMware的“虚拟网络编辑器”里,选中NAT模式的网卡,点击“NAT设置”,添加端口转发:

宿主机端口虚拟机IP虚拟机端口
8081192.168.100.1288081
8082192.168.100.1288082

最后修改Windows的hosts文件,添加两条记录:

127.0.0.1 projecta.test 127.0.0.1 projectb.test

这样访问projecta.test:8081就会通过宿主机端口转发,把请求送到虚拟机Nginx,再按域名路由到对应站点。整个过程对浏览器是透明的,调起接口和配置代理时非常舒服。

踩过的小坑是:Windows有些程序会劫持hosts,或者浏览器端走系统代理绕过本地解析,导致自定义域名不生效。排查时可以先ping projecta.test,看解析结果是否指向127.0.0.1,再确认浏览器没有开启“绕过本地地址的代理”。

4.3 用虚拟机搭C、Python与Shell开发环境

很多人装完虚拟机,下一步就是配开发环境。这里有一个高效做法:不要APTon软件一个个手动装,直接用构建工具链一把梭。

Ubuntu/Debian系安装基础开发环境的命令:

sudo apt update sudo apt install -y build-essential sudo apt install -y python3 python3-pip python3-venv sudo apt install -y gdb git curl wget vim

build-essential包含gcc、g++、make等编译工具,是C/C++开发的地基。Python这边,不要直接污染系统Python,建议创建虚拟环境:

sudo apt install -y python3-venv mkdir -p ~/projects/myapp cd ~/projects/myapp python3 -m venv venv source venv/bin/activate pip install flask requests

Shell脚本开发不需要刻意装什么,但建议装shellcheck做静态检查:

sudo apt install -y shellcheck

平时写脚本,顶部的 shebang、变量引用加双引号、set -euo pipefail 这几个习惯比任何工具都重要。虚拟机里做开发还有一个好处:你可以在里面随便折腾,配坏了快照回滚,不用像物理机那样小心翼翼。

如果做嵌入式方向,可能还会涉及交叉编译链和USB设备直通,虚拟机的USB过滤器可以指定直通某个USB设备,但宿主机和设备驱动之间可能有冲突,必须注意别让Windows同时抢占设备。

5. 高频问题排查与运维小技巧

5.1 蓝屏与“无法启用虚拟机平台”

我见过最多的报错就是Windows下VMware虚拟机启动蓝屏,以及提示“无法启用虚拟机平台”。这两个问题表面看是不同故障,但实际上经常是同一根源:Windows的虚拟化平台与VMware冲突,或者CPU虚拟化本身没开。

先说CPU虚拟化,前面提过,BIOS里的Intel VT-x或AMD SVM必须开启。任务管理器“性能”页如果显示虚拟化“已禁用”,其他配置再怎么弄都白搭。

再来看Windows自身的冲突。Win10/11会默认启用基于虚拟化的安全功能,比如内核隔离和内存完整性。有些安全软件也会依赖Hyper-V,导致VMware无法使用。遇到VMware启动蓝屏,优先尝试关闭“内存完整性”:

  1. 打开Windows安全中心;
  2. 进入“设备安全性”;
  3. 选择“内核隔离”并关闭“内存完整性”;
  4. 重启后再试。

另一个常见操作是,在“启用或关闭Windows功能”里,把“虚拟机平台”和“Windows虚拟机监控程序平台”取消勾选,重启后看VMware是否恢复正常。如果这两项必须保留,那就可以考虑改用Hyper-V或VirtualBox,不是死磕就一定赢。

还有一类蓝屏源于VMware驱动和Windows更新的不兼容,升级VMware到较新版本基本能解决。一般情况下优先排查虚拟化开关,其次是内核隔离。

5.2 VMware连接失败与虚拟机目录清理

“VMware Workstation 无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用所有配置文件”是很多人会遇到的拦路虎。这个提示的常见原因是VMware Authorization Service服务没起来,或者当前用户对虚拟机目录没有权限。

先在Windows服务管理器里找到VMware Authorization Service,把启动类型设为“自动”,然后手动启动。如果还不行,检查虚拟机所在目录的权限,右键属性里给当前用户添加完整控制权限。很多项目目录放在某个受保护路径下,权限问题会直接导致连接失败。

删除虚拟机目录也是看上去简单、实际上有暗坑的操作。不要直接去文件夹里Shift+Delete,正确的做法是先在VMware里把虚拟机从库中移除,然后选择“从磁盘删除”。如果不经过这一层,残留的.vmdk映射信息和.vmx配置会在控制台报错,或者让你下次新建虚拟机时撞上不可用的文件锁。遇到残留锁文件,找到虚拟机目录下以.lck结尾的文件夹和文件,删掉就行。

5.3 快照克隆与磁盘瘦身

快照功能是虚拟机最值钱的特性之一。安装完系统、打好基础环境之后,打一个快照,后面随便折腾,出了故障直接恢复。

但快照不是说打得越多越好。每个快照都是一组增量文件,快照链越长,虚拟机运行需要回溯的数据越多,性能越差,占用的磁盘空间也会越滚越大。做个实验、确认环境没问题,就可以删掉中间快照,保留一个干净的基础快照就够了。

磁盘瘦身有两个小技巧。一个是在虚拟机关机状态下,用VMware自带的磁盘碎片整理和压缩工具;另一个是Linux内部先做清理,apt autoremove、删除/var/cache/apt/archives下的无用deb包,再关机压缩。顺序一定是先在客户机里删,再去宿主机侧压缩,否则只是把空洞也跟着打包了。

还有一类场景是把虚拟机镜像迁移成U盘启动,很多人想直接拿DiskGenius这类工具把虚拟磁盘转换到物理U盘。这个做法我已经看人踩坑无数次了:虚拟机的磁盘控制器驱动和物理机的不同,引导方式也可能不同,转换完往往无法启动。如果你不是为了应急恢复数据,而是想“把虚拟机变成物理机系统”,大概率会浪费时间。

5.4 外设共享与剪贴板互通

很多人觉得虚拟机隔离性好,但用到外设时又希望两者互通。VMware Tools或VirtualBox增强工具装好以后,剪贴板、拖拽文件都比较顺滑。如果你发现文件夹共享不生效,先检查增强工具是否安装成功,再检查共享目录权限。

USB设备直通也很实用,比如在虚拟机里用OpenOCD连接调试板,或者给虚拟机插U盘去烧录镜像。VMware的USB控制器可以选2.0/3.0兼容,插上设备后弹出“连接虚拟机”即可。但记住,物理机如果正在占用这个设备,虚拟机是抢不过来的,必须先让物理机“断掉”对设备的占用。

6. 分享几个让虚拟机用得更顺手的习惯

走到这一步,你的虚拟机Linux环境已经能跑能用了,但我还是想补充几个实践下来很有用的操作习惯。

第一个习惯是“开机关前确认快照点”。每次要做系统级变更,比如换内核、装大型软件、改网络配置,先确认当前快照还在,或者手动打一个新快照。我吃过亏:调试网络时手滑改了防火墙,结果SSH把自己关在门外,想恢复才发现上次快照是三天前的。从那以后,凡是动关键配置,快照必先打。

第二个习惯是“把虚拟机IP固化下来”。DHCP在NAT模式下分配的IP每次重启都可能变化,对开发环境来说非常痛苦。建议直接改成静态IP,或者到路由器/虚拟网络编辑器里把IP与MAC绑定,这样SSH配置、DNS指向、端口转发都稳定。

第三个习惯是“在虚拟机里也用版本管理”。Git在虚拟机上装好以后,项目代码不要只存在虚拟机本地磁盘,因为虚拟磁盘损坏或误删快照都会造成损失。可以把代码仓库直接放在共享目录里,或者定期推到远程仓库。“虚拟机也是电脑”这句话,归根到底还是数据的鲁棒性问题。

第四个习惯是“善用克隆而不是重复安装”。如果你需要多个Linux环境,比如一个跑数据库、一个跑缓存、一个跑测试,从基础模板克隆是最快的。VMware的克隆可以创建链接克隆,共享基础镜像节省磁盘;完整克隆隔离性好,适合独立测试。两条路都比你重新装三四遍系统省事得多。

还有一个容易被忽略的点:虚拟机里跑图形桌面会吃掉大量内存,如果你的场景不需要图形界面,安装时直接选Server版或安装时不要选桌面组件。工作效率反而更高,也更接近真实服务器的使用体验。

虚拟机折腾到一定程度,你可能会越来越觉得它像一台独立的服务器,只是恰好跑在你的笔记本里。Nginx多站点、SSH远程管理、防火墙规则、快照回滚,这些在实体服务器上要做的事情,在虚拟机里全部能练一遍。把这里当作一个低成本试错场,后面不管换什么环境,心里都有底。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 2:56:00

深度学习驱动的DOA估计:从协方差矩阵到SubspaceNet实践指南

简介:一份基于Python的深度学习波达方向(DOA)估计入门代码包,面向信号处理与深度学习交叉领域的学习者,聚焦窄带信号场景下的方向估计问题。包内共6个文件,全部为Python脚本,涵盖数据准备、信号…

作者头像 李华
网站建设 2026/10/5 2:55:40

图书馆座位预约管理系统:并发抢座防超卖与自动释放设计

简介:这份资源是《图书馆座位预约管理系统》的完整Java项目源码包,面向计算机专业学生、Java初学者及需要课程设计或毕业设计参考的开发者,用于解决图书馆座位资源分配不均、预约流程繁琐等实际问题。压缩包共1668个文件,约35.41M…

作者头像 李华
网站建设 2026/10/5 2:55:20

SpringBoot云宠之家管理系统:从需求拆解到部署完整实践

宠物管理系统这类项目,在毕设和中小型创业项目里一直热度很高,但多数人做出来的东西要么是“套模板的增删改查”,要么是需求堆得太多结果一个模块都没做好。“SpringBoot实现的云宠之家管理系统设计与实现”这个标题我仔细琢磨过,…

作者头像 李华
网站建设 2026/10/5 2:55:18

SpringBoot+Vue教学资源库平台从0到1:表设计、前后端联调与部署全攻略

如果你在CSDN、掘金或者GitHub上搜过“SpringBootVue教学资源库”,能看到一批类似的仓库。这确实是毕设、课设里的常客:技术栈主流、业务边界清晰、开发周期可控,最关键的是素材好找、答辩好讲。但这个项目有个隐蔽的难点——它的功能太多太零…

作者头像 李华
网站建设 2026/10/5 2:55:16

服务器登录日志全解析:从默认记录到异常排查与安全加固

1. 先给结论:服务器不止会记,而且记录得比你想象的细先说个真实经历。上周帮一位朋友排查一台CentOS云服务器,他说收到一条“登录失败”的短信通知,问我要不要紧。我让他把/var/log/secure里那一段拉出来看,结果他愣住…

作者头像 李华
网站建设 2026/10/5 2:55:10

SpringBoot+Vue+MySQL教学资源库管理平台开发实战

最近不少学弟学妹问我,想挑一个适合毕设或课设、又不至于让人半途弃坑的题目,我每次都会推荐自己练手写过的这个 SpringBootVue 教学资源库管理平台。JavaMySQL 的扎实后端组合,配上 Vue 做前端页面,从用户注册登录到资料上传下载…

作者头像 李华