Servlet+JSP+MySQL:手把手拆解经典Java Web新闻发布系统
简介基于Java Servlet、JSP和MySQL的Web新闻发布系统源码适合正在学习Java Web开发的初学者以及需要课程设计或毕业设计参考的学生。项目采用MVC分层模式实现了新闻的发布、编辑、删除和展示还包含用户登录认证、权限区分、JDBC数据库操作等关键功能。压缩包共269个文件、6.13MB包含56个Java源文件、50个JSP页面、112个class文件、14张PNG图片以及SQL脚本、XML配置和依赖JAR包前端页面与后端代码齐全可部署到Tomcat运行。目前已有3433人学习下载关注度较高。源码结构清晰附带数据库脚本和配置文件能快速跑通项目通过JSP与Servlet的交互、JDBC访问MySQL的过程可深入理解Java Web开发完整链路很适合实战练手和二次开发。1. 为什么值得复现一套能跑通的 ServletJSPMySQL 完整链路很多人在学完 Java 基础后都会卡在同一个地方手里有一堆 servlet、jsp、mysql、jdbc 的知识点但不知道它们怎么拼成一个能用的系统。这个 JavaServletJSPMySQL 的 Web 新闻发布系统恰好就是把整条链路拼起来的完整样本——后端用 Servlet 接请求视图用 JSP 渲染数据落在 MySQL中间靠 JDBC 打通。它不是某个单点功能的 Demo而是从登录、发布、编辑、图片上传到列表展示都有闭环的 Web 应用最适合做课程设计、毕业设计或者用来快速理解传统 Java Web 项目的工程结构。它的价值不在代码量而在帮你建立「用户点一下页面请求经过哪些类、哪些语句、最终落到哪张表」的完整地图。2. 系统骨架Servlet、JSP、JDBC、MySQL 各管什么一次点击怎么走完整个链路拿到这套源码包先别急着跑起来花十分钟把里面的类理清楚。这个项目的核心类不算多但从命名和编译产物能看出它走的是一条非常经典的「手动部署 传统Servlet」路线没有任何框架包装读起来反而比 Spring Boot 项目更能看清底层逻辑。2.1 五个核心类的职责定位项目正文里提到的几个编译产物可以对应出整个系统的骨架类名编译产物实际职责大致对应的请求路径Index.class新闻列表入口首页数据装配/indexNewsSerlvet.class新闻详情展示、按条件查询/detail、/listCommonDAO.class数据库访问公共层封装 JDBC 操作被各 Servlet 调用PhotoUpload.class新闻图片上传与存储处理/uploadOperatorServlet.class后台管理登录校验、发布、编辑、删除/operator注意这里NewsSerlvet是历史上写错的拼写正式拼写应该是NewsServlet。项目里把错拼写一路用到了编译产物属于典型的老项目历史包袱。如果后续要维护建议在包里另建一个同名的正确拼写适配类把路由切到新的类上别在旧文件上直接改。CommonDAO 在项目里承担了绝大部分数据库交互动作。它的定位逻辑是所有 Servlet 不直接写 JDBC 代码而是调用 CommonDAO 的方法拿到ArrayListNews或User对象。这样做的直接好处是换数据库、加连接池、统一做日志时只动一个类就够了。我当时把这个类的所有方法按「查询单条、查询列表、增删改」三个维度做了个脑图后续写新功能时照着添方法就行。Index.class 做的事情看起来简单但很关键它负责在请求到达时组装首页需要的新闻列表和分类信息然后转发给index.jsp。这个类里你会看到典型的request.setAttribute(newsList, list)和request.getRequestDispatcher(index.jsp).forward(...)两连招这就是传统 Servlet 把数据交给 JSP 的标准姿势几乎所有请求处理都在重复这个模式。2.2 一次新闻发布的完整请求链路以管理员发布一篇新闻为例整个链路可以拆成下面七步admin_publish.jsp 表单→OperatorServlet.doPost()→ 解析请求参数 →PhotoUpload处理图片文件 → 调用CommonDAO.insertNews()→ 执行 JDBC 的PreparedStatement.executeUpdate()→ 重定向到列表页确认结果。关键点在OperatorServlet的入口设计。这个类没有拆成PublishNewsServlet、DeleteNewsServlet好多个文件而是用同一个 doPost 入口通过actionadd/list/delete/update这样的请求参数做逻辑分发。第一次翻代码的人可能会觉得这样很绕但在资源有限的老项目里这是很务实的做法少建类、少配 web.xml维护时只需要改一个文件就能找到全部后台逻辑入口。图片上传这一步值得单独说。登录鉴权、新闻表单这些流程都是字符串处理而图片是字节流处理方式完全不同。PhotoUpload 类做的事是先把上传的文件流保存到服务器磁盘某个目录再把文件路径写入数据库 news 表的img_url字段。这样 JSP 页面渲染时只需要拿出路径拼个img src就能显示图片读取压力全部落在静态资源上。我梳理这套代码时最深的感受是它没有用 Spring、没有 MyBatis却把 MVC 的边界划得很清楚。JSP 里基本没有业务逻辑Servlet 里看不到 SQL 拼字符串SQL 全部集中在 CommonDAO。这种分层虽然老但对于想搞明白「请求到底怎么流动」的人比任何高级框架都直观——框架帮你做的事越少你越能看到本质。3. 数据库与 JDBC 层建表结构、连接工具类、参数化查询三板斧看一个传统 Java Web 项目能不能跑得转先看它的数据库脚本和 DAO 层。这套新闻发布系统的数据层用的是 MySQLJDBC 驱动负责和数据库对话。我在本地建库跑通后用了一下午把表结构捋了一遍发现它把新闻网站该有的信息全落到了四张表里结构上没有偷懒。3.1 四张核心表news、category、user、comment 的字段设计一般在老的课程设计项目里数据表设计比较随意但这套代码的表结构相对完整覆盖了栏目、用户、新闻、评论四个维度。我在 MySQL 里重建的脚本大致如下CREATE TABLE category ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL COMMENT 栏目名称, sort_order INT DEFAULT 0 COMMENT 展示顺序 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(64) NOT NULL COMMENT 存储MD5摘要, role TINYINT DEFAULT 0 COMMENT 0普通用户 1管理员 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE news ( id INT PRIMARY KEY AUTO_INCREMENT, category_id INT NOT NULL, title VARCHAR(200) NOT NULL, content TEXT, author VARCHAR(50), publish_time DATETIME DEFAULT CURRENT_TIMESTAMP, img_url VARCHAR(255) COMMENT 图片相对路径, view_count INT DEFAULT 0, KEY idx_category_time (category_id, publish_time) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE comment ( id INT PRIMARY KEY AUTO_INCREMENT, news_id INT NOT NULL, user_id INT, content VARCHAR(500), create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;我在原有结构上做了三处调整一是所有表统一改成utf8mb4避免存生僻字或特殊符号时翻车二是给news表加了(category_id, publish_time)的联合索引列表页按栏目和时间排序时性能提升明显三是user表的密码字段没有设置默认长度限制后续要升级成加盐哈希也不会被已有的字符串长度卡住。content字段直接用了 TEXT因为新闻正文通常是一大段 HTML 或纯文本VARCHAR 长度不够用。这里有个取舍新闻正文如果包含富文本后续要做全文检索会吃力但对实训级的系统来说完全够用不必上LONGTEXT或全文索引。注意img_url存的是相对路径而不是绝对 URL这是我强烈推荐的方案换服务器、换端口时不用改数据库里已有的图片地址。3.2 DBUtil 连接工具类驱动加载、连接获取、资源释放JDBC 最繁琐的不是写 SQL而是获取连接和释放资源。这套项目里用 CommonDAO 统一管理数据库交互大概率会在内部调用一个数据库工具类。我一般会单独建一个DBUtil.java把连接参数集中管理public class DBUtil { private static final String DRIVER com.mysql.jdbc.Driver; private static final String URL jdbc:mysql://localhost:3306/news_db ?useUnicodetruecharacterEncodingutf8 useSSLfalseserverTimezoneAsia/Shanghai; private static final String USER root; private static final String PASSWORD 123456; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(MySQL驱动加载失败检查WEB-INF/lib下是否有jar包); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } public static void close(Connection conn, Statement st, ResultSet rs) { try { if (rs ! null) rs.close(); } catch (SQLException e) { } try { if (st ! null) st.close(); } catch (SQLException e) { } try { if (conn ! null) conn.close(); } catch (SQLException e) { } } }这段代码里的连接参数每个都有讲究。URL 里的characterEncodingutf8必须带着它保证从数据库取出来的中文在 Java 和 MySQL 之间转码不会变成问号serverTimezone是 MySQL 8 连接的必备参数不加会直接报时区异常useSSLfalse是为了避免本地测试时 MySQL 强制 SSL 握手导致的 warning不影响运行但能让日志干净很多。驱动类名我这里用的是 5.x 系列驱动的写法。如果本地装的是 MySQL 8要改成com.mysql.cj.jdbc.Driver这是最容易翻车的一个细节后面的避坑章节会展开讲。静态块里的Class.forName在 JDBC 4.0 之后其实可以省略驱动包会自动注册但老项目里保留这行更稳妥而且出现异常时能快速定位到「驱动没加载」这个原因。3.3 参数化查询与分页PreparedStatement 解决 SQL 注入CommonDAO 里最核心的方法就是查询新闻列表。我在重构时会把所有 SQL 统一改成PreparedStatement同时把分页逻辑写进 SQLpublic ListNews findNewsPage(int categoryId, int currentPage, int pageSize) { ListNews list new ArrayList(); String sql SELECT * FROM news WHERE 11; if (categoryId 0) { sql AND category_id ?; } sql ORDER BY publish_time DESC LIMIT ? OFFSET ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { int idx 1; if (categoryId 0) { ps.setInt(idx, categoryId); } ps.setInt(idx, pageSize); ps.setInt(idx, (currentPage - 1) * pageSize); ResultSet rs ps.executeQuery(); while (rs.next()) { News n new News(); n.setId(rs.getInt(id)); n.setTitle(rs.getString(title)); n.setPublishTime(rs.getTimestamp(publish_time)); list.add(n); } } catch (SQLException e) { e.printStackTrace(); } return list; }这里WHERE 11看起来像是个无用条件但它是拼接动态过滤条件的老技巧——后面加AND xxx时不用再判断是不是第一条。categoryId 等于 0 时代表「全部分类」查全部大于 0 时用占位符?把分类条件传进去杜绝字符串拼接注入。LIMIT ? OFFSET ?配合PreparedStatement做分页注意OFFSET的计算是(页码-1) * 每页条数新手最容易在这里把第一页和第二页的数据搞重复。参数说明pageSize通常取 10 或 20前端列表页每页显示条数要和后台的默认值保持一致。executeQuery()执行完后会拿到ResultSet代码里逐列取出放入News对象这就是 ORM 的雏形——用最土的方式做对象映射。数据量大时用LIMIT分页比一次性查全部数据再在内存里截取要靠谱得多前者是数据库层过滤后者是应用层浪费。4. Servlet 与 JSP 核心链路登录鉴权、新闻发布、图片上传的落地写法源码包里真正决定系统体验的环节在 Servlet 层登录鉴权、新闻发布、图片上传三个功能把 GET/POST 请求、Session、文件流全都串起来了。这一章把每条链路的关键代码逻辑拆开看你拿这套代码去改自己的新闻站时直接在这三个范式上扩展就行。4.1 登录鉴权与 Session 生命周期登录功能是这系统里所有后台操作的第一道门。OperatorServlet 里的登录处理会先检查用户名和密码再根据用户角色决定跳转目标String username request.getParameter(username); String password MD5Util.md5(request.getParameter(password)); User user commonDAO.findUserByLogin(username, password); if (user null) { response.sendRedirect(request.getContextPath() /login.jsp?error1); return; } HttpSession session request.getSession(); session.setAttribute(loginUser, user); session.setMaxInactiveInterval(1800); if (user.getRole() 1) { response.sendRedirect(request.getContextPath() /admin/index.jsp); } else { response.sendRedirect(request.getContextPath() /index); }登录成功后的关键操作是session.setAttribute(loginUser, user)。登录状态一旦写入 Session后续 JSP 页面就能用${sessionScope.loginUser.username}把这个用户信息直接渲染到页面上。setMaxInactiveInterval(1800)表示 30 分钟不操作自动失效这个值单位是秒很多人当成分钟传成 30结果页面边看边写三分钟就被踢出去。后台页面的保护逻辑是在公用 JSP 头部的 include 文件里做判断先HttpSession session request.getSession(false);再检查loginUser是否为 null为空就response.sendRedirect跳回登录页。注意这里要用getSession(false)传 false 表示如果当前没有 Session 就返回 null而不是创建一个新 Session——不传参的话每个未登录用户访问后台都会被动建一个 Session白白消耗服务器内存。4.2 OperatorServlet 按 action 分发新增、修改、删除的优雅写法老项目里多个后台操作共用一个 Servlet 是很常见的靠 action 参数做逻辑分发。读完这个类你就能掌握一个通用套路protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(UTF-8); String action request.getParameter(action); if (add.equals(action)) { doAdd(request, response); } else if (update.equals(action)) { doUpdate(request, response); } else if (delete.equals(action)) { doDelete(request, response); } else if (logout.equals(action)) { request.getSession().invalidate(); response.sendRedirect(request.getContextPath() /login.jsp); } else { response.sendError(HttpServletResponse.SC_BAD_REQUEST); } }request.setCharacterEncoding(UTF-8)这一步必须放在读参数之前。Tomcat 默认的 POST 请求编码是 ISO-8859-1如果你在解析参数之后再设编码已经取得的字符串全是乱码这种坑一天能翻三次。action 分发的好处是整个后台管理只需要配一次 Servlet 映射新增功能时在 doPost 里加一个 else if 分支再补一个doXxx私有方法就行不需要动 web.xml。doAdd 方法里发布新闻的核心逻辑就是拼参数调 CommonDAO先取 title、content、categoryId再处理图片路径最后组装成 News 对象传给commonDAO.insertNews(news)。发布成功后的标准动作是response.sendRedirect(list)这是 PRG 模式Post-Redirect-Get避免用户按 F5 刷新时把同一条新闻插入两次。4.3 图片上传的磁盘存储方案图片上传是传统 Servlet 项目里最「玄学」的模块不同容器版本处理方式差别很大。这套系统的 PhotoUpload 类我建议重点看它解决的是「文件存哪、路径怎么存进数据库」两个核心问题// 基于 commons-fileupload 包处理 multipart/form-data DiskFileItemFactory factory new DiskFileItemFactory(); ServletFileUpload upload new ServletFileUpload(factory); upload.setFileSizeMax(5 * 1024 * 1024); // 单文件最大5MB ListFileItem items upload.parseRequest(request); String uploadDir getUploadDir(request); // 外部目录 for (FileItem item : items) { if (!item.isFormField()) { String fileName System.currentTimeMillis() _ item.getName(); File dest new File(uploadDir, fileName); item.write(dest); // 存相对路径而不是绝对路径 request.setAttribute(imgPath, upload/ fileName); } }这里最值得学习的地方是getUploadDir()的设计。常见做法是把图片放在 Tomcat 部署目录下比如webapps/ROOT/upload/但这会让 Tomcat 在 re-deploy 或清理 work 目录时把用户上传的图片清掉非常坑。我一般建议在 Tomcat 外部建一个独立目录比如/data/uploads/然后在 Tomcat 的 conf/server.xml 里配置虚拟路径映射用浏览器 URL 访问/upload/xxx.jpg时自动指向这个外部目录。这样发布和迭代都不会丢图片备份也只需要拷一个文件夹。选型说明如果用的 Servlet 3.0 以上容器也可以用原生的request.getPart(file)接口处理上传少引一个 commons-fileupload 依赖。但老项目里多数还是 commons-fileupload 的写法兼容 Tomcat 6/7 更稳。文件命名我用时间戳加原文件名避免多人同时上传同名文件互相覆盖这是血泪教训——不改这行的系统上线一周就会出现 A 传的照片把 B 传的替换掉。5. 避坑指南五个最常见的老问题现象、原因与处理记录这套代码跑通不难但我在本地部署和改造的过程中踩了不少坑集中记录在下边五条。每一条都是「现象 → 原因 → 解决」三段式照着排查能省下大量时间。5.1 发布新闻后正文全是问号数据库中文一片乱码现象从后台表单提交中文标题JSP 页面显示时正常但打开 MySQL 表一看title字段里全是??问号。原因三层编码没有对齐。JSP 页面声明的是pageEncodingISO-8859-1数据库表用了latin1而 MySQL 连接 URL 又没带characterEncodingutf8。中文在 UTF-8 和 latin1 之间来回转换最终变成问号写入。解决三步走。第一统一所有 JSP 页面头部为pageEncodingUTF-8第二SQL 建表语句全部指定DEFAULT CHARSETutf8mb4第三JDBC URL 追加?useUnicodetruecharacterEncodingutf8并且 Servlet 的 doPost 开头执行request.setCharacterEncoding(UTF-8)。三个动作缺一不可。5.2 MySQL 驱动报 ClassNotFoundException 或时区异常现象启动 Tomcat 后访问页面控制台打印java.lang.ClassNotFoundException: com.mysql.jdbc.Driver或者 MySQL 8 下提示The server time zone value йʱ is unrecognized。原因驱动 jar 没进WEB-INF/lib或者驱动类名写错。MySQL 5.x 用的驱动类名是com.mysql.jdbc.DriverMySQL 8 换成了com.mysql.cj.jdbc.Driver两者不能混用。时区异常则是 MySQL 8 连接必须显式声明 serverTimezone。解决下载对应版本的 mysql-connector-java jar 放进 lib 目录。MySQL 5.7 配 5.x 驱动MySQL 8 配 8.x 驱动并改 DBUtil 的 DRIVER 字段为com.mysql.cj.jdbc.Driver同时 URL 加上serverTimezoneAsia/Shanghai。5.3 图片上传成功但页面上不显示现象后台提示上传成功数据库里img_url也有值但前台img标签的图片永远显示不出来浏览器 F12 里图片请求返回 404。原因图片保存到了 webapps 部署目录下的 upload 文件夹而 Tomcat 每次重新部署生成新的临时目录旧的文件路径就失效了。另外相对路径写错时JSP 页面从根目录拼出来的 URL 根本不存在。解决把上传目录放到 Tomcat 外面然后配置虚拟路径映射。在conf/server.xml的 Host 节点里加一行Context path/upload docBase/data/uploads reloadabletrue/这样实际存储是文件系统的/data/uploads请求 URL 访问的却是/upload/xxx.jpg部署多少次都不丢文件。5.4 登录后没过多久就被踢回登录页现象管理员登录后台编辑新闻填了几分钟内容点提交时提示未登录跳回 login.jsp。原因session.setMaxInactiveInterval()的参数被误写成 1800 毫秒或者写成了分钟值。实际上这个接口的单位是秒1800 才是 30 分钟写 30 就是 30 秒超时。解决检查后台登录成功后的设置代码确认传入的是秒数。同时排查 web.xml 里全局 session-timeout 的值默认单位是分钟别把两处搞混。如果你用的是集群部署还得改context.xml里的Manager配置共享 Session但单机项目不用管这层。5.5 后台修改一条新闻却同时出现两三条脏数据现象用户点「编辑」改完标题提交列表页出现重复新闻或是修改操作把不该动的行也改了。原因SQL 写成了不带WHERE id ?的UPDATE。Executor 里UPDATE news SET title ?漏掉条件会更新全表所有记录。另外执行删除后没走重定向浏览器刷新时又提交了一次 POST 请求。解决检查 CommonDAO 里所有 update 和 delete 语句强制要求带主键条件写完就自查一遍。删除和发布成功后一律用response.sendRedirect()做重定向别用forward()转发到列表页从源头切断重复提交的可能。6. 进阶技巧分页参数设计、Tomcat 目录规划与上线自检清单这套系统在功能上已经够用但部署到生产环境前我建议按下面的思路做一遍整体加固顺便把容易出问题的地方提前堵住。分页参数设计上前端列表页通常只传page1、page2这样的页码每页条数应该由后台常量控制而不是让前端任意传。我在改造时会定义PageConfig.DEFAULT_PAGE_SIZE 10超过这个值的传参直接忽略防止用户一次拉取 10 万条数据把内存打满。同时把前一页、后一页的链接都带上categoryId流量进列表页时保持筛选条件不丢——这个细节很多同学会在联调时才发现翻到第二页分类变成「全部」属于典型的过滤条件丢失。目录规划上最终形态建议分成四个区域/data/uploads存放用户图片/opt/tomcat/webapps/ROOT只放程序产物/var/log/newsapp放运行日志数据库备份单独用crontab定时导出到/data/backup/mysql。这套方案把程序、数据、日志、备份彻底分离升级系统时永远只需要动 Tomcat 的 webapps 目录上传的图片和日志完全不受影响。上线前检查清单我会过一遍这几个项目检查项预期结果失败时的处理全站 JSP 与 Servlet 编码均为 UTF-8统一改 pageEncoding 并加 CharacterEncodingFilterJDBC URL 参数含 characterEncoding 与 serverTimezone参照第 3 章配置补全上传目录位于 Tomcat 外并有虚拟路径映射按第 4 章 server.xml 配置Session 超时后台 30 分钟单位秒检查 setMaxInactiveInterval 与 web.xml生产密码不出现明文 123456替换为环境变量或配置文件外置有一年我帮某高校的实验室赶一个内部新闻站方案和这套结构一模一样。部署前我觉得自己门儿清跳过了清单里的编码检查项结果上线的当晚发布会数据正文里凡是带引号的地方全变成了问号。那次改代码改到凌晨两点从那以后我每次部署这类老工程都会强制把这份自检清单走一遍五条一项不少。这套传统 ServletJSP 的方法虽然老但把它跑通、部署好、踩过一遍坑之后你再看任何框架包装过的 Java Web 项目都会有底——希望帮到你。本文还有配套的精品资源点击获取

相关新闻

老系统重构实战:从数据库连接池打爆到模块化单体选型复盘

老系统重构实战:从数据库连接池打爆到模块化单体选型复盘

这期节目聊完,我在整理笔记的时候发现,Dirk和Linus两个人聊得最投入、最没有嘉宾包袱的一次,反而是这期讲"旧系统改造"的。原因很简单:他们俩都亲手拆过自己的烂摊子,也都被人用"别动,动了出…

2026/10/18 6:30:52 阅读更多 →
基于SAM的多阶段细化橄榄树遥感分割方案与实践

基于SAM的多阶段细化橄榄树遥感分割方案与实践

做农业遥感这几年,“橄榄树分割”这个需求我前前后后碰过好几回。刚开始觉得这事不难——树冠是圆的、叶子是常绿的,卫星图上看起来就是一片片绿色圆斑,做个阈值分割加形态学处理,应该分分钟搞定。真上了项目才发现,远…

2026/10/18 6:30:52 阅读更多 →
贪吃蛇不是玩具:JavaScript状态机驱动的游戏内核设计

贪吃蛇不是玩具:JavaScript状态机驱动的游戏内核设计

1. 这不是玩具代码,而是一次对前端基础能力的全面压力测试“使用 JavaScript 开发贪吃蛇游戏”——看到这个标题,很多人第一反应是:“老掉牙了,网上教程一抓一大把。”但如果你真去翻过那些所谓“5分钟上手”的教程,就…

2026/10/18 6:30:52 阅读更多 →

最新新闻

英语简单句时态、情态、语态三合一:一张地图讲清动词变化

英语简单句时态、情态、语态三合一:一张地图讲清动词变化

看到这个标题,我先说一句题外话:“简单局”大概率是“简单句”的笔误,但不影响我们聊正事。英语简单句里的时态、情态、语态,是很多学习者的老大难。时态好赖能对上号,情态动词一多就晕,语态再掺和进来&…

2026/10/18 7:23:03 阅读更多 →
前端HTML/CSS智能补全:从Emmet到项目级语义联想

前端HTML/CSS智能补全:从Emmet到项目级语义联想

1. 这个“Tab补全”功能到底在解决什么真实痛点&#xff1f;你有没有过这样的时刻&#xff1a;凌晨两点&#xff0c;赶一个前端页面&#xff0c;手速飞快地敲着<div class"card">&#xff0c;刚打完class&#xff0c;光标停在引号里&#xff0c;脑子还在想这个…

2026/10/18 7:23:03 阅读更多 →
Funcode C++游戏开发:零配置运行坦克大战的原理与实践

Funcode C++游戏开发:零配置运行坦克大战的原理与实践

简介&#xff1a;这是一份面向C初学者与程序设计实训学生的坦克大战游戏源码学习资源&#xff0c;聚焦C核心语法实践与Funcode编辑器实操&#xff0c;帮助学习者通过完整游戏项目掌握类与对象、继承多态、文件操作及游戏主循环等关键知识点。资源为ZIP压缩包&#xff0c;大小12…

2026/10/18 7:23:03 阅读更多 →
PHPlivechat 修复版部署实战:PHP 在线客服系统无限坐席与手机 APP 接入

PHPlivechat 修复版部署实战:PHP 在线客服系统无限坐席与手机 APP 接入

简介&#xff1a;这是2021年12月修复版的PHPlivechat在线客服系统&#xff0c;主打无限坐席&#xff0c;集PHP源码、安卓客服端APP与搭建教程于一体。系统面向有自建客服需求的网站站长、PHP开发者以及中小企业&#xff0c;可部署于常见Apache/PHP环境&#xff0c;只需一台服务…

2026/10/18 7:23:03 阅读更多 →
Vue3 + Webpack5 + Element Plus 工程模板搭建与优化实战

Vue3 + Webpack5 + Element Plus 工程模板搭建与优化实战

简介&#xff1a;这是一份基于 webpack5 搭建 Vue3 开发与生产环境的实战示例工程&#xff0c;面向希望熟悉 webpack5 新特性、掌握前端构建优化的初中级开发者。资源以 JavaScript 为主&#xff0c;配合 Vue 单文件组件与 SCSS 样式&#xff0c;完整演示了从开发调试到生产打包…

2026/10/18 7:23:03 阅读更多 →
SDL2+C++从零写坦克大战:2D游戏开发核心机制实战

SDL2+C++从零写坦克大战:2D游戏开发核心机制实战

简介&#xff1a;基于SDL2与C实现的经典坦克大战游戏项目&#xff0c;面向游戏开发入门者与进阶学习者&#xff0c;也可作为毕业设计、课程设计或工程实训的完整选题。项目基于Visual Studio 2012环境编写&#xff0c;内含完整C源码与SDL2依赖库配置&#xff0c;并附带Qt5开发的…

2026/10/18 7:22:02 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →