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 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 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); } }