新闻详情

新闻详情

首页 / 资讯中心 / 详情

Java Web图书管理系统开发实战:从选型到部署全流程

发布时间:2026/9/28 15:12:44来源:尧图网络
Java Web图书管理系统开发实战:从选型到部署全流程
简介面向Java初学者与课程设计选题的基于Java Web图书管理系统源码采用MVC模式JSPServletJavaBean与B/S架构覆盖普通用户注册登录、借书还书、个人信息修改以及管理员用户管理、图书信息维护、密码修改等双角色核心功能系统含4张数据库表、约23张JSP页面并已实现分页与代码注释适配JDK1.8及MySQL5.5/5.7/8.0常见环境。资源包共157个文件除Java源码、JSP页面、class字节码、SQL建表脚本和jar依赖包外还包含2段操作演示视频与docx课程报告、项目结构文档压缩包整体约65.85MB可直接导入Eclipse或MyEclipse运行。已有8130人学习下载是较受欢迎的双角色管理类实战项目。通过完整源码、数据库脚本与配套报告读者可系统掌握JSPServletJDBC开发流程、Bootstrap响应式页面布局、MySQL数据表设计及Tomcat部署方法便于快速理解MVC分层思想并用于课程设计参考或项目实训。1. 图书管理系统Java Web入门绕不开的那个完整项目“基于Java web的图书管理系统”在课程设计和毕业设计里属于出场率最高的题目之一。它表面上是增删改查实际上把Java Web的主干全部串起来了请求怎么进、Filter怎么拦、Servlet怎么转发、JSP怎么渲染、MySQL怎么落库任何一个环节没吃透答辩或者自测时都会露馅。这篇文章不打算给你一个“能跑就行”的版本而是把选型、建表、核心代码、部署排障整条链路讲清楚。适合正在做课设或毕设的人也适合刚入行想练Web基本功的初级开发。系统不大但值得认真做一遍。2. 技术选型与项目骨架Servlet/JSP、SSM、Spring Boot怎么选同一个图书管理系统业界有三种常见做法纯ServletJSP、SSM、Spring Boot。选哪条路取决于你做这个项目的目的是什么而不是哪个技术听起来更高级。先把这个想清楚后面所有代码结构都会跟着变。2.1 三条路线的取舍先看你的目标如果老师指定了JSP那ServletJSP就是唯一解。大多数课程设计都会限定“Java web”这个标签下最常见的教学组合就是Servlet 3.0 JSP MySQL Tomcat项目打包成一个war包扔进Tomcat的webapps目录就能跑。它的优点是框架帮藏起来的东西全部暴露在你面前HTTP协议、请求转发、Session管理、JDBC连接全靠手写练的是Java基础和Web原理。SSMSpring Spring MVC MyBatis是前些年企业项目的标配做毕设选这个方向的人也不少。它比ServletJSP多了一层Spring容器管理和MyBatis的SQL映射写起来确实更省事但学习曲线陡。如果你之前没接触过Spring直接上SSM容易陷入“配置能跑但不知道谁调谁”的状态答辩时被问一句“Spring MVC是怎么把请求分发给Controller的”就可能卡住。Spring Boot是现在就业市场的绝对主流也是自学者最喜欢的方向。它内嵌Tomcat、自动装配、约定大于配置用Spring Boot写图书管理系统代码量能比纯Servlet少一半还多。但要提醒一点Spring Boot帮你封住了很多东西一旦出现500错误你如果连Servlet、Filter、连接池这些底层概念都没摸过排查起来会非常痛苦。我的建议是如果是第一次做老老实实选ServletJSP。如果你已经做过一次ServletJSP版本再花一周用Spring Boot重写一遍对比两个版本在处理请求、配置数据源、部署方式上的差异这个过程中获得的认知比任何教程都值钱。路线适合场景上手成本核心考察点ServletJSP课设、理解Web原理中HTTP请求、Filter、JSP九大内置对象、JDBCSSM老项目风格毕设较高Spring IoC、Spring MVC、MyBatis映射Spring Boot就业方向、快速开发中低自动配置、内嵌Tomcat、REST风格接口2.2 推荐组合与Maven骨架pom.xml先立住选定ServletJSP路线后项目要先用Maven搭起来。注意一点Maven不是可有可无的加分项而是必备工具管理Servlet API、JSTL、MySQL驱动都要靠它。下面这个pom.xml是跑通图书管理系统的最小依赖集可以直接抄。project modelVersion4.0.0/modelVersion groupIdcom.example/groupId artifactIdbook-manager/artifactId packagingwar/packaging version1.0.0/version dependencies dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependency dependency groupIdjavax.servlet/groupId artifactIdjstl/artifactId version1.2/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency /dependencies /project这里有个参数值得专门说明javax.servlet-api的scope是provided意思是编译时用打包时排除因为Tomcat容器自己带了Servlet实现如果你把这个依赖打进了war包启动时经常出现类重复或版本冲突。mysql-connector-java用8.0.xMySQL 5.7和8.0都能连别选老的5.1.x处理时区问题时不够干净。jstl 1.2是JSP页面里配合EL表达式做循环和条件判断用的如果不用JSP而是纯粹的Servlet输出可以不引入。2.3 目录结构约定源码放哪、配置放哪Maven的web项目有固定约定src/main/java放Java源码src/main/resources放配置文件src/main/webapp放JSP、CSS、JS、图片和WEB-INF。如果连这个结构都不按规矩来后面打war包一定会走弯路。book-manager/ ├── pom.xml ├── src/main/java/com/example/book/ │ ├── entity/ # 和表结构对应的类Book, User, BorrowRecord │ ├── dao/ # 数据访问层只写SQL和JDBC操作 │ ├── servlet/ # 控制器层接收请求、调dao、转发JSP │ ├── filter/ # 登录拦截、编码设置 │ └── util/ # DBUtil 数据库连接工具、分页工具类 ├── src/main/resources/ │ └── db.properties # 数据库连接配置 └── src/main/webapp/ ├── WEB-INF/web.xml ├── login.jsp ├── book_list.jsp ├── book_add.jsp └── static/ # css、js、图片分包规则有两条硬性要求entity里的类必须和数据库表字段一一对应不要一个类里又塞业务逻辑又塞数据库字段dao只写SQL和JDBC操作servlet只做参数接收、调用dao、跳转页面业务判断放在servlet里或单独写service包。千万别把大段Java代码嵌在JSP的% %脚本块里页面会变得非常难维护这也是答辩时老师最爱扣分的地方。3. 数据库先行图书、用户、借阅三张表的设计与SQL写代码之前先把表设计好这是一线开发的基本习惯。图书管理系统只需要三张核心表图书表、用户表、借阅记录表。角色不单独建表用户表里加一个role字段就够用。别一上来就设计权限表、角色表、菜单表课设阶段做那么重最后填数据都填得你怀疑人生。3.1 表结构设计三张表够用别急着上权限表book表用来存图书基本信息字段包括id、isbn、书名、作者、出版社、分类、库存、状态、创建时间。status字段表示图书当前是否可借0可借、1借出这个字段的意义是让列表页和借阅操作能快速过滤而不是每次都要现算。user表存系统用户username和password是登录凭证role区分管理员和普通读者。这里要明白一个设计原则系统里的“人”只有两类操作权限管理员能增删改图书、查看所有借阅记录读者只能查书、借书、还书、看自己的记录。用一个tinyint的role字段存0或1就够了不需要复杂的权限框架。borrow_record表是核心每次借书插入一条记录还书时更新return_time和status。三张表之间的关联关系是借阅记录通过user_id关联user表通过book_id关联book表这是典型的一对多关系在Java里体现为BorrowRecord类持有userId和bookId两个字段查询时用JOIN把书名和用户名带出来。3.2 建表SQL与初始化数据直接可跑的版本CREATE DATABASE IF NOT EXISTS book_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE book_db; CREATE TABLE book ( id INT PRIMARY KEY AUTO_INCREMENT, isbn VARCHAR(20) NOT NULL UNIQUE COMMENT ISBN编号, name VARCHAR(100) NOT NULL COMMENT 书名, author VARCHAR(50) NOT NULL COMMENT 作者, publisher VARCHAR(100) COMMENT 出版社, category VARCHAR(30) COMMENT 分类, price DECIMAL(10,2) DEFAULT 0.00 COMMENT 定价, stock INT NOT NULL DEFAULT 1 COMMENT 总库存, status TINYINT NOT NULL DEFAULT 0 COMMENT 0可借 1全部借出, delete_flag TINYINT NOT NULL DEFAULT 0 COMMENT 0正常 1逻辑删除, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, KEY idx_name (name), KEY idx_category (category) ) ENGINEInnoDB; CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(64) NOT NULL COMMENT 存MD5值, real_name VARCHAR(50) NOT NULL, role TINYINT NOT NULL DEFAULT 1 COMMENT 0管理员 1读者, status TINYINT NOT NULL DEFAULT 0 COMMENT 0正常 1禁用, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB; CREATE TABLE borrow_record ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL COMMENT 读者id, book_id INT NOT NULL COMMENT 图书id, borrow_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 借出时间, due_time DATETIME NOT NULL COMMENT 应还时间, return_time DATETIME NULL COMMENT 实际归还时间, status TINYINT NOT NULL DEFAULT 0 COMMENT 0借出中 1已归还 2逾期, KEY idx_user_status (user_id, status), KEY idx_book_id (book_id), CONSTRAINT fk_borrow_user FOREIGN KEY (user_id) REFERENCES user(id), CONSTRAINT fk_borrow_book FOREIGN KEY (book_id) REFERENCES book(id) ) ENGINEInnoDB; INSERT INTO user (username, password, real_name, role) VALUES (admin, e10adc3949ba59abbe56e057f20f883e, 管理员, 0), (zhangsan, e10adc3949ba59abbe56e057f20f883e, 张三, 1); INSERT INTO book (isbn, name, author, publisher, category, price, stock) VALUES (9787111111111, Java核心技术卷I, Cay S. Horstmann, 机械工业出版社, 编程, 89.00, 5), (9787112222222, 深入理解Java虚拟机, 周志明, 机械工业出版社, 编程, 99.00, 3);初始化数据里密码那一串是123456的MD5值这是最朴素的加密做法千万别把明文密码直接存进数据库答辩时老师看到明文密码会直接扣分而且数据库一旦泄露用户密码就全暴露了。3.3 字段与索引的取舍为什么状态用int不用varchar图书状态、用户角色、借阅记录状态这三个字段我都用了tinyint而不是varchar。很多人习惯写statusavailable这种可读字符串但维护时会发现不同页面里available和y、Y、yes混着用迟早翻车。数值枚举在Java里用常量类定义好比如public static final int BOOK_STATUS_AVAILABLE 0;写起来同样清晰排序和统计还更快。索引设计按查询习惯来isbn必查且要唯一加UNIQUE索引书名和分类经常作为搜索条件建普通索引借阅记录最频繁的查询是“某用户有什么书没还”所以建(user_id, status)的联合索引这个索引同时覆盖用户维度和状态维度。外键约束要保留它保护的是数据完整性防止借阅记录关联到不存在的用户或图书。表引擎必须用InnoDB只有InnoDB支持事务和外键MyISAM在并发写和崩溃恢复上都不太行。4. 核心功能实现登录拦截、分页查询、借阅归还的代码写法这个系统的功能清单往下拆最核心的就是三块用户登录、图书列表分页、借书还书流程。这三块写完整个系统的骨架就立住了。下面把每一个的代码写法和参数边界讲清楚。4.1 登录拦截用Filter守住所有受保护页面图书管理系统的页面除了登录页其余都要求登录后才能访问。用Filter实现这个拦截是所有方案里最干净的因为拦截逻辑集中在一处而不是在每个Servlet里重复判断Session。WebFilter(/*) public class LoginFilter implements Filter { Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) resp; request.setCharacterEncoding(UTF-8); String uri request.getRequestURI(); String contextPath request.getContextPath(); String path uri.substring(contextPath.length()); // 放行登录页、登录接口、静态资源 if (path.equals(/login.jsp) || path.equals(/login) || path.startsWith(/static/)) { chain.doFilter(request, response); return; } // 校验Session中是否有用户信息 HttpSession session request.getSession(false); if (session null || session.getAttribute(user) null) { response.sendRedirect(request.getContextPath() /login.jsp); return; } chain.doFilter(request, response); } }这段代码里有两个关键判断。第一session null || session.getAttribute(user) null要同时判断很多人只判断getAttribute结果在Session过期后取到null页面虽然跳回了登录页但抛了NullPointerException。第二静态资源路径必须显式放行否则CSS和JS文件会被拦下来登录页打开后光秃秃的没有样式看起来像页面坏了一样。放行的路径写的是/static/前缀所以项目里所有CSS、JS、图片必须放在webapp/static目录下这是用目录结构换拦截逻辑简单。登录成功时Servlet里要执行session.setAttribute(user, user)建议存整个User对象而不是只存一个用户名这样JSP页面里可以直接取${user.realName}显示“欢迎你管理员”不用再查一次数据库。4.2 分页查询手写LIMIT与总页数计算图书列表不能把全部数据一次性查出来数据量上来后页面会越来越卡。分页是必修课MySQL的做法是LIMIT加偏移量Java这边分页参数从页面传过来。public class BookDao { private static final int DEFAULT_PAGE_SIZE 10; public ListBook findPage(int page, int pageSize) throws SQLException { String sql SELECT id, isbn, name, author, publisher, category, price, stock, status FROM book WHERE delete_flag 0 ORDER BY id DESC LIMIT ?, ?; int offset (page - 1) * pageSize; // 使用DBUtil获取连接并执行预编译语句参数为offset和pageSize return DBUtil.queryList(sql, Book.class, offset, pageSize); } public int count() throws SQLException { String sql SELECT COUNT(*) FROM book WHERE delete_flag 0; return DBUtil.queryInt(sql); } }页面上把页码和每页大小作为请求参数传给ServletServlet算出offset再传给dao这是一个标准的得分点。写这段代码时容易忽略一个数学细节MySQL的LIMIT从0开始计数而页面显示的页码从1开始所以查询第1页时offset必须是0公式是(page - 1) * pageSize。如果直接写page * pageSize第一页会跳掉前几条数据。每页大小不要写死在代码里让页面通过请求参数传pageSize后台设一个默认值兜底。还有一处容易忽略分页之后搜索关键词条件要一起带进SQL否则你搜索“Java”后翻到第二页结果又变成全表数据了。常见做法是搜索时把keyword参数拼到where条件里同时COUNT查询也要加同样的where条件两个SQL必须保持一致。4.3 借阅与归还事务边界比SQL更重要借书操作远不止“往borrow_record插一条记录”这么简单。它涉及四项数据变更检查图书是否可借、检查读者是否达到借阅上限、修改库存和状态、插入借阅记录。这四步任何一步失败前面已经做的变更都要撤销否则会出现库存减了但借阅记录没生成的问题这种数据不一致在图书管理里是灾难。public boolean borrowBook(int userId, int bookId) { Connection conn null; try { conn DBUtil.getConnection(); conn.setAutoCommit(false); // 开启事务 BookDao bookDao new BookDao(); Book book bookDao.selectById(conn, bookId); if (book null || book.getStock() 0) { return false; } int unreturnedCount recordDao.countUnreturnedByUser(conn, userId); if (unreturnedCount 5) { return false; // 最多同时借5本 } recordDao.insertBorrowRecord(conn, userId, bookId); bookDao.decreaseStock(conn, bookId); // 执行UPDATE ... SET stock stock - 1 WHERE id ? conn.commit(); return true; } catch (Exception e) { if (conn ! null) { conn.rollback(); // 任何一步异常全部回滚 } return false; } finally { DBUtil.close(conn); } }这里的核心是setAutoCommit(false)和commit、rollback三件套。观察一下方法的写法所有数据库操作都显式传了conn参数没有在dao内部自己getConnection按个分别关闭连接。原因很简单如果dao各自拿连接事务控制就失效了因为每个连接独立提交。传conn参数意味着所有SQL在同一个数据库连接上执行事务才真正生效。借阅上限5本这个参数我没有写死成5而是建议放到常量类里或者在数据库字段上做成一个配置。归还逻辑和借阅相反更新borrow_record的return_time和status把书的库存加回来。归还要不要开事务我一般也开着因为更新记录和加库存是两件事。判断是否逾期在查询时用一条SQL就够了判断条件不是status而是return_time IS NULL AND due_time NOW()这种字段当前值推导出的状态不落库反而不会出现数据不一致。5. 常见问题排查与避坑部署运行中的5个高频雷区这部分内容全部来自真实发生的排障经历。每一个问题都按“现象-原因-解决”来写你遇到一个查一个基本都能就地解决。5.1 中文乱码页面和数据库两头都要设现象列表页和输入框里输入中文后页面显示一串问号或者乱码往MySQL里存的中文重启后还能读出来但界面显示异常。原因乱码从来不是单一原因。常见有两种JSP页面没有声明UTF-8编码或者请求参数在进入Servlet时被按ISO-8859-1解码了另外数据库连接串没带characterEncoding导致JDBC传给MySQL的字节流和MySQL客户端连接用的字符集不一致。解决三处必须同时检查。第一JSP文件第一行确认是% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8%并且保证保存文件时编辑器也用的UTF-8编码。第二web.xml里配置CharacterEncodingFilter强制所有请求按UTF-8解析或者复用前面登录Filter里的request.setCharacterEncoding(UTF-8)注意这句必须放在读取任何参数之前执行。第三JDBC连接串加useUnicodetruecharacterEncodingutf8否则无论前后端多正确入库时就乱了一半。5.2 Tomcat 10下的javax.servlet包冲突现象Maven编译一切正常代码里using javax.servlet.*扔到Tomcat后启动报ClassNotFoundException具体类名是javax.servlet.Filter或者jakarta.servlet.Filter其中之一。原因Tomcat 10是个分水岭。Tomcat 9及之前用的是javax.servlet命名空间Tomcat 10起迁移到了jakarta.servlet命名空间。如果你用的是2024年后的IDEA自带Tomcat 10但pom里还依赖旧版的javax.servlet-api运行时类找不到是很正常的。解决要么把Tomcat换回9.x这种方式最省事对学习期的项目没有影响要么升级依赖坐标改成jakarta.servlet-api 5.0以上版本然后把代码里所有javax.servlet的import改成jakarta.servlet。注意这个改动会影响所有Servlet、Filter、Listener类建议一次改完再编译别混着用。5.3 数据库连接报错时区导致启动即失败现象启动后第一次请求报SQLException提示信息里包含The server time zone value йʱ is unrecognized或者Cannot create PoolableConnectionFactory。原因MySQL 8.0的驱动要求明确指定服务器时区否则它会去读系统时区在中文操作系统上时区格式带中文驱动解析不出来直接放弃连接。解决数据库连接串里加时区参数。完整写法是jdbc:mysql://localhost:3306/book_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai。不用Asia/Shanghai的话也可以写serverTimezoneGMT%2B8表示东八区但注意加号要URL编码成%2B容易踩坑建议直接用Asia/Shanghai更直白。5.4 Filter顺序问题导致静态资源全部被拦现象登录跳转没问题但登录成功进入主界面后页面样式全丢了按F12看到CSS请求全部返回302重新跳到login.jsp。原因日志里能看到的真相是Filter没有放行静态资源。初学者喜欢把Filter的WebFilter配置成/并且拦截所有路径同时对/css/style.css这类请求没做任何处理静态资源请求也被当成需要登录的页面拦截了浏览器拿到的不是CSS内容而是一个302跳转HTML。解决把项目所有静态资源放进webapp/static目录Filter里显式放行path.startsWith(/static/)这个前缀。如果这样还不行检查是不是多个Filter叠加了比如你自己写了LoginFilter同时又配置了CharacterEncodingFilter前一个放行了、后一个又给过滤掉调整Filter的顺序也要在web.xml里显式配置filter-mapping。我一般只写一个Filter把编码设置和登录拦截放在同一个文件里少一个环节就少一处踩坑。5.5 分页总页数少一页的整数除法陷阱现象数据库里11条记录每页10条列表底部只有1个页码第二页永远点不进不去。原因Java里两个int直接相除结果还是int11 / 10得到1小数部分被无情截断所以总页数算成了1页。解决总页数计算有两种写法。一是先把被除数转成double再用Math.ceil向上取整int totalPages (int) Math.ceil(totalCount * 1.0 / pageSize);二是用纯整数方式加pageSize - 1再除int totalPages (totalCount pageSize - 1) / pageSize;。两种结果一样第二种还省了浮点转换开销。另外分页SQL里LIMIT后两个参数类型是int页面上传的页码一定要做数字校验用Integer.parseInt加异常捕获否则传个非数字进来直接500。6. 部署上线与进阶把war包扔进Tomcat再想一步Token登录6.1 用Maven打war包并部署到Tomcat代码在IDEA里能跑不代表部署环境也能跑。我见过太多人凭依赖IDE的“一键运行”躲过了很多问题到了线上环境一脸懵。这里用最传统的方式走一遍命令行打包手动部署全程不依赖IDE。mvn clean package # 构建成功后 war包位于 target/book-manager-1.0.0.war cp target/book-manager-1.0.0.war /path/to/tomcat/webapps/ROOT.war cd /path/to/tomcat/bin ./startup.sh # 访问地址为 http://localhost:8080/把war包改名为ROOT.war再放进webapps应用访问路径就不再带项目名前缀。如果不改名就得访问http://localhost:8080/book-manager-1.0.0/路径难看不说还容易踩到页面里写死相对路径的坑。日志一定要看logs/catalina.out启动失败时它最诚实任何看不到报错就重启的行为都是浪费时间。6.2 再往前走一步Session换成Token如果你的项目作为毕设的话这里有一个能明显提高答辩分数的进阶方向把Session登录改成Token模式。常见做法是登录成功后服务端生成一段UUID或者JWT返回给前端前端存起来之后每次请求都放到请求头里。Filter里校验通过就从缓存中取出用户信息放回请求上下文校验失败直接返回401。这个改动的意义不在代码量而是让你理解无状态认证的动机Servlet默认的Session是保存在服务器的多台机器部署时Session同步会变成包袱而Token放到请求头里服务器不保存状态天然能水平扩展。给答辩老师讲清楚这件事比多写十个CRUD接口都管用。我最早做这个系统时把所有业务逻辑塞进JSP的脚本块页面里满是% %功能倒是全的可是每改一个字段要翻三个页面才找到代码。后来按MVC重写了一遍才明白分层不是老师的规定动作而是给自己留的后悔药。系统小正适合把每一层都吃透。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

DSP28377D启动流程全解析:从POR到main的七步硬件-固件链 2026/9/28 16:07:20

DSP28377D启动流程全解析:从POR到main的七步硬件-固件链

1. 这不是教科书里的启动流程,而是我在TI C2000产线踩了三个月坑后画出的真实路径图你手头那块DSP28377D开发板,上电后LED没亮、仿真器连不上、代码根本跑不起来——别急着换芯片或怀疑JTAG线接触不良。我去年在一家工业伺服驱动器厂商做固件支持时&…

阅读更多 →
Agent智能体开发实战:从LLM到ReAct架构的工程化指南 2026/9/28 16:07:13

Agent智能体开发实战:从LLM到ReAct架构的工程化指南

1. Agent智能体的本质与核心架构拆解1.1 从LLM到Agent:为什么需要智能体大语言模型本身是一个“输入文本、输出文本”的函数。你给它一段话,它给你一段回复,仅此而已。它没有记忆、没有工具、没有行动能力,更不会主动规划。但在实…

阅读更多 →
基于JSP+Servlet的宿舍管理系统开发实战:从数据库设计到部署避坑 2026/9/28 16:07:12

基于JSP+Servlet的宿舍管理系统开发实战:从数据库设计到部署避坑

简介:这是一个基于JSPServlet的JavaWeb宿舍管理系统完整项目,适用于毕业设计、课程设计及具有一定Java基础的学习者。项目围绕宿舍管理场景,实现了用户管理、宿舍分配、资源预订等常见功能,通过JSP页面展示界面、Servlet控制器处理…

阅读更多 →
宝峰1701刷OpenGD77固件全攻略:驱动安装、DFU模式与避坑指南 2026/9/28 16:07:12

宝峰1701刷OpenGD77固件全攻略:驱动安装、DFU模式与避坑指南

1. 宝峰1701刷OpenGD77的前期认知与方案选型宝峰1701这台机器在业余无线电圈子里算是入门级DMR手台里性价比很高的一款,原厂固件功能比较基础,菜单逻辑也偏简单。OpenGD77是一套开源固件,最早针对GD-77系列开发,后来逐步适配了包括…

阅读更多 →
ARTEMIS 框架实战:用视觉语言模型实现移动端 AI 自动化 2026/9/28 16:06:59

ARTEMIS 框架实战:用视觉语言模型实现移动端 AI 自动化

1. 为什么移动端自动化突然又火了移动端自动化这件事,其实不是新话题。从早期的按键精灵、Appium,到后来的无障碍服务脚本,再到近两年冒出来的各种 AI Agent 方案,本质上都在解决同一个问题:怎么让机器替人去点手机。但…

阅读更多 →
INT8 量化实战指南:从数值原理到 LLM 部署优化 2026/9/28 16:06:59

INT8 量化实战指南:从数值原理到 LLM 部署优化

这年头做模型部署,谁还没被显存和延迟逼疯过几次。模型在 fp16 下跑得动,一上生产环境就露馅:多路并发显存爆掉,首 token 延迟压不下来,单卡 QPS 提不上去。INT8 量化这时候往往是最立竿见影的一招——模型体积直接缩小…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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