期末项目:从环境搭建到答辩避坑全指南)
简介这是一份面向高校期末项目作业的高校机房管理系统完整资料包基于JSPMySQL技术栈适合Java Web初学者参考与直接提交。压缩包内含设计说明书、文献综述、运行说明书等Word文档以及完整源代码、数据库脚本与部署所需环境软件共450个文件约574MB涵盖java、jsp、js、css、jar、class、doc、png、db、exe等类型其中java、class与jar构成后端逻辑与依赖库jsp、js与css负责动态页面及前端交互doc为可编辑论文与说明文档db为数据库文件png、gif等为界面素材并附有环境安装所需的exe与msi程序结构清晰便于按需取用。代码覆盖设备管理、实验室管理、维修申报、用户管理等功能模块配合运行说明可快速启动已有1339人学习下载。资源从项目设计、编码实现到论文撰写提供一条龙支持甚至可直接修改名称提交作业兼顾学习与实战需求。1. 高校机房管理系统JSPMySQL期末包先搞清楚它解决什么问题期末周收到一份「高校机房管理系统JSPMySQL」的压缩包里面是设计说明书、源代码、文献综述、运行说明书和一堆软件安装包这是期末项目作业最常见的形态别人把完整链路打包好了你负责把环境跑起来、把流程讲清楚。可现实往往是解压后不知道先看哪个文件装 MySQL 时各种玄学报错运行说明书里的路径还是作者电脑上的换台机器就崩。这篇文章只解决一件事把你手上的「高校机房管理系统」从压缩包变成一台能演示、能答辩、能改造成毕设的 JavaWeb 项目。适合手里有这个包但没跑起来的人也适合想用机房管理当课设/毕设底座但不想从零写的前端同学。2. 为什么 JSPMySQL 在课设场景反而最稳技术边界与包内文件用法2.1 JSP 入门教程的老三样为什么期末作业还在用jsp 入门教程里最经典的组合就是 JSPServletMySQL放到 2025 年确实显得年纪大但正因为年纪大它在期末项目作业里的坑早就被踩平了。你遇到的中文乱码、驱动找不到、Tomcat 闪退十年前的前辈就遇到过网上随便一搜就是现成答案。相比之下 Spring Boot 是新但一个只有一周时间、还要写设计说明书的期末作业光 Maven 依赖冲突就能耗掉你两个晚上。对比项JSPServletMySQL传统 javaweb 项目Spring Boot MyBatis上手门槛会 JDBC 就能跑IDEA 直接打开要理解 Maven、自动配置、注解扫描运行环境JDK 8 Tomcat 8.5 MySQL 5.7JDK 17 Maven 内嵌 Tomcat出问题排查JSP→Servlet→DAO→数据库链路清晰依赖冲突、版本兼容层层叠叠答辩风险老师本科阶段就做过这类项目容易被追问「为什么不前后端分离」参考资料量极多模板比需求都多多但基本都是微服务相关机房管理系统能成为基于 JSP 的毕设选题里的常客核心原因是需求清晰学生上机、下机结算、管理员统计业务边界干净表与表之间的关系一眼能看懂。答辩时老师问你「这张表为什么这样设计」你能讲出外键和 ER 图就过关了。做这种传统 JSP 项目出问题能顺着 JSP 页面到 Servlet 到 DAO 一层层查黑匣子很小这是它最大的优势。2.2 机房管理系统拆开看三个角色、六张表、一条主流程不管压缩包里的项目叫什么名字机房管理系统的骨架基本都是同一套管理员管理机房和设备、学生登记上机、下机时算钱。业务流程是学生到机房 - 管理员分配电脑 - 学生上机 - 下机结算 - 管理员查看统计报表。落到代码上就是三张基础表机房、电脑、学生、一张流水表上机记录再加上管理员的登录和管理功能。拿到包之后我一般会先画一张 URL 路由表把页面和 Servlet 对应起来这样系统结构就清楚了。常见做法的路由组织大致如下请求路径对应处理角色作用/login.jsp登录页公共表单提交到 LoginServlet/LoginServlet登录校验公共查用户表写 Session/manager/index.jsp管理首页管理员显示机房和设备状态/RoomServlet?actionadd新增机房管理员机房增删改/StudentServlet?actionlist学生列表管理员学生信息管理/ComputerServlet?actionadd设备登记管理员批量添加电脑/record/checkin.jsp上机登记学生/管理员选机器、记开始时间/RecordServlet?actioncheckout下机结算学生/管理员算费用、更新记录我看 javaweb 项目完整案例 mysql 时发现这类包的 Servlet 命名和页面路径可能带 t_ 前缀或者叫 machine 不叫 room但请求的组织方式大同小异。建议你把这份路由表打印出来拿到包后对着源代码找对应的 Servlet 和 JSP半小时就能摸清整个项目结构比盲目点页面管用得多。2.3 压缩包里每种文件是干嘛的拿到包先按这个顺序读很多同学拿到压缩包第一件事是双击运行说明书结果运行说明书里写着「把数据库导入 Navicat」而电脑上连 MySQL 都没有直接卡在第一步。我的建议是先浏览一遍包内文件清单搞清楚每样东西在哪个环节用包内文件本质什么时候用设计说明书需求分析 ER 图 表结构说明写文档、答辩被问设计思路时源代码真正要跑的东西重点看 src 和 WebContent/WEB-INF/lib排查问题时逐层看文献综述课程论文的调研部分引用需要核实交文档前用自己的话重写一遍运行说明书作者电脑上的操作步骤端口和路径都要重新核对第一次运行照着做所需软件JDK、Tomcat、MySQL 安装包和驱动 jar配环境时逐个核对版本正确的阅读顺序是运行说明书 - 源代码目录结构 - 设计说明书 - 文献综述。运行说明书告诉你作者用的是哪个版本组合源代码告诉你驱动 jar 在不在 lib 里设计说明书给你 ER 图最后才轮到文献综述这种凑字数文档。这里有个血泪教训先给整个解压目录做一份备份再动手改坏了大不了删掉重来。很多包在作者电脑上能跑换台机器死在环境上备份就是你最后一颗后悔药。3. 复现环境JDK 8 Tomcat 8.5 MySQL 的版本组合与初始化3.1 版本组合为什么是这三个老 JSP 项目的新版本兼容问题包里面的运行说明书如果写的是「环境要求 JDK 1.8 Tomcat 8.5 MySQL 5.7」不要自作主张装最新版。JDK 17 对老 JDBC 和 JSP 编译有兼容问题Tomcat 10 更是直接把包名从 javax.servlet 换成了 jakarta.servlet你放上传统 JSP 项目启动就报 ClassNotFoundException。这不是你代码的问题是容器版本太新。组件推荐版本原因JDK1.88u202 或更高 8.xTomcat 8.5 官方支持javac 编译老代码稳定Tomcat8.5.x用的是 javax.servlet 命名空间兼容传统 JSPMySQL5.7 或 8.0.x5.7 配 5.1.x 驱动最省事8.0 必须处理认证插件mysql-connector-java5.1.49 或 8.0.33与 MySQL 大版本对应不是越新越好配置 JDK 环境变量是第一步。Windows 下我用 setx 写 JAVA_HOME然后手动去系统环境变量的 PATH 里追加%JAVA_HOME%\bin不推荐直接用 setx 覆盖 PATH那会把原有路径冲掉等于给自己挖坑。# 设置 JAVA_HOME路径换成你自己的 JDK 解压目录 setx JAVA_HOME D:\Java\jdk1.8.0_202 # 设置完成后新开的命令行窗口里验证 java -version javac -versionsetx 只对之后新开的窗口生效验证前要重开一次 cmd。javac 能输出版本号说明 JDK 没问题Tomcat 闪退问题里至少一半是因为这个没配好。3.2 MySQL 安装与初始化从下载到导入 sql这里以 Windows 下 MySQL 5.7 的 zip 免安装版为例这是期末项目最快的路线。去官网下载 mysql-5.7.44-winx64.zip解压到 D 盘然后管理员身份打开 cmd 执行初始化。我在本地装过几十遍这条流程最不容易翻车。# 管理员 cmd进入 MySQL 解压目录 cd /d D:\mysql-5.7.44-winx64\bin # 初始化数据目录生成一个密码为空的 root 账号 mysqld --initialize-insecure --console # 启动 MySQL 服务 net start mysql--initialize-insecure是本地开发的关键参数它生成的 root 用户密码为空免去初装时找临时密码的麻烦。生产环境千万别这么干但期末作业就是为了本地能跑空密码初始化后马上改掉就行。启动成功后进入 MySQL 命令行改密码、建库、导入项目自带的 sql 文件-- 进入 mysql 命令行mysql -u root -p密码直接回车 ALTER USER rootlocalhost IDENTIFIED BY 123456; CREATE DATABASE IF NOT EXISTS room_db DEFAULT CHARSET utf8mb4; USE room_db; SOURCE D:/sql/room_db.sql;SOURCE 后面跟 sql 文件的绝对路径注意 Windows 下用正斜杠写反斜杠经常会报错。数据库名不一定叫 room_db以运行说明书或 db.properties 里写的为准两处必须完全一致多一个下划线都连不上。Linux 下安装 mysql 的流程类似rpm 包装完后用 systemctl start mysqld 启动服务没起的典型报错就是 ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock (2)这个放进第 5 章一起讲。3.3 项目里的连接配置db.properties、驱动 jar 和数据库连接池数据库装好只是第一步项目能不能连上库取决于连接参数。传统 JavaWeb 项目一般把连接信息放在 src 下的 db.properties或者直接写死在 DBUtil.java 里。我一般先搜jdbc:关键字把项目里所有写连接串的地方都找出来因为不少包在 db.properties 和代码里各写了一份只改一处就会漏。jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/room_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue jdbc.usernameroot jdbc.password123456逐项说参数com.mysql.jdbc.Driver 是 5.1.x 驱动的类名如果你用的是 8.0.x 驱动类名要改成 com.mysql.cj.jdbc.Driver两个写反都会报 ClassNotFoundExceptionuseUnicode 和 characterEncoding 解决中文乱码useSSLfalse 是为了关掉连接时的 SSL 握手很多人遇到的 mysql ssl 连接错误就是这里没设serverTimezoneAsia/Shanghai 是给 MySQL 8.0 用的5.7 不写也能跑但写上加保险allowPublicKeyRetrievaltrue 配合 MySQL 8 的 caching_sha2_password 认证插件使用详见第 5 章避坑。驱动 jar 的坑比参数还隐蔽。包里的 lib 目录如果放的是 mysql-connector-java-5.1.49.jar你连 MySQL 8.0 时会报 Public Key Retrieval is not allowed如果用 8.0.33 驱动连 MySQL 5.7 反而问题不大但为了省事我习惯 5.7 配 5.1.x、8.0 配 8.0.x。至于数据库连接池课设项目基本都用 DriverManager 直连量级小到不需要池子但答辩时老师问「连接池是什么」你得能说出 DBCP/C3P0 的原理启动时预创建一批连接放池子里用的时候借、用完还避免频繁建连。原理比死记配置重要本文第 4 章的 DBUtil 会把这个讲透。4. 让数据库和页面接通核心建表 SQL、JDBC 连接与登录会话4.1 六张表撑起一个机房管理系统核心建表 SQL如果你的源码包里没有 sql 文件或者你想自己重建数据库下面这组表是机房管理系统最常见的一套骨架。表名和字段名在不同包里会有差异但设计思路是通用的机房放费率、电脑归属于机房、上机记录同时关联学生和电脑。CREATE TABLE room ( room_id INT PRIMARY KEY AUTO_INCREMENT, room_name VARCHAR(50) NOT NULL, room_rate DECIMAL(10,2) DEFAULT 1.50 COMMENT 每小时收费标准, capacity INT DEFAULT 40, status TINYINT DEFAULT 1 COMMENT 1可用 0停用 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE computer ( computer_id INT PRIMARY KEY AUTO_INCREMENT, room_id INT NOT NULL, computer_no VARCHAR(20) NOT NULL, ip_address VARCHAR(15), status TINYINT DEFAULT 0 COMMENT 0空闲 1使用中 2故障, FOREIGN KEY (room_id) REFERENCES room(room_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE student ( student_id VARCHAR(20) PRIMARY KEY COMMENT 学号作为登录名, name VARCHAR(50) NOT NULL, password VARCHAR(64) NOT NULL, balance DECIMAL(10,2) DEFAULT 0.00, major VARCHAR(50) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE record ( record_id INT PRIMARY KEY AUTO_INCREMENT, student_id VARCHAR(20) NOT NULL, computer_id INT NOT NULL, start_time DATETIME NOT NULL, end_time DATETIME DEFAULT NULL, total_fee DECIMAL(10,2) DEFAULT 0.00, status TINYINT DEFAULT 0 COMMENT 0未结算 1已结算, FOREIGN KEY (student_id) REFERENCES student(student_id), FOREIGN KEY (computer_id) REFERENCES computer(computer_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;几个设计点值得在答辩时讲room_rate 放在 room 表而不是 computer 表因为一个机房的电脑统一计费机房调价只改一条记录这是避免数据冗余的典型做法computer.status 默认 0 表示空闲record.status 默认 0 表示未结算这就是 mysql 设置默认值为 0 的实际应用场景页面加载时不用每次判断空值计费字段全用 DECIMAL(10,2) 而不是 float因为浮点数算钱会有 0.10.2 的精度问题期末作业被问到就在这里加分。record 表是整套系统的核心它同时挂着 student 和 computer 两个外键能查出「谁在哪台机器上机了多久」。start_time 在 checkin 时写入end_time 在 checkout 时补上中间的时间差乘以费率就是费用。只要这张表设计对后面的统计功能都建立在它之上。4.2 DBUtil 与 PreparedStatement作业答辩最常问的两个点传统 JSP 项目的 DAO 层几乎都套用一个 DBUtil 工具类静态代码块加载驱动提供 getConnection 和资源关闭方法。下面这个写法是课设项目里最常见的版本参数和上一章的 db.properties 一一对应。import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class DBUtil { private static final String DRIVER com.mysql.jdbc.Driver; private static final String URL jdbc:mysql://localhost:3306/room_db ?useUnicodetruecharacterEncodingutf8useSSLfalse serverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue; private static final String USER root; private static final String PASSWORD 123456; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws Exception { return DriverManager.getConnection(URL, USER, PASSWORD); } public static void close(Connection conn, Statement stmt, ResultSet rs) { // 关闭顺序rs - stmt - conn写反会长时间占用数据库连接 } }Class.forName 加载驱动在 8.0 驱动下其实可以省略但保留它能让 5.1 老驱动也稳定工作课设项目别图省事删这一行。close 方法里我特别留了注释ResultSet 先关、Statement 再关、Connection 最后关顺序反了会占用连接直到超时页面一多就卡死。这个工具类本身不复杂但 DAO 里如果每写一个查询都 new Connection 而不关闭运行十分钟后就会报 Too many connections。另外一个答辩高频问题是 SQL 注入。写查询时用 PreparedStatement 而不是 Statement原因有两个第一getParameter(id)拼进 SQL 时用户输入 or 11能把整张表带出来第二PreparedStatement 用?占位setString 传参会自动处理类型和转义SQL 语句结构固定注入直接失效。在作业里做了这层防护老师会觉得你不是纯抄的。4.3 登录、Session 与权限让三个角色看到不同的页面机房管理系统至少有管理员、学生两种角色有的还带教师。登录后的会话控制是 JSP 项目里最容易扣分的地方也是最值得写到答辩稿里的内容。核心逻辑写在登录 Servlet 里验证账号密码后把用户身份放进 Session。String studentId request.getParameter(studentId); String password request.getParameter(password); String sql SELECT * FROM student WHERE student_id ? AND password ?; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, studentId); ps.setString(2, password); ResultSet rs ps.executeQuery(); if (rs.next()) { HttpSession session request.getSession(); session.setAttribute(user, rs.getString(name)); session.setAttribute(role, student); response.sendRedirect(request.getContextPath() /student/index.jsp); } else { response.sendRedirect(request.getContextPath() /login.jsp?error1); }这里有两个细节决定你能不能跑通一是 Session 里存了 user 和 role 两个属性页面顶部靠 role 判断该显示管理入口还是学生入口二是重定向用了 request.getContextPath() 拼路径而不是写死/项目名/。war 包部署后项目名就是上下文路径写死绝对路径换台机器就 404这是传统 JSP 项目最常见的翻车点之一。至于权限拦截常见做法是在 web.xml 里配一个 Filter拦截 /manager/* 和 /student/* 开头的请求从 Session 里取不到 role 就直接踢回 login.jsp。如果包里面没有 Filter每个 JSP 页面的头部加一段% if (session.getAttribute(user) null) { response.sendRedirect(request.getContextPath() /login.jsp); return; } %也能达到同样效果。登录、Session、权限三段接上整个系统就从登录页走到了统计页数据库和页面的链路算是彻底打通了。5. 打包发布与运行排查war 部署路径和 5 个高频避坑点5.1 用 IDEA 导出 war 并部署到 Tomcat从 Build 到访问传统 JSP 项目打包 warIDEA 的操作比命令行顺手。打开项目后按 CtrlAltShiftS 进入 Project Structure选择 Artifacts点加号新建 Web Application: ArchiveOutput Layout 里确认 WEB-INF/classes 和 lib 都被打进去点 OK。然后菜单 Build - Build Artifacts - Buildwar 会生成在 out/artifacts 目录下文件名默认是项目名。# 把项目生成的 war 复制到 Tomcat 的 webapps 目录 copy D:\work\out\artifacts\room\room.war D:\apache-tomcat-8.5.100\webapps\ # 进入 Tomcat bin 目录用前台模式启动 cd /d D:\apache-tomcat-8.5.100\bin catalina.bat runwar 放进 webapps 后Tomcat 会自动解压并发布浏览器访问http://localhost:8080/room/就能看到登录页路径里的 room 是 war 文件名。我强烈建议用 catalina run 而不是 startup.bat 启动前者在前台运行所有日志直接打在窗口里启动失败能看到完整堆栈后者一闪而过每次都像在赌运气。Linux 下发布命令对应改成cp /opt/build/room.war /opt/apache-tomcat-8.5.100/webapps/然后执行bin/catalina.sh run。端口冲突的话编辑 conf/server.xml 把 8080 改掉查看端口占用用netstat -ano | findstr :8080找到 PID 后 taskkill 结束进程。这个排查链路我每次部署都会走一遍熟练后五分钟能处理完。注意启动后如果访问报 404先检查访问路径是不是http://localhost:8080/war文件名/。IDE 里跑和 war 部署的上下文路径不一样代码里写死/room/的页面war 改名后就找不到。5.2 运行说明书没写全的验证步骤从登录到统计走一遍运行说明书往往只写到「启动 Tomcat访问首页」但答辩演示需要的是完整业务流。我建议按下面的清单走一遍每一步都确认通过了演示时才不会卡壳步骤操作预期结果1浏览器打开登录页页面样式正常无 500 报错2用管理员默认账号登录跳转管理首页3新增一个机房机房列表多一行4在机房下添加一台电脑设备状态显示「空闲」5用学生账号登记上机对应电脑状态变「使用中」6执行下机结算记录表出现费用金额7管理员打开统计页面费用汇总与记录一致这里面最容易忽略的是第 5 和第 6 步很多包上机登记和下机结算是两个 Servlet学生账号的权限可能根本不够操作这时候要去管理员那边代操作。另外演示前先在数据库里插两条现成的学生记录和几台电脑别现场手输紧张时打错一个字就得重新登录。老师通常会打开你电脑上的 Navicat 或者 MySQL Workbench 直接看表。你可以在演示前先跑一句SELECT * FROM record;确认数据在同时把这条查询讲成「我用 SQL 验证过结算逻辑」这是演示时隐形的加分项。5.3 五个高频踩坑现象、原因、解决坑一Tomcat 启动闪退窗口一闪而过。现象是双击 startup.bat 后黑窗口立刻消失什么报错都看不到。原因九成是 JAVA_HOME 没配好或者 8080 端口被别的进程占着。解决方法是先用 catalina.bat run 前台启动报错会直接留在窗口里再确认 JAVA_HOME 指向的是 JDK 而不是 JRE最后 netstat 查端口被占了就改 conf/server.xml 里的 Connector 端口。坑二ClassNotFoundException: com.mysql.jdbc.Driver。现象是页面 500堆栈第一行找不到驱动类。原因是 mysql-connector-java.jar 没放进 WEB-INF/lib或者 IDEA 里没把 jar 加到 Library。解决方法是把「所需软件」目录里的驱动 jar 复制到 WebContent/WEB-INF/lib 下右键项目刷新如果代码里写的是 com.mysql.cj.jdbc.Driver那你用的是 8.0 驱动类名不要改回去。坑三Access denied for user rootlocalhost。现象是数据库连接失败账号密码被拒。原因有两个db.properties 里的密码和 MySQL 实际密码不一致或者 MySQL 8.0 的认证插件是 caching_sha2_password老驱动不认识。解决方法是先在 mysql 命令行确认密码再统一改 db.propertiesMySQL 8.0 执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123456;后FLUSH PRIVILEGES;把认证方式降级即可。坑四新增学生姓名在页面上全是问号。现象是录入中文后列表显示??但英文正常。原因是建库时字符集不是 utf8mb4JDBC 连接也没带编码参数。解决方法是删库重建时加上DEFAULT CHARSET utf8mb4连接串补characterEncodingutf8JSP 页面第一行写上% page contentTypetext/html; charsetutf-8 %三处统一乱码立刻消失。坑五ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock (2)。现象是 Linux 下 mysql 命令连不上本机热词里高频出现。原因不是密码错是 mysqld 服务根本没启动。解决方法是执行systemctl start mysqld或service mysqld start然后systemctl status mysqld确认状态。如果装了 MySQL 8.0服务名可能是 mysqld 也可能是 mysql两个都试一遍。这五条覆盖了环境、驱动、账号、编码、服务五个层面是我在这些传统 JSP 项目上翻车最多的位置。遇到问题别急着重装先看窗口里的具体报错再对照上面的因果排查。6. 从作业到毕设自动结算改造与最小回归验证6.1 上机记录自动结算一条 UPDATE 把费用算出来原包的下机结算如果是在 Java 里写的改造时可以换成一条 SQL让它更接近真实系统。以下这条是我常用的结算语句按分钟计费并保留两位小数UPDATE record r JOIN computer c ON r.computer_id c.computer_id JOIN room m ON c.room_id m.room_id SET r.total_fee ROUND( TIMESTAMPDIFF(MINUTE, r.start_time, IFNULL(r.end_time, NOW())) / 60.0 * m.room_rate, 2), r.status 1 WHERE r.record_id ? AND r.status 0;TIMESTAMPDIFF 算出上机分钟数除以 60 转成小时乘机房的每小时费率ROUND 取两位小数。IFNULL 的作用是兜底万一有记录没写 end_time就用当前时间算避免费用为 0。相比在 Java 里逐行计算这条 SQL 让数据和页面展示天然一致答辩讲到这一步老师能看出你理解业务而不只是会 CRUD。想再加亮点就把它写成存储过程这在 MySQL 存储过程的题目里是现成的加分项。6.2 改完不翻车最小回归验证清单任何改动做完我都坚持跑一遍最小回归清单顺序固定登录 - 新增机房 - 添加电脑 - 学生上机 - 下机结算 - 统计页核对金额。核心验证点是记录表里的 total_fee 是否等于上机分钟数乘费率统计页和明细页金额是否一致。我当年用这套路把课设改成毕设血泪经验是改代码前先备份一份能跑的 war 包改崩了十分钟内还原这份 war 就是你的后悔药。演示前一晚重启一遍 MySQL 和 Tomcat确认服务开机后能自己拉起来别等答辩现场才发现环境被你前一天的调试污染了。希望帮到你。本文还有配套的精品资源点击获取