news 2026/10/10 3:20:56

Java毕设音乐网站管理系统:从技术选型到答辩避坑完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java毕设音乐网站管理系统:从技术选型到答辩避坑完整指南

每年到毕业季,就会有一堆人对着选题表发愁。作为带过不少毕业生项目的开发者,我收到最多的私信就是"Java毕设做什么题目好"、"音乐网站管理系统能不能做"、"拿到源码怎么跑起来"。说实话,音乐网站管理系统这个题,从教学价值和答辩友好度来说,都是一个非常稳妥的选择——它不偏门、技术栈正统、功能可深可浅,特别适合用来展示Java Web开发的基本功。

这篇文章我会以这个项目为线索,把从技术选型、数据库设计、核心功能实现,到调试运行排坑、论文答辩准备的完整链路都拆开讲一遍。如果你正准备做这个题,或者刚拿到一套源码不知道怎么下手,这篇文章可以帮你少走很多弯路。

1. 项目定位与技术选型:为什么这个题目值得做

1.1 需求拆解:一个音乐网站到底要做什么

做项目之前,先把需求弄清楚是最关键的。很多同学拿到这个题目就直接开写,结果做着做着发现要么功能堆砌过度,要么核心模块单薄得撑不起一篇论文。我用实际经验帮你把需求收敛成两个端、八个核心模块。

前台用户端要解决的问题很直白:用户怎么找歌、听歌、管理自己的歌单。所以得有用户注册登录、歌曲列表展示、歌曲搜索、播放器、歌单创建与收藏、评论互动这些基础能力。后台管理端则是给管理员用的,核心是歌曲信息管理、歌手管理、用户管理、歌单管理,以及统计和权限控制。

千万别小看这个看起来"普通"的功能清单。每个模块背后都有对应的技术考点:文件上传对应MultipartFile处理,歌曲播放对应HTTP流式传输,搜索对应SQL查询优化,歌单对应多表关联查询。整个做下来,Java Web的主流知识点基本都能覆盖到,这才是毕设该有的深度。

1.2 技术栈选择的底层逻辑

不少同学会纠结技术栈用什么,这里我直接给一个经过大量验证的组合方案。

后端用Spring Boot + MyBatis(或者MyBatis Plus),数据库用MySQL,前端可以是BootStrap + Thymeleaf的传统方案,也可以是Vue前后端分离方案。我在实际指导中倾向于推荐前者给基础一般的同学——同一套Spring Boot代码里就能完成页面渲染,部署链路短,调试成本低,论文里写起来也顺。基础好一些的同学再考虑前后端分离,但注意要把跨域、Token鉴权这些额外复杂度考虑进去。

为什么不建议用传统的SSH(Struts + Spring + Hibernate)?不是不能用,而是这套东西在企业里已经很难见到新项目了。毕设虽然不强制要求前沿技术,但用一门过时到没人用的框架组合,答辩时被问到"为什么选这个"会很被动。Spring Boot + MyBatis是目前Java后端最主流、资料最丰富、遇到问题最好查的技术栈,踩坑成本最低。

前端选择上还有个小建议:不要花太多时间在页面上写花里胡哨的特效。毕设评分看的是功能的完整性和技术的合理性,不是UI有多炫。一个干净、响应正常的页面就足够支撑你了。

2. 数据库设计与核心表结构

2.1 从实体关系开始思考

数据库设计往往是最先暴露问题的地方。很多人上来就建表,建到一半发现表和表之间对不上,又推倒重来。我一般在设计之前先做一件事:梳理实体和它们之间的关系。

音乐网站的核心实体大概是这些:用户(User)、歌手(Singer)、歌曲(Song)、歌单(SongList)、评论(Comment)。实体之间的关系要注意:用户和歌单是一对多,歌单和歌曲是多对多(一个歌单能有几十首歌,一首歌能被收藏进多个歌单),用户和歌曲之间还有收藏关系。如果做成表,多对多关系就需要一张中间表来承接。

如果已经有现成源码了,拿到手之后第一步也应该是打开数据库看表结构,而不是先去看代码。表结构看懂了,整个项目的业务逻辑就懂了一半。

2.2 核心表的字段设计

我给出一个实际项目里验证过的核心表结构参考。

用户表(user)核心字段包括:id、username、password(记得要加密存储,推荐MD5加盐或者BCrypt)、nickname、avatar、gender、phone、email、create_time。

歌手表(singer)核心字段:id、name、introduction(歌手简介,TEXT类型)、avatar、create_time。

歌曲表(song)是整个系统的核心,字段要重点设计:

字段名类型说明
idbigint主键自增
singer_idbigint关联歌手表
namevarchar(100)歌曲名
albumvarchar(100)所属专辑
durationint时长(秒)
picvarchar(255)封面图片路径
urlvarchar(255)歌曲文件路径
lyrictext歌词文本
create_timedatetime入库时间

歌单表(song_list)字段:id、title、introduction、pic、style(歌单分类:华语/民谣/电子等)。

中间表(song_list_song)字段:id、song_list_id、song_id。这张表就是前面说的多对多承接表,没有它歌单功能根本无法实现。

评论表(comment_content)字段:id、user_id、song_id、content、create_time。

这里有一个很多新手都会犯的错误:把图片或者音频直接存成BLOB塞进数据库。这么做理论上可以,但实际项目中千万别用。文件一大,数据库就变成了一坨膨胀缓慢的东西,备份、迁移全都受牵连。正确做法是文件存服务器磁盘,数据库里只存文件访问路径,对外通过URL访问。

选字段类型也有讲究。名称类字段用varchar就够了,给够余量;简介、歌词这种长文本用TEXT;时间统一用datetime;状态字段用tinyint,比如0表示未删除、1表示已删除,做逻辑删除而不是物理删除——因为你做前台展示的时候,逻辑删除可以安全地把数据遮掉而不影响历史关联。

2.3 建表SQL与索引设计

建表SQL直接决定后面整个项目的运行效率。我贴一段核心的歌曲表建表语句,建表时能直接参考:

CREATE TABLE `song` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `singer_id` bigint(20) DEFAULT NULL COMMENT '歌手id', `name` varchar(100) NOT NULL COMMENT '歌名', `album` varchar(100) DEFAULT NULL COMMENT '专辑', `duration` int(11) DEFAULT NULL COMMENT '时长(秒)', `pic` varchar(255) DEFAULT NULL COMMENT '封面图', `url` varchar(255) DEFAULT NULL COMMENT '歌曲文件', `lyric` text COMMENT '歌词', `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_singer_id` (`singer_id`), KEY `idx_name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

索引设计有一条简单的原则:WHERE子句里频繁用到的字段就加索引。比如用户登录要用username,那user表就要给username建唯一索引。歌曲查询经常按歌手过滤,所以singer_id加普通索引。LIKE '%关键词%'这种模糊查询是走不了索引的,等后面聊搜索模块再细说。

字符集这里注意一下,建表的时候一定要用utf8mb4而不是utf8。utf8在MySQL里表示的是utf8mb3,只能存3字节的字符,遇到生僻字或者emoji就会报错或者写进去乱码。音乐网站歌曲名里出现特殊字符的情况很常见,直接用utf8mb4省心。

3. 核心功能模块的实现细节

3.1 音频文件上传:禁忌和推荐做法

文件上传是音乐网站管理端最高频的操作。很多毕设项目挂就挂在文件上传这个看似简单的模块上。

后端接收文件用Spring MVC的MultipartFile接口。基础配置在application.yml里这样写:

spring: servlet: multipart: max-file-size: 50MB max-request-size: 50MB

按这个配置,单文件最大能传50MB。不要觉得这个值设得太大——一首标准音质的MP3可能就到10MB了,如果用户上传无损格式,50MB都未必够。但也要有个上限,不然会被人恶意传大文件把磁盘写满。

文件存储的目录不要用项目内的相对路径。很多教程会教你存到/static/music下面,这在本地跑没问题,但打成jar包部署后,项目内路径往往是只读的,写入会直接报错。我实际项目里用的是系统绝对路径,比如Linux下的/var/file/music,Windows下的D:/music-file/,然后在配置类里做一个静态资源映射把外部目录暴露出去。

做映射的时候,直接在你的WebMvcConfigurer适配器里加一段:

@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/music/**") .addResourceHandler("/img/**") .addResourcePath("file:D:/music-file/"); }

这样浏览器访问/music/xxx.mp3就能直接读到磁盘上的文件了。实测下来这个方案在本地和服务器上都稳定,不会出现打包后文件丢失的问题。

文件名的处理也是容易踩坑的地方:不要直接用用户上传的原始文件名。原因一是中文文件名在部分环境下会出现URL编码问题,二是文件名可能带路径穿越字符。稳妥的做法是取一个UUID或时间戳拼接上原始文件的后缀名,存进数据库的是这个新文件名。

3.2 流式播放背后的HTTP Range机制

音乐网站和普通CRUD项目最大的区别,就是播放器这一块。一个表面看起来只是"点击播放"的功能,后端如果不做支持,播放体验会很差。

音频播放的专业做法是支持HTTP Range请求。简单说,浏览器播放MP3时,会向服务器发送一个带有Range: bytes=0-的请求,表示"我要从第0字节开始读取这个文件"。服务器收到后应该返回206 Partial Content状态码,并且告诉浏览器这个文件总共多大、从哪里开始返回。有了这个机制,浏览器就能做到拖动进度条播放、倍速播放、甚至从任意位置开始播放——因为前端可以随时向服务器请求文件的某一段字节。

Spring Boot其实不需要你手写这个逻辑,因为Spring MVC的ResourceHttpRequestHandler本身就支持Range。但有个前提:你必须用Resource的方式去返回文件。常见的错误是有人用ResponseEntity<byte[]>把整个文件一次性读进内存返回,那样Range请求会失效,而且大文件情况下内存直接被打爆。

所以播放接口比较稳的写法是这样的:

@GetMapping("/song/play/{id}") public ResponseEntity<Resource> play(@PathVariable Long id) { Song song = songService.findById(id); // song.getUrl() 取到的是磁盘上的文件路径 Resource resource = new FileSystemResource(song.getUrl()); return ResponseEntity.ok() .contentType(MediaType.parseMediaType("audio/mpeg")) .body(resource); }

这样返回的是资源句柄而不是文件内容本身,真正发送数据时由框架处理Range逻辑,浏览器就能正常拖进度条了。我遇到过不少同学把接口写成了流式整体返回,然后前端播不了几秒就卡死,就是这里出了问题。

3.3 封面图处理与音频信息读取

热词里有"java获取mp3封面图代码",这个需求在音乐网站里确实会出现:管理端上传歌曲时,不想让管理员手动填封面,最好能自动从MP3文件里把封面提取出来。

读取MP3封面有现成方案。Metadata类来自一个叫metadata-extractor的库,但它主要处理图片;音频这块更常用的是jaudiotagger这个库,它能读取MP3的ID3信息,包括标题、歌手、专辑、时长,还有内嵌封面图。

用jaudiotagger可以这样提取封面:

AudioFile audioFile = AudioFileIO.read(new File(songPath)); Tag tag = audioFile.getTag(); Artwork artwork = tag.getFirstArtwork(); if (artwork != null) { byte[] imageData = artwork.getBinaryData(); // 将imageData写入到本地文件,得到封面图片 }

这个方法能解决批量导入时的封面问题。但要注意,不是所有MP3文件都内嵌封面,有的歌提取出来是空的,所以界面上还是要留手动上传封面的兜底入口。

如果不引入这个库,还有一个备选方案:从歌曲文件所在目录找同名图片文件,或者退而求其次用默认封面。对毕设来说,自动提取是个加分项,但做不出来也完全不影响核心功能,可以把精力优先放在播放和搜索这些主流程上。

3.4 搜索与分页的正确姿势

音乐网站的搜索是最容易被问"性能问题"的模块。很多人上来就写:

SELECT * FROM song WHERE name LIKE '%关键词%'

这个写法在数据量几百条的时候没问题,但只要数据量上来,%关键词%这种写法因为无法走索引,全表扫描就会拖垮性能。对毕设来说这不是致命问题,但答辩时如果老师问一句"你这个搜索性能怎么样",答不好容易扣分。

提升搜索能力有几条路,按成本从低到高排列:

  • 加全文索引,MySQL 5.7以上版本InnoDB支持中文全文索引,配合ngram分词器可以用MATCH...AGAINST实现全文检索。
  • 引入Elasticsearch,这个对毕设来说成本偏高贵,非必要不推荐。
  • 退而求其次,对歌手和歌名做组合筛选,尽量缩小结果集。

分页的实现比较直接。如果你用MyBatis,护着PageHelper;用MyBatis Plus的话,自带Page对象。前端只需要传页码和每页条数,后端返回总记录数和当页数据列表就行。分页是必做项,没有分页的列表页,数据量一多页面会卡到没法看。

3.5 用户鉴权与权限控制

管理端的接口不能裸奔,至少要有个简单的登录鉴权。最基础的做法是用Session或者Token。

Session方案的传统逻辑是:用户登录成功后把用户对象放进Session,写一个拦截器(HandlerInterceptor),在进入需要登录的接口前检查Session里有没有用户信息,没有就重定向到登录页。这个方案简单可靠,毕设完全够用,而且面试时讲得清楚。

如果做前后端分离,就要用Token方案:登录成功返回一个Token(可以用JWT,也可以自己生成UUID存Redis),前端在请求头里带上Authorization: Token,后端用一个过滤器统一校验。这个方案看着洋气,但工作量多不少,还要处理Token过期和刷新,没把握的话不建议硬上。

管理端和用户端的权限要分开。管理员接口要校验角色,普通用户接口只校验登录状态。角色字段可以放在用户表里,用一个小整数表示:0是普通用户,1是管理员。拦截器里做角色判断时,取到用户信息后看一眼角色值就能决定放不放行。

4. 实操全流程:从源码到调试运行

4.1 环境准备和版本对应关系

不管你是自己写还是拿到一套现成的源码,环境这一关是绕不过去的。我见过太多示例项目跑不起来的案例,十个有八个是版本不匹配。

特别要记住几个版本配套关系:JDK 8能跑Spring Boot 2.x,Spring Boot 3.x要求JDK 17以上,MyBatis Plus有专门适配Spring Boot 3的版本。如果你的电脑装了好几个JDK,启动时就要注意IDE里项目用的到底是哪个。

Maven的镜像源建议配一下阿里云镜像,不然第一次下载依赖能等半个小时。修改Maven的settings.xml,把中央仓库地址换成阿里云镜像就能快速解决依赖下载慢的问题。

MySQL这块,统一用8.0以上版本,驱动在pom.xml里对应加mysql-connector-j这个坐标。JDBC连接串里useSSL=false和serverTimezone=Asia/Shanghai这两个参数建议配上,前者避免SSL握手警告,后者解决时区偏差导致的日期时间错乱。

4.2 从源码到运行三步走

有源码之后的启动过程,说穿了就是三步:建库、改配置、启动。但每一步都有细节。

第一步建库建表:你要么导入项目里自带的sql文件,要么手动执行建库脚本。导入时注意先看SQL文件里的CREATE DATABASE用的什么字符集,如果不是utf8mb4就改成utf8mb4。导入完成后,用USE选中目标数据库,执行SHOW TABLES;确认所有表都进来了,别漏了中间表。

第二步改配置:打开application.yml,把数据库地址、用户名、密码改成你自己本机的。这三项是启动失败的重灾区,尤其是密码里带特殊字符比如@、#的,在YAML文件里要加引号包起来,不然会被当成注释或者语法错误处理。

第三步启动:IDE里直接运行主类上的main方法。观察控制台日志,看到Started Application in xxx seconds就说明启动成功了。如果报错,优先看第一行异常信息,而不是滚动了几千行的堆栈。什么端口被占用、数据库连不上,异常信息里都会直接写明。

4.3 前后端联调时的三个拦路虎

前后端联调是调试运行过程中耗时最长的阶段。这三个问题几乎每个项目都会碰到。

第一个是跨域。前端跑在8080,后端跑在8081,浏览器就会拦截跨域请求。解决办法是后端加CORS配置,一个简单的@CrossOrigin注解不够全面,稳妥做法是写一个配置类统一处理,允许指定前端的来源地址和常用请求方法。

第二个是静态资源404。比如前端传的图片路径是/img/xxx.jpg,但后端映射的路径是/image/xxx.jpg,图片就会裂掉。这种问题不是代码逻辑错,是路径对不上。排查方法:打开浏览器Network面板,看图片请求的完整URL,然后检查后端的资源映射配置,对齐即可。

第三个是请求参数格式对不上。前端传的是JSON字符串,后端用表单对象接,就会收到一堆null值。统一的解决办法是约定好沟通格式:后端接口如果是@RequestBody就接收JSON,如果是普通的POST表单就用@RequestParam——两边要一致,这个约定在写接口文档的时候就要明确。

5. 常见问题与毕设避坑实录

5.1 高频运行报错速查表

这一节我把带项目过程中出现频率最高的几个问题整理成一张速查表,遇到直接对号入座。从实践经验来看,这些问题解决了,项目基本就能顺利跑完整个演示流程。

报错或现象常见原因排查与解决
Port 8080 was already in use端口被其他进程占用换端口,或者在命令行用netstat -ano找到占用进程并结束
Access denied for user 'root'@'localhost'数据库密码不对检查yml配置的密码,注意yml里特殊字符要加引号
Unknown database 'xxx'数据库没建或者库名不一致执行建库SQL,核对配置里的库名大小写
java.io.FileNotFoundException上传文件的目录不存在启动代码里用File.mkdirs()自动创建目录
中文乱码字符集不一致数据库连接串加characterEncoding=utf8,确认表字符集是utf8mb4
歌曲播放不了文件路径或Range支持问题确认是否是绝对路径,确认接口返回了正确的Content-Type,打开Network看请求返回什么

有一次我遇到一个同学的项目,播放接口明明路径没问题,但播放就是卡住。排查了一圈后发现是前端用了audio标签的src直接指向后端地址,但接口需要带登录Token,前端没带,请求直接被拦截器挡掉了,返回401。返回的不是音频流,播放器自然就停在那里。这类问题在联调时要优先怀疑鉴权拦截器——它拦截的范围和放行的路径一旦配置不好,就会误伤公开资源。

5.2 毕设答辩的加分经验和减分雷区

技术做得再好,答辩讲不清楚照样拿不到高分。我陪学生模拟答辩时总结出几个印象深刻的规律。

一定要画清楚三张图:用例图、E-R图、系统架构图。用例图展示系统有哪些角色、每个角色能干什么,这是老师第一眼要看的;E-R图展示数据库实体关系,设计得好不好、中间表有没有遗漏,这张图一眼就能看出来;系统架构图展示请求怎么进来、经过哪些层、最后落到哪里,讲清楚了老师就知道你理解系统的全貌。

演示前的准备比做项目还重要。提前写好演示脚本,把操作步骤固化下来,避免现场慌乱不知道点什么。演示时按用户登录、浏览歌曲、播放歌曲、搜索、加歌单、评论、管理员登录、上传歌曲这条主线走,每步之间想好讲什么,控制在8到10分钟。

答辩提问的常规问题其实就那几样:项目用了什么技术栈、每个功能怎么实现的、数据库表为什么这么设计、遇到的最难的问题是什么怎么解决的。提前对着镜子或找同学演练一遍,回答流畅自然,比背稿子效果强得多。

还有几个减分雷区千万别踩:项目里出现没有关联的僵尸表;点击一个按钮毫无反馈(至少要有页面跳转或提示);代码出现整段注释掉的死代码;论文里的图表和实现的功能对不上号。这些都是答辩现场最容易暴露又最不该犯的错。

5.3 给拿到源码的你的上手顺序建议

如果你不是从零开发,而是拿到了一套现成的音乐网站源码,我给你一个实测高效的上手顺序,按这个顺序走,三天之内就能从"看不懂"变成"讲得出"。

第一步通读数据库设计,把每个表的用途和表间关系弄清楚,在纸上画一遍E-R图。这一步大概花半天,但效果是最值的。

第二步跑通项目,把自己的环境整利索,确保前后台功能和演示流程能完整走一遍。

第三步看核心代码,优先级是:登录鉴权相关代码、歌曲上传下载播放相关代码、歌单收藏相关代码、搜索分页相关代码。这四个模块看懂了,整个项目的技术水平你就能说得滔滔不绝。

第四步改一点自己的东西,不要原样照交。哪怕只是加了一个热门歌曲排行功能、修改了某个页面布局、增加了一种登录方式,答辩时讲"这个功能是我自己加的"就会主动很多,也规避了查重和雷同的风险。

根据我个人的经验,加一个"播放次数统计"功能是性价比很高的选择:改动量不大,就一张表加个字段、播放接口里更新一下计数、首页按播放量取前十条,但讲出来很有说服力,因为它是从"用户立场"出发的真实需求。

6. 项目完成后还能往哪里走

项目做到这一步,其实已经具备一个完整毕设的全部要素了。如果还有余力,有几个扩展方向供你参考。

一个是把单机文件存储换成云存储。把上传的歌曲和封面都放到对象存储上,数据库里改成存的URL。这个改动涉及上传逻辑和静态资源配置,技术含量适中,但讲出来很有时代感。另一个是引入Redis给热门歌曲加缓存,把播放次数、热门榜这类高频读数据放到缓存里,能讲清楚缓存穿透和缓存击穿就加分了。还有一个是给个人歌单加"每日推荐",用简单的行为统计就能搞一个简化版推荐系统,这个方向在答辩时如果老师感兴趣,你就能引出协同过滤的话题,展示自己的学习深度。

我在实际做一个毕设项目的过程中最深的体会是:一个项目值不值得做,不在于功能有多花哨,而在于你能不能把它讲成一个逻辑自洽、细节扎实、经得起追问的故事。音乐网站管理系统这套题目,恰好提供了一个足够大又足够具体的舞台,让你把Java后端开发的基本功系统性展示一遍。把上面这些环节一步步走完,你就已经拿到了毕设项目中最难搞定的那部分经验。

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

基于PCA9422与STM32L432KC的完整电源管理设计实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/10 3:19:30

SpringBoot+Vue社区生鲜团购系统:课程设计全流程解析

1. 项目整体设计与思路拆解1.1 这个平台到底在解决什么问题做课程设计或者毕业设计&#xff0c;最怕的就是选一个"看着高大上&#xff0c;落地全是坑"的题目。社区生鲜团购这个方向&#xff0c;是我见过性价比极高的一类选题&#xff1a;业务逻辑足够清晰&#xff0c…

作者头像 李华
网站建设 2026/10/10 3:18:53

OpenCV轮廓提取实战:从二值化到物体计数与测量

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/10 3:18:40

YOLOv8+重心算法:铁路货运偏载识别从0到1完整方案

简介&#xff1a;一套面向计算机视觉方向毕业设计与课程设计的完整方案&#xff1a;基于YOLOv8的铁路货运车厢货物偏载识别系统。项目将目标检测技术应用于铁路货运场景&#xff0c;可直接识别车厢货物偏载情况&#xff0c;适合作为毕设核心成果或课设进阶演示&#xff1b;资源…

作者头像 李华
网站建设 2026/10/10 3:16:47

AI辅助论文写作全流程指南:从选题到降重按场景选对工具

经常有同学问我&#xff1a;2026年了&#xff0c;到底哪个AI工具写论文最靠谱&#xff1f;这个问题其实问错了。真正该问的是——你处在论文的哪个阶段&#xff0c;该用什么工具、用它的哪个功能。深度学习这行做久了就会明白&#xff0c;没有万能模型&#xff0c;到了论文写作…

作者头像 李华
网站建设 2026/10/10 3:15:19

PCA9422与MKV44F64VLH16组合:嵌入式电源管理系统设计与调试实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华