课程设计纸
目 录
1 设计题目.........................................................1 2 设计目的........................................................2 3设计分析 ......................................................... 3 4 概念结构设计 .................................................... 6 5 逻辑结构设计 ................................................... 11 6 表结构设计 ..................................................... 13 7 具体功能实现 ................................................. .15
8 总结...........................................................26 9 附录 ......................................................... 27
共 39 页 第 0 页
┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊
课程设计纸
1. 设计题目
学生成绩管理系统
共 39 页 第 1 页
┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊
课程设计纸
2.设计目的
本学生成绩管理系统模块是为了实现学校人力资源的优化和学生成绩管理的科学管理而设计的,通过试用本系统,可以更加有效的管理学生成绩信息, 用数据库对大量数据的复杂操作进行保存,其中包括学生的基本信息,成绩信息和班级成绩信息并且具有信息的增加,查询,修改和修改等功能。
共 39 页 第 2 页
┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊
课程设计纸
3. 设计分析
3.1 可行性研究
(1)利用面向对象的JAVA语言来进行系统开发,可以很方便的根据实际定义各个所需要的对象,并对这些对象进行操作。同时由于本系统是在用戶图形界面进行各种用户操作,可以使界面多样化满足人们的对美观的要求,更易懂、更方便操,能够更方便验证用户的输入是否正确,并进行相应的提示,这些需求和功能在目前情况下利用所学知识完全可以实现。并且本系统采用文件来存储数据,操作比较简单,方便学生成绩的导出与打印,省去了人力的大量抄写,但是在一定程度上数据量和系统的运行速度。
该学生成绩管理系统可以在Microsoft Windows XP 和 Windows 7系统下进行开发和运行的,这些系统目前已经比较普及,用户在该系统中可以方便的进行各种操作,实现预期的目的。该系统的开发成本比较低,符合了人们对低资源高效率的追求,利用较低的成本换取更高的回报。
(2)具体的定义问题:
此次开发的项目是一个学生成绩管理系统,进行学生信息的增删改查、学生成绩的管理和班级成绩的管理,在进入系统之前需要登陆,登陆成功后即可进入系统的相应的用户界面。
本系统的身份主要分为教务处、老师和学生。
①若是教务处登录可以进行多条件查询学生的信息,也可以增加、删除、修改、学生的信息,并可多条件查询学生成绩的信息,以及成绩的增加和修改,查询班级成绩,可按班级查询或按日期查询。
②若是老师登录,则可以查询所有的学生信息、学生成绩和班级成绩。 ③若是学生登录,则只可以查询自己的信息和成绩,不可进行对任何信息的任何修。
④在登录界面有注册功能,并以学号为线索贯穿整个系统。 系统的基本流程图,如图3.1所示:
共 39 页 第 3 页
┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊
课程设计纸
图3.1 系统流程图
3.2 需求分析
(1) 用户需求:学生成绩管理系统的用户类,其属性有用户名密码以及身份,用户必须登录成功后才可进入主界面,用户再实现学生信息的查询、添加删除、修改,以及学生成绩的查询管理等功能,管理好这些用户对系统安全有十分重要的影响。
(2) 功能需求:
① 登录模块:主要登录,系统自动根据用户的身份权限进行判断再弹出不同的用户界面。
② 注册模块:此模块用于添加用户并设定登录密码。
③ 学生信息管理模块:使教务处实现对学生信息的添加、删除、修改、查找,以及对外键密码的查询;教师和学生则只可以查看。
④ 学生成绩管理模块:教务处可以实现对学生成绩添加、修改、查找学生成绩可以进行学生成绩的操作;教师和学生只可以查看。
⑤ 班级成绩管理模块:此模块主要是按条件查询功能,不能手动添加记录,只能在添加学生成绩时,有系统自动调用方法对此表进行按班级并继承此
共 39 页 第 4 页
┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊
课程设计纸
班级的成绩添加记录,如没有此班级的记录则不用继承任何数据此学生的总成绩和平均成绩就是此条记录的总成绩和平均成绩。
共 39 页 第 5 页
┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊
课程设计纸
4. 概念结构设计
学生成绩管理系统的设计,主要解决的是对系统中的学生的基本信息,学生成绩的基本信息,以及班级成绩管理工作。首先,需要定义各个所需要的数据对象,然后在这些对象上进行操作;其次,实现功能模块时,采用先模块化,后集成化,即对系统各个功能模块分别设计和调试,在创建系统主登录界面时再将各个功能模块通过主菜单对各个模块的调用集成到一起,最后进行系统整体设计调试。在数据存储和操作方面,采用文件的读写导出数据库,并在读出数据之后放入链表进行操作;并在数据更新之后将数据存到数据库中,这样可以减少对磁盘的直接操作次数,从而提高系统设计的效率。
4.1 概念模型(系统E-R图) (1)局部E-R图
① 学生实体E-R图,如图4.1所示:
图4.1 学生实体图
院系 入学年月 出生年月 民族 学生 籍贯 学号 姓名 班级 性别 ② 登录用户(此实体图包括教务处、老师和学生)实体E-R图,如图4.2所示:
用户名 密码 权限
教务处 图4.2 登录用户实体图
③ 学生成绩实体,如图4.3所示:
共 39 页 第 6 页
┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊
课程设计纸
学号 姓名 班级 院系 平均成绩 日期 软件工程 操作系统 总成绩 学生成绩 英语 Java 图4.3 学生成绩实体图
④ 班级实体E-R图,如图4.4所示:
总成绩 班级 图4.4 班级实体图
日期 班级号 记录号 总成绩 (2)整体E-R图,如图4.5所示: 登录用户 1 1 增删改查 n 学生 1 查询 增改查 n 1 学生成绩 n 添加 班级成绩 1 图4.5 整体E-R图
这些类之间对于同一个学生来说,重复定义的数据是相同的,在功能调用时采用数据耦合,降低系统中的耦合度。
4.2 类设计和数据存储 (1)类设计
共 39 页 第 7 页
┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊
课程设计纸
①用户类:首先定义一个用户类Logininfo,拥有私有属性用户名和密码,实现用户的登陆,将数据存入数据库。
②学生信息类:里面是一个学生信息类,包含学生姓名、学号、性别和籍贯等一些基本信息。
③学生成绩类:主要记录学生成绩信息。
④班级成绩类:用来记录随学生成绩修改添加而随之添加的班级成绩记录,并自动把班级成绩累加计算。
⑤数据库连接类:主要实现与数据库的连接,实现数据的操作。 ⑥dao包:主要是包含用户信息以、学生信息和学生成绩信息的增删改查的操作方法的一些类。
⑦view包:此包中主要实现用户界面,各种GUI设计 ⑧主类:是程序的入口,程序从此类开始执行。
类中数据不可被其他类访问的数据权限设为private,符合信息隐藏原理,能更好的实现模块化。
(2)数据存储
①数据存储主要是通过用MySQL数据库来实现的,将数据库中的信息借助 List这个接口,通过接口回调得到一个list对象,将从文件中读取到的所有对象都放到list对象中,然后通过对list进行遍历,实现增删改查操作。
②学生成绩也可以导出到文本文档中保存,使用BufferedWriter类把list中的内容写到文本文档中,使用File类实现文件的创建和选择。
4.3 功能模块设计 (1)登陆管理模块
实现用户的登录,如图4.6所示:
图4.6 用户登录模块
共 39 页 第 8 页
┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊
课程设计纸
(2)学生信息管理模块
实现对学生信息增加、删除、修改、查找功能。如图4.7所示:
图4.7 学生信息管理模块
(3)学生成绩管理模块
用户可以实现对学生成绩的查询、添加和修改,其操作如下图4.8所示:
图4.8 学生成绩管理模块
共 39 页 第 9 页
┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊
课程设计纸
(4) 班级成绩管理模块
主要实现班级成绩的自动添加与统计,其操作如下图4.9所示 :
图4.9 班级成绩管理模块
共 39 页 第 10 页
┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊
课程设计纸
5. 逻辑结构设计
5.1 逻辑结构设计阶段的任务是将概念结构设计阶段所得到的概念模型转换为具体DBMS所能支持的数据模型(即逻辑结构),并对其进行优化。逻辑结构设计一般分为三步进行:
(1) 从E-R图向关系模式转化数据库的逻辑设计主要是将概念模型转换成一般的关系模式,也就是将E-R图中的实体、实体的属性和实体之间的联系转化为关系模式。
(2) 将转化来的关系,网状、层次模型行向特定的DBMS支持下的数据模型转换。
(3)对数据模型进行优化。
5.2 概念结构(E-R图)向逻辑结构的转换 (1)登录用户(用户id,用户名,用户密码)
(2)学生(学号,姓名,性别,院系,班级,籍贯,民族,入学年分,出生年月)
(3)学生成绩(学号,姓名,班级,院系,英语成绩,操作系统成绩,软件工程成绩,Java成绩,总成绩,平均成绩,日期)
(4)班级成绩(班级号,总成绩,平均成绩,日期)
5.3 数据模型的优化
(1) 学生关系模式内部存在如下数据依赖: 用户id 用户id 用户名 用户名
(2) 学生关系模式内部存在如下数据依赖:
学号 学号 学号 学号 学号 学号 学号
学生姓名 学生性别 学生院系 学生班级 学生籍贯 民族 入学年份
共 39 页 第 11 页
┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊
课程设计纸
学号 出生年月
(3) 学生成绩关系模式内部存在如下数据依赖:
学号 学号 学号 学号 学号 学号 学号 学号 学号 学号 学生姓名 学生班级 学生院系 英语成绩 操作系统成绩 软件工程成绩 Java成绩 总成绩 平均成绩 日期
(4) 班级成绩关系模式内部存在如下数据依赖:
班级号 班级号 班级号
总成绩 平均成绩 日期
由于本系统关系模式比较简单,并不需要进一步优化。这里需要说明的是“用户”关系。用户的id是账号,实际上账号就是个实体的编号,如学生就是学号,教师就是教师号。当俩个关系的码相同时,根据消除冗余数据的原则,应该把这俩个关系合并为一个关系。即密码和权限应该放在学生、教师表中,作为学生、教师实体的属性。但本系统中为了提高速度,方便管理,把账号、用户名、密码和权限单提出来作为一张的表。
共 39 页 第 12 页
┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊
课程设计纸
6. 表结构定义
(1) 登录用户t_login表结构定义,如下图6.1所示:
图6.1 登录用户表结构定义图
(2) 学生t_srudentinfo表结构定义,如下图6.2所示:
图6.2 学生表结构定义
共 39 页 第 13 页
┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊
课程设计纸
(3) 学生成绩t_grade表结构定义,如图6.3所示:
图6.3 学生成绩表结构定义图
(4) 班级成绩t_tongji表结构定义,如图6.4所示:
图6.4 班级成绩表结构定义图
共 39 页 第 14 页
┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊
课程设计纸
7. 具体功能实现
7.1 登录功能的实现
(1) 登录界面该界面可以对用户名和密码进行验证如不正确则会显示错误信息,如图7.1所示:
图7.1 登录界面
(2)登录功能的实现代码,此段代码通过连接数据库用sql语句查找符合条件的用户,返回值为Logininfo类的对象,在调用此方法的程序中验证此对象是否为空,
如为空,则没有该用户显示错误信息;如不为空,则该用户存在,可直接用此对象的getRole()方法进入不同的界面。
public Logininfo querybyUsernameAndPassword(Logininfo user){
Logininfo u =new Logininfo(); String name=user.getName(); String pwd=user.getPassword(); String sql=\"select * from t_login where name ='\"+name+\"'and
password='\"+pwd+\"'\";
DBConnection conn=new DBConnection(); ResultSet rs=conn.doQuery(sql); try { if(rs.next()){ u.setName(rs.getString(\"name\")); u.setPassword(rs.getString(\"password\")); u.setRole(rs.getInt(\"role\")); } } catch (SQLException e) { e.printStackTrace(); } conn.queryclose(); return u; }
共 39 页 第 15 页
┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊
课程设计纸
7.2 学生信息查询功能的实现
(1) 学生信息查询功能界面,可通过此界面按多条件查找如可按学号、姓名或班级等查找,如图7.2所示:
图7.2 学生信息查询界面
(2) 学生信息查询功能的实现代码,此代码利用sql语句在数据库中查找所有学生信息,存放在List对象中;如有条件的查找则只需修改sql语句即可,提高了代码的重用性。
public List List Studentinfo student = new Studentinfo(); student.setId(rs.getInt(\"id\")); student.setName(rs.getString(\"name\")); student.setClasses(rs.getInt(\"classes\")); student.setSex(rs.getString(\"sex\")); student.setRace(rs.getString(\"race\")); student.setNativeplace(rs.getString(\"nativeplace\")); student.setDepartment(rs.getString(\"department\")); student.setSchoolyear(rs.getString(\"schoolyear\")); student.setBirth(rs.getString(\"birth\")); list.add(student); 共 39 页 第 16 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 } } catch (SQLException e) { e.printStackTrace(); } conn.queryclose(); return list;} 7.3 学生信息添加功能的实现 (1) 学生信息添加功能界面,此界面可添加学生信息到数据库中,如图7.3 所示: 图7.3 学生信息添加界面 (2) 学生信息添加功能的实现代码,此方法以Studentinfo的对象为参数,省去了传多个参数的麻烦,返回值为布尔型,可直接判断添加操作是否成功。 public boolean insertStudent(Studentinfo student) { DBConnection conn = new DBConnection(); String name = student.getName(); int classes = student.getClasses(); String sex=student.getSex(); String race=student.getRace(); String nativeplace=student.getNativeplace(); String department=student.getName(); String schoolyear=student.getSchoolyear(); String birth=student.getBirth(); String sql = \"insert into t_studentinfo (name,classes,sex,race,nativeplace,department,schoolyear,birth) values('\"+ name + \"',\" + classes + \ + sex + \"','\"+race+\"','\"+nativeplace+\"','\"+department+\"','\"+schoolyear+\"','\"+birth+\"')\"; int count = conn.Update(sql); if (count > 0) { 共 39 页 第 17 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 } conn.updateclose(); return true; } else { conn.updateclose(); return false; } 7.4 学生信息修改功能的实现 (1)学生信息修改功能界面,此界面可以修改学生信息,如图7.4所示: 图7.4 学生信息修改界面 (2)学生信息修改功能的实现代码,此方法以Studentinfo的对象为参数,省去了传多个参数的麻烦,返回值为布尔型,可直接判断修改操作是否成功。 public boolean Alteruser(Studentinfo s){ String name=s.getName(); int classes=s.getClasses(); String sex=s.getSex(); String race=s.getRace(); String nativeplace=s.getNativeplace(); String department=s.getDepartment(); String schoolyear=s.getSchoolyear(); String birth=s.getBirth(); DBConnection conn=new DBConnection(); String sql=\"update t_studentinfo set name='\"+name+\"',classes=\"+classes+\+sex+\"',race='\"+race+\"',nativeplace='\"+nativeplace+\"',\" + \"department='\"+department+\"', schoolyear='\"+schoolyear+\"',birth='\"+birth+\"' where id=\"+s.getId(); int count=conn.Update(sql); if(count>0){ 共 39 页 第 18 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 } conn.updateclose(); return true; }else{ conn.updateclose(); return false; } 7.5 学生信息删除功能的实现 (1)学生信息删除功能界面,在查询的结果表上直接选中表中的行,点击删除确定就可删除选中行如图7.5所示: 图7.5 学生信息删除界面 (2)学生信息删除功能的实现代码,此方法的参数(此参数是通过在表中添加的鼠标得到的)是所选的表中行的信息的学号,返回布尔型的值,可判断删除是否成功。 } public boolean deletebyID(int id){ DBConnection conn=new DBConnection(); String sql=\"delete from t_studentinfo where id=\" + id; int count=conn.Update(sql); if(count>0){ conn.updateclose(); return true; }else{ conn.updateclose(); return false; } 共 39 页 第 19 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 7.6 学生成绩查询功能的实现 (1)学生成绩查询功能界面,可多条件查询学生成绩,如图7.6所示: 图7.6 学生成绩查询功能界面 (2) 学生成绩查询功能的实现代码,此方法将查到的结果集中的属性放到Grade对象的相应字段中(用Grade类中的get()方法实现),再用while循环将Grade对象放入到List中。 public List DBConnection conn = new DBConnection(); String sql = \"select * from t_grade\"; ResultSet rs = conn.doQuery(sql); List 共 39 页 第 20 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 } } } catch (SQLException e) { e.printStackTrace(); } conn.queryclose(); return list; 7.7 学生成绩添加功能的实现 (1)学生成绩添加功能界面,此界面可以添加学生成绩,如图7.7所示: 图7.7 学生成绩添加界面 (2) 学生成绩添加功能的实现代码,传Grade对象参数,返回布尔值,方便判断。 public boolean insertGrade(Grade grade) { DBConnection conn = new DBConnection(); String name = grade.getName(); String department=grade.getDepartment(); int classes =grade.getClasses(); float english=grade.getEnglish(); float soft=grade.getSoft(); float os=grade.getOs(); float java=grade.getJava(); float sum=grade.getSum(); float average=grade.getAverage(); String dates=grade.getDates(); String sql = \"insert into t_grade(name,department,classes,English,soft,os,Java,sum,average,dates) values('\" + name + \"','\"+department+\"',\" + classes + \ +english + \+soft+\+os+\+java+\+sum+\+average+\+dates+\"')\"; 共 39 页 第 21 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 int count = conn.Update(sql); if (count > 0) { conn.updateclose(); return true; } else { conn.updateclose(); return false; } } 7.8 学生成绩修改功能的实现 (1)学生成绩修改功能界面,此界面只可以更改分数不可以更改其他信息,这样避免了对学生信息更改的混乱,如图7.8所示: 图7.8 学生成绩修改界面 (2) 学生成绩修改功能的实现代码,此方法运用的技术同添加方法相同。 public boolean AlterGrade(Grade g){ float english=g.getEnglish(); float soft=g.getSoft(); float os=g.getOs(); float java=g.getJava(); float sum=english+soft+os+java; float average=sum/4; DBConnection conn=new DBConnection(); String sql=\"update t_grade set English=\"+english+\+soft+\+os+\+java+\+sum+\",average=\"+average+\" where id=\"+g.getId(); int count=conn.Update(sql); if(count>0){ conn.updateclose(); return true; }else{ 共 39 页 第 22 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 } } conn.updateclose(); return false; 7.9 学生成绩导出功能的实现 (1)学生成绩导出功能界面,此界面可以再选位置创建一个新的文本文档,将表中的内容存放到此 文本文档中,如图7.9所示: 图7.9 学生成绩导出功能界面 (2) 学生成绩导出功能的实现代码,此段代码运用了File类和BufferedWtiter类来实现文件的创建与写出(从内存写到外存)。 GradeDao data=new GradeDao(); List list=data.queryAll(); GradeTable table=new GradeTable(); JTable table1=new JTable(); table1=table.GradeTable(table1, list); int p=fileDialog.showSaveDialog(this); File file=fileDialog.getSelectedFile(); String s=\" 学号 \"+\" 姓名 \"+\" 院系 \"+\" 班级 \"+\" 英语 \"+\" 软件工程 \"+\" 操纵系统 \"+\" Java \"+\" 总成绩 \"+\" 平均成绩 \"+\" 日期 \"+\"\\n \"; try{ FileWriter write=new FileWriter(file); BufferedWriter write1=new BufferedWriter(write); //从内存写出 到硬盘 write1.write(s); write1.newLine(); for(int i=0;i ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 \"+g.getDepartment()+\" \"+g.getClasses()+\" \"+g.getEnglish()+\" \"+g.getSoft()+\" \"+g.getOs()+\" \"+g.getJava()+\" \"+g.getSum()+\" \"+g.getAverage()+\" \"+g.getDates()+\" \\n\"; System.out.println(s1); //从内存写出到硬盘 write1.write(s1); write1.newLine(); } write1.close(); write.close(); } catch(IOException a){ } 7.10 班级成绩查询功能的实现 (1)班级成绩查询功能界面,此界面可以多条件查询班级成绩,如图7.10所示: 图7.10 班级成绩查询界面 (2)班级成绩查询功能的实现代码,此方法将查到的结果集中的属性放到Tongji对象的相应字段中(用Tongji类中的get()方法实现),再用while循环将Tongji对象放入到List中,运用list对象更方便操作。 public List DBConnection conn = new DBConnection(); String sql = \"select * from t_tongji\"; ResultSet rs = conn.doQuery(sql); List 共 39 页 第 24 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 while (rs.next()) { Tongji t = new Tongji(); t.setId(rs.getInt(\"id\")); t.setClasses(rs.getInt(\"classes\")); t.setSum(rs.getFloat(\"sum\")); t.setAverage(rs.getFloat(\"average\")); t.setDates(rs.getString(\"dates\")); list.add(t); } } catch (SQLException e) { e.printStackTrace(); } conn.queryclose(); return list; } 共 39 页 第 25 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 8. 总结 经过四个多星期的系统设计与代码编写,基本完成了学生成绩管理系统(主要是权限分配、学生信息管理、学生成绩管理、班级成绩管理)的设计与实现。在这个系统中,可实现由计算机代替人工执行一系列诸如学生信息、学生成绩和班级成绩信息的增、删、查、改和导出等操作以及个人信息的更新等等,这样就使管理人员从繁重的工作中解脱出来,同时实现管理工作的规范化、效率化、国际化。 在设计过程中,我首先考虑到了本系统各个大的功能模块,然后进行更加详细的划分,逐步完善各个模块的具体内容。在进行具体代码的编写时,突然会发现有很多边界条件没有考虑到,各种各样的漏洞导致系统容易崩溃不能正常运行,这就需要补充很多的边界控制条件,这时才明白写出能运行的程序和写出健壮的程序是完全不同的两个概念,这些都是需要牢记和掌握的。在信息提示方面,需要给用户一些温馨的提示,而不是诸如“错误编号0x704820”这类的冰冷警告。我们要让用户对系统感到亲切和易使用,并能通过温馨提示让用户自己解决问题,这也可以减少维护人员的工作量,我们需要的就是一个健壮、友好的系统。 共 39 页 第 26 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 9. 附录 (1)bean包 /*bean包中的Logininfo 类*/ package bean; public class Logininfo { int id; String name; String password; int role; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getRole() { return role; } public void setRole(int role) { this.role = role; } } /*bean包中的Studentinfo 类*/ package bean; public class Studentinfo { private int id; private String name; private int classes; private String sex; private String race; private String nativeplace; private String department; private String schoolyear; private String birth; public int getId() { return id; } public void setId(int id) { this.id = id; 共 39 页 第 27 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 } } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getClasses() { return classes; } public void setClasses(int classes) { this.classes = classes; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getRace() { return race; } public void setRace(String race) { this.race = race; } public String getNativeplace() { return nativeplace; } public void setNativeplace(String nativeplace) { this.nativeplace = nativeplace; } public String getDepartment() { return department; } public void setDepartment(String department) { this.department = department; } public String getSchoolyear() { return schoolyear; } public void setSchoolyear(String schoolyear) { this.schoolyear = schoolyear; } public String getBirth() { return birth; } public void setBirth(String birth) { this.birth = birth; } /*bean包中的Grade 类*/ package bean; public class Grade { private int id; private String name; private int classes; private String department; private float English; private float soft; private float os; 共 39 页 第 28 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 private float Java; private float sum; private float average; private String dates; public String getDepartment() { return department; } public void setDepartment(String department) { this.department = department; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getClasses() { return classes; } public void setClasses(int classes) { this.classes = classes; } public float getEnglish() { return English; } public void setEnglish(float english) { English = english; } public float getSoft() { return soft; } public void setSoft(float soft) { this.soft = soft; } public float getOs() { return os; } public void setOs(float os) { this.os = os; } public float getJava() { return Java; } public void setJava(float java) { Java = java; } public float getSum() { return sum; } public void setSum(float sum) { this.sum = sum; } public float getAverage() { return average; 共 39 页 第 29 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 } } public void setAverage(float average) { this.average = average; } public String getDates() { return dates; } public void setDates(String dates) { this.dates = dates; } /*bean包中的Tongji 类*/ package bean; public class Tongji { private int id; private int classes; private float sum; private float average; private String dates; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getClasses() { return classes; } public void setClasses(int classes) { this.classes = classes; } public float getSum() { return sum; } public void setSum(float sum) { this.sum = sum; } public float getAverage() { return average; } public void setAverage(float average) { this.average = average; } public String getDates() { return dates; } public void setDates(String datesl) { this.dates = dates; } } (2)jdbc包 /* jdbc包中的DBConnection 类*/ package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; 共 39 页 第 30 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 import java.sql.SQLException; import java.sql.Statement; public class DBConnection { private ResultSet rs; private Connection con; private Statement st; static { try { Class.forName(\"com.mysql.jdbc.Driver\"); //加载驱动 } catch (ClassNotFoundException e) { e.printStackTrace(); } } public void getConnection(){ try{ con=DriverManager.getConnection(\"jdbc:mysql://localhost:3306/student\连接数据库语句 } catch (SQLException e) { e.printStackTrace(); } } /*查询数据库*/ public ResultSet doQuery(String sql){ this.getConnection(); try { st=con.createStatement(); // 用连接创建sql执行语句 rs=st.executeQuery(sql); // 用sql的执行语句调用executeQuery返回结果 集对象 } catch (SQLException e) { e.printStackTrace(); } return rs; } /*关闭数据库连接*/ public void queryclose(){ try { rs.close(); st.close(); con.close(); } catch (SQLException e) { e.printStackTrace(); } } /*更新数据库,返回的本次操作影响的数据库的行数*/ public int Update(String sql){ this.getConnection(); int count=0; try { st=con.createStatement(); count=st.executeUpdate(sql); } catch (SQLException e) { 共 39 页 第 31 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 e.printStackTrace(); } return count; } /*关闭数据库更新连接*/ public void updateclose(){ try { st.close(); con.close(); } catch (SQLException e) { e.printStackTrace(); } } } (3)dao包 /*dao包中的Logindao 类*/ package dao; import java.sql.ResultSet; import java.sql.SQLException; import jdbc.DBConnection; import bean.Logininfo; /*按用户名和密码查询用户*/ public class Logindao { public static Logininfo querybyUsernameAndPassword(Logininfo user){ Logininfo u =new Logininfo(); String name=user.getName(); String pwd=user.getPassword(); String sql=\"select * from t_login where name ='\"+name+\"'and password='\"+pwd+\"'\"; DBConnection conn=new DBConnection(); ResultSet rs=conn.doQuery(sql); try { if(rs.next()){ u.setName(rs.getString(\"name\")); u.setPassword(rs.getString(\"password\")); u.setRole(rs.getInt(\"role\")); } } catch (SQLException e) { e.printStackTrace(); } conn.queryclose(); return u; } } /*dao包中的Studentinfodao 类*/ package dao; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; 共 39 页 第 32 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 import java.util.List; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import jdbc.DBConnection; import bean.Logininfo; import bean.Studentinfo; public class Studentinfodao { /*查询所有学生信息的方法*/ public List 放到student中再将student依次加入到list中 student.setId(rs.getInt(\"id\")); student.setName(rs.getString(\"name\")); student.setClasses(rs.getInt(\"classes\")); student.setSex(rs.getString(\"sex\")); student.setRace(rs.getString(\"race\")); student.setNativeplace(rs.getString(\"nativeplace\")); student.setDepartment(rs.getString(\"department\")); student.setSchoolyear(rs.getString(\"schoolyear\")); student.setBirth(rs.getString(\"birth\")); list.add(student); } } catch (SQLException e) { e.printStackTrace(); } conn.queryclose(); return list; } /*添加学生信息的方法*/ public boolean insertStudent(Studentinfo student) { DBConnection conn = new DBConnection(); String name = student.getName(); int classes = student.getClasses(); String sex=student.getSex(); String race=student.getRace(); String nativeplace=student.getNativeplace(); String department=student.getName(); String schoolyear=student.getSchoolyear(); String birth=student.getBirth(); String sql = \"insert into t_studentinfo(name,classes,sex,race,nativeplace,department,schoolyear,birth) values('\"+ name + \"',\" + classes + \ \"','\"+race+\"','\"+nativeplace+\"','\"+department+\"','\"+schoolyear+\"','\"+birth+\"')\"; int count = conn.Update(sql); 共 39 页 第 33 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 if (count > 0) { conn.updateclose(); return true; } else { conn.updateclose(); return false; } } /*按学号删除学生信息的方法*/ public boolean deletebyID(int id){ DBConnection conn=new DBConnection(); String sql=\"delete from t_studentinfo where id=\" + id; int count=conn.Update(sql); if(count>0){ conn.updateclose(); return true; }else{ conn.updateclose(); return false; } } /*修改学生信息的方法*/ public boolean Alteruser(Studentinfo s){ String name=s.getName(); int classes=s.getClasses(); String sex=s.getSex(); String race=s.getRace(); String nativeplace=s.getNativeplace(); String department=s.getDepartment(); String schoolyear=s.getSchoolyear(); String birth=s.getBirth(); DBConnection conn=new DBConnection(); String sql=\"update t_studentinfo set name='\"+name+\"',classes=\"+classes+\veplace='\"+nativeplace+\"',\" +\"department='\"+department+\"', schoolyear='\"+schoolyear+\"',birth='\"+birth+\"' where id=\"+s.getId(); int count=conn.Update(sql); if(count>0){ conn.updateclose(); return true; }else{ conn.updateclose(); return false; } } /*按学号查询学生信息的方法*/ public Studentinfo querybyId(int id){ Studentinfo s =new Studentinfo(); String sql=\"select * from t_studentinfo where id =\"+id+\"\"; DBConnection conn=new DBConnection(); ResultSet rs=conn.doQuery(sql); 共 39 页 第 34 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 try { if(rs.next()){ s.setId(rs.getInt(\"id\")); s.setName(rs.getString(\"name\")); s.setClasses(rs.getInt(\"classes\")); s.setSex(rs.getString(\"sex\")); s.setRace(rs.getString(\"race\")); s.setNativeplace(rs.getString(\"nativeplace\")); s.setDepartment(rs.getString(\"department\")); s.setSchoolyear(rs.getString(\"schoolyear\")); s.setBirth(rs.getString(\"birth\")); } } catch (SQLException e) { e.printStackTrace(); } conn.queryclose(); return s; } } /*dao包中的GradeDao 类*/ package dao; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import jdbc.DBConnection; import bean.Grade; public class GradeDao { /*学生成绩查询方法*/ public List 将grade依次加入到list中 grade.setId(rs.getInt(\"id\")); grade.setName(rs.getString(\"name\")); grade.setDepartment(rs.getString(\"department\")); grade.setClasses(rs.getInt(\"classes\")); grade.setEnglish(rs.getFloat(\"english\")); grade.setSoft(rs.getFloat(\"soft\")); grade.setOs(rs.getFloat(\"os\")); grade.setJava(rs.getFloat(\"Java\")); grade.setSum(rs.getFloat(\"sum\")); grade.setAverage(rs.getFloat(\"average\")); grade.setDates(rs.getString(\"dates\")); list.add(grade); 共 39 页 第 35 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 } } catch (SQLException e) { e.printStackTrace(); } conn.queryclose(); return list; } /*学生成绩添加方法*/ public boolean insertGrade(Grade grade) { DBConnection conn = new DBConnection(); String name = grade.getName(); String department=grade.getDepartment(); int classes =grade.getClasses(); float english=grade.getEnglish(); float soft=grade.getSoft(); float os=grade.getOs(); float java=grade.getJava(); float sum=grade.getSum(); float average=grade.getAverage(); String dates=grade.getDates(); String sql = \"insert into t_grade(name,department,classes,English,soft,os,Java,sum,average,dates) values('\"+ name + \"','\"+department+\"',\" + classes + \\ int count = conn.Update(sql); if (count > 0) { conn.updateclose(); return true; } else { conn.updateclose(); return false; } } /*按学号查询学生成绩的方法*/ public Grade querybyId(int id){ Grade g =new Grade(); String sql=\"select * from t_grade where id =\"+id+\"\"; DBConnection conn=new DBConnection(); ResultSet rs=conn.doQuery(sql); try { if(rs.next()){ g.setId(rs.getInt(\"id\")); g.setName(rs.getString(\"name\")); g.setDepartment(rs.getString(\"department\")); g.setClasses(rs.getInt(\"classes\")); g.setEnglish(rs.getFloat(\"English\")); g.setSoft(rs.getFloat(\"soft\")); g.setOs(rs.getFloat(\"os\")); g.setJava(rs.getFloat(\"Java\")); g.setSum(rs.getFloat(\"sum\")); g.setAverage(rs.getFloat(\"average\")); 共 39 页 第 36 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 } } catch (SQLException e) { e.printStackTrace(); } conn.queryclose(); return g; } /*学生成绩修改方法*/ public boolean AlterGrade(Grade g){ float english=g.getEnglish(); float soft=g.getSoft(); float os=g.getOs(); float java=g.getJava(); float sum=english+soft+os+java; float average=sum/4; DBConnection conn=new DBConnection(); String sql=\"update t_grade set English=\"+english+\average=\"+average+\" where id=\"+g.getId(); int count=conn.Update(sql); if(count>0){ conn.updateclose(); return true; }else{ conn.updateclose(); return false; } } } /*dao包中的TongjiDao类*/ package dao; import java.sql.ResultSet; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import jdbc.DBConnection; import bean.Tongji; public class TongjiDao { /*班级成绩的查询方法*/ public List 共 39 页 第 37 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 t.setId(rs.getInt(\"id\")); t.setClasses(rs.getInt(\"classes\")); t.setSum(rs.getFloat(\"sum\")); t.setAverage(rs.getFloat(\"average\")); t.setDates(rs.getString(\"dates\")); list.add(t); } } catch (SQLException e) { e.printStackTrace(); } conn.queryclose(); return list; } /*按班级号查询班级成绩的方法*/ public List values(\"+classes+\ int count = conn.Update(sql); 共 39 页 第 38 页 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 课程设计纸 } } if (count > 0) { conn.updateclose(); return true; } else { conn.updateclose(); return false; } 共 39 页 第 39 页 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- azee.cn 版权所有 赣ICP备2024042794号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务