




已阅读5页,还剩62页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
工资管理系统1 需求分析1.1 课题设计目的使用面向对象语言java设计一个员工工资管理程序,有显示、储存、显示、修改和删除功能。每个员工有员工工号、姓名、基础工资、职务工资、奖金和工资总额。其中员工工号不需要用户输入,存储时,数据库系统按顺序自动递增。1.2 功能要求(1) 查询功能中,用户查询时可以选择按工号查询,也可以选择姓名进行查询,也可以选择查询工资总额在某个范围内的员工的工资信息,比如查询工资总额在10002000的全体员工的信息,还以查询全体员工工资,并且选择按某种方式排序。(2)修改功能中,用户可以选择修改方式,比如修改某一行,即选择修改某个员工的工资,此时需要输入修改项,即基础工资、职务工资和奖金中的一项,因为工资总额是基础工资、职务工资和奖金的综合,故不能直接修改,同时还需要输入工号,为了避免误改,所以需要确认修改后才能修改;也可以选择修改某一列,即选择修改全体员工的某一项工资,所以还需要选择修改项,其中的修改项也只有基础工资、职务工资和奖金三项。(3)储存功能即增加用户的功能中,用户不需要输入员工工号,但必须输入员工姓名,其他几项均可以不输入,基础工资、职务工资、奖金和工资总额均被系统初始化为零。(4)删除功能中,必须慎重操作,删除时必须输入员工工号,先查询出来,把员工的各项信息显示在下方的文本框中,在用户点击确认删除时系统就将该工号的用户的各项信息从数据库中删除。在此说明一点,由于工资总额是员工基础工资、职务工资和奖金的综合。基础工资、职务工资和奖金中的任意一项改变都会影响工资总额的数值,当修改频繁是,将会大大增加数据库系统的负担,且设计起来更加繁琐,所以工资总额并没有真正的储存在数据库中, 每一次的查询或者其他显示工资总额的地方全都是用SQL或者HQL的函数查询语句来实现的。1.3 设计流程设计流程采用先界面后模型外层全局界面设计界面设计:删除模块各组件事件处理修改模块各组建事件处理储存模块各组件事件处理查询模块各组件事件处理擅长模块设计修改模块设计查询模块设计储存模块设计各组件事件处理功能实现设计:外层全局界面各组件事件处理设计数据库及表的设计Hibernate实现查询功能Hibernate实现储存功能Hibernat和jdbc实现修改功能Hibernate删除功能图11.4 工资表模式根据上述目的和各项功能要求,选择如表1的数据库表来储存员工各项工资信息其中的Id号即为员工工号。表1ID姓名基础工资职务工资奖金3张三5000200030001.5 开发环境JDK1.6Myeclipse6.5Mysql5.22Hibernate annotation3.4测试工具:junit4.7注明:(1)在详细设计中的代码均为局部的关键代码,完整代码均在附录里;(2)数据库里的信息只为了测试,与其含义没有关系;(3)所有模块的模样图中,圆角框表示容器,直角框表示组件。2 详细设计2.1 外层模块设计2.1.1 外层模块模样根据个人设计思路,设计的外侧模块的模样如图2外层模块Myplet系统名称:工资管理系统子容器Panel3子容器Panel2子容器Panel1 删除按钮修改按钮储存按钮查询按钮以卡片布局放置查询、储存、修改、删除模块,默认显示查询模块图2外侧模块设计,首先新建一个叫MyApplet的类,并继承java下applet包中的Applet类,在这里,也可以自己定义一个自己的框架的类,去继承Frame类,但是简单起见,我就定义了自己的框架的类,并继承了Applet类,这样有些Applet已经实现的功能就不需要我自己去实现了,比如当你点击这个类运行而得的窗口的右上角的“X”时,窗口就关闭了,如果没有继承Applet类,那么这些功能将由自己实现,查看java的那套api会发现里面有个一属性常量,给定义的窗口设置该属性就可以解决。参考印旻主编的java与面向对象程序设计教程第八章的布局设计可知:FlowLayout的布局方式虽然非常简单,但是这种布局的容器会将容器的里的组件按照加入的顺序一个个从左往右,从上往下的排列。这样的布局显然不合适,也不美观。而BorderLayout则将整个容器分为东、西、南、北、中,这样的布局比较死,限制了设计者自己定义布局的功能。GridLayout的布局形式,虽然给了设计者自己定义布局的一部分功能,但是还是存在很大一部分的限制,还有CardLayout(卡片布局设计)和GridBagLayout,卡片布局设计显然是可以采用的,但是不能只用卡片布局设计,因为只用它显得单一,而且功能不全。剩下的GridBagLayout的布局设计是很适合我想象的布局的,因为这种布局设计给了设计者很大的自定义空间,并且各个行或者列的大小都可以由设计者自己指定,也不要求容器中的组件按个空格地放。经过上述外层模块布局设计的分析,最适合外层模块布局设计的方式就是GridBagLayout。GridBagLayout布局设计方式的使用步骤如下:(1) 创建GridBagLayout的对象;(2) 将容器的布局设置成这个对象;(3) 创建GridBagConstraints对象,并指定其各项属性;(4) 设置GridBagConstraints对象和组件的关联;(5) 将组件加入容器中。为了使窗口中的标签和文本框等东西的大小可以随窗口的变大而变大,或者缩小而缩小,所以在外层容器里面的组件不是直接加入外层容器的,本质是在外层容器中加入子容器,然后在子容器中加入组件。 外层容器的对子容器放置的布局是GridBagLayout布局设计,而子容器中又使用简单布局设计。所以整体上是使用混合布局设计,这样可以实现更多的界面设计样式。2.1.2 外层模块代码解析(1)MyApplet类继承Applet,所以本身就是一个容器,不需要自己再去创建外层容器了,就把this(本容器)当成外层容器就可以了。对本容器采用GridBagLayout的布局设计,按照上述的步骤:创建GridBagLayout布局对象,即GridBagLayout gbLayout = new GridBagLayout();设置本容器为该布局对象,即 this.setLayout(gbLayout);(2)创建一个大小为3的Panel数组p,并实例化三个Panel。(3)创建一个显示系统名称的L abel类型的tittle,设置其中字体的大小和颜色,并将Label加入到Panel0中的语句分别是:Label tittle = new Label(工资管理系统);tittle.setFont(new Font(Serif,50,50); tittle.setBackground(Color.GREEN); p0.add(tittle);并且对Panel0采用Gridlayout的布局设计,由于只需添加标题这样一个组件就可以了,所以设置为一行一列:p0 = new Panel(new GridLayout(1,1)。 并用GridBagLayout的布局设计将Panel1加入到容器MyApplet中,具体实现代码如下:gbc.gridwidth = GridBagConstraints.BOTH;/占据横向剩余空间gbc.weightx = 1;/横向可扩展gbc.gridwidth = GridBagConstraints.REMAINDER;gbLayout.setConstraints(p0, gbc);/将gridbagconstraints对象与组建相联系add(p0);(4)用GridLayout的布局设计分别将查询按钮、储存按钮、修改按钮和删除按钮加入Panel1中,然后用GridBagLayout的布局设计将Panel1加入MyApplet中。具体过程是定义各一个四个元素的Button类型的数组,并实例化其中每个元素。参数分别为“查询”、“储存”、“修改”和“删除”。并依次将该数组的每个按钮加入到Panel1中。其实现代码如下: Button b = new Button4;b0 = new Button(查询);b0.addActionListener(this);/注册监听b1 = new Button(储存);b1.addActionListener(this);b2 = new Button(修改);b2.addActionListener(this);b3 = new Button(删除);b3.addActionListener(this);p1 = new Panel(new GridLayout(1,4);for(int i=0;i4;i+)p1.add(bi);p1.add(new Label( );/将按钮分开gbc.insets = new Insets(20,4,4,4);gbLayout.setConstraints(p1, gbc);add(p1);(5) 初始化的Panel数组的第三个元素p3采用卡片的布局设计,卡片设计的显示形式是让要显示的东西像扑克一样叠起来,每次都只能显示最表面的一张,其他的都在下方,不显示。目的是使得查询模块、储存模块、修改模块和删除模块以卡片的形式显示在四个选择功能的按钮下方。让页面看起来简洁、清晰、明朗。CardLayout的使用步骤:(1) 创建一个CardLayout对象作为布局编辑器: Mycard = new CardLayout();(2) 将容器p3设置为Mycard 的布局:p3.setLayout(Mycard);(3) 将p3加入MyApplet中;(4) 设置中各组件的显示方式。本设计中,p3中各组件的显示方式只有设置为按名显示最为适合,窗口的显示如图3,创建到显示的实现代码如下: QueryPanel qp = new QueryPanel();/查询模块 addPanel ap =new addPanel();/增加用户模块 updatePanel up = new updatePanel();/修改模块 deletePanel dp = new deletePanel();/删除模块p2 = new Panel(myCard);p2.setLayout(myCard);p2.add(qp,查询);p2.add(ap,储存);p2.add(up,修改);p2.add(dp,删除);gbc.insets = new Insets(20,4,4,4);gbLayout.setConstraints(p2, gbc);add(p2);/事件处理:当用户点击四大功能按钮时,下方显示对应的功能的子模块public void actionPerformed(ActionEvent e) myCard.show(p2, e.getActionCommand();图32.1.3 外层模块事件处理(1)分别将查询按钮、储存按钮、修改按钮和删除按钮注册给监听器,并在类头的继承类后面加上implements ActionListener实现接口ActionListener之后,重写接口里定义的抽象方法public void actionPerformed(ActionEvent e);在该方法里设计按名显示功能模块的程序,即public void actionPerformed(ActionEvent e) myCard.show(p2, e.getActionCommand();2.2 查询模块设计2.2.1 查询模块模样查询模块的模样如图4所示。查询模块的设计查询按钮排序方式排列依据查询范围查询方式Panel select:Panel id:Panel name:显示查询结果:按工号查询输入框标签(输入ID)按姓名查询输入框标签(输入姓名)显示结果的文本框图4查询模块的设计,新建一个叫QueryPanel的java类,这各类也继承了Applet类,所以本身就是一个容器。并对本容器设置GridBagLayout的布局设计,从上往下,加入三个子容器。第一个叫select,用来装载查询方式下拉框、查询范围下拉框、排列下拉框、排序下拉框和查询按钮;第二个容器id,作用是当用用户在select容器中的查询方式选择为“按工号查询”时,光标跳转到id容器的id输入框,之后,当用户点击“按工号查询”按钮时,结果显示文本框中显示用户输入的id号即工号的员工的工资信息;第二个容器叫name,作用是当用户点击按姓名查询的时候,光标跳转到提示输入姓名的标签的后面的输入框中,同第二个一样,当用户点击“按姓名查询”按钮后,所输入姓名的员工的工作信息会显示在下方的文本里;最下方的就用文本框了,作用上述已经说明了。缺省情况下,即用户什么都没有选择的情况下,直接点击“查询”按钮后,将显示全体员工的工资信息。查询方式下拉框中有按工号、按姓名和默认全部的选项;查询范围的下拉框中有各个阶段范围的对应选择,默认是范围不限;排列下拉框中有按基础工资、职务工资、奖金、工资总额和默认是工号的选项;排序下拉框中就升序和降序两种选择,默认是升序排序。这些下拉框的中的每一个选项都是任由用户选择的,但是选择的项不能相互矛盾,比如选择了按工号查询,就不能在输入姓名的输入框中输入信息。这些跳转控制,在事件处理中有详细的设计。布局设计的代码和外层模块设计的完全一样,不再重复,代码中有注明,下拉框是用一个Choice类型的数组来表示的,窗口显示如图5。实现下拉框的代码如下:Choice c = new Choice5;/下拉框数组for(int i=0;i20000);c1.add(默认全部);c2.add(排列);c2.add(按工资总额);c2.add(按基础工资);c2.add(按职务工资);c2.add(按奖金);c2.add(默认按工号);c3.add(排序);c3.add(升序);c3.add(降序);c3.add(默认升序);图52.2.2 查询模块事件处理该模块中共有四个下拉框,一个工号输入框,一个姓名输入文本框和一个现实文本框,第一个个查询方式下拉框。(1)当用户选择的是查询方式或者默认全部时,系统将查询的对象定位整个员工工作表;第二个是供用户可以选择查询的范围的下拉框,这里的范围是指工资总额在所在的范围,比如用户选择800010000则表示用户选择了工资总额在800010000的员工,上下限选择均包括端点值;第三个是排列下拉框,表示用户选择按什么什么数值排列,结合第四个排序下拉框的意思就是用户选择按什么的数值以什么的顺序排列;这四个下拉框均有默认值,用户不显示的做任何选择,当用户直接点击查询按钮时,系统将查询全部员工则工资信息,按工号的升序排列打印在显示文本框。(2)当用在查询方式下拉框中选择按工号查询时,系统自动跳转到工号输入框,提示用户输入员工工号,然后点击按工号查询按钮,系统查询用户所输入的工号的工资信息,并打印到显示文本框。关键代码如下:if(c0.getSelectedIndex()=0|c0.getSelectedIndex()=3)/选择查询方式c1.requestFocus();else if(c0.getSelectedIndex()=1)inputId.requestFocus();inputId.setText(转到这里);inputName.setText();(3)当用户在查询方式下拉框中选择按姓名查询时,系统将自动跳转到姓名输入框,提示用户输入姓名。else if(c0.getSelectedIndex()=2)inputName.requestFocus();inputName.setText(转到这里);inputId.setText();2.3 储存模块设计2.3.1 储存模块模样储存模块的模样如图6所示。储存模块的设计姓名基础工资职务工资输入信息奖金文本框,用来显示刚才增加的用户的信息对应的输入框:提示性标签:按钮按钮图6储存模块的设计,新建一个叫AddPanel的java类,继承了Applet类,采用的布局设计和查询模块的完全一样,不再赘述。在储存子容器中添加去的是三个Panel。第一个是用来显示提示性标签的,即显示姓名、基础工资、职务工资、奖金、输入对应信息,其作用是提示用户根据提示,在对应的输入框中输入合法的信息;第二个Panel就是在第一个提示标签的下方添加相对应的输入框,以便用户对应输入信息,这个Panel的右端添加了两个按钮,前一个是“增加员工”,是往数据库存数据的事件源,第二个按钮是“清空”,用来清空全部输入框中残留的信息;第三个就是一个文本框,作用就是显示新增员工的信息。其中的提示性标签是用Label数组来实现的,并且在中间加入了空的标签,目的是是标签分开,不至于排列太紧密,影响美观,窗口显示如图7。实现代码如下:L0 = new Label(姓 名);L1 = new Label(基础工资);L2 = new Label(职务工资);L3 = new Label(奖 金);L4 = new Label(输入对应信息);for(int i=0;i4;i+)ti = new TextField();tPanel.add(ti);LPanel.add(Li);tPanel.add(add);tPanel.add(re);tPanel.add(new Label();LPanel.add(L4);LPanel.add(new Label();LPanel.add(new Label();2.3.2 储存模事件处理本模块共有四个输入文本框,一个增加员工按钮,一个清空按钮和一个显示文本框。当用用户点击增加员工按钮时,系统将读取四个输入文本框中的内容,在姓名不为空,三项金额为整数的情况下,系统将员工信息存入数据库,并在下方的显示文本框中打印刚增加的员工的工号、姓名和工资信息。当用户点击清空按钮时,系统将四个输入文本框中的残留信息全部清空。其中的flag不只是在这两个地方处理,在讨论异常的时候会详细介绍。操作实例如图7所示。这段内容的关键代码如下:boolean flag;if(e.getSource()=re)for(int i=0;i=0 & newValue=0)/选择的是修改行y_n = new Dialog(this.y_n,确定修改?,true);/实例化一个对话框Panel p1 = new Panel();Y = new Button(yes);Y.addActionListener(this);N = new Button(no);N.addActionListener(this);p1.add(new Label(确认请按“yes”,撤销请按“no”);p1.add(Y);p1.add(N);y_n.add(Center,p1);y_n.pack();y_n.setVisible(true);else if(or=2 & !colum.equals(xx)& newValue=0)y_n = new Dialog(this.y_n,确定修改?,true);Panel p1 = new Panel();Y = new Button(yes);Y.addActionListener(this);N = new Button(no);N.addActionListener(this);p1.add(new Label(确认请按“yes”,撤销请按“no”);p1.add(Y);p1.add(N);y_n.add(Center,p1);y_n.pack();y_n.setVisible(true);elsey_n = new Dialog(this.y_n,信息不全,true);Panel p1 = new Panel();Y = new Button(yes);Y.addActionListener(this);p1.add(new Label(您选择的条件有误,请重新选填;按“yes”继续补全);p1.add(Y);y_n.add(Center,p1);y_n.pack();y_n.setVisible(true);if(e.getSource()=Y& or=1 & !colum.equals(xx) & num=0 & newValue=0)/选择修改行y_n.dispose();HibernateOperate q = new HibernateOperate();q.testUpdateByRow(colum, num, newValue); success = new Dialog(this.success,修改成功 ,true); Panel p2 = new Panel(); p2.add(new Label(修改成功!); confirm = new Button(确认); confirm.addActionListener(this); p2.add(confirm); success.add(p2); success.pack(); success.setVisible(true);else if(e.getSource()=Y & or=2 & !colum.equals(xx)& newValue=0)/确认修改列y_n.dispose();HibernateOperate q = new HibernateOperate();row = q.testUpdateByColum(colum, newValue);if(row0) success = new Dialog(this.success,修改成功 ,true); Panel p2 = new Panel(); p2.add(new Label(修改成功!); confirm = new Button(确认); confirm.addActionListener(this); p2.add(confirm); success.add(p2); success.pack(); success.setVisible(true);else if(e.getActionCommand()=no)y_n.dispose(); success = new Dialog(this.success,修改失败 ,true); Panel p2 = new Panel(); p2.add(new Label(修改失败!); confirm = new Button(确认); confirm.addActionListener(this); p2.add(confirm); success.add(p2); success.pack(); success.setVisible(true); elsey_n.dispose();if(e.getActionCommand()=确认)success.dispose();2.5 删除模块设计2.5.1 删除模块模样删除模块模样如图10所示。删除模块设计:删除按钮输入框输入提示(工号)显示用户信息文本框,用来显示将要删除的用户信息:图10删除模块的设计,新建一个叫DeletePanel的java类,布局设计同上。删除容器中加入了一个子容器select,Panel select中加入了提示输入工号的标签、工输入框、空标签和删除按钮;下方是一个和select平级的文本框,用来显示用户删除的员工的信息。功能和实现都非常简单,没有超出前面设计的范围,故简略说明,窗口显示如图11所示。图112.5.2删除模块事件处理该模块几个模块中事件处理最简单的一个模块,其中需要说明的就是删除操作只能按工号删除。当用户输入工号后,点击删除按钮是并未进行删除操作,系统将准备删除的员工信息打印在下方的显示文本框中,当用户点击确认对话框中的确认时,系统才进行员工信息删除。操作实例如图12,关键代码如下:if(e.getActionCommand()=删除)try int a = Integer.parseInt(input.getText();HibernateOperate q = new HibernateOperate();q.testQueryById(a,result); catch (NumberFormatException e1) result.setText(请输入合法的整数!);y_n = new Dialog(this.y_n,确定删除?,true);Panel p1 = new Panel();Y = new Button(yes);Y.addActionListener(this);N = new Button(no);N.addActionListener(this);p1.add(new Label(确认请按“yes”,撤销请按“no”);p1.add(Y);p1.add(N);y_n.add(Center,p1);y_n.pack();y_n.setVisible(true);if(e.getSource()=Y)y_n.dispose();id = Integer.parseInt(input.getText();HibernateOperate q = new HibernateOperate();if(q.testDeleteById(id) success = new Dialog(this.success,删除成功 ,true); Panel p2 = new Panel(); p2.add(new Label(删除成功!); confirm = new Button(确认); confirm.addActionListener(this); p2.add(confirm); success.add(p2); success.pack(); success.setVisible(true); else success = new Dialog(this.success,删除失败 ,true); Panel p2 = new Panel(); p2.add(new Label(该用户不存在,删除失败!); confirm = new Button(确认); confirm.addActionListener(this); p2.add(confirm); success.add(p2); success.pack(); success.setVisible(true); else if(e.getActionCommand()=no)y_n.dispose();System.out.println( 删除失败!); success = new Dialog(this.success,删除失败 ,true); Panel p2 = new Panel(); p2.add(new Label(删除失败!); confirm = new Button(确认); confirm.addActionListener(this); p2.add(confirm); success.add(p2); success.pack(); success.setVisible(true); if(e.getActionCommand()=确认)success.dispose();图123 Hibernate重要配置根据本课题内容要求可知,该课题对数据库表格的要求并不复杂,仅用一张表即可,并且能使数据的冗余度非常小,所以就一个数据库,一张表即可满足本课程设计的要求。(1)建立数据库。在mysql命令行执行语句create database coursedesign;后,建数据库的工作将就完成了。(2)引入相关jar包,将下载好的hibernate、Junit、日志文件和mysql驱动类import到该课题的工程中,具体引入的jar包如下:(3)建立实体类。新建一个叫User的java类。加上hibernate的实体类的注解,并写好员工的属性。代码如下:Entitypublic class User private int id;private String name;private int basicWage;private int postWage;private int bonus;写好各个属性的get和set方法,特殊一点是在主键id的get方法前加上注解Id和GeneratedValue,前者表示该属性是主键,后者表示该属性的数值自增类型,具体如下:IdGeneratedValuepublic int getId() return id;此外,添加一个get方法,并注解为Transient,表示不存入数据库的,改方法的功能是用来获取工资总额,具体如下:Transient/不存入数据库,只是为了方便查询public int getAllWage() return this.getBasicWage()+this.getPostWage()+this.getBonus();还有,必须重写实体类的toString方法如下:public String toString()return ID: +getId()+ 姓名:+getName()+ 基础工资:+getBasicWage()+ 职务工资:+getPostWage()+ 奖金:+bonus+ 工资总额: +getAllWage()+nn;(4)配置好hibernate的配置文件。去自己下载的hibernate-distribution-3.3.2.GAdocumentationmanualzh-CNhtml_single中参考,把配置文件copy过来,按自己的需要配置上。直观起见,直接在配置文件中注释了,每个语句都有注释,即这里打算的写的解释。代码如下: com.mysql.jdbc.Driver jdbc:mysql:/localhost/coursedesign root root org.hibernate.dialect.MySQLDialect 1 thread org.hibernate.cache.NoCacheProvider true true update (5)配置日志文件,将日志文件按perties也配置好。其作用是显示hibernate执行过程中的详细情况,非常有必要步骤,对于查错,测试修改非常重要的。直接去hibernate附带的例子里copy就行。并将里面如下行的注释解开:log4j.appender.stdout=org.apache.log4j.Conso
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 领导谢辞致词模板
- 2025年安全员岗前考核模拟题含解析
- 2025年人力资源管理师职业能力测评试卷及答案解析
- 2025年协管员岗位面试模拟题及答案
- 2025年烹饪厨艺技能考试试题及答案解析
- 2025年考古发掘工程师专业水平评定试题及答案解析
- 2025年健身教练专业知识考核试题及答案解析
- 2025年交易所招聘考试模拟题
- 2025年建材产品推广经理职业技能考核试题及答案解析
- 2025年基建维修面试技巧与模拟题
- 土地使用权法律风险尽职调查指南
- 2025年内容分发网络(CDN)行业当前市场规模及未来五到十年发展趋势报告
- 故宫博物馆院课件
- 2025年8月16日贵州省黔东南州事业单位遴选笔试真题及答案解析(专业水平测试)
- 2025-2026秋季学年第一学期学生国旗下演讲稿(20周):第一周 新程启航礼润心田-开学典礼
- 2025年教师招聘小学语文真题及答案
- 2025年突发疾病应急演练方案(脚本)
- 幼儿园保安人员培训记录
- 2025年北京市中考语文真题(含答案)
- 2025年运城社区专职工作人员招聘真题
- 设备晨会管理办法
评论
0/150
提交评论