已阅读5页,还剩34页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
4.1.在多个连接上共享数据当我第一次遇到远程共享对象时,我想,至发明浏览器以来,它已成为互联网的最重要的贡献。多年来看法几乎没有变化,特别是任何应用程序,在一个“live”的情况需要传送数据与其它结合的时候。因此,什么是共享对?它们是什么用来做什么的呢?共享对象是可以显示和在一个浏览器上控制的, 和在另一个上可以看到。因此,如果你有一个应用程序使用文字输入栏来显示文本,您可以显示该文本在您自己的浏览器,以及在所有其他人的浏览器上都可以在相 同的应用程序上看到。除了文字,你可以在一个屏幕上移动影片剪辑,它们也会在其他屏幕上移动。您可以点击一个在浏览器上的按惯,来开启一个在所有的浏览器 使用共享对象的事件。当一个共享对象是设立在一个FMS3的应用程序,它建立了一个“subscription”,其它 人如果运行了相同的应用程序的话会自动订阅它。把共享对象想像为杂志,大家从该杂志获得订阅。 “杂志”以实时数据的形式发布。因此,如果您正在发送一个文本字段中的文本的话,一旦您输入数据,在远程计算机上就可以看到了。4.1.1.持久和非持久共享对像非持久共享对象是可以想像成变量。当您退出一个应用程序,所有变量中的值会消失。他们不会继续存在。同样地,一旦用户离开应用程序,一个在非持久共享对象中的数据会丢失。持久的共享对象是更像是数据库中的数据。持久共享对象的数据是存储在服务器的硬盘上,因此,持 久。当您需要从不同的地方来访问你的数据,持久共享对象是非常的方便。不过,这章只涉及非持久共享对象。在第八章,会讨论更多高级的共享对象的概念,以及 研究服务器端和持久共享对象。4.1.2.利用非持久远程共享对像而任何非持久远程共享对象将远远低于其可能的用途,以下列出你可以使用的想法: 远程控制幻灯片放映 文字聊天 网络对战 DJ应用程序,远程选择和播放歌曲 A doorbell.门铃? 现场拍卖 客户服务应用程序记住这些应用程序,让我们看看如何使用FMS3 创建和使用共享对象。 4.2.实例化远程共享对像这一章将以最少的代码来展示三种不同的远程共享对象。首先是一个指示器,可以在其 它人的网页里,把它指向任何位置。这种指针可以派上用场,如果您对一个偏远的位置做出展示,你必须给观众指示不同的事情。第二,您会看到如何使最低限度的 代码来制作文本聊天,一个输入文本框中输入的文本,会在所有用户的屏幕上显示出来。第三,使用一个共享影片剪辑,您会看到如何在远程观众的屏幕上打开一个 web页面。这些都是微不足道的例子,但他们显示出你可以使用远程共享对象来做不同的事情。其余的就要看你的想象力了。当声音一个变量时,你可以声明它的类型:private var so:SharedObject;通用实例化一个共享对像的格式,如图4-1:图4-1. Instantiating SharedObject class getRemote(name:String, remotePath:String = null, persistence:Object = false, secure:Boolean = false):SharedObject如果尚不存在共享对象,则此方法将创建一个共享对象。你可以使用getLocal()方法建立一个本地共享对像。本书中没有使用本地共享对像的例子。name:String 对象的名称。 该名称可以包含正斜杠 (/);例如,work/addresses 是合法名称。 共享对象名称中不允许使用空格,也不允许使用以下字符: % & ; : ” , ? ? #remotePath:String (default = null) 将存储共享对象的服务器的 URI。 此 URI 必须与传递给 SharedObject.connect() 方法的 NetConnection 对象的 URI 相同。persistence:Object (default = false) 指定共享对象的数据属性的特性是本地永久储存还是远程永久储存,或者是同时进行本地永久储存和远程永久储存。此参数还可指定共享对象的本地存储位置。 可接受的值包括:false,指定客户端或服务器上的共享对象不是永久性的。true,指定只有服务器上的共享对象是永久性的。共享对象的完整路径或部分路径,指定客户端和服务器上的共享对象都是永久性的。 客户端的共享对象存储在指定路径中,而服务器中的共享对象则存储在应用程序目录中的子目录内。4.2.1.设立共享对象存储:插槽当你设置了一个共享对像实例,你需要基于共享对像的属性上设置一个存储系 统。不同于早期版本的Flash Communication Server和Flash Media Server,Flash Media Server 3使用SharedObject.setProperty()方法来赋值到一个共享对象的属性。在分配不同的共享对象属性,您可以使用各种数据类型来创建 插槽。以下显示一个简单的属性插槽:var memberName:String= name_txt.text;so.setProperty(”cliName”, memberName);共享对象有一个data属性:cliname 。所以现在有一个字符名称存储槽,可与连接到相同应用程序的其他人共享。同样地,作为您的应用需求,您可以设定许多插槽,使用适当的数据类型作为存储的数 据。每当共享对象的属性发生变化,会触发一个SyncEvent,要使用一个事件处理程序,来为所有连接到同一个共享对像上的连接更新资料,。4.2.2. Inspecting a Shared Object检查一个共享对像为了更好地了解一个共享对象是怎么回事,看看它的内容。它应该会出现类似的内容,一个数组 或任何对象,已超过一个单一的元素。添加一个文件夹到您的服务器端,文件夹命名为basicso ; 在这一章中,此文件夹将被用于所有的例子。在下面的例子中,几个不同类型的数据都被添加到插槽。属性包括字面以及变量,以说明可以放进共享对象数据的范 围。. SyncEvent类当您使用远程共享的对象被其他客户使用,一个重要的类就是SyncEvent 。顾名思义,这个事件使用在同步事件中,在您的浏览器上和那些在其他浏览器上使用相同的远程共享对象。通过使用SYNC常数,一旦客户端连接到一个远程共 享对象,一个同步事件发生。每当一个客户端改变了一个共享对象的data属性,会调用一个同步事件。但是,由于各种不同的动作关联到共享对象产生的事件, 您需要一种方法,以确定事件的种类。.changeList属性在ActionScript 3.0的,其中一个关键的属性,在成功地处理共享对像有关动作所产生的事件,是SyncEvent.changeList属性。该changeList属 性是一个存储共享对象属性的数组。changeList属性的一个关键属性code:指示什么类型的事件发生。当第一次连接到一个共享对象,code会生 成一个code值“clear” 。此code值可以用来帮助,跟踪连接到同一个共享对象的用户的数量。当一个远程用户的改变了共享对象的值,会产生两个code事件。 一个“success”值表示客户成功改变值。一个“change”值表明别人改变了共享对象。因此,当客户端改变了,他会接收到”success”代 码,以及其他任何连接到同一个共享对象的客户端都会接收到 “success”代码值。对于第一个例子,无论是“clear”和“success”状态,都直接用来创造插槽,并指派值给共享对像,然后用来显示这些 插槽的内容。为了看看所有这些是怎么工作的,你可以在下面一个应用程序中trace()出来看看: 在BasicSO构造函数中添加一个NetConnection。它会产生一个NetStatusEvent事件 在doSO函数中建立一个共享对像,把共享对像连接到NetConnection实例,产生一个sync事件 在seeSo函数中,使用SyncEvent确定事件的类型。它使用在changelist属性数组的零元素。一发现“clear”,表示您已成功连接到共享对象,并调用函数来设置共享对象属性。如果它发现“success” 表示客户端更改了共享对象这个应用程序的目的是:帮助你了解关于共享对像是怎么工作的一些东西,但由于设计,它着重于处理的步骤和如何改变共享对像中的值。暂时这并不共享任何远端。以下步骤显示了如何设置它:1 建立一个BasicSO.fla2 在文档类中输入BasicSO3 建立一个BasicSO.as文件4 在BasicSO.as文件中输入以下代码:Example 4-1. BasicSO.asCode View:packageimport flash.display.Sprite;import .SharedObject;import flash.events.NetStatusEvent;import flash.events.SyncEvent;import .NetConnection;/import .ObjectEncoding;public class BasicSO extends Spriteprivate var test_so:SharedObject;private var nc:NetConnection;private var monthDay:Date;private var good:Boolean;public function BasicSO ()/NetConnection.defaultObjectEncoding=.ObjectEncoding.AMF0;/Connectvar rtmpNow:String=”rtmp:/1/basicSO”;nc=new NetConnection;nc.connect (rtmpNow);nc.addEventListener (NetStatusEvent.NET_STATUS,doSO);private function doSO (e:NetStatusEvent):voidgood=.code = “NetConnection.Connect.Success”;if (good)/Set up shared objecttest_so=SharedObject.getRemote(”test”,nc.uri,false);monthDay=new Date;test_so.connect (nc);test_so.addEventListener (SyncEvent.SYNC,seeSO);private function seeSO (se:SyncEvent):voidtrace (se.changeList0.code);switch (se.changeList0.code)case “clear” :loadSO ();break;case “success” :showSO ();break;private function loadSO ():voidtest_so.setProperty (”city”,”Katmandu”);test_so.setProperty (”dayOfMonth”,monthDay.getDate();test_so.setProperty (”verity”,true);test_so.setProperty (”bunch”,250);private function showSO ():voidtrace (test_so.data.city);trace (test_so.data.dayOfMonth);trace (test_so.data.verity);trace (test_so.data.bunch);5 测试影片运行例子后,在输出窗口中会显示:clearsuccessKatmandu15true250你可以看到,共享对象在ActionScript中具有基本数据类型与其他变量与属性一样,像其它对像和变量一样可以提取。4.2.3.同步的共享对像每当任何共享对象的属性,或 “插槽”改变,这种改变一定会广播给所有这些连接。处理这一事件的程序是SyncEvent.SYNC ,回调。每一次任何数据属性的变化,一个改变事件会触发SyncEvent.SYNC,用这种方式回调,在所有的连接中,所有改变的属性会被更新。一般 格式是如下:share_so.addEventListener (SyncEvent.SYNC,syncSO);.private function syncSO(event: SyncEvent)/用so.data的属性的值来更新变量variable1= my_so.data.attribute1;variable2= my_so.data.attribute2;variable3= my_so.data.attribute3;这种变化的过程中相当简单。在脚本中的某处,某个用户改变了在共享对像data属性中的一个插槽。一旦属性被改变,触发SyncEvent.SYNC ,回调;和在此情况下,SyncEvent.SYNC ,回调容器中的代码,更新改变遍及应用程序中的连接。为在整个过程中正常运作,你需要连接共享对象和服务器, SharedObject. Connect(NetConnection)。为了能够与远程共享对象工作的有意义,您将需要一条线连接共享对象,例如,以FMS3使用 NetConnection实例作为一个参数。例如:billz_so.connect(nc);作出必要的连接共享对象,例如billz_so发送和接收共享对象的变化,使用 Netconnection实例nc。这本章中的所有例子,注意力在SharedObject.connect(NetConnection)语句,和以 往一样都不要忘记把它包含在您的应用程序中。(当您调试您的代码,通常你会发现,共享对象连接已经离开了,没有它,您的共享对象,将不能正确运行)。4.3.简单例子:共享影片看看共享对象如何与远程网页工作,这简单的项目使用一个影片剪辑作为一个共享对象。这个例子说明如何设置并在Stage(你的舞台和所有连接到相同 共享对像的)范围内移动影片。在创建在线幻灯片放映应用程序的工作中,像是与PowerPoint简报,你需要的所有观众看到指示器移动到屏幕上的位置, 如果你不想让他们关注的焦点。使用一个岛屿影片剪辑,作为一个指示器,这个应用程序有4个岛的名字在舞台的四个角落。四个名字,只是简单地放置在舞台,当 你在屏幕上移动指示器,对所有连接到应用程序的屏幕上会跑到相同的位置。您将使用这些类和对象在应用程序中:ClassesNetConnectionSharedObjectNetStatusEventSyncEventMouseEventObjectsMovie Clip (1)请按照下列步骤操作,以制作该项目:1. 建立一个MinSOmc.fla2. 如图4-2中所示,在舞台的4个角落,建立一个不同的岛屿的名称3. 如图4-2中所示,用绘图工具绘制一个岛屿(或者画一个箭头指示器或者其它东西)4. 选择指示器把它转换为影片剪辑,名称为Island5. 把指示器从舞台中删除,因为我们只需要从库中调用6. 建立一个MinSOmc.as.7. 在MinSOmc.as中添加如下代码Example 4-2. MinSOmc.asCode View:package import flash.display.Sprite; import .SharedObject; import flash.events.NetStatusEvent; import flash.events.SyncEvent; import .NetConnection; import flash.events.MouseEvent; /import .ObjectEncoding; public class MinSOmc extends Sprite private var pointer_so:SharedObject; private var nc:NetConnection; private var good:Boolean; private var island:Island; public function MinSOmc() /NetConnection.defaultObjectEncoding=.ObjectEncoding.AMF0; /Connect var rtmpNow:String=rtmp:/1/basicSO; nc=new NetConnection ; nc.connect (rtmpNow); nc.addEventListener (NetStatusEvent.NET_STATUS,doSO); island=new Island ; addChild (island); island.x=200; island.y=200; island.addEventListener (MouseEvent.MOUSE_DOWN,beginDrag); island.addEventListener (MouseEvent.MOUSE_UP,endDrag); private function doSO (e:NetStatusEvent):void good=.code = NetConnection.Connect.Success; if (good) /Shared object pointer_so=SharedObject.getRemote(point,nc.uri,false); pointer_so.connect (nc); pointer_so.addEventListener (SyncEvent.SYNC,doUpdate); private function doUpdate (se:SyncEvent):void for (var cl:uint; cl se.changeList.length; cl+) trace(se.changeListcl.code); if (se.changeListcl.code = change) switch (se.changeL) case xpos : island.x=pointer_so.data.xpos; break; case ypos : island.y=pointer_so.data.ypos; break; private function beginDrag (e:MouseEvent) island.addEventListener (MouseEvent.MOUSE_MOVE,moveMc); island.startDrag (); private function endDrag (e:MouseEvent) island.stopDrag (); private function moveMc (e:MouseEvent) e.updateAfterEvent (); pointer_so.setProperty (xpos,island.x); pointer_so.setProperty (ypos,island.y); 因为这个应用程序也是使用basicSO服务端应用程序,你不需要在服务端应用程序目录中添加一个新的目录。图4-2显示了你可看到当你测试应用程序和开始在舞台四周移动共享对像影片。最初,共享对像连接触发了一个sync事件,结果是一个”clear”消息,可以在输出窗口中看到。然后,运动的影片剪辑改变了共同对象的值,因为 你是看当地的运动,同步代码显示了“success”。如果你在远程客户端移动对像,您将会看到“change” ,但因为它只是运行在测试模式中,并没有在一个远程客户端中,您将不会看到任何“change”的代码,除非你发布代码和打开一个浏览器并运行它在一个单 独的客户端中。图4-2. Movie clip shared object为了看看所有这些是怎么工作的,从moveMC函数开始:pointer_so.setProperty (xpos,island.x);pointer_so.setProperty (ypos,island.y);这两行是设置pointer_so的数据:xpos 和ypos属性的值为共享影片的位置。当发生改变,触发一个SYNC事件。移动动作发起一个SyncEvent.changeList “change”的代码在远程客户端的播放器上。(对于本地客户端就是动影片剪辑代码是“success”,而非“change”)。然后通过遍 历客户的数组,然后共享对象的属性(名为xpos和ypos ) 。遍历首先找到每个客户和指示在哪里改变,然后更新影片剪辑的位置的值。整个过程大概如下: 一个客户端移动共享对像(岛屿的影片剪辑) 在客户端的应用程序中移动更新共享对像的值 共享对像的改变对所有远程客户端发出一个同步事件:changeList代码为”change” doUpdate()函数指定共享对像属性的值为本地影片的x和y属性,从而可以移动影片剪辑注意到,在介绍这一章中,你可以用共享对象做了很多实际的事了。使用多个模块,您可以建立一个模块 (一控制模块)在其它模块页面中远程控制对像。然而,用户在其他模块中,是无法控制任何共享对象,即使他们可以看到控制模块做出的改变。同样,您就可以设 立一个应用程序:有一个发言者指向网页的不同部分,当他在介绍时。同样,在游戏,你可以做各种有趣的事情,两个或两个以上的球员控制影片剪辑移动和移动其 他远程客户端。用FMS3制作简单的聊天应用程序4.4.简单例子:共享文本已经看了一个影片剪辑的简单例子,现在来看看共享文本。本质上是一样的,而是立足的变化,共享对象的时段对运动鼠标的立场的阶段,变化的基础上打字输入的用户。替换基于共享对像移动鼠标位置的插槽的改变,这个改变是基于用户输入的文本。在这个应用程序中,用户改变共享对像属性的值(文本内容),通过输入值和点击按纽来触发一个函数。函数取得文本输入框的值和指定共享对像属性的值,这是这个例子的基本元素:ClassesNetConnectionSharedObjectNetStatusEventSyncEventMouseEventTextAreaInputTextButtonObjectsTextArea componentInputText componentButton componentFollow these steps to create the application:1. 建立一个TextSO.fla2. 打开库面板(Ctrl+L),然后从组件面板中拖一个TextArea,InputText,Button到库中3. 建立一个TextSO.as4. 在TextSO.as中输入以下代码Example 4-3. TextSo.asCode View:package import fl.controls.TextArea; import fl.controls.Button; import fl.controls.TextInput; import flash.display.Sprite; import flash.events.SyncEvent; import flash.events.NetStatusEvent; import flash.events.MouseEvent; import .SharedObject; import .NetConnection; public class TextSO extends Sprite private var button:Button; private var text_so:SharedObject; private var nc:NetConnection; private var textArea:TextArea; private var textInput:TextInput; private var rtmpGo:String; private var good:Boolean; public function TextSO () /Set up UIs textArea=new TextArea(); textArea.setSize (200,300); textArea.move (20,20); addChild (textArea); textInput=new TextInput(); textInput.move (20,330); addChild (textInput); button=new Button(); button.width=50; button.label=Send; button.move (125,330); button.addEventListener (MouseEvent.CLICK,sendMsg); addChild (button); rtmpGo = rtmp:/1/basicSO; nc = new NetConnection( ); nc.connect (rtmpGo); nc.addEventListener (NetStatusEvent.NET_STATUS,doSO); private function doSO (e:NetStatusEvent):void good=.code = NetConnection.Connect.Success; if (good) /Set up shared object text_so=SharedObject.getRemote(test,nc.uri,false); text_so.connect (nc); text_so.addEventListener (SyncEvent.SYNC,checkSO); private function checkSO (e:SyncEvent):void for (var chng:uint; chnge.changeList.length; chng+) switch (e.changeListchng.code) case clear : break; case success : trace (text_so.data.msg); break; case change : textArea.appendText (text_so.data.msg + n); break; private function sendMsg (e:MouseEvent):void text_so.setProperty (msg,textInput.text); textArea.appendText (textInput.text + n); 当你测试这个应用程序的时候,你需要同时打开两个它。即使它是一个简单地应用,它完美的功能,让你可以整天与其他人聊天。只是记住这一点,当编写这个应用程序的时候,要记住以下顺序: 改变共享对像属性的值(例如:文本内容) 由改变共享对像 msg属性数据,触发SyncEvent.SYNC 通过用户输入改变本地属性值,指定给TextArea组件 通过共享对像值改变远程属性值 当你把客户端共享对象看作一个简单的顺序,不难看出,它们是如何设立在一个脚本中。图4-3 shows what you can expect to see in your browser.Figure 4-3. Shared text脚本保持一个很好的结构,从对在远程客户端上共享对象移动影片剪辑。在后面的应用中,您同样会看到一个非常类似的代码结构。我做的一个:4.6.一个升级了的文本聊天现在你已经对共享对像怎么工作有了一具概念,下一个应用程序向你展示了怎么样制作一个漂亮的文本聊天应用程序。到了这一点,涉及到的共享对象一直很简单,这样您就可以看到基本的。不过,现在你需要重新考虑用户界面,为这一个文字聊天的应用程序。在任何应用程式,你不能认为代码简单。尤其使用Flash Media Server 3 。你应该考虑交互作用和由两个或更多的人的动作。您想要体验您的应用程序变得尽可能容易容易,没有人使用您的应用程序的时候注意到它。是的,当然,除非您想要,应用程序带给用户一些注意。4.6.1.需要考虑的一些关于聊天者的琐碎东西当用户参与一个文本聊天,他们的手在键盘上。一旦他们完成消息输入,不得不把手从键盘上移开,去用鼠标点击发送按纽,他们应该可以选择使用键盘来发送他们的消息。所以,第一件要做的事就是在TextSO例子中添加它。当一个用户完成当前消息的输入,他可以点击发送按纽或者按下Enter键来发送消息。另外,不同的用户在聊天室中,当他们发言时,应该有一个标识。添加一个名称到一个消息中有两个重要的作用:1.与其它发言人区分开来,有助于明确的通信。2.标识了发言人,所以每个人都知道是谁发的言。作为最后一步,使聊天者变得更轻松,一旦聊天者在输入窗口中输入消息,该消息应消失。为下一步的消息输入而消除消息,这是一个不大的事,但它使得聊天流程更平滑。要回顾一下,这里有您需要创建的项目,以提高文字聊天的应用程序:1 允许用户按下回车键来发送消息,而不需要去点击发送按纽2 依照用户分开在聊天窗口中的消息3 在用户发送一个消息后,输入框中的消息被消除4.6.2.一个更好的聊天应用程序这个升级的实时聊天应用程序,需要添加更多的事件和第二TextInput组件 ,给参加者可输入他们的名字。为了使它容易,应用还将包括一个焦点事件( FocusEvent),使当一个人输入他或她的名字,输入框中的提示消息消失。此外,应用程序应该验证用户输入一个名称,不要保留提示消息或者一个空白的名字在输入框中。为了给参与者利用键盘输入的机会,该脚本将包括ComponentEvent类。这个类,能侦听存放在常量中的不同事件,包括ENTER,来取得Enter 或者 Return键。由于应用程序只侦听Enter/Return,该脚本不使用KeyboardEvent类。如果这样做将会要求应用程序侦听每一个按键,在聊天的应用中,这样会对处理器添加许多的工作。按下面步骤来建立应用程序:4 打开TextSO.fla,改变文档类为TextChat,把TextSO.fla文件另存为TextChat.fla。5 使用18号字体,建立一个静态文本,内容为“Text Chat Center”。位置x=16,y=17。参考图4-66 建立一个TextChat.as,输入以下代码:Example 4-5. TextChat.asCode View:package import fl.controls.TextArea; import fl.controls.Button; import fl.controls.TextInput; import flash.display.Sprite; import flash.events.SyncEvent; import flash.events.NetStatusEvent; import flash.events.MouseEvent; import flash.events.FocusEvent; import .SharedObject; import .NetConnection; import fl.events.ComponentEvent; public class TextChat extends Sprite private var button:Button; private var text_so:SharedObject; private var nc:NetConnection; private var textArea:TextArea; private var textInput:TextInput; private var chatName:TextInput; private var rtmpGo:String; private var good:Boolean; private var catchKey:Boolean; private var noName:Boolean; public function TextChat () /Set up UIs textArea=new TextArea(); textArea.setSize (500,280); textArea.move (20,54); addChild (textArea); textInput=new TextInput(); textInput.setSize (500,24); textInput.move (20,340); textInput.addEventListener (ComponentEvent.ENTER,checkKey); addChild (textInput); button=new Button(); button.width=50; but
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年吐鲁番辅警协警招聘考试真题含答案详解(满分必刷)
- 2024年嘉义县辅警招聘考试题库附答案详解(轻巧夺冠)
- 2023年黑龙江辅警招聘考试题库附答案详解(综合卷)
- 2024年六盘水辅警招聘考试真题附答案详解(b卷)
- 2023年阿拉善盟辅警招聘考试题库附答案详解(典型题)
- 2024年安康辅警招聘考试真题附答案详解(精练)
- 2023年石家庄辅警招聘考试真题及答案详解(考点梳理)
- 2024年固原辅警协警招聘考试备考题库含答案详解(培优)
- 2023年鞍山辅警协警招聘考试备考题库含答案详解(轻巧夺冠)
- 2023年茂名辅警招聘考试题库及答案详解(基础+提升)
- 2025年腾讯校招综合素质测评试题及答案
- 2025贵州盐业(集团)黔西南有限责任公司招聘15人笔试考试备考试题及答案解析
- 初中物理欧姆定律(教学课件)2025-2026学年初中物理人教版(2024)九年级全一册
- 2025河南郑州热力集团有限公司招聘60人笔试考试备考试题及答案解析
- 2025广西钦州市公安局面向社会公开招聘警务辅助人员74人笔试考试参考试题及答案解析
- 中外著名空难及飞机失事逃生指南教学课件演示模板
- 2024年人力资源管理师考试真题及解析
- 煤矿招工笔试试题及答案
- 医院新员工信息安全培训课件
- 特种作业考试点优化建设与实施策略
- 护理职业生涯规划大赛成长赛道
评论
0/150
提交评论