新闻详情

新闻详情

首页 / 资讯中心 / 详情

servlet+JDBC实战:设备维修管理系统JavaWeb课程设计全攻略

发布时间:2026/9/28 12:20:29来源:尧图网络
servlet+JDBC实战:设备维修管理系统JavaWeb课程设计全攻略
简介这是一份基于原生Servlet和JDBC的JavaWeb设备维修管理系统完整项目源码适合计算机、软件工程等专业学生用于课程设计、期末大作业或毕业设计参考也可作为初学JavaWeb分层开发与数据库编程的实战案例。项目涵盖设备报修、维修记录、零件与客户管理等核心模块源码内含54个Java类与配套Servlet、JSP页面及数据库脚本可通过sql文件快速初始化环境。压缩包共248个文件除Java源码与编译后的class外还包含前端所需的js、css、图片jpg/png/svg以及项目配置文件整体大小仅2.84MB结构清晰、便于携带与部署。该资源发布后已有346人学习使用对于想看懂原生Servlet流程、JDBC操作和MVC思想的读者能提供从页面到数据库的完整对照参考并且可以根据自身业务需求进行二次开发与功能扩展。1. 设备维修管理系统的servletJDBC骨架为什么老技术还是课程设计的首选距离提交课程设计还有两周你从网盘里下到一个“设备维修管理系统源码项目说明.zip”解压一看一堆.java、一个web.xml、一个.sql脚本。这个场景我再熟悉不过。这个标题背后是一个典型的JavaWeb完整案例——用原生servlet处理请求、用JDBC操作MySQL没有Spring没有MyBatis。它几乎覆盖了JavaWeb入门的全部要点servlet生命周期、请求转发、JDBC增删改查、三层结构。对刚学完JavaWeb的人来说把这套代码跑通、读懂、再改出一个自己的功能比直接上手SpringBoot更能建立体感。我见过太多人一上来就写SpringBoot结果连请求怎么进Controller都说不清。servletJDBC没有过时它反而是看清SpringBoot那个黑匣子的最好参照物。这篇文章就帮你把这个zip变成你真正掌握的东西。2. 解压到跑通建库、IDEA导入与Tomcat部署的三步配置这类项目源码的基本结构是固定的src下面按bean、dao、servlet、util几个包组织web目录里是jsp页面和WEB-INF/web.xml根目录通常还有一个 db.sql 或 init.sql。第一步不是急着读代码而是先把环境跑通。常见做法是MySQL建库 → IDEA导入项目并配置Tomcat → 启动后登录。顺序反了会出事比如你先把代码读完结果发现连库都连不上前面全白看。2.1 建库与数据初始化先把MySQL这一侧搞定先看zip里有没有.sql文件这个项目大概率带一个类似 eq_repair.sql 的脚本。打开MySQL命令行或者Navicat新建一个库然后导入脚本CREATE DATABASE IF NOT EXISTS eq_repair DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE eq_repair; SOURCE /your/path/eq_repair.sql;这段SQL的作用是先创建一个支持中文的库再把表结构和初始数据跑进去。utf8mb4 不是可选项——如果你用的是旧版 utf8插入“报修人”这种中文偶尔能进但遇到特殊符号就会报 Incorrect string value。这个坑在Windows上尤其常见因为MySQL客户端默认字符集和数据库不一致。导入完成后执行 SHOW TABLES; 确认表存在再执行 SELECT * FROM t_user; 看看默认管理员账号是否已经初始化。很多项目说明里会写默认账号是admin/admin123但我每次都自己查一遍源码作者未必改过密码字段你按说明登录失败的时候多半就是这里出了问题。注意老项目的数据库连接配置通常写在 src 目录下的 db.properties 或者 DBUtil.java 里用户名、密码、IP都要改成你自己的这一步放到下一节和IDEA配置一起做。2.2 idea运行javaweb项目配置导入IDEA并让Tomcat认识你的项目这是检索最多的一步我写细一点。用IDEA打开项目时选 Open直接指向解压后的文件夹。如果IDEA没有识别成Web项目右键项目根目录 → Add Framework Support → 勾选 Web ApplicationIDEA会补出WEB-INF目录结构并生成web.xml。接下来是最容易绕晕的部分按顺序做第一步Project StructureCtrlAltShiftS→ Project确认Project SDK是1.8或你本机版本Language level对应。第二步Modules → Dependencies把Tomcat自带的servlet-api.jar加进来否则servlet类全部报红。这个jar不要打包进war后面避坑章会讲。第三步Modules → 选中模块 → 点加号 → Web设置Web资源目录为 src/main/webappWeb.xml路径指向web.xml。第四步Artifacts → 点加号 → Web Application: Exploded → From Modules。这一步决定了Tomcat加载的是编译后的classes加web目录而不是零散源码。第五步配置TomcatRun → Edit Configurations → 加Tomcat Server Local在Deployment里加上刚才的artifactApplication context建议改成 /eq_repair。第六步回到Server标签把Before launch里的Build加上确保每次运行前重新编译。Context path/eq_repair docBaseE:/workspace/eq_repair/src/main/webapp/如果你习惯手写Tomcat的conf/server.xml上面是常见写法。但我不建议这么干——直接在IDEA的Deployment里配置Application context就行。手写server.xml一旦路径写错Tomcat启动时能把你卡到怀疑人生。IDEA配置的好处是每次Run都会自动检查编译错误war exploded模式的调试速度也远快于打包war再部署。运行后看到日志里出现 Deployment of web application ... has finished再访问 http://localhost:8080/eq_repair/login.jsp能出登录页就说明环境没问题。我把检查项整理成一张表遇到启动后404直接对着查检查项预期结果不对时去哪看Project SDK1.8Project StructureDependencies里有servlet-apiservlet代码不报红ModulesArtifacts输出包含web目录页面可访问ArtifactsDeployment里有artifact启动不报404Run ConfigurationsApplication context为/eq_repairURL与代码跳转匹配Deployment2.3 不用IDEA的人vscode写servlet的环境配置有同学问vscode编写servlet代码需要怎么配置环境。能用IDEA尽量用IDEA不是因为vscode不行而是servlet这种需要容器托管的调试流程在vscode里要组合三样东西Java Extension Pack负责语言支持、Tomcat插件负责部署、再手动在launch.json里配调试端口。日常流程是把项目打成war丢进Tomcat的webapps目录然后盯着catalina.out日志看。能跑但每次改代码都要重启容器调试断点配置也折腾。我一般只在服务器端临时改点东西时才用vscode加远程日志查看。课程设计阶段认准IDEA这条路更省心。3. 读懂核心代码从servlet生命周期到JDBC增删改查的完整链路环境跑通后开始读代码。我的阅读顺序固定web.xml → 一个Servlet → DBUtil → 一个DAO。web.xml在旧式servlet项目里是路由中枢虽然新规范可以用WebServlet注解但课程设计项目用web.xml的占大多数。这里面最有价值的两个点是servlet生命周期和JDBC模板写法这两块吃透整个系统在你眼里就没有黑匣子了。3.1 用一个登录Servlet看懂servlet生命周期项目里大概率有个LoginServlet。servlet生命周期的定义网上很多落到代码上就是这几个方法WebServlet(/login) public class LoginServlet extends HttpServlet { Override public void init() { System.out.println(servlet 初始化只在第一次访问时执行); } Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(UTF-8); String username req.getParameter(username); String password req.getParameter(password); UserDao dao new UserDao(); User user dao.findByUsernameAndPassword(username, password); if (user ! null) { req.getSession().setAttribute(loginUser, user); resp.sendRedirect(req.getContextPath() /repair/list); } else { req.setAttribute(msg, 账号或密码错误); req.getRequestDispatcher(/login.jsp).forward(req, resp); } } Override public void destroy() { System.out.println(servlet 销毁容器关闭时执行); } }这里生命周期可以串成一句话Tomcat第一次收到 /login 请求时反射创建LoginServlet实例调用init()完成初始化之后每个请求都交给service()分发到doGet或doPost容器正常关闭时调用destroy()。这条链路里有两个坑位一是init()只执行一次而service()是并发执行的所以不要在doPost里往成员变量写业务数据多线程下会互相污染二是如果重写了service()记得写super.service(req, resp)否则doGet/doPost永远不会被调用。参数说明req.getParameter取的是表单或URL里的参数和POST请求体里的键对应req.getSession()获取当前会话setAttribute存登录标记sendRedirect是重定向浏览器地址会变forward是转发地址不变但可以把msg这类提示数据放在request域里带给JSP。模板里的findByUsernameAndPassword就是下一步要讲的JDBC操作。3.2 JDBC工具类与增删改查从getConnection到PreparedStatementJDBC整套操作可以压缩成一个DBUtil类加若干DAO方法。项目里DBUtil通常长这样public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/eq_repair?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8; private static final String USER root; private static final String PASSWORD 123456; static { try { Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }驱动加载放在static块里保证类只会被加载一次。URL里的三个参数都是这几年折腾出来的血泪经验useSSLfalse 是为了避免MySQL 8默认启用SSL导致控制台刷警告serverTimezoneAsia/Shanghai 是因为MySQL 8驱动要求显式指定时区不写会报时区错误或者显示成乱码characterEncodingutf8 保证传输层字符集正确配合页面和request编码三层任何一层掉链子中文都会变问号。有了DBUtilJDBC增删改查的模板就统一了。以用户注册为例这是jdbc插入用户数据最常见的场景public int insertUser(User user) { String sql INSERT INTO t_user(username, password, real_name, role) VALUES(?, ?, ?, ?); try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, user.getUsername()); ps.setString(2, user.getPassword()); ps.setString(3, user.getRealName()); ps.setInt(4, user.getRole()); return ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); return 0; } }try-with-resources是Java 7之后的写法Connection和PreparedStatement用完后自动关闭不用再写finally。PreparedStatement相比Statement有两个核心优势用?占位符避免拼接SQL导致的注入问题预编译对重复执行更友好。返回值executeUpdate()表示影响行数大于0说明插入成功。查询时换成executeQuery()用ResultSet逐行取值public User findByUsername(String username) { String sql SELECT * FROM t_user WHERE username ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, username); try (ResultSet rs ps.executeQuery()) { if (rs.next()) { User u new User(); u.setId(rs.getInt(id)); u.setUsername(rs.getString(username)); u.setRealName(rs.getString(real_name)); return u; } } } catch (SQLException e) { e.printStackTrace(); } return null; }注意ResultSet也要放在try-with-resources里连接关了结果集还占着资源。rs.next()每调用一次游标下移一行第一次调用时指向第一行所以判断“有没有数据”就是if(rs.next())。这套代码的组织方式和黑马JavaWeb笔记里的用户管理案例高度重合跟过那份笔记的话读起来会非常顺。3.3 再看一遍jdbc url这些参数到底一行一行在干什么本地能跑、换个机器就崩八成是连接串和驱动不匹配。我把jdbc url的参数拆开列一下参数示例值作用常见错误driverClasscom.mysql.cj.jdbc.Driver注册驱动类MySQL 8必须用cj版ClassNotFoundExceptionserverTimezoneAsia/Shanghai指定数据库服务器时区时区报错乱码useSSLfalse关闭SSL握手本地开发免证书配置警告刷屏characterEncodingutf8驱动传输字符集中文问号allowPublicKeyRetrievaltrueMySQL 8配合caching_sha2_password用户时需要Access denied for user这套参数只针对MySQL。如果项目说明里写的是sqlserver连接串完全是另一套SQL Server驱动还多一个 targetServerType 参数来指定连镜像还是主库课程设计用sqlserver的少因为驱动jar和连接串都更绕。认准 mysql 是这套源码的主线jdbc url照表核对就够了。4. 设备、工单与用户维修管理系统的业务闭环怎么建模设备维修管理系统名字听起来大业务其实收敛得很清楚用户登录、设备登记、报修、维修进度更新、历史记录。这正好是javaweb项目完整案例mysql最常见的骨架也是这类课程设计案例源码的典型特征。读懂业务模型是你改造项目的前提——答辩时被问得最多的就是这里。4.1 三张表的结构设计与关系核心表一般是三张t_user用户、t_device设备、t_repair维修工单。t_user表一般有id、username、password、real_name、rolerole字段区分管理员和普通报修人。t_device表有设备编号、名称、型号、所在位置、状态。最容易让新手懵的是这桩状态字段的设计字段名类型含义建议取值device_statusvarchar(20)设备当前状态正常 / 待维修 / 维修中 / 已报废repair_statusvarchar(20)工单处理状态已提交 / 处理中 / 已完成 / 已关闭create_timedatetime报修时间默认CURRENT_TIMESTAMPfinish_timedatetime完成时间维修完成后更新三张表的关系一句话讲明白一个用户报修人可以提交多个维修工单一个工单关联一台设备维修工更新工单状态。也就是说 t_repair 是关联核心拿repair表的device_id关联t_device拿user_id关联t_user。画图的时候不要画成设备直接挂用户中间隔着工单这也是业务建模里最容易答错的一问。4.2 维修工单流转从提交到归档的servlet内部流程工单状态流转是系统的关键业务点。管理员查看报修列表、维修工接单、维修完成更新状态每一步对应一个servlet方法加一次update操作。完整的项目会把状态做成枚举类简单项目直接用字符串判断。核心更新逻辑一般写在RepairServlet里protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(UTF-8); String action req.getParameter(action); int repairId Integer.parseInt(req.getParameter(id)); RepairDao dao new RepairDao(); if (accept.equals(action)) { dao.updateStatus(repairId, 处理中, new Date()); } else if (finish.equals(action)) { dao.updateStatus(repairId, 已完成, new Date()); } else if (close.equals(action)) { dao.updateStatus(repairId, 已关闭, null); } resp.sendRedirect(req.getContextPath() /repair/list); }action参数是servlet项目里常见的判断手法一个servlet用不同参数区分操作省得每个功能写一个类。对应DAO里的updateStatus就是update模板public int updateStatus(int id, String status, Date finishTime) { String sql; if (finishTime ! null) { sql UPDATE t_repair SET repair_status?, finish_time? WHERE id?; } else { sql UPDATE t_repair SET repair_status? WHERE id?; } try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { if (finishTime ! null) { ps.setString(1, status); ps.setTimestamp(2, new Timestamp(finishTime.getTime())); ps.setInt(3, id); } else { ps.setString(1, status); ps.setInt(2, id); } return ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); return 0; } }这里有一个容易忽略的参数细节java.util.Date 不能直接set进PreparedStatement要先转成 java.sql.Timestamp否则报类型不匹配。另外用 finishTime 是否为null来决定SQL说明“已关闭”的工单不需要完成时间这是业务上的合理区分关闭是管理员强制终止完成是维修工正常结单。4.3 列表查询分页与状态筛选是改造重点维修工单列表页是这套系统里最常被翻新改造的部分。刚拿到源码时列表多半是全量查询public ListRepair findPage(int page, int size, String status) { StringBuilder sql new StringBuilder(SELECT * FROM t_repair WHERE 11 ); ListObject params new ArrayList(); if (status ! null !status.isEmpty()) { sql.append(AND repair_status ? ); params.add(status); } sql.append(ORDER BY create_time DESC LIMIT ?, ?); params.add((page - 1) * size); params.add(size); // 执行查询把ResultSet逐行封装成Repair对象 }这段值得花时间读因为它在单一查询里演示了三样东西StringBuilder拼接动态SQL应对“状态筛选可选”的常见姿势注意每段拼接后都留了一个空格防止关键字粘连参数List配合PreparedStatement批量设值避免动态条件多时维护大量setXxx调用LIMIT ?, ?是最原始的分页方式page从1开始偏移量是(page-1)*size。这里11不是炫技是为了让后续AND条件不需要判断是不是第一个条件SQL拼接里的通用省心写法。很多课程设计的列表页要显示设备名称但t_repair表里只有device_id没有device_name。所以DAO里通常要关联查询SELECT r.*, d.device_name, d.device_model FROM t_repair r LEFT JOIN t_device d ON r.device_id d.id。注意用LEFT JOIN而不是INNER JOIN因为有些工单可能关联着已删除设备LEFT JOIN能保证工单记录不会因为设备缺失而消失。这也是改造时容易翻车的一个点。5. 避坑日志servletJDBC项目最容易翻车的5个现场这个标题的zip我前后帮人调试过不少次下面5个问题出现频率最高。每一条按现象、原因、解决写可以直接当排查手册用。5.1 页面404但代码和配置看起来全对现象Tomcat能启动访问 http://localhost:8080/eq_repair/login.jsp 直接404IDEA控制台不报任何异常。原因多半是Artifacts没有把web目录纳入构建范围或者Deployment里没添加artifact。很多人把web.xml改了一百遍却忘了一件事IDEA里Tomcat运行的是编译后的out目录下的东西不是你的源码目录。web资源没有跟随artifact输出Tomcat根本看不到JSP。解决Project Structure → Artifacts → 检查项目名: war exploded 的Output Layout里是否包含 src/main/webapp。然后在Run Configuration → Deployment里确认artifact已添加Application context填的是/eq_repair而不是/。改完Build → Rebuild Project。5.2 ClassNotFoundException: com.mysql.cj.jdbc.Driver现象启动后第一次访问数据库报ClassNotFoundException报的是 com.mysql.cj.jdbc.Driver。原因MySQL Connector/J版本与驱动类不匹配。MySQL 8的驱动类必须是 com.mysql.cj.jdbc.DriverMySQL 5.1.x及以前是 com.mysql.jdbc.Driver。很多zip里带的jar是老版本你自己装的是MySQL 8代码没改就崩。解决去Maven中央仓库手动下载 mysql-connector-java-8.0.x.jar放到WEB-INF/lib目录再改DBUtil里的Class.forName和URL。最稳的组合驱动8.0.x MySQL 8.0 URL带serverTimezoneAsia/Shanghai。5.3 用Maven导入依赖持续报 download from maven failed现象pom.xml里写了mysql依赖IDEA右下角一直提示下载失败或者卡在Resolving Maven Dependencies。原因这不是网络玄学多半是IDEA内置Maven源连不上中央仓库或者公司网络策略挡掉了 repo.maven.apache.org。解决打开Maven的settings.xml加阿里云镜像mirror idaliyunmaven/id mirrorOfcentral/mirrorOf namealiyun maven mirror/name urlhttps://maven.aliyun.com/repository/public/url /mirror改完删掉本地仓库里对应jar的.lastUpdated后缀文件重新import。如果还不行我的土办法是直接用浏览器打开Maven仓库下载jar放进WEB-INF/lib。很多课程设计zip本身不是Maven工程是普通JavaWeb工程jar放lib最直接省得跟Maven较劲。5.4 插入用户数据后中文全是问号现象注册用户输入中文提交后数据库里存的是??。英文数字正常。原因这条链路有四个字符集关卡坏任何一关中文就废JSP页面本身的contentType、request.setCharacterEncoding、数据库连接串的characterEncoding、MySQL表结构的字符集。最常见的是request.setCharacterEncoding没写在doPost第一行或者干脆没写。解决doPost第一行调用req.setCharacterEncoding(UTF-8)检查JSP头是 % page contentTypetext/html;charsetUTF-8 pageEncodingUTF-8% 确认连接串里有characterEncodingutf8再在MySQL执行 ALTER TABLE t_user CONVERT TO CHARACTER SET utf8mb4。注意这四步顺序不能乱先改代码再改库。MySQL里已有的乱码数据不会被ALTER自动修正改完字符集只影响后续插入的新数据。5.5 表单提交后405或者日志里看不到doPost现象登录页提交后浏览器报405 Method Not Allowed后台日志显示service方法抛错或者用户点了提交按钮控制台打印的却是doGet。原因两种情况。第一种表单methodget而Servlet只写了doPost容器找不到对应方法返回405。第二种重写了service()却忘记调用super.service(req, resp)doGet和doPost完全没有进入。解决修改类操作统一用POST提交。重写service时如果不是要完全接管请求分发第一行就写上super.service(req, resp)。想知道当前到底在执行哪个方法最直接的办法是在service里打一行日志servlet生命周期就是这么一层层看出来的不要靠猜。6. 加一个导出功能练手把维修记录变成CSV文件到这里这个设备维修管理系统你已经能跑通、读懂了。最后我建议你亲手加一个功能验证自己到底吸收了没有按时间范围导出维修记录。麻雀虽小但把servlet响应输出、JDBC查询、中文文件名处理全串起来了。WebServlet(/repair/export) public class ExportServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(UTF-8); String begin req.getParameter(begin); String end req.getParameter(end); resp.setCharacterEncoding(UTF-8); resp.setContentType(text/csv;charsetUTF-8); String fileName repair_ begin _ end .csv; resp.setHeader(Content-Disposition, attachment;filename URLEncoder.encode(fileName, UTF-8)); PrintWriter out resp.getWriter(); out.write(\uFEFF); out.println(工单号,设备名称,状态,报修时间); try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement( SELECT * FROM t_repair WHERE create_time BETWEEN ? AND ? ORDER BY create_time DESC)) { ps.setString(1, begin); ps.setString(2, end); try (ResultSet rs ps.executeQuery()) { while (rs.next()) { out.println(rs.getInt(id) , rs.getString(device_name) , rs.getString(repair_status) , rs.getTimestamp(create_time)); } } } catch (SQLException e) { e.printStackTrace(); } out.flush(); } }6.1 导出功能的验证方法与三个易踩点导出后做三件事验证打开CSV检查中文是否正常确认Excel能识别UTF-8再连续导出两次观察日志。这里我强调三处很容易踩的地方。第一resp的setCharacterEncoding必须在getWriter()之前并且和页面、数据库三层保持一致否则中文在部分Excel版本上会乱码。第二out.write(\uFEFF)是在写UTF-8的BOM头这一步能让Windows下的Excel正确识别UTF-8编码的CSV。我第一次做时没写这行WPS打开正常Excel打开乱码浪费了半个下午。第三文件名用URLEncoder转一下不然带连字符和日期的文件名在部分浏览器里会被截断。导出功能做完顺手验证一下servlet生命周期在ExportServlet里加init和destroy的日志反复导出几次观察init是否只打印一次再重启Tomcat看destroy是否触发。这套观察做完回头再看当初那些404、ClassNotFoundException你会觉得servletJDBC这条老路走得特别值。这套代码值得你投入时间——不要急着转SpringBoot先把这个系统里每一次请求从浏览器到数据库再回来的路径讲清楚你自己的后端地基才算真正打稳了。我的习惯是每个功能做完都留一张截图和一个验证SQL答辩时直接摆数据比空口说“我做了个导出”有说服力得多。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

远控软件选择指南:需求场景、技术指标与实操避坑经验 2026/9/28 14:48:53

远控软件选择指南:需求场景、技术指标与实操避坑经验

你有没有过这种时刻:人在地铁上,突然想起一个重要文件存在家里电脑的桌面上;或者在休假中收到一条“服务器好像挂了”的消息;又或者是接到爸妈电话,电脑弹了个窗口他们不知道怎么关。这时候你需要的大概不是视频通话&a…

阅读更多 →
ESP32反复重启?CH340K混搭供电的3个隐藏坑与解决方案 2026/9/28 14:48:53

ESP32反复重启?CH340K混搭供电的3个隐藏坑与解决方案

1. 从一次诡异的ESP32反复重启说起如果你正在用 CH340K 给 ESP32 下载程序,同时板子上还有另一路独立电源给 MCU 供电,那你大概率已经踩过或者即将踩到一个非常隐蔽的坑:ESP32 在运行过程中毫无规律地断电重启,串口日志里反复出现…

阅读更多 →
AI智能体L1-L5分级安全框架:从模型安全到行为安全 2026/9/28 14:48:27

AI智能体L1-L5分级安全框架:从模型安全到行为安全

AI 安全最近在圈子里真的是高频词,尤其是那份“通用型 AI 智能体 L1-L5 分级安全框架白皮书”出来之后,很多做模型、做 Agent、做 RAG 的朋友都在转。我也把这份东西从头到尾啃了一遍,结合自己实际在项目里踩过的坑,发现这个分级框…

阅读更多 →
嵌入式通信协议详解:I2C、SPI、UART、I2S对比与选型实战 2026/9/28 14:48:27

嵌入式通信协议详解:I2C、SPI、UART、I2S对比与选型实战

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

阅读更多 →
AI能替代三维建模吗?从可编辑性与工作流看真实边界 2026/9/28 14:48:27

AI能替代三维建模吗?从可编辑性与工作流看真实边界

上午的例会上,实习生把一张写满建模需求的需求单直接黏进AI对话框,三分钟不到,屏幕上弹出一个“完成”的草模。我盯着那个模型看了半分钟,然后让他把文件存进“废弃方案”文件夹——不是AI做错了什么,而是它生成的这坨…

阅读更多 →
银河麒麟v10下VSCode与Qt 5.15.2开发环境配置指南 2026/9/28 14:48:27

银河麒麟v10下VSCode与Qt 5.15.2开发环境配置指南

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉