乐于分享
好东西不私藏

批量收集多源 URL 并异步转 PDF 打包下载的完整实现(Spring Boot + Feign + 异步任务)

批量收集多源 URL 并异步转 PDF 打包下载的完整实现(Spring Boot + Feign + 异步任务)

批量收集多源 URL 并异步转 PDF 打包下载的完整实现(Spring Boot + Feign + 异步任务)


场景描述

一个在线教育平台,学生可以批量下载课程资料。资料来自三个不同渠道:

  • 自建课程
    :平台自己的课件系统,有预览页面 URL,需要转成 PDF
  • 合作机构
    :调用合作方接口获取资料 URL,需要转成 PDF
  • 历史归档
    :已经是 PDF 文件,存在 OSS 上,可直接下载

学生勾选多个资料后点击"批量下载",后端需要收集所有 URL,提交给文件服务异步转 PDF 并打包成 ZIP,返回任务 ID 供前端轮询。


一、数据结构定义

/** * 批量下载请求入参 */@Datapublic class BatchDownloadForm {    @ApiModelProperty("自建课程资料ID列表")    private List<String> selfCourseIds;    @ApiModelProperty("合作机构资料ID列表")    private List<String> partnerCourseIds;    @ApiModelProperty("历史归档资料ID列表")    private List<String> archiveIds;    @ApiModelProperty("学生ID")    @NotBlank(message = "学生ID不能为空")    private String studentId;}/** * 文件 URL 封装(提交给文件服务的统一结构) */@Datapublic class FileUrl {    @ApiModelProperty("文件地址(预览页面URL或直接下载地址)")    @NotBlank(message = "url不能为空")    private String url;    @ApiModelProperty("文件名(打包后ZIP内的文件名)")    @NotBlank(message = "文件名不能为空")    private String fileName;    @ApiModelProperty("是否可直接下载(true则跳过转PDF,直接打包原文件)")    private boolean directDownload = false;}/** * 异步任务提交参数 */@Datapublic class AsyncPdfTaskForm {    @ApiModelProperty("系统来源")    @NotBlank(message = "系统来源不能为空")    private String source;    @ApiModelProperty("业务类型(自定义标识,用于区分不同业务的下载任务)")    private String businessType;    @ApiModelProperty("业务编码(如学生ID,用于关联查询任务状态)")    @NotBlank(message = "业务编码不能为空")    private String businessCode;    @ApiModelProperty("URL列表")    @Size(min = 1, message = "URL列表不能为空")    private List<FileUrl> urls;}

二、数据库表(自建课程资料表)

CREATE TABLE `t_course_material` (  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,  `course_id` varchar(50NOT NULL COMMENT '课程ID',  `title` varchar(200NOT NULL COMMENT '资料标题',  `preview_url` varchar(500DEFAULT NULL COMMENT '预览页面URL',  `source_type` varchar(20NOT NULL COMMENT '来源类型:SELF自建/PARTNER合作/ARCHIVE归档',  `pdf_url` varchar(500DEFAULT NULL COMMENT '已归档的PDF地址(仅ARCHIVE类型有值)',  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程资料表';

三、Feign 接口定义

/** * 合作机构资料接口 * 调用合作方系统获取资料预览URL */@FeignClient(name = "partnerFeign", url = "{feign.file-service.url}")public interface FileServiceFeign {    /**     * 提交异步转PDF打包任务     * @param form 任务参数(包含URL列表)     * @return JSON字符串,包含任务ID     */    @PostMapping("/v2/export/asyncUrlToPdf")    String asyncUrlToPdf(@RequestBody AsyncPdfTaskForm form);}

四、Service 完整实现

@Slf4j@Servicepublic class MaterialDownloadServiceImpl {    private final CourseMaterialMapper courseMaterialMapper;    private final PartnerFeign partnerFeign;    private final FileServiceFeign fileServiceFeign;    @Value("{course.preview.base-url}")    private String selfPreviewBaseUrl;    @Value("${spring.application.name}")    private String serviceName;    public MaterialDownloadServiceImpl(CourseMaterialMapper courseMaterialMapper,                                       PartnerFeign partnerFeign,                                       FileServiceFeign fileServiceFeign) {        this.courseMaterialMapper = courseMaterialMapper;        this.partnerFeign = partnerFeign;        this.fileServiceFeign = fileServiceFeign;    }    /**     * 批量下载课程资料     *     * 整体流程:     * 1. 分别处理三种来源的资料,收集所有文件URL     * 2. 提交给文件服务异步转PDF并打包     * 3. 返回任务ID,前端轮询下载     *     * @param form 下载请求参数     * @return 异步任务ID     */    public String batchDownload(BatchDownloadForm form) {        // 统一收集所有文件URL的容器        List<FileUrl> allFileUrls = new ArrayList<>();        // ===== 1. 处理自建课程资料(本地生成签名URL,需要转PDF) =====        if (CollUtil.isNotEmpty(form.getSelfCourseIds())) {            List<FileUrl> selfUrls = buildSelfCourseUrls(form.getSelfCourseIds());            allFileUrls.addAll(selfUrls);        }        // ===== 2. 处理合作机构资料(调用远程接口获取URL,需要转PDF) =====        if (CollUtil.isNotEmpty(form.getPartnerCourseIds())) {            List<FileUrl> partnerUrls = buildPartnerCourseUrls(form.getPartnerCourseIds());            allFileUrls.addAll(partnerUrls);        }        // ===== 3. 处理历史归档资料(已有PDF,直接下载) =====        if (CollUtil.isNotEmpty(form.getArchiveIds())) {            List<FileUrl> archiveUrls = buildArchiveUrls(form.getArchiveIds());            allFileUrls.addAll(archiveUrls);        }        // ===== 4. 校验并提交异步任务 =====        if (CollUtil.isEmpty(allFileUrls)) {            throw new BusinessException("没有可下载的资料");        }        return submitAsyncTask(form.getStudentId(), allFileUrls);    }    /**     * 处理自建课程资料     * 本地拼接预览页面URL + MD5签名(防止URL被篡改)     * directDownload = false,文件服务会打开这个URL渲染页面后转为PDF     */    private List<FileUrlbuildSelfCourseUrls(List<String> courseIds) {        // 批量查询资料信息        List<CourseMaterialEntity> materials = courseMaterialMapper.selectBatchIds(courseIds);        return materials.stream().map(material -> {            FileUrl fileUrl = new FileUrl();            // 生成带签名的预览URL(防止学生篡改URL访问其他资料)            long timestamp = System.currentTimeMillis();            String sign = DigestUtils.md5Hex(material.getCourseId() + "EDU" + timestamp);            String url = String.format("%s?courseId=%s&timestamp=%d&sign=%s",                    selfPreviewBaseUrl, material.getCourseId(), timestamp, sign);            fileUrl.setUrl(url);            fileUrl.setFileName(material.getTitle() + ".pdf");            fileUrl.setDirectDownload(false); // 网页预览,需要转PDF            return fileUrl;        }).collect(Collectors.toList());    }    /**     * 处理合作机构资料     * 调用合作方Feign接口获取预览URL     * 每个调用单独try-catch,单个失败不影响其他资料     */    private List<FileUrlbuildPartnerCourseUrls(List<String> courseIds) {        List<FileUrl> urls = new ArrayList<>();        for (String courseId : courseIds) {            try {                // 生成调用合作方接口的签名                long timestamp = System.currentTimeMillis();                String signature = DigestUtils.md5Hex(partnerSecretKey + timestamp + ":" + courseId);                // 调用合作方接口                String result = partnerFeign.getMaterialPreviewUrl(courseId, timestamp, signature);                JSONObject json = JSONUtil.parseObj(result);                if (!"200".equals(String.valueOf(json.get("code")))) {                    log.error("获取合作方资料URL失败, courseId={}, msg={}", courseId, json.get("message"));                    continue// 单个失败跳过,不影响其他                }                FileUrl fileUrl = new FileUrl();                fileUrl.setUrl(json.getStr("data"));                fileUrl.setFileName("合作课程_" + courseId + ".pdf");                fileUrl.setDirectDownload(false); // 网页预览,需要转PDF                urls.add(fileUrl);            } catch (Exception e) {                // 单个资料获取失败不中断整个流程                log.error("调用合作方接口异常, courseId={}, error={}", courseId, e.getMessage());            }        }        return urls;    }    /**     * 处理历史归档资料     * 已经是PDF文件存在OSS上,直接使用下载地址     * directDownload = true,文件服务直接下载原文件,不做转换     */    private List<FileUrlbuildArchiveUrls(List<String> archiveIds) {        List<CourseMaterialEntity> materials = courseMaterialMapper.selectBatchIds(archiveIds);        return materials.stream()                .filter(m -> StrUtil.isNotBlank(m.getPdfUrl())) // 过滤掉没有PDF地址的                .map(material -> {                    FileUrl fileUrl = new FileUrl();                    fileUrl.setUrl(material.getPdfUrl());                    fileUrl.setFileName(material.getTitle() + ".pdf");                    fileUrl.setDirectDownload(true); // 已是PDF,直接下载                    return fileUrl;                }).collect(Collectors.toList());    }    /**     * 提交异步转PDF打包任务     * 文件服务收到后会:     * 1. 遍历URL列表     * 2. directDownload=false的:打开URL → 渲染页面 → 转PDF     * 3. directDownload=true的:直接下载原文件     * 4. 所有文件打包为ZIP     * 5. 上传到OSS,生成下载链接     *     * @return 任务ID(前端用于轮询下载状态)     */    private String submitAsyncTask(String studentId, List<FileUrl> urls) {        AsyncPdfTaskForm taskForm = new AsyncPdfTaskForm();        taskForm.setSource(serviceName);                    // 来源系统标识        taskForm.setBusinessType("course_material_download"); // 业务类型标识        taskForm.setBusinessCode(studentId);                // 关联到具体学生        taskForm.setUrls(urls);                             // 所有待处理的URL        String result = fileServiceFeign.asyncUrlToPdf(taskForm);        JSONObject json = JSONUtil.parseObj(result);        if (!"1".equals(String.valueOf(json.get("code")))) {            throw new BusinessException("提交下载任务失败:" + json.getStr("msg"));        }        // 返回任务ID        return json.getStr("msg");    }}

五、Controller

@Api(tags = "课程资料下载")@RestController@RequestMapping("/material")public class MaterialDownloadController {    private final MaterialDownloadServiceImpl materialDownloadService;    public MaterialDownloadController(MaterialDownloadServiceImpl materialDownloadService) {        this.materialDownloadService = materialDownloadService;    }    @ApiOperation("批量下载课程资料")    @PostMapping("/batchDownload")    public R<String> batchDownload(@RequestBody @Validated BatchDownloadForm form) {        String taskId = materialDownloadService.batchDownload(form);        return new R<>(taskId);    }}

六、完整流程图

学生勾选资料 → 点击"批量下载"├── 前端发送请求│   {│     "selfCourseIds": ["C001""C002"],│     "partnerCourseIds": ["P001"],│     "archiveIds": ["A001""A002"],│     "studentId""STU_2024001"│   }├── 后端 Service 处理│   ││   ├── 自建课程 C001, C002│   │   ├── 查库获取资料信息│   │   ├── 拼接签名URL:https://edu.com/preview?courseId=C001&timestamp=xxx&sign=xxx│   │   └── FileUrl { url=..., fileName="高等数学第一章.pdf", directDownload=false }│   ││   ├── 合作机构 P001│   │   ├── 生成签名:MD5(secretKey + timestamp + ":P001")│   │   ├── 调用 partnerFeign.getMaterialPreviewUrl("P001", timestamp, signature)│   │   ├── 获取返回的预览URL│   │   └── FileUrl { url=..., fileName="合作课程_P001.pdf", directDownload=false }│   ││   ├── 历史归档 A001, A002│   │   ├── 查库获取已归档的PDF地址│   │   └── FileUrl { url="https://oss.com/xxx.pdf", fileName="线性代数.pdf", directDownload=true }│   ││   └── 合并所有 FileUrl → 提交异步任务├── 文件服务异步处理│   ├── C001: 打开URL → 渲染页面 → 截图/打印 → 生成PDF│   ├── C002: 打开URL → 渲染页面 → 截图/打印 → 生成PDF│   ├── P001: 打开URL → 渲染页面 → 截图/打印 → 生成PDF│   ├── A001: 直接从OSS下载PDF原文件│   ├── A002: 直接从OSS下载PDF原文件│   └── 5个文件打包 → 上传ZIP到OSS → 生成下载链接├── 后端返回任务ID:"task_20240601_001"└── 前端轮询    GET /file/task/status?taskId=task_20240601_001    第1次:{ "status""processing""progress""3/5" }    第2次:{ "status""processing""progress""5/5" }    第3次:{ "status""completed""downloadUrl""https://oss.com/download/task_xxx.zip" }    → 弹出下载

七、关键设计点总结

设计点
实现方式
解决的问题
多源分发
按来源类型分别调用不同方法获取URL
各渠道逻辑独立,互不干扰
统一收集
所有来源最终都收集到 List<FileUrl>
下游文件服务只需一个统一接口
directDownload 标记
区分"需要转PDF"和"直接下载"
避免对已有PDF重复转换
单个失败不中断
合作方接口调用用 try-catch + continue
一个资料失败不影响其他资料
URL 签名
MD5(secretKey + timestamp + bizId)
防止URL被伪造或篡改
异步任务
提交后立即返回任务ID
用户不用等待,大批量文件也不超时
前端轮询
定时查询任务状态直到完成
解耦请求和处理过程

八、适用场景

这个模式适用于所有需要"从多个来源收集文件并统一打包"的场景:

  • 批量下载合同/协议
  • 批量导出不同格式的报表
  • 批量打印快递面单(不同快递公司接口不同)
  • 批量下载电子发票(自开/第三方/历史)
  • 批量导出用户数据(不同模块的数据)

核心套路:分源收集 → 统一封装 → 异步处理 → 轮询获取

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