123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- package com.huimv.wine.ws;
- import cn.hutool.core.util.ObjectUtil;
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONObject;
- import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
- import com.baomidou.mybatisplus.core.toolkit.StringUtils;
- import com.huimv.wine.entity.Manager;
- import com.huimv.wine.entity.Worker;
- import com.huimv.wine.entity.vo.WsEvent;
- import com.huimv.wine.mapper.DeviceMapper;
- import com.huimv.wine.mapper.ManagerMapper;
- import com.huimv.wine.mapper.WorkerMapper;
- import com.huimv.wine.utils.*;
- import com.huimv.wine.ws.admin.AdminWine;
- import com.huimv.wine.ws.su.SuperDashboard;
- import com.huimv.wine.ws.su.SuperOrder;
- import com.huimv.wine.ws.su.SuperRole;
- import org.springframework.data.redis.core.RedisTemplate;
- import org.springframework.stereotype.Component;
- import org.springframework.util.ObjectUtils;
- import org.springframework.web.socket.handler.TextWebSocketHandler;
- import javax.websocket.*;
- import javax.websocket.server.PathParam;
- import javax.websocket.server.ServerEndpoint;
- import java.io.IOException;
- import java.time.Duration;
- import java.util.HashMap;
- import java.util.Map;
- /**
- * websocket接口处理类
- */
- @Component
- @ServerEndpoint(value = "/manager/{seq}")
- public class ManagerController extends TextWebSocketHandler {
- /**
- * 连接事件,加入注解
- *
- * @param session
- */
- @OnOpen
- public void onOpen(@PathParam(value = "seq") String seq, Session session) {
- String message = "[" + seq + "]加入聊天室!!";
- System.out.println(message);
- // 添加到session的映射关系中
- WebsocketManagerUtil.addSession(seq, session);
- getSecrets(session);
- }
- private void getSecrets(Session session) {
- Map map = new HashMap();
- map.put("public", KeyUtil.getClientPublic());
- map.put("private", KeyUtil.getClientPrivate());
- WsEvent wsEvent = new WsEvent("secrets", map);
- WebsocketWorkerUtil.sendMessage(session, wsEvent);
- }
- /**
- * 连接事件,加入注解
- * 用户断开链接
- *
- * @param seq
- * @param session
- */
- @OnClose
- public void onClose(@PathParam(value = "seq") String seq, Session session) {
- // 删除映射关系
- WebsocketManagerUtil.removeSession(seq);
- // WebsocketManagerUtil.sendMessageForAll(message);
- }
- /**
- * 当接收到用户上传的消息
- *
- * @param token
- * @param session
- */
- @OnMessage
- public void onMessage(@PathParam(value = "token") String token, Session session, String message) {
- RedisTemplate redisTemplate = SpringContextUtil.getBean(RedisTemplate.class);
- JSONObject jsonObject = JSON.parseObject(message);
- String event = (String) jsonObject.get("event");
- JSONObject data = jsonObject.getJSONObject("data");
- if ("login".equals(event)) {
- userLogin(session, token, data);
- } else if ("pin".equals(event)) {
- keepAlive(session);
- } else {
- if (!redisTemplate.hasKey("ManagerToken_" + token)) {
- WebsocketWorkerUtil.sendMessage(session, new WsEvent("tokenExpired", null));
- return;
- }
- ManagerMapper mapper = SpringContextUtil.getBean(ManagerMapper.class);
- String id =(String) redisTemplate.opsForValue().get("ManagerToken_" + token);
- Manager manager = mapper.selectById(id);
- // String worker = (String) redisTemplate.opsForValue().get(token);
- if (event.equals("logout")) {
- userLogout(session, token);
- } else if (event.equals("getUserInfo")) {
- getUserInfo(session,manager);
- } else if (event.startsWith("superDashboard")) {
- SuperDashboard dashboard = new SuperDashboard();
- dashboard.handle(event,data,session,manager);
- } else if (event.startsWith("superRole")) {
- SuperRole superRole = new SuperRole();
- superRole.handle(event,data,session,manager);
- } else if (event.startsWith("superOrder")) {
- SuperOrder superOrder = new SuperOrder();
- superOrder.handle(event, data, session, manager);
- } else if (event.startsWith("superConfig")) {
- } else if (event.startsWith("superRecord")) {
- } else if (event.startsWith("adminDashboard")) {
- } else if (event.startsWith("adminWorker")) {
- } else if (event.startsWith("adminTrade")) {
- } else if (event.startsWith("adminWine")) {
- AdminWine adminWine = SpringContextUtil.getBean(AdminWine.class);
- adminWine.handle(jsonObject, session, manager);
- } else {
- }
- }
- }
- /**
- * 处理用户活连接异常
- *
- * @param session
- * @param throwable
- */
- @OnError
- public void onError(Session session, Throwable throwable) {
- try {
- session.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- throwable.printStackTrace();
- }
- private void userLogin(Session session, String token, Object data) {
- RedisTemplate redisTemplate = SpringContextUtil.getBean(RedisTemplate.class);
- JSONObject jsonObject = (JSONObject) data;
- if (StringUtils.isBlank(jsonObject.getString("account")) || StringUtils.isBlank(jsonObject.getString("password"))) {
- WsEvent wsEvent = new WsEvent("loginResult", Result.fail("参数错误"));
- WebsocketManagerUtil.sendMessage(session, wsEvent);
- return;
- }
- String serverPrivate = KeyUtil.getServerPrivate();
- String realPassword = RSAUtil.decrypt1(jsonObject.getString("password"), serverPrivate);
- if (StringUtils.isBlank(realPassword)) {
- WsEvent wsEvent = new WsEvent("loginResult", Result.fail("解密失败"));
- WebsocketManagerUtil.sendMessage(session, wsEvent);
- return;
- }
- ManagerMapper managerMapper = SpringContextUtil.getBean(ManagerMapper.class);
- QueryWrapper<Manager> queryWrapper = new QueryWrapper<>();
- queryWrapper.eq("account", jsonObject.getString("account")).eq("password", realPassword);
- Manager manager = managerMapper.selectOne(queryWrapper);
- if (ObjectUtil.isEmpty(manager)) {
- WsEvent wsEvent = new WsEvent("loginResult", Result.fail("用户名或密码错误"));
- WebsocketManagerUtil.sendMessage(session, wsEvent);
- return;
- }
- Map<String, Session> sessions = WebsocketManagerUtil.getSessions();
- if (sessions.containsKey(manager.getId())) {
- WsEvent wsEvent = new WsEvent("loginResult", Result.fail("账户已在别处登录"));
- WebsocketManagerUtil.sendMessage(session, wsEvent);
- return;
- }
- token = String.format("ManagerToken_%s", token);
- redisTemplate.opsForValue().set(token, manager.getId(), Duration.ofDays(7));
- JSONObject object = new JSONObject();
- object.put("token", token);
- object.put("super", manager.getIsSuper());
- WsEvent wsEvent = new WsEvent("loginResult", Result.success(token));
- WebsocketManagerUtil.sendMessage(session, wsEvent);
- }
- public void keepAlive(Session session) {
- WsEvent wsEvent = new WsEvent("pon", null);
- WebsocketManagerUtil.sendMessage(session, wsEvent);
- }
- public void getUserInfo(Session session, Manager manager) {
- JSONObject jsonObject = new JSONObject();
- jsonObject.put("id", manager.getId());
- jsonObject.put("super", manager.getIsSuper());
- jsonObject.put("name", manager.getName());
- jsonObject.put("order", manager.getOrder());
- jsonObject.put("income", manager.getIncome());
- WsEvent wsEvent = new WsEvent("userInfo", jsonObject);
- WebsocketManagerUtil.sendMessage(session, wsEvent);
- }
- public void userLogout(Session session,String data) {
- RedisTemplate redisTemplate = SpringContextUtil.getBean(RedisTemplate.class);
- redisTemplate.delete("ManagerToken_" + data);
- WsEvent wsEvent = new WsEvent("logoutResult", null);
- WebsocketManagerUtil.sendMessage(session, wsEvent);
- }
- }
|