资讯详情 Java学籍管理系统毕业设计全攻略:技术栈选型、数据库设计与避坑指南
📅 2026/10/20 17:52:43
简介基于Java与MySQL的大学生学籍管理系统毕业设计资源包面向计算机相关专业毕业设计或课程设计的学生。功能覆盖学生信息、班级、院系、专业、课程、成绩、奖惩等管理模块并设计视图、存储过程与触发器用于查询学生成绩单、自动维护班级人数、限制性别输入合法性等体现较完整的数据库应用开发思路。资源压缩包共203个文件主要由161个class字节码、32个java源码、1个SQL脚本、1个JAR依赖包及1个doc文档组成整体约1.91MB目录中包含可运行代码与设计报告。已有2434人学习下载适合作为学籍管理类系统毕业设计的整体参考。解压后可直接查看数据库建表与参照完整性约束脚本、关键业务模块源码以及项目报告文档尤其对存储过程、触发器、视图和JDBC连接等模块的实现可做对照与复用。1. 基于Java的大学生学籍管理系统这个毕业设计选题为什么年年有人做、年年有人翻车“基于Java和实现的大学生学籍管理系统”这个题目在高校毕业设计里出现频率高到很多导师第一反应是“太普通了”。但普通选题不代表容易过。我见过不少同学用Java Swing拖出几个窗口、用JDBC堆出增删改查自认为“功能都做完了”结果答辩现场被问一句“你的系统在并发访问时数据怎么保证一致”就直接卡壳。这篇就围绕这个经典选题展开技术栈怎么选、数据库怎么建模、核心代码怎么写、哪些点最容易在答辩和查重环节出问题以及如何在不改变题目的前提下把系统做出差异化。适合正在选毕设题目的本科生也适合需要参考完整项目结构的在职学生。你要的不是一个“能跑”的Demo而是一个能讲清楚、能扛住提问的完整方案。2. 技术选型与系统架构Swing/JavaFX和MySQL怎么搭才不会被答辩追问打蒙2.1 技术选型的现实考量为什么桌面端比Web端更适合这类毕设大学生学籍管理系统的核心诉求是“本地可演示、代码量适中、数据库设计有说法”。常见做法是用Java桌面GUI框架搭配MySQL少数同学做成JavaWeb但桌面端在毕业设计中占明显优势不需要部署Tomcat不需要处理前后端跨域答辩演示时双击启动即可能把精力集中到业务代码和数据库设计上。Java桌面GUI可选Swing或JavaFX。Swing稳定性好资料存量巨大遇到任何控件问题都能搜到现成方案JavaFX界面更现代支持CSS美化但打包和JDK版本兼容坑较多。我的建议是如果你对界面要求不高、想尽快跑通逻辑选Swing如果导师对界面颜值有要求选JavaFX。数据库选型上MySQL是主流选择原因很直接安装方便、JDBC驱动成熟、教务类表结构用InnoDB引擎默认支持事务这一点答辩时会被问到。有人用SQLite图省事但SQLite不适合讲并发控制一旦被追问“你的系统怎么处理多人同时录入成绩”回答起来会很被动。SQL Server和Oracle在小规模毕设里属于杀鸡用牛刀且环境配置复杂度高。2.2 三层架构界面层、业务层、数据层怎么切分很多同学写学籍管理系统最大的问题就是所有代码堆在窗体类里——按钮点击事件里直接写SQL界面和数据耦合严重。比如把SELECT * FROM student写在JButton的ActionListener里代码一多根本没法维护答辩时也说不清楚结构。规范化做法是三层架构view包放窗体类service包放业务逻辑dao包放数据库操作entity包放实体类。以一个典型学籍管理系统的目录结构为例StudentSystem/ ├── src/ │ ├── com/edu/student/ │ │ ├── view/ // 登录窗体、主窗体、学生管理窗体 │ │ ├── service/ // 学生Service、成绩Service、登录Service │ │ ├── dao/ // StudentDao、ScoreDao、UserDao │ │ ├── entity/ // Student、Score、Course、Admin │ │ ├── util/ // DBUtil、DateUtil、StringUtil │ │ └── Main.java // 程序入口 ├── resources/ │ ├── db.properties // 数据库连接配置 │ └── sql/ │ ├── init.sql // 建库建表脚本 │ └── data.sql // 初始化数据 └── lib/ └── mysql-connector-java-8.0.x.jar目录结构本身就能在答辩PPT里作为一张架构图表现层在view业务逻辑在service数据访问在dao实体对象在entity。这样的分层回答“你们系统架构是什么”时直接按目录讲就行。逻辑关系是view调用serviceservice调用daodao操作数据库后把结果封装成entity返回。每一层只做自己职责范围内的事不越级调用。2.3 JDK版本、MySQL版本和驱动选择的兼容性组合环境版本看起来是小事实际是翻车重灾区。JDK 8是稳妥选择搭配MySQL 5.7驱动用mysql-connector-java-5.1.49如果你用了JDK 11以上建议MySQL 8.0搭配mysql-connector-java-8.0.33。用错组合的典型症状是启动后加载驱动报ClassNotFoundException或者连接时报Public Key Retrieval is not allowed。驱动版本和JDK版本不匹配是学籍管理系统最常见的第一道坎。数据库连接参数在resources/db.properties里集中配置不要写死在代码中jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/student_db?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8 jdbc.usernameroot jdbc.password123456这里三个参数值得在答辩时主动解释serverTimezoneAsia/Shanghai解决MySQL 8.0默认时区与本地时间相差8小时的问题characterEncodingutf8解决中文乱码useSSLfalse避免本机连接时SSL握手警告。连接串不是抄来的而是每一段都能讲出用途这在答辩中是加分项。你的数据库用户名和密码根据自己环境修改不要直接把root/123456带上台演示。3. 数据库设计学籍管理系统的五张核心表和建库SQL怎么写得无懈可击3.1 表结构设计从需求反推字段而不是想到什么加什么学籍管理系统的核心业务围绕“学生从入学到毕业的信息维护”展开。常见做法是先画E-R图再转成表结构。你需要至少五张表管理员表、学生表、班级表、课程表、成绩表。这里有一个设计要点——学生和班级的关系一个班级有多个学生学生表中用class_id做外键关联班级表而不是把班级名字符串直接存在学生表里。这样做的直接好处是班级改名时只需要Update一行不需要逐条改学生数据。管理员表简单一些核心字段是用户名和密码但密码不能明文存储。常见做法是对密码做MD5加盐哈希数据库里存的是哈希值而非原始明文。这一点强烈建议做进去答辩时导师看到这个会问“为什么不用明文”你回答“防止数据库泄露后密码直接暴露”这是一个容易拿分的细节。学生表的设计要兼顾学籍信息的完整性和冗余度控制CREATE DATABASE IF NOT EXISTS student_db DEFAULT CHARSET utf8mb4; USE student_db; CREATE TABLE tbl_admin ( admin_id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password CHAR(32) NOT NULL, real_name VARCHAR(20), create_time DATETIME DEFAULT NOW() ); CREATE TABLE tbl_class ( class_id INT PRIMARY KEY AUTO_INCREMENT, class_name VARCHAR(50) NOT NULL, department VARCHAR(50), grade VARCHAR(10) ); CREATE TABLE tbl_student ( student_id INT PRIMARY KEY AUTO_INCREMENT, student_no VARCHAR(20) NOT NULL UNIQUE COMMENT 学号, student_name VARCHAR(50) NOT NULL, gender ENUM(男,女), birth_date DATE, phone VARCHAR(20), class_id INT, enroll_date DATE COMMENT 入学日期, status ENUM(在读,休学,毕业,退学) DEFAULT 在读, FOREIGN KEY (class_id) REFERENCES tbl_class(class_id) ); CREATE TABLE tbl_course ( course_id INT PRIMARY KEY AUTO_INCREMENT, course_name VARCHAR(50) NOT NULL, credit DECIMAL(3,1), teacher_name VARCHAR(20) ); CREATE TABLE tbl_score ( score_id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL, course_id INT NOT NULL, score DECIMAL(5,2), exam_date DATE, UNIQUE KEY uk_student_course (student_id, course_id), FOREIGN KEY (student_id) REFERENCES tbl_student(student_id), FOREIGN KEY (course_id) REFERENCES tbl_course(course_id) );这段建表脚本里有两个细节值得在报告里重点写第一student_no加了UNIQUE约束保证学号唯一这是一个业务规则的数据库级实现第二tbl_score里加了唯一键uk_student_course确保同一个学生对同一门课程只有一条成绩记录防止重复录入。这些约束条件比在Java代码里写if判断更可靠也是数据库设计规范的体现。3.2 初始化数据代码调试前先喂饱数据避免窗体打开一片空白初学开发时最常见的问题是数据库建好了但里面没有数据界面打开后表格空白分不清是查询逻辑错了还是没数据。建议写一个data.sql插入覆盖各类情况的初始数据包括3个班级、5个学生、5门课程、几组成绩、1个管理员账号。数据要覆盖边界场景——比如一个学生成绩为空用来演示“该生未录入成绩”的逻辑判断一个学生有不及格成绩用来演示统计逻辑。data.sql的典型片段INSERT INTO tbl_admin (username, password, real_name) VALUES (admin, MD5(123456), 系统管理员); INSERT INTO tbl_class (class_name, department, grade) VALUES (软件工程2022级1班, 计算机学院, 2022), (软件工程2022级2班, 计算机学院, 2022), (数据科学2023级1班, 大数据学院, 2023); INSERT INTO tbl_student (student_no, student_name, gender, birth_date, phone, class_id, enroll_date, status) VALUES (2022010101, 张三, 男, 2003-05-12, 13800000001, 1, 2022-09-01, 在读), (2022010102, 李四, 女, 2004-01-20, 13800000002, 1, 2022-09-01, 在读), (2022020101, 王五, 男, 2003-11-03, 13800000003, 2, 2022-09-01, 休学), (2023010101, 赵六, 女, 2004-07-15, 13800000004, 3, 2023-09-01, 在读), (2023010102, 陈七, 男, 2004-02-28, 13800000005, 3, 2023-09-01, 在读);插入数据后用一条简单的SELECT * FROM tbl_student;验证数据完整再做后续开发。这里用MD5函数存储密码MD5(123456)的结果是固定32位字符串。注意MySQL 8.0的caching_sha2_password认证方式对旧版JDBC驱动不友好如果驱动是5.1.x就会报认证插件错误这一点放到避坑章节细说。3.3 JDBC工具类连接管理、资源释放和SQL注入防范数据层需要一个统一的数据库工具类避免每个DAO类里重复写Class.forName和DriverManager.getConnection。典型写法如下package com.edu.student.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ResourceBundle; public class DBUtil { private static String driver; private static String url; private static String username; private static String password; // 静态代码块加载 db.properties static { try { ResourceBundle bundle ResourceBundle.getBundle(db); driver bundle.getString(jdbc.driver); url bundle.getString(jdbc.url); username bundle.getString(jdbc.username); password bundle.getString(jdbc.password); Class.forName(driver); } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(数据库驱动加载失败); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, username, password); } public static void close(Connection conn, PreparedStatement ps, ResultSet rs) { try { if (rs ! null) rs.close(); if (ps ! null) ps.close(); if (conn ! null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }注意看静态代码块里的ResourceBundle.getBundle(db)它默认从classpath根目录读取db.properties文件所以文件放到src或resources根目录即可不需要写路径前缀。Class.forName(driver)在MySQL 8.0驱动下不是必须的但保留它对老版本驱动兼容更好。资源关闭顺序是先ResultSet再PreparedStatement最后Connection如果先关了Connection再关Statement会报错。写DAO时的一个硬性要求是使用PreparedStatement而不是Statement。原因有两个第一PreparedStatement预编译SQL对SQL注入免疫第二参数用?占位代码可读性和可维护性更好。如果答辩时导师问“你的系统怎么防止SQL注入”PreparedStatement是标准答案。4. 核心功能模块实现登录、学籍管理和成绩统计的代码这样写才完整4.1 登录模块校验逻辑、会话标记和登录失败处理登录是整个系统的入口。常规设计是输入用户名和密码点击登录按钮后调用Service层校验。密码比对时把用户输入的密码做MD5再与数据库哈希值比较不在数据库层面做任何多余操作。一个完备的登录校验代码框架如下package com.edu.student.service; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.edu.student.util.DBUtil; import com.edu.student.util.MD5Util; public class LoginService { public boolean login(String username, String rawPassword) { String md5Pwd MD5Util.md5(rawPassword); String sql SELECT admin_id FROM tbl_admin WHERE username ? AND password ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, username); ps.setString(2, md5Pwd); try (ResultSet rs ps.executeQuery()) { return rs.next(); } } catch (SQLException e) { e.printStackTrace(); return false; } } public int getAdminId(String username, String rawPassword) { // 与 login 逻辑相同增加返回管理员ID用于会话标记 String sql SELECT admin_id FROM tbl_admin WHERE username ? AND password ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, username); ps.setString(2, MD5Util.md5(rawPassword)); try (ResultSet rs ps.executeQuery()) { if (rs.next()) { return rs.getInt(1); } } } catch (SQLException e) { e.printStackTrace(); } return -1; } }代码使用了Java 7的try-with-resources语法Connection、PreparedStatement、ResultSet都会自动关闭不需要手动调用close。这里体会一下DBUtil工具类带来的好处业务代码不需要关心连接怎么获取、异常怎么处理数据访问代码被极大简化。登录成功后常见的做法是把管理员ID存到当前窗体的成员变量或一个简单的Session类中用于后续操作的权限校验。实际上登录模块不需要做过重的设计比如引入Spring Security这种重量级框架对纯Java桌面毕设来说反而增加复杂度。你只需要保证两点管理员密码是密文存储登录失败有明确提示。在视图层登录失败弹JOptionPane.showMessageDialog提示“用户名或密码错误”而不是把异常堆栈直接抛给用户。4.2 学生信息管理增删改查的通用模板和窗体刷新学生信息管理是学籍系统的核心模块包含增删改查四个操作。查询部分我建议做一个“根据学号和姓名模糊查询”的联合条件搜索框而不是只有全表查询——全表查询数据量一上来就会卡且答辩时“你有没有查询功能”这个问题很尴尬。查询实现代码// StudentDao.java 中的查询方法 public ListStudent queryStudents(String keyword) { ListStudent list new ArrayList(); StringBuilder sql new StringBuilder(); sql.append(SELECT s.student_id, s.student_no, s.student_name, s.gender, ); sql.append(s.birth_date, s.phone, c.class_name, s.enroll_date, s.status ); sql.append(FROM tbl_student s LEFT JOIN tbl_class c ON s.class_id c.class_id ); sql.append(WHERE 11 ); ListObject params new ArrayList(); if (keyword ! null !keyword.trim().isEmpty()) { sql.append(AND (s.student_no LIKE ? OR s.student_name LIKE ?) ); params.add(% keyword.trim() %); params.add(% keyword.trim() %); } sql.append(ORDER BY s.student_no ); try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql.toString())) { for (int i 0; i params.size(); i) { ps.setObject(i 1, params.get(i)); } try (ResultSet rs ps.executeQuery()) { while (rs.next()) { Student stu new Student(); stu.setStudentId(rs.getInt(student_id)); stu.setStudentNo(rs.getString(student_no)); stu.setStudentName(rs.getString(student_name)); stu.setGender(rs.getString(gender)); stu.setBirthDate(rs.getDate(birth_date)); stu.setPhone(rs.getString(phone)); stu.setClassName(rs.getString(class_name)); stu.setEnrollDate(rs.getDate(enroll_date)); stu.setStatus(rs.getString(status)); list.add(stu); } } } catch (SQLException e) { e.printStackTrace(); } return list; }注意这里用LEFT JOIN而不是INNER JOIN。区别在于INNER JOIN只返回有匹配班级的学生LEFT JOIN返回所有学生班级为空的显示NULL。当班级表被误删或外键缺失时LEFT JOIN能保证学生列表不丢数据。用LIKE拼接模糊条件时前后加上%中文搜索在MySQL里需要字符集一致否则中文关键词查不出来——这个坑在第5章细说。新增和修改操作都对应同一个窗体用JDialog实现。区别只在于标题和初始值新增时所有字段空白修改时把选中行的数据回填到各输入框。保存时执行INSERT或UPDATE操作。删除操作不要直接物理删除常见做法是业务上只允许删除“已毕业”或“已退学”状态的学生否则弹窗提示“在读学生不可删除”。这个软性限制在答辩时是一个业务场景上的加分项。4.3 成绩与统计模块用SQL聚合函数做报表而不是Java里算成绩模块涉及成绩录入、成绩查询和成绩统计三块。录入表单选择“学生—课程—分数”分数要校验0到100之间保存时捕获唯一键冲突——如果重复录入同一学生同一课程MySQL会报错Java代码要提前提示用户。一个常见的业务需求是统计每门课程的通过率、平均分、最高分、最低分这个在Java里做数据遍历会写大量循环且效率低但SQL一条语句就能解决public ListScoreStat getCourseScoreStat() { String sql SELECT c.course_name, COUNT(sc.score_id) AS total_cnt, AVG(sc.score) AS avg_score, MAX(sc.score) AS max_score, MIN(sc.score) AS min_score, SUM(CASE WHEN sc.score 60 THEN 1 ELSE 0 END) AS pass_cnt FROM tbl_course c LEFT JOIN tbl_score sc ON c.course_id sc.course_id GROUP BY c.course_id, c.course_name; // 执行查询并封装结果... }用GROUP BY配合聚合函数一次查出全部统计结果然后把结果填充到JTable里展示。CASE WHEN语句计算及格人数避免了在Java代码中二次遍历。这段SQL可以在答辩时作为“数据库高级查询”的例子展示比简单SELECT更显专业水准。当数据量增加时分页是一个可选优化。Swing里用JTable展示大量数据会卡顿常见做法是用LIMIT ? OFFSET ?做分页查询在界面底部放“上一页/下一页”按钮。这个功能不是必须的但做了会让系统显得完整。5. 毕业设计常见避坑代码能跑但答辩翻车的6个细节5.1 驱动版本和MySQL认证插件不匹配启动即报错现象程序运行后控制台输出java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed或者Access denied for user rootlocalhost。原因MySQL 8.0默认使用caching_sha2_password认证方式旧版MySQL驱动5.1.x不支持该插件。另一个诱因是连接串没加allowPublicKeyRetrievaltrue。解决把驱动换成对应的新版本并确保连接串中包含useSSLfalseallowPublicKeyRetrievaltrue。如果你用的是MySQL 5.7就不需要有这个参数。判断依据很简单SELECT VERSION()看清版本后统一搭配不要盲抄网上的连接串。5.2 中文乱码数据库表、连接串、界面三层都要统一字符集现象从数据库查出来的中文字符在JTable中显示为??或者方框甚至查询条件输入中文后查不到数据。原因三层字符集不一致。数据库是utf8mb4但连接串没加characterEncodingutf8或者表结构建库时没指定DEFAULT CHARSET utf8mb4或者IDE控制台本身用系统默认编码GBK读到UTF-8字节。解决第一步确认数据库表和库的字符集ALTER TABLE tbl_student CONVERT TO CHARACTER SET utf8mb4;第二步在连接串里加characterEncodingutf8第三步在IDE里把控制台输出编码调成UTF-8。三个位置都对齐后乱码问题基本根除。5.3 按学号查询中文关键词无结果字符集吃掉了LIKE条件现象代码逻辑没问题但WHERE student_no LIKE %张%查不到任何记录英文和数字关键词却能查出来。原因连接串没有characterEncodingutf8驱动默认使用ISO-8859-1解码参数中文关键词到数据库后已经变成乱码自然匹配不到任何记录。解决和5.2同一根源。5.2解决后这个现象随即消失。另外在PreparedStatement里设置参数时setString方法已经处理了字符集转换不需要手动做URLEncoder。5.4 Swing窗体数据不刷新新增学生后表格还是旧数据现象点击“新增学生”并保存后主界面的表格里看不到新记录必须关闭再打开窗体才显示。原因保存操作只写了数据库没有触发表格模型的数据更新。JTable的数据模型在初始化时加载了一次数据之后不会自动同步。解决保存成功且关闭子窗体后重新调用loadTableData()方法刷新表格数据。正确做法是子窗体的对话框设置为模态setModal(true)关闭后父窗体继续执行刷新逻辑或者给子窗体添加一个监听器回调。这属于GUI编程中很经典的“模态对话框返回值处理”问题。5.5 密码明文存储一旦被追问就是硬伤现象数据库的tbl_admin表里直接存了文本密码比如123456打开Navicat就能看到。原因图省事把注册和登录的密码校验直接拿明文比较。解决不要问“我数据库都让别人看到了还有什么好防的”存储密码哈希是对用户负责的基本素养。用MD5或SHA-256做一次哈希登录时也做同样哈希后比对。即使答辩现场不做演示报告里写明“密码经MD5摘要存储不保存明文”也能证明你考虑了安全问题。如果时间充裕可以进一步做“密码加盐”——例如用户名字符串拼接密码再哈希每行一个随机盐值。5.6 报告里写了一大堆模块但代码里没有答辩自查清单现象报告写成“系统包含班级管理、成绩分析、报表导出”等模块但实际代码里只有一个简单的增删改查导师一翻代码就对不上。原因报告先于代码写或者参考了别处的目录结构没有逐项对照核实。解决交材料前逐条核对报告功能和代码。报告里出现的每一个功能名都在代码里能找到对应类或方法。不一致宁可删掉功能描述也不要给答辩流程埋下一个“前后矛盾”的雷。真实项目宁可功能少而精不可描述多而空。6. 从“能跑”到“优秀”三个性价比最高的提升方向学籍管理系统的功能上限很明确但同一个题目做出鉴别的概率取决于三个层面的完成度数据安全、操作日志、导出能力。这三个方向投入产出比极高不改变系统架构却能在答辩中明显拉开差距。第一个是操作日志功能。建一张tbl_operation_log表字段包括log_id, admin_id, action, detail, operate_time。在新增、修改、删除操作后统一记录一条日志比如“管理员admin对学号2022010101执行了修改操作”。这个功能在代码层面只需在Service层调用一个LogService.addLog(...)方法即可但带来的价值是系统从“能做增删改查”上升到“对操作可追踪”——这在真实业务中是刚需。第二个是数据备份能力。在系统中加一个“数据备份”按钮后台执行mysqldump命令把数据库导出为SQL文件。注意mysqldump需要从外部进程调用Java里用ProcessBuilder来实现。这个功能单点实现成本低但意义很大——任何一个真实的管理系统都不可能没有备份机制哪怕只是简单导出。答辩时导师看你考虑到了这一点印象分提升明显。第三个提升方向是做一个简易的数据可视化。直接用JFreeChart库生成学生成绩分布柱状图、班级人数饼图。JFreeChart支持Swing集成播放图表到JPanel只需几行代码但视觉冲击力远大于一张又一张的表格而且技术含量不低。对“成绩统计”这个功能来说图表的表达能力远强于JTable。我最想提醒的是不要在这个项目中追求“框架炫耀”。把Spring Boot、MyBatis、Maven全家桶全部堆进去对于毕设来说反而会变成负担——引入框架意味着自己卷入了依赖管理、配置文件和构建工具的额外复杂度任何一个依赖报错都会让答辩前的准备变成一场灾难。Java原生JDBC的手动SQL写法看起来“土”但它能让导师看到你理解了JDBC、理解了SQL、理解了异常处理。这些底层能力的体现比框架列表更能反映真实水平。我自己的习惯是每次提交前先在自己电脑上从零配置一次环境按报告里的步骤走一遍确认不依赖他人机器上的特殊设置。把这一步养成习惯之后不会出现答辩时换台电脑就运行不起来的情况。希望这篇对你有帮助祝答辩顺利。本文还有配套的精品资源点击获取