汽车租赁管理系统毕设实战:SpringBoot+Vue全栈项目复盘

发布时间:2026/10/8 3:47:36

汽车租赁管理系统毕设实战:SpringBoot+Vue全栈项目复盘 做毕设选题的时候很多同学第一反应是“图书管理系统”或“学生选课系统”但这些题目老师一眼就能看出是照着教程敲出来的作业。汽车租赁管理系统是另一个被我反复推荐的题目它围绕“车辆—订单—用户”三条主线业务上有一个完整的租赁闭环从车辆上架、用户选车、下单支付到取车、还车、计费结算每一环都有真实业务逻辑支撑。技术栈方面SpringBoot负责后端接口Vue负责前端页面Java作为主语言MySQL存数据这套组合既是JavaWeb的主流方向也完全符合课程设计、毕业设计的评审偏好。这篇文章我打算把整套系统的选题思路、表结构设计、核心订单逻辑、前后端联调以及答辩准备全部复盘一遍。源码角度上它是一套可以二次开发的SpringBootVue全栈项目学习角度上它覆盖了RESTful API、JWT鉴权、数据库事务、定时任务、组件化开发这些面试常考点。如果你是正在做毕设/课设的学生或者想找一套不重复的练手项目这篇可以直接当技术文档底稿来用。1. 为什么选“汽车租赁系统”当毕设业务闭环比技术堆砌更重要1.1 和图书管理系统对比它赢在哪里图书管理系统的核心操作只有两个借书、还书状态字段撑死就是“已借出/可借”。如果数据库只设计一张图书表和一张借阅表代码写起就是个纯增删改查答辩时你很难讲出深度。汽车租赁系统不一样的地方在于它的业务状态天生复杂。一辆车从空闲到被下单从用户取车到使用中再到还车结算中间还可能发生取消、超时、续租、押金扣款。状态一多你自然就会用到状态机的概念和代码封装。乐观锁或悲观锁处理并发下单。定时任务扫描超时未取车订单。条件更新UPDATE ... WHERE status ?避免脏更新。这不是为了炫技硬加的而是业务本身就长这样。答辩老师问“为什么这样设计”你可以每条都从业务场景讲而不是说“网上教程这么教的”。另外汽车租赁的认知成本很低。每个评委都租过车能快速理解你的系统在做什么而如果是医疗挂号、实验室管理这类领域老师还得先花五分钟理解业务名词。选题的第一原则不是看起来高大上而是让评委快速看懂并认可。1.2 功能边界先划好别让项目越做越大我在带学弟做课设的时候最常见的翻车方式就是前期疯狂加功能。今天想接微信支付明天想上高德地图后天又想搞个小程序端结果花了三周时间登录都没走通。汽车租赁管理系统如果想控制在可答辩、可演示的状态建议按下面这个“MVP边界”来定用户端前台注册、登录、浏览车辆列表、查看车辆详情、下单租车、查看我的订单、取消订单。管理端后台登录、用户管理、车辆管理、订单管理、车辆状态变更、基础数据统计。这个边界一共就三个核心表用户表、车辆表、订单表。加上车辆分类表和押金记录表也就五张表左右。数据量不大但一对多、多对多、枚举状态、时间范围查询这些关系都能覆盖到写进论文和答辩PPT都够用。如果你时间非常充裕再按优先级往后加超时费用自动计算 - 押金冻结/退还 - 车辆品牌分类筛选 - 月度经营报表。这几个功能每加一个论文里就能多一小节但注意加的时候不要破坏原有的状态机否则返工会很痛苦。1.3 角色划分和管理权限要提前想清楚系统涉及三类角色角色核心动作权限边界普通用户查看车辆、下单、取消订单只能操作自己的订单管理员管理车辆、审核订单、确认还车全部数据包括用户数据系统定时任务超时取消、状态维护只动状态字段我有一个建议哪怕你只做一个登录功能也把“角色”这个字段提前设计好。很多同学后期想加管理员后台发现用户表里没有role不得不迁移数据。角色字段用int或tinyint存例如1表示普通用户、2表示管理员不要直接用字符串“admin/user”因为数据库里字符串排序、索引都不如数字干净。2. 技术选型和工程结构SpringBootVueMySQL怎么组合最顺手2.1 后端为什么用SpringBoot MyBatis-Plus而不是JSP十年前的JavaWeb课设是JSPServletJDBC但放在今天无论从行业主流还是简历含金量来看SpringBoot都是更合理的选择。它内嵌Tomcat、自动装配依赖、简化了配置学生不需要懂大量XML和容器知识就能把项目跑起来省下来的时间正好用来把业务逻辑写扎实。持久层我用的是MyBatis-Plus。原因很直接单表CRUD不用手写SQL。比如车辆表的新增、列表分页、按ID查询MyBatis-Plus几乎零代码生成你只需要在Mapper接口里继承BaseMapperpublic interface CarMapper extends BaseMapperCar { }真正的重点精力就能全部集中在“租车业务逻辑”上而不是反复写INSERT INTO car(...) VALUES (...)。核心依赖这样加就够了dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.5/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /dependencyapplication.yml里的数据源和MyBatis-Plus配置也很常规spring: datasource: url: jdbc:mysql://localhost:3306/car_rental?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml configuration: map-underscore-to-camel-case: true注意map-underscore-to-camel-case一定要开否则数据库字段create_time和Java属性createTime对不上前端拿到的全是null。2.2 前端用Vue3 Element Plus页面组件化怎么拆前端我推荐Vue3 Vite Element Plus。Vue2官方早就不维护了现在网上搜Vue2教程很容易学一套过时技术所以直接用Vue3起步。组件拆分的核心原则是凡是出现两次以上的UI片段都抽成组件。比如车辆卡片在首页列表里出现在搜索结果里出现在管理后台里也要出现那就抽一个CarCard.vue传入一个car对象内部负责展示图片、价格、状态标签和操作按钮。典型目录结构如下src ├── api │ ├── auth.js │ ├── car.js │ └── order.js ├── router │ └── index.js ├── stores │ └── user.js ├── views │ ├── Login.vue │ ├── Home.vue │ ├── CarDetail.vue │ ├── OrderList.vue │ └── admin │ ├── AdminCar.vue │ ├── AdminOrder.vue │ └── AdminUser.vue └── components ├── CarCard.vue └── OrderStatusTag.vueAPI层统一用axios封装注意设置请求拦截器把JWT token自动加到请求头里service.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers[Authorization] Bearer token } return config })这样登录后的每一个请求都会自动带上身份凭证不需要在每个页面里手动写header。2.3 数据库表结构三张核心表就够撑起整个项目数据库设计是很多答辩老师第一个追问的点。我的建议是不要贪多但关键字段一个都不能少。用户表CREATE TABLE user ( id int NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL COMMENT 登录名, password varchar(100) NOT NULL COMMENT BCrypt加密后的密码, real_name varchar(20) DEFAULT NULL COMMENT 真实姓名, phone varchar(20) DEFAULT NULL, driver_license varchar(20) DEFAULT NULL COMMENT 驾驶证号, role tinyint NOT NULL DEFAULT 1 COMMENT 1普通用户 2管理员, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;车辆表CREATE TABLE car ( id int NOT NULL AUTO_INCREMENT, brand varchar(30) NOT NULL, model varchar(50) NOT NULL, plate_number varchar(20) NOT NULL COMMENT 车牌号, daily_price decimal(10,2) NOT NULL COMMENT 日租价, status tinyint NOT NULL DEFAULT 0 COMMENT 0空闲 1已租 2下架, image varchar(200) DEFAULT NULL, description varchar(500) DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_plate (plate_number) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;订单表CREATE TABLE lease_order ( id int NOT NULL AUTO_INCREMENT, order_no varchar(32) NOT NULL COMMENT 业务订单号, user_id int NOT NULL, car_id int NOT NULL, start_date date NOT NULL, end_date date NOT NULL, total_amount decimal(10,2) NOT NULL COMMENT 下单时计算的总金额, status tinyint NOT NULL DEFAULT 0 COMMENT 0待取车 1使用中 2已归还 3已取消, create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_user_id (user_id), KEY idx_car_id (car_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这里有几个设计经验值得展开第一个订单表里冗余了车辆当时的日租价和总金额而不是每次查询都去连车辆表算价格。因为车辆价格可能调整历史订单必须保留下单那一刻的价格否则结算时账对不上。第二个状态字段用tinyint不用varchar。0、1、2、3四档状态在程序里映射成枚举代码可读性高数据库查询也更快。第三个order_no生成规则。不要用数据库自增ID当订单号暴露给用户建议用yyyyMMddHHmmss 随机数或者UUID去掉横线组合。3. 核心业务实现让系统真正能扛住多人同时操作3.1 同一辆车被两个人同时下单怎么防止超卖这是整个系统最值得写的业务点也是答辩时最能体现你水平的部分。假设车辆A当前状态是空闲用户甲和用户乙同时发起租车请求。如果代码只是“查一下status0然后insert订单”两个请求都会通过导致一辆车同时被租给两个人。这跟电商超卖是一个道理。解决方案是使用MySQL的悲观锁。核心逻辑是在事务内用SELECT ... FOR UPDATE先把车辆记录锁住等事务提交后再释放锁。在此期间另一个事务的同一行查询会阻塞等待。Transactional public OrderDTO createOrder(OrderCreateRequest req) { // 1. 加锁查询车辆防止并发下单 Car car carMapper.selectByIdWithLock(req.getCarId()); if (car null || car.getStatus() ! 0) { throw new BusinessException(车辆已出租或不存在); } // 2. 校验租期计算金额 LocalDate start req.getStartDate(); LocalDate end req.getEndDate(); if (!start.isBefore(end)) { throw new BusinessException(租期不合法); } long days ChronoUnit.DAYS.between(start, end); BigDecimal amount car.getDailyPrice().multiply(BigDecimal.valueOf(days)); // 3. 插入订单 LeaseOrder order new LeaseOrder(); order.setOrderNo(generateOrderNo()); order.setUserId(req.getUserId()); order.setCarId(car.getId()); order.setStartDate(start); order.setEndDate(end); order.setTotalAmount(amount); order.setStatus(OrderStatus.CREATED.getCode()); orderMapper.insert(order); // 4. 更新车辆状态为已租 car.setStatus(1); carMapper.updateById(car); return convertToDTO(order); }对应的Mapper方法Select(SELECT * FROM car WHERE id #{id} FOR UPDATE) Car selectByIdWithLock(Long id);关键点有三个FOR UPDATE必须在事务内执行所以Transactional不能丢事务隔离级别下第二个请求会阻塞在查车辆那一步等第一个请求提交后它读到的已经是“已租”状态直接抛出业务异常车辆表的id是主键索引锁行非常快不会锁全表。我实测过并发场景用两个浏览器无痕窗口同时点下单窗口A成功窗口B弹出“车辆已出租”的提示完全符合预期。这一段代码写进论文比写十页“系统功能模块图”有说服力得多。3.2 订单状态机不要用一堆if else把状态逻辑写散订单状态如果直接用两个if判断初期很爽后期改需求会非常痛苦。比如“已取消”的订单能不能二次激活“使用中”的订单能不能直接删除如果状态逻辑散落各处你根本无法保证一致性。我建议在Java里建一个订单状态枚举public enum OrderStatus { CREATED(0, 待取车), RENTING(1, 使用中), FINISHED(2, 已归还), CANCELLED(3, 已取消); private final int code; private final String desc; OrderStatus(int code, String desc) { this.code code; this.desc desc; } public int getCode() { return code; } }合法流转只允许下面几条路当前状态触发动作后置状态待取车用户点击取车管理员确认使用中待取车用户取消/定时任务超时取消已取消使用中用户还车并结算已归还把这些流转封装在Service层比如一个transition(orderId, fromStatus, toStatus)方法Transactional public void transition(Long orderId, int fromStatus, int toStatus) { LeaseOrder order new LeaseOrder(); order.setId(orderId); order.setStatus(toStatus); int rows orderMapper.update(order, new UpdateWrapperLeaseOrder() .eq(id, orderId) .eq(status, fromStatus)); if (rows 0) { throw new BusinessException(订单状态已变更请刷新后重试); } }这段代码的精髓在WHERE id? AND statusfromStatus。如果两个请求同时操作同一个订单只有一个UPDATE能影响一行另一个会因为rows 0失败。这样就不需要额外加锁也避免了“订单被取消后又被人为还车”这种数据错乱。还车结算时要特别注意金额是否变化。如果用户超时归还超出的天数要另算超时费。这块可以单独写一个SettlementService不要塞进订单Controller里。3.3 定时任务清理“僵尸订单”现实场景中用户下单后一直不来取车车辆会被白白占用。所以系统需要后台任务自动把超时未取车的订单改成已取消并把车辆状态改回空闲。SpringBoot提供Scheduled注解一行开启Component public class OrderTimeoutTask { Scheduled(fixedDelay 60000) public void cancelExpiredOrders() { LocalDateTime deadline LocalDateTime.now().minusHours(1); // 找出创建时间早于当前时间1小时、且状态仍为待取车的订单 ListLeaseOrder expiredOrders orderMapper.selectList(new QueryWrapperLeaseOrder() .eq(status, OrderStatus.CREATED.getCode()) .lt(create_time, deadline)); for (LeaseOrder order : expiredOrders) { transition(order.getId(), OrderStatus.CREATED.getCode(), OrderStatus.CANCELLED.getCode()); // 恢复车辆为可租 Car car new Car(); car.setId(order.getCarId()); car.setStatus(0); carMapper.updateById(car); } } }注意启动类上要加EnableScheduling否则定时任务不生效。另外fixedDelay60000表示上次任务执行完再等60秒执行下一次。如果扫描耗时长建议用fixedDelay而不是fixedRate避免任务重叠。3.4 登录鉴权JWT 拦截器 角色权限基于SpringBoot的接口鉴权我建议使用JWT而不是原生Session。原因有两个一是前端和后端分离部署的时候Session天然存在跨域共享问题而JWT是放在请求头里的无状态随便跨 二是JWT本身就是面试常考内容用在毕设里等于白捡一道答辩题。生成token的核心代码大致如下String token Jwts.builder() .setSubject(String.valueOf(user.getId())) .claim(role, user.getRole()) .setExpiration(new Date(System.currentTimeMillis() 24 * 60 * 60 * 1000)) .signWith(SignatureAlgorithm.HS256, secretKey) .compact();然后写一个HandlerInterceptor在preHandle里校验token并放行Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token request.getHeader(Authorization); if (token ! null token.startsWith(Bearer )) { try { Claims claims Jwts.parser() .setSigningKey(secretKey) .parseClaimsJws(token.substring(7)) .getBody(); request.setAttribute(userId, claims.getSubject()); request.setAttribute(role, claims.get(role)); return true; } catch (Exception e) { // 解析失败说明token过期或伪造 } } response.setStatus(401); return false; }管理员接口怎么限制我建议在拦截器里判断请求路径比如/admin/**开头的路径必须role等于2。简单、直接学生也能解释清楚。密码存储一定用BCrypt不要用MD5。MD5撞库太容易面试官看到MD5基本会扣印象分。Spring Security的BCryptPasswordEncoder单独拿过来用就可以不需要引入完整Security框架因为课的周期真的不够。4. 前后端联调里的真实坑CORS、日期格式、图片上传4.1 跨域前端跑8080后端跑8081一调接口就报错前后端分离开发时最常见的第一个报错就是Access to XMLHttpRequest at http://localhost:8081/api/xxx from origin http://localhost:8080 has been blocked by CORS policy。解决跨域有三种思路按场景给你排好优先级开发阶段我推荐用Vite代理改vite.config.jsserver: { proxy: { /api: { target: http://localhost:8081, changeOrigin: true } } }这样所有前端请求都走/api开头Vite开发服务器帮你转发浏览器里看不到跨域。但如果需要临时跨域调试或者后端同学想单独测试接口还是建议在后端加一个全局CORS配置省心Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowedHeaders(*) .allowCredentials(true) .maxAge(3600); } }日常练习这么写没问题。生产部署我建议把allowedOriginPatterns换成具体的域名别一直用*。4.2 LocalDateTime序列化2023-08-01T12:00:00的锅后端实体如果直接用LocalDateTimeSpringBoot默认序列化成ISO标准格式比如2023-08-01T12:00:00。前端拿到这个字符串直接展示很难看插入日期控件时还可能解析失败。统一解决方法是加一个Jackson全局配置Configuration public class JacksonConfig { Bean public Jackson2ObjectMapperBuilderCustomizer customizer() { return builder - { builder.simpleDateFormat(yyyy-MM-dd HH:mm:ss); builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss))); builder.deserializers(new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss))); }; } }如果是日期字段而不是时间字段比如租车的startDate直接用java.time.LocalDate加JsonFormat(pattern yyyy-MM-dd)就够了避免把时分秒也传过去。4.3 图片上传刷新之后图片404问题不在图片本身车辆管理肯定要传车辆图片。SpringBoot默认把静态资源映射到classpath:/static/你如果用MultipartFile.transferTo()把图片写到本地磁盘的D:/upload/目录访问http://localhost:8081/upload/xxx.jpg会直接404因为磁盘路径并没有映射到HTTP路径。解决办法是重写资源映射Configuration public class WebConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 路径 /upload/** 映射到磁盘路径 /Users/yourname/upload/ registry.addResourceHandler(/upload/**) .addResourceLocations(file:D:/upload/); } }这里踩过的一个坑是Linux部署路径。本地Windows写file:D:/upload/没问题但部署到服务器后路径就不对了。我的建议是把上传根目录写在一个配置项里比如app.upload-dir代码里用Value(${app.upload-dir})读取换环境只改配置文件。另外删除车辆时别只删数据库记录磁盘里对应图片文件也尽量删掉否则时间长了磁盘会堆积一堆没人引用的图片。5. 部署、演示与答辩准备从能跑到讲得出5.1 打包策略前后端合一个jar还是分开部署答辩演示最忌讳现场启动两个进程还要让老师看命令行。我建议把前端打包产物塞进SpringBoot的static目录打成一个jar独立运行# 1. 前端构建 npm run build # 2. 把dist目录内容复制到后端 static 目录 cp -r dist/* ../backend/src/main/resources/static/ # 3. 后端打包 mvn clean package -DskipTests # 4. 运行 java -jar target/car-rental-0.0.1-SNAPSHOT.jar这样只有一个8081端口浏览器直接访问http://localhost:8081/就能看到前端页面接口变成同源CORS问题也彻底消失。如果你打算部署到云服务器更标准的方式还是nginx托管前端静态文件、反向代理后端接口。nginx配置核心就一段server { listen 80; server_name yourdomain.com; location / { root /opt/car-rental/dist; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8081/api/; } }注意try_files必须写否则用户深度刷新路由时比如直接访问/order/listnginx不知道怎么处理就会404。5.2 初始化数据与演示脚本答辩不翻车的底线很多同学在演示时最尴尬的一幕是数据库里没数据界面一片空白只能现场手动录入。建议用SpringBoot的SQL初始化机制启动时自动建表并插入演示数据spring: sql: init: mode: always schema-locations: classpath:sql/schema.sql >
延伸阅读

更多相关文章

2026/10/8 3:47:36

AI Coding工作流实战:校招生如何在大厂高效开发

1. 先交代背景:校招生的困境与我的破局思路1.1 入职第一个月,我被真实项目"毒打"的场景我是去年通过校招进的大厂,做的后端开发。进组之前,我自认为代码能力还行,算法题刷了不少,项目也做过几个。…

2026/10/8 3:47:36

飞算JavaAI智能会话模式实战:从需求到代码的高效编程体验

现在提起AI编程,大多数人脑子里冒出来的还是IDE里的智能补全:敲一个方法名,后面就跟着冒出几行参数和返回值。这套东西确实能用,但真要让它正儿八经帮你把一段业务逻辑、一个接口、几十行测试用例全安排好,总觉得差了点…

2026/10/8 3:42:36

常驻智能体安全:从权限最小化到对抗性测试

2026年10月1日,我整理完手头几个智能体项目的安全评审意见,脑子里蹦出一句很直白的话:智能体开始“常驻”,安全成了入场券。过去两年,圈子里聊智能体,核心话题一直是“怎么让它更聪明”:更强的模…

2026/10/8 4:53:03

AI应用底座QuickBlue:从Demo到生产的工程化实践

1. 从一个尴尬的现场说起:为什么“能跑起来的AI Demo”和“能上线的AI应用”之间隔着一道鸿沟我见过太多团队在AI这件事上卡在同一个位置:Demo阶段惊艳全场,上线阶段一地鸡毛。演示的时候,一个Python脚本调一下模型接口&#xff0…

2026/10/8 4:53:03

开源大模型权重质变:蒸馏量化与Apache 2.0许可证实战

1. 从“权重文件”说起:为什么开源模型突然变得能打了如果你最近半年在折腾大模型,大概率会有一种感觉:以前那些“开源模型只能玩玩”的说法,正在被一个个具体的权重文件打脸。我最早接触开源权重是在做一些本地推理验证的时候&am…

2026/10/8 4:53:03

企业网络方案课程设计:VLAN、OSPF与VRRP冗余配置实战

简介:以小型企业局域网为背景的计算机网络课程设计方案,是计算机专业学生完成的一份完整课程设计报告。报告从课程设计目的与要求出发,依次给出星形拓扑结构图、网络划分与局域网建立方案,将网络划分为管理网、办公网、生产网三个…

2026/10/8 4:53:03

AI智能客服系统源码实战:架构、部署与二次开发

简介:这是一套基于PHP开发的AI智能客服系统完整源码包,面向需要快速搭建在线客服平台的开发者、企业技术人员及PHP学习者,主打智能问答、全渠道统一管理、客户信息管理、常见问题知识库、违禁词过滤等功能,可有效降低人工客服压力…

2026/10/8 4:53:03

Gemini免费额度调整:Flash-Lite迁移实战与效果验证

1. 这次调整到底动了谁的蛋糕10月9日这个时间节点,对很多把Gemini API接进自己项目里的开发者来说,算是一个不大不小的分水岭。核心变化就一句话:免费额度的模型档位被压缩了,Pro和标准Flash从免费池子里撤出,只剩Flas…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/7 8:18:33

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

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

2026/10/8 0:02:17

自然数立方等于连续奇数之和:从证明到编程验证

十几年来我一直游走在数学科普和编程教学这两块内容之间,对“看起来像魔法、拆开全是数学”的结论总是格外敏感。最近翻资料时又撞见一句话:任何一个自然数 m 的立方,都可以写成 m 个连续奇数之和。2 的立方等于 3 加 5,3 的立方等…

2026/10/8 0:02:17

C#上位机SSH连接实战:用SSH.NET补齐超时、批量与密钥认证

简介:这是一份基于 C# 开发的 SSH 连接功能半成品工程,原本作为另一个主项目的子功能模块,现独立打包分享。工程采用 WinForms 界面,包含源码、解决方案、安装部署工程、NuGet 依赖包及说明文档,适合正在做远程连接、网…

2026/10/8 0:02:17

Java SpringBoot一体化智能售后系统设计与实现全解析

毕业设计年年做,Java Web 方向的题目翻来覆去就那么几个,但“一体化智能售后系统”这个题,每次看到我都觉得值得认真聊一聊。它不是一个简单 curd 堆出来的管理系统,而是把客户、工单、派单、处理、回访、统计整条链路串起来的一套…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑