|
|
@@ -0,0 +1,226 @@
|
|
|
+package com.zswl.dataservice.service.user.impl;
|
|
|
+
|
|
|
+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.model.user.UserInfoModel;
|
|
|
+import com.zswl.dataservice.service.base.RedisService;
|
|
|
+import com.zswl.dataservice.service.base.SuperService;
|
|
|
+import com.zswl.dataservice.service.user.UserService;
|
|
|
+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 com.zswl.dataservice.utils.bean.BeanUtils;
|
|
|
+
|
|
|
+import java.util.UUID;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author TRX
|
|
|
+ * @date 2024/3/20
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class UserServiceImpl extends SuperService implements UserService {
|
|
|
+ @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();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 得到当前用户信息
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public ResultContent<UserInfoModel> getCurrentUserInfo() {
|
|
|
+ UserInfoModel model = new UserInfoModel();
|
|
|
+ User user = userDao.findTopById(getCurrentUserId());
|
|
|
+ if (ObjectUtils.isEmpty(user)) {
|
|
|
+ return ResultContent.buildFail("当前用户信息为空");
|
|
|
+ }
|
|
|
+ model = toModel(user);
|
|
|
+ return ResultContent.buildSuccess(model);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重置用户密码
|
|
|
+ *
|
|
|
+ * @param id
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public ResultContent resetUserPassWord(String id) {
|
|
|
+ PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
|
|
|
+ User user = userDao.findTopById(id);
|
|
|
+ if (ObjectUtils.isEmpty(user)) {
|
|
|
+ return ResultContent.buildFail(String.format(ResultState.UserNotExists.getRemark()));
|
|
|
+ }
|
|
|
+ user.setPassWord(passwordEncoder.encode(SystemDefaultConfig.defaultPassWord));
|
|
|
+ return ResultContent.buildSuccess();
|
|
|
+ }
|
|
|
+
|
|
|
+ public UserInfoModel toModel(User entity) {
|
|
|
+ UserInfoModel model = new UserInfoModel();
|
|
|
+ if (ObjectUtils.isNotEmpty(entity)) {
|
|
|
+ BeanUtils.copyProperties(entity, model);
|
|
|
+ }
|
|
|
+ return model;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证用户密码是否正确
|
|
|
+ *
|
|
|
+ * @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();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|