news 2026/10/10 8:22:56

SpringBoot+Vue图书进销存系统设计与核心接口实现详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot+Vue图书进销存系统设计与核心接口实现详解

每逢毕设季,图书管理系统绝对是Java Web方向出镜率最高的题目之一。尤其是这套“SpringBoot+Vue 图书进销存管理系统平台”,几乎成了Java Web毕设的标准答案——源码、SQL脚本、接口文档一应俱全,很多同学拿着它改改就交。但问题也恰恰出在这里:代码能跑起来的人很多,能在答辩时把业务逻辑讲明白、面对老师追问不慌的人很少。这篇博文我会把整套系统从业务拆解、表结构设计、核心接口实现到前后端联调的要点全部过一遍,同时把源码和SQL脚本里那些“埋着但没人告诉你”的设计细节挖出来,希望能对正在做毕设或者接手这类项目的同学有点实在的帮助。

1. 图书进销存到底管的是哪几件事:业务拆解先于代码

很多同学拿到项目第一反应是“先把代码跑起来”,这其实顺序反了。图书馆授人以鱼,毕业设计要的是渔。这个系统叫“图书进销存”,核心不是图书管理,而是进、销、存三个动作之间的数据流转。先把这个搞清楚,后面看表和看接口都会轻松得多。

1.1 “进”是采购入库,不是简单的增删改查

“进”指的是图书采购入库。实际操作里,采购不是一个孤立的动作,它连带着供应商、采购单、入库明细、库存增加、应付账款这几条线。也就是说,采购入库不是“往图书表里加一条记录”,而是要做一张采购主表,再挂一个采购明细表,主表记录的是这笔采购的整体信息(供应商、采购时间、总金额、操作人),明细表记录的是这批货里有哪几本书、每本进价多少、数量多少。

这套设计的商业逻辑是:后续退货、结算、统计采购额,都要按“单”来查,而不是按“书”来查。我在做这个项目时一开始也偷懒过,想的是“反正就是库存嘛,直接update一下图书表库存数量不就行了”。事实证明这个思路只适合写Demo,不适合写毕设。因为老师一问“你的采购记录怎么追溯”,没有主表你会非常被动。

1.2 “销”是销售出库,难点在库存扣减

“销”对应的同样不是一张表了事,而是销售单、销售明细、客户(或会员)信息和库存扣减。销售出库的时候,系统要做三件事:创建销售主单、写入销售明细、同步扣减对应图书的库存数量和增加销售金额统计。

这里就牵出一个非常关键的逻辑:扣减库存的时机。是在用户点击“下单”时扣,还是“支付成功”时扣,还是“出库”时扣?很多毕设项目不做区分,说白了下单即扣减,这没问题,但你在答辩时必须能说清楚。我的建议是做给老师看的——在销售模块加一个状态字段(待付款、已付款、已出库、已退书),扣库存放在“已出库”这个节点,这样整个流程就有故事可讲了。

1.3 “存”是库存台账与预警

“存”是进销存的核心命门,它不等同于“图书表里加一个库存字段”。严格来说,库存应该是一份可以回溯的台账:每一本书的数量变化,都有一条记录对应“哪个采购单进的”或“哪个销售单出的”。

实际毕设项目里,直接把库存字段放在图书表上是大多数情况。这也算一种合理简化,但建议你补充两个东西:一个是库存预警字段(库存下限),当某本书的库存数量低于阈值时,系统在首页或库存页面高亮显示缺货图书;另一个是盘点逻辑,也就是每年或者每个月清点实际库存和系统库存的偏差,允许做“盘盈盘亏”调整,并留一个调整记录。这两块如果写在你的设计说明和论文里,内容会丰富很多,答辩时也更有的讲。

1.4 角色与权限:为什么系统要分管理员和操作员

图书进销存系统看着小,角色其实不少。老板关心的是“我一个月卖了多少、库存压了多少钱”,采购员关心的是“有哪些书快卖完了需要补货”,门店操作员关心的是“结账、开单、查价”。如果系统里只有一种用户身份,那进销存和三流系统也就没有区分度了。

所以在设计用户模块时,我建议至少做两个角色外加一个权限控制的雏形。不用上特别重的Spring Security,可以自己写个拦截器,配合用户表的角色字段去控制页面路由和按钮权限。比如管理员能看到统计报表和供应商管理,操作员只能访问销售收银和库存查询,采购员能访问采购入库和供应商管理。毕设里把这个做出来,已经可以碾压一大半只做单角色CRUD的作品。

2. 为什么是SpringBoot+Vue:选型背后的真实考量

现在做Java Web毕设,SpringBoot+Vue几乎是人人都说的方案。但很多人只是跟风,并不知道它为什么合适。我做了不少项目评审,也帮人改过很多次代码,说实话这套组合能火,靠的确实是硬实力,但里面也有不少坑,需要提前说清楚。

2.1 SpringBoot到底解决了什么

十来年前做Java Web,主流是SSH(Struts2+Spring+Hibernate)或者SSM(Spring+SpringMVC+MyBatis)。你没看错,做一个小小图书管理系统要配置一堆XML,光是spring-context.xml里的事务、数据源、扫描包配置就能让你调一整晚。SpringBoot的核心价值就是把这些老掉牙的配置自动化简化,约定优于配置,你只要引入spring-boot-starter-web,把端口写在application.yml里,一个main方法就能把内嵌Tomcat起起来,不需要再打war包丢进外置Tomcat。

做毕设选SpringBoot,其实选的是“效率”。你省下来的时间可以拿去做前端页面、写接口文档、写论文,而不是浪费在环境配置上。但有一点我必须提醒:SpringBoot自动配置是把双刃剑。它帮你省事,也让你对底层失明。答辩时老师经常会问“SpringBoot启动时发生了什么”“自动配置原理是什么”,建议至少把@SpringBootApplication里的三个注解(@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan)的作用搞明白,别只会点Run。

2.2 Vue的前后端分离与“套壳”之争

Vue这边,主流选择是Vue2+Element UI或Vue3+Element Plus。毕设项目用Vue,最核心的好处是页面交互不用整页刷新,表格、弹窗、表单校验这些后台管理页面的常用组件拿来即用,开发效率极高。

但我也见过很多反面案例:有同学把Vue项目build之后直接扔进SpringBoot的static目录下,最后整个项目只有一个main方法入口,看起来就像一个单体应用。这种做法确实省事,部署也简单,但彻底失去了前后端分离的意义,答辩时要是被问“那你还用Vue干嘛”会很尴尬。我的建议是,前后端分开跑:前端用npm run dev起8787端口(或你自己配置的端口),后端用8080端口,两边通过接口交互。这样你能说清楚什么是跨域、什么是代理、为什么生产环境要把前端资源打成静态文件放到后端,整个链路的知识点是完整的。

2.3 为什么不建议用更重的微服务架构

可能你也见过一些项目用Spring Cloud Alibaba搭微服务网关、注册中心、配置中心,里面还嵌套Redis、RabbitMQ,看着很唬人。但话要直说:图书进销存这种系统,业务量级决定了一台单机服务器加一个数据库就已经绰绰有余,硬上微服务本质是炫技,不是一个合理的工程决策。微服务化的代价是架构复杂度指数上升,你需要在答辩时解释服务为何拆分、服务间如何通信、分布式事务怎么处理,这些都是难以收场的深坑。

如果确实想让项目有亮点,比较合理的升级方向是:引入Redis做热点图书的缓存和登录Session,引入定时任务实现每日库存快照。这两点都在单体架构内可以完成,但又能明显拉开和普通CRUD项目的距离。

3. SQL脚本里的设计心思:表结构、外键与数据初始化

拿到项目里的SQL脚本,别急着直接执行。这份脚本堪称整个系统的“地基”,你后面所有的代码、页面、接口都是围绕表来的。脚本本身的注释可能不多,这一章我帮大家拆一下每个核心表的角色,以及设计时的几个关键取舍。

3.1 核心表结构一览

我先列一下图书进销存项目最常见的表结构,不一定每份源码都一样,但整体八九不离十:

表名核心字段作用
book_infoid, isbn, book_name, author, publisher, price, stock, low_stock, category_id图书基本信息与当前库存
supplierid, supplier_name, contact, phone, address供应商档案
customerid, customer_name, phone, member_code客户/会员档案
purchase_orderid, order_no, supplier_id, total_amount, status, create_time, create_by采购单主表
purchase_order_itemid, order_id, book_id, purchase_price, quantity, subtotal采购单明细
sale_orderid, order_no, customer_id, total_amount, status, create_time, create_by销售单主表
sale_order_itemid, order_id, book_id, sale_price, quantity, subtotal销售单明细
stock_recordid, book_id, change_type, change_quantity, stock_after, remark库存变动台账
system_userid, username, password, role系统登录用户

这套结构的关键在于:把“订单主表/订单明细表”拆开,这是电商和进销存通用的“主子表”模型,原因前面说过了——订单行项目可以多,但主表一条记录对应整笔交易。很多新手容易犯的错是只在book_info表里加一个stock字段,然后不管进和销,在代码里直接改数字,这样做完统计报表时你会发现数据全是乱账,理都理不清。

3.2 外键与逻辑删除的取舍

开源项目里的SQL脚本通常没有启用物理外键约束,比如book表和purchase_order_item表之间不会真的去写FOREIGN KEY。因为生产开发中物理外键会带来一些麻烦:插入、删除必须考虑约束顺序,批量操作性能受关联检查影响,而且一旦数据出错很难灵活处理。毕设项目一般走的是“逻辑外键”路线:建表时不写外键,但查询时用JOIN关联两张表。

这里我想特别提醒一个点:逻辑删除。给关键表加一个deleted字段(0未删除,1已删除),是现在企业项目的常见做法,核心数据不允许物理删除,而是打标记“软删”。在MyBatis-Plus里配置了逻辑删除后,所有的查询都会自动加上deleted=0条件,非常方便。但用的时候要记住一个坑:如果某天需要完全删除一条数据,你还得再写一条接口去硬删,否则表里的数据会越攒越多。

3.3 SQL脚本的执行顺序与初始化数据

拿到一份SQL脚本,通常它分为几个清晰的部分:

  1. DROP TABLE IF EXISTS,清掉旧表。
  2. CREATE TABLE,建表,注意执行顺序——父子表之间先建父表,否则外键或关联查询无从谈起。
  3. INSERT INTO,插入初始化数据,比如admin管理员账号、图书分类、若干本示例图书、供应商和客户测试数据。
  4. 必要时插入一些购买销售测试记录,方便前端页面能直接看到图表数据。

TableView乱码问题:这一步经常有人栽跟头。如果你的SQL脚本里有中文数据,在Navicat或其他数据库工具里执行时,一定要确认脚本文件本身的编码是UTF-8,同时数据库连接的高级选项里也要配好“编码:utf8”。否则你导入之后库里全是问号乱码,前端页面上也全是问号,排查起来让人抓狂。更稳妥的做法是在连接MySQL的URL上加上characterEncoding=utf8参数。

另外强调一个实用习惯:初始化管理员密码时,脚本里通常已经有一行insert,默认密码是123456,而代码里登录时会把输入密码通过MD5加密后再与库里记录比对。如果你改了自己脚本中的密码,一定要同时把密码改成MD5值,否则登录接口永远校验失败,还以为是故意写的bug。

4. 接口文档里必须交代明白的核心接口设计

这个项目标明了“含接口文档”,说明它走的是前后端分离接口约定路线。接口文档不是写给现在看的,是给两个月后遗忘所有细节的自己看的,也是给答辩评委看的。这一章我不泛泛讲“文档格式”,就讲这个系统里真正核心的几个接口逻辑,以及它们怎么设计才经得起追问。

4.1 统一返回体与分页规范

接口文档的核心不是写“这个接口返回什么”,而是“前端怎么解析”。几乎所有进销存系统的接口都遵循同一个返回雏形:

{ "code": 200, "message": "操作成功", "data": { "total": 102, "records": [ ... ] } }

code=200是业务成功,非200即业务失败(比如库存不足、登录失败)。前端axios拦截器里看到同一个code就可以统一弹出错误提示,不用每个接口单独写错误判断。

分页接口的入参就三样:当前页码current、每页条数size、查询条件keyword。MyBatis-Plus内置了分页插件,Page<BookInfo> page = new Page<>(current, size),加上条件构造器LambdaQueryWrapper,几行代码就能完成带条件的分页查询,几乎不用手写1imit。

4.2 登录鉴权:Token还是Session

这个要提前想好,因为接口文档一旦定了,后续改动成本很大。很多毕设项目用的是Session + HttpSession,整个方案最简单,登录成功把user对象塞进session,后端接口里直接getSession().getAttribute("user")。优点是代码少、好理解;缺点是你得让前端配合使用同一套会话机制,前后端分离时还得处理跨域携带Cookie的问题。

如果你想让项目上点档次,可以选JWT(JSON Web Token)方案:登录成功后后端签发一个token返回给前端,前端存到localStorage里;之后每个请求在请求头加上Authorization: Bearer <token>;后端在一个拦截器里解析token,拿到当前用户ID和角色后放进ThreadLocal里供业务层获取。这个方案做出来,你在答辩时可以展开讲一堆:token过期时间、无状态认证、单点登录的前置概念,都是可以直接吸引老师兴趣的扩展话题。

4.3 采购入库接口:一个接口背后的事务

看接口文档时我会重点看“采购入库”这个接口,它最能体现项目作者对事务的理解。它的后端逻辑实际上是:

  1. 生成采购单主表记录。
  2. 循环写入采购明细每条书目的采购价和数量。
  3. 循环更新book_info表里每本图书的库存(增加)和最新的采购价格。
  4. 往stock_record表写库存变动流水。
  5. 更新supplier的采购累计金额(可选)。

这五步任何一个失败,都会造成“主表有了、明细缺失”或者“库存加了但流水没记”的脏数据。所以整个方法必须加@Transactional,同时要注意自调用失效的问题——在同一个类内部两个方法互调,@Transactional注解是不生效的(Spring用的是代理对象,自调用没有走代理),一定要把这类逻辑拆到一个独立的Service里,或者从Controller层直接调服务入口。

4.4 销售出库与库存校验的状态机

销售出库接口比采购复杂一点点,在于它有“状态流”和“异常分支”。一般至少要定义三种状态:待付款、已付款、已出库。已出库之后才能扣减库存,这就引入了库存是否充足的判断逻辑。

伪代码大致是这样:

查出销售明细 遍历每一本图书: 判断book.stock - item.quantity >= 0,否则返回code=400提示“《XXX》库存不足” 扣减库存并写stock_record流水 更新sale_order状态为已出库 计算订单总金额并更新主表ensure total_amount

一个小细节:计算总金额时,不要用前端传过来的totalAmount,前端的数据不可信,后端必须按数据库里的销售单价乘以数量重新计算一遍,再存回主表。这种后端不信任前端的精神,在答辩时可以直接说出来,给评委的印象分很不错。

5. Vue端页面实现:采购入库、销售出库与库存预警的交互细节

前端这边,很多人以为Vue项目就是“拿模板改改,能展示数据就行”。实际上图书进销存系统里最提分的地方是“交互的闭环”,也就是说用户在一个页面上操作后,另一个页面的数据要有反馈,这是有状态管理的含义。这一章挑三个核心页面说说实现思路。

5.1 采购入库页面的典型交互

采购入库页面一般长这样:顶部是供应商下拉选择器,中间是一张图书明细表格,底部是“添加图书”“删除行”“提交入库”按钮,右边或者底部显示总金额。

具体的操作流程你完全可以按这个走:

  1. 点击“添加图书”弹出图书选择弹窗(或联想搜索框)。
  2. 选定图书后,明细表格新增一行,自动带出书名、ISBN、当前库存,采购价和数量默认置为1。
  3. 修改数量或采购价后,接口返回前端实时重算该行小计与订单总额。
  4. 点击提交,走采购入库接口。
  5. 成功后刷新图书列表,此时库存数字已经更新,重新拉一次列表。

这里有两个细节容易疏忽。一个是图书选择弹窗,如果项目里图书总数只有几十条,直接拉全量数据没问题;但如果过千过万条,就必须做分页搜索,避免下拉框卡死。另一个是重复添加同一本书的处理:要么在前端判断重复并累加数量,要么在后端接口里校验重复并报错,建议前端做累加,体验更顺滑。

5.2 销售出库购物车式的状态管理

销售页面最好用的是“临时购物车”的形态。前端不直接调出库接口,先把用户选择的图书塞进购物车数组,页面右侧用v-for展示购物车列表,每一项支持修改数量和移除。结算时再统一走提交接口。

状态管理方面,如果用的是Vue2可以只在组件里用data维护购物车,如果用的是Vue3可以试试reactive或ref;项目大了以后也可以用Pinia或者Vuex。但毕设规模不建议引太重,把数据放在一个正确的容器里维护就行,不要每个子组件都发一次接口取数据,那样写出的代码又慢又乱。

前端购物车校验也要做好:比如数量不能超过库存,至少选了一本书才能提交,单价必须大于0。这些校验看起来是小事,但在演示时你输一个-5进去,后端返回报错,老师看着会很尴尬。提前做拦截是提升演示流畅度的关键。

5.3 库存预警和统计图表:让数据“活”起来

库存预警页面应该是整个系统最直观的亮点。实现思路很简单:book_info表里有一个low_stock字段,前端每次进库存页面调一次查询接口,把stock <= low_stock的图书筛选出来,用table的红字或者tag标签高亮显示。更进一步的方案是做一个top预警面板:比如统计出当前库存不足的图书有几种、涉及库存缺口多少本。

统计图表这里推荐ECharts,Vue2对应的可以用vue-echarts或直接引echarts按需初始化。这个系统里适合放的图表包括:

  • 近30天销售趋势折线图(按日汇总销售额、销售量)。
  • 图书分类库存占比饼图(展示各分类库存数量结构)。
  • 供应商采购额排行榜横向柱状图(TOP5)。
  • 库存预警条数看板(数字卡片)。

前端ECharts图表的通用写法是:先在mounted里初始化图表实例,然后调后端统计接口,拿到数据后setOption。要注意清理:组件销毁前调用dispose释放图表实例,不然切路由时会报"ECharts is already initialized"之类的警告。

6. 从联调到部署:跨域、打包、时区与数据库连接的实战坑

把前后端独立跑起来只是第一步,真正让一个毕设项目像“完整作品”的是联调和部署环节。这一章的坑,我基本是踩一遍总结出来的,每一条都可能让你白熬夜一晚上。

6.1 跨域问题的两种解法

前后端分离开发时,前端地址是http://localhost:8787,后端接口是http://localhost:8080,浏览器默认会拦截跨源请求。你看到的典型报错是:Access to XMLHttpRequest at 'http://localhost:8080/...' from origin 'http://localhost:8787' has been blocked by CORS policy.

解法有二。第一种是后端启用CORS配置,写一个WebMvcConfigurer的配置类,统一添加跨域映射。这是最快路径。第二种是前端Vite或Webpack里配置devServer.proxy,例如所有/api请求都代理到http://localhost:8080,这样浏览器以为请求的同源的,就不存在跨域。我更推荐第二种,因为它的思路更接近生产环境(用Nginx做反向代理转发),而且不需要改后端代码,答辩时好讲。

还有一个隐蔽坑:你改了代理配置但没重启Vite,代理不会生效。每次改完vite.config.js必须重启npm run dev。

6.2 前端打包放进后端的两种路线

临近交项目的时候,大家经常问“前端项目怎么打包放进SpringBoot里”。这里提供两种方案:

  1. 前后端分离部署:前端npm run build后把dist目录发给任意静态服务器(Nginx、Apache)或者直接双击dist里的index.html(注意避免file协议下接口地址无法访问的问题),后端单独跑。灵活,返工少。
  2. 前端资源内嵌到SpringBoot:更适合交单个项目的场景。把dist目录下的文件拷贝到后端src/main/resources/static,然后在后端配置一个映射,把前端所有非/api开头的路径都转发到index.html。这样打成一个jar包,携带全站资源。

方案2里的转发配置是重头:因为前端SPA路由是history模式,你直接访问http://localhost:8080/book-manage刷新时会404,必须配置SpringMVC的ViewController或者自定义一个HandlerInterceptor把不存在的路径重写到/index.html。

6.3 MySQL版本与连接配置

现在毕设几乎都用MySQL 8及以上,SQL脚本也基本兼容。连接配置上有一个容易出现的时间区问题:驱动报The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized。这是因为新版驱动默认要求serverTimezone参数,而你的URL没加。

正确的URL写法参考:

spring: datasource: url: jdbc:mysql://localhost:3306/book_store?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver

allowPublicKeyRetrieval=true主要用于MySQL 8的caching_sha2_password认证方式,不加的话部分环境会报Public Key Retrieval is not allowed,加上可省去一堆麻烦。

6.4 日期时间序列化问题

Java后端返回给前端的日期,默认是“yyyy-MM-dd'T'HH:mm:ss.SSS'Z'”这种UTC格式,前端直接显示会跟本地时间差8小时,而且不好看。解决方式是在application.yml里配一个全局格式化:

spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8

如果你用了LocalDateTime,上面date-format对LocalDateTime不一定生效,更通用的做法是自定义一个Jackson的ObjectMapper自定义序列化器,或者干脆统一把接口返回的日期字段类型设计成String,由后端格式化好再返回。毕设项目里我倾向于后者,简单粗暴少踩坑。

6.5 万字长谈之外的三个答辩级亮点

顺带说三个让评委眼前一亮的小改进,每个都可以在半小时内做出来:

  1. 操作日志:写一个切面(AOP作用于Controller层),自动记录每次请求的接口名、操作人、耗时、参数摘要。答辩时可以展示“安全性”与“可审计性”。
  2. 库存快照定时任务:用Spring自带的@Scheduled(cron = "0 0 2 * * ?")每天凌晨2点把库存总量写入一张快照表,系统就可以展示“昨日库存”和“今日库存”的差异对比。
  3. Swagger/knife4j在线接口文档:项目交付时给文档加一个自动化的章节,毕竟接口文档也会过时,Swagger注解却永远和代码同步。启动项目后访问/doc.html即可看到实时接口列表,演示效果极佳。

7. 联系实际的一点体会

把整套SpringBoot+Vue图书进销存系统做完,最大的收获不是“我写了多少行代码”,而是理解了业务系统和玩具Demo的分界线在哪里——采购入库要管供应商和明细,销售出库要管库存与金额的一致性,库存盘点要能追溯每一步变动,这些都不是CRUD能糊弄过去的逻辑。源码和SQL脚本只是基础弹药,真正能在答辩和后续面试中拿出手的,是你对每张表为什么存在、每个接口为什么这样设计、每次库存变动为什么必须留痕的清晰解释。

如果这份项目是你第一次完整做前后端分离系统,建议在最后阶段抽出一天时间,自己动手写一遍阅读源码过程中的“TODO注释”,把关键表的关系统一画一张纸,把核心接口的调用链走一遍。做毕设从来不是为了让代码变成一个能交差的压缩包,而是让你在拿着这份代码走出校门时,心里知道它哪里好、哪里可以更好。这套图书进销存系统不算难,但它的结构足够经典,是很好的第一块跳板。

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

【MT32F006】MT32F006之systick定时器延时

本文最后修改时间&#xff1a;2026年09月10日一、本节简介本文介绍如何使用MT32F006的定时器做us、ms级的延时。二、实验平台库版本&#xff1a;V1.0.0编译软件&#xff1a;MDK5.37硬件平台&#xff1a;MT32F006开发板&#xff08;主芯片MT32F006&#xff09;仿真器&#xff1a…

作者头像 李华
网站建设 2026/10/10 8:12:13

CPU 飙到 100%,先别急着翻代码

CPU 飙到 100%&#xff0c;先别急着翻代码 Java 线上排查的四步法与三个坑 经典排查流程整理与修订 作者观点&#xff0c;仅供讨论 线上告警&#xff1a;某台机器 CPU 打满。很多人的第一反应是翻代码、猜哪里有死循环。我的观点是&#xff1a;**先定位&#xff0c;再推理&…

作者头像 李华
网站建设 2026/10/10 8:10:46

PCA9422与MKV42F256VLH16协同实现μA级嵌入式电源管理

/* 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 8:08:42

基于PCA9422与PIC32MX的电源管理及低功耗设计

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

作者头像 李华