SpringBoot+Vue前后端分离管理系统开发实战:从架构到部署

平时接私活或者在公司做内部系统,我最怕遇到一种需求:业务方上来就说要一套“完整的管理系统”,功能要全、界面要好看、还要能快速部署。你要是真从零开始搭,光权限、菜单、日志这些基础模块就够你熬几个通宵。最近刚好整理了一套基于SpringBoot + Vue的党员学习交流平台管理系统,前后端分离,数据库用的是MySQL,持久层框架选了MyBatis,整套源码已经跑通,正好拿出来把设计思路和踩过的坑一次说清楚。

这套系统不是那种花架子Demo,它把组织内部的学习管理、资料库、学时统计、考试测评、交流互动都串起来了。如果你是做Java后端开发、准备写毕业设计、或者公司里刚好需要一套内部培训学习平台做二次开发,这篇文章应该能帮你省掉大量调研时间。我尽量把核心模块的设计逻辑、数据库表结构、关键代码写法、还有联调过程中容易翻车的细节都交代明白。

1. 项目整体设计与架构思路

1.1 需求画像:这个平台到底要管什么

很多同学拿到类似题目第一反应是“不就是CRUD吗”,但如果真按这个思路去做,做到一半就会发现各种别扭。所谓的“党员学习交流平台”,本质是一个面向组织内部成员的垂直领域学习管理系统,它和通用教育平台的最大区别在于:有明确的层级组织关系、有学时学分这种刚性考核指标、有资料审核流程,还有一个比较特殊的“学习档案”概念——每个成员的学习轨迹需要长期留存,不能像普通视频网站那样看完就完了。

我当时把核心需求拆成了四块:

  • 学习资源管理:管理员上传学习资料,可以是文档、视频链接或图文内容,普通成员在线浏览学习。注意,很多内部系统不允许随意上传,必须走“管理员审核”流程。
  • 学习过程记录:成员点开资料、阅读时长、完成状态、获得的学时数,都需要自动记录,并且支持按组织架构汇总统计。
  • 考试测评模块:学完不能白学,得有验证环节。支持单选题、多选题、判断题,自动判分,成绩留档。
  • 交流互动:类似轻量论坛,成员可以发帖提问、回复讨论,管理员负责审核和置顶。

这四个模块是横向功能,纵向还要贯穿一条组织架构线——平台要能按支部、小组查看学习数据。这套需求如果理解了,整个系统的主干就清楚了,剩下的菜单管理、用户管理、日志管理都是标准配置。

1.2 技术选型背后的实际考量

为什么选SpringBoot + Vue这套组合,而不是更重的Spring Cloud或者更轻的Layui?我的理由很简单:性价比。

后端用SpringBoot,是因为它天生适合这种单体管理系统——不需要微服务那套复杂治理,但又希望享受Spring生态的成熟组件。用SpringBoot 2.x版本,搭配MyBatis,数据库访问层足够灵活。为什么不用MyBatis-Plus?当时考虑的是,这个项目里有很多自定义的多表关联查询和动态SQL,原生MyBatis写起来更透明,虽然代码量稍微多一点,但排查问题一目了然。对学习者来说,用原生MyBatis也能把SQL基本功练扎实。

前端选Vue,配合Element UI组件库。Vue的响应式数据和组件化开发,在管理后台这种表单密集、表格密集的场景下,开发效率比传统的jQuery高一个量级。Element UI虽然现在官方维护降速了,但它的表单校验、表格分页、树形控件都是现成的,正好覆盖后台管理90%的界面需求。

数据库没有悬念,MySQL 5.7以上版本。存储引擎统一InnoDB,字符集utf8mb4——这个千万注意,之前有人用utf8导致生僻字和表情符号入库报错。MySQL在这个体量下完全够用,而且部署简单,个人电脑就能跑。

1.3 前后端分离的模块规划

代码层面,我按“[前端仓库 + 后端仓库]”的方式管理。前端结构相对固定:src/api放接口请求,src/views放页面组件,src/router配置路由,src/store管理登录态和用户信息。后端则严格按三层架构组织:

  • controller层:只做参数接收、参数校验、结果封装,不写业务逻辑。
  • service层:业务逻辑的核心,事务边界也都定义在service层。
  • mapper层:对应MyBatis的接口,SQL写在XML文件里。

模块规划上没有搞复杂的微服务拆封,而是用“包名分模块”:system模块管用户、角色、菜单,study模块管学习资源和学习记录,exam模块管考试,community模块管交流互动。每个模块内部再按controller/service/mapper分包。这样拆分的好处是,后期加功能不用动到老代码,新模块往旁边一放就行。

2. 核心功能模块与数据库设计

2.1 权限体系:三种角色的数据隔离方案

管理系统最忌讳“一次登录走天下”,尤其是这种内部平台,不能让普通成员看到管理菜单。我设计了三套角色:超级管理员、支部管理员、普通成员。

权限模型沿用经典的RBAC(基于角色的访问控制),一共五张表:用户表、角色表、菜单表、用户角色关联表、角色菜单关联表。菜单表做成了树形结构,父菜单和子菜单通过parent_id关联。前端拿到当前用户的菜单权限后动态生成路由,后端在接口层面也用拦截器二次校验,前端隐藏菜单只是视觉上的,后端接口鉴权才是安全保障。

这里有一个容易忽略的细节:数据权限。比如支部管理员登录后,只能看到自己所在支部的成员列表和学习数据,不能越权看其他支部。这个我没有用复杂的MyBatis拦截器去实现,而是在SQL查询时通过参数强制加上组织过滤条件。具体做法是:在用户表里冗余一个branch_id字段,业务查询统一走Service层,由Service层从当前登录用户上下文里取出branch_id,再传给Mapper。从安全角度看,这比在SQL里拼条件更可控。

2.2 数据库表结构设计要点

我把核心表设计成下面这些,建议有需要的同学直接对照参考:

表名用途关键字段
sys_user用户表id, username, password, real_name, branch_id, role_id
sys_role角色表id, role_name, role_code
sys_menu菜单表id, parent_id, menu_name, path, component
study_resource学习资料表id, title, type, content_url, status, create_by
study_record学习记录表id, user_id, resource_id, study_duration, finish_status, study_date
exam_paper试卷表id, title, duration, total_score
exam_question题目表id, paper_id, question_type, content, option_a/b/c/d, answer, score
exam_record考试记录表id, user_id, paper_id, score, submit_time
community_topic交流帖子表id, title, content, user_id, status, create_time
community_reply回复表id, topic_id, user_id, content, create_time

有两点需要特别叮嘱:一是所有业务表我都加了create_time和update_time两个字段,审核需求和数据追溯全靠它们;二是表名统一前缀,字段名统一小写下划线风格,这样MyBatis开启mapUnderscoreToCamelCase后,数据库字段和Java属性能自动映射,省掉大量手动别名。

2.3 学习进度与学时统计的核心表关系

学习记录表是整个系统的“账本”。我设计study_record时没有把阅读时长和完成状态放在同一张表里简单了事,而是做了更细的拆分逻辑:主表记录“哪个人、学了哪个资源、最近一次学到哪、完成没有”,同时记录每次学习的时长明细。严格来说,应该加一张study_record_detail表,但实际开发中为了控制复杂度,我用一个整型字段study_duration累加秒数,配合update_time字段,就能算出“最近7天总学时”。

学时统计这个需求,开发时最容易踩坑的是去重。举例:同一份资料,用户分三天看了三次,每次20分钟,如果分别记三次记录,统计报表里总时长会虚高。我当时在代码里做了约束:同一个用户对同一个资源只有一条记录,每次学习调用接口时后端做时间累加,而不是新建记录。这样查询“某用户的总学时”就变成了简单的求和SQL。

3. 实战环节:从零搭建到联调的关键路径

3.1 后端项目骨架与分层规范

我习惯用Maven管理后端工程,Java版本选1.8,SpringBoot版本选2.3.x或2.5.x,这两个版本之间差异不大,选自己熟悉的即可。工程创建时直接引入spring-boot-starter-web、mybatis-spring-boot-starter、mysql-connector-java、lombok这几个核心依赖就够跑通主线了。

统一返回结构是一开始就要定好的规范。我用了Result<T>类,包含code、message、data三个字段。接口返回时,成功就是Result.success(data),失败就是Result.error(code, msg)。这个结构虽然简单,但能避免前后端撕逼——前端Axios拦截器统一判断code,不是预期的200就直接弹错误提示,不用每个页面单独处理错误逻辑。

还有一个细节是全局异常处理。我在工程里加了@RestControllerAdvice,捕获业务异常、参数校验异常、兜底异常三类,分别封装成统一格式。之前没做这个时,数据库字段超长报错直接返回一个500状态码加一大串堆栈给前端,非常不专业。用全局异常处理后,前端拿到的永远是{"code":500,"message":"服务异常,请稍后重试"}这样干干净净的JSON。

3.2 MyBatis映射与动态SQL的典型写法

MyBatis最实用的功能就是动态SQL,学习资料列表那种带筛选条件的查询是典型的应用场景。需求是这样的:列表页上方有“标题模糊搜索、类型下拉筛选、状态筛选”三个条件,用户可能填也可能不填,用动态SQL拼条件最合适。我在Mapper XML里这样写:

<select id="selectResourceList" resultType="com.example.entity.StudyResource"> SELECT id, title, type, status, create_time FROM study_resource <where> <if test="title != null and title != ''"> AND title LIKE CONCAT('%', #{title}, '%') </if> <if test="type != null and type != ''"> AND type = #{type} </if> <if test="status != null"> AND status = #{status} </if> </where> ORDER BY create_time DESC </select>

<where>标签会自动处理第一个条件前面的AND,这个比手动拼接省心得多。分页方面,我引入了PageHelper插件,一行PageHelper.startPage(pageNum, pageSize)跟在查询语句前面就行,不需要手写LIMIT。注意一个坑:PageHelper只对紧跟着的第一条查询生效,如果你在查询前额外执行了其他SQL,分页就会失效。

3.3 JWT登录认证与前端路由守卫

登录模块用的是JWT,实现起来不复杂:用户输入账号密码,后端校验通过后生成一个token,里面存用户ID和过期时间,前端把token存进localStorage,每次请求在请求头加Authorization: token。后端用一个拦截器解析token、获取当前登录用户ID,然后存入ThreadLocal。

这里有个安全细节容易忽略:token过期处理。我建议把过期时间设置为2小时,前端Axios配置响应拦截器,当后端返回401状态码时,自动跳转登录页并清除本地token。如果设置太长,用户账号风险高;太短,用户频繁被踢下线。2小时对内部学习平台来说是个比较合理的值。

前端路由守卫用Vue Router的beforeEach钩子。核心逻辑是:白名单列表(登录页、404页)不拦截,非白名单判断有没有token,没有就重定向登录页。另外一个进阶操作是,登录之后从后端拉取当前用户的菜单权限,用addRoutes动态注册路由,实现“不同角色看到不同菜单”。

3.4 文件上传与学习资料管理

学习资料的类型主要分两种:一种是在线文档内容,直接以富文本形式存数据库;另一种是文件/视频,需要上传到服务器。文件上传我用的方案是本地磁盘存储——在配置文件里指定一个upload.path,然后用UUID重命名文件,防止文件名冲突。上传成功后,把文件的相对路径存进study_resource.content_url字段,前端通过nginx或者后端的静态资源映射来访问这个文件。

需要注意,上传接口只做文件接收和存储,审核状态和资料元信息由另一个管理接口处理。也就是说,上传动作和管理动作分离——先传文件拿到URL,再提交表单把标题、类型、URL一起交给后端审核。这么做的好处是,即使用户中途放弃填写信息,已经上传的文件也不会丢失,管理员还能在后台看到无主文件并清理。

文件大小限制的默认值是1MB,上传视频或PPT很容易超限,需要在application.yml里调大:

spring: servlet: multipart: max-file-size: 200MB max-request-size: 220MB

同时在前端的Axios请求超时时间也要相应改大,否则大文件上传时请求10秒就被断开了。

4. 常见问题与排查技巧实录

4.1 Long型主键传回前端后精度丢失

这是我每次做前后端分离项目都要强调一遍的坑。后端的主键是Long类型,比如userId: 13812345678901234567,JavaScript的Number类型能安全表达的最大整数是2^53-1,超出这个范围后会丢失精度,导致后几位数字变成0。你查完日志发现数据库里明明有这条数据,但前端用这个ID去查详情就死活查不到——因为传到后端的ID已经变了。

解决方案有两种:一是在后端把Long类型字段序列化为String,Jackson提供了@JsonSerialize(using = ToStringSerializer.class)注解;二是在前端刷新一下页面,ID对了就继续操作。我当时为了让小组成员少踩坑,项目里定义了一个全局Jackson配置,把Long和long都统一序列化为字符串。这个方案一劳永逸,推荐优先做。

4.2 树形结构的“递归陷阱”与性能优化

组织架构在页面上要展示成树形下拉框,最初的方案是用递归查询数据库——每次点击展开一个节点就查询一次子节点,结果加载速度还可以,但数据库被频繁查询,高峰期会出现卡顿。后来改成一次性查出全部组织数据,在内存里组装树结构。组装的核心逻辑是:

  • 把全部节点按id存进Map
  • 遍历每个节点,根据它的parentId找到父节点
  • 把当前节点加入父节点的children列表
  • 根节点就是parentId为0的节点集合

这样只需要查询一次MySQL,时间复杂度O(n),比递归查询好几条SQL效率高多了。树节点数量在几百上千这个量级时,内存组装完全够用,不需要上什么专门的树存储方案。

4.3 跨域问题与联调时的环境配置

前端跑在8080端口,后端跑在9090端口,打开前端页面一调用接口就报CORS跨域错误。解决办法是后端加一个CORS配置类,允许指定的前端地址跨域访问;或者在后端application.yml里配置调试专用的跨域放行。

更推荐的做法是,联调环境用nginx反向代理,通过/api/前缀把请求转发到后端服务,前端页面相对路径请求,这样在浏览器层面就没有跨域问题了。部署上线时,前端构建产物放在nginx的静态目录,后端跑在独立的Java进程里,nginx配置如下:

server { listen 80; server_name your-domain.com; root /opt/www/dist; location /api/ { proxy_pass http://127.0.0.1:9090; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }

开发阶段直接访问后端接口调试,生产环境统一走nginx入口。这样分工明确,排查问题的时候思路也清晰。

4.4 文件上传大小限制与网络超时问题

视频类学习资料动辄几百兆,前后端有两处默认限制容易忽略。前面提到的SpringBoot默认1MB上传大小只是一处,另一处是前端nginx的client_max_body_size默认是1M,需要在nginx配置里加大:

server { client_max_body_size 200M; }

不然前端传到一半nginx直接返回413错误,浏览器控制台看起来像是接口挂了,实际是nginx这一层拒绝了。我建议解决这类问题按“前端nginx → 浏览器 → 后端SpringBoot → 后端操作系统 → 数据库”的顺序排查,每一层都确认一遍限制是否放开了。

4.5 布尔字段下划线映射的细节

数据库里有一个finish_status字段,类型是tinyint(1),Java实体类里对应Boolean finishStatus。如果MyBatis没有开启mapUnderscoreToCamelCase,查询结果里这个字段永远是null。开启方法是在全局配置文件里加一行:

mybatis: configuration: map-underscore-to-camel-case: true

这也是我坚持用原生MyBatis而不是MyBatis-Plus的原因之一——原生配置更透明,出了问题你能准确定位到某一层。开启驼峰映射之后,像create_time对应createTime、branch_id对应branchId,这类映射就不用手动处理了。

5. 源码部署与二次开发扩展指南

5.1 环境准备与初始化步骤

部署这套系统,需要准备的工具是JDK 1.8、Maven 3.6+、MySQL 5.7+、Node.js 14+和nginx。顺序一般是这样:先把数据库脚本导入MySQL,再启动后端工程,最后启动前端工程。

数据库初始化我特别说明一下:脚本里包含建库、建表、插入初始数据三个部分。初始数据里我已经预置了一个超级管理员账号、一套基础菜单和角色模板,前端的动态菜单依赖这些数据——如果只建表不插入初始数据,登录后菜单是空的。导入时最好用命令行或者Navicat执行整个SQL文件,避免漏掉某段脚本。

后端配置里有一个容易改错的地方:application.yml里的数据库连接地址、账号密码、redis地址(如果用了缓存)。我建议把环境相关的配置都外置到application-prod.yml,部署时根据环境用spring.profiles.active激活对应配置,这样隔离环境信息,方便交付。

5.2 部署上线检查清单

上线不是开发完就算完事,我整理了一个自查清单,照着过一遍能减少很多低级故障:

  • 数据库字符集是utf8mb4,排序规则选utf8mb4_general_ci
  • 后端启动脚本设置JVM内存参数,避免默认堆太小导致大文件上传时OOM
  • 前端资源构建后用npm run build,产物放到nginx静态目录
  • nginx配置了client_max_body_size和/api/反向代理
  • 服务器防火墙(尤其云服务器安全组)放行了80、9090端口
  • 数据库备份策略,至少每天一次全量备份

5.3 二次开发扩展思路

如果拿到这套源码打算自己加功能,我建议从这几个方向切入:

  • 增加学习时长明细表:把当前study_record的“累加字段”升级成“明细表+汇总表”,这样可以做学习时长趋势图、每日学习打卡提醒。
  • 对接企业微信/钉钉通知:考试发布后自动给成员推送通知,这个可以在exam_record插入记录时调用消息服务。
  • 引入消息队列峰值削峰:如果在线人数很高,考试提交瞬间集中写库,可以用RabbitMQ或Kafka异步落库,避免数据库连接池被打满。
  • (注意:此处内容已安全处理)移动端适配:目前后台管理页面可以在手机浏览器上凑合用,但交互体验一般。下一步可以针对学习中心和考试页面做单独的手机端页面布局。

写在最后

最后分享一个经验:接这种“完整管理系统”的需求,最忌讳上来就写代码。花两天时间把用户的业务流程、角色权限、表关系理清楚,后面开发至少能省半个月的返工时间。这套源码我前后用类似的结构做过三四个内部管理系统,从学习平台到培训考核平台到问答社区,核心模板都是这套,改一改业务字段就能用。

如果你正在做类似的项目或者毕业设计,建议别只关注“跑起来”,而是多想想“为什么这么设计”——比如为什么权限要三级、为什么学习记录要做去重、为什么Long类型要转String。把这些想明白了,你写出来的系统才不是一堆代码的拼凑,而是一个能真正扛住业务变化的工程。

有部署或者二次开发的问题,欢迎在评论区聊聊,我看到会回复。

相关新闻

5G网络架构深度解析:从服务化架构到核心网部署实践

5G网络架构深度解析:从服务化架构到核心网部署实践

1. 为什么值得重新认识5G网络架构很多人对5G的理解还停留在“网速快”这个层面&#xff0c;觉得它不过是4G的升级版&#xff0c;下载电影从几分钟变成几秒钟而已。但如果你真正接触过5G网络的部署和调优&#xff0c;就会发现事情远没有这么简单。5G之所以能支撑起低时延、大连接…

2026/10/20 4:39:46 阅读更多 →
千问大模型Function Calling实操:从聊天机器人到能干活的Agent

千问大模型Function Calling实操:从聊天机器人到能干活的Agent

这一两年我最大的一个感受是&#xff1a;大模型的热闹劲儿过去了&#xff0c;真正静下心来研究怎么让它"干活"的人&#xff0c;开始吃到红利了。去年大家还在比谁的对话更流畅、更有"人味儿"&#xff0c;今年风向明显变了——客户上来就问&#xff1a;&quo…

2026/10/20 4:39:46 阅读更多 →
开源火箭仿真软件OpenRocket:5步设计并仿真你的第一枚模型火箭

开源火箭仿真软件OpenRocket:5步设计并仿真你的第一枚模型火箭

开源火箭仿真软件OpenRocket&#xff1a;5步设计并仿真你的第一枚模型火箭 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket 你辛辛苦苦扎好一枚模型火箭&am…

2026/10/20 4:39:46 阅读更多 →

最新新闻

FunctionCall函数调用全解析:从原理到实战,让大模型真正“动手干活”

FunctionCall函数调用全解析:从原理到实战,让大模型真正“动手干活”

如果你正在做AI对话类产品&#xff0c;不管是客服助手、内容助手还是企业内部的知识问答系统&#xff0c;大概率会遇到这样一个让人头疼的瞬间&#xff1a;用户问“帮我查一下昨天订单的物流状态”&#xff0c;模型回了一句“很抱歉&#xff0c;我无法访问你的订单系统”。不是…

2026/10/20 5:19:03 阅读更多 →
PyInstaller打包Python脚本实战:从原理到多平台发布

PyInstaller打包Python脚本实战:从原理到多平台发布

Python 脚本写完之后&#xff0c;最常被问到的一个问题就是&#xff1a;怎么把它交给一个没装 Python 的人也能跑起来&#xff1f;你总不能让人家先装解释器、再配环境变量、再 pip install 一堆依赖。PyInstaller就是干这个的——把.py文件连同解释器和依赖库一起打包成单个可…

2026/10/20 5:19:03 阅读更多 →
Pulsar创新实践:消息中间件架构演进与生产落地指南

Pulsar创新实践:消息中间件架构演进与生产落地指南

最近不少技术群都在倒计时&#xff1a;COSCon‘25 同场活动 Pulsar Developer Day 还有 3 天就要开了。这个开发者日把主题定在“消息中间件创新实践”&#xff0c;我个人觉得比泛泛的技术布道更有看头。原因很简单&#xff1a;消息中间件这几年变化太快&#xff0c;快到“选型…

2026/10/20 5:19:03 阅读更多 →
把LLM代理当成一等优化手段:GPU Kernel调优闭环实践

把LLM代理当成一等优化手段:GPU Kernel调优闭环实践

1. 从"人翻手册"到"代理提方案"&#xff1a;kernel优化的玩法变了1.1 以前的优化流程是什么样的在把LLM代理接入优化闭环之前&#xff0c;一个典型的GPU算子性能优化流程大概是这样的&#xff1a;先用profiler拿到kernel的运行时间和各阶段硬件利用率&…

2026/10/20 5:19:03 阅读更多 →
B级数据中心机房建设方案设计:从分级逻辑到落地细节

B级数据中心机房建设方案设计:从分级逻辑到落地细节

前几天接到一个需求&#xff1a;某中型企业要新建一栋办公楼&#xff0c;二层要拿出一整块区域做信息机房&#xff0c;甲方明确要求“按B级标准设计”&#xff0c;最终交付物是一份PPT——也就是《B级数据中心机房建设规划设计方案&#xff08;PPT文件&#xff09;》。听起来任…

2026/10/20 5:19:03 阅读更多 →
C++进阶篇(二):多态——虚函数、重写、虚函数表与三个经典坑(附完整代码仓库)

C++进阶篇(二):多态——虚函数、重写、虚函数表与三个经典坑(附完整代码仓库)

0.1 概述&序言 这里是白杨。上一篇继承的结尾留了一句话&#xff1a;想搞多态&#xff0c;必须继承。这一篇就来兑现——多态。 如果把继承比作"类怎么长"&#xff08;谁是谁的爸&#xff09;&#xff0c;多态解决的就是"同一份调用代码&#xff0c;怎么跑…

2026/10/20 5:18:03 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/18 12:16:16 阅读更多 →