版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、JAVA程序設(shè)計(jì)多人聊天室 131301403721 設(shè)計(jì)目的Java 編程語(yǔ)言是個(gè)簡(jiǎn)單、面向?qū)ο?、分布式、解釋性、健壯、安全與系統(tǒng)無(wú)關(guān)、可移植、高性能、多線程和靜態(tài)的語(yǔ)言。本次課程設(shè)計(jì)旨在應(yīng)用JAVA編程語(yǔ)言中的網(wǎng)絡(luò)通信,多線程,數(shù)據(jù)庫(kù)編程,圖形界面編程等技術(shù)實(shí)現(xiàn)一個(gè)基本的多人在線網(wǎng)絡(luò)聊天室。并以此鞏固JAVA基礎(chǔ)知識(shí),體會(huì)面向?qū)ο蟮脑O(shè)計(jì)方法。2 平臺(tái)要求2.1 使用:搭載JAVA運(yùn)行環(huán)境的平臺(tái)即可。2.2 開(kāi)發(fā)環(huán)境:Windows10 64bit JDK 1.8Eclipse 4.4Window Builder3 需求分析管理員:?jiǎn)?dòng)服務(wù)器,關(guān)閉服務(wù)器,強(qiáng)制用戶退出,聊天房間增添改查。用戶
2、:GUI,注冊(cè),登陸,聊天等。用例圖:4 概要設(shè)計(jì)4.1 服務(wù)器設(shè)計(jì)將客戶端的請(qǐng)求抽象化,每種請(qǐng)求服務(wù)器都會(huì)產(chǎn)生一個(gè)特定的類的對(duì)象去處理它。服務(wù)器負(fù)責(zé)接受客戶端請(qǐng)求,根據(jù)請(qǐng)求內(nèi)容完成指定工作。為提高效率,采用多線程結(jié)合線程池設(shè)計(jì)技術(shù),對(duì)于每個(gè)請(qǐng)求在線程池內(nèi)得到一個(gè)線程去處理請(qǐng)求。如圖3-1所示。4.2 客戶端設(shè)計(jì)5圖 41服務(wù)器概要圖聊天室中一個(gè)事物的過(guò)程基本流程是:用戶產(chǎn)生動(dòng)作,客戶端發(fā)送消息,服務(wù)器接收并處理,服務(wù)器返回處理結(jié)果,GUI根據(jù)結(jié)果進(jìn)行顯示的更新??蛻舳酥辉贕UI中采用多線程設(shè)計(jì)。而對(duì)服務(wù)器回應(yīng)的接受都是單線程的因?yàn)橹挥幸粋€(gè)服務(wù)器為自己服務(wù),且在接收數(shù)據(jù)過(guò)程中連接是不可斷開(kāi)的。
3、客戶端的設(shè)計(jì)如圖3-2所示。一次事物流程中的步驟編號(hào)在圖中給出。437612圖 42客戶端概要圖5 詳細(xì)設(shè)計(jì)5.1 服務(wù)器詳細(xì)設(shè)計(jì)服務(wù)器要完成的任務(wù)是接受客戶請(qǐng)求并在自己維護(hù)的數(shù)據(jù)結(jié)構(gòu)上進(jìn)行相應(yīng)處理最終將處理結(jié)果返回給客戶端。具體涉及到多線程,數(shù)據(jù)庫(kù),網(wǎng)絡(luò)通信幾項(xiàng)技術(shù),同時(shí)為了實(shí)時(shí)根據(jù)請(qǐng)求產(chǎn)生特定類的對(duì)象使用了反例技術(shù)。5.1.1 總體概覽服務(wù)器端的入口類為ServerMain。聊天室服務(wù)器端代碼可分為以下八個(gè)部分。除最后兩個(gè)部分外其他部分為串行執(zhí)行。在接聽(tīng)后,創(chuàng)建的線程會(huì)并發(fā)處理客戶請(qǐng)求。由于各個(gè)處理并發(fā)的特點(diǎn),使得服務(wù)器的響應(yīng)不會(huì)應(yīng)為某個(gè)而用戶阻塞,提高了效率。圖 51聊天室服務(wù)器代碼布局
4、服務(wù)器將用戶操作抽象為不同的工作類,在接收到請(qǐng)求后根據(jù)消息協(xié)議在當(dāng)前實(shí)現(xiàn)的工作類名列表中找到類名(通過(guò)下標(biāo)在CommandList類中的List commandsList屬性中得到),通過(guò)反例技術(shù)直接生成類的對(duì)象。各個(gè)類對(duì)象負(fù)責(zé)具體工作,他們都繼承ServerWorkClass。而ServerWorkClass繼承自WorlClass因?yàn)榭蛻舳藢?duì)服務(wù)器的回復(fù)也應(yīng)當(dāng)有特定的類去處理它。目前實(shí)現(xiàn)的類有以下五種。當(dāng)要添加新功能時(shí)只需向commandsList屬性靜態(tài)添加索引。進(jìn)一步,也可在以后加入新的機(jī)制實(shí)現(xiàn)動(dòng)態(tài)添加功能。表 52工作類名及其工作內(nèi)容類名服務(wù)器端動(dòng)作HouseRelative處理用戶
5、的進(jìn)入、離開(kāi)房間請(qǐng)求Login處理用戶的上線、下線請(qǐng)求Messages處理用戶的消息發(fā)送請(qǐng)求UserDelAdd處理用戶注冊(cè)請(qǐng)求UserInfo處理用戶的用戶信息查詢?cè)O(shè)置請(qǐng)求服務(wù)器中涉及到的類圖如下所示:5.1.2 協(xié)議約定及實(shí)現(xiàn)由于要考慮客戶端的各個(gè)請(qǐng)求需要完成不同的操作,需要根據(jù)數(shù)據(jù)來(lái)內(nèi)容來(lái)做特定的工作,本聊天室將通信協(xié)議定義如下:userID:服務(wù)器通過(guò)此ID確定消息是由哪個(gè)用戶發(fā)出的。authorization code:服務(wù)器對(duì)用戶身份進(jìn)行認(rèn)證的域,每次在接受用戶請(qǐng)求后都會(huì)更新一個(gè)隨機(jī)數(shù),并且將內(nèi)容返回,而用戶在請(qǐng)求服務(wù)器時(shí)必須使用最新的驗(yàn)證碼否則不會(huì)得到服務(wù)器響應(yīng)。這防止了非法用戶
6、的不正當(dāng)操作。command:表示用戶的請(qǐng)求類型其值為具體操作的工作類在commandsList中的下標(biāo),服務(wù)器通過(guò)此下標(biāo)找到類名產(chǎn)生類的對(duì)象。到這里為止的工作都是由一個(gè)CommandHandler的類的對(duì)象來(lái)完成,它實(shí)現(xiàn)了Runnable接口,在Accepter類的對(duì)象接受到消息后產(chǎn)生一個(gè)線程來(lái)執(zhí)行對(duì)消息的下一步處理,其主要工作就是通過(guò)WorkingClassFactory使用反例技術(shù)產(chǎn)生具體工作類,之后調(diào)用工作類的doJob()方法完成任務(wù)。command2:一個(gè)具體工作類是對(duì)一類操作的抽象,如與房間相關(guān)的操作可能包括進(jìn)房間和出房間,而具體內(nèi)容就是根據(jù)command2來(lái)標(biāo)示的。從這里開(kāi)始的
7、工作已經(jīng)進(jìn)入到了WorkingClass的代碼區(qū)域。result:是服務(wù)器向客戶端告知請(qǐng)求是否正常完成的字段。之后就是具體消息的定義區(qū)域。首先一個(gè)MessageAmount來(lái)表示消息個(gè)數(shù),而之后每條消息都有一個(gè)int域來(lái)表示其長(zhǎng)度。為了支持中文,采用字符數(shù)組而不是字節(jié)數(shù)組。服務(wù)器和客戶端都將協(xié)議下的具體報(bào)文封裝在了PacketUnit類中,其主要提供了一個(gè)通過(guò)輸入流來(lái)構(gòu)建自身的構(gòu)造方法和重寫(xiě)了toString方法以便發(fā)送時(shí)序列化。PacketUnit的產(chǎn)生源頭是GUI的監(jiān)聽(tīng)處理函數(shù)。由特定部位按鈕或組件調(diào)用PackUnitGenerator類的特定靜態(tài)方法產(chǎn)生特定的對(duì)象。5.1.3 初始化數(shù)據(jù)
8、庫(kù)數(shù)據(jù)庫(kù)采用JAVA數(shù)據(jù)庫(kù)JDBC技術(shù)。一般步驟為加載特定數(shù)據(jù)庫(kù)驅(qū)動(dòng),產(chǎn)生建立連接的URL,根據(jù)URL連接數(shù)據(jù)庫(kù),在連接上創(chuàng)建statement類的對(duì)象進(jìn)行查詢和更新任務(wù)的發(fā)送。與數(shù)據(jù)庫(kù)有關(guān)的所有工作都由DataBaseServer類來(lái)完成。由于考慮到聊天室中大部分操作不需要數(shù)據(jù)庫(kù),并且全程一個(gè)連接可能在并發(fā)過(guò)程中會(huì)導(dǎo)致潛在的錯(cuò)誤,在初始化中只進(jìn)行了驅(qū)動(dòng)的加載。之后需要查詢或更新數(shù)據(jù)庫(kù)時(shí)通過(guò)創(chuàng)建DataBaseServer類的對(duì)象來(lái)創(chuàng)建新的連接,以對(duì)象為單位向數(shù)據(jù)庫(kù)發(fā)送查詢請(qǐng)求。DataBaseServer主要提供以下幾個(gè)方法:public static void init();完成數(shù)據(jù)庫(kù)驅(qū)動(dòng)
9、的加載,并且由于靜態(tài)方法第一次調(diào)用,獲取服務(wù)器連接的DataBaseServer靜態(tài)屬性URL也會(huì)在此時(shí)生成。public DataBaseServer();DataBaseServer的構(gòu)造函數(shù),每次調(diào)用都會(huì)創(chuàng)建一條向MYSQL數(shù)據(jù)庫(kù)的連接。public int updateQuery(String job);向已連接的數(shù)據(jù)庫(kù)發(fā)送一個(gè)更新請(qǐng)求,參數(shù)為SQL更新語(yǔ)句。public ResultSet getResult(String job);向已連接的數(shù)據(jù)庫(kù)發(fā)送一個(gè)查詢請(qǐng)求,參數(shù)為SQL查詢語(yǔ)句。并且返回一個(gè)ResultSet結(jié)果,是一個(gè)包含了查詢結(jié)果的對(duì)象。具體代碼位于DataBaseSe
10、rver.java文件內(nèi)。數(shù)據(jù)庫(kù)采用MySQL數(shù)據(jù)庫(kù),使用到了兩張表,定義如下:userinfo表:表項(xiàng)類型uidintnamevarcharpasswordvarchargendercharteleareachartelephonecharnicknamevarcharbirthyearintbirthmonthintbirthdayinthomelandvarcharinfovarcharhouseinfo表:表項(xiàng)類型hidintshidinthousenamevarcharouidintcreateyearintcreatemonthintcreatedayinthouseinfovar
11、binary5.1.4 初始化用戶信息用戶信息不僅是服務(wù)器對(duì)客戶端的抽象,也是服務(wù)器內(nèi)部對(duì)用戶進(jìn)行管理最基本的類。在服務(wù)器中以User類來(lái)表示用戶。其有用戶的基本個(gè)人信息,以及用戶所在客戶端的IP和端口(在Login過(guò)程后初始化),和用戶當(dāng)前所在房間的列表(以便用戶名等信息更新時(shí)及時(shí)通知所有看得到此用戶的用戶)。屬性:類型屬性:類型homeLand : Stringuid : int info : StringuserName : String authCode : intpassword : String ipAddress : InetAddressgender : char port :
12、 inttelearea : StringipAddressEvil : InetAddresstelephone : StringportEvil : intnickname : String currentHouse : ListbirthYear: int ownHouse : ListbirthMonth : intbirthDay :int總體上,服務(wù)器在初始化時(shí)從數(shù)據(jù)庫(kù)中直接讀取所有用戶,并且將他們存儲(chǔ)于線下用戶的userAll表中(這里有一個(gè)基本約定:服務(wù)器啟動(dòng)時(shí)是沒(méi)有用戶在線的),而在線用戶則存儲(chǔ)在另一個(gè)userCul表中,這兩個(gè)表在服務(wù)器中表示了當(dāng)前的所有用戶的集合。而這兩個(gè)
13、表的維護(hù)歸一個(gè)叫做UserFactory的類來(lái)管理,它負(fù)責(zé)向外界提供User對(duì)象采用了工廠設(shè)計(jì)模式,并且采用了單例模式,因?yàn)橐粋€(gè)服務(wù)器只需一個(gè)工廠進(jìn)行管理。用戶初始化的流程如下:UserFactory對(duì)外提供如下幾個(gè)方法:public User getByUid(int uid);通過(guò)用戶編號(hào)獲得User類的對(duì)象。public User getByName(String name);通過(guò)用戶名獲得User類的對(duì)象。public User createUser(String messages);創(chuàng)建一個(gè)用戶并且將其寫(xiě)入數(shù)據(jù)庫(kù),同時(shí)存入userAll。public User updateUser(
14、String messages,User userTmp);更新一個(gè)用戶的信息,將其寫(xiě)入到數(shù)據(jù)庫(kù)中。用戶名改變?cè)斐傻目蛻舳伺c服務(wù)器不一致由UserInfo類處理,一般情況下此方法也只由UserInfo類的對(duì)象調(diào)用。public void loginAUser(User utm);使一個(gè)用戶由線下?tīng)顟B(tài)轉(zhuǎn)換為線上狀態(tài)。即從userAll表轉(zhuǎn)移到userCul表。public void logoffAUser(User utm);與loginAUser相反。public boolean isOnline(int uid);檢查一個(gè)用戶是否在線。public boolean isExists(int
15、uid);通過(guò)UID檢查指定用戶是否存在。public boolean isExists(String checkName);通過(guò)用戶名檢查指定用戶是否存在。public List getUserCur();獲取所有在線用戶。具體代碼位于UserFactory.java內(nèi)。5.1.5 初始化房間信息房間是用戶間通信的場(chǎng)所,通信不可能從一個(gè)房間到另一個(gè)房間。在服務(wù)器中房間用House類表示。為此,房間主要維護(hù)一個(gè)房間內(nèi)用戶的表,以便某個(gè)用戶發(fā)送消息時(shí)使服務(wù)器知道該把消息發(fā)送給誰(shuí)。房間信息的初始化類比用戶信息的初始化,也使用了工廠模式和單例技術(shù),只是少了在線不在線這個(gè)概念。House的工廠類為Ho
16、useFactory。其向外提供了通過(guò)HID或房間名來(lái)獲取房間對(duì)象的方法。不再贅述。5.1.6 設(shè)置本地發(fā)送端的Socket為了實(shí)現(xiàn)異步通信,在通信過(guò)程中客戶端和服務(wù)器總共需要四個(gè)Socket,分別用于服務(wù)器接受,服務(wù)器發(fā)送,客戶端接受,客戶端發(fā)送。必須先設(shè)置發(fā)送端的信息,后設(shè)置接受端的信息以防止接收到請(qǐng)求處理完而無(wú)法發(fā)送導(dǎo)致的數(shù)據(jù)不一致問(wèn)題。服務(wù)器在這里設(shè)置設(shè)置服務(wù)器發(fā)送端的Socket。通過(guò)ServerMain類調(diào)用Sender.init()來(lái)實(shí)現(xiàn)。而服務(wù)器發(fā)送的任務(wù)完全交給Sender類。它主要提供一個(gè)send方法,參數(shù)是報(bào)文信息和用戶,通過(guò)將報(bào)文信息字節(jié)化,獲取用戶的接受Socket得
17、到發(fā)送地址和發(fā)送內(nèi)容,從而執(zhí)行發(fā)送過(guò)程。5.1.7 監(jiān)聽(tīng)監(jiān)聽(tīng)的工作由Accepter類完成,它實(shí)現(xiàn)Runnable接口,在ServerMain準(zhǔn)備好了所有內(nèi)部數(shù)據(jù)后會(huì)調(diào)用ServerMain.startAcceoter方法來(lái)設(shè)置Accepter監(jiān)聽(tīng)的本地端口,并且啟用一個(gè)新線程來(lái)監(jiān)聽(tīng)。Accepter的run方法內(nèi)創(chuàng)建了一個(gè)線程池,從此進(jìn)入一個(gè)無(wú)限循環(huán),內(nèi)部工作為監(jiān)聽(tīng)端口,獲取輸入流,產(chǎn)生PacketUnit,產(chǎn)生一個(gè)Commandhandler并包裝為Thread對(duì)象后開(kāi)啟新的線程。5.1.8 事物處理事務(wù)處理由WorkingClass的幾個(gè)子類具體執(zhí)行。WorkingClass有一個(gè)Pac
18、ketUnit類的屬性因?yàn)閃orkingClass的工作是圍繞接收到的數(shù)據(jù)展開(kāi)的,所有WorkingClass子類都應(yīng)該有此成員,此成員在CommandHandler類內(nèi)部產(chǎn)生WorkingClass時(shí)將其賦值。ServerWorkingClass的子類都處于服務(wù)器內(nèi),主要工作就是根據(jù)請(qǐng)求改變服務(wù)器數(shù)據(jù)結(jié)構(gòu)屬于整個(gè)流程中的第四步(見(jiàn)圖xxx)。有一個(gè)屬性User myUser,用于告知服務(wù)器現(xiàn)在服務(wù)的用戶以便對(duì)服務(wù)器維護(hù)的數(shù)據(jù)進(jìn)行更新。ClientWorkingClass的子類都處于客戶端內(nèi),工作是根據(jù)服務(wù)器的反饋告訴GUI做適當(dāng)?shù)娘@示。負(fù)責(zé)整個(gè)流程中的第七步。各子類的工作邏輯詳見(jiàn)代碼。這里簡(jiǎn)
19、單列出流程圖。Login:協(xié)議:流程:注意:由于第一次登陸是客戶端無(wú)法知道UID所以myUser屬性只能通過(guò)消息中的用戶名獲得。返回消息時(shí)會(huì)設(shè)置登陸成功的客戶UID由客戶端維持。HouseRelative:getInHouse:LeaveHouse:Messages:UserDelAddUserInfo 5.2 客戶端詳細(xì)設(shè)計(jì)5.2.1 總體概覽客戶端主要運(yùn)用到了GUI和網(wǎng)絡(luò)通信技術(shù)。涉及到的類之間的關(guān)系如下:客戶端執(zhí)行任務(wù)的基本流程如下:5.2.2 登錄界面Login按鈕的監(jiān)聽(tīng)器會(huì)調(diào)用PackUnitGenerator來(lái)產(chǎn)生一個(gè)登錄請(qǐng)求的數(shù)據(jù)包,內(nèi)容見(jiàn)5.1.8登陸部分。之后除了接收線程還在
20、等待服務(wù)器回復(fù)外不再進(jìn)行任何動(dòng)作。接受到回復(fù)后會(huì)根據(jù)消息產(chǎn)生相應(yīng)的界面。 只有當(dāng)能夠登錄時(shí)Next按鈕才能點(diǎn)擊,點(diǎn)擊后,服務(wù)器就會(huì)登錄此用戶。同時(shí)這個(gè)Next的監(jiān)聽(tīng)器還會(huì)產(chǎn)生一條進(jìn)入房間Hall的請(qǐng)求,從而保證了每個(gè)用戶在登錄成功后會(huì)進(jìn)入Hall房間。而其他房間需要用戶手動(dòng)進(jìn)入。5.2.3 注冊(cè)界面如上圖所示。Submit按鈕會(huì)檢查輸入是否合法,否則會(huì)提示相應(yīng)輸入信息的錯(cuò)誤情況,Cancel會(huì)銷毀這個(gè)對(duì)話框,如圖。 若輸入合法會(huì)根據(jù)輸入產(chǎn)生一個(gè)注冊(cè)的數(shù)據(jù)包發(fā)往服務(wù)器。但還會(huì)遇到如用戶名已存在的情況。這是注冊(cè)也是失敗的。5.2.4 主界面主界面上所有按鈕功能均已實(shí)現(xiàn)。由于需要支持多房間,在消息顯
21、示區(qū)域上方有一個(gè)Entered House下拉菜單,里面每一項(xiàng)對(duì)應(yīng)著一個(gè)消息顯示區(qū)域和右下方的一個(gè)Current User列表。分別是當(dāng)前房間的消息和當(dāng)前房間內(nèi)的用戶。右上方的All House列表中的每一項(xiàng)代表一個(gè)房間,雙擊它。若已進(jìn)入房間則只是更改Entered House下拉菜單的當(dāng)前選擇項(xiàng)。若沒(méi)有進(jìn)入過(guò)該房間則會(huì)產(chǎn)生一個(gè)進(jìn)入該房間的請(qǐng)求。等到服務(wù)器返回消息后由HouseRelative工作類在EnteredHouse下拉菜單中創(chuàng)建一個(gè)條目,同時(shí)創(chuàng)建一個(gè)該房間的消息顯示區(qū)域以及當(dāng)前房間內(nèi)用戶的列表。這些消息都能夠從服務(wù)器返回的消息中得到。5.2.5 用戶消息顯示界面在聊天室中所有用戶都可以查看自己或者別人的資料,并且對(duì)自己的資料有更改權(quán)。只需點(diǎn)擊MyDetail按鈕或者雙擊Current User列表中的用戶名即可查看消息。6 測(cè)試加入房間,離開(kāi)房間均能在其他客戶端正常顯示。消息中英文發(fā)送顯示正常,所有同房間內(nèi)的人都能收到。用戶信息顯示正確工作。見(jiàn)5.2.5節(jié)。7 優(yōu)缺點(diǎn)分析7.1 優(yōu)點(diǎn)1、 服務(wù)器采用多線程應(yīng)對(duì)客戶端請(qǐng)求并且結(jié)合線程池技術(shù)。使得服務(wù)器的并發(fā)量較大。2、 服務(wù)器采用將數(shù)據(jù)協(xié)議規(guī)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 期中拔高測(cè)試(第1-4單元)(試題)(含答案)2024-2025學(xué)年六年級(jí)上冊(cè)數(shù)學(xué)人教版
- 2024年度云南省高校教師資格證之高等教育法規(guī)模擬考試試卷A卷含答案
- 2024年度上海市高校教師資格證之高等教育法規(guī)題庫(kù)綜合試卷B卷附答案
- 阜陽(yáng)師范大學(xué)《自然科學(xué)專題》2022-2023學(xué)年第一學(xué)期期末試卷
- 阜陽(yáng)師范大學(xué)《美國(guó)文學(xué)》2022-2023學(xué)年第一學(xué)期期末試卷
- 粵教版三年級(jí)科學(xué)上冊(cè)全冊(cè)教案(廣東)
- 蘇州市2024-2025學(xué)年五年級(jí)上學(xué)期11月期中調(diào)研數(shù)學(xué)試卷二(有答案)
- 福建師范大學(xué)協(xié)和學(xué)院《學(xué)前兒童保育學(xué)》2021-2022學(xué)年第一學(xué)期期末試卷
- 福建師范大學(xué)《中小學(xué)教學(xué)名師論壇》2022-2023學(xué)年第一學(xué)期期末試卷
- 福建師范大學(xué)《特殊教育概論》2021-2022學(xué)年第一學(xué)期期末試卷
- 2024-2025學(xué)年高一上學(xué)期期中考試動(dòng)員主題班會(huì)課件
- 管道支架及吊架施工方案
- 施工現(xiàn)場(chǎng)環(huán)境因素清單(全)
- 并網(wǎng)前單位工程調(diào)試報(bào)告
- 三年級(jí)語(yǔ)文家長(zhǎng)會(huì)(課堂PPT)
- 從事通信專業(yè)工作年限證明
- 《Monsters怪獸》中英對(duì)照歌詞
- 高壓水槍-安全操作規(guī)程
- 金代澤州同知宋雄飛事輯
- 水閘工作橋計(jì)算說(shuō)明書(shū)
- 陜西省主要樹(shù)種代碼表
評(píng)論
0/150
提交評(píng)論