Préface
Dans l'article précédent, Spring Boot + Layim + T-IO Téléchargement de fichiers et surveillance de l'état de l'utilisateur, deux petits détails ont été introduits: l'état hors ligne de l'utilisateur et l'état modifient le nombre de personnes. Le principal contenu d'aujourd'hui est la mise en œuvre de l'utilisateur Ajouter des amis.
Introduction
Ajoutez des amis. Tout le monde sait qu'ils ont utilisé QQ. Ce n'est rien de plus que de démarrer une demande d'ami. L'autre partie reçoit une notification de message puis la traite. Cependant, cet article ne parle que de la première moitié, et le traitement des notifications de messages sera laissé à l'article suivant. Parce que le contenu est un peu trop, j'ai peur de ne pas pouvoir le digérer pendant un certain temps. Avant d'introduire le processus principal, permettez-moi d'abord de vous présenter le travail de préparation.
Préparation
Tout d'abord, afin de rapprocher les données du combat réel, j'ai utilisé plus de données utilisateur "réelles". Combiné avec le modèle de mouche, la liaison des données des informations utilisateur dans la tête du centre de l'utilisateur est améliorée. La pièce de liaison des données détermine si vous êtes déjà un ami pour décider si le bouton "Ajouter en tant qu'ami" apparaît. L'exemple est le suivant: Lorsqu'un utilisateur voit sa page d'accueil par lui-même, c'est comme ceci:
Lorsque vous voyez la page d'accueil de l'utilisateur qui n'est pas un ami, cela ressemble à ceci:
La partie de données de liaison, permettez-moi de vous le présenter brièvement, qui est d'utiliser le modèle de thymleaf pour se lier. Lorsque vous accédez à la page en arrière-plan, affectez simplement la valeur du modèle.
/ ** * Attribut Attribut * * / private void setModel (utilisateur utilisateur, modèle modèle) {long currentUserID = getUserId (); Long VisitUserId = user.getId (); // est-ce votre propre booléen iselsel = currentUserid == VisitUserId; // si les deux utilisateurs sont déjà amis Boolean Isfriend = GroupService.isfriend (CurrentUserid, VisitUserId); Map <string, objet> userMap = new HashMap <> (8); userMap.put ("Avatar", user.getAvatar ()); userMap.put ("name", user.getUserName ()); userMap.put ("addtime", timeUtil.formatDate (user.getCreatEat ()) + "join"); if (user.getSign () == null || user.getSign (). length () == 0) {userMap.put ("signe", ""); } else {usermap.put ("signe", "(" + user.getSign () + ")"); } userMap.put ("uid", user.getId ()); usermap.put ("self", est-on -lf || isfriend); Model.AddAttribute ("User", UserMap); }Ensuite, sur la page, extraire les données du modèle.
<div style = "background-image: url ();"> <input type = "Hidden" th: value = "$ {user.uid}" id = "visiter" /> <img src = "" th: src = "$ {user.avatar}" th: alt = "$ {user.name}" /> <h1> <p th: text = "$ {user.name}"> </p> <i> </i> </h1> <p> <! - <i> </i> <span style = "Color: # ff7200;"> 67206flying kiss </span> -> <i> </i> <span <! - <i> </i> <span> depuis hangzhou </span> -> <i th: if = "$ {user.self == false}"> </i> <a lay-event = "addfriend" href = "#" rel = "external nofollow" th: if = "$ {user.self == false} "> addition th: text = "$ {user.sign}"> </p> </div>OK, ce qui précède est la préparation simple. Si vous souhaitez connaître le code détaillé, vous pouvez le rechercher à la fin de l'article.
Lancer une demande d'ami
Suivons d'abord l'analyse commerciale de Layim. Tout d'abord, nous devons savoir qui (TOID) nous voulons ajouter en tant qu'amis. Puis ajoutez une remarque. Il est normal de remettre ces choses au backend. Afin d'éviter les requêtes de table, j'ai fait un nom d'utilisateur redondant et un avatar utilisateur pour le stockage des messages système. Le tableau contient principalement des champs: ID utilisateur, avatar utilisateur, nom d'utilisateur, ID utilisateur appliqué, temps d'application, type d'application, notes, lecture et autres attributs.
Par conséquent, il est très facile de lancer une application d'ami. C'est une fonction ajoutée. Le frontal passe l'ID utilisateur et les notes d'application du répondant. Le back-end organise les données à insérer dans la base de données. Le code est le suivant:
/ ** * Soumettre une application d'ami * * / public JSonResult SavefriendApply (long toid, string Remark) {Remark = htmlutils.htmlescape (remarque); ContextUser user = shiroutil.getCurrentUser (); Long UserId = long.Parselong (user.getUserId ()); int enregistre = applaterRepostory.countByToidAnduidAndTypeArSult (TOID, userId, applicableType.friend, 0); if (enregistrer> 0) {return jsonResult.fail ("après application"); } Appliquer appliquer = new appliquer (); applaiter.setType (applicationType.friend); appliquer.setToid (TOID); appliquer.setRemark (remarque); appliquer.SetUid (utilisateur); appliquer.setavatar (user.getavatar ()); applicable.setName (user.getUserName ()); appliquer.setRead (false); appliquer.setResult (0); retourner SAVEAPPLY (postuler); }Ok, l'application est terminée, qu'allons-nous faire ensuite? C'est vrai, informer l'autre partie, hé, je vous ai envoyé une demande et je l'ai traitée rapidement. J'ai rencontré un problème ici. Étant donné que le programme Springboot occupe le port 8080 et que T-IO occupe le port 8888, c'est-à-dire, si je veux appeler activement le service du service du 8888 dans l'activité du port 8080, je ne sais pas comment obtenir le canalcontext correspondant. Cependant, après avoir demandé l'auteur, mon problème a été résolu en une phrase.
Obtenez ServerGroupContext et le problème est résolu.
Le haricot LayImwebsocketstarter a été enregistré lorsque le programme précédent a été démarré. Donc, si vous pouvez l'obtenir du côté commercial 8080, il n'y aura pas de problème.
Obtenez le LayImWebsocketStStarter, vous pouvez obtenir le serverGroupContext, puis vous pouvez le pousser activement sur le serveur.
Bien sûr, cette chose n'a peut-être pas été développée, et je ne comprends pas très bien le problème ci-dessus. Cela n'a pas d'importance. En fait, je tiens à expliquer que si vous poussez activement les messages au client du côté serveur, utilisez simplement ServerGroupContext.
Push actif sur le serveur
Le code suivant est dans com.fyp.layim.im.common.util.pushutil
Ok, suivez les étapes ci-dessus.
La première étape consiste à obtenir le LayImWebsocketStStarter.
/ ** * Get Starter * / private static LayImWebSocketStarter getStarter () {return (LayImWebSocketStarter) SpringUtil.getBean ("LayImwebSocketStStarter"); }Étape 2: Obtenez ServerGroupContext
STATIQUE STATIQUE PRIVÉE STATIQUE GETTROUP GETERVERGROUPCONTEXT () {return getStarter (). getServerGroupContext (); }La troisième étape consiste à obtenir le canalContext.
/ ** * Get ChannelContext * * / private static channelContext getChannelContext (String TOID) {serverGroupContext context = getServerGroupContext (); // Recherchez l'utilisateur ChannelContext ChannelContext = context.users.find (context, TOID); return channelContext; }La quatrième étape consiste à lancer, et le code ici est presque le même que la partie du code dans le chat. La partie principale consiste à obtenir le canalContext, puis à lui envoyer un message. Si vous n'êtes pas en ligne, ne vous inquiétez pas.
/ ** * Le serveur pousse activement les messages * * / public static void pushApplyMessage (String TOID) {Logger.info ("Exécuter pour envoyer la méthode: pushApplyMessage"); LayImtoclientNoteMsgbody Body = nouveau LayImtoclientNoteMsgBody (); ChannelContext channelContext = getChannelContext (TOID); // Déterminez d'abord s'il est en ligne, puis interrogez la base de données pour réduire le nombre de requêtes if (ChannelContext! = Null &&! ChannelContext.isclosed ()) {int count) body.setCount (count); push (ChannelContext, corps); }} / ** * Le serveur pousse activement les messages * * / private static void push (channelContext ChannelContext, objet msg) {try {wsResponse Response = bodyConvert.getInstance (). ConvertTotexTResponse (msg); AIO.SEND (ChannelContext, Response); } catch (ioException ex) {}}Maintenant que la poussée est effectuée, alors quand sera-t-elle poussée? Étant donné que la poussée des messages dans ce système n'a pas besoin d'être aussi instantanée, j'ai jeté un coup d'œil et j'ai constaté qu'il y avait un mécanisme d'événements similaire à Springboot, donc ApplyEvent est né.
La classe publique ApplyEvent étend ApplicationEvent {public appliqueEvent (objet Source) {super (source); } privé long toid; public long getToid () {return TOID; } public applyEvent (objet source, long toid) {super (source); this.toid = TOID; }}Créez un auditeur pour écouter les événements.
classe publique ApplyListener implémente ApplicationListener <Plateevent> {Private Logger Logger = LoggerFactory.GetLogger (APPLICELLISTENDER.CLASS); @Override public void onApplicationEvent (ApplyEvent ApplyEvent) {new Thread () {public void run () {long TAID = applicableEvent.gettoid (); // Ici, nous appellerons la poussée ci-dessus pushutil.pushApplyMessage (TOID.TOSTRING ()); } }.commencer(); }}Cependant, j'ai une question et j'ai constaté que l'exécution de l'auditeur est synchrone. Plus tard, l'ajout de @async et @enableasync était inutile, j'ai donc utilisé un nouveau thread (). Start () pour réaliser l'asynchrone pour m'assurer qu'il n'affecte pas le processus d'application principal. (C'est une question, je ne l'ai pas compris)
Enfin, n'oubliez pas d'ajouter l'auditeur lorsque l'application démarre.
public static void main (String [] args) {SpringApplication SpringApplication = new SpringApplication (LayImApplication.Class); / ** * Ce n'est que lorsque l'auditeur est ajouté ici, le déclencheur de l'écoute * Appliquer est un événement qui écoute les applications d'amis * * / SpringApplication.AddListeners (new ApplyListener ()); SpringApplication.Run (Args); }Couture fonctionnelle
Il réussira bientôt. Nous corrigeons les événements et publions les événements après le succès de l'application d'ami.
/ ** * Application d'ami * * / @postmapping (value = "/ application-friend") public jsonResult appliquer (@RequestParam ("TOID") Long TOID, @ requestParam ("Remark") Remarque de chaîne) {JSONRESULT Result = applatService.savefriendApply (TOID, remarque); // L'application est réussie, l'événement de demande est publié, notifiez TOID pour traiter le message. S'il n'est pas en ligne, il ne sera pas traité si (resulte.issuccess ()) {applicationContext.publisheVent (new applatEvent ("appliquer", TOID)); } Retour Résultat; }Démonstration fonctionnelle
J'ai tellement parlé, permettez-moi de vous montrer l'effet du produit fini. (Scène de l'utilisateur: un Xiaoniao ajoute l'empereur en tant qu'ami, l'empereur reçoit le message et le vérifie)
L'empereur a reçu le message et le petit numéro 4 dans le coin inférieur gauche est apparu. (Appelez la méthode Layim.msgbox (msgCount))
L'empereur a cliqué sur la zone de message:
L'empereur a reçu des demandes de ses quatre concubines bien-aimés et n'a pas pu dormir ou manger. Que ferait-il? Si vous voulez savoir ce qui se passe ensuite, veuillez écouter la prochaine ventilation ~~~
Résumer
Cet article présente principalement la mise en œuvre d'un processus d'ajout d'amis.
L'adresse du code dans l'article: https://github.com/fanpan26/springbootlayim
http://xiazai.vevb.com/201712/yuanma/springbootlayim-master.rar
Ce qui précède est le Springboot + Layim + T-Io qui vous a été présenté par l'éditeur. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!