当前位置:首页>Excel>第03篇:通用Excel动态导出工具设计—一行代码搞定任意列表导出

第03篇:通用Excel动态导出工具设计—一行代码搞定任意列表导出

  • 2026-06-01 06:40:24
第03篇:通用Excel动态导出工具设计—一行代码搞定任意列表导出

系列:Java架构实战笔记 · 文件与数据传输

阅读时间:12分钟

上一篇:大文件分片上传+断点续传(第02篇)

下一篇预告:海量数据CSV压缩导出与异步任务下载

一、问题引入

在经历了第01篇的百万数据导出实战后,你可能已经掌握了 EasyExcel 流式导出的技巧。但现在面临一个新问题:

项目中每天都有新的导出需求

  • 运营要导出订单报表

  • 财务要导出对账单

  • 产品要导出用户分析数据

  • 客服要导出退款记录

你发现每个导出接口都在重复造轮子:

// 订单导出EasyExcel.write(response.getOutputStream(), OrderExcelDto.class).sheet().doWrite(orderList);// 用户导出EasyExcel.write(response.getOutputStream(), UserExcelDto.class).sheet().doWrite(userList);// 产品导出EasyExcel.write(response.getOutputStream(), ProductExcelDto.class).sheet().doWrite(productList);

80% 的代码是重复的:响应头设置、文件名处理、异常捕获、Excel 写入。更糟糕的是,每次新增导出都要:

  1. 创建一个新的 DTO 类

  2. 写一个新的 Controller 方法

  3. 写一个新的 Service 查询

  4. 重复设置响应头

如何设计一个通用的导出工具,让一行代码就能搞定任何列表的导出?

二、反面案例:那些年我们踩过的坑

2.1 错误代码(重复代码遍地开花)

// 订单导出@GetMapping("/export/order")public void exportOrder(HttpServletResponse response) {    try {        List<Order> orders = orderService.list();        List<OrderExcelDto> dtoList = orders.stream().map(this::convert).collect(Collectors.toList());        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");        response.setHeader("Content-Disposition""attachment; filename=orders.xlsx");        EasyExcel.write(response.getOutputStream(), OrderExcelDto.class).sheet("订单").doWrite(dtoList);    } catch (Exception e) {        throw new RuntimeException("导出失败", e);    }}// 用户导出(几乎一样的代码)@GetMapping("/export/user")public void exportUser(HttpServletResponse response) {    try {        List<User> users = userService.list();        List<UserExcelDto> dtoList = users.stream().map(this::convertToUserDto).collect(Collectors.toList());        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");        response.setHeader("Content-Disposition""attachment; filename=users.xlsx");        EasyExcel.write(response.getOutputStream(), UserExcelDto.class).sheet("用户").doWrite(dtoList);    } catch (Exception e) {        throw new RuntimeException("导出失败", e);    }}

2.2 踩坑实录

  • 维护灾难:10 个导出接口就有 10 份重复代码,修改响应头格式需要改 10 个地方。

  • 代码量爆炸:每个导出都需要单独写 Controller、Service、Converter、DTO,项目代码量膨胀。

  • 类型不安全:手动转换 Order -> OrderExcelDto 容易遗漏字段,且编译期无法检查。

  • 硬编码严重:文件名、Sheet名、列名都硬编码,改一个字段名要改多个地方。

根本原因:缺少一层通用抽象,让导出逻辑与业务数据解耦。

三、正确方案:注解驱动的通用导出工具

3.1 核心思路

  1. 注解定义导出配置:在实体类字段上使用 @ExcelExport 注解,声明列名、顺序、格式化规则。

  2. 反射获取配置:运行时通过反射读取注解,动态构建 Excel 的表头和列映射。

  3. 通用导出方法:一个静态方法接收 List<?> 和响应对象,自动完成 Excel 生成。

  4. 支持自定义转换:通过 Converter 接口处理枚举、日期等特殊类型的格式化。

3.2 技术选型

方案
优点
缺点
硬编码 DTO
类型安全、性能好
重复代码多、维护成本高
注解+反射
一行代码搞定、易扩展
反射有轻微性能开销(导出场景可接受)
JSON Schema
灵活
过于复杂,不适合简单导出

我们选择 注解+反射,这是企业级项目中最实用、最易维护的方案。

3.3 完整可运行代码

项目结构

① pom.xml(关键依赖)

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>3.2.0</version>        <relativePath/>    </parent>    <groupId>com.example</groupId>    <artifactId>excel-tool-demo</artifactId>    <version>1.0.0</version>    <properties>        <java.version>17</java.version>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>com.alibaba</groupId>            <artifactId>easyexcel</artifactId>            <version>4.0.2</version>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <optional>true</optional>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>    </dependencies></xml>

② 导出注解 @ExcelExport

package com.heyou.common.excel.export.annotation;import java.lang.annotation.*;/** * Excel导出字段注解 * 放在实体类的字段上,用于定义导出时的列名、顺序、格式化等 */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ExcelExport {    /**     * 列名(表头)     */    String value();    /**     * 列顺序(从小到大排列)     */    intorder() default 0;    /**     * 日期格式化(仅对 Date/LocalDateTime 类型生效)     */    String dateFormat() default "yyyy-MM-dd HH:mm:ss";    /**     * 枚举转换(实现类需提供转换方法)     */    String enumMethod() default "";    /**     * 是否允许为空     */    boolean allowNull() defaulttrue;}

③ 实体类(带注解)

package com.heyou.common.excel.export.entity;import com.example.excel.annotation.ExcelExport;import lombok.Data;import java.math.BigDecimal;import java.time.LocalDateTime;@Datapublic class Order {    @ExcelExport(value = "订单号", order = 1)    private String orderNo;    @ExcelExport(value = "金额", order = 2)    private BigDecimal amount;    @ExcelExport(value = "状态", order = 3)    private Integer status;    @ExcelExport(value = "创建时间", order = 4, dateFormat = "yyyy-MM-dd")    private LocalDateTime createTime;    @ExcelExport(value = "用户ID", order = 5)    private Long userId;    // 不需要导出的字段不加注解    private String internalRemark;}

④ 枚举转换工具(状态码转文字)

package com.heyou.common.excel.export.handler;/** * 枚举转换器接口 */public interface EnumConverter {    String convert(Integer code);}/** * 订单状态转换器实现 */@Componentpublic class OrderStatusConverter implements EnumConverter {    private static final Map<IntegerStringSTATUS_MAP = new HashMap<>();    static {        STATUS_MAP.put(0"待支付");        STATUS_MAP.put(1"已支付");        STATUS_MAP.put(2"已取消");        STATUS_MAP.put(3"已完成");    }    @Override    public String convert(Integer code) {        return STATUS_MAP.getOrDefault(code, "未知");    }}

⑤ 通用导出工具核心类

package com.heyou.common.excel.export.utils;import com.alibaba.excel.EasyExcel;import com.heyou.common.excel.export.annotation.ExcelExport;import com.heyou.common.excel.export.config.ExcelExportSpringBridge;import com.heyou.common.excel.export.service.handler.EnumConverter;import com.heyou.common.excel.export.service.handler.impl.CustomCellWriteHandler;import jakarta.servlet.http.HttpServletResponse;import lombok.extern.slf4j.Slf4j;import java.lang.reflect.Field;import java.net.URLEncoder;import java.nio.charset.StandardCharsets;import java.time.LocalDateTime;import java.time.format.DateTimeFormatter;import java.util.*;import java.util.concurrent.ConcurrentHashMap;/** * 通用Excel导出工具 * 一行代码完成任何列表的导出 */@Slf4jpublic class ExcelExportUtil {    // 缓存类的字段配置,避免重复反射    private static final Map<Class<?>, List<FieldConfig>> FIELD_CONFIG_CACHE = new ConcurrentHashMap<>();    /**     * 通用导出方法(核心)     * @param response HttpServletResponse     * @param dataList 数据列表     * @param fileName 导出文件名(不含后缀)     * @param sheetName Sheet名称     */    public static void export(HttpServletResponse response, List<?> dataList, String fileName, String sheetName) {        if (dataList == null || dataList.isEmpty()) {            throw new IllegalArgumentException("导出数据不能为空");        }        Class<?> clazz = dataList.get(0).getClass();        List<FieldConfig> fieldConfigs = getFieldConfigs(clazz);        if (fieldConfigs.isEmpty()) {            throw new IllegalArgumentException("类 " + clazz.getName() + " 没有配置 @ExcelExport 注解");        }        try {            // 设置响应头            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");            String encodedFileName = URLEncoder.encode(fileName + ".xlsx"StandardCharsets.UTF_8);            response.setHeader("Content-Disposition""attachment; filename*=UTF-8''" + encodedFileName);            // 转换数据并写入Excel            List<List<String>> excelData = convertToExcelData(dataList, fieldConfigs);            List<String> headers = getHeaders(fieldConfigs);            // EasyExcel 动态表头:每列对应 List<String> 的一行单元格(单列单行表头即 singletonList)            List<List<String>> excelHead = headers.stream()                    .map(Collections::singletonList)                    .toList();            EasyExcel.write(response.getOutputStream())                    .head(excelHead)                    .registerWriteHandler(new CustomCellWriteHandler())                    .sheet(sheetName)                    .doWrite(excelData);            log.info("导出成功: {}, 数据量: {} 条", fileName, dataList.size());        } catch (Exception e) {            String detail = e.getMessage() != null ? e.getMessage() : e.getClass().getSimpleName();            log.error("导出失败: {}", detail, e);            throw new RuntimeException("导出失败: " + detail, e);        }    }    /**     * 简化版导出(使用默认Sheet名)     */    public static void export(HttpServletResponse response, List<?> dataList, String fileName) {        export(response, dataList, fileName, "Sheet1");    }    /**     * 获取类的字段配置(带缓存)     */    private static List<FieldConfiggetFieldConfigs(Class<?> clazz) {        return FIELD_CONFIG_CACHE.computeIfAbsent(clazz, c -> {            List<FieldConfig> configs = new ArrayList<>();            for (Field field : c.getDeclaredFields()) {                ExcelExport annotation = field.getAnnotation(ExcelExport.class);                if (annotation != null) {                    FieldConfig config = new FieldConfig();                    config.field = field;                    config.columnName = annotation.value();                    config.order = annotation.order();                    config.dateFormat = annotation.dateFormat();                    config.enumMethod = annotation.enumMethod();                    configs.add(config);                }            }            // 按 order 排序            configs.sort(Comparator.comparingInt(cfg -> cfg.order));            return configs;        });    }    /**     * 获取表头列表     */    private static List<StringgetHeaders(List<FieldConfig> configs) {        return configs.stream()                .map(cfg -> cfg.columnName)                .toList();    }    /**     * 将实体数据转换为Excel行数据     */    private static List<List<String>> convertToExcelData(List<?> dataList, List<FieldConfig> configs) {        List<List<String>> rows = new ArrayList<>();        for (Object obj : dataList) {            List<String> row = new ArrayList<>();            for (FieldConfig config : configs) {                try {                    config.field.setAccessible(true);                    Object value = config.field.get(obj);                    String cellValue = formatCellValue(value, config);                    row.add(cellValue);                } catch (IllegalAccessException e) {                    log.error("读取字段值失败: {}", config.field.getName(), e);                    row.add("");                }            }            rows.add(row);        }        return rows;    }    /**     * 格式化单元格值     */    private static String formatCellValue(Object value, FieldConfig config) {        if (value == null) {            return "";        }        // 日期类型格式化        if (value instanceof LocalDateTime) {            DateTimeFormatter formatter = DateTimeFormatter.ofPattern(config.dateFormat);            return ((LocalDateTime) value).format(formatter);        }        if (value instanceof Integer n && Integer.class.equals(config.field.getType())) {            if (config.enumMethod != null && !config.enumMethod.isBlank()) {                EnumConverter converter = ExcelExportSpringBridge.resolveEnumConverter(config.enumMethod);                if (converter != null) {                    return converter.convert(n);                }            }            return String.valueOf(value);        }        return String.valueOf(value);    }    // 内部类:字段配置    private static class FieldConfig {        Field field;        String columnName;        int order;        String dateFormat;        /** Spring Bean 名,对应 {@link EnumConverter} */        String enumMethod;    }}

⑥ 自定义样式处理器(可选)

package com.example.excel.util;import com.alibaba.excel.write.handler.SheetWriteHandler;import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;import org.apache.poi.ss.usermodel.*;import org.apache.poi.xssf.usermodel.XSSFCellStyle;public class CustomCellWriteHandler implements SheetWriteHandler {    @Override    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {        Sheet sheet = writeSheetHolder.getSheet();        // 设置表头样式        Row headerRow = sheet.getRow(0);        if (headerRow != null) {            Workbook workbook = writeWorkbookHolder.getWorkbook();            CellStyle headerStyle = workbook.createCellStyle();            Font font = workbook.createFont();            font.setBold(true);            headerStyle.setFont(font);            headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());            headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);            headerStyle.setBorderBottom(BorderStyle.THIN);            headerStyle.setBorderTop(BorderStyle.THIN);            headerStyle.setBorderLeft(BorderStyle.THIN);            headerStyle.setBorderRight(BorderStyle.THIN);            headerRow.forEach(cell -> cell.setCellStyle(headerStyle));        }        // 自动调整列宽        for (int i = 0; i < headerRow.getLastCellNum(); i++) {            sheet.autoSizeColumn(i);            sheet.setColumnWidth(i, Math.min(sheet.getColumnWidth(i) + 51215000));        }    }}

⑦ Controller(极致简洁)

package com.example.excel.controller;import com.example.excel.entity.Order;import com.example.excel.entity.User;import com.example.excel.util.ExcelExportUtil;import com.example.excel.service.OrderService;import jakarta.servlet.http.HttpServletResponse;import lombok.RequiredArgsConstructor;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController@RequestMapping("/export")@RequiredArgsConstructorpublic class ExportController {    private final OrderService orderService;    /**     * 订单导出 - 一行代码搞定!     */    @GetMapping("/order")    public void exportOrder(HttpServletResponse response) {        List<Order> orders = orderService.list();        ExcelExportUtil.export(response, orders, "订单报表""订单数据");    }    /**     * 用户导出 - 同样一行代码     */    @GetMapping("/user")    public void exportUser(HttpServletResponse response) {        List<User> users = userService.list(); // User类同样配置@ExcelExport注解        ExcelExportUtil.export(response, users, "用户报表");    }}

⑧ Service(模拟数据)

package com.example.excel.service;import com.example.excel.entity.Order;import org.springframework.stereotype.Service;import java.math.BigDecimal;import java.time.LocalDateTime;import java.util.ArrayList;import java.util.List;@Servicepublic class OrderService {    public List<Order> list() {        List<Order> orders = new ArrayList<>();        for (int i = 1; i <= 100; i++) {            Order order = new Order();            order.setOrderNo("ORD" + System.currentTimeMillis() + i);            order.setAmount(BigDecimal.valueOf(Math.random() * 1000));            order.setStatus(i % 3);            order.setCreateTime(LocalDateTime.now().minusDays(i));            order.setUserId((long) (Math.random() * 1000));            orders.add(order);        }        return orders;    }}

3.4 单元测试

@SpringBootTest@AutoConfigureMockMvcclassExportControllerTest{    @Autowired    private MockMvc mockMvc;    @Test    void testExportOrder() throws Exception {        mockMvc.perform(MockMvcRequestBuilders.get("/export/order"))                .andExpect(status().isOk())                .andExpect(header().string("Content-Disposition", containsString("订单报表.xlsx")));    }}

四、进阶与延伸

4.1 性能优化

  • 反射缓存FIELD_CONFIG_CACHE 避免重复反射,提升性能。

  • 分批导出:大数据量时仍然使用 EasyExcel 的流式写入,本工具已支持。

  • 构建Starter:将通用内容构建为Starter组件,以便引入项目使用。

4.2 功能扩展

// 支持动态列(用户选择导出哪些列)public static void exportWithSelection(HttpServletResponse response,                                         List<?> dataList,                                         List<String> selectedColumns) {    // 根据 selectedColumns 过滤导出列}// 支持多Sheet导出public static void exportMultiSheet(HttpServletResponse response,                                     Map<StringList<?>> sheetDataMap) {    // 多个Sheet写入同一个Excel}

4.3 与第01篇的区别

  对比项
第01篇
第03篇
  适用场景
百万级大数据量导出
常规数据导出(< 10w)
  特点
流式、分页、极致性能
注解驱动、一行代码、易维护
  代码量
每个导出需单独实现
新增导出仅需加注解
  灵活性
较高
极高

五、总结与思考

核心三句话

  1. 90% 的导出代码都是重复的,用注解+反射消除重复。

  2. 一行代码 ExcelExportUtil.export(response, list, "文件名") 搞定任何导出。

  3. 新增导出只需在实体类加 @ExcelExport 注解,零额外工作量。

踩坑 Checklist

  • ✅ 反射读取字段时记得 setAccessible(true)

  • ✅ 字段配置使用缓存,避免重复反射影响性能。

  • ✅ 响应头中的中文文件名需要 URL 编码(URLEncoder.encode)。

  • ✅ 大数据量导出时,仍建议配合第01篇的分页查询方案。

下一篇预告:海量数据CSV压缩导出与异步任务下载——当 Excel 撑不下时,CSV + GZIP 才是终极方案。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-02 01:19:29 HTTP/2.0 GET : https://h.sjds.net/a/523217.html
  2. 运行时间 : 0.179782s [ 吞吐率:5.56req/s ] 内存消耗:4,570.68kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=cb94faf72b1cca92d12901faea3dc123
  1. /yingpanguazai/ssd/ssd1/www/h.sjds.net/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/h.sjds.net/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/h.sjds.net/runtime/temp/ad153693ed39fba6d1bda2fe72512cde.php ( 12.06 KB )
  140. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000641s ] mysql:host=127.0.0.1;port=3306;dbname=h_sjds;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000715s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.001662s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000289s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000572s ]
  6. SELECT * FROM `set` [ RunTime:0.004238s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000626s ]
  8. SELECT * FROM `article` WHERE `id` = 523217 LIMIT 1 [ RunTime:0.000539s ]
  9. UPDATE `article` SET `lasttime` = 1780334369 WHERE `id` = 523217 [ RunTime:0.003391s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.000278s ]
  11. SELECT * FROM `article` WHERE `id` < 523217 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000486s ]
  12. SELECT * FROM `article` WHERE `id` > 523217 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000378s ]
  13. SELECT * FROM `article` WHERE `id` < 523217 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000676s ]
  14. SELECT * FROM `article` WHERE `id` < 523217 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000928s ]
  15. SELECT * FROM `article` WHERE `id` < 523217 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.019718s ]
0.181440s