news 2026/9/8 14:13:38

JSP酒店管理系统开发全攻略:从模块设计到部署优化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JSP酒店管理系统开发全攻略:从模块设计到部署优化

简介:jsp酒店管理系统是一份基于JSP与Struts2框架的酒店管理Web项目完整源码包,适合Java Web初学者、毕业设计者以及希望掌握MVC分层开发的读者。项目围绕房间、预订、入住退房、客户和账单等核心模块展开,演示了从JSP页面编写、Action控制器开发、Service业务封装到DAO数据访问的完整流程,同时包含SQL脚本与Eclipse工程配置,便于直接导入Tomcat环境运行学习。资源共138个文件,主要由42个class、40个java、23个jsp、13个xml以及css、js、tld等类型构成,清晰展示了编译产物与源码对应关系,整体压缩包约2.94MB,轻量精炼。已有568人学习下载,适合用来理解Struts2拦截器、参数处理及数据库设计在真实业务系统中的落地方式。借助这些源码与配置文件,可快速完成类似管理系统的开发或二次改造,也能为课程设计提供可参考的代码结构。 说实话,看到“jsp酒店管理系统”这个题,我第一反应是又回到了大学课程设计那段日子。直到现在,每年都有不少学弟学妹或者刚入行的朋友问我这类系统的写法。这题目特别经典,技术上不复杂,但五脏俱全,刚好覆盖了一个Web项目从零到一的所有环节:登录鉴权、增删改查、表间关联、文件上传下载、条件查询、统计汇总。你要是能把这一套项目扎扎实实写明白,后面再去碰Spring Boot、MyBatis这些框架,理解起来会快得多。

这篇文章我准备按照实际开发顺序来梳理,从模块设计到数据库表结构,从关键代码实现到常见的坑,尽量把每一步为什么这么做讲清楚,而不是只贴代码让你复制。项目本身适合做毕业设计、课程设计,也适合想通过项目学JSP/Servlet的初学者照着敲一遍。

1. 项目整体设计与模块拆解

1.1 核心需求解析

酒店管理系统说到底,管的是三件事:房间状态、客人信息和钱。

  • 房间状态:哪些房间是空的,哪些被占了,哪些正在打扫。
  • 客人信息:谁在住,住了多久,联系方式是什么。
  • 钱:预订要收定金,退房要结算房费,这些都得有记录。

把这三点拆开,系统就清晰了。管理员登录后要能看到整个酒店的房态总览,前台能进行预订、入住登记、退房结算,经理可能还需要看营收报表。不同的角色干的活不一样,所以权限不能放得太松,登录之后靠角色标识来控制操作范围。

1.2 功能模块划分

模块核心功能关键注意点
登录用户登录、Session管理、密码处理密码不能明文存储,至少做一次MD5加盐
房间管理房间类型维护、房间信息增删改查、房态管理物理房号与房间类型分开设计,方便后期改价
预订管理新增预订、预订查询、取消预订、到期提醒预订时间冲突判断是核心逻辑,写错就完蛋
入住管理入住登记、换房、续住入住后房间状态实时更新
退房结算退房结账、账单生成、订单归档账单明细要可追溯,不能只存总价
客户管理客户信息登记、会员信息维护手机号作为唯一标识,预防重复录入
报表统计入住率统计、营收汇总、订单明细导出Excel导出是一个很加分的功能点
用户管理系统用户维护、角色分配至少要区分管理员和前台两种角色

每个模块之间是有关联的。比如客人预订了一间房,房间模块的状态要跟着变;客人退房了,房间又恢复为空房。如果你做这个项目,我建议先画清楚状态流转图再动手写代码,别一上来就建表。

2. 技术选型与架构思考

2.1 为什么还要用JSP

很多人问我,现在都已经Spring Boot + Vue天下了,谁还用JSP?这话说得没错,但你得想清楚自己为什么要写这个项目。JSP酒店管理系统这个选题能一直火到现在,不是因为技术多先进,而是因为它适合用来理解Web开发的本质。

用JSP + Servlet,你得手动处理请求转发、Session管理、参数获取、响应输出,每一步都暴露在外面。这种“笨拙”恰恰是学习时最珍贵的部分。等你明白了Servlet容器是怎么工作的,JSP怎么被翻译成Servlet的,再去看Spring MVC那套基于DispatcherServlet的设计,基本就是降维打击。

2.2 MVC分层设计

我建议项目结构分成这样,清晰好维护:

src/main/java ├── entity 实体类,对应数据库表 ├── dao 数据访问层,JDBC操作封装 ├── service 业务逻辑层,事务控制在这里 ├── servlet 控制器层,接收请求、调用服务、转发 ├── filter 过滤器,统一编码、登录拦截 ├── util 工具类,日期、字符串、导出等 └── listener 监听器,启动时加载数据 webapp ├── admin 后台管理页面(管理员权限) ├── front 前台操作页面(前台角色) ├── common 公共页面,错误页、未授权提示 ├── static bootstrap、css、js、图片 ├── WEB-INF/web.xml └── index.jsp

有人会嫌Entity/DAO/Service每层都是重复代码,写起来繁琐。但正是这种繁琐,让你明白每一层存在的意义:Servlet里堆代码会越来越难维护,Dao直接写业务逻辑会导致连接管理混乱。老老实实分层,改需求的时候你会感谢自己。

2.3 JDBC还是连接池

纯JDBC连接数据库每次操作都获取Connection,这个操作开销很大。哪怕只是做个课程设计,也建议直接上Druid连接池,配置很简单:

Properties prop = new Properties(); prop.load(new FileInputStream("src/druid.properties")); DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);

注意,连接池的配置千万别写在Java代码里硬编码,properties文件独立出来管理,后面切换环境的时候方便多了。下面是一份可以用的配置参考:

driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/hotel_db?useUnicode=true&characterEncoding=UTF-8 username=root password=123456 initialSize=5 maxActive=10 maxWait=3000

3. 关键功能实现与核心代码

3.1 登录过滤器与权限控制

登录功能写起来不难,难的是怎么把安全控制做好。用Filter统一拦截是所有JavaWeb项目的基本操作路径。核心代码大致这样:

public class LoginFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; HttpSession session = request.getSession(false); // 判断session是否有效,以及是否登录 if (session == null || session.getAttribute("loginUser") == null) { // 考虑AJAX请求与页面请求的不同处理方式 if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) { response.setStatus(401); } else { response.sendRedirect(request.getContextPath() + "/login.jsp"); } return; } chain.doFilter(req, resp); } }

项目中用了全中文去写逻辑判断,方便你们看懂。这里有一个大家经常踩的坑:Filter的url-pattern配置成/*,会把CSS、JS、图片也给拦截了。页面样式突然全丢了,多半是这个原因。要么静态资源单独放一个路径前缀并放行,要么在Filter里判断请求路径后缀。

3.2 房态管理的SQL设计

酒店系统里最核心的是房间状态。房间状态我建议用3个字段来综合表达:房间状态、入住时间、预计离店时间。状态有4个:可售、已入住、已预订、打扫中。

前端页面上展示房态图的时候,不要每次页面刷新都去数据库全表扫描。最常见的方式是加载时把当前所有房间查出来放到Map里缓存到Application作用域,房间变更后同步更新缓存。当然,这是课程设计级别的优化思路,够用了。

核心的查询SQL,要能够查出当前所有房间状态:

SELECT r.room_id, r.room_number, rt.type_name, r.status, o.check_in_date, o.check_out_date FROM t_room r JOIN t_room_type rt ON r.room_type_id = rt.type_id LEFT JOIN t_order o ON r.room_id = o.room_id AND o.order_status = '已入住' AND o.check_in_date <= CURDATE() AND o.check_out_date >= CURDATE() ORDER BY r.floor_no, r.room_number;

左连接订单表,只关联当前有效入住订单,这样即使房间没有被占用,也能查到房间的基本信息。

3.3 预订时的时间冲突判断

做预订功能时,很多新手会想到用IN查询去判断房间有没有在用。但这样只能处理精确匹配,很难处理日期交叉的情况。正确做法是反向取反:判断新预订时间和已有订单时间是否有交集。

数学上两个区间[start1, end1][start2, end2]有冲突的条件是start1 < end2 AND end1 > start2。对应SQL:

SELECT COUNT(*) FROM t_order WHERE room_id = ? AND order_status IN ('已预订', '已入住') AND check_in_date < ? AND check_out_date > ?;

这里需要注意的是边界值问题。通常允许客人中午12点退房,下午2点入住,所以check_in_date < ?这里用的严格小于,日期上直接排除同一整天的重叠。如果是当天退房当天入住,这个逻辑基本够用。如果希望更精确到小时,就得把字段换成TIMESTAMP类型,但那样页面上的日期选择器也得跟着改成日期时间选择器,复杂度会高一些。

3.4 入住和退房的状态流转

入住操作可以理解为一个事务,需要同时干好几件事:把订单状态改成已入住、设置房间里入住客人的姓名和手机号、修改房间状态为已入住。这一串操作,要么都成功,要么都失败,所以事务控制不能省。

Connection conn = null; try { conn = JDBCUtils.getConnection(); conn.setAutoCommit(false); orderDao.updateOrderStatus(conn, orderId, "已入住"); orderDao.updateRoomCustomer(conn, roomId, customerName, phone); roomDao.updateRoomStatus(conn, roomId, "已入住"); conn.commit(); } catch (Exception e) { conn.rollback(); throw new RuntimeException("入住操作失败", e); } finally { JDBCUtils.close(conn); }

很多人连忘记setAutoCommit(false),导致前两个SQL执行成功、第三个失败,数据就潮了。如果你想在这个项目里体现自己的工程素养,事务这块一定写上。

退房结算时要考虑房费到底怎么算。我习惯把逻辑简化成:退房日期减入住日期得到住宿天数,超过中午12点退房的加收半天房费。这段业务规则可以单独抽一个方法,方便后续调整计费规则。

3.5 jsp实现数据导出为excel,一个很加分的功能

做报表模块时,经常碰到管理员想导出查询结果。网上搜“jsp实现数据导出为excel”,一堆帖子里传的是表格另存为xls的偏方,说穿了只是改了ContentType,根本不是真的Excel文件。我建议用Apache POI来生成真正的Excel文件,代码也不复杂:

// 创建Excel工作簿 Workbook workbook = new HSSFWorkbook(); Sheet sheet = workbook.createSheet("订单报表"); String[] headers = {"订单号", "客人姓名", "房号", "房费", "入住日期", "退房日期"}; // 创建表头 Row headerRow = sheet.createRow(0); for (int i = 0; i < headers.length; i++) { Cell cell = headerRow.createCell(i); cell.setCellValue(headers[i]); } // 填充数据 int rowIndex = 1; for (Order order : orderList) { Row row = sheet.createRow(rowIndex++); row.createCell(0).setCellValue(order.getOrderNo()); // ... 依次写入其他字段 } // 设置下载响应头 response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=order_report_" + System.currentTimeMillis() + ".xls"); workbook.write(response.getOutputStream()); workbook.close();

用这个方案,导出的Excel能直接用Excel打开,格式也没问题。而且用POI还能做单元格合并、样式设置、公式,后面想扩展就方便了。

3.6 jsp实现mp4视频播放,用于酒店宣传或培训资料

如果你的系统里想放一个酒店宣传视频或者前台培训视频,直接通过JSP页面播放MP4也是一个常见的扩展需求。不要把视频路径写成/video/xxx.mp4,你要考虑JSP页面通过相对路径请求时,是否能正确映射到Tomcat的静态资源目录。

配置方式很简单,把视频文件放到webapp/static/video目录下,页面上直接写:

<video width="640" height="360" controls> <source src="${pageContext.request.contextPath}/static/video/intro.mp4" type="video/mp4"> 您的浏览器不支持video标签,请升级浏览器。 </video>

这里核心点是${pageContext.request.contextPath},它能拿到当前Web应用上下文路径,避免部署时因为项目名不一样导致视频404。当然,做视频播放时要注意视频编码格式,有些MP4文件因为编码兼容问题在浏览器里放不出来,建议用H.264编码的MP4,兼容性最好。

3.7 jsp个人信息展示页面,如何处理Session中的用户数据

系统里几乎所有页面右上角都要显示当前登录用户的信息:用户名、角色、最后登录时间。这些东西存到Session里,页面统一从Session取:

<% User loginUser = (User) session.getAttribute("loginUser"); %> <div class="user-info"> <span class="username"><%= loginUser.getRealName() %></span> <span class="role-badge"><%= "admin".equals(loginUser.getRole()) ? "管理员" : "前台" %></span> </div>

写这段代码的时候要注意,JSP里直接嵌Java代码虽然简单,但到了后期维护的时候会很痛苦。更好的做法是配合JSTL标签:

<header class="topbar"> <span>当前登录:${sessionScope.loginUser.realName}</span> <span>角色:${sessionScope.loginUser.role == 'admin' ? '管理员' : '前台'}</span> </header>

用JSTL的EL表达式来写,页面干净很多,这也是主流的写法。个人信息的修改页也藏在用户中心模块里,可以顺带做出来。修改密码、编辑基本资料这些功能逻辑都是同一个模式的update操作,代码写起来也不复杂。

4. 开发过程中的常见问题与排查技巧

4.1 jsp改了不生效,90%是缓存问题

“jsp改了不生效”这个问题,我可是踩了很多次坑才彻底搞明白。很多人修改了JSP文件,保存之后刷新浏览器,发现页面还是老样子。这事真是急死人。原因基本分三类:

  • 浏览器缓存:JSP页面通常不会缓存太久,但你得排除这种情况,可以强制刷新,或开启开发者工具禁用缓存。
  • Tomcat的work目录缓存:Tomcat启动时会把JSP编译成Java类存在work/Catalina/目录下,如果这里的旧编译文件没更新,你改的JSP就不生效。
  • IDE没有自动发布:使用Eclipse或IDEA时,除非开启了热部署,否则需要重新部署。

针对Tomcat缓存问题,根治的办法是修改Tomcat的context.xml,加上一句:

<Context reloadable="true">

这样Tomcat会检测JSP文件的修改时间,自动重新编译。不过这只适合开发环境,生产环境不建议开启,会有性能损耗。还有一种情况大家容易忽略:你改了JSP文件,但浏览器保存的还是旧的响应头信息,即使服务器返回了新的HTML,浏览器也不一定重新渲染。这个时候Ctrl+F5强刷能解决90%的问题。

4.2 路径404问题

页面提交表单后,控制台提示404,这是Servlet开发里最常见的报错。原因通常是action地址写错了,缺少上下文路径,或者web.xml里的Servlet映射不一致。

最佳实践是JSP里所有请求提交的地址都用${pageContext.request.contextPath}拼接,比如:

<form action="${pageContext.request.contextPath}/order/add" method="post">

如果你用了../这种相对路径去访问资源,页面跳转层级一变,路径就废了。从一开始就用绝对上下文路径,能省掉后面所有这类问题。

4.3 中文乱码的三层处理

中文乱码问题在JSP项目里简直是家常便饭,而且经常是JSP页面、Servlet、数据库三段都可能出问题。保险的配置方式是三层都处理:

第一层,JSP页面顶部统一声明:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

第二层,POST请求在Servlet或Filter里设置编码:

request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8");

第三层,数据库连接URL要带上编码参数:

url=jdbc:mysql://localhost:3306/hotel_db?useUnicode=true&characterEncoding=UTF-8

这三个地方只要有一个漏了,就可能出现乱码。尤其是读取数据库里的中文数据到页面上显示为乱码,多半是数据库连接URL没写对,而不是JSP页面的问题。如果控制的Druid连接池,检查一下配置文件中编码参数是否设置完整。

4.4 日期时间处理的坑

酒店系统里的日期处理绕不开。数据库里存的是2025-06-12这种DATE类型,Java实体类里对应的是java.util.Date,页面上显示要用JSTL的fmt标签格式化:

<fmt:formatDate value="${order.checkInDate}" pattern="yyyy-MM-dd" />

如果订单表里还有加减房费截止时间,建议字段类型用DATETIME,存更细粒度的时间。在Java代码里做两个Date之间的天数差计算时,很多新手会用getTime()直接除以86400000,这样算出来的结果在小数部分很容易出偏差。推荐用java.time包下面的方法:

long days = ChronoUnit.DAYS.between( checkInDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(), checkOutDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate() );

这段代码看着长,但它是类型安全且不会踩时区坑的写法。JDK8+的项目别再传SimpleDateFormat的写法了。

4.5 常见问题速查表

问题现象可能原因排查顺序
页面提交404上下文路径缺失、Servlet映射错误先看控制台日志,再看URL和web.xml配置
登录后跳回登录页Session作用域配置、Filter放行路径错误检查Filter里是否放行了登录相关的请求和静态资源
中文数据显示为??数据库连接URL或表字段编码不对先测数据库本身能不能存中文,再查连接URL
上传图片显示不出来图片存储路径和访问路径不一致Tomcat中路径映射,最好把图片存到项目外的独立目录,再做虚拟映射
新增房间后房态图没变化Application缓存未同步更新检查增删改操作时是否同步更新了缓存对象
Excel导出提示文件损坏POI版本冲突或文件流未正常关闭检查输出流close时机,以及是否有多个POI版本在classpath
JSP页面空格但运行报500编译错误或某行Java代码抛异常查看Tomcat日志中具体异常堆栈

5. 项目部署与优化建议

5.1 本地部署的基本流程

整个项目写完需要在Tomcat里跑起来。IDEA中配置好本地Tomcat,选择war包或war exploded模式部署,然后启动。如果看不到页面,第一件事不是怀疑代码,而是看Tomcat的catalina.out日志里有没有启动异常。常见的是端口被占用,或者项目名带中文导致路径解析失败。

5.2 代码层面的优化建议

如果你希望这个项目不只是能跑,而是能在课程答辩或者面试中成为加分项,可以往这几个方向打磨:

  • 密码加密:登录密码至少做一次MD5加盐,别用明文。
  • SQL防注入:DAO层别用字符串拼接SQL,换成PreparedStatement。
  • 前端校验:表单提交前先做非空校验,减轻服务端压力。
  • 日志输出:关键操作用Log4j2或Slf4j打日志,方便排查问题。
  • 分页查询:订单列表和客户列表加一个PageBean分页。

分页是最容易被人忽略但还是必做的功能。如果不分页,数据量一多页面就会卡到没法看。我的做法是前端传pageNumpageSize两个参数到Servlet,后台拼接LIMIT ?, ?,同时算出总记录数用于生成页码条。

5.3 关于会话管理的小细节

酒店前台的电脑可能同时几个人操作同一个账号。这种场景下Session的并发处理值得想一想。我的方案是登录时把账号密码和SessionId绑定,如果同一账号在不同浏览器上重复登录,就把旧的Session失效。这个逻辑代码不多,但效果特别好,答辩时也能作为一个设计亮点讲出来。

// 登录成功时 String oldSessionId = (String) application.getAttribute("login:" + username); if (oldSessionId != null) { // 让旧Session失效 HttpSession oldSessionManager = (HttpSession) application.getAttribute("session:" + oldSessionId); if (oldSessionManager != null) { oldSessionManager.invalidate(); } } application.setAttribute("login:" + username, request.getSession().getId());

5.4 数据库表结构核心参考

数据库是酒店管理系统的地基。这里给一个精简版参考表:

CREATE TABLE t_user ( user_id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, real_name VARCHAR(50), role VARCHAR(20) DEFAULT 'front', -- admin/front create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE t_room_type ( type_id INT PRIMARY KEY AUTO_INCREMENT, type_name VARCHAR(50), price DECIMAL(10,2), bed_count INT DEFAULT 1 ); CREATE TABLE t_room ( room_id INT PRIMARY KEY AUTO_INCREMENT, room_number VARCHAR(10) UNIQUE, room_type_id INT, floor_no INT, status VARCHAR(20) DEFAULT '可售', -- 可售/已入住/已预订/打扫中 FOREIGN KEY (room_type_id) REFERENCES t_room_type(type_id) ); CREATE TABLE t_customer ( customer_id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), phone VARCHAR(20) UNIQUE, id_card VARCHAR(18), gender VARCHAR(10), register_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE t_order ( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(32) UNIQUE, customer_id INT, room_id INT, order_status VARCHAR(20), -- 已预订/已入住/已退房/已取消 check_in_date DATE, check_out_date DATE, total_price DECIMAL(10,2), create_time DATETIME DEFAULT CURRENT_TIMESTAMP );

注意t_order这个表名,在MySQL里order是关键字,直接建表会报语法错误。我前面加了个前缀写成t_order,这是很多人初学时忽略的经典问题。这种表名规范在行业里很常见,建议从第一张表开始就养成加前缀的习惯。

6. 写在最后的个人体会

做这种系统性项目,最忌讳的就是上来一顿猛写,写到哪算哪。我在带人做这个项目时,一直建议的顺序是:先画功能清单,再画数据库ER图,然后写DAO测试,最后才是Servlet和JSP页面。数据库关系没搞清楚之前,后面全是返工。

整个项目做完,我个人的感觉是与其贪多求全把功能堆满,不如把三个核心功能做得精:登录权限、房态管理、预订退房。这三个做好,酒店管理系统的骨架就立住了。剩下客户管理、报表统计都是增删改查的变体。

最后再分享一个小技巧——调试Session和请求参数时,可以用一个很简单的Filter,把每次请求的URI和参数打印到控制台。别小看这个工具,JSP项目前后端耦合在一起,排查问题很多时候就靠这条日志链路定位问题。这个习惯我一直保留到现在做接口开发都没丢。

本文还有配套的精品资源,点击获取

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

C#联合HALCON实现工业视觉模板匹配全流程解析

简介&#xff1a;一套基于C#与HALCON的模板匹配视觉框架&#xff0c;专为工业场景中的物品定位与匹配效率优化而设计&#xff0c;适合机器视觉工程师、上位机开发人员及HALCON初学者参考。工程以窗体程序展示完整交互流程&#xff1a;先选取搜索局域与模板局域&#xff0c;若物…

作者头像 李华
网站建设 2026/9/8 14:10:52

Python切片详解:从索引边界到NumPy多维数组的进阶指南

切片这个词&#xff0c;是我刚学Python时觉得最“爽”的一个功能。别人还在用循环一个个取列表元素&#xff0c;你一行代码搞定&#xff0c;不仅看着舒服&#xff0c;运行效率还高。也许有人会觉得它很简单&#xff0c;就是list[start:stop]嘛&#xff0c;有什么好写的&#xf…

作者头像 李华
网站建设 2026/9/8 14:10:42

Linux入门核心:理解shell机制,掌握常用指令与脚本基础

如果你刚接触 Linux&#xff0c;多半会经历这样一个阶段&#xff1a;收藏了一堆“linux 常用命令大全”&#xff0c;以为背下几十条指令就能玩转服务器&#xff0c;结果真坐到了终端前&#xff0c;却只敢敲cd和ls。遇到一个权限错误就把命令抄到搜索框里查半天。这不是你的问题…

作者头像 李华
网站建设 2026/9/8 14:09:06

推挽输出与开漏输出:单片机IO模式核心区别详解

很多刚开始玩单片机的朋友&#xff0c;大概率都在点亮LED这件事上翻过车&#xff1a;程序里明明把引脚写成了1&#xff0c;万用表笔搭上去一量&#xff0c;电压却只有一点几伏&#xff1b;或者灯确实亮了&#xff0c;但亮度跟别人做的板子明显不一样。更诡异的是&#xff0c;同…

作者头像 李华
网站建设 2026/9/8 14:08:17

Python中文NLP实战:从分词到情感分析的完整流程

简介&#xff1a;一套面向自然语言处理入门与进阶学习者的Python实战资源&#xff0c;围绕中文分词、词性标注、命名实体识别、情感分析与主题建模等核心任务展开&#xff0c;适合正在学习NLP基础或希望结合中文语料动手实践的读者。资源共42个文件&#xff0c;压缩包53.58MB&a…

作者头像 李华
网站建设 2026/9/8 14:07:15

人体姿态检测实用指南:MediaPipe关键点提取与部署避坑

简介&#xff1a;面向计算机视觉学习者、算法工程师及毕业设计者&#xff0c;这套基于PythonOpenCVOpenPose的人体姿态检测方案可直接从图片或视频流中识别人体关键点&#xff08;如头、肩、肘、膝&#xff09;&#xff0c;解决快速搭建姿态估计演示系统的需求。包内共7个文件&…

作者头像 李华