瀏覽代碼

增加角色,项目,项目组管理

yangxiaokun 3 年之前
父節點
當前提交
cca1cafab5
共有 43 個文件被更改,包括 1302 次插入101 次删除
  1. 13 0
      pom.xml
  2. 2 0
      src/main/java/com/zy/bms/common/Constant.java
  3. 10 0
      src/main/java/com/zy/bms/common/controller/BaseController.java
  4. 26 0
      src/main/java/com/zy/bms/common/io/pc/AdminIO.java
  5. 0 2
      src/main/java/com/zy/bms/common/io/pc/DeviceIO.java
  6. 22 0
      src/main/java/com/zy/bms/common/io/pc/GroupIO.java
  7. 22 0
      src/main/java/com/zy/bms/common/io/pc/ItemIO.java
  8. 18 0
      src/main/java/com/zy/bms/common/io/pc/RoleIO.java
  9. 47 0
      src/main/java/com/zy/bms/common/vo/AdminListVo.java
  10. 48 0
      src/main/java/com/zy/bms/common/vo/GroupListVo.java
  11. 4 86
      src/main/java/com/zy/bms/config/mqtt/MqttCallbackHandler.java
  12. 43 3
      src/main/java/com/zy/bms/controller/pc/AdminController.java
  13. 34 0
      src/main/java/com/zy/bms/controller/pc/GroupController.java
  14. 54 0
      src/main/java/com/zy/bms/controller/pc/ItemController.java
  15. 34 0
      src/main/java/com/zy/bms/controller/pc/RoleController.java
  16. 10 0
      src/main/java/com/zy/bms/mapper/AdminMapper.java
  17. 7 0
      src/main/java/com/zy/bms/mapper/DeviceMapper.java
  18. 27 0
      src/main/java/com/zy/bms/mapper/GroupMapper.java
  19. 35 0
      src/main/java/com/zy/bms/mapper/ItemMapper.java
  20. 26 0
      src/main/java/com/zy/bms/mapper/RoleMapper.java
  21. 36 4
      src/main/java/com/zy/bms/model/Admin.java
  22. 57 0
      src/main/java/com/zy/bms/model/Group.java
  23. 53 0
      src/main/java/com/zy/bms/model/Item.java
  24. 43 0
      src/main/java/com/zy/bms/model/Role.java
  25. 47 0
      src/main/java/com/zy/bms/schedule/DeviceStatusSchedule.java
  26. 42 4
      src/main/java/com/zy/bms/service/AdminService.java
  27. 9 0
      src/main/java/com/zy/bms/service/DeviceService.java
  28. 27 0
      src/main/java/com/zy/bms/service/IGroupService.java
  29. 39 0
      src/main/java/com/zy/bms/service/IItemService.java
  30. 24 0
      src/main/java/com/zy/bms/service/IRoleService.java
  31. 122 0
      src/main/java/com/zy/bms/service/RabbitMQApi.java
  32. 29 0
      src/main/java/com/zy/bms/service/impl/GroupServiceImpl.java
  33. 48 0
      src/main/java/com/zy/bms/service/impl/ItemServiceImpl.java
  34. 28 0
      src/main/java/com/zy/bms/service/impl/RoleServiceImpl.java
  35. 4 1
      src/main/java/com/zy/bms/utils/CodeGenerator.java
  36. 11 0
      src/main/java/com/zy/bms/utils/HttpUtil.java
  37. 26 1
      src/main/java/com/zy/bms/utils/MD5Util.java
  38. 33 0
      src/main/resources/mapper/AdminMapping.xml
  39. 15 0
      src/main/resources/mapper/DeviceMapping.xml
  40. 24 0
      src/main/resources/mapper/GroupMapper.xml
  41. 26 0
      src/main/resources/mapper/ItemMapper.xml
  42. 17 0
      src/main/resources/mapper/RoleMapper.xml
  43. 60 0
      src/test/java/com/zy/bms/MybatisPlusGenerator.java

+ 13 - 0
pom.xml

@@ -78,6 +78,19 @@
             <version>3.4.0</version>
         </dependency>
 
+        <!-- Mybatis-plus 代码生成器-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>3.4.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.freemarker</groupId>
+            <artifactId>freemarker</artifactId>
+            <version>2.3.30</version>
+        </dependency>
+
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>

+ 2 - 0
src/main/java/com/zy/bms/common/Constant.java

@@ -6,6 +6,8 @@ package com.zy.bms.common;
  */
 public class Constant {
 
+
+    public static final String OLD_PHONE_DEVICE_ID_PREFIX = "op_";//老人机项目设备注册MQTT用户名前缀
     /**
      * redis key前缀
      */

+ 10 - 0
src/main/java/com/zy/bms/common/controller/BaseController.java

@@ -24,6 +24,7 @@ public class BaseController {
     }
 
     /**
+     * 微信小程序
      * 获取用户ID
      */
     public String getUserId() {
@@ -31,4 +32,13 @@ public class BaseController {
         if (userId == null) throw new ApiRuntimeException("未登录");
         return userId;
     }
+
+    /**
+     * 获取token
+     */
+    public String getToken() {
+        String token = request.getHeader("token");
+        if (token == null) throw new ApiRuntimeException("未登录");
+        return token;
+    }
 }

+ 26 - 0
src/main/java/com/zy/bms/common/io/pc/AdminIO.java

@@ -0,0 +1,26 @@
+package com.zy.bms.common.io.pc;
+
+import com.zy.bms.common.io.PageIO;
+import lombok.Data;
+
+/**
+ * PC 用户查询IO
+ *
+ * @author yang xiao kun
+ * create on 2021/5/18
+ */
+@Data
+public class AdminIO extends PageIO {
+    /**
+     * 用户名或手机号或昵称
+     */
+    private String key;
+    /**
+     * 状态
+     */
+    private Integer status;
+    /**
+     * 角色
+     */
+    private Integer role;
+}

+ 0 - 2
src/main/java/com/zy/bms/common/io/pc/DeviceIO.java

@@ -2,7 +2,6 @@ package com.zy.bms.common.io.pc;
 
 import com.zy.bms.common.io.PageIO;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
 
 /**
  * 设备查询入参
@@ -11,7 +10,6 @@ import lombok.EqualsAndHashCode;
  * create on 2021/2/18
  */
 @Data
-@EqualsAndHashCode(callSuper = true)
 public class DeviceIO extends PageIO {
     /**
      * 设备码

+ 22 - 0
src/main/java/com/zy/bms/common/io/pc/GroupIO.java

@@ -0,0 +1,22 @@
+package com.zy.bms.common.io.pc;
+
+import com.zy.bms.common.io.PageIO;
+import lombok.Data;
+
+/**
+ * 项目组 入参
+ *
+ * @author yang xiao kun
+ * create on 2021/5/19
+ */
+@Data
+public class GroupIO extends PageIO {
+    /**
+     * 项目组名/项目组编号
+     */
+    private String key;
+    /**
+     * 状态
+     */
+    private Integer status;
+}

+ 22 - 0
src/main/java/com/zy/bms/common/io/pc/ItemIO.java

@@ -0,0 +1,22 @@
+package com.zy.bms.common.io.pc;
+
+import com.zy.bms.common.io.PageIO;
+import lombok.Data;
+
+/**
+ * 项目 入参
+ *
+ * @author yang xiao kun
+ * create on 2021/5/19
+ */
+@Data
+public class ItemIO extends PageIO {
+    /**
+     * 项目名/项目编号
+     */
+    private String key;
+    /**
+     * 状态
+     */
+    private Integer status;
+}

+ 18 - 0
src/main/java/com/zy/bms/common/io/pc/RoleIO.java

@@ -0,0 +1,18 @@
+package com.zy.bms.common.io.pc;
+
+import com.zy.bms.common.io.PageIO;
+import lombok.Data;
+
+/**
+ * PC 角色查询IO
+ *
+ * @author yang xiao kun
+ * create on 2021/5/18
+ */
+@Data
+public class RoleIO extends PageIO {
+    /**
+     * 角色名
+     */
+    private String name;
+}

+ 47 - 0
src/main/java/com/zy/bms/common/vo/AdminListVo.java

@@ -0,0 +1,47 @@
+package com.zy.bms.common.vo;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * PC用户列表查询 视图
+ *
+ * @author yang xiao kun
+ * create on 2021/5/19
+ */
+@Data
+public class AdminListVo {
+
+    private Integer id;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 昵称
+     */
+    private String nickname;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+    /**
+     * 角色
+     */
+    private String role;
+
+    /**
+     * 状态 0停用 1启用
+     */
+    private Integer status;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+}

+ 48 - 0
src/main/java/com/zy/bms/common/vo/GroupListVo.java

@@ -0,0 +1,48 @@
+package com.zy.bms.common.vo;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * PC用户列表查询 视图
+ *
+ * @author yang xiao kun
+ * create on 2021/5/19
+ */
+@Data
+public class GroupListVo {
+
+    private Integer id;
+
+    /**
+     * 项目组编号
+     */
+    private String code;
+
+    /**
+     * 项目组名称
+     */
+    private String name;
+
+    /**
+     * 项目
+     */
+    private String item;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 0:禁用 1:启用
+     */
+    private Integer status;
+
+}

+ 4 - 86
src/main/java/com/zy/bms/config/mqtt/MqttCallbackHandler.java

@@ -1,6 +1,5 @@
 package com.zy.bms.config.mqtt;
 
-import com.alibaba.fastjson.JSON;
 import com.zy.bms.common.Constant;
 import com.zy.bms.common.dto.MqttMsgDto;
 import com.zy.bms.common.exception.ApiRuntimeException;
@@ -10,12 +9,9 @@ import com.zy.bms.utils.*;
 import com.zy.bms.utils.CoordTransformUtil;
 import com.zy.bms.utils.GaoDeApiUtil;
 import com.zy.bms.websocket.WebSocketServer;
-import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
-import java.util.HashMap;
-import java.util.Map;
 
 /**
  * MQTT 消息返回处理类
@@ -42,6 +38,8 @@ public class MqttCallbackHandler {
     private CallRecordsService callRecordsService;
     @Resource
     private MqttLogService mqttLogService;
+    @Resource
+    private RabbitMQApi rabbitMQApi;
 
     /**
      * 处理消息
@@ -85,7 +83,7 @@ public class MqttCallbackHandler {
             device = createDevice(num);
         }
         //mqtt服务器注册用户
-        registerMqtt(device.getClientId(), device.getPassword());
+        rabbitMQApi.registerMqtt(device.getClientId(), device.getPassword());
         //发送消息
         setToDeviceService.returnCodeToDevice(device);
     }
@@ -125,7 +123,7 @@ public class MqttCallbackHandler {
     private Device createDevice(String num) {
         Device device = new Device();
         device.setNum(num);
-        String clientId = MD5Util.MD5Encode(num);
+        String clientId = Constant.OLD_PHONE_DEVICE_ID_PREFIX + MD5Util.MD5Encode(num);
         device.setClientId(clientId);
         device.setPassword(MD5Util.MD5Encode(clientId));
         device.setGroupId(1);
@@ -165,84 +163,4 @@ public class MqttCallbackHandler {
             throw new ApiRuntimeException("处理设备上传位置定位信息出错");
         }
     }
-
-
-    /**
-     * 向 MQTT 服务器申请用户,供设备进行登录
-     * <p>
-     * 因为存在先后问题,需要先注册用户,在开通虚拟机权限,
-     * 所以逻辑为
-     * 发送注册用户请求
-     * 尝试申请权限
-     * 如果失败,则间隔一秒再次请求
-     * 如果申请次数超过3次,则尝试重新注册
-     * 重新注册后再次尝试申请
-     * 如果申请五次都失败,则结束方法,记录日志
-     *
-     * @param clientId 设备登录ID
-     * @param password 设备登录密码
-     */
-    private void registerMqtt(String clientId, String password) {
-        addRabbitMqUser(clientId, password);
-        int count = 0;
-        while (!setPermission(clientId)) {
-            try {
-                Thread.sleep(1000);
-                if (count == 2) {
-                    addRabbitMqUser(clientId, password);
-                }
-                if (count > 4) {
-                    break;
-                }
-                count++;
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-                break;
-            }
-        }
-    }
-
-    /**
-     * 注册 RabbitMQ 用户
-     *
-     * @param clientId 用户名
-     * @param password 用户密码
-     */
-    private void addRabbitMqUser(String clientId, String password) {
-        String url = "http://view.ailishi.org:15672/api/users/" + clientId;
-        //请求头
-        HttpHeaders headers = new HttpHeaders();
-        headers.add("authorization", "Basic bHEyMDE5OkxpUXVhblJhYmJpdA==");
-        //请求参数
-        Map<String, String> params = new HashMap<>();
-        params.put("username", clientId);
-        params.put("password", password);
-        params.put("tags", "");
-        HttpUtil.putForJSONEntity(url, headers, JSON.toJSONString(params));
-    }
-
-    /**
-     * 申请虚拟机权限
-     *
-     * @param clientId 用户ID
-     */
-    private boolean setPermission(String clientId) {
-        String url = "http://view.ailishi.org:15672/api/permissions/%2F/" + clientId;
-        //请求头
-        HttpHeaders headers = new HttpHeaders();
-        headers.add("authorization", "Basic bHEyMDE5OkxpUXVhblJhYmJpdA==");
-        //请求参数
-        Map<String, String> params = new HashMap<>();
-        params.put("username", clientId);
-        params.put("vhost", "/");
-        params.put("configure", ".*");
-        params.put("write", ".*");
-        params.put("read", ".*");
-        try {
-            HttpUtil.putForJSONEntity(url, headers, JSON.toJSONString(params));
-        } catch (Exception e) {
-            return false;
-        }
-        return true;
-    }
 }

+ 43 - 3
src/main/java/com/zy/bms/controller/pc/AdminController.java

@@ -1,6 +1,8 @@
 package com.zy.bms.controller.pc;
 
 import com.zy.bms.common.ServerResponse;
+import com.zy.bms.common.controller.BaseController;
+import com.zy.bms.common.io.pc.AdminIO;
 import com.zy.bms.model.Admin;
 import com.zy.bms.common.redis.SessionManager;
 import com.zy.bms.service.AdminService;
@@ -22,7 +24,7 @@ import java.util.Map;
  */
 @RestController
 @RequestMapping("bms/api/pc/admin")
-public class AdminController {
+public class AdminController extends BaseController {
 
     @Resource
     private AdminService adminService;
@@ -35,9 +37,10 @@ public class AdminController {
      */
     @PostMapping("login.do")
     public ServerResponse login(String username, String password) {
-        password = MD5Util.MD5Encode(password);
-        Admin admin = adminService.getByUsername(username);
+        Admin admin = adminService.getByUsernameOrPhone(username);
         if (admin == null) return ServerResponse.createByWarning("用户不存在");
+        //MD5密码
+        password = MD5Util.MD5Encode(password, admin.getSalt());
         if (!admin.getPassword().equals(password)) return ServerResponse.createByWarning("密码错误");
         // 返回 token 和 昵称
         Map<String, String> result = new HashMap<>();
@@ -46,6 +49,43 @@ public class AdminController {
         return ServerResponse.createBySuccess(result);
     }
 
+    /**
+     * 添加用户
+     */
+    @PostMapping("save.do")
+    public ServerResponse save(Admin admin) {
+        Admin current = sessionManager.getUser(getToken());
+        if (current == null || current.getRole() != 1) return ServerResponse.createByWarning("无权限");
+        adminService.saveAdmin(admin);
+        return ServerResponse.createBySuccess();
+    }
+
+    /**
+     * 禁用
+     */
+    @PostMapping("forbidden.do")
+    public ServerResponse forbidden(Integer id) {
+        adminService.updateStatus(id, 0);
+        return ServerResponse.createBySuccess();
+    }
+
+    /**
+     * 启用
+     */
+    @PostMapping("permit.do")
+    public ServerResponse permit(Integer id) {
+        adminService.updateStatus(id, 1);
+        return ServerResponse.createBySuccess();
+    }
+
+    /**
+     * 分页查询管理员列表
+     */
+    @PostMapping("listPage.do")
+    public ServerResponse listPage(AdminIO io) {
+        return ServerResponse.createBySuccess(adminService.listPage(io));
+    }
+
     /**
      * token 验证
      */

+ 34 - 0
src/main/java/com/zy/bms/controller/pc/GroupController.java

@@ -0,0 +1,34 @@
+package com.zy.bms.controller.pc;
+
+import com.zy.bms.common.ServerResponse;
+import com.zy.bms.common.io.pc.GroupIO;
+import com.zy.bms.service.IGroupService;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ * 项目组 前端控制器
+ * </p>
+ *
+ * @author chenyi
+ * @since 2021-05-19
+ */
+@RestController
+@RequestMapping("/builder/group")
+public class GroupController {
+    @Resource
+    private IGroupService groupService;
+
+    /**
+     * 分页查询所有项目
+     */
+    @PostMapping("listPage")
+    public ServerResponse listPage(GroupIO io) {
+        return ServerResponse.createBySuccess(groupService.listPage(io));
+    }
+
+}

+ 54 - 0
src/main/java/com/zy/bms/controller/pc/ItemController.java

@@ -0,0 +1,54 @@
+package com.zy.bms.controller.pc;
+
+import com.zy.bms.common.ServerResponse;
+import com.zy.bms.common.io.pc.ItemIO;
+import com.zy.bms.model.Item;
+import com.zy.bms.service.IItemService;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ * 项目表 前端控制器
+ * </p>
+ *
+ * @author chenyi
+ * @since 2021-05-19
+ */
+@RestController
+@RequestMapping("/builder/item")
+public class ItemController {
+
+    @Resource
+    private IItemService itemService;
+
+    /**
+     * 分页查询所有项目
+     */
+    @PostMapping("listPage.do")
+    public ServerResponse listPage(ItemIO io) {
+        return ServerResponse.createBySuccess(itemService.listPage(io));
+    }
+
+    /**
+     * 添加项目
+     */
+    @PostMapping("save.do")
+    public ServerResponse save(Item item) {
+        if (itemService.checkRepeat(item.getCode())) return ServerResponse.createByWarning("添加失败:项目编号重复");
+        return ServerResponse.createBySuccess(itemService.save(item));
+    }
+
+    /**
+     * 禁用项目
+     */
+    @PostMapping("forbidden.do")
+    public ServerResponse forbidden(Integer id) {
+        if (itemService.checkRepeat(item.getCode())) return ServerResponse.createByWarning("添加失败:项目编号重复");
+        return ServerResponse.createBySuccess(itemService.save(item));
+    }
+
+}

+ 34 - 0
src/main/java/com/zy/bms/controller/pc/RoleController.java

@@ -0,0 +1,34 @@
+package com.zy.bms.controller.pc;
+
+import com.zy.bms.common.ServerResponse;
+import com.zy.bms.common.io.pc.RoleIO;
+import com.zy.bms.service.IRoleService;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ * 角色表 前端控制器
+ * </p>
+ *
+ * @author chenyi
+ * @since 2021-05-19
+ */
+@RestController
+@RequestMapping("/builder/role")
+public class RoleController {
+
+    @Resource
+    private IRoleService roleService;
+
+    /**
+     * 分页查询所有项目
+     */
+    @PostMapping("listPage")
+    public ServerResponse listPage(RoleIO io) {
+        return ServerResponse.createBySuccess(roleService.listPage(io));
+    }
+}

+ 10 - 0
src/main/java/com/zy/bms/mapper/AdminMapper.java

@@ -1,8 +1,13 @@
 package com.zy.bms.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zy.bms.common.io.pc.AdminIO;
+import com.zy.bms.common.vo.AdminListVo;
 import com.zy.bms.model.Admin;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
 /**
@@ -14,4 +19,9 @@ import org.springframework.stereotype.Repository;
 @Mapper
 @Repository
 public interface AdminMapper extends BaseMapper<Admin> {
+
+    /**
+     * 分页查询管理员
+     */
+    IPage<AdminListVo> listPage(Page<AdminListVo> page, @Param("io") AdminIO io);
 }

+ 7 - 0
src/main/java/com/zy/bms/mapper/DeviceMapper.java

@@ -9,6 +9,8 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * @author chenyi
  * Create on 2020/4/10
@@ -33,4 +35,9 @@ public interface DeviceMapper extends BaseMapper<Device> {
      * @param name 名称
      */
     void updateName(@Param("num") String num, @Param("name") String name);
+
+    /**
+     * 批量更新设备在线状态
+     */
+    void updateDeviceStatus(List<Device> devices);
 }

+ 27 - 0
src/main/java/com/zy/bms/mapper/GroupMapper.java

@@ -0,0 +1,27 @@
+package com.zy.bms.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zy.bms.common.io.pc.GroupIO;
+import com.zy.bms.common.vo.GroupListVo;
+import com.zy.bms.model.Group;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 项目组 Mapper 接口
+ * </p>
+ *
+ * @author chenyi
+ * @since 2021-05-19
+ */
+public interface GroupMapper extends BaseMapper<Group> {
+    /**
+     * 分页查询
+     *
+     * @param page 分页信息
+     * @param io   查询条件
+     */
+    IPage<GroupListVo> listPage(Page<GroupListVo> page, @Param("io") GroupIO io);
+}

+ 35 - 0
src/main/java/com/zy/bms/mapper/ItemMapper.java

@@ -0,0 +1,35 @@
+package com.zy.bms.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zy.bms.common.io.pc.ItemIO;
+import com.zy.bms.model.Item;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 项目表 Mapper 接口
+ * </p>
+ *
+ * @author chenyi
+ * @since 2021-05-19
+ */
+public interface ItemMapper extends BaseMapper<Item> {
+    /**
+     * 分页查询
+     *
+     * @param page 分页信息
+     * @param io   查询条件
+     */
+    IPage<Item> listPage(Page<Item> page, @Param("io") ItemIO io);
+
+    /**
+     * 项目编号查重
+     *
+     * @param code 项目编号
+     */
+    int checkRepeat(@Param("code") String code);
+
+
+}

+ 26 - 0
src/main/java/com/zy/bms/mapper/RoleMapper.java

@@ -0,0 +1,26 @@
+package com.zy.bms.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zy.bms.common.io.pc.RoleIO;
+import com.zy.bms.model.Role;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 角色表 Mapper 接口
+ * </p>
+ *
+ * @author chenyi
+ * @since 2021-05-19
+ */
+public interface RoleMapper extends BaseMapper<Role> {
+    /**
+     * 分页查询
+     *
+     * @param page 分页信息
+     * @param io   查询条件
+     */
+    IPage<Role> listPage(Page<Role> page, @Param("io") RoleIO io);
+}

+ 36 - 4
src/main/java/com/zy/bms/model/Admin.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
+import java.time.LocalDateTime;
+
 /**
  * PC 管理员
  *
@@ -17,13 +19,43 @@ public class Admin {
     @TableId
     private Integer id;
 
-    //用户名
+    /**
+     * 用户名
+     */
     private String username;
 
-    //密码
+    /**
+     * 昵称
+     */
+    private String nickname;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+    /**
+     * 密码
+     */
     private String password;
 
-    //昵称
-    private String nickname;
+    /**
+     * 密码盐值
+     */
+    private String salt;
+
+    /**
+     * 角色ID
+     */
+    private Integer role;
+
+    /**
+     * 状态 0停用 1启用
+     */
+    private Integer status;
 
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
 }

+ 57 - 0
src/main/java/com/zy/bms/model/Group.java

@@ -0,0 +1,57 @@
+package com.zy.bms.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 项目组
+ * </p>
+ *
+ * @author chenyi
+ * @since 2021-05-19
+ */
+@Data
+@TableName("group")
+public class Group implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId
+    private Integer id;
+
+    /**
+     * 项目ID
+     */
+    private Integer itemId;
+
+    /**
+     * 项目组编号
+     */
+    private String code;
+
+    /**
+     * 项目组名称
+     */
+    private String name;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 0:禁用 1:启用
+     */
+    private Integer status;
+
+}

+ 53 - 0
src/main/java/com/zy/bms/model/Item.java

@@ -0,0 +1,53 @@
+package com.zy.bms.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 项目表
+ * </p>
+ *
+ * @author chenyi
+ * @since 2021-05-19
+ */
+@Data
+@TableName("item")
+public class Item implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId
+    private Integer id;
+
+    /**
+     * 项目代号
+     */
+    private String code;
+
+    /**
+     * 项目名
+     */
+    private String name;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 0:禁用 1:启用
+     */
+    private Integer status;
+
+
+}

+ 43 - 0
src/main/java/com/zy/bms/model/Role.java

@@ -0,0 +1,43 @@
+package com.zy.bms.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 角色表
+ * </p>
+ *
+ * @author chenyi
+ * @since 2021-05-19
+ */
+@Data
+@TableName("role")
+public class Role implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId
+    private Integer id;
+
+    /**
+     * 角色名
+     */
+    private String name;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 47 - 0
src/main/java/com/zy/bms/schedule/DeviceStatusSchedule.java

@@ -0,0 +1,47 @@
+package com.zy.bms.schedule;
+
+import com.zy.bms.model.Device;
+import com.zy.bms.service.DeviceService;
+import com.zy.bms.service.RabbitMQApi;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 定时更新设备在线状态
+ *
+ * @author yang xiao kun
+ * create on 2021/5/14
+ */
+@EnableAsync
+@Configuration
+@EnableScheduling
+public class DeviceStatusSchedule {
+
+    @Autowired
+    private RabbitMQApi rabbitMQApi;
+    @Autowired
+    private DeviceService deviceService;
+
+    /**
+     * 更新频率 2分钟
+     * 定时更新设备在线状态
+     */
+    @Async
+    @Scheduled(cron = "0 0/2 * * * ?")
+    public void updateDeviceStatus() {
+        //全部的设备
+        List<Device> devices = deviceService.list();
+        Set<String> online = rabbitMQApi.getOnlineDevice();
+        for (Device item : devices) {
+            item.setStatus(online.contains(item.getClientId()) ? 1 : 0);
+        }
+        deviceService.updateDeviceStatus(devices);
+    }
+}

+ 42 - 4
src/main/java/com/zy/bms/service/AdminService.java

@@ -1,9 +1,17 @@
 package com.zy.bms.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.bms.common.io.pc.AdminIO;
+import com.zy.bms.common.vo.AdminListVo;
 import com.zy.bms.mapper.AdminMapper;
 import com.zy.bms.model.Admin;
+import com.zy.bms.utils.CodeGenerator;
+import com.zy.bms.utils.MD5Util;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Service;
 
 /**
@@ -16,13 +24,43 @@ import org.springframework.stereotype.Service;
 public class AdminService extends ServiceImpl<AdminMapper, Admin> {
 
     /**
-     * 通过用户名查询用户信息
+     * 分页查询管理员列表
+     */
+    public IPage<AdminListVo> listPage(@Param("io") AdminIO io) {
+        Page<AdminListVo> page = new Page<>(io.getCurrent(), io.getSize());
+        return baseMapper.listPage(page, io);
+    }
+
+    /**
+     * 查询用户信息
      *
-     * @param username 用户名
+     * @param content 用户名 或 密码
      */
-    public Admin getByUsername(String username) {
+    public Admin getByUsernameOrPhone(String content) {
         QueryWrapper<Admin> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("username", username);
+        queryWrapper.eq("username", content).or().eq("phone", content);
         return baseMapper.selectOne(queryWrapper);
     }
+
+    /**
+     * 添加用户
+     */
+    public void saveAdmin(Admin admin) {
+        admin.setSalt(CodeGenerator.shortUuid());
+        admin.setPassword(MD5Util.MD5Encode(admin.getPassword(), admin.getSalt()));
+        admin.setStatus(1);
+        save(admin);
+    }
+
+    /**
+     * 更新用户状态
+     *
+     * @param id     主键ID
+     * @param status 状态
+     */
+    public void updateStatus(Integer id, Integer status) {
+        UpdateWrapper<Admin> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.set("status", status).eq("id", id);
+        update(updateWrapper);
+    }
 }

+ 9 - 0
src/main/java/com/zy/bms/service/DeviceService.java

@@ -10,6 +10,8 @@ import com.zy.bms.mapper.DeviceMapper;
 import com.zy.bms.model.Device;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 
 /**
  * 设备信息相关
@@ -31,6 +33,13 @@ public class DeviceService extends ServiceImpl<DeviceMapper, Device> {
         return baseMapper.getListPage(page, io);
     }
 
+    /**
+     * 批量更新设备在线状态
+     */
+    public void updateDeviceStatus(List<Device> devices) {
+        baseMapper.updateDeviceStatus(devices);
+    }
+
     /**
      * 通过设备 num 获取设备信息
      *

+ 27 - 0
src/main/java/com/zy/bms/service/IGroupService.java

@@ -0,0 +1,27 @@
+package com.zy.bms.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.bms.common.io.pc.GroupIO;
+import com.zy.bms.common.vo.GroupListVo;
+import com.zy.bms.model.Group;
+
+/**
+ * <p>
+ * 项目组 服务类
+ * </p>
+ *
+ * @author chenyi
+ * @since 2021-05-19
+ */
+public interface IGroupService extends IService<Group> {
+
+    /**
+     * 分页查询
+     *
+     * @param io 查询条件
+     */
+    IPage<GroupListVo> listPage(GroupIO io);
+
+
+}

+ 39 - 0
src/main/java/com/zy/bms/service/IItemService.java

@@ -0,0 +1,39 @@
+package com.zy.bms.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.bms.common.io.pc.ItemIO;
+import com.zy.bms.model.Item;
+
+/**
+ * <p>
+ * 项目表 服务类
+ * </p>
+ *
+ * @author chenyi
+ * @since 2021-05-19
+ */
+public interface IItemService extends IService<Item> {
+
+    /**
+     * 分页查询
+     *
+     * @param io 查询条件
+     */
+    IPage<Item> listPage(ItemIO io);
+
+    /**
+     * 项目编号查重
+     *
+     * @param code 项目编号
+     */
+    boolean checkRepeat(String code);
+
+    /**
+     * 更新用户状态
+     *
+     * @param id     主键ID
+     * @param status 状态
+     */
+    void updateStatus(Integer id, Integer status);
+}

+ 24 - 0
src/main/java/com/zy/bms/service/IRoleService.java

@@ -0,0 +1,24 @@
+package com.zy.bms.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zy.bms.common.io.pc.RoleIO;
+import com.zy.bms.model.Role;
+
+/**
+ * <p>
+ * 角色表 服务类
+ * </p>
+ *
+ * @author chenyi
+ * @since 2021-05-19
+ */
+public interface IRoleService extends IService<Role> {
+
+    /**
+     * 分页查询
+     *
+     * @param io 查询条件
+     */
+    IPage<Role> listPage(RoleIO io);
+}

+ 122 - 0
src/main/java/com/zy/bms/service/RabbitMQApi.java

@@ -0,0 +1,122 @@
+package com.zy.bms.service;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.zy.bms.utils.HttpUtil;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * RabbitMQ HTTP API接口请求
+ *
+ * @author yang xiao kun
+ * create on 2021/5/14
+ */
+@Component
+public class RabbitMQApi {
+
+    /**
+     * 获取在线的设备
+     */
+    public Set<String> getOnlineDevice() {
+        String url = "http://view.ailishi.org:15672/api/connections?page=1&page_size=500";
+        //请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("authorization", "Basic bHEyMDE5OkxpUXVhblJhYmJpdA==");
+        String httpRes = HttpUtil.getForEntity(url, headers);
+        Set<String> result = new HashSet<>();
+        if (httpRes != null) {
+            JSONObject jsonObject = JSON.parseObject(httpRes);
+            JSONArray jsonArray = jsonObject.getJSONArray("items");
+            for (int i = 0; i < jsonArray.size(); i++) {
+                result.add(jsonArray.getJSONObject(i).getString("user"));
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 向 MQTT 服务器申请用户,供设备进行登录
+     * <p>
+     * 因为存在先后问题,需要先注册用户,在开通虚拟机权限,
+     * 所以逻辑为
+     * 发送注册用户请求
+     * 尝试申请权限
+     * 如果失败,则间隔一秒再次请求
+     * 如果申请次数超过3次,则尝试重新注册
+     * 重新注册后再次尝试申请
+     * 如果申请五次都失败,则结束方法,记录日志
+     *
+     * @param clientId 设备登录ID
+     * @param password 设备登录密码
+     */
+    public void registerMqtt(String clientId, String password) {
+        addRabbitMqUser(clientId, password);
+        int count = 0;
+        while (!setPermission(clientId)) {
+            try {
+                Thread.sleep(1000);
+                if (count == 2) {
+                    addRabbitMqUser(clientId, password);
+                }
+                if (count > 4) {
+                    break;
+                }
+                count++;
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+                break;
+            }
+        }
+    }
+
+    /**
+     * 注册 RabbitMQ 用户
+     *
+     * @param clientId 用户名
+     * @param password 用户密码
+     */
+    private void addRabbitMqUser(String clientId, String password) {
+        String url = "http://view.ailishi.org:15672/api/users/" + clientId;
+        //请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("authorization", "Basic bHEyMDE5OkxpUXVhblJhYmJpdA==");
+        //请求参数
+        Map<String, String> params = new HashMap<>();
+        params.put("username", clientId);
+        params.put("password", password);
+        params.put("tags", "");
+        HttpUtil.putForJSONEntity(url, headers, JSON.toJSONString(params));
+    }
+
+    /**
+     * 申请虚拟机权限
+     *
+     * @param clientId 用户ID
+     */
+    private boolean setPermission(String clientId) {
+        String url = "http://view.ailishi.org:15672/api/permissions/%2F/" + clientId;
+        //请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("authorization", "Basic bHEyMDE5OkxpUXVhblJhYmJpdA==");
+        //请求参数
+        Map<String, String> params = new HashMap<>();
+        params.put("username", clientId);
+        params.put("vhost", "/");
+        params.put("configure", ".*");
+        params.put("write", ".*");
+        params.put("read", ".*");
+        try {
+            HttpUtil.putForJSONEntity(url, headers, JSON.toJSONString(params));
+        } catch (Exception e) {
+            return false;
+        }
+        return true;
+    }
+}

+ 29 - 0
src/main/java/com/zy/bms/service/impl/GroupServiceImpl.java

@@ -0,0 +1,29 @@
+package com.zy.bms.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.bms.common.io.pc.GroupIO;
+import com.zy.bms.common.vo.GroupListVo;
+import com.zy.bms.model.Group;
+import com.zy.bms.mapper.GroupMapper;
+import com.zy.bms.service.IGroupService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 项目组 服务实现类
+ * </p>
+ *
+ * @author chenyi
+ * @since 2021-05-19
+ */
+@Service
+public class GroupServiceImpl extends ServiceImpl<GroupMapper, Group> implements IGroupService {
+
+    @Override
+    public IPage<GroupListVo> listPage(GroupIO io) {
+        Page<GroupListVo> page = new Page<>(io.getCurrent(), io.getSize());
+        return baseMapper.listPage(page, io);
+    }
+}

+ 48 - 0
src/main/java/com/zy/bms/service/impl/ItemServiceImpl.java

@@ -0,0 +1,48 @@
+package com.zy.bms.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.bms.common.io.pc.ItemIO;
+import com.zy.bms.mapper.ItemMapper;
+import com.zy.bms.model.Admin;
+import com.zy.bms.model.Item;
+import com.zy.bms.service.IItemService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 项目表 服务实现类
+ * </p>
+ *
+ * @author chenyi
+ * @since 2021-05-19
+ */
+@Service
+public class ItemServiceImpl extends ServiceImpl<ItemMapper, Item> implements IItemService {
+
+    @Override
+    public IPage<Item> listPage(ItemIO io) {
+        Page<Item> page = new Page<>(io.getCurrent(), io.getSize());
+        return baseMapper.listPage(page, io);
+    }
+
+    @Override
+    public boolean checkRepeat(String code) {
+        return baseMapper.checkRepeat(code) > 0;
+    }
+
+    /**
+     * 更新用户状态
+     *
+     * @param id     主键ID
+     * @param status 状态
+     */
+    @Override
+    public void updateStatus(Integer id, Integer status) {
+        UpdateWrapper<Item> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.set("status", status).eq("id", id);
+        update(updateWrapper);
+    }
+}

+ 28 - 0
src/main/java/com/zy/bms/service/impl/RoleServiceImpl.java

@@ -0,0 +1,28 @@
+package com.zy.bms.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.bms.common.io.pc.RoleIO;
+import com.zy.bms.mapper.RoleMapper;
+import com.zy.bms.model.Role;
+import com.zy.bms.service.IRoleService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 角色表 服务实现类
+ * </p>
+ *
+ * @author chenyi
+ * @since 2021-05-19
+ */
+@Service
+public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements IRoleService {
+
+    @Override
+    public IPage<Role> listPage(RoleIO io) {
+        Page<Role> page = new Page<>(io.getCurrent(), io.getSize());
+        return baseMapper.listPage(page, io);
+    }
+}

+ 4 - 1
src/main/java/com/zy/bms/utils/CodeGenerator.java

@@ -3,6 +3,8 @@ package com.zy.bms.utils;
 import java.util.UUID;
 
 /**
+ * 生成随机码
+ *
  * @author yang xiao kun
  * create on 2021/1/15
  */
@@ -20,7 +22,7 @@ public class CodeGenerator {
     /**
      * 生成短八位UUID随机码
      */
-    public static String generateShortUuid() {
+    public static String shortUuid() {
         StringBuilder stringBuilder = new StringBuilder();
         String uuid = UUID.randomUUID().toString().replace("-", "");
         for (int i = 0; i < 8; i++) {
@@ -28,6 +30,7 @@ public class CodeGenerator {
         }
         return stringBuilder.toString();
     }
+
     /**
      * 随机生成UUID
      * 小写,去掉 '-'

+ 11 - 0
src/main/java/com/zy/bms/utils/HttpUtil.java

@@ -28,6 +28,17 @@ public class HttpUtil {
         return restTemplate.exchange(URI.create(url), HttpMethod.PUT, httpEntity, String.class).getBody();
     }
 
+    /**
+     * 发送 Get 请求
+     *
+     * @param url 请求地址
+     */
+    public static String getForEntity(String url, HttpHeaders header, Object... uriVariables) {
+        HttpEntity<String> httpEntity = new HttpEntity<>(header);
+        ResponseEntity<String> result = restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class, uriVariables);
+        return result.getBody();
+    }
+
     /**
      * 发送 Get 请求
      *

+ 26 - 1
src/main/java/com/zy/bms/utils/MD5Util.java

@@ -15,7 +15,32 @@ public class MD5Util {
      * MD5 字符串加密
      *
      * @param plainText 加密字符串
-     * @return String 返回32位md5加密字符串
+     * @param salt      盐值
+     */
+    public static String MD5Encode(String plainText, String salt) {
+        try {
+            String psd = plainText + salt;
+            StringBuilder stringBuilder = new StringBuilder();
+            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
+            messageDigest.update(psd.getBytes());
+            byte[] bytes = messageDigest.digest();
+            int i;
+            for (byte value : bytes) {
+                i = value;
+                if (i < 0) i += 256;
+                if (i < 16) stringBuilder.append("0");
+                stringBuilder.append(Integer.toHexString(i));
+            }
+            return stringBuilder.toString();
+        } catch (Exception e) {
+            return "MD5";
+        }
+    }
+
+    /**
+     * MD5 字符串加密
+     *
+     * @param plainText 加密字符串
      */
     public static String MD5Encode(String plainText) {
         try {

+ 33 - 0
src/main/resources/mapper/AdminMapping.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.bms.mapper.AdminMapper">
+
+    <select id="listPage" resultType="com.zy.bms.common.vo.AdminListVo">
+        SELECT
+            t1.id,
+            t1.username,
+            t1.nickname,
+            t1.phone,
+            t2.`name` AS role,
+            t1.status,
+            t1.createTime
+        FROM admin t1
+        LEFT JOIN role t2 ON t1.role = t2.id
+        <where>
+            <if test="io.key != null and io.key != ''">
+                AND
+                ( username LIKE CONCAT("%",#{io.key},"%")
+                OR nickname LIKE CONCAT("%",#{io.key},"%")
+                OR phone LIKE CONCAT("%",#{io.key},"%") )
+            </if>
+            <if test="status != null">
+                AND (status = #{io.status}
+            </if>
+            <if test="role != null">
+                AND (role = #{io.role}
+            </if>
+        </where>
+        ORDER BY createTime DESC
+    </select>
+
+</mapper>

+ 15 - 0
src/main/resources/mapper/DeviceMapping.xml

@@ -46,4 +46,19 @@
         SET name = #{name}
         WHERE num = #{num}
     </update>
+
+    <update id="updateDeviceStatus">
+        UPDATE
+            zy_device
+        SET
+            `status` = CASE clientId
+        <foreach collection="devices" item="device">
+            WHEN #{device.clientId} THEN #{device.status}
+        </foreach>
+        END
+        WHERE clientId IN
+        <foreach collection="devices" item="device" separator="," open="(" close=")">
+            #{device.clientId}
+        </foreach>
+    </update>
 </mapper>

+ 24 - 0
src/main/resources/mapper/GroupMapper.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.bms.mapper.GroupMapper">
+
+    <select id="listPage" resultType="com.zy.bms.common.vo.GroupListVo">
+        SELECT
+        t1.*,
+        t2.`name` AS item
+        FROM `group` t1
+        LEFT JOIN item t2 ON t1.itemId = t2.id
+        <where>
+            <if test="io.key != null and io.key != ''">
+                AND
+                ( code LIKE CONCAT("%",#{io.key},"%")
+                OR name LIKE CONCAT("%",#{io.key},"%") )
+            </if>
+            <if test="status != null">
+                AND (status = #{io.status}
+            </if>
+        </where>
+        ORDER BY createTime DESC
+    </select>
+
+</mapper>

+ 26 - 0
src/main/resources/mapper/ItemMapper.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.bms.mapper.ItemMapper">
+
+    <select id="listPage" resultType="com.zy.bms.model.Item">
+        SELECT
+        *
+        FROM item
+        <where>
+            <if test="io.key != null and io.key != ''">
+                AND
+                ( code LIKE CONCAT("%",#{io.key},"%")
+                OR name LIKE CONCAT("%",#{io.key},"%") )
+            </if>
+            <if test="status != null">
+                AND (status = #{io.status}
+            </if>
+        </where>
+        ORDER BY createTime DESC
+    </select>
+
+    <select id="checkRepeat" resultType="java.lang.Integer">
+        SELECT IFNULL( (SELECT 1 FROM item WHERE code = #{code} LIMIT 1) ,0)
+    </select>
+
+</mapper>

+ 17 - 0
src/main/resources/mapper/RoleMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.bms.mapper.RoleMapper">
+
+    <select id="listPage" resultType="com.zy.bms.model.Role">
+        SELECT
+        *
+        FROM role
+        <where>
+            <if test="io.name != null and io.name != ''">
+                AND name LIKE CONCAT("%",#{io.name},"%")
+            </if>
+        </where>
+        ORDER BY createTime DESC
+    </select>
+
+</mapper>

+ 60 - 0
src/test/java/com/zy/bms/MybatisPlusGenerator.java

@@ -0,0 +1,60 @@
+package com.zy.bms;
+
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
+
+/**
+ * mybatis plus 代码生成器
+ */
+public class MybatisPlusGenerator {
+
+    private static final String url = "jdbc:mysql://59.110.141.39:3306/zy_mobile?useUnicode=true&useSSL=false&characterEncoding=utf8";
+    private static final String driveName = "com.mysql.jdbc.Driver";
+    private static final String username = "useryxk";
+    private static final String password = "CHENyi406@";
+    private static final String moduleName = "builder";
+    private static final String[] tables = {"item", "role", "group"};
+
+
+    public static void main(String[] args) {
+        // 代码生成器
+        AutoGenerator autoGenerator = new AutoGenerator();
+        // 全局配置
+        GlobalConfig gc = new GlobalConfig();
+        String projectPath = System.getProperty("user.dir");
+        gc.setOutputDir(projectPath + "/src/main/java");
+        gc.setAuthor("chenyi");
+        gc.setOpen(false);
+        autoGenerator.setGlobalConfig(gc);
+
+        // 数据源配置
+        DataSourceConfig DSConfig = new DataSourceConfig();
+        DSConfig.setUrl(url);
+        DSConfig.setDriverName(driveName);
+        DSConfig.setUsername(username);
+        DSConfig.setPassword(password);
+        autoGenerator.setDataSource(DSConfig);
+
+        // 包配置
+        PackageConfig pc = new PackageConfig();
+        pc.setModuleName(moduleName);
+        pc.setParent("com.zy.bms");
+        autoGenerator.setPackageInfo(pc);
+
+        // 策略配置
+        StrategyConfig strategy = new StrategyConfig();
+        strategy.setNaming(NamingStrategy.underline_to_camel);
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
+        strategy.setEntityLombokModel(true);
+        strategy.setRestControllerStyle(true);
+
+        strategy.setInclude(tables);
+        strategy.setControllerMappingHyphenStyle(true);
+        autoGenerator.setStrategy(strategy);
+        //模板引擎
+        autoGenerator.setTemplateEngine(new FreemarkerTemplateEngine());
+        autoGenerator.execute();
+    }
+}