ManagerController.java 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. package com.huimv.wine.ws;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.baomidou.mybatisplus.core.toolkit.StringUtils;
  7. import com.huimv.wine.entity.Manager;
  8. import com.huimv.wine.entity.Worker;
  9. import com.huimv.wine.entity.vo.WsEvent;
  10. import com.huimv.wine.mapper.DeviceMapper;
  11. import com.huimv.wine.mapper.ManagerMapper;
  12. import com.huimv.wine.mapper.WorkerMapper;
  13. import com.huimv.wine.utils.*;
  14. import com.huimv.wine.ws.admin.AdminWine;
  15. import com.huimv.wine.ws.su.SuperDashboard;
  16. import com.huimv.wine.ws.su.SuperOrder;
  17. import com.huimv.wine.ws.su.SuperRole;
  18. import org.springframework.data.redis.core.RedisTemplate;
  19. import org.springframework.stereotype.Component;
  20. import org.springframework.util.ObjectUtils;
  21. import org.springframework.web.socket.handler.TextWebSocketHandler;
  22. import javax.websocket.*;
  23. import javax.websocket.server.PathParam;
  24. import javax.websocket.server.ServerEndpoint;
  25. import java.io.IOException;
  26. import java.time.Duration;
  27. import java.util.HashMap;
  28. import java.util.Map;
  29. /**
  30. * websocket接口处理类
  31. */
  32. @Component
  33. @ServerEndpoint(value = "/manager/{seq}")
  34. public class ManagerController extends TextWebSocketHandler {
  35. /**
  36. * 连接事件,加入注解
  37. *
  38. * @param session
  39. */
  40. @OnOpen
  41. public void onOpen(@PathParam(value = "seq") String seq, Session session) {
  42. String message = "[" + seq + "]加入聊天室!!";
  43. System.out.println(message);
  44. // 添加到session的映射关系中
  45. WebsocketManagerUtil.addSession(seq, session);
  46. getSecrets(session);
  47. }
  48. private void getSecrets(Session session) {
  49. Map map = new HashMap();
  50. map.put("public", KeyUtil.getClientPublic());
  51. map.put("private", KeyUtil.getClientPrivate());
  52. WsEvent wsEvent = new WsEvent("secrets", map);
  53. WebsocketWorkerUtil.sendMessage(session, wsEvent);
  54. }
  55. /**
  56. * 连接事件,加入注解
  57. * 用户断开链接
  58. *
  59. * @param seq
  60. * @param session
  61. */
  62. @OnClose
  63. public void onClose(@PathParam(value = "seq") String seq, Session session) {
  64. // 删除映射关系
  65. WebsocketManagerUtil.removeSession(seq);
  66. // WebsocketManagerUtil.sendMessageForAll(message);
  67. }
  68. /**
  69. * 当接收到用户上传的消息
  70. *
  71. * @param token
  72. * @param session
  73. */
  74. @OnMessage
  75. public void onMessage(@PathParam(value = "token") String token, Session session, String message) {
  76. RedisTemplate redisTemplate = SpringContextUtil.getBean(RedisTemplate.class);
  77. JSONObject jsonObject = JSON.parseObject(message);
  78. String event = (String) jsonObject.get("event");
  79. JSONObject data = jsonObject.getJSONObject("data");
  80. if ("login".equals(event)) {
  81. userLogin(session, token, data);
  82. } else if ("pin".equals(event)) {
  83. keepAlive(session);
  84. } else {
  85. if (!redisTemplate.hasKey("ManagerToken_" + token)) {
  86. WebsocketWorkerUtil.sendMessage(session, new WsEvent("tokenExpired", null));
  87. return;
  88. }
  89. ManagerMapper mapper = SpringContextUtil.getBean(ManagerMapper.class);
  90. String id =(String) redisTemplate.opsForValue().get("ManagerToken_" + token);
  91. Manager manager = mapper.selectById(id);
  92. // String worker = (String) redisTemplate.opsForValue().get(token);
  93. if (event.equals("logout")) {
  94. userLogout(session, token);
  95. } else if (event.equals("getUserInfo")) {
  96. getUserInfo(session,manager);
  97. } else if (event.startsWith("superDashboard")) {
  98. SuperDashboard dashboard = new SuperDashboard();
  99. dashboard.handle(event,data,session,manager);
  100. } else if (event.startsWith("superRole")) {
  101. SuperRole superRole = new SuperRole();
  102. superRole.handle(event,data,session,manager);
  103. } else if (event.startsWith("superOrder")) {
  104. SuperOrder superOrder = new SuperOrder();
  105. superOrder.handle(event, data, session, manager);
  106. } else if (event.startsWith("superConfig")) {
  107. } else if (event.startsWith("superRecord")) {
  108. } else if (event.startsWith("adminDashboard")) {
  109. } else if (event.startsWith("adminWorker")) {
  110. } else if (event.startsWith("adminTrade")) {
  111. } else if (event.startsWith("adminWine")) {
  112. AdminWine adminWine = SpringContextUtil.getBean(AdminWine.class);
  113. adminWine.handle(jsonObject, session, manager);
  114. } else {
  115. }
  116. }
  117. }
  118. /**
  119. * 处理用户活连接异常
  120. *
  121. * @param session
  122. * @param throwable
  123. */
  124. @OnError
  125. public void onError(Session session, Throwable throwable) {
  126. try {
  127. session.close();
  128. } catch (IOException e) {
  129. e.printStackTrace();
  130. }
  131. throwable.printStackTrace();
  132. }
  133. private void userLogin(Session session, String token, Object data) {
  134. RedisTemplate redisTemplate = SpringContextUtil.getBean(RedisTemplate.class);
  135. JSONObject jsonObject = (JSONObject) data;
  136. if (StringUtils.isBlank(jsonObject.getString("account")) || StringUtils.isBlank(jsonObject.getString("password"))) {
  137. WsEvent wsEvent = new WsEvent("loginResult", Result.fail("参数错误"));
  138. WebsocketManagerUtil.sendMessage(session, wsEvent);
  139. return;
  140. }
  141. String serverPrivate = KeyUtil.getServerPrivate();
  142. String realPassword = RSAUtil.decrypt1(jsonObject.getString("password"), serverPrivate);
  143. if (StringUtils.isBlank(realPassword)) {
  144. WsEvent wsEvent = new WsEvent("loginResult", Result.fail("解密失败"));
  145. WebsocketManagerUtil.sendMessage(session, wsEvent);
  146. return;
  147. }
  148. ManagerMapper managerMapper = SpringContextUtil.getBean(ManagerMapper.class);
  149. QueryWrapper<Manager> queryWrapper = new QueryWrapper<>();
  150. queryWrapper.eq("account", jsonObject.getString("account")).eq("password", realPassword);
  151. Manager manager = managerMapper.selectOne(queryWrapper);
  152. if (ObjectUtil.isEmpty(manager)) {
  153. WsEvent wsEvent = new WsEvent("loginResult", Result.fail("用户名或密码错误"));
  154. WebsocketManagerUtil.sendMessage(session, wsEvent);
  155. return;
  156. }
  157. Map<String, Session> sessions = WebsocketManagerUtil.getSessions();
  158. if (sessions.containsKey(manager.getId())) {
  159. WsEvent wsEvent = new WsEvent("loginResult", Result.fail("账户已在别处登录"));
  160. WebsocketManagerUtil.sendMessage(session, wsEvent);
  161. return;
  162. }
  163. token = String.format("ManagerToken_%s", token);
  164. redisTemplate.opsForValue().set(token, manager.getId(), Duration.ofDays(7));
  165. JSONObject object = new JSONObject();
  166. object.put("token", token);
  167. object.put("super", manager.getIsSuper());
  168. WsEvent wsEvent = new WsEvent("loginResult", Result.success(token));
  169. WebsocketManagerUtil.sendMessage(session, wsEvent);
  170. }
  171. public void keepAlive(Session session) {
  172. WsEvent wsEvent = new WsEvent("pon", null);
  173. WebsocketManagerUtil.sendMessage(session, wsEvent);
  174. }
  175. public void getUserInfo(Session session, Manager manager) {
  176. JSONObject jsonObject = new JSONObject();
  177. jsonObject.put("id", manager.getId());
  178. jsonObject.put("super", manager.getIsSuper());
  179. jsonObject.put("name", manager.getName());
  180. jsonObject.put("order", manager.getOrder());
  181. jsonObject.put("income", manager.getIncome());
  182. WsEvent wsEvent = new WsEvent("userInfo", jsonObject);
  183. WebsocketManagerUtil.sendMessage(session, wsEvent);
  184. }
  185. public void userLogout(Session session,String data) {
  186. RedisTemplate redisTemplate = SpringContextUtil.getBean(RedisTemplate.class);
  187. redisTemplate.delete("ManagerToken_" + data);
  188. WsEvent wsEvent = new WsEvent("logoutResult", null);
  189. WebsocketManagerUtil.sendMessage(session, wsEvent);
  190. }
  191. }