คำนำ
ในบทความก่อนหน้านี้ Spring Boot + Layim + T-IO ไฟล์อัปโหลดและการตรวจสอบสถานะผู้ใช้มีการแนะนำสองรายละเอียดเล็ก ๆ น้อย ๆ : สถานะออฟไลน์ของผู้ใช้และสถานะการเปลี่ยนแปลงจำนวนคน เนื้อหาหลักของวันนี้คือการใช้งานของผู้ใช้เพิ่มเพื่อน
การแนะนำ
เพิ่มเพื่อน ทุกคนรู้ว่าพวกเขาใช้ QQ ไม่มีอะไรมากไปกว่าการเริ่มแอปพลิเคชันเพื่อน อีกฝ่ายได้รับการแจ้งเตือนข้อความแล้วประมวลผล อย่างไรก็ตามบทความนี้พูดถึงครึ่งแรกเท่านั้นและการประมวลผลการแจ้งเตือนข้อความจะถูกทิ้งไว้ในบทความถัดไป เนื่องจากเนื้อหานั้นค่อนข้างมากเกินไปฉันจึงกลัวว่าฉันจะย่อยไม่ได้สักพัก ก่อนที่จะแนะนำกระบวนการหลักให้ฉันแนะนำงานเตรียมให้กับคุณก่อน
การตระเตรียม
ก่อนอื่นเพื่อให้ข้อมูลใกล้เคียงกับการต่อสู้จริงฉันใช้ข้อมูลผู้ใช้ "ของจริง" มากขึ้น เมื่อรวมกับเทมเพลต Fly การเชื่อมโยงข้อมูลของข้อมูลผู้ใช้ในหัวศูนย์ผู้ใช้ได้รับการปรับปรุง ส่วนที่มีผลผูกพันข้อมูลกำหนดว่าคุณเป็นเพื่อนอยู่แล้วหรือไม่ที่จะตัดสินใจว่าปุ่ม "เพิ่มเป็นเพื่อน" จะปรากฏขึ้นหรือไม่ ตัวอย่างมีดังนี้: เมื่อผู้ใช้เห็นหน้าแรกของเขาด้วยตัวเองมันเป็นเช่นนี้:
เมื่อคุณเห็นหน้าแรกของผู้ใช้ที่ไม่ใช่เพื่อนดูเหมือนว่า:
ส่วนข้อมูลที่มีผลผูกพันให้ฉันแนะนำสั้น ๆ กับคุณซึ่งคือการใช้เทมเพลต thymleaf เพื่อผูก เมื่อเข้าถึงหน้าในพื้นหลังเพียงกำหนดค่าโมเดล
/ *** การกำหนดแอตทริบิวต์**/ โมฆะส่วนตัว setModel (ผู้ใช้ผู้ใช้รุ่นโมเดล) {long currentUserId = getUserId (); Long VisitUserId = user.getId (); // เป็นบูลีนของคุณเอง isself = currentUserId == VisitUserId; // ไม่ว่าผู้ใช้สองคนจะเป็นเพื่อนบูลีน ISFIRED = Groupservice.isfriend (CurrentUserId, VisitUserId); แผนที่ <string, Object> USERMAP = ใหม่ HASHMAP <> (8); usermap.put ("Avatar", user.getavatar ()); usermap.put ("ชื่อ", user.getUserName ()); usermap.put ("addtime", timeutil.formatdate (user.getCreateAt ())+"เข้าร่วม"); if (user.getSign () == null || user.getSign (). length () == 0) {usermap.put ("sign", ""); } else {usermap.put ("sign", "(" + user.getSign () + ")"); } usermap.put ("uid", user.getId ()); usermap.put ("ตัวเอง", isself || isfriend); model.addattribute ("ผู้ใช้", USERMAP); -จากนั้นบนหน้าให้แยกข้อมูลออกจากโมเดล
<div style = "background-image: url ();"> <input type = "hidden" th: value = "$ {user.uid}" id = "visituid"/> <img src = "" th: src = "$ {user.avatar} th: text = "$ {user.name}"> </p> <i> </i> </h1> <p> <!-<i> </i> <span style = "สี: #ff7200;"> 67206flying kiss </span>-> <i> </i> <!-<i> </i> <span> จาก Hangzhou </span>-> <i th: ถ้า = "$ {user.self == false}"> </i> <a lay-event = "addfriend" href = "#" rel = "external nofoll th: text = "$ {user.sign}"> </p> </div>ตกลงข้างต้นคือการเตรียมการง่ายๆ หากคุณต้องการทราบรหัสโดยละเอียดคุณสามารถค้นหาได้ในตอนท้ายของบทความ
เริ่มต้นใบสมัครเพื่อน
ก่อนอื่นให้ติดตามการวิเคราะห์ทางธุรกิจของ Layim ก่อนอื่นเราจำเป็นต้องรู้ว่าใคร (toid) เราต้องการเพิ่มเป็นเพื่อน จากนั้นเพิ่มหมายเหตุ มันก็โอเคที่จะมอบสิ่งเหล่านี้ให้กับแบ็กเอนด์ เพื่อหลีกเลี่ยงการสืบค้นตารางฉันได้ทำชื่อผู้ใช้ซ้ำซ้อนและอวตารของผู้ใช้สำหรับการจัดเก็บข้อความระบบ ตารางส่วนใหญ่ประกอบด้วยฟิลด์: ID ผู้ใช้, อวตารของผู้ใช้, ชื่อผู้ใช้, รหัสผู้ใช้ที่ใช้, เวลาแอปพลิเคชัน, ประเภทแอปพลิเคชัน, หมายเหตุ, การอ่านและแอตทริบิวต์อื่น ๆ
ดังนั้นจึงเป็นเรื่องง่ายมากที่จะเริ่มแอปพลิเคชันเพื่อน มันเป็นฟังก์ชั่นเพิ่มเติม ส่วนหน้าผ่านรหัสผู้ใช้ของผู้ตอบและบันทึกแอปพลิเคชัน แบ็คเอนด์จัดระเบียบข้อมูลที่จะแทรกลงในฐานข้อมูล รหัสมีดังนี้:
/ *** ส่งใบสมัครเพื่อน**/ สาธารณะ jsonResult SaveFriefiREPply (ยาว toID, หมายเหตุสตริง) {หมายเหตุ = htmlutils.htmlescape (หมายเหตุ); contextuser user = shiRoutil.getCurrentUser (); userId long = long.parselong (user.getUserId ()); int Record = ApplyRepository.CountByToidanduidandTypeAndresult (toID, userId, appleType.friend, 0); if (บันทึก> 0) {return jsonResult.fail ("หลังจากสมัคร"); } ใช้สมัคร = ใหม่สมัคร (); apple.setType (appletype.friend); ใช้. settoid (toid); apple.setRemark (หมายเหตุ); apple.setuid (userId); apple.setavatar (user.getavatar ()); apple.setName (user.getUserName ()); apple.setRead (false); apple.setResult (0); ส่งคืน saiapply (สมัคร); -ตกลงแอปพลิเคชันสิ้นสุดลงเราจะทำอะไรต่อไป? ถูกต้องแจ้งให้อีกฝ่ายทราบเฮ้ฉันส่งแอปพลิเคชันให้คุณและดำเนินการอย่างรวดเร็ว ฉันพบปัญหาที่นี่ เนื่องจากโปรแกรม Springboot ครอบครองพอร์ต 8080 และ T-IO ครอบครองพอร์ต 8888 นั่นคือถ้าฉันต้องการเรียกใช้บริการของ 8888 ในธุรกิจของพอร์ต 8080 ฉันไม่รู้ว่าจะได้รับช่องสัญญาณที่สอดคล้องกันอย่างไร อย่างไรก็ตามหลังจากถามผู้เขียนปัญหาของฉันได้รับการแก้ไขในหนึ่งประโยค
รับ ServerGroupContext และปัญหาได้รับการแก้ไข
ถั่ว layimwebsocketstarter ได้รับการลงทะเบียนเมื่อโปรแกรมก่อนหน้านี้เริ่มต้นขึ้น ดังนั้นหากคุณสามารถรับได้ในด้านธุรกิจ 8080 จะไม่มีปัญหา
รับ layimwebsocketstarter คุณสามารถรับ ServerGroupContext จากนั้นคุณสามารถกดอย่างแข็งขันบนเซิร์ฟเวอร์
แน่นอนว่าสิ่งนี้อาจไม่ได้รับการพัฒนาและฉันไม่เข้าใจปัญหาข้างต้นเป็นอย่างดี ไม่สำคัญ ที่จริงแล้วฉันต้องการอธิบายว่าหากคุณส่งข้อความไปยังไคลเอนต์จากฝั่งเซิร์ฟเวอร์อย่างแข็งขันเพียงใช้ ServerGroupContext
พุชที่ใช้งานอยู่บนเซิร์ฟเวอร์
รหัสต่อไปนี้อยู่ใน com.fyp.layim.im.common.util.pushutil
ตกลงทำตามขั้นตอนด้านบน
ขั้นตอนแรกคือการได้รับ layimwebsocketstarter
/*** รับสตาร์ทเตอร์*/ส่วนตัว layimwebsocketstarter getStarter () {return (layimwebsocketstarter) Springutil.getBean ("layimwebsocketstarter"); -ขั้นตอนที่ 2: รับ ServerGroupContext
ServerGroupContext ส่วนตัว GetServerGroupContext () {return getStarter (). getServerGroupContext (); -ขั้นตอนที่สามคือการรับ channelcontext
/ ** * รับ channelcontext * */ ส่วนตัว channelcontext getChannelContext (สตริง toID) {serverGroupContext context = getSerVerGroupContext (); // ค้นหา channelcontext channelcontext = context.users.find (บริบท, toID); ส่งคืน channelcontext; -ขั้นตอนที่สี่คือการเปิดตัวและรหัสที่นี่เกือบจะเหมือนกับส่วนหนึ่งของรหัสในการแชท ส่วนหลักคือการรับ channelcontext จากนั้นส่งข้อความ หากคุณไม่ได้ออนไลน์ไม่ต้องกังวล
/ *** เซิร์ฟเวอร์ผลักข้อความอย่างแข็งขัน**/ โมฆะคงที่สาธารณะ pushapplyMessage (สตริง toID) {logger.info ("ดำเนินการเพื่อส่งวิธี: pushapplyMessage"); layimtoclientnoticemsgbody = ใหม่ layimtoclientnoticemsgbody (); channelContext channelcontext = getChannelContext (toID); // ก่อนอื่นตรวจสอบว่าเป็นออนไลน์หรือไม่จากนั้นสอบถามฐานข้อมูลเพื่อลดจำนวนการสืบค้นถ้า (channelcontext! = null &&! channelcontext.isclosed ()) {int count = getapplyservice (). getunreadmsgcount (long.parselong (toid)); Body.setCount (นับ); push (channelcontext, body); }} / *** เซิร์ฟเวอร์ผลักข้อความอย่างแข็งขัน** / โมฆะแบบคงที่ส่วนตัวพุช (channelcontext channelcontext, Object MSG) {ลอง {WSResponse Response = BodyConvert.getInstance () ConvertTotExtreSponse (MSG); aio.send (channelcontext, การตอบสนอง); } catch (ioexception ex) {}}ตอนนี้การกดเสร็จสิ้นแล้วจะถูกผลักเมื่อไหร่? เนื่องจากการผลักดันข้อความในระบบนี้ไม่จำเป็นต้องเป็นทันทีฉันจึงดูและพบว่ามีกลไกเหตุการณ์ที่คล้ายกันใน Springboot ดังนั้น AppleEvent จึงเกิดขึ้น
Public Class PappleEvent ขยาย ApplicationEvent {Public ApplyEvent (แหล่งที่มาของวัตถุ) {super (แหล่งที่มา); } ToID ส่วนตัวส่วนตัว; Gettoid () {return toid; } Public ApplyEvent (แหล่งที่มาของวัตถุ, toID ยาว) {super (แหล่งที่มา); this.toid = toid; -สร้างผู้ฟังเพื่อฟังเหตุการณ์
คลาสสาธารณะ ApplyListener ใช้ ApplicationListener <PelaPelEvent> {Private Logger Logger = loggerFactory.getLogger (appllistener.class); @Override โมฆะสาธารณะ onApplicationEvent (appleEvent ApplyEvent) {Thread ใหม่ () {โมฆะสาธารณะ Run () {long toID = appleEvent.getToid (); // ที่นี่เราจะเรียก push ด้านบน pushutil.pushapplyMessage (toID.toString ()); } }.เริ่ม(); -อย่างไรก็ตามฉันมีคำถามและพบว่าการดำเนินการในผู้ฟังนั้นเป็นแบบซิงโครนัส ต่อมาการเพิ่ม @async และ @enableasync นั้นไร้ประโยชน์ดังนั้นฉันจึงใช้เธรดใหม่ () เริ่มต้น () เพื่อให้เกิดการเกิดแบบอะซิงโครนัสเพื่อให้แน่ใจว่ามันจะไม่ส่งผลกระทบต่อกระบวนการสมัครหลัก (นี่เป็นคำถามฉันไม่ได้คิดออก)
สุดท้ายอย่าลืมเพิ่มผู้ฟังเมื่อแอปพลิเคชันเริ่มต้นขึ้น
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {SpringApplication SpringApplication = new SpringApplication (layimapplication.class); / *** เฉพาะเมื่อมีการเพิ่มผู้ฟังที่นี่ผู้ฟังจะทริกเกอร์* ApplyListener เป็นเหตุการณ์ที่รับฟังแอปพลิเคชันของเพื่อน**/ SpringApplication.addListeners (ใหม่ ApplyListener ()); Springapplication.run (args); -การเย็บแบบใช้งานได้
มันจะประสบความสำเร็จในไม่ช้า เรากำลังรวบรวมกิจกรรมและเผยแพร่กิจกรรมหลังจากแอปพลิเคชันเพื่อนสำเร็จ
/*** แอปพลิเคชันเพื่อน**/@postmapping (value = "/appli friend") public jsonResult สมัคร (@requestparam ("toID") ยาว toid,@requestparam ("หมายเหตุ") หมายเหตุ) // แอปพลิเคชันประสบความสำเร็จเหตุการณ์แอปพลิเคชันถูกโพสต์แจ้ง TOID ให้ประมวลผลข้อความ หากไม่ได้ออนไลน์จะไม่ถูกประมวลผลหาก (result.issuccess ()) {ApplicationContext.publisheVent (ใหม่ appleEvent ("ใช้", toID)); } ผลตอบแทนผลลัพธ์; -การสาธิตการทำงาน
ฉันได้พูดคุยกันมากให้ฉันแสดงผลของผลิตภัณฑ์สำเร็จรูป (ฉากผู้ใช้: เซียวเนียโอเพิ่มจักรพรรดิเป็นเพื่อนจักรพรรดิได้รับข้อความและตรวจสอบ)
จักรพรรดิได้รับข้อความและหมายเลข 4 ขนาดเล็กที่มุมซ้ายล่างโผล่ขึ้นมา (เรียกเมธอด layim.msgbox (msgcount))
จักรพรรดิคลิกที่กล่องข้อความ:
จักรพรรดิได้รับแอปพลิเคชันจากนางสนมอันเป็นที่รักของเขาสี่คนและไม่สามารถนอนหลับหรือกินได้ เขาจะทำอะไร? หากคุณต้องการทราบว่าจะเกิดอะไรขึ้นต่อไปโปรดฟังรายละเอียดครั้งต่อไป ~~~
สรุป
บทความนี้ส่วนใหญ่แนะนำการดำเนินการตามกระบวนการเสริมเพื่อน
ที่อยู่รหัสในบทความ: https://github.com/fanpan26/springbootlayim
http://xiazai.vevb.com/201712/yuanma/springbootlayim-master.rar
ด้านบนคือ Springboot+Layim+T-io แนะนำให้คุณรู้จักโดยตัวแก้ไข ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!