xucaiqin 2 лет назад
Родитель
Сommit
f5f4a1e0be

+ 5 - 0
iot-framework/iot-common/pom.xml

@@ -60,5 +60,10 @@
             <artifactId>jakarta.servlet-api</artifactId>
             <artifactId>jakarta.servlet-api</artifactId>
             <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
             <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper</artifactId>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
     </dependencies>
 </project>
 </project>

+ 4 - 2
iot-framework/iot-common/src/main/java/com/middle/platform/common/constant/Global.java

@@ -5,6 +5,8 @@ package com.middle.platform.common.constant;
  * @date 2023-12-05 16:42:00
  * @date 2023-12-05 16:42:00
  */
  */
 public interface Global {
 public interface Global {
-     int SUCCESS = 200;
-     int ERROR = 500;
+    int SUCCESS = 200;
+    int ERROR = 500;
+
+    String UN_AUTH = "未登录,请先登录";
 }
 }

+ 162 - 0
iot-framework/iot-common/src/main/java/com/middle/platform/common/utils/PageRes.java

@@ -0,0 +1,162 @@
+package com.middle.platform.common.utils;
+
+
+import com.github.pagehelper.PageInfo;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 分页结果泛型类
+ * 适用于 pagehelper
+ *
+ * @author xucaiqin
+ * @date 2023-07-12 08:42:26
+ */
+public class PageRes<T> {
+
+    /**
+     * 当前页数
+     */
+    protected int page;
+    /**
+     * 每页显示条数
+     */
+    protected int pageSize;
+    /**
+     * 总条数
+     */
+    protected long total;
+    /**
+     * 总页数
+     */
+    protected int pages;
+    /**
+     * 数据
+     */
+    protected List<T> list;
+
+    public PageRes() {
+        this.list = new ArrayList<>();
+    }
+
+    public PageRes(int page, int pageSize, long total, int pages, List<T> list) {
+        this.page = page;
+        this.pageSize = pageSize;
+        this.total = total;
+        this.pages = pages;
+        this.list = list;
+    }
+
+    public PageRes(PageInfo<T> pageInfo) {
+        this.page = pageInfo.getPageNum();
+        this.pageSize = pageInfo.getPageSize();
+        this.total = pageInfo.getTotal();
+        this.pages = pageInfo.getPages();
+        this.list = CollectionUtils.isEmpty(pageInfo.getList()) ? new ArrayList<>() : pageInfo.getList();
+    }
+
+    public PageRes(PageInfo<T> pageInfo, List<T> list) {
+        this.page = pageInfo.getPageNum();
+        this.pageSize = pageInfo.getPageSize();
+        this.total = pageInfo.getTotal();
+        this.pages = pageInfo.getPages();
+        this.list = list;
+    }
+
+    public PageRes(List<T> list) {
+        PageInfo<T> pageInfo = new PageInfo<>(list);
+        this.page = pageInfo.getPageNum();
+        this.pageSize = pageInfo.getPageSize();
+        this.total = pageInfo.getTotal();
+        this.pages = pageInfo.getPages();
+        this.list = pageInfo.getList();
+    }
+
+    //todo
+    public static <T> PageRes<T> change(PageInfo<?> pagInfo, List<T> list) {
+        PageRes<T> tPageRes = new PageRes<>();
+        tPageRes.setPage(pagInfo.getPageNum());
+        tPageRes.setPageSize(pagInfo.getPageSize());
+        tPageRes.setTotal(pagInfo.getTotal());
+        tPageRes.setPages(pagInfo.getPages());
+        tPageRes.setList(list);
+        return tPageRes;
+    }
+
+    /**
+     * 构建返回数据
+     *
+     * @param pagInfo pageHelper的分页对象
+     * @param list    实际返回的数据集
+     * @return
+     */
+    public static <T> PageRes<T> build(PageInfo<?> pagInfo, List<T> list) {
+        PageRes<T> tPageRes = new PageRes<>();
+        tPageRes.setPage(pagInfo.getPageNum());
+        tPageRes.setPageSize(pagInfo.getPageSize());
+        tPageRes.setTotal(pagInfo.getTotal());
+        tPageRes.setPages(pagInfo.getPages());
+        tPageRes.setList(list);
+        return tPageRes;
+    }
+
+    /**
+     * 手动对list进行分页数据处理
+     *
+     * @param page     当前页
+     * @param pageSize 每页大小
+     * @param list     总数据
+     * @return
+     */
+    public static <T> PageRes<T> handPage(int page, int pageSize, List<T> list) {
+        PageRes<T> tPageRes = new PageRes<>();
+        tPageRes.setPage(page);
+        tPageRes.setPageSize(pageSize);
+        tPageRes.setTotal(list.size());
+        tPageRes.setPages(list.size() / pageSize + 1);
+        tPageRes.setList(list.stream().skip((long) (page - 1) * pageSize).limit(pageSize).toList());
+        return tPageRes;
+    }
+
+    public void setPage(int page) {
+        this.page = page;
+    }
+
+    public void setPageSize(int pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public void setTotal(long total) {
+        this.total = total;
+    }
+
+    public void setPages(int pages) {
+        this.pages = pages;
+    }
+
+    public void setList(List<T> list) {
+        this.list = list;
+    }
+
+    public int getPage() {
+        return page;
+    }
+
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    public long getTotal() {
+        return total;
+    }
+
+    public int getPages() {
+        return pages;
+    }
+
+    public List<T> getList() {
+        return list;
+    }
+}

+ 24 - 19
iot-framework/iot-starter-satoken/src/main/java/com/middle/platform/satoken/config/SaTokenConfig.java

@@ -2,30 +2,25 @@ package com.middle.platform.satoken.config;
 
 
 import cn.dev33.satoken.context.SaHolder;
 import cn.dev33.satoken.context.SaHolder;
 import cn.dev33.satoken.filter.SaServletFilter;
 import cn.dev33.satoken.filter.SaServletFilter;
-import com.middle.platform.common.utils.Result;
+import cn.dev33.satoken.interceptor.SaInterceptor;
+import cn.dev33.satoken.router.SaRouter;
+import cn.dev33.satoken.stp.StpUtil;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 
 @Slf4j
 @Slf4j
-@Configuration
-public class SaTokenConfig {
+@AutoConfiguration
+public class SaTokenConfig implements WebMvcConfigurer {
+    private final String[] exclude = new String[]{
+            "/auth/login", "/auth/logout"
+    };
 
 
-    /**
-     * 注册 [Sa-Token全局过滤器]
-     */
     @Bean
     @Bean
     public SaServletFilter getSaServletFilter() {
     public SaServletFilter getSaServletFilter() {
-        return new SaServletFilter()
-                // 指定 拦截路由 与 放行路由
-                .addInclude("/**")
-                .addExclude("/auth/login","/auth/logout")
-                // 异常处理函数:每次认证函数发生异常时执行此函数
-                .setError(e -> {
-                    SaHolder.getResponse().setHeader("Content-Type", "application/json;charset=UTF-8");
-                    return Result.failed(e.getMessage());
-                })
-
+        return new SaServletFilter().addInclude("/**")
                 // 前置函数:在每次认证函数之前执行(BeforeAuth 不受 includeList 与 excludeList 的限制,所有请求都会进入)
                 // 前置函数:在每次认证函数之前执行(BeforeAuth 不受 includeList 与 excludeList 的限制,所有请求都会进入)
                 .setBeforeAuth(r -> {
                 .setBeforeAuth(r -> {
                     // ---------- 设置一些安全响应头 ----------
                     // ---------- 设置一些安全响应头 ----------
@@ -33,8 +28,18 @@ public class SaTokenConfig {
                             // 是否启用浏览器默认XSS防护: 0=禁用 | 1=启用 | 1; mode=block 启用, 并在检查到XSS攻击时,停止渲染页面
                             // 是否启用浏览器默认XSS防护: 0=禁用 | 1=启用 | 1; mode=block 启用, 并在检查到XSS攻击时,停止渲染页面
                             .setHeader("X-XSS-Protection", "1; mode=block")
                             .setHeader("X-XSS-Protection", "1; mode=block")
                             // 禁用浏览器内容嗅探
                             // 禁用浏览器内容嗅探
-                            .setHeader("X-Content-Type-Options", "nosniff")
-                    ;
+                            .setHeader("X-Content-Type-Options", "nosniff");
                 });
                 });
     }
     }
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        // 注册 Sa-Token 拦截器,定义详细认证规则
+        registry.addInterceptor(new SaInterceptor(handler -> {
+            // 指定一条 match 规则
+            SaRouter.match("/**")    // 拦截的 path 列表,可以写多个 */
+                    .notMatch(exclude)        // 排除掉的 path 列表,可以写多个
+                    .check(r -> StpUtil.checkLogin());        // 要执行的校验动作,可以写完整的 lambda 表达式
+        })).addPathPatterns("/**");
+    }
 }
 }

+ 5 - 0
iot-framework/iot-starter-web/pom.xml

@@ -47,5 +47,10 @@
             <groupId>org.springframework.boot</groupId>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-validation</artifactId>
             <artifactId>spring-boot-starter-validation</artifactId>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-core</artifactId>
+            <scope>provided</scope>
+        </dependency>
     </dependencies>
     </dependencies>
 </project>
 </project>

+ 9 - 0
iot-framework/iot-starter-web/src/main/java/com/middle/platform/web/config/GlobalExceptionHandler.java

@@ -1,5 +1,7 @@
 package com.middle.platform.web.config;
 package com.middle.platform.web.config;
 
 
+import cn.dev33.satoken.exception.NotLoginException;
+import com.middle.platform.common.constant.Global;
 import com.middle.platform.common.exception.BusinessException;
 import com.middle.platform.common.exception.BusinessException;
 import com.middle.platform.common.exception.ResultCode;
 import com.middle.platform.common.exception.ResultCode;
 import com.middle.platform.common.utils.Result;
 import com.middle.platform.common.utils.Result;
@@ -33,4 +35,11 @@ public class GlobalExceptionHandler {
         return Result.failed(ResultCode.ERROR, ex.getMessage());
         return Result.failed(ResultCode.ERROR, ex.getMessage());
     }
     }
 
 
+    @ExceptionHandler(value = NotLoginException.class)
+    public Result<?> notLogin(Throwable ex) {
+        log.error("[NotLoginException]", ex);
+        return Result.failed(ResultCode.ERROR, Global.UN_AUTH);
+    }
+
+
 }
 }