尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
SpringBoot+Vue助农商城系统开发实战:从数据库设计到部署全流程
1. 项目概述与技术选型1.1 选题背景为什么助农类系统是毕设/课设的优质选择先说一个很多人都会踩的坑毕设选题一看题目就头大选得太偏容易做不出来选得太泛又显得没技术含量。如果你正在为选题发愁SpringBootVue的助农管理系统是一个很稳的选择。助农管理系统本质上是电商内容管理的组合体核心业务是帮助农户展示农产品、管理订单、发布农业资讯同时为消费者提供浏览、下单、咨询的入口。这个业务场景有几个明显优势一是贴近真实需求答辩时能讲清楚业务逻辑二是功能边界清晰该有的核心模块都有了做起来不容易失控三是技术栈主流SpringBoot、Vue、MySQL这三样是最常见的招聘要求做完直接写进简历也不虚。适合谁来用如果你是计算机相关专业的学生正在准备毕业设计、课程设计或者自己想在短时间内熟悉一个完整的Web项目这套系统都足够合适。它的工作量处在一个人能完成的范围内不会像中台系统那样庞大到让你崩溃也不会像单页静态页面那样显得单薄。1.2 技术栈选型为什么是SpringBoot Vue而不是别的先聊聊技术选型的底层逻辑。Java后端的主流方案里SSHStruts2SpringHibernate已经是历史遗物SSMSpringSpringMVCMyBatis虽然经典但配置繁琐SpringBoot的兴起本质上就是把这些繁琐的配置通过自动装配和约定优于配置解决掉。SpringBoot的意义在于简化它把原来需要写一大堆XML配置的事情变成一个注解就能完成大大降低了一个人做全栈开发的心智负担。Vue作为前端框架核心优势是渐进式设计和响应式数据绑定。React的学习曲线比Vue陡Angular的复杂度更高Vue则是在性能和易用性之间找到了一个很好的平衡点。特别是Vue配合Element UI组件库做后台管理类页面几乎是一天能搭完两三个页面的节奏。这套JavaMySQL的组合还有一个隐藏优势面试和答辩的时候面试官大概率就是Java出身你对SpringBoot的IOC、AOP、自动配置原理能讲上几段对MySQL的索引优化、事务隔离级别能说出几句基本就能让提问的人满意。换作Python的FastAPI或者Node的Express反而没有这种同频对话的效果。2. 系统功能架构与数据库设计2.1 角色权限与核心功能模块拆分刚拿到这个项目的人容易犯一个错误一上来就急着敲代码结果做着做着发现功能之间彼此纠缠改一处崩三处。正确姿势是先想清楚角色和功能边界。助农管理系统按使用角色划分通常包含三类身份管理员、农户商家侧、普通消费者。这三类角色的权限和操作范围差异很大必须一开始就设计好。管理员侧的核心操作包括管理农户入驻信息、审核农产品上下架、处理消费者反馈和投诉、发布平台公告、查看全站销售数据。农户侧的核心操作包括注册入驻、维护自家农产品信息商品名、价格、库存、图片、介绍、处理订单发货、查看自己的销售额。消费者侧的核心操作包括浏览农产品列表、按分类筛选、加入购物车、下单支付一般用模拟支付、提交收货地址、查看订单状态、发表评价和留言。从页面结构来看后端管理端admin和前台展示端front要分开。前端展示页用Vue Router做路由分层管理端则单独跑一个带侧边栏和顶栏的布局。注意这里最好做成两个独立的Vue工程不要混在一个工程里用路由切换否则打包体积和代码维护都会变麻烦。2.2 数据库表设计的关键细节数据库设计是这个项目最值得抠的部分因为一个系的毕设选题撞车率极高数据库设计得好不好答辩时一眼就能看出你是真做过还是照着视频敲的。核心表可以拆成以下几类用户相关sys_user系统用户表存放管理员和农户账号、member消费者会员表。这里建议做区分而不是全部塞进一张用户表因为两类用户的字段差异较大——农户需要审核状态、所属地区、身份证号消费者则更关注收货地址等字段。商品相关product_category农产品分类表、product农产品表、product_image商品图片表因一个商品可能有多张图片。订单相关orders订单主表、order_item订单明细表。主表记录订单编号、总金额、状态、收货人信息明细表记录具体买了哪些商品、单价、数量。内容相关article助农资讯/公告表用于发布政策资讯、助农故事等内容。互动相关comment评价/留言表。这里有几个设计细节容易踩坑。第一个是订单编号不要用数据库自增ID而是用时间戳加随机数生成业务订单号方便后续对账和查询。第二个是所有金额字段用decimal(10,2)而不是float/double避免浮点精度问题——你在答辩时可以把这个点主动讲出来属于加分项。第三个是逻辑删除优于物理删除每张核心表都加一个deleted字段商品下架不删除记录因为历史订单需要回溯。MySQL字符集统一用utf8mb4排序规则用utf8mb4_general_ci。为什么不用utf8因为utf8存不了emoji和一些生僻字用户评价里偶尔就会出现特殊字符经验之谈。2.3 ER关系的衔接方式表数量建议控制在9到12张之间。太少了显得工作量不足太多了你维护不过来。表与表之间的关系放在MyBatis的XML里维护不要在Java代码里到处写SQL拼接。这里还要想清楚一个问题用户认证怎么做。初学者喜欢在登录成功后在session里存一个用户对象然后每次请求都从session里取。但前后端分离模式下更合理的做法是先引入JWTJSON Web Token登录成功后后端返回一个token前端把token存在localStorage里之后每次请求在axios拦截器里带上Authorization请求头。这个方案不仅契合前后端分离架构而且在简历上能多写一行基于JWT实现无状态认证性价比极高。如果你觉得手写JWT麻烦可以用Spring Security JWT但我不建议课设阶段这么干——Spring Security的过滤器链配置对新手来说足够劝退光是搞明白UserDetailsService和AuthenticationManager就够折腾半天。直接用一个叫做Hutool的工具类库生成JWT即可简单好用几行代码就能搞定登录分发token和拦截器校验token的逻辑。3. 后端工程结构搭建与核心实现3.1 从零搭建SpringBoot工程现在假设你要从空目录开始把这个项目搭起来。第一步是环境检查先说结论JDK用1.8或者11不要一上来就上17或21SpringBoot用2.7.x不要追求最新的3.x。原因很简单——你搜到的绝大多数参考书、视频、博客都是基于SpringBoot 2.x的3.x对Jakarta命名空间的改动会让你在跟写的时候平白多出很多报错。IDEA里新建工程选择Spring Initializr勾选这几个依赖Spring Web MyBatis Framework MySQL Driver Lombok Validation其中Lombok能省掉写getter/setter的重复劳动Validation是做参数校验的。这里提醒一句Lombok在编译时用注解处理器生成代码少数环境配置问题会导致IDEA不识别生成的方法遇到的话装一下Lombok插件、开启annotation processing即可。工程目录结构建议按这个方式组织com.example.farm ├── controller # 控制层 ├── service # 业务层 │ └── impl # 业务实现 ├── mapper # MyBatis的Mapper接口 ├── entity # 数据库实体类 ├── dto # 数据传输对象接收前端参数 ├── vo # 视图对象返回前端数据 ├── config # 配置类拦截器、跨域等 ├── common # 公共类Result封装、工具类等 └── FarmApplication.java这套结构是Java后端开发最常见的分层方式controller管接收参数和返回结果service管业务逻辑mapper管数据库操作逻辑清晰答辩的时候按层讲就能讲得明明白白。3.2 统一返回结果与异常处理一个很容易被忽视但极其影响开发体验的地方接口返回值格式。如果你让每个接口自由发挥有的返回Map有的直接返回实体类前端联调的时候会痛不欲生。我建议从第一天就定义好统一的返回格式。用一个Result类泛型设计包含code、message、data三个字段。code为200表示成功500表示服务器异常401表示未登录或token失效。前端拿到响应后首先判断code不是200就弹错误提示。配套的还要有一个全局异常处理器用RestControllerAdvice注解实现。这样做的意义是你在写业务代码时不用每个地方都try-catch去包Exception业务代码里面只需要throw new BizException(库存不足)然后由全局异常处理器统一捕获、统一封装成Result返回前端。这个模式叫断言式编程代码会清爽很多。另外一个实践细节是跨域配置。前后端分离必然面对跨域问题开发环境用CrossOrigin注解一个个加也可以但更高明的做法是在config里面写一个全局CORS配置类用addCorsMappings一次性允许所有来源。不用太担心安全问题毕设项目面向的内网环境把allowedOriginPatterns设置为*就好。3.3 核心接口实现商品模块为例商品模块是整个助农系统的核心我拆一个分页查询农产品列表的接口来演示完整链路。前端传参pageNum页码、pageSize每页条数、categoryId分类ID可空、keyword搜索关键字可空。后端Controller接收后把这些参数封装成一个PageQuery对象。Service层代码大概长这样public PageResultProductVO getProductPage(ProductQuery query) { // 构造分页参数 PageHelper.startPage(query.getPageNum(), query.getPageSize()); // 查询条件构造 LambdaQueryWrapperProduct wrapper new LambdaQueryWrapper(); wrapper.eq(StringUtils.isNotBlank(query.getKeyword()), Product::getName, query.getKeyword()) .eq(query.getCategoryId() ! null, Product::getCategoryId, query.getCategoryId()) .eq(Product::getStatus, 1) // 只查询已上架的商品 .orderByDesc(Product::getCreateTime); // 执行查询 PageProduct page productMapper.selectPage(new Page(query.getPageNum(), query.getPageSize()), wrapper); // 转VO返回脱敏、补充额外字段 ListProductVO voList page.getRecords().stream().map(product - { ProductVO vo new ProductVO(); BeanUtils.copyProperties(product, vo); // 补充分类名称 vo.setCategoryName(categoryMapper.selectById(product.getCategoryId()).getName()); return vo; }).collect(Collectors.toList()); return new PageResult(voList, page.getTotal()); }这里用到了MyBatis-Plus的LambdaQueryWrapper体验比MyBatis原生的XML分页舒服太多。写这个接口的时候要注意一个细节不要select *明确列名有助于MySQL优化器更好地利用索引。前端拿到这个分页数据后用Vue的el-pagination组件渲染页码切页时重新调用接口即可。库存扣减的逻辑放在订单创建的Service方法里我这里建议在代码逻辑里先查一次库存如果库存小于购买数量则直接抛异常同时扣减库存后要在订单状态流转时才真正锁定这样可以避免超卖问题——当然如果真的要做严谨的并发控制需要引入Redis分布式锁或数据库乐观锁课设阶段可以用乐观锁版本号机制做一个简单演示。3.4 订单状态机设计订单模块是另一个值得展开的地方它的核心是状态流转。订单的状态我建议用int值管理对应关系为状态值含义可能的后续状态0待付款1已取消或 1已付款1已付款待发货2已发货2已发货3已签收3已签收4已评价4已完成无这个设计让你可以在写代码时加一个状态判断状态不匹配就不允许流转。比如用户想对一个状态为0的订单执行确认收货那就应该报错订单未付款不能确认收货。关于订单超时未支付自动取消这个功能课设阶段不用上消息队列和定时任务这些重型方案。最简单的做法是在查询订单列表时做一次延迟判断如果订单状态为0且创建时间距今超过30分钟把状态更新为5已取消。这种方式虽然不严谨但足够完成功能演示答辩时还能主动说目前是实现为查询时懒触发生产环境可以用RabbitMQ延迟队列显得你思考过扩展方向。4. 前端Vue工程搭建与页面实现4.1 Vue工程创建与项目结构组织前端这块我建议Vue 2 Element UI原因和SpringBoot选2.x一样资料多、坑少、看完能找到对应版本的教程。Vue 3虽然已经发布多年Element Plus也已经成熟但很多毕设教程还在用Vue 2你不会想在安装依赖这一步就跟版本杠上。用Vue CLI创建工程npm install -g vue/cli vue create farm-admin # 管理端 vue create farm-front # 展示端创建完管理端后安装Element UI和axiosnpm install element-ui npm install axios项目结构你可以按典型的Vue单页应用来组织src ├── api # 请求接口封装 │ ├── product.js │ ├── order.js │ └── user.js ├── assets # 静态资源 ├── components # 公共组件 ├── router # 路由配置 ├── store # Vuex状态管理 ├── utils # 工具函数含axios封装 ├── views # 页面组件 │ ├── admin # 管理端页面 │ ├── front # 展示端页面 │ └── login # 登录页一个非常重要的经验把所有接口请求统一封装到api目录下每个页面对应一个JS文件不要在每个Vue组件里直接写axios.get。统一封装后你可以很方便地在拦截器里加token头、统一报错处理、统一loading。不然等到你写到第九个页面突然改了接口地址全项目替换URL的场景会让你怀疑人生。4.2 登录鉴权与路由守卫下面重点说登录鉴权的前端部分。用户在登录页输入账号密码axios POST到后端/api/login后端校验通过后返回token和用户信息。前端把token存到localStorage用户信息存到Vuex刷新时再从localStorage读。然后在axios请求拦截器里给每个请求加上token// utils/request.js import axios from axios const service axios.create({ baseURL: /api, timeout: 15000 }) // 请求拦截器附加token 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) { Message.error(res.message || 请求失败) return Promise.reject(new Error(res.message)) } return res }, error { if (error.response error.response.status 401) { router.push(/login) } Message.error(网络异常) return Promise.reject(error) } )关键点来了路由守卫。如果用户未登录就访问管理页面前端要在router.beforeEach里检查是否存在token不存在就重定向到登录页。这一步不仅是为了安全更是一个很好的答辩讲解点——前端路由守卫后端拦截器双重校验构成了系统的访问控制链路。4.3 商品发布与图片上传的坑助农系统里必然有一个农户发布农产品的页面这里涉及图片上传。我的建议是图片上传做一个独立的upload接口POST /api/upload接收MultipartFile保存到服务器本地的一个upload目录或配置的云存储OSS返回可访问的URL。前端用Element UI的el-upload组件上传拿到URL后存进表单字段里最后随商品信息一块提交。这里有一个大坑开发环境下前端跑在8080端口图片保存在后端跑在8081端口直接用绝对路径存图片URL会导致前端访问不到。解决方案是在后端配置一个虚拟路径映射把自己的本地磁盘目录映射成/upload/**的访问路径。Configuration public class WebConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { String uploadPath System.getProperty(user.dir) /upload/; registry.addResourceHandler(/upload/**) .addResourceLocations(file: uploadPath); } }这样上传后的图片地址是http://localhost:8081/upload/xxx.jpg前端直接拿来放在img标签的src里就能访问了。4.4 前端页面与数据展示的实操细节前台展示端建议做这几个页面首页轮播图推荐商品助农资讯入口、商品列表页左侧分类右侧商品卡片、商品详情页图片轮播规格数量选择加入购物车、购物车页、订单确认页、订单列表页、个人中心页。管理端建议做数据看板用ECharts画几个简单的柱状图和折线图、商品管理、分类管理、订单管理、用户管理、资讯管理。商品列表页的筛选和排序是个练习Vue响应式的好场景。你可以在data里维护filter对象和sortType筛选条件变化时再调用一次接口获取新数据。在数据里加一个是否热门字段首页可以展示热门商品的标签既简单又增加页面的信息量。有一点必须注意前端展示的图片一定要做尺寸限制。农产品图片一般建议在800x800以内文件大小不超过500KB上传前用Element UI的before-upload钩子做一次文件大小和类型校验不然用户传一张5MB的手机照片管理后台商品列表加载直接卡成PPT。购物车功能可以用Vuex管理在store里维护一个cartList数组用getters计算总价数量变化时重新计算。订单提交时把cartList传给后端后端生成订单后前端清空购物车对应项。这个交互闭环写起来不难但是非常提升项目完成度。5. 环境配置与项目部署5.1 MySQL安装与建库配置要点MySQL的安装推荐用MySQL 5.7或者8.0不要装还在测试的版本。Windows安装版就是一个向导一直点下一步就行但有两个配置项建议手动指定一是字符集选utf8mb4二是端口保持默认3306不要图省事改成别的端口后面连接字符串容易出错。安装完成后用命令行或者Navicat创建数据库CREATE DATABASE farm_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;然后执行项目里提供的farm_system.sql文件导入表结构和基础数据。开发者账号密码要注意如果你本机MySQL密码是root/root记得把application.yml里的配置同步修改spring: datasource: url: jdbc:mysql://localhost:3306/farm_system?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver这里有个细节serverTimezone必须设置否则会用默认时区然后报时区异常。useSSL设置为false是为了避免无证书的SSL握手警告本地开发完全够用。5.2 前后端联调与环境一致性开发时最常见的痛点是前端8080端口访问后端8081端口导致的跨域异常。除了前面提到的后端CORS配置还有一个更一劳永逸的做法在Vue工程根目录创建一个vue.config.js文件配置开发代理。module.exports { devServer: { port: 8080, proxy: { /api: { target: http://localhost:8081, changeOrigin: true } } } }这样配置之后前端代码里所有以/api开头的请求都会被代理转发到后端8081端口并且后端接收到的请求头中的Host会被改写为8081从而避开跨域限制。注意axios的baseURL要设置为/api或者而不是http://localhost:8081否则代理不生效。后端接口的URL都写上统一的/api前缀这样前端代理配置和后端RequestMapping都是统一的看着舒服部署后Nginx也只需要转发一个前缀。5.3 打jar包与前端资源合并部署课程设计到了最终演示阶段需要把项目部署起来。一个很实用的技巧是把Vue构建后的静态资源直接放进SpringBoot的静态资源目录让后端同时承担前后端服务的职责这样交付时就只有一个jar包双击就能跑方便演示给老师看。具体操作是在前端工程目录执行npm run build构建完成后dist目录下会生成静态文件再把dist目录下的文件拷贝到后端工程的src/main/resources/static目录下。后端打包mvn clean package -DskipTests然后在target目录下得到farm-system.jar执行java -jar farm-system.jar浏览器访问http://localhost:8081即可看到前端页面。这里再提一下如果前端路由用了history模式需要后端配置一个转发——SpringBoot可以加一个控制器把所有非API的路径转发到index.html否则刷新页面会404。6. 常见问题与排查技巧6.1 后端起不来/报错的典型场景后端启动失败90%的锅在数据库连接和依赖注入上。如果你看到类似Unknown database的报错先去确认MySQL启动没有、数据库是否创建成功、账号密码是否正确。如果是Field xxxMapper required a bean of type的报错大概率是Mapper接口没有加Mapper注解或者启动类上没有加MapperScan(com.example.farm.mapper)。还有一种很常见的情况是端口被占用。SpringBoot默认8080端口如果你之前跑过别的项目还没关就会报Port 8080 was already in use。解决方式要么找到占用进程关掉要么在application.yml里改server.port。Lombok相关的报错多见于IDEA环境报找不到getter/setter方法。检查pom.xml里是否引入了lombok依赖IDEA是否装了Lombok插件以及Setting里Annotation Processing是否开启三个条件缺一个都会报错。我遇到过很多次换电脑导入项目后忘记开注解处理的情况排查思路先从这里入手。6.2 前端常见报错与运行异常前端启动报错先看npm install是否完整。node_modules目录缺失或依赖版本不匹配是新手最常见的坑。Vue工程装依赖后如果启动时提示Module not found: Cant resolve element-ui十有八九是依赖没装完全。页面能打开但接口数据加载不出来先按F12打开控制台看Network面板看看请求有没有发出去返回的状态码是多少。404说明接口地址不对检查请求URL和后端RequestMapping是否一致500说明后端代码报错去IDEA控制台看异常堆栈CORS error说明跨域配置没生效检查后端的CORS配置类或前端的代理配置。一个更容易被忽略的情况数据接口返回正常但页面上表格没有数据。打开Network看返回的data字段是否为空如果是大概率是MyBatis的Mapper XML中resultType映射的实体类路径不对或者字段名对不上导致查询结果无法映射。6.3 数据库层面的典型坑助农系统交付时MySQL服务是必须跑着的。我曾经见过有同学在教室演示时MySQL服务没启动项目直接瘫痪场面一度非常尴尬。所以最好把MySQL配置成Windows开机自启服务并在演示前提前确认3306端口是通的。另外一个很实际的坑是sql_mode。MySQL 8.0默认开启了only_full_group_by模式如果查询里用了group byselect的列不在group by里就会报错。有些同学拿到的参考代码是5.7环境写的在8.0上跑就挂。解决方案是在sql_mode里去掉了only_full_group_by或者改代码让查询符合规范。最后说一个表设计层面的建议给经常查询的字段加上索引。比如订单表的用户ID、商品表的分类ID。数据量几百条时感受不到差别但答辩前检查一下索引情况当场造几万条测试数据点查询给老师展示响应时间的变化这个细节能让项目的技术评分上一个档次。7. 个人实操心得与技巧总结7.1 时间规划与工作量控制毕设项目的推进节奏非常关键。拿这套助农管理系统举例我建议按三周时间规划第一周做需求分析、数据库设计、搭建前后端工程骨架完成登录注册和权限控制第二周完成后台的商品管理、分类管理和订单管理第三周做前台展示页面、购物车、个人中心最后两天集中做数据看板、组装数据和排练演示。为什么要这样规划因为前期的架构设计最费脑子数据库有误后面推倒重来成本极高。我曾经见过一个同学表设计时没有把order_item单独拆出来结果订单详情需要在一张表里存多个商品的JSON字符串后续统计销售排行根本没法写SQL最后只能把所有业务代码重写一遍。数据库设计多花三个小时后面少花三天。7.2 规避毕设当场翻车的几个细节演示前至少有四个事项需要确认。第一是MySQL服务确实在跑数据库能连上最好在演示电脑上提前跑一次jar包确定没有环境问题。第二是数据准备要充足不要只录两条商品就演示至少准备十来个商品、几个分类、若干条订单记录这样页面看起来才丰满老师也不会质疑功能的真实性。第三是准备好容错话术比如演示删除用户遇到外键约束时报错你要能解释这是数据库为保护数据完整性而做的约束设计而不是慌张地重启项目。第四是把项目打包成能在任意电脑一键启动的形态可以考虑写一个start.bat脚本一键启动MySQL服务和Java进程。7.3 后续可以扩展的方向这套系统做完之后有几个方向可以继续扩展。一个是引入Redis做缓存比如商品详情页的热点数据缓存、登录token的管理这样SpringBoot的中间件经验就补齐了。另一个是把模拟支付替换成微信支付沙箱环境的对接这个在简历上非常有分量。还有一个是做移动端适配——Vue项目加一个viewport适配让页面在手机上也能看配合微信内置浏览器就能做出一个轻量小程序的演示效果。我在实际带项目时反复说的一句话是毕设的本质不是为了交一个作业而是通过一个完整的项目把大学几年学到的技术串起来顺带在答辩和面试时有东西可讲。好好把这个项目吃透数据库多敲几条SQL后端多断点跟几个流程前端多调几个样式做完那一刻你会发现自己对全栈的理解完全不一样了。
RELATED

相关推荐

AI漫剧起号第一步:别急着学工具,先做对定位和题材

AI漫剧起号第一步:别急着学工具,先做对定位和题材

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

📅 2026/9/15 8:24:18
Unity Addressable资源管理系统核心原理与实战指南

Unity Addressable资源管理系统核心原理与实战指南

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

📅 2026/9/15 8:24:18
基于粒子群算法的PMU配置优化:MATLAB仿真与实现

基于粒子群算法的PMU配置优化:MATLAB仿真与实现

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

📅 2026/9/15 8:24:18
MORE NEWS

更多资讯

📰

串口服务器选型实战:从RS485到工业物联网的全面指南

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

📰

SpringBoot+Vue助农商城系统开发实战:从数据库设计到部署全流程

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

📰

AI漫剧起号第一步:别急着学工具,先做对定位和题材

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

📰

Unity Addressable资源管理系统核心原理与实战指南

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

📰

基于粒子群算法的PMU配置优化:MATLAB仿真与实现

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

📰

Claude Code十个实战技巧:从项目地图到自动化,让AI编程效率翻倍

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

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬