فهرست منبع

初始化运维项目

bmmx 1 سال پیش
والد
کامیت
01fddfb646
25فایلهای تغییر یافته به همراه547 افزوده شده و 89 حذف شده
  1. 46 38
      .idea/workspace.xml
  2. 0 10
      pom.xml
  3. 0 2
      src/main/java/com/om/config/RedisConfig.java
  4. 3 3
      src/main/java/com/om/config/WebMvcConfiguration.java
  5. 6 1
      src/main/java/com/om/constant/LoginConstant.java
  6. 8 1
      src/main/java/com/om/constant/RedisConstant.java
  7. 8 2
      src/main/java/com/om/controller/admin/AdminController.java
  8. 44 0
      src/main/java/com/om/controller/user/UserController.java
  9. 27 0
      src/main/java/com/om/entity/dto/UserLoginDTO.java
  10. 75 0
      src/main/java/com/om/entity/po/User.java
  11. 42 0
      src/main/java/com/om/entity/vo/UserLoginVO.java
  12. 25 0
      src/main/java/com/om/entity/vo/VciInfoVO.java
  13. 19 0
      src/main/java/com/om/exception/BadReqException.java
  14. 1 1
      src/main/java/com/om/exception/BizException.java
  15. 14 3
      src/main/java/com/om/handler/GlobalExceptionHandler.java
  16. 4 2
      src/main/java/com/om/interceptor/JwtTokenAdminInterceptor.java
  17. 10 13
      src/main/java/com/om/interceptor/JwtTokenUserInterceptor.java
  18. 16 0
      src/main/java/com/om/mapper/UserMapper.java
  19. 19 0
      src/main/java/com/om/service/IUserService.java
  20. 7 5
      src/main/java/com/om/service/impl/AdminServiceImpl.java
  21. 100 0
      src/main/java/com/om/service/impl/UserServiceImpl.java
  22. 36 7
      src/main/java/com/om/utils/JwtUtils.java
  23. 29 0
      src/main/java/com/om/utils/UserContext.java
  24. 3 1
      src/main/resources/application-dev.yml
  25. 5 0
      src/main/resources/mapper/UserMapper.xml

+ 46 - 38
.idea/workspace.xml

@@ -4,39 +4,26 @@
     <option name="autoReloadType" value="SELECTIVE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="46b159bd-08ca-42f0-b80f-41d4944a8a29" name="Changes" comment="">
-      <change afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/.idea/encodings.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/.idea/uiDesigner.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/OperationApplication.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/config/Knife4jConfig.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/config/MyBatisPlusConfig.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/config/RedisConfig.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/config/WebMvcConfiguration.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/constant/LoginConstant.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/constant/RedisConstant.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/controller/admin/AdminController.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/entity/po/Admin.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/entity/vo/AdminLoginVO.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/exception/BizException.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/exception/CustomerAuthenticationException.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/handler/GlobalExceptionHandler.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/interceptor/JwtTokenAdminInterceptor.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/interceptor/JwtTokenUserInterceptor.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/mapper/AdminMapper.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/service/IAdminService.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/service/impl/AdminServiceImpl.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/utils/AdminContext.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/utils/JwtUtils.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/utils/Result.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/utils/ResultCode.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/resources/application-dev.yml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/resources/application.yml" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/resources/mapper/AdminMapper.xml" afterDir="false" />
+    <list default="true" id="46b159bd-08ca-42f0-b80f-41d4944a8a29" name="Changes" comment="管理员登录">
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/entity/dto/UserLoginDTO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/entity/vo/UserLoginVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/entity/vo/VciInfoVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/exception/BadReqException.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/om/utils/UserContext.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/om/config/RedisConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/om/config/RedisConfig.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/om/config/WebMvcConfiguration.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/om/config/WebMvcConfiguration.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/om/constant/LoginConstant.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/om/constant/LoginConstant.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/om/constant/RedisConstant.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/om/constant/RedisConstant.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/om/controller/admin/AdminController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/om/controller/admin/AdminController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/om/exception/BizException.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/om/exception/BizException.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/om/handler/GlobalExceptionHandler.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/om/handler/GlobalExceptionHandler.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/om/interceptor/JwtTokenAdminInterceptor.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/om/interceptor/JwtTokenAdminInterceptor.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/om/interceptor/JwtTokenUserInterceptor.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/om/interceptor/JwtTokenUserInterceptor.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/om/service/impl/AdminServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/om/service/impl/AdminServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/om/utils/JwtUtils.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/om/utils/JwtUtils.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/resources/application-dev.yml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/application-dev.yml" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -93,7 +80,7 @@
     &quot;project.structure.last.edited&quot;: &quot;Project&quot;,
     &quot;project.structure.proportion&quot;: &quot;0.15&quot;,
     &quot;project.structure.side.proportion&quot;: &quot;0.2&quot;,
-    &quot;settings.editor.selected.configurable&quot;: &quot;MavenSettings&quot;,
+    &quot;settings.editor.selected.configurable&quot;: &quot;preferences.pluginManager&quot;,
     &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
   }
 }</component>
@@ -107,11 +94,11 @@
       <recent name="B:\WorkSpace\PracticalRojects\OperationSystem\src\main\java\com\om" />
     </key>
     <key name="CopyClassDialog.RECENTS_KEY">
-      <recent name="com.om.interceptor" />
+      <recent name="com.om.entity.vo" />
       <recent name="com.om.exception" />
+      <recent name="com.om.utils" />
+      <recent name="com.om.interceptor" />
       <recent name="com.om.controller" />
-      <recent name="com.om.config" />
-      <recent name="com.om.mapper" />
     </key>
   </component>
   <component name="RunManager">
@@ -155,18 +142,39 @@
       <workItem from="1706414608767" duration="680000" />
       <workItem from="1706415453436" duration="3741000" />
       <workItem from="1706419384391" duration="5896000" />
+      <workItem from="1706447894119" duration="1867000" />
+      <workItem from="1706491186300" duration="10216000" />
+      <workItem from="1706514434377" duration="49000" />
+      <workItem from="1706600161771" duration="1313000" />
+      <workItem from="1706664319188" duration="4639000" />
+      <workItem from="1706697285028" duration="1227000" />
+      <workItem from="1706709514298" duration="695000" />
+      <workItem from="1706750483961" duration="5232000" />
     </task>
+    <task id="LOCAL-00001" summary="管理员登录">
+      <option name="closed" value="true" />
+      <created>1706425450593</created>
+      <option name="number" value="00001" />
+      <option name="presentableId" value="LOCAL-00001" />
+      <option name="project" value="LOCAL" />
+      <updated>1706425450593</updated>
+    </task>
+    <option name="localTasksCounter" value="2" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
     <option name="version" value="3" />
   </component>
+  <component name="VcsManagerConfiguration">
+    <MESSAGE value="管理员登录" />
+    <option name="LAST_COMMIT_MESSAGE" value="管理员登录" />
+  </component>
   <component name="XDebuggerManager">
     <breakpoint-manager>
       <breakpoints>
         <line-breakpoint enabled="true" type="java-line">
           <url>file://$PROJECT_DIR$/src/main/java/com/om/interceptor/JwtTokenAdminInterceptor.java</url>
-          <line>74</line>
+          <line>75</line>
           <option name="timeStamp" value="10" />
         </line-breakpoint>
       </breakpoints>

+ 0 - 10
pom.xml

@@ -75,11 +75,6 @@
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
-      <!--  <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-security</artifactId>
-        </dependency>-->
-
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
@@ -92,11 +87,6 @@
             <artifactId>httpclient</artifactId>
             <version>4.5.10</version>
         </dependency>
-        <dependency>
-            <groupId>org.json</groupId>
-            <artifactId>json</artifactId>
-            <version>20230618</version>
-        </dependency>
 
         <!--common-lang工具包-->
         <dependency>

+ 0 - 2
src/main/java/com/om/config/RedisConfig.java

@@ -4,7 +4,6 @@ package com.om.config;
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 import com.fasterxml.jackson.annotation.PropertyAccessor;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.data.redis.cache.RedisCacheConfiguration;
@@ -16,7 +15,6 @@ import org.springframework.data.redis.serializer.RedisSerializationContext;
 import org.springframework.data.redis.serializer.RedisSerializer;
 import org.springframework.data.redis.serializer.StringRedisSerializer;
 
-import java.time.Duration;
 
 /**
  * redis配置类

+ 3 - 3
src/main/java/com/om/config/WebMvcConfiguration.java

@@ -38,10 +38,10 @@ public class WebMvcConfiguration extends WebMvcConfigurationSupport {
                 .excludePathPatterns(LoginConstant.ADMIN_ALLOWED_PATHS)
                 .excludePathPatterns(LoginConstant.KNIFE4J_PATHS);
 
-        //用户拦截器 todo
+        //用户拦截器
         registry.addInterceptor(jwtTokenUserInterceptor)
-                .addPathPatterns("/manager/**")
-                .excludePathPatterns(LoginConstant.ADMIN_ALLOWED_PATHS)
+                .addPathPatterns("/app/**")
+                .excludePathPatterns(LoginConstant.USER_ALLOWED_PATHS)
                 .excludePathPatterns(LoginConstant.KNIFE4J_PATHS);
 
     }

+ 6 - 1
src/main/java/com/om/constant/LoginConstant.java

@@ -14,7 +14,12 @@ public class LoginConstant {
     };
 
     public static final String[]  ADMIN_ALLOWED_PATHS = {
-            "/manager/login"
+            "/web/manager/login"
+    };
+
+
+    public static final String[]  USER_ALLOWED_PATHS = {
+            "/app/user/login"
     };
 
 }

+ 8 - 1
src/main/java/com/om/constant/RedisConstant.java

@@ -5,5 +5,12 @@ public class RedisConstant {
     * 格式:token:admin:管理员id
      * */
     public static final String ADMIN_TOKEN_PREFIX = "token:admin:";
-    public static final Long ADMIN_TOKEN_TTL = 7200000L;
+    public static final Long ADMIN_TOKEN_TTL = 86400L;//24小时
+
+
+    /**
+     * 格式:token:admin:管理员id
+     * */
+    public static final String USER_TOKEN_PREFIX = "token:user:";
+    public static final Long USER_TOKEN_TTL = 86400L;//24小时
 }

+ 8 - 2
src/main/java/com/om/controller/admin/AdminController.java

@@ -1,7 +1,6 @@
 package com.om.controller.admin;
 
 
-import com.om.exception.BizException;
 import com.om.service.IAdminService;
 import com.om.utils.AdminContext;
 import com.om.utils.Result;
@@ -24,7 +23,7 @@ import javax.annotation.Resource;
  */
 @RestController
 @Api(tags = "后台管理系统用户模块接口")
-@RequestMapping("/manager")
+@RequestMapping("/web/manager")
 public class AdminController {
 
     @Resource
@@ -37,4 +36,11 @@ public class AdminController {
         return adminService.login(username,password);
     }
 
+    @GetMapping("/get")
+    @ApiOperation("获取当前登录id")
+    public Result get(){
+        Integer adminId = AdminContext.getAdminId();
+        return Result.ok(adminId);
+    }
+
 }

+ 44 - 0
src/main/java/com/om/controller/user/UserController.java

@@ -0,0 +1,44 @@
+package com.om.controller.user;
+
+
+import com.om.entity.dto.UserLoginDTO;
+import com.om.service.IAdminService;
+import com.om.service.IUserService;
+import com.om.utils.AdminContext;
+import com.om.utils.Result;
+import com.om.utils.UserContext;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ * 应用用户信息表 前端控制器
+ * </p>
+ *
+ * @author bmmx
+ * @since 2024-01-29
+ */
+@RestController
+@Api(tags = "客户端用户模块")
+@RequestMapping("/app/user")
+public class UserController {
+    @Resource
+    private IUserService userService;
+
+
+    @PostMapping("/login")
+    @ApiOperation("客户端用户登录")
+    public Result login(@RequestBody UserLoginDTO dto){
+        return userService.login(dto);
+    }
+
+    @GetMapping("/get")
+    @ApiOperation("获取当前登录id")
+    public Result get(){
+        Integer userId = UserContext.getUserId();
+        return Result.ok(userId);
+    }
+}

+ 27 - 0
src/main/java/com/om/entity/dto/UserLoginDTO.java

@@ -0,0 +1,27 @@
+package com.om.entity.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class UserLoginDTO {
+    @ApiModelProperty()
+    private String method;
+
+    @ApiModelProperty(value = "用户名")
+    private String username;
+
+    @ApiModelProperty(value = "密码")
+    private String password;
+
+    @ApiModelProperty(value = "客户端编号")
+    private String clientNum;
+
+    @ApiModelProperty(value = "0、登陆;1、激活")
+    private Integer type;
+
+    @ApiModelProperty(value = "设备序列号")
+    private String deviceSn;
+}

+ 75 - 0
src/main/java/com/om/entity/po/User.java

@@ -0,0 +1,75 @@
+package com.om.entity.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author bmmx
+ * @since 2024-02-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("user")
+@ApiModel(value="User对象", description="")
+public class User implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "标识符")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "用户名")
+    private String username;
+
+    @ApiModelProperty(value = "密码")
+    private String password;
+
+    @ApiModelProperty(value = "昵称")
+    private String nickName;
+
+    @ApiModelProperty(value = "电话")
+    private String tel;
+
+    @ApiModelProperty(value = "邮箱")
+    private String mail;
+
+    @ApiModelProperty(value = "维修厂ID")
+    private Integer distributorId;
+
+    @ApiModelProperty(value = "头像图片路径")
+    private String headerImage;
+
+    @ApiModelProperty(value = "积分")
+    private Integer integral;
+
+    @ApiModelProperty(value = "原因")
+    private String reason;
+
+    @ApiModelProperty(value = "状态")
+    private Integer state;
+
+    @ApiModelProperty(value = "用户类型: 0 - 正式账号, 1 - 测试账号")
+    private Integer userType;
+
+    @ApiModelProperty(value = "创建时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "更新时间")
+    private LocalDateTime updateTime;
+
+
+}

+ 42 - 0
src/main/java/com/om/entity/vo/UserLoginVO.java

@@ -0,0 +1,42 @@
+package com.om.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+public class UserLoginVO {
+
+
+    @ApiModelProperty(value = "用户名")
+    private String username;
+
+    @ApiModelProperty(value = "密码")
+    private String password;
+
+    @ApiModelProperty(value = "公司名称")
+    private String company;
+
+    @ApiModelProperty(value = "公司地址")
+    private String address;
+
+    @ApiModelProperty(value = "公司网站")
+    private String website;
+
+    @ApiModelProperty(value = "公司电话")
+    private Boolean telephone;
+
+    @ApiModelProperty(value = "Vci SN号")
+    private String vciSn;
+
+    @ApiModelProperty(value = "token")
+    private String token;
+
+    @ApiModelProperty(value = "vci列表")
+    private List<VciInfoVO> vciInfoList;
+
+}

+ 25 - 0
src/main/java/com/om/entity/vo/VciInfoVO.java

@@ -0,0 +1,25 @@
+package com.om.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class VciInfoVO {
+    @ApiModelProperty(value = "vci编号")
+    private String vciNum;
+
+    @ApiModelProperty(value = "校验码")
+    private String pairingPwd;
+
+    @ApiModelProperty(value = "蓝牙地址")
+    private String bluetoothAddress;
+
+    @ApiModelProperty(value = "是否是默认设备")
+    private Integer isDefault;
+
+    @ApiModelProperty(value = "状态")
+    private Integer state;
+
+}

+ 19 - 0
src/main/java/com/om/exception/BadReqException.java

@@ -0,0 +1,19 @@
+package com.om.exception;
+
+import lombok.Data;
+
+/**
+ * 错误请求异常类
+ *需要继承运行时异常RuntimeException
+ */
+@Data
+public class BadReqException extends RuntimeException {
+    private final Integer code = 400;
+    private String message = "错误请求";
+
+    public BadReqException(String message) {
+        this.message = message;
+    }
+
+
+}

+ 1 - 1
src/main/java/com/om/exception/BizException.java

@@ -9,7 +9,7 @@ import lombok.Data;
 @Data
 public class BizException extends RuntimeException {
     private final Integer code = 500;
-    private String message;
+    private String message = "业务异常";
 
     public BizException(String message) {
         this.message = message;

+ 14 - 3
src/main/java/com/om/handler/GlobalExceptionHandler.java

@@ -1,6 +1,7 @@
 package com.om.handler;
 
 
+import com.om.exception.BadReqException;
 import com.om.exception.BizException;
 import com.om.exception.CustomerAuthenticationException;
 import com.om.utils.Result;
@@ -30,7 +31,7 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(Exception.class)
     public Result exception(Exception e) {
         // 记录异常信息到日志
-        log.error("Exception caught: ", e);
+        log.error("错误信息: ", e);
         // 返回错误格式信息
         return Result.error();
     }
@@ -41,9 +42,19 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(BizException.class)
     public Result BizException(BizException e) {
         // 记录异常信息到日志
-        log.error("Exception caught: ", e);
+        log.error("业务异常信息 : ", e);
         // 返回错误格式信息
-        return Result.error().message(e.getMessage());
+        return Result.error().message(e.getMessage()).result(e.getCode());
+    }
+
+    @ResponseBody
+    @Order(Ordered.HIGHEST_PRECEDENCE)
+    @ExceptionHandler(BadReqException.class)
+    public Result BadReqException(BadReqException e) {
+        // 记录异常信息到日志
+        log.error("请求错误信息 : ", e);
+        // 返回错误格式信息
+        return Result.error().message(e.getMessage()).result(e.getCode());
     }
 
     @ResponseBody

+ 4 - 2
src/main/java/com/om/interceptor/JwtTokenAdminInterceptor.java

@@ -8,6 +8,7 @@ import com.om.utils.AdminContext;
 import com.om.utils.JwtUtils;
 import com.om.utils.Result;
 
+import com.om.utils.ResultCode;
 import lombok.extern.slf4j.Slf4j;
 
 import org.springframework.data.redis.core.RedisTemplate;
@@ -57,7 +58,7 @@ public class JwtTokenAdminInterceptor implements HandlerInterceptor {
 
             response.setContentType("application/json;charset=UTF-8");  // 设置字符集为 UTF-8
             String message = ex.getMessage();
-            response.setStatus(401);
+            response.setStatus(ResultCode.NO_AUTH);
             response.getWriter().write(JSON.toJSONString(Result.error().message(message).result(401)));
             return false;
         }
@@ -85,8 +86,9 @@ public class JwtTokenAdminInterceptor implements HandlerInterceptor {
             throw new CustomerAuthenticationException("token不存在");
         }
 
+
         //从token中获取管理员id
-        Integer aId = jwtUtils.getIdFromToken(token);
+        Integer aId = jwtUtils.getAdminIdFromToken(token);
         //判断 管理员id 是否为空
         if (StringUtils.isEmpty(aId)) {
             throw new CustomerAuthenticationException("token解析失败");

+ 10 - 13
src/main/java/com/om/interceptor/JwtTokenUserInterceptor.java

@@ -4,9 +4,7 @@ package com.om.interceptor;
 import com.alibaba.fastjson.JSON;
 import com.om.constant.RedisConstant;
 import com.om.exception.CustomerAuthenticationException;
-import com.om.utils.AdminContext;
-import com.om.utils.JwtUtils;
-import com.om.utils.Result;
+import com.om.utils.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
@@ -54,8 +52,8 @@ public class JwtTokenUserInterceptor implements HandlerInterceptor {
 
             response.setContentType("application/json;charset=UTF-8");  // 设置字符集为 UTF-8
             String message = ex.getMessage();
-            response.setStatus(401);
-            response.getWriter().write(JSON.toJSONString(Result.error().message(message).result(401)));
+            response.setStatus(ResultCode.NO_AUTH);
+            response.getWriter().write(JSON.toJSONString(Result.error().message(message).result(ResultCode.NO_AUTH)));
             return false;
         }
 
@@ -82,16 +80,15 @@ public class JwtTokenUserInterceptor implements HandlerInterceptor {
             throw new CustomerAuthenticationException("token不存在");
         }
 
-        //从token中获取管理员id
-        Integer aId = jwtUtils.getIdFromToken(token);
-        //判断 管理员id 是否为空
-        if (StringUtils.isEmpty(aId)) {
+        //从token中获取用户id
+        Integer uId = jwtUtils.getUserIdFromToken(token);
+        //判断 用户id 是否为空
+        if (StringUtils.isEmpty(uId)) {
             throw new CustomerAuthenticationException("token解析失败");
         }
 
         //判断redis中是否存在token信息
-
-        String tokenKey = RedisConstant.ADMIN_TOKEN_PREFIX +aId;
+        String tokenKey = RedisConstant.USER_TOKEN_PREFIX +uId;
         String redisToken = (String) redisTemplate.opsForValue().get(tokenKey);
 
         //判断redis中是否存在token信息  如果为空 则表示token已经失效、
@@ -104,8 +101,8 @@ public class JwtTokenUserInterceptor implements HandlerInterceptor {
         if (!token.equals(redisToken)) {
             throw new CustomerAuthenticationException("token验证失败");
         }
-        //获取管理员id
-        AdminContext.setAdminId(aId);
+        //设置 用户id
+        UserContext.setUserId(uId);
     }
 }
 

+ 16 - 0
src/main/java/com/om/mapper/UserMapper.java

@@ -0,0 +1,16 @@
+package com.om.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.om.entity.po.User;
+
+/**
+ * <p>
+ * 应用用户信息表 Mapper 接口
+ * </p>
+ *
+ * @author bmmx
+ * @since 2024-01-29
+ */
+public interface UserMapper extends BaseMapper<User> {
+
+}

+ 19 - 0
src/main/java/com/om/service/IUserService.java

@@ -0,0 +1,19 @@
+package com.om.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.om.entity.dto.UserLoginDTO;
+import com.om.entity.po.User;
+import com.om.utils.Result;
+
+/**
+ * <p>
+ * 应用用户信息表 服务类
+ * </p>
+ *
+ * @author bmmx
+ * @since 2024-01-29
+ */
+public interface IUserService extends IService<User> {
+
+    Result login(UserLoginDTO dto);
+}

+ 7 - 5
src/main/java/com/om/service/impl/AdminServiceImpl.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.om.constant.RedisConstant;
 import com.om.entity.po.Admin;
 import com.om.entity.vo.AdminLoginVO;
+import com.om.exception.BadReqException;
+import com.om.exception.BizException;
 import com.om.mapper.AdminMapper;
 import com.om.service.IAdminService;
 import com.om.utils.JwtUtils;
@@ -46,10 +48,10 @@ public class AdminServiceImpl extends ServiceImpl<AdminMapper, Admin> implements
     @Override
     public Result login(String username, String password) {
         if (StringUtils.isBlank(username)){
-            return Result.error().message("用户名为空");
+            throw new BadReqException("用户名不能为空!");
         }
         if (StringUtils.isBlank(password)){
-           return Result.error().message("密码为空");
+            throw new BadReqException("密码不能为空!");
         }
 
         //根据username 查询数据库
@@ -58,18 +60,18 @@ public class AdminServiceImpl extends ServiceImpl<AdminMapper, Admin> implements
                 .one();
         //判断是否存在
         if (BeanUtil.isEmpty(admin)){
-            return Result.error().message("该用户不存在");
+            throw new BadReqException("该管理员不存在!请检查用户名是否正确!");
         }
         //密码加密
          password = DigestUtils.md5DigestAsHex(password.getBytes());
         //判断密码是否正确
         if (!StringUtils.equals(password,admin.getPassword())){
-            return Result.error().message("密码错误");
+            throw new BizException("密码不正确,请检查用户名和密码是否正确!");
         }
 
         //判断管理员状态
         if (!admin.getEnabled()){
-            return Result.error().message("该管理员已被禁用");
+            throw new BadReqException("该管理员已被禁用!请联系系统管理员!!!");
         }
         //封装vo返回
         AdminLoginVO adminLoginVO = BeanUtil.copyProperties(admin, AdminLoginVO.class);

+ 100 - 0
src/main/java/com/om/service/impl/UserServiceImpl.java

@@ -0,0 +1,100 @@
+package com.om.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.om.constant.RedisConstant;
+import com.om.entity.dto.UserLoginDTO;
+import com.om.entity.po.User;
+import com.om.entity.vo.UserLoginVO;
+import com.om.exception.BadReqException;
+import com.om.mapper.UserMapper;
+import com.om.service.IUserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.om.utils.JwtUtils;
+import com.om.utils.Result;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.util.DigestUtils;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * <p>
+ * 应用用户信息表 服务实现类
+ * </p>
+ *
+ * @author bmmx
+ * @since 2024-01-29
+ */
+@Service
+public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
+
+    @Resource
+    private JwtUtils jwtUtils;
+
+    @Resource
+    private RedisTemplate redisTemplate;
+
+    @Override
+    //TODO
+    public Result login(UserLoginDTO dto) {
+        //从dto中获取数据
+        String username = dto.getUsername();
+        String password = dto.getPassword();
+        String clientNum = dto.getClientNum();
+        String deviceSn = dto.getDeviceSn();
+        Integer type = dto.getType();
+
+        //判断数据是否为空
+        if (StringUtils.isBlank(username) || StringUtils.isBlank(password) || StringUtils.isBlank(clientNum) ||
+                StringUtils.isBlank(deviceSn) || type == null){
+            throw new BadReqException("数据为空!!");
+        }
+
+        //根据用户名查询用户
+        User user = this.lambdaQuery()
+                .eq(User::getUsername, username)
+                .one();
+
+        //判断用户是否存在
+        if (BeanUtil.isEmpty(user)){
+            throw new BadReqException("该用户不存在!!");
+        }
+
+
+        //密码加密
+        password = DigestUtils.md5DigestAsHex(password.getBytes());
+        //判断密码是否正确
+        if (!password.equals(user.getPassword())){
+            throw new BadReqException("密码错误");
+        }
+        // TODO 判断用户状态
+
+        // TODO 绑定 客户端编号 和 设备 序列号  ( 判断type是登录(0)还是激活(1) )
+
+        // 生成token
+        Map<String, Object> claims = new HashMap<>();
+        claims.put("u_id",user.getId());
+        String token = jwtUtils.generateToken(claims);
+        //把token存入到redis中
+        String key = RedisConstant.USER_TOKEN_PREFIX + user.getId();
+        redisTemplate.opsForValue().set(key,token,RedisConstant.USER_TOKEN_TTL, TimeUnit.SECONDS);
+
+        //封装vo返回
+        UserLoginVO userLoginVO = new UserLoginVO();
+        // TODO 查询 该用户所属的 维修厂
+        Integer distributorId = user.getDistributorId();//用户所属的维修厂id
+
+        //TODO 查询用户 所绑定的vci设备
+
+        //设置userLoginVO
+        userLoginVO.setUsername(username);
+        userLoginVO.setPassword(password);
+        userLoginVO.setToken(token);
+
+        return Result.ok(userLoginVO);
+    }
+}

+ 36 - 7
src/main/java/com/om/utils/JwtUtils.java

@@ -48,17 +48,34 @@ public class JwtUtils {
         return claims;
     }
 
+    /**
+     * 从令牌中获取AdminId
+     *
+     * @param token 令牌
+     * @return uid
+     */
+    public Integer getAdminIdFromToken(String token) {
+        Integer aId;
+        try {
+            Claims claims = getClaimsFromToken(token);
+            aId =  claims.get("a_id", Integer.class);
+        } catch (Exception e) {
+            aId = null;
+        }
+        return aId;
+    }
+
     /**
      * 从令牌中获取id
      *
      * @param token 令牌
      * @return id
      */
-    public Integer getIdFromToken(String token) {
+    public Integer getUserIdFromToken(String token) {
         Integer uId;
         try {
             Claims claims = getClaimsFromToken(token);
-            uId =  claims.get("a_id", Integer.class);
+            uId =  claims.get("u_id", Integer.class);
         } catch (Exception e) {
             uId = null;
         }
@@ -96,15 +113,27 @@ public class JwtUtils {
     }
 
     /**
-     * 验证令牌
+     * 管理员验证令牌
+     *
+     * @param token       令牌
+     * @param adminId admin
+     * @return 是否有效
+     */
+    public Boolean validateAdminToken(String token, Integer adminId) {
+        Integer aId = getAdminIdFromToken(token);
+        return (aId.equals(adminId) && !isTokenExpired(token));
+    }
+
+    /**
+     * 用户验证令牌
      *
      * @param token       令牌
-     * @param id id
+     * @param userId userId
      * @return 是否有效
      */
-    public Boolean validateToken(String token, Integer id) {
-        Integer uId = getIdFromToken(token);
-        return (uId.equals(id) && !isTokenExpired(token));
+    public Boolean validateUserToken(String token, Integer userId) {
+        Integer uId = getUserIdFromToken(token);
+        return (uId.equals(userId) && !isTokenExpired(token));
     }
 }
 

+ 29 - 0
src/main/java/com/om/utils/UserContext.java

@@ -0,0 +1,29 @@
+package com.om.utils;
+
+public class UserContext {
+    private static final ThreadLocal<Integer> TL = new ThreadLocal<>();
+
+    /**
+     * 保存管理员信息
+     * @param userId 用户id
+     */
+    public static void setUserId(Integer userId){
+        TL.set(userId);
+    }
+
+    /**
+     * 获取管理员
+     * @return 用户id
+     */
+    public static Integer getUserId(){
+        return TL.get();
+    }
+
+    /**
+     * 移除用户信息
+     */
+    public static void removeUser(){
+        TL.remove();
+    }
+}
+

+ 3 - 1
src/main/resources/application-dev.yml

@@ -11,6 +11,8 @@ spring:
     url: jdbc:mysql://47.113.197.148:33306/test?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8&allowPublicKeyRetrieval=true
     username: root
     password: om1020
+    hikari:
+      max-lifetime: 500000
   redis:
     host: 47.113.197.148
     password: om1020
@@ -28,7 +30,7 @@ spring:
 #密钥
 jwt:
   secret: opera
-  expiration: 7200000  #过期时间2小时
+  expiration: 86400000  #过期时间24小时
 
 
 

+ 5 - 0
src/main/resources/mapper/UserMapper.xml

@@ -0,0 +1,5 @@
+<?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.om.mapper.UserMapper">
+
+</mapper>