版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java课程设计报告 学 校:大连民族学院 学 院:理学院专 业:信息与计算科学 题 目:学生家教管理系统设计与实现 姓 名:黄*(组长)信息091班 茹* 信息092班 段* 信息092班 完成时间: 2012年4月 24 目录第一章、需求分析31.1需求分析31.2功能设计3第二章、 概要设计42.1 程序设计思路42.2 模块说明图42.3 程序流程52.4 程序相关说明7 2.5 数据库模型 6 2.6 数据库表格72.7 程序运行界面7第三章. 程序详细设计与分析123.1 界面组成部分113.2学生家教属性的封装与构造方法303.3 Jdbc的详细结构及数据库语言363.4异常处理
2、49第四章测试分析50第五章答辩52第六章课程设计总结52第七章、参考文献52学生家教管理系统摘要: 该报告中的程序是使用Java程序编写并且通过JDBC连接mysql数据库,能够进行输入输出家教信息操作将家教的各种信息存入数据和在数据库中删除,并具有家教查询、添加、替换、注销、记录家教缺勤和计算薪水等功能,不同之处是本程序能够家教的的各项情况进行统计。该程序主要用到了Java swing和事件监听等。本程序分为三大步份(组长)黄兴雷负责需求分析及JM包中针对界面的制作,茹霞同学负责Jdbc包的制作,段文梅同学负责Worker包学生家教信息的私有封装及数据库的制作,期间三位同学之间相互联系配合
3、完成程序的设计与实现关键字: Java语言、JDBC、数据库、数据库语言、界面。第一章、需求分析1.1需求分析对于现在在校大学生在校接任家教频繁,为了提供一个高效的、可行的、可控的、安全的中介,需要一个方便关于管理的操着平台,记录和保存每一位学生家教的基本信息和家教情况,为学生提供更多的家教对象和更合理的家教对象分配,据此通过java程序设计实现这一学生家教管理系统。1.2功能设计本程序根据学生家教管理的需求设置了六大主要功能,即所有家教查询、家教添加、家教注销、家教替换、家教记录、家教查询。(1)程序运行出现主界面,主界面上有家教信息显示框(显示框自动出现滚动条)、家教部分信息输入框及执行六
4、大功能的按钮;(2)点击所有家教,显示框中出现所有的家教及其个人信息,其个人信息包括姓名、所在大学、家教对象、星期家教安排、家教次数、家教附加(加班)、家教缺勤、薪水、时间,另外显示家教当日家教的情况包括当日家教、当日缺勤、当日附加、当日时间。(3)在输入框输入所要操着家教的姓名,点击家教查询或家教记录的按钮,然后在显示框中显示出所要操着得出的信息;(4)在输入框输入所要操着家教的姓名,点击家教查询或家教记录的按钮,之后弹出各种功能的信息框,可在其中添加活该面信息,并且点击信息框中的返回或确认按钮可以弹出操着成功或操着失败的信息框;(5)操着中改变的、增添的各项数据可存于数据库当中,删除的数据
5、从书库中消失第二章、 概要设计2.1 程序设计思路本程序通过建立Worker、Jdbc、JM三个包分别来实现整个程序的三大板块。Worker包当中的Mteacher类定义单个个老是工作情况各个私有属性,并对其进行封装,Teachers类定义单个学生家教的个人信息的私有属性也对进行封装。Jdbc包用于连接数据库,其中的DButil类和DButil1类中的方法通过调用不同的构造方法从界面获取数据信息,再通过ps带入数据查询语言,然后使用数据库分别交叉控制程序对数据库的操着,同时也可以将数据库中的数据通过Worker中的构造方法创建出来,显示在界面中JM包中的程序用于界面的显示,为满足显示的需要总共
6、创建了7个界面Screen、Screen1、Screen2、Screen3、Screen4为Screen的子界面,Screen6、Screen7为判断操着成功与否的界面,所有界面运用了java.swing、java.util、java.awt、java.envent包中的类及各种接口、方法。本程序中各项数据库表和Worker包中的各个类相互对应,其中表中当中的列和元组与worker包中的类的属性一一对应。2.2 模块说明图Mteacher类Teachers类Worker包DButil类、DButil1类Jdbc包、粘结数据库Screen Screen1、Screen、Screen3、Scree
7、n4、Screen6Screen7 JM界面包Mysql数据库、Mtacher表、Teachers表2.3 程序流程起动程序输入姓名家教替换Screen2家教注销Screen1家教查询 Screen4家教记录所有员工信息查询家教添加Screen3确认或返回操着失败!Screen7操着成功!Screen6返回首页!生成主界面Screen 2.4 程序相关说明(1)整个程序分为三大板块,仿照MVC模式进行总体框架设计,其中Jdbc包负责连接数据库,其中在个JM包中Screen3在界面初始化各项为空白,Screen1、2、4中的部分单行文本框显示内容的初始化和数值是从数据库中取出数值然后根据Work
8、er包中相关构造方法创建取出,其中时间是生成当前时间存入数据库。(2)本程序书库是用mysql数据库编译器制作数据表器端口号为3306,Jdbc中的DButil与DButil1相互交叉通过书库语言向数据库中存取数值(3)本程序中的Worker包中主要针对两个学生连个对象进行封装,和添加构造方法和toString()方法(4)本程序中使用的监听类为ActionHappen1 实现 ActionListener接口2.5数据库模型所在大学姓名当日时间当日缺勤当日家教家教缺勤家教对象星期家教安排家教次数时间家教附加学生家教薪水当日附加学生家教当日情况2.6数据库表(1)Teachers表,表中工资为
9、每次20元,缺勤扣20元(2)Mteacher,表中所有记录为当日记录,并且结果累加到Teachers表中2.7 程序运行界面(1)运行程序显示首页界面(2)所有家教:点击所有家教按钮则会在第一栏文本框中显示出所有家教的信息,可以通过拖动滚动条浏览所有情况(3)学生家教:添加点击家教添加,弹出学生家教注册添加框,注册完成后再点击确认添加弹出验证框,若在点击返回按钮首页则回到首页界面(4)家教替换:在第二栏输入要操着的人名,击家教替换弹出学生家教替换框,出被替换人出名字以及家教次数、缺勤、附加及薪水已初始化不可改,在改完其他信息后点击确认替换即弹出验证框,点击返回首页按钮首页界面(5)家教注销:
10、在第二栏输入要操着的人名,要开除一个家教或者解除家教关系时,点击家教注销弹出学生家教注销,点击确认删除按钮,弹出验证框(6)家教查询:在第二栏输入要查询人的名字,点击家教查询,若没有要找的家教,或则家教已被删除则弹出操着失败,点击按钮返回首页,则出首页界面(7)家教查询:在第二栏输入要操着的人名,点击家教记录,则在第一栏文本框显示栏怎会显示出关于查询人的所有家教记录,如果没有此人,则弹出操着失败验证框,如果有此人则可给所操作的家教记录当日的工作情况(8)家教记录:在第二栏输入要操着的人名,点击家教记录,若有此人则会显示所操着人的所有操着信息,显示的信息可以通过拖动滚动条浏览,若儿没有此人或者此
11、人已被删除则弹出操着失败对话框第三章. 程序详细设计与分析3.1界面的组成部分(1)Screenpackage JM;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;impo
12、rt javax.swing.JTextArea;import Jdbc.DBUtil;import Jdbc.DButil1;public class Screen JTextArea jTextArea = new JTextArea(50, 50);/创建文本框JTextArea jTextArea2 = new JTextArea(50, 50);JScrollPane jScrollPane = new JScrollPane(jTextArea);/ 添加滚动条JScrollPane jScrollPane2 = new JScrollPane(jTextArea2);String
13、 aString = 家教添加, 家教替换, 家教注销, 家教查询 ,所有家教,家教记录;JButton jButton = new JButton6; /创建一个窗口JFrame frame = new JFrame(学生家教管理系统); /main执行一个构造方法public static void main(String args) new Screen();/构造首页界面public Screen() JPanel jPanel = new JPanel();jPanel.setLayout(new BorderLayout();for (int i = 0; i aString.le
14、ngth; i+) jButtoni = new JButton(aStringi);/给各个按钮添加监听jButtoni.addActionListener(new ActionHappen1();jPanel.add(jButtoni);/将此jpanle布局管理jPanel.setLayout(new GridLayout(1,6);frame.add(jScrollPane,BorderLayout.NORTH);frame.add(jScrollPane2, BorderLayout.CENTER);frame.add(jPanel,BorderLayout.SOUTH); /对此窗
15、口进行大小,可视,可删除,布局管理等添加frame.setResizable(true);frame.setBounds(28, 28, 800, 300); frame.setSize(900,500);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);frame.setLayout(new GridLayout(3, 1); /创建一个监听类实现ActionListener接口public class ActionHappen1 implements ActionListener publ
16、ic void actionPerformed(ActionEvent e) String name = e.getActionCommand();if(所有家教.equals(name) /当点击“所有家教”获取文本框jTextArea2中内容,然后传给形参,执行查询语句 /查询所有家教的工作情况jTextArea.setText(DBUtil.findUser().toString();if(家教注销.equals(name)new Screen1(jTextArea2.getText();/当点击“家教注销”按钮页面跳转到Screen1,/获取文本框jTextArea2中内容,然后传给形
17、参,执行查询语句if(家教替换.equals(name)/获取文本框汇jTextArea2中内容,然后传给形参,执行查询语句/当点击“家教替换“按钮页面跳转到Screen2new Screen2(jTextArea2.getText();if(家教添加.equals(name)new Screen3();/获取文本框jTextArea2中内容,然后传给形参,执行查询语句/当点击“家教添加“按钮页面跳转到Screen3if(家教查询.equals(name)/当点击“家教查询”按钮页面跳转到Screen4/获取文本框jTextArea2中内容,然后传给形参,执行查询语句new Screen4(j
18、TextArea2.getText();if(家教记录.equals(name) /当点击“所有家教”获取文本框jTextArea2中内容,然后传给形参,执行查询语句 /查询所有家教的工作情况jTextArea.setText(DButil1.find1(jTextArea2.getText().toString();(2)Screen1package JM;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionL
19、istener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextArea;import Woker.Teachers;import Jdbc.DBUtil;import Jdbc.DButil1;public class Screen1 public static JTextArea jTextArea = new JTextArea9; /创建多个文本框JLabel jLabel =
20、new JLabel9;/创建多个标签JPanel jPanel = new JPanel9;/创建多个panelstatic String bString = 姓名:,所在大学,家教对象:,星期家教安排:,家教次数,家教附加:,家教缺勤:,薪水:,时间:; JButtonjButton1 = new JButton(确认删除); JButtonjButton2 = new JButton(取消);JFrame frame = new JFrame(学生家教注销);/通过构造screen方法对界面进行初始化public Screen1( String context) frame.setLay
21、out(new GridLayout(10,1,10,10);for (int i = 0; i 9; i+) jPaneli = new JPanel();jTextAreai = new JTextArea(50, 50);jLabeli = new JLabel(bStringi);jPaneli.add(jLabeli);jPaneli.add(jTextAreai);jPaneli.setLayout(new GridLayout(1,2);frame.add(jPaneli); /向界面当中的文本框当中赋加内容,内容即为Teachers对象各属性值Teachers conn = D
22、BUtil.find(context);jTextArea0.setText(conn.get姓名();jTextArea1.setText(conn.get所在大学();jTextArea2.setText(conn.get家教对象();jTextArea3.setText(conn.get星期家教安排();jTextArea4.setText(conn.get家教次数()+);jTextArea5.setText(conn.get家教附加()+);jTextArea6.setText(conn.get家教缺勤()+);jTextArea7.setText(conn.get薪水()+);jT
23、extArea8.setText(new java.util.Date().toString(); /对screen1界面当中的按钮添加监听,并布局jButton1.addActionListener(new ActionHappen1();jButton2.addActionListener(new ActionHappen1();jPanel8 = new JPanel();jPanel8.add(jButton1,BorderLayout.WEST);jPanel8.add(jButton2,BorderLayout.EAST);jPanel8.setLayout(new GridLay
24、out(1, 2);frame.add(jPanel8);/对此窗口初始化进行处理frame.setResizable(true);frame.setBounds(28, 28, 700, 600);frame.setSize(700, 600);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true); /创建一个监听类实现 ActionListener接口public class ActionHappen1 implements ActionListener public void actionP
25、erformed(ActionEvent e) /通过getActionCommand()接收窗口中按钮String name = e.getActionCommand();if(确认删除.equals(name)try DBUtil.drop(jTextArea0.getText();DButil1.drop1(jTextArea0.getText();new Screen7(); catch (Exception e2) new Screen6();/抛出异常,若出现异常,弹出操着失败窗口else if (取消.equals(name) newScreen();(3)Screen2pack
26、age JM;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextArea;import Woker.Mteacher;import Wok
27、er.Teachers;import Jdbc.DBUtil;import Jdbc.DButil1;public class Screen2 public static JTextArea jTextArea = new JTextArea10;JLabel jLabel = new JLabel10;JPanel jPanel = new JPanel11;static String bString = 姓名:, 所在大学:, 家教对象, 星期家教安排:, 家教次数,家教附加:, 家教缺勤:, 薪水:, 时间:, 被替换人: ;JButton jButton1 = new JButton(
28、确认替换);JButton jButton2 = new JButton(取消);JFrame frame = new JFrame(学生家教替换); /构造方法初始化screen2public Screen2(String context) frame.setLayout(new GridLayout(11, 1, 10, 10);for (int i = 0; i 10; i+) jPaneli = new JPanel();jTextAreai = new JTextArea(50, 50);jLabeli = new JLabel(bStringi);jPaneli.add(jLabe
29、li);jPaneli.add(jTextAreai);jPaneli.setLayout(new GridLayout(1, 2);frame.add(jPaneli); /创建对象获取teachers的各项属性值Teachers conn = DBUtil.find(context);jTextArea0.setText(conn.get姓名();jTextArea1.setText(conn.get所在大学();jTextArea2.setText(conn.get家教对象();jTextArea3.setText(conn.get星期家教安排();jTextArea4.setText(
30、conn.get家教次数() + );jTextArea5.setText(conn.get家教附加() + );jTextArea6.setText(conn.get家教缺勤() + );jTextArea7.setText(conn.get薪水() + );jTextArea8.setText(new java.util.Date().toString();jTextArea9.setText(context);jButton1.addActionListener(new ActionHappen1();jButton2.addActionListener(new ActionHappen
31、1();jPanel10 = new JPanel();jPanel10.add(jButton1, BorderLayout.WEST);jPanel10.add(jButton2, BorderLayout.EAST);jPanel10.setLayout(new GridLayout(1, 2);frame.add(jPanel10); /对screen4窗口进行布局管理frame.setResizable(true);frame.setBounds(28, 28, 700, 600);frame.setSize(700, 600);frame.setDefaultCloseOperat
32、ion(JFrame.EXIT_ON_CLOSE);frame.setVisible(true); /新建监听类实现接口,给窗口中的按钮添加监听public class ActionHappen1 implements ActionListener public void actionPerformed(ActionEvent e) String name = e.getActionCommand();if (确认替换.equals(name) Teachers pop = new Teachers(jTextArea0.getText(),jTextArea1.getText(), jTex
33、tArea2.getText(),jTextArea3.getText(), 0, 0, 0, 0, null);Mteacher jobs3 = new Mteacher(jTextArea0.getText(),jTextArea1.getText(), 0, 0, 0, new java.util.Date().toString();/调用jdbc包中dbutil的员工添加方法获取数据库里的内容if (DBUtil.update(pop, jTextArea9.getText()& DButil1.insert1(jobs3)&DButil1.drop1(jTextArea9.getTe
34、xt() new Screen7(); else new Screen6();new Screen(); else if (取消.equals(name) new Screen();(4)Screen3package JM;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import j
35、avax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextArea;import Woker.Teachers;import Jdbc.DBUtil;import Jdbc.DButil1;public class Screen3 JLabel jLabel = new JLabel9;JPanel jPanel = new JPanel10;String bString = 姓名:, 所在大学, 家教对象:, 星期家教安排:, 家教次数, 家教附加:,家教缺勤:, 薪水:, 时间 ;JButton jButton1
36、 = new JButton(确认添加);JButton jButton2 = new JButton(取消);JFrame frame = new JFrame(学生家教注册添加);public static JTextArea jTextArea = new JTextArea9;public static void main(String args) new Screen3();public Screen3() /创建构造方法初始化screen3frame.setLayout(new GridLayout(10, 1, 10, 10);for (int i = 0; i 9; i+) j
37、Paneli = new JPanel();jTextAreai = new JTextArea(50, 50);jLabeli = new JLabel(bStringi);jPaneli.add(jLabeli);jPaneli.add(jTextAreai);jPaneli.setLayout(new GridLayout(1, 2);frame.add(jPaneli);jButton1.addActionListener(new ActionHappen1();jButton2.addActionListener(new ActionHappen1();jPanel8 = new J
38、Panel();jPanel8.add(jButton1, BorderLayout.WEST);jPanel8.add(jButton2, BorderLayout.EAST);jPanel8.setLayout(new GridLayout(1, 2);frame.add(jPanel8);/对screen3窗口进行布局管理frame.setResizable(true);frame.setBounds(28, 28, 700, 600); frame.setSize(700,600);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
39、;frame.setVisible(true);public class ActionHappen1 implements ActionListener public void actionPerformed(ActionEvent e) String name = e.getActionCommand();if (确认添加.equals(name) /获取窗口中各项文本框的内容,创建一个teachers对象Teachers teachers = new Teachers(jTextArea0.getText(),jTextArea1.getText(), jTextArea2.getText
40、(),jTextArea3.getText(), Integer.parseInt(jTextArea4.getText(), 10), Integer.parseInt(jTextArea5.getText(), 10), Integer.parseInt(Screen3.jTextArea6.getText(), 10),10 * (Integer.parseInt(jTextArea4.getText(), 10)+ Integer.parseInt(Screen3.jTextArea5.getText(), 10) - Integer.parseInt(jTextArea6.getTe
41、xt(), 10),new java.util.Date().toString(); /调用DBUtil中的添加方法添加新成员的各项业务信息栏if (DBUtil.ADD(teachers) & DButil1.ADD1(teachers) new Screen7(); else new Screen6();new Screen3(); else if (取消.equals(name) new Screen();(5)Screen4package JM;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt
42、.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextArea;import Woker.Mteacher;import Jdbc.DButil1;public class Screen4 JLabel jLabel = new JLabel6;JPanel jPanel = new
43、 JPanel7;String bString = 姓名:,所在大学,当日上班,当日加班:,当日早退迟到:,时间:; JButtonjButton1 = new JButton(确认); JButtonjButton2 = new JButton(返回);JFrame frame = new JFrame(家教当日情况);public static JTextArea jTextArea = new JTextArea7;/创建构造方法初始化screen4public Screen4(String n5) frame.setLayout(new GridLayout(7,1,10,10); f
44、or (int i = 0; i 6; i+) jPaneli = new JPanel();jTextAreai = new JTextArea(50, 50);jLabeli = new JLabel(bStringi);jPaneli.add(jLabeli);jPaneli.add(jTextAreai);jPaneli.setLayout(new GridLayout(1,2);frame.add(jPaneli); /调用DButil1中find2()方法获取员工在数据库中的内容,然后创建一个Mteacher对象 Mteacher mteacher =DButil1.find2(n
45、5); jTextArea0.setText(mteacher.get姓名(); jTextArea1.setText(mteacher.get所在大学(); jTextArea2.setText(mteacher.get当日家教()+); jTextArea3.setText(+mteacher.get当日附加(); jTextArea4.setText(+mteacher.get当日缺勤(); jTextArea5.setText(new java.util.Date().toString(); jButton1.addActionListener(new ActionHappen1();
46、 jButton2.addActionListener(new ActionHappen1(); jPanel6 = new JPanel(); jPanel6.add(jButton1,BorderLayout.WEST); jPanel6.add(jButton2,BorderLayout.EAST); jPanel6.setLayout(new GridLayout(1, 2); frame.add(jPanel6); /对screen5窗口进行布局管理 frame.setResizable(true); frame.setBounds(28, 28, 700, 600); frame.
47、setSize(700,600); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); /新建监听类实现接口,给窗口中的按钮添加监听public class ActionHappen1 implements ActionListener public void actionPerformed(ActionEvent e) String name = e.getActionCommand();if(确认.equals(name)/获取窗口中各项文本框对应内容,创建一个MteacherMteac
48、her job = new Mteacher(jTextArea0.getText(), jTextArea1.getText(), Integer.parseInt(jTextArea2.getText(),10),Integer.parseInt(jTextArea3.getText(),10),Integer.parseInt(jTextArea4.getText(),10), new java.util.Date().toString();if(DButil1.update1(job,jTextArea0.getText()&DButil1.insert1(job)/调用DButil1中update1方法将员工在数据库当中的内容进行更新/调用DButil1中insert1()方法将员工当日的工作情况记录到数据库中new Screen7();else if (返回.equals(name) new Screen();(6)Screen6package JM;import java.awt.BorderLayout;import java.awt.FlowLayout;import java.aw
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 绿色小清新夏季安全生产培训模板
- 班主任工作范文四年级一班班主任工作计划
- 《失衡生活》观后感10篇
- 金融理财师AFP认证历年考试真题试题库(含答案)
- 泡泡岛音乐与艺术节
- 中国近现代史纲要知到智慧树章节测试课后答案2024年秋华东政法大学
- 安全隐患整改方案(19篇)
- 林地转让定金协议书
- 联合体合同范本规范
- 合同司法第114条
- GB/T 19492-2020油气矿产资源储量分类
- GB/T 1933-1991木材密度测定方法
- GB 25501-2019水嘴水效限定值及水效等级
- 高教版中职语文(基础模块)上册写作《记叙文-人物描写(片段)》课件1
- PEP-3心理教育量表-评估报告
- 储运作业活动清单
- 培智一年级第一册生活数学试卷
- 气体灭火系统气体钢瓶检测充装技术文件
- 公司科学技术进步奖评审指标表
- 电控燃油喷射系统的控制
- 附件2-5:人民银行征信系统数据文件交换参考指南
评论
0/150
提交评论