资源描述
I 软软软软 件件件件 学学学学 院院院院三级实践课题三级实践课题课题名称:课题名称: 日程管理小助手日程管理小助手 专专 业:业: 软件工程(软件工程(JavaJava 方向)方向) 班班 级:级: 学学 号:号: 学生姓名:学生姓名: 指导教师:指导教师: 年年 月月 日日I 摘 要随着经济全球化、管理现代化的到来,信息化建设已提到议事日程。计算机和网络技术得到了迅速的发展和普及,互联网的应用和发展改变了全球的经济模式,企业管理模式也受到了极大的冲击,使信息资源的共享和超越时空的交换成为了可能 。在这个激烈竞争的社会,人们的杂乱事务越来越多,而且常常因为一些小事情把重要的事情耽误,对个人家庭以及企业造成巨大的损失。事件提醒也来越成为人们的一个救星,来化解各个事件间的矛盾。为了迎接残酷的社会竞争,个人管理助手是每个个体都需要实用的一种提醒软件。因此,毫无疑问的说,日程管理无能对个人还是企业都是非常必要的。做好了日程管理个人可以更好地规划自己生活,让自己的生活多姿多彩,井然有序;让企业能确保各项工作及时有效推进,在时间以及效率上能够给企业带来最大的受益,能够在规定时间内完成既定任务。日程管理的重要性在于可以将每天的工作和事务安排在日期中并做一个有效的记录方便管理日常的工作和事务,达到工作备忘的目的。同时也具有对员工日常工作进行指导、监督的作用。关键词:办公自动化,计算机,日程管理 :日程管理小助手目 录摘摘 要要.I第第 1 章章 系统分析系统分析.11.1 问题描述.11.2 技术分析.11.3 工程进度计划.2第第 2 章章 系统功能设计系统功能设计.32.1 功能分析.32.2 系统设计.42.2.1 数据库表的设计.4图图 2-22-2.43.1 功能模块.53.2 主要界面实现.63.3 部分功能实现的源代码.10第第 4 章章 结束语结束语.20:日程管理小助手1第 1 章 系统分析1.1 问题描述在这个激烈竞争的社会,人们的杂乱事务越来越多,而且常常因为一些小事情把重要的事情耽误,对个人家庭以及企业造成巨大的损失。事件提醒也来越成为人们的一个救星,来化解各个事件间的矛盾。为了迎接残酷的社会竞争,个人管理助手是每个个体都需要实用的一种提醒软件。因此,毫无疑问的说,日程管理无能对个人还是企业都是非常必要的。日程管理个人可以更好地规划自己生活,让自己的生活多姿多彩,井然有序;让企业能确保各项工作及时有效推进,在时间以及效率上能够给企业带来最大的受益,能够在规定时间内完成既定任务。1.2 技术分析在界面设计上,要尽量简化,是用图形化页面。在前面利用了上中下三个面板,最外面的布局管理用的是 BorderLayout()。在最上面那一行用的是JMenu(),二级下拉菜单用的是 JMenuItem()。在 BorderLayout.CENTER 中放的是图形,用来美化外观;BorderLayout.SOUTH 放了四个 JLabel 用来提示已经添加的事件提醒。在具体的时间选择上要提供日历,即使用 Calender类。用此类可以避免用户在输入的时候输入非法字符以及非法操作等造成异常。而且,要使用数据库来记录具体的时间,事件信息。在记录时间的时候,考虑到用 Date 记录时间要将 Date 转化成字符串,在记录的时候又得将字符串转化为 Date 类型较为繁琐。因此,在时间记录方面,一直使用的字符串类型。避免相互转化的繁琐,以及在转化石可能抛出的异常,简化了代码,减少了工作量。事件记录方面也是用的字符串类型,基于事件提醒时,记录字数较少,用 Text 格式的又较为麻烦,因此选择了字符串。但是,在帮助:日程管理小助手2的通告项方面使用的为 Text,字数较多,需要选择该格式。在细节方面,一定要捕捉异常,用到 try()、catch(),捕捉并处理异常。在时间输入时,默认不输入时间为本地时间。后又一个时间判断,用到if 语句,当获得的时间与本地时间相同时,提示用户未输入时间且重新输入。事件提醒内容(equals(“”)),提示用户输入事件提醒内容。在异常处理方面做到捕捉异常,处理异常,并且合理;在操作性方面,要人性化。当提示用户输入的内容,或操作非法时,用重新返回到原页面,而不是异常或退出。用到 dispose()让本页面“消失” ,在重新调用原来的页面。在提醒用户方面,获得本地的时间与提醒时间相同时,用到 ShowMessageDialog()提示,用户在某时间要做某事。1.3 工程进度计划 本课题小组共两人,一个主要负责前期的需求分析,中期的一些异常处理、具体的修改,最后的一些总结,代码优化。另外,我主要负责部分功能的实现,对部分代码的修改、优化。在三周内可以基本结束课题的所有内容,完成知道老师对本课题的指导,安排的具体的修改工作。当然,在三周的时间里,肯定不是刚开始就立即着手开始进入课题实践阶段。在第一周内,主要对课程管理小助手需要完成的必要功能、参考别人做过的功能以及其他人做的优点以及不足的地方、综合我们学过的知识选择我们要完成的功能,总结我们需要实现的方法以及复习或者学习实现该功能的方法。第二周开始着手进入代码编译阶段,具体的代码完成后,部分要修改或优化的由我的同伴完成。第三周前段时间,主要对已完成的系统进行测试,对一些未处理的异常进行捕捉并处理。后段时间进行课题报告的完成以及总结三周里的实践心得,系统的完成满意度以及学习方法的总结。:日程管理小助手3第 2 章 系统功能设计2.1 功能分析图 2-1如图 2-1 所示,用户使用本系统时,可以根据日历表选择事件提醒的时间,输入事件提醒的内容。用户可以选择按时间删除和全部删除两种删除方式,也可以通过帮助,来了解本软件的功能以及操作步骤。 查看事件提醒可以通过时间或查询全部两种查询方式查询,在设置方面,可以设置系统的字体颜色,大小以及背景色。在美化系统首页方面,用了Icon 对象,添加了图片,利用 JPanel,JLabel,JMenu,JMenuItem 来图形化界面。在面板的下方,有四个 JLabel 来显示要提示的事件提醒内容。根据事件的紧急程度来定义不同的颜色来区分等级,在添加完事件提醒内容之后,会显示到系统主业的下方 JLabel 上。也可以调节字体的大小,颜色,日程管理添加事件提醒查看事件提醒设置按时间查询查询全部按时间删除删除全部删除全部提醒时间提醒内容字体大小背景色删除事件提醒字体大小帮助:日程管理小助手4背景色。查询、删除事件提醒可以选择全部或对单一对象进行操作,可以在日历中选择事件提醒的事件以及提示所有非法的操作以及提示用户再次输入。2.2 系统设计2.2.1 数据库表的设计表 2-2 Schedule 日程安排配置表字段名称类型大小约束说明No.int201时间编号thingsVARCHAR900事件提醒daytimeVARCHAR300提醒时间图 2-2 如图 2-2 所示,数据库中有一张表,其属性为时间编号,事件提醒内容,提醒时间等内容。No.定义为 int 类型,为事件的序号,设置为主键。用数据库来记录具体的时间,事件信息。在记录时间的时候,考虑到用Date 记录时间要将 Date 转化成字符串,在记录的时候又得将字符串转化为Date 类型较为繁琐。因此,在时间记录方面,一直使用的字符串类型。避免相互转化的繁琐,以及在转化石可能抛出的异常,简化了代码,减少了工作量。事件记录方面也是用的字符串类型,基于事件提醒时,记录字数较少,用 Text 格式的又较为麻烦,因此选择了字符串。但是,在帮助的通告项方面使用的为 Text,字数较多,需要选择该格式。在细节方面,一定要捕捉异常,用到 try()、catch(),捕捉并处理异常。 :日程管理小助手5第 3 章 系统实现3.1 功能模块图 3-1如图 3-1 所示,在主界面方面,添加了一张背景图片来美化桌面,下面是事件消息的提醒,按照时间的先后顺序根据颜色的不同不区分事件要处理的紧急度。最上面一行是菜单栏,主要是简化按钮所占用的空间。在界面设计上,要尽量简化,是用图形化页面。在前面利用了上中下三个面板,最外面的布局管理用的是 BorderLayout()。在最上面那一行用的是JMenu(),二级下拉菜单用的是 JMenuItem()。在 BorderLayout.CENTER 中放的是图形,用来美化外观;BorderLayout.SOUTH 放了四个 JLabel 用来提示已经添加的事件提醒。在具体的时间选择上要提供日历,即使用 Calender 类。:日程管理小助手6用此类可以避免用户在输入的时候输入非法字符以及非法操作等造成异常。在操作性方面,要人性化。当提示用户输入的内容,或操作非法时,用重新返回到原页面,而不是异常或退出。用到 dispose()让本页面“消失” ,在重新调用原来的页面。在提醒用户方面,获得本地的时间与提醒时间相同时,用到 ShowMessageDialog()提示,用户在某时间要做某事。在细节方面,一定要捕捉异常,用到 try()、catch(),捕捉并处理异常。在时间输入时,默认不输入时间为本地时间。后又一个时间判断,用到 if 语句,当获得的时间与本地时间相同时,提示用户未输入时间且重新输入。事件提醒内容(equals(“”)),提示用户输入事件提醒内容。在异常处理方面做到捕捉异常,处理异常,并且合理;在操作性方面,要人性化。当提示用户输入的内容,或操作非法时,用重新返回到原页面,而不是异常或退出。用到dispose()让本页面“消失” ,在重新调用原来的页面。在提醒用户方面,获得本地的时间与提醒时间相同时,用到 ShowMessageDialog()提示,用户在某时间要做某事。3.2 主要界面实现1.:日程管理小助手7图 3-2-1图 3-2-2添加界面,是可以根据日历的方式来进行时间的选择;如果不惊醒时间选择的话,默认时间是本地时间。如果不输入事件信息的话,利用 if 判断,若等于本地时间,则提示,没有输入时间提醒的时间,会返回时间选择页面,重新进行时间的获取。在事件提醒内容方面,如果输入的信息提示为空,会提示未输入,返回页面重新输入。:日程管理小助手8在具体的时间选择上要提供日历,即使用 Calender 类。用此类可以避免用户在输入的时候输入非法字符以及非法操作等造成异常。而且,要使用数据库来记录具体的时间,事件信息。在记录时间的时候,考虑到用 Date 记录时间要将 Date 转化成字符串,在记录的时候又得将字符串转化为 Date 类型较为繁琐。因此,在时间记录方面,一直使用的字符串类型。避免相互转化的繁琐,以及在转化石可能抛出的异常,简化了代码,减少了工作量。事件记录方面也是用的字符串类型,基于事件提醒时,记录字数较少,用 Text 格式的又较为麻烦,因此选择了字符串。但是,在帮助的通告项方面使用的为Text,字数较多,需要选择该格式。在细节方面,一定要捕捉异常,用到 try()、catch(),捕捉并处理异常。在时间输入时,默认不输入时间为本地时间。后又一个时间判断,用到 if 语句,当获得的时间与本地时间相同时,提示用户未输入时间且重新输入。事件提醒内容(equals(“”)),提示用户输入事件提醒内容。在异常处理方面做到捕捉异常,处理异常,并且合理;在操作性方面,要人性化。当提示用户输入的内容,或操作非法时,用重新返回到原页面,而不是异常或退出。用到dispose()让本页面“消失” ,在重新调用原来的页面。在提醒用户方面,获得本地的时间与提醒时间相同时,用到 ShowMessageDialog()提示,用户在某时间要做某事。2.删除界面3-3 如图 3-3 所示,在删除方式方面,可以选择全部删除或者单一删除。在删除方式选择方面用的是 JOptionPane.ShowOptionDialog(),利用 if 判断选择的序号,根据用户选择的功能,执行相应的方法。:日程管理小助手9 当选择的内容为“按时间删除”内容时,在数据库方面用到的 sql语句为(“delete from Schedule where daytime=”+date+” ”);可以根据时间删除事件提醒的内容,在首页面板的 JLabel 上显示的就没有本条事件提醒内容;而在选择的内容为“删除所有事件提醒”内容时,在数据库方面用到的sql 语句为(“delete from Schedule“);可以根据删除全部的事件提醒的内容,在首页面板的 JLabel 上显示的就为空;3.查询界面 3-4如图 3-3 所示,在删除方式方面,可以选择全部查询或者单一查询。在删除方式选择方面用的是 JOptionPane.ShowOptionDialog(),利用 if 判断选择的序号,根据用户选择的功能,执行相应的方法。当选择的内容为“按时间查询”内容时,在数据库方面用到的 sql 语句为(“select No, daytime, things from Schedule where daytime=”+date+” ”);可以根据时间查询事件提醒的内容,在 showMessageDialog 消息弹出一个消息对话框,会提示查询成功以及查询的结果;而在选择的内容为“查询所有事件提醒”内容时,在数据库方面用到的sql 语句为(“select * from Schedule“);可以查询全部的事件提醒的内容,在弹出的面板中会显示所查询的内容;:日程管理小助手103.3 部分功能实现的源代码import java.util.Date;import java.util.Calendar;import java.text.SimpleDateFormat;import java.text.ParseException ;import java.awt.Color ;import java.awt.Font;import java.awt.Point ;import java.awt.Dimension ;import java.awt.BorderLayout ;import java.awt.FlowLayout ;import java.awt.GridLayout ;import java.awt.Cursor ;import java.awt.Frame ;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;/import javax.swing.JFrame;import javax.swing.JButton;import javax.swing.JDialog;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JLabel;import javax.swing.JSpinner ;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.SpinnerNumberModel;import javax.swing.SwingUtilities;import javax.swing.SwingConstants ;import javax.swing.event.ChangeListener ;import javax.swing.event.ChangeEvent ;import javax.swing.border.LineBorder ;SuppressWarnings(serial)public class Cal extends JFramefinal String showMessageDialog = 未添加时间信息,请重新添加!;private String getDate() / TODO Auto-generated method stubDate d=new Date();SimpleDateFormat sdf=new SimpleDateFormat(yyyy-MM-dd kk); String str=sdf.format(d);/System.out.println(The date is : +str);return str;:日程管理小助手11 public Cal() final DateChooserJButton btn = new DateChooserJButton(); final JTextField jt1=new JTextField(30); final JButton btn2 = new JButton(确定); final JLabel jl = new JLabel(请输入事件提醒的内容:); if(btn.getText()=getDate() JOptionPane.showMessageDialog(null,showMessageDialog); if(jt1.getText().equals(null) JOptionPane.showMessageDialog(null,未添加提示信息,请重新添加!); btn2.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) if(btn.getText()=getDate() JOptionPane.showMessageDialog(null,未添加时间信息,请重新添加!); /System.out.print(getDate(); if(jt1.getText()=null) JOptionPane.showMessageDialog(null,未添加提示信息,请重新添加!); JOptionPane.showMessageDialog(null,未添加提示信息,请重新添加!);JOptionPane.showMessageDialog(null,事件提醒时间+btn.getText()+获取成功。); dispose();System.out.println(jt1.getText();ScheduleManagement sm=new ScheduleManagement();sm.setSize(600, 500);sm.setLocation(400, 200); ); this.getContentPane().setLayout(new BorderLayout(); this.getContentPane().add(btn,new BorderLayout().NORTH); this.getContentPane().add(jl,new BorderLayout().WEST); this.getContentPane().add(jt1,new BorderLayout().EAST); this.getContentPane().add(btn2 ,new BorderLayout().SOUTH); this.setSize(500,400); this.setLocation(400,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);:日程管理小助手12 this.setVisible(true); SuppressWarnings(unused)public static void main(String args) Cal cal = new Cal(); SuppressWarnings(serial)class DateChooserJButton extends JButton private DateChooser dateChooser =null;private String preLabel = ;public DateChooserJButton() this(getNowDate() ;public DateChooserJButton(SimpleDateFormat df , String dateString) this() ;setText(df,dateString) ;public DateChooserJButton(Date date) this(,date);public DateChooserJButton(String preLabel , Date date) if (preLabel!=null) this.preLabel = preLabel ;setDate(date) ;setBorder(null) ;setCursor(new Cursor(Cursor.HAND_CURSOR) ;super.addActionListener( new ActionListener() public void actionPerformed(ActionEvent e) if (dateChooser=null) dateChooser = new DateChooser();Point p = getLocationOnScreen() ;p.y = p.y+30 ;dateChooser.showDateChooser(p) ; ) ; private static Date getNowDate() :日程管理小助手13return Calendar.getInstance().getTime() ; private static SimpleDateFormat getDefaultDateFormat() return new SimpleDateFormat(yyyy-MM-dd HH) ; /覆盖父类的方法public void setText(String s) Date date ;try date = getDefaultDateFormat().parse(s) ; catch (ParseException e) date = getNowDate() ;setDate(date) ;public void setText(SimpleDateFormat df , String s) Date date ;try date = df.parse(s) ;catch (ParseException e) date = getNowDate() ;setDate(date) ; public void setDate(Date date) super.setText(preLabel+getDefaultDateFormat().format(date);public Date getDate() String dateString = getText().substring(preLabel.length();try return getDefaultDateFormat().parse(dateString); catch (ParseException e) return getNowDate() ; /覆盖父类的方法使之无效public void addActionListener(ActionListener listener ) :日程管理小助手14 private class DateChooser extends JPanel implements ActionListener ,ChangeListener int startYear = 1980; /默认【最小】显示年份int lastYear = 2050; /默认【最大】显示年份int width = 400; /界面宽度int height = 600; /界面高度Color backGroundColor = Color.gray; /底色/月历表格配色-/Color palletTableColor = Color.GRAY; /日历表底色Color todayBackColor = Color.GREEN; /今天背景色Color weekFontColor = Color.blue; /星期文字色Color dateFontColor = Color.black; /日期文字色Color weekendFontColor = Color.red; /周末文字色/控制条配色-/Color controlLineColor = Color.GRAY; /控制条底色Color controlTextColor = Color.white; /控制条标签文字色Color rbFontColor = Color.white; /RoundBox文字色Color rbBorderColor = Color.red; /RoundBox边框色Color rbButtonColor = Color.pink; /RoundBox按钮色Color rbBtFontColor = Color.red; /RoundBox按钮文字色JDialog dialog ;JSpinner yearSpin ;JSpinner monthSpin ;JSpinner hourSpin ;JButton daysButton = new JButton67 ;DateChooser() setLayout(new BorderLayout();setBorder(new LineBorder(backGroundColor, 2);setBackground(backGroundColor);JPanel topYearAndMonth = createYearAndMonthPanal();add(topYearAndMonth,BorderLayout.NORTH);JPanel centerWeekAndDay = createWeekAndDayPanal();add(centerWeekAndDay,BorderLayout.CENTER);:日程管理小助手15private JPanel createYearAndMonthPanal()Calendar c = getCalendar() ;int currentYear =c.get(Calendar.YEAR);int currentMonth =c.get(Calendar.MONTH)+1;int currentHour =c.get(Calendar.HOUR_OF_DAY)+1;JPanel result = new JPanel();result.setLayout(new FlowLayout();result.setBackground(controlLineColor);yearSpin = new JSpinner(new SpinnerNumberModel(currentYear,currentYear,lastYear,1);yearSpin.setPreferredSize(new Dimension(48,20) ;yearSpin.setName(Year) ;yearSpin.setEditor(new JSpinner.NumberEditor(yearSpin, #) ; yearSpin.addChangeListener(this) ; result.add(yearSpin) ;JLabel yearLabel = new JLabel(年);yearLabel.setForeground(controlTextColor);result.add(yearLabel);monthSpin = new JSpinner(new SpinnerNumberModel(currentMonth,currentMonth,12,1);monthSpin.setPreferredSize(new Dimension(35,20) ;monthSpin.setName(Month) ;monthSpin.addChangeListener(this) ; result.add(monthSpin) ;JLabel monthLabel = new JLabel(月);monthLabel.setForeground(controlTextColor);result.add(monthLabel);hourSpin = new JSpinner(new SpinnerNumberModel(currentHour,currentHour,23,1);hourSpin.setPreferredSize(new Dimension(35,20) ;hourSpin.setName(Hour) ;hourSpin.addChangeListener(this) ; result.add(hourSpin) ;JLabel hourLabel = new JLabel(时);hourLabel.setForeground(controlTextColor);result.add(hourLabel);return result ; :日程管理小助手16private JPanel createWeekAndDayPanal() String colname = 日,一,二,三,四,五,六;JPanel result = new JPanel();/设置固定字体,以免调用环境改变影响界面美观result.setFont(new Font(宋体, Font.PLAIN, 12);result.setLayout(new GridLayout(7,7);result.setBackground(Color.white);JLabel cell ;for(int i=0;i7;i+) cell = new JLabel(colnamei);cell.setHorizontalAlignment(JLabel.CENTER);if (i=0 | i=6) cell.setForeground(weekendFontColor) ;else cell.setForeground(weekFontColor) ;result.add(cell) ; int actionCommandId = 0 ;for(int i = 0; i 6; i+) for(int j = 0; j 0 ) result.x -= offsetX ; if (offsetY 0 ) result.y -= offsetY ; return result ;private Calendar getCalendar() Calendar result = Calendar.getInstance();result.setTime(getDate() ;return result ; private int getSelectedYear() return (Integer)yearSpin.getValue().intValue() ; private int getSelectedMonth() return (Integer)monthSpin.getValue().intValue() ; private int getSelectedHour() return (Integer)hourSpin.getValue().intValue() ; :日程管理小助手18private void dayColorUpdate(boolean isOldDay) Calendar c = getCalendar() ;int day = c.get(Calendar.DAY_OF_MONTH);c.set(Calendar.DAY_OF_MONTH,1);int actionCommandId =day-2+c.get(Calendar.DAY_OF_WEEK) ;int i = actionCommandId/7;int j = actionCommandId%7;if (isOldDay) daysButtonij.setForeground(dateFontColor) ;else daysButtonij.setForeground(todayBackColor) ;private void flushWeekAndDay() Calendar c = getCalendar() ;c.set(Calendar.DAY_OF_MONTH,1);int maxDayNo = c.getActualMaximum(Calendar.DAY_OF_MONTH);int dayNo = 2 - c.get(Calendar.DAY_OF_WEEK) ;for(int i = 0; i 6; i+) for(int j = 0; j =1 & dayNo=maxDayNo ) s = String.valueOf(dayNo) ;daysButtonij.setText(s) ;dayNo + ; dayColorUpdate(false) ; public void stateChanged(ChangeEvent e) JSpinner source =(JSpinner)e.getSource() ;Calendar c = getCalendar() ;if (source.getName().equals(Hour) c.set(Calendar.HOUR_OF_DAY, getSelectedHour();setDate(c.getTime();return ;dayColorUpdate(true) ;if (source.getName().equals(Year) c.set(Calendar.YEAR, getSelectedYear();else / (source.getName().equals(Month) c.set(Calendar.MONTH, getSelectedMonth()-1);setDate(c.getTime();:日程管理小助手19flushWeekAndDay() ;public void actionPerformed(ActionEvent e) JButton source =(JButton)e.getSource() ;if (source.getText().length()=0) return ;dayColorUpdate(true) ;source.setForeground(todayBackColor) ;int newDay = Integer.parseInt(source.getText();Calendar c = getCalendar() ;c.set(Calendar.DAY_OF_MONTH,newDay);setDate(c.getTime(); :日程管理小助手20第 4 章 结束语整体来说,本次课题还有许多不完善的地方。在此期间,我们对上学年所学知识进行了复习,归纳、总结,更提高了对编程思想的理解层次。在一点一点实践的同时,我们也了解了软件开发的一个完整的过程以及在各个阶段应完成的任务和与同伴合作的重要性。实践是检验真理的唯一标准,通过实践我们学会了通过自己动手所遇到的各种问题,实践环节让我们学到了课本上所学不到理解不了的知识与经验。在以后的开发软件过程中,我们也会更加注重与同学的合作分工,以及各个阶段工作的配合与协调。当然,三周的时间里我们虽然做出了一点点成绩,但是距离我们理想中的成果还是有很大的差距的,没有完成不同客户的事件提醒以及客户的加密事件提醒,而且没有对提醒方式进行人性化的选择。我觉得,日程管理必须做到,联网存储,而且通过手机短信或者其他人性化的方式来进行。当然,在课题进行中我们也遇到了各种各样的问题。在这里,我要感谢在我那段一筹莫展时候给予我帮助的同学以及李勇军指导老师,谢谢你们的帮助!还有必要的对自己的所有工作进行总结与反思。
展开阅读全文