package com.zswl.dataservice.service.user; import com.alibaba.fastjson.JSONObject; import com.google.gson.JsonObject; import com.zswl.dataservice.config.SystemDefaultConfig; import com.zswl.dataservice.dao.UserDao; import com.zswl.dataservice.domain.user.User; import com.zswl.dataservice.model.mqtt.SendMessageModel; import com.zswl.dataservice.model.user.UpdateUserPassWordParam; import com.zswl.dataservice.service.base.RedisService; import com.zswl.dataservice.service.base.SuperService; import com.zswl.dataservice.type.ResultState; import com.zswl.dataservice.type.UserState; import com.zswl.dataservice.type.UserType; import com.zswl.dataservice.utils.DateUtils; import com.zswl.dataservice.utils.ValidateResult; import com.zswl.dataservice.utils.ValidateUtils; import com.zswl.dataservice.utils.mqtt.mqttConfig.client.MQClient; import com.zswl.dataservice.utils.mqtt.mqttConfig.constant.MQConstant; import com.zswl.dataservice.utils.result.ResultContent; import jakarta.jms.Message; import jakarta.jms.TextMessage; import lombok.extern.slf4j.Slf4j; import org.apache.activemq.artemis.jms.client.ActiveMQBytesMessage; import org.apache.activemq.artemis.jms.client.ActiveMQTopic; import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.annotation.JmsListener; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import java.util.UUID; /** * @author TRX * @date 2024/3/20 */ @Slf4j @Service public class UserService extends SuperService { @Autowired UserDao userDao; @Autowired RedisService redisService; @Autowired MQClient mqClient; /** * 初始超级管理员 * * @return */ public ResultContent initAdmin() { PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); String loginName = "admin"; User user = userDao.findByLoginName(loginName); if (ObjectUtils.isEmpty(user)) { user = new User(); String defaultPassWord = SystemDefaultConfig.defaultPassWord; user.setLoginName(loginName); user.setUserName("超级管理员"); user.setPassWord(passwordEncoder.encode(defaultPassWord)); user.setUserType(UserType.SuperAdmin); user.setIsAdmin(Boolean.TRUE); user.setUserState(UserState.Enable); user.setPhone(""); user.setHeadUrl(""); userDao.save(user); } else { log.info("admin 用户已存在"); } return ResultContent.buildSuccess(); } /** * 编辑当前用户密码 * * @param param * @return */ public ResultContent updateUserPassWord(UpdateUserPassWordParam param) { PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); String userId = getCurrentUserId(); User user = userDao.findTopById(userId); if (ObjectUtils.isEmpty(user)) { return ResultContent.buildFail("当前用户信息为空"); } if (!param.getConfirmPass().equals(param.getPassWord())) { return ResultContent.buildFail("密码和验证密码不一致"); } if (param.getOldPass().equals(param.getPassWord())) { return ResultContent.buildFail("原密码和密码不能一致"); } ValidateResult validateResult = ValidateUtils.validatePassWord(param.getPassWord()); if (!validateResult.isSuccess()) { return ResultContent.buildFail(validateResult.getMsg()); } ResultContent resultContent = checkLoginPassword(userId, param.getOldPass()); if (resultContent.isFailed()) { return resultContent; } user.setPassWord(passwordEncoder.encode(param.getPassWord())); userDao.save(user); return ResultContent.buildSuccess(); } /** * 验证用户密码是否正确 * * @param uid * @param passWord * @return */ public ResultContent checkLoginPassword(String uid, String passWord) { User user = userDao.findTopById(uid); if (user == null) { return ResultContent.buildContent(ResultState.UserNotExists); } PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); return ResultContent.build(passwordEncoder.matches(passWord, user.getPassWord()) ? ResultState.Success : ResultState.UserPasswordError); } /** * 发送指令 * * @param param * @return */ public ResultContent sendMessage(SendMessageModel param) { String msg = "发送成功"; try { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("id", UUID.randomUUID().toString()); jsonObject.addProperty("data", param.getMessage()); jsonObject.addProperty("time", DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternyyyySSS)); jsonObject.addProperty("ttl", 10 * 1000); mqClient.sendObject(param.getTopic(), jsonObject.toString()); log.info("mqtt msg 发送成功"); } catch (Exception e) { e.printStackTrace(); msg = "发送失败: " + e.getMessage(); } return ResultContent.buildSuccess(msg); } // @JmsListener(destination = "#", containerFactory = MQConstant.TopicListenerContainerFactory) @JmsListener(destination = "v1/#", containerFactory = MQConstant.TopicListenerContainerFactory) @JmsListener(destination = "v1.#", containerFactory = MQConstant.TopicListenerContainerFactory) public void receiveMessage(Message message) { // 处理接收到的消息 try { ActiveMQTopic activeMQTopic = (ActiveMQTopic) message.getJMSDestination(); String topicName = activeMQTopic.getTopicName(); if (topicName.equals("activemq.notifications")) { return; } log.info("receiveMessage {} 消息监听clientId: {}", message.getJMSMessageID(), message.getStringProperty("__AMQ_CID")); log.info("Topic: {}", topicName); if (message instanceof ActiveMQBytesMessage) { ActiveMQBytesMessage activeMQBytesMessage = (ActiveMQBytesMessage) message; byte[] messageBody = new byte[(int) activeMQBytesMessage.getBodyLength()]; // 读取消息内容到字节数组 activeMQBytesMessage.readBytes(messageBody); String msg = new String(messageBody); JSONObject json = JSONObject.parseObject(msg); log.info("消息内容:{}", json.getString("msg")); } if (message instanceof TextMessage) { TextMessage textMessage = (TextMessage) message; log.info("textMessage: {}", textMessage.getText()); } } catch (Exception e) { e.printStackTrace(); } } }