面向对象程序设计课程设计报告
代码行数 796 项目名称 用户信息管理系统 1.实训目的 面向对象程序设计课程设计是计算机科学与技术专业培养计划中的重要实践教学环节,旨在通过一个管理信息系统的开发,加深学生对Java语言的理解和应用,尤其是对面向对象编程思想、Java编码规范、图形用户接口、JDBC访问数据库的理解,巩固软件工程课程的相关知识,了解软件开发的基本流程,进一步提高学生的学习能力、理解能力、表达能力及沟通能力。 2.实训内容 使用MyEclipse为开发工具,使用Rational Rose为建模工具,使用MySQL为数据库服务器,基于GUI和JDBC技术,分析、设计并实现一个管理信息系统。 3.需求分析 3.1 需求描述 用户信息管理系统具有一定的普遍性和应用性等特点,是各类系统的基本组成模块 登录:输入账号和密码,完成登录操作,进入主界面,显示所有用户的基本信息以及可进行的相关操作的选项。 退出:登录后可进行退出操作,结束整个程序。 注册:输入账户、密码和确认密码完成新用户的注册。 显示用户信息:登录成功后在主界面中以表格形式显示所有用户的信息。 添加用户:输入用户各项信息,完成用户信息的添加操作,添加成功后以表格形式显示所有的用户信息。 删除用户:根据用户主键,完成用户信息的删除操作,删除成功后以表格形式显示所有的用户信息。 修改用户:输入用户主键,显示用户信息,输入每个字段值,完成用户信息的修改,修改成功后以表格形式显示所有的用户信息。 查询用户:可利用模糊查询完成对用户名的查询操作。 3.2 用例描述 用例名称:管理员进行用户信息管理 简要说明:管理员通过注册登入来对用户信息系统进行增、删、改、查等操作 参与者:管理员 前置条件:管理员需注册并登入有效信息 后置条件:用户信息系统拥有用户信息 用例图如下: - 1 -
面向对象程序设计课程设计报告
4.功能设计
4.1 系统层次方框图
为保证系统具有较好的可维护性和可扩展性,对系统进行分层设计,共分四层: 视图层:接收用户输入信息,显示界面信息和用户信息 控制层:访问流程控制 业务层:完成具体功能的实现
数据库访问层:完成对数据库访问操作的封装 具体结构如下图所示:
- 2 -
面向对象程序设计课程设计报告
4.2 算法设计(活动图或时序图) 1.登录功能
在主界面(MainView)输入账号和密码,封装成Login对象后发后给业务层(LoginService),在业务层中组合成执行登录操作的SQL语句,再将其传递给数据库访问类(DB),由其完成数据库的查询操作。依据查询结果,如果成功则创建控制类(Controller)对象,显示欢迎信息和对用户信息进行维护的选项;如果失败,则显示提示信息并允许重新输入账号和密码。
图4.1 登录功能时序图
图4.2 登录功能活动图
- 3 -
面向对象程序设计课程设计报告
2.注册功能
在主界面输入数字1,表示进行注册操作。依次输入账户、密码和确认密码,当密码和确认密码不一致时,需要重新输入密码和确认密码。之后,账户和密码封装至Login对象中,传递给业务层(LoginService),由业务层组合成添加SQL语句,发送至数据库访问类(DB),完成添加操作。如果添加成功,则返回主界面,输入新注册的账户和密码进行登录;如果添加失败,则重新进行输入。
图4.2 注册功能时序图
- 4 -
面向对象程序设计课程设计报告
图4.2 注册功能活动图
3.显示所有用户信息功能
登录成功及完成对用户信息增、删、改操作后,均需要进行所有用户信息的显示,由控制类(Controller)调用视图层(MainView)中的方法,在方法中再利用业务层(UserService)完成对数据库访问类(DB)的访问,获取t_user表的所有记录。
- 5 -
面向对象程序设计课程设计报告
图4.3 显示所有用户信息时序图
图4.4 显示所有用户信息活动图
4.添加用户信息功能
- 6 -
面向对象程序设计课程设计报告
在控制类(Controller)输出的选择信息的提示下(1表示执行添加操作),利用简单工厂模式创建视图层(AddView)对象,之后回调接口方法,完成对业务层(UserService)中注册方法的调用,在该方法中向数据库访问类(DB)发送添加SQL语句。如果添加成功,则显示所有用户信息(参考显示所有用户信息功能的实现);如果添加失败,则提示重新输入。
图4.5 用户信息添加时序图
- 7 -
面向对象程序设计课程设计报告
图4.6 用户信息添加活动图
5.查询用户信息功能
在控制类(Controller)输出的选择信息的提示下(4表示执行添加操作),利用简单工厂模式创建视图层(QueryView)对象,之后回调接口方法,在方法中输入要查询的用户名,再对业务层(UserService)中查询方法执行调用,在该方法中向数据库访问类(DB)发送模糊查询SQL语句。如果查询成功,则显示查询到的用户信息(参考显示所有用户信息功能的实现);如果查询失败,则提示重新输入。
- 8 -
面向对象程序设计课程设计报告
图4.7 查询用户信息时序图
- 9 -
面向对象程序设计课程设计报告
图4.7 查询用户信息活动图 注:删除用户信息和修改用户信息的功能设计请参考添加用户信息操作。 5.数据设计 5.1 类图设计 根据分析,系统由13个类构成,分别为: 数据库访问层:DB类 数据封装类:Login类、User类 业务层:LoginService类、UserService类 控制层:Controller类 视图层:AddView类、DeleteView类、ModifyView类、QueryView类、MainView类、 Operation类 其它:Test类 1.数据库访问层 DB类用于封装JDBC的操作,完成对数据库的直接访问,采用单态模式创建对象。 2.数据封装类 Login类和User类分别用于登录、注册操作时的数据封装和用户信息管理时的数据封装。 3.业务层 LoginService类进行登录、注册等对Login类的访问操作,UserService类进行用户信息管理的操作,两者均采用单态模式创建对象。 4.控制层 Controller类用于进行系统的流程控制。 5.视图层 MainView类用于完成登录、注册等提示信息的显示和系统主界面的显示,具体内容如下所示: Operation接口是增、删、改、查等操作的抽象,AddView类、DeleteView类、ModifyView类和QueryView类均使用Operation接口,分别完成增、删、改、查等操作,利用简单工厂模式与Controller类建立关系. 6.其它 Test类是程序的主类,用于启动系统。 5.2 数据表设计 根据概要设计中Login类图和User类图可知,系统需要两张表t_login和t_user,其中,t_login表用于存储登录信息,t_user表用于存储用户基本信息,两张表之间没有关联关系,具体结构如下所示: 表5-1 t_login表 序号 1 2 3 字段名 id account password 类型 int char char 表5-2 t_user表 长度 4 20 20 备注 主键 唯一性、不为空 不为空 - 10 -
面向对象程序设计课程设计报告
序号 1 2 3 4 字段名 id name sex birthday 类型 int char int date 长度 4 20 2 默认 备注 主键 不为空 0表示男,1表示女 不为空 6.运行结果 1.注册 程序运行后,首先显示系统的登录界面,在其中可输入账号和密码进行登录操作,或输入“1”进行账户注册。注册成功后需要重新输入账号和密码进行登录。 图5.1 注册界面 如果输入的密码和确认密码不一致,则需要重新输入。 图5.2 密码和确认密码不一致 2.登录 - 11 -
面向对象程序设计课程设计报告
用户可在系统首界面直接输入账号和密码进行登录,或在注册成功后再进行登录。登录成功后显示所有用户信息和系统主控制界面。
图5.3 登录成功后的显示
3.添加
输入“1”,选择添加用户信息操作。输入“0”表示返回上一级菜单。依次输入用户的姓名、性别和生日,完成添加。添加成功后,显示成功的提示信息,并显示所有用户信息和系统主控制界面。如果添加失败,则显示失败的提示信息,并提示重新输入。
- 12 -
面向对象程序设计课程设计报告
图5.4 添加用户信息界面
4.删除
输入“2”,选择删除用户信息操作。如果输入“0”表示返回上一级菜单。输入要删除的用户的id(主键)值,完成删除。删除成功后,显示成功的提示信息,并显示所有用户信息和系统主控制界面。如果删除失败,则显示删除失败的提示信息,并提示重新输入。
图5.5 删除用户信息界面
5.修改
输入“3”,选择修改用户信息操作。如果输入“0”表示返回上一级菜单。输入要修改的用户的id(主键)值,显示该用户的信息。再依次输入要修改的用户名、性别和生日,执行修改操作。修改成功后,显示成功的提示信息,并显示所有用户信息和系统主控制界面。如果修改失败,则显示删除失败的提示信息,并提示重新输入。
- 13 -
面向对象程序设计课程设计报告
图5.6 修改用户信息界面
6.查询
输入“4”,选择查询用户信息操作。如果输入“0”表示返回上一级菜单。输入要查询的用户名,显示以改名称作为关键字的所有用户的信息,之后显示所有用户信息和系统主控制界面。
- 14 -
面向对象程序设计课程设计报告
图5.7 查询到用户信息的界面
如果没有查询到相应信息,则显示没有数据的提示,并可进行重新输入。
图5.8 没有查询到用户信息的界面
6.退出
输入“5”,表示退出系统,结束整个程序。
- 15 -
面向对象程序设计课程设计报告
图5.9 退出系统界面
7.关键代码
一、数据库访问类(DB.java) package cn.edu.ccut.util;
import java.sql.*;
public class DB {
private Connection con; private PreparedStatement pre; private ResultSet rs; private static DB db;
static { try {
Class.forName(\"com.mysql.jdbc.Driver\"); } catch (ClassNotFoundException e) { e.printStackTrace(); } }
private DB(){}
public static DB getInstance(){ if(db == null){ db = new DB(); } return db;
- 16 -
面向对象程序设计课程设计报告
}
private void buildConnection() { try {
con = DriverManager.getConnection(\"jdbc:mysql://localhost:3306/demo\ } catch (SQLException e) { e.printStackTrace(); } }
public ResultSet executeQueryByParam(String sql,Object... o){ this.buildConnection(); try {
pre = con.prepareStatement(sql); for (int i = 0; i < o.length; i++) { pre.setObject(i+1,o[i]); }
rs = pre.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } return rs; }
public ResultSet executeQueryNoParam(String sql){ this.buildConnection();; try {
pre = con.prepareStatement(sql);
- 17 -
面向对象程序设计课程设计报告
rs = pre.executeQuery(); } catch (SQLException e) { e.printStackTrace(); } return rs; }
public int executeUpdate(String sql,Object... o){ this.buildConnection(); try {
pre = con.prepareStatement(sql); for (int i = 0; i < o.length; i++) { pre.setObject(i+1,o[i]); }
int count = pre.executeUpdate(); return count; } catch (SQLException e) { e.printStackTrace(); return 0; } }
public void close(){ try {
if (rs != null){ rs.close(); }
pre.close();
- 18 -
面向对象程序设计课程设计报告
con.close();
} catch (SQLException e) { e.printStackTrace(); } } }
二、数据封装类 1. Login.java package cn.edu.ccut.po;
import java.sql.Date;
public class User { private int id; private String name; private int sex; private Date birthday;
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name;
- 19 -
面向对象程序设计课程设计报告
}
public void setName(String name) { this.name = name; }
public int getSex() { return sex; }
public void setSex(int sex) { this.sex = sex; }
public Date getBirthday() { return birthday; }
public void setBirthday(Date birthday) { this.birthday = birthday; } }
2. User.java package cn.edu.ccut.po;
public class Login { private String username; private String password;
- 20 -
面向对象程序设计课程设计报告
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; } }
三、业务层 1、LoginService.java package cn.edu.ccut.service;
import cn.edu.ccut.po.Login; import cn.edu.ccut.util.DB;
import java.sql.ResultSet; import java.sql.SQLException;
public class LoginService {
- 21 -
面向对象程序设计课程设计报告
private DB db;
private static LoginService service;
private LoginService() { db = DB.getInstance(); }
public static LoginService getInstatnce() { if (service == null) {
service = new LoginService(); }
return service; }
public boolean login(Login lo) {
String sql = \"select * from t_login where username = ? and password = ?\"; ResultSet rs = db.executeQueryByParam(sql, lo.getUsername(),lo.getPassword()); try {
if (rs.next()) { return true; }
} catch (SQLException e) { e.printStackTrace(); } finally { db.close(); }
return false; }
- 22 -
面向对象程序设计课程设计报告
public boolean register(Login lo) {
String sql = \"insert into t_login(username,password) values(?,?)\"; int count = db.executeUpdate(sql, lo.getUsername(),lo.getPassword()); db.close(); if (count > 0) { return true; } else { return false; } } }
2、UserService.java package cn.edu.ccut.service;
import cn.edu.ccut.po.User; import cn.edu.ccut.util.DB;
import javax.xml.transform.Result; import java.sql.Date; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;
public class UserService { private DB db;
private static UserService service;
- 23 -
面向对象程序设计课程设计报告
private UserService(){ db = DB.getInstance(); }
public static UserService getInstance(){ if(service == null){
service = new UserService(); }
return service; }
public List ResultSet rs = db.executeQueryNoParam(sql); List users = this.getList(rs); } catch (SQLException e) { e.printStackTrace(); }finally { db.close(); } return users; } public List - 24 - 面向对象程序设计课程设计报告 List users = this.getList(rs); } catch (SQLException e) { e.printStackTrace(); }finally { db.close(); } return users; } private List user = new User(); user.setId(rs.getInt(1)); user.setName(rs.getString(2)); user.setSex(rs.getInt(3)); user.setBirthday(rs.getDate(4)); users.add(user); } return users; } public boolean insertOneUser(String name,int sex,Date birthday){ String sql = \"insert into t_user(name,sex,birthday) values(?,?,?)\"; int count = db.executeUpdate(sql,name,sex,birthday); - 25 - 面向对象程序设计课程设计报告 db.close(); if(count>0){ return true; }else{ return false; } } public boolean deleteUserById(int id){ String sql = \"delete from t_user where id = ?\"; int count = db.executeUpdate(sql,id); db.close(); if(count > 0){ return true; }else{ return false; } } public boolean updateUser(int id,String name,int sex,Date birthday){ String sql = \"update t_user set name = ?,sex=?,birthday=? where id = ?\"; int count = db.executeUpdate(sql,name,sex,birthday,id); db.close(); if(count > 0){ return true; }else { return false; } - 26 - 面向对象程序设计课程设计报告 } public User getUserById(int id){ String sql = \"select * from t_user where id = ?\"; ResultSet rs = db.executeQueryByParam(sql,id); try { if(rs.next()){ User user = new User(); user.setId(id); user.setName(rs.getString(2)); user.setSex(rs.getInt(3)); user.setBirthday(rs.getDate(4)); return user; } } catch (SQLException e) { e.printStackTrace(); }finally { db.close(); } return null; } } 四、视图层 1. operation.java package cn.edu.ccut.view; import cn.edu.ccut.service.UserService; - 27 - 面向对象程序设计课程设计报告 import java.util.InputMismatchException; public interface Operation{ void operation(UserService service) throws InputMismatchException; } 2. AddView.java package cn.edu.ccut.view; import cn.edu.ccut.service.UserService; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.InputMismatchException; import java.util.Scanner; public class AddView implements Operation { @Override public void operation(UserService service) throws InputMismatchException { Scanner scan = new Scanner(System.in); while(true){ System.out.println(\"please input name、sex、birthday to ADD,if return input 0:\"); String name = scan.next(); if(\"0\".equals(name)){ break; } String sex0 = scan.next(); int sex1 = 1; - 28 - 面向对象程序设计课程设计报告 if (\"男\".equals(sex0)) { sex1 = 0; } String birthday0 = scan.next(); SimpleDateFormat format = new SimpleDateFormat(\"yyyy-MM-dd\"); Date birthday = new Date(); try { birthday = format.parse(birthday0); } catch (ParseException e) { e.printStackTrace(); } boolean flag = service.insertOneUser(name, sex1, new java.sql.Date(birthday.getTime())); if(flag){ System.out.println(\"add success~~~~~~\"); //scan.close(); return; }else{ System.out.println(\"add failure,try again~~~~~~\"); } } } } 3. DeleteView.java package cn.edu.ccut.view; import cn.edu.ccut.service.UserService; import java.util.InputMismatchException; - 29 - 面向对象程序设计课程设计报告 import java.util.Scanner; public class DeleteView implements Operation { @Override public void operation(UserService service) throws InputMismatchException { Scanner scan = new Scanner(System.in); while(true){ System.out.println(\"please input user'id to DELETE,if return input 0:\"); int id = scan.nextInt(); if(id == 0){ break; } boolean flag = service.deleteUserById(id); if(flag){ System.out.println(\"delete success~~~~~~\"); //scan.close(); return; }else{ System.out.println(\"delete failure~~~~~~\"); } } } } 4. ModifyView.java package cn.edu.ccut.view; import cn.edu.ccut.controller.Controller; import cn.edu.ccut.po.User; - 30 - 面向对象程序设计课程设计报告 import cn.edu.ccut.service.UserService; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.InputMismatchException; import java.util.Scanner; public class ModifyView implements Operation{ @Override public void operation(UserService service) throws InputMismatchException { Scanner scan = new Scanner(System.in); while(true){ System.out.println(\"please input user'id to MODIFY,if return input 0:\"); int id = scan.nextInt(); if (id == 0) { return; } else { User user = service.getUserById(id); if (user != null) { MainView.showTable(); MainView.showUser(user); System.out.println(\"please input new name:\"); String newName = scan.next(); System.out.println(\"please input new sex:\"); String newSex = scan.next(); int sex1 = 1; if (\"男\".equals(newSex)) { - 31 - 面向对象程序设计课程设计报告 sex1 = 0; } System.out.println(\"please input new birthday:\"); String newBirthday = scan.next(); SimpleDateFormat format = new SimpleDateFormat(\"yyyy-MM-dd\"); Date birthday; java.sql.Date sqlBirthday = null; try { birthday = format.parse(newBirthday); sqlBirthday = new java.sql.Date(birthday.getTime()); } catch (ParseException e) { e.printStackTrace(); } boolean flag = service.updateUser(id,newName,sex1,sqlBirthday); if(flag){ System.out.println(\"modify success~~~~~~\"); //scan.close(); return; }else{ System.out.println(\"modify failure~~~~~~\"); } }else{ System.out.println(\"id is error,try again!\"); } } } } } - 32 - 面向对象程序设计课程设计报告 5. QueryView.java package cn.edu.ccut.view; import cn.edu.ccut.controller.Controller; import cn.edu.ccut.po.User; import cn.edu.ccut.service.UserService; import java.util.InputMismatchException; import java.util.List; import java.util.Scanner; public class QueryView implements Operation { @Override public void operation(UserService service) throws InputMismatchException { Scanner scan = new Scanner(System.in); while(true){ System.out.println(\"please input name to query,if return input 0:\"); String name = scan.next(); if(\"0\".equals(name)){ break; } List - 33 - 面向对象程序设计课程设计报告 }else{ System.out.println(\"no result......\"); } } } } 6. MainView.java package cn.edu.ccut.view; import cn.edu.ccut.controller.Controller; import cn.edu.ccut.po.Login; import cn.edu.ccut.po.User; import cn.edu.ccut.service.LoginService; import cn.edu.ccut.service.UserService; import java.util.InputMismatchException; import java.util.List; import java.util.Scanner; public class MainView { public static void start(){ Scanner scan = new Scanner(System.in); while (true) { LoginService service; System.out.println(\"please input your account and password to login,enter 1 for register one new user.\"); String username = scan.next(); String password; - 34 - 面向对象程序设计课程设计报告 while (\"1\".equals(username)) { System.out.println(\"please input account:\"); String newUsername = scan.next(); String newPwd; while (true) { System.out.println(\"please input password:\"); newPwd = scan.next(); System.out.println(\"please input confirmation password:\"); String confirmPwd = scan.next(); if (newPwd.equals(confirmPwd)) { break; } else { System.out.println(\"password is not equals confirmation password,input again!\"); } } service = LoginService.getInstatnce(); Login lo = new Login(); lo.setUsername(newUsername); lo.setPassword(newPwd); boolean f = service.register(lo); if(f){ System.out.println(\"register success!\"); System.out.println(\"please input your account:\"); username = scan.next(); }else{ System.out.println(\"register failure!try again~~~\"); } } - 35 - 面向对象程序设计课程设计报告 System.out.println(\"please input your password:\"); password = scan.next(); service = LoginService.getInstatnce(); Login lo = new Login(); lo.setUsername(username); lo.setPassword(password); boolean flag = service.login(lo); if (flag) { Controller mv = new Controller(); try { mv.controller(); break; } catch (InputMismatchException e) { System.out.println(\"input exception,try again!\"); } } else { System.out.println(\"login failure!please input again~~~~~~\"); } } scan.close(); } public static void showTable(){ System.out.println(\"----------------------------------------------------\"); System.out.println(\" id | name | sex | birthday\"); System.out.println(\"----------------------------------------------------\"); } - 36 - 面向对象程序设计课程设计报告 public static void showUser(User u){ System.out.print(\" \"+u.getId() + \" \"); System.out.print(u.getName() + \" \"); if (u.getSex() == 0) { System.out.print(\" 男 \"); } else { System.out.print(\" 女 \"); } System.out.println(u.getBirthday()); } public static void showMain() { System.out.println(\"welcome to you!\"); showTable(); UserService userService = UserService.getInstance(); List 五、控制器类(Controller.java) package cn.edu.ccut.controller; import cn.edu.ccut.service.UserService; import cn.edu.ccut.view.*; import java.util.InputMismatchException; - 37 - 面向对象程序设计课程设计报告 import java.util.Scanner; public class Controller { public void controller() throws InputMismatchException{ Scanner scan = new Scanner(System.in); while (true) { MainView.showMain(); System.out.println(\"please select your operation:\"); System.out.println(\"1.insert 2.delete 3.modify 4.query 5.exit\"); int i = scan.nextInt(); UserService service = UserService.getInstance(); Operation o = null; boolean flag = true; switch (i) { case 1: o = new AddView(); break; case 2: o = new DeleteView(); break; case 3: o = new ModifyView(); break; case 4: o = new QueryView(); break; case 5: - 38 - 面向对象程序设计课程设计报告 System.out.println(\"Bye~~~~~~~~~\"); return; default: //scan.close(); System.out.println(\"input error,please input 1~5!\"); flag = false; } if(flag){ o.operation(service); } } } } 六、主类(Test.java) package cn.edu.ccut.test; import cn.edu.ccut.view.MainView; public class Test { public static void main(String[] args) { MainView.start(); } } 8.实训总结 在本学期我们进行了java实训。回首本学期的java学习.虽说时间很短,但其中的每一天都使我收获很大、 受益匪浅,它不但极大地加深了我对一-些理论知识的理解不仅使我在理论上对java有了全新的认识在实践能力上也得到了提高真正地做到了学以致用更学到了很多做人的道理,对我来说受益非浅。这次实训对于我以后学习、找工作也是受益菲浅的,相信这些宝贵的经验会成为我今后成功的重要的基 - 39 - 面向对象程序设计课程设计报告 石:这对于我的学业乃至我以后人生的影响无疑是极其深远的。 这次实训虽然是我们的第一次,不过同学们表现不错;由此看来我们在进入大学的这几个月里学到了不少的专业知识,只是自己感觉不到而已。对于所学专业,我们不能过于自卑和担忧否则会妨碍自己学习。实训是学习java的重要环节:有利于我们巩固专业知识、掌握工作技能提高就业筹码。 我把本次实训看作是“理论与实践相结合的桥梁”。通过这周的实训和学习,我知道了此次实训的目的也清楚目前自己的不足那就是缺乏相应的知识与经验.对所学的专业知识不能够很好地运用于实践操作。正所谓“百闻不如一见”。经过这次自身的切身实践,我才深切地理会到了“走出课堂.投身实践”的必要性。平时我们只能在课堂上与老师一起纸上谈兵思维的认识基本上只是局限于课本的范围之内,也许就是这个原因就导致我们对专业知识认识的片面性使得我们只知所以然而不知其之所以然!限制了我们网络知识水平的提高。但是课本上所学到的理论知识是为我们的实际操作指明了方向、提供相应的方法真正的职业技巧是要我们从以后的实际工作中慢慢汲取的。而针对实际操作中遇到的一些特殊的问题我们不能拘泥于课本,不可纯粹地“以本为本”。 成 绩 Score 教师签字 日期 - 40 - 因篇幅问题不能全部显示,请点此查看更多更全内容