当前位置:首页>课件>复旦 iCourse 课件批量导出教程

复旦 iCourse 课件批量导出教程

  • 2026-07-29 05:59:09
复旦 iCourse 课件批量导出教程

本人在复习本科最后一门课程时突发奇想,用codex临时做了

fdu-icourse-slides课件整理工具(正文几乎由AI撰写,因为本人懒)。该工具的适用范围为:文科或数学等课件中文字、公式较多的课程,且教师授课速度适中,不会飞速带学生过ppt。
本文说明如何使用 fdu-icourse-slides ,将复旦 iCourse 回放中的 PPT 课件截图批量导出,并按每节课一个 PDF的形式合成文件。

项目中的 Python 脚本可在本人的GitHub仓库中下载:

https://github.com/chichung0921/fdu-icourse-slides

本文流程适用于复旦 iCourse 中当前登录账号有权限访问的课程资源。脚本不保存账号密码,不用于绕过课程访问权限。使用时只需要替换目标课程的 course_idtenant_code 和输出目录。

1. 准备环境

先下载 GitHub 仓库,并进入项目目录。目录中应包含:

scripts/fudan_icourse_slides.py

确认 Python 能运行脚本:

python3 scripts/fudan_icourse_slides.py --help

如果提示缺少依赖,安装:

python3 -m pip install requests pillow

其中:

  • requests
     用于请求和下载图片;
  • pillow
     用于将图片合成为 PDF。

2. 找到课程参数

打开目标课程详情页,URL 通常类似:

https://icourse.fudan.edu.cn/coursedetail?course_id=COURSE_ID&tenant_code=TENANT_CODE

记录两个参数:

COURSE_IDTENANT_CODE

例如:

https://icourse.fudan.edu.cn/coursedetail?course_id=35035&tenant_code=222

对应参数为:

COURSE_ID=35035TENANT_CODE=222

后续命令中凡是出现 COURSE_IDTENANT_CODE 的位置,都需要替换成目标课程的真实值。

3. 登录课程页

在 Safari 中打开目标课程详情页,并确认已经登录,且能够看到课程回放列表。

注意:后续生成索引 JSON 时,脚本会在 Safari 当前页面中执行 JavaScript,因此 Safari 当前标签页必须是:

icourse.fudan.edu.cn

不要停留在 GitHub、教程页面或其他网页。

如果 Safari 当前页面错误,生成的 JSON 可能会出现:

{ ”has_token”: false, ”lesson_count”: 0, ”lessons”: []}

这种情况通常不是课程没有内容,而是脚本运行在了错误页面上。

4. 开启 Safari JavaScript 自动化

Safari 菜单栏打开:

Develop -> Allow JavaScript from Apple Events

如果没有 Develop 菜单,先到:

Safari -> Settings -> Advanced -> Show features for web developers

然后再回到菜单栏启用:

Develop -> Allow JavaScript from Apple Events

5. 生成课件索引 JSON

课件索引 JSON 用于记录课程课次和 PPT 截图接口返回值。该文件不保存账号密码。

先创建临时目录:

mkdir -p tmp/icourse

然后运行下面的命令。使用前需要替换其中的 COURSE_ID 和 TENANT_CODE

osascript <<'APPLESCRIPT' > tmp/icourse/icourse_COURSE_ID_ppt_index.jsontell application id ”com.apple.Safari” set js to ”(async () => { const COURSE_ID = 'COURSE_ID'; const TENANT_CODE = 'TENANT_CODE'; function authHeaders() { const rawCookieToken = (document.cookie.match(/(?:^|;\\s*)_token=([^;]+)/) || [])[1] || ''; let token = rawCookieToken ? decodeURIComponent(rawCookieToken) : (localStorage.getItem('token') || sessionStorage.getItem('token') || ''); const match = token.match(/_token\\\”;i:\\d+;s:\\d+:\\\”(.+?)\\\”/) || token.match(/_token[^\\\”]*\\\”(.+?)\\\”/); if (match) token = match[1]; const headers = {}; if (token) { headers.Authorization = token.startsWith('Bearer ') ? token : `Bearer ${token}`; } return headers; } async function getJson(path, query = {}) { const url = new URL(path, location.origin); Object.entries(query).forEach(([key, value]) => { if (value !== undefined && value !== null && value !== '') { url.searchParams.set(key, value); } }); const res = await fetch(url, { headers: authHeaders(), credentials: 'include' }); const text = await res.text(); try { return JSON.parse(text); } catch (error) { return { parse_error: String(error), status: res.status, text: text.slice(0, 1000) }; } } const catalogue = await getJson('/courseapi/v2/course/catalogue', { course_id: COURSE_ID }); const rawLessons = []; function walk(value) { if (Array.isArray(value)) { value.forEach(walk); } else if (value && typeof value === 'object') { if (value.sub_id || value.id) rawLessons.push(value); Object.values(value).forEach(walk); } } walk(catalogue); const seen = new Set(); const lessons = []; for (const item of rawLessons) { const subId = String(item.sub_id || item.id || ''); if (!subId || seen.has(subId)) continue; seen.add(subId); const title = item.sub_title || item.title || item.name || item.subject_name || ''; const status = String(item.sub_status || item.status || ''); const pptIndex = await getJson('/pptnote/v1/schedule/search-ppt', { course_id: COURSE_ID, sub_id: subId, page: 1, per_page: 200 }); lessons.push({ course_id: COURSE_ID, sub_id: subId, tenant_code: TENANT_CODE, title, date: title, status, ppt_index: pptIndex }); } return JSON.stringify({ course_id: COURSE_ID, tenant_code: TENANT_CODE, safari_url: location.href, has_token: Boolean(authHeaders().Authorization), generated_at: new Date().toISOString(), lesson_count: lessons.length, lessons }, null, 2);})() do JavaScript js in current tab of front windowend tellAPPLESCRIPT

生成后检查 JSON 格式:

python3 -m json.tool tmp/icourse/icourse_COURSE_ID_ppt_index.json > /dev/null

如果没有报错,说明 JSON 文件格式正常。

6. 检查索引 JSON

打开生成的 JSON,重点检查以下字段:

{ ”course_id”: ”35035”, ”tenant_code”: ”222”, ”safari_url”: ”https://icourse.fudan.edu.cn/coursedetail?course_id=35035&tenant_code=222”, ”has_token”: true, ”lesson_count”: 10, ”lessons”: []}

其中最重要的是:

safari_urllesson_countlessons

safari_url 应当是目标课程详情页,而不是 GitHub 或其他页面。

如果生成结果类似:

{ ”safari_url”: ”https://github.com/...”, ”has_token”: false, ”lesson_count”: 0, ”lessons”: []}

说明 Safari 当前标签页不正确。需要切换到 iCourse 课程详情页后重新运行索引生成命令。

has_token 为 false 不一定表示失败。部分情况下浏览器会通过 Cookie 保持登录态。只要 lesson_count 大于 0,并且 lessons 中包含课次数据,就可以继续执行后续步骤。

7. 批量生成每节课 PDF

索引 JSON 生成后,运行:

python3 scripts/fudan_icourse_slides.py \ --browser-json tmp/icourse/icourse_COURSE_ID_ppt_index.json \ --out-dir output/icourse_COURSE_ID_slides

脚本会自动完成以下操作:

  1. 读取每节课的 sub_id
  2. 提取该节课的 PPT 截图 URL;
  3. 下载原图;
  4. 过滤缩略图;
  5. 按顺序合成 PDF;
  6. 跳过没有 PPT 截图索引的课次。

输出目录通常包含:

课程名_sub_id.pdf课程名_sub_id/downloads/课程名_sub_id/urls.txt课程名_sub_id/api_payloads.json

其中:

  • 课程名_sub_id.pdf
     是合成后的 PDF;
  • downloads/
     保存下载到的图片;
  • urls.txt
     保存识别到的图片 URL;
  • api_payloads.json
     用于排查接口数据。

8. 只导出某一节课

如果已经知道某节课的 sub_id,可以只生成这一节:

python3 scripts/fudan_icourse_slides.py \ --browser-json tmp/icourse/icourse_COURSE_ID_ppt_index.json \ --sub-id SUB_ID \ --out-dir output/icourse_COURSE_ID_slides

如果不知道 sub_id,可以从索引 JSON 中查看:

python3 - <<'PY'import jsonfrom pathlib import Pathdata = json.loads(Path(”tmp/icourse/icourse_COURSE_ID_ppt_index.json”).read_text())for lesson in data.get(”lessons”, []): print(lesson.get(”sub_id”), lesson.get(”title”) or lesson.get(”date”))PY

9. 换一门课程时怎么做

换课程只需要重新执行三步:

  1. 在 Safari 中打开新课程详情页并登录;
  2. 重新运行索引生成命令,替换 COURSE_ID 和 TENANT_CODE
  3. 使用新的索引 JSON 运行批量生成命令。

建议每门课使用独立输出目录:

output/icourse_COURSE_ID_slides

这样不同课程的 PDF 和下载图片不会混在一起。

10. 常见问题

10.1 生成的 JSON 中 lesson_count 为 0

优先检查:

”safari_url”: ”...”

如果 safari_url 不是 iCourse 课程详情页,说明 Safari 当前页面不正确。切换到课程详情页后重新运行命令。

如果 safari_url 正确,但 lesson_count 仍为 0,检查是否已经登录,或者当前账号是否有权限访问该课程。

10.2 has_token 为 false

has_token 为 false 不一定影响后续流程。重点看 lesson_count 和 lessons 是否有内容。

如果课程目录和 PPT 索引已经成功写入 JSON,可以继续运行 Python 脚本。

如果同时出现:

”lesson_count”: 0,”lessons”: []

则需要重新检查 Safari 当前页面和登录状态。

10.3 出现 Auth Forbidden 或下载失败

通常是登录态失效。解决方法:

  1. 重新在 Safari 中登录 iCourse;
  2. 回到目标课程详情页;
  3. 重新生成索引 JSON;
  4. 再运行 Python 脚本。

如果仍然失败,可以从浏览器开发者工具复制完整 Cookie,并在运行脚本时使用:

python3 scripts/fudan_icourse_slides.py \ --browser-json tmp/icourse/icourse_COURSE_ID_ppt_index.json \ --cookie '这里粘贴完整Cookie' \ --out-dir output/icourse_COURSE_ID_slides

10.4 生成的 PDF 数量少于课次数量

常见原因:

  • 某节课本身没有 PPT;
  • 回放还在生成中;
  • 平台 PPT 识别失败;
  • 课程目录中存在未发布、已删除或不可访问的课次;
  • /pptnote/v1/schedule/search-ppt
     返回 total: 0

可以用下面的命令检查哪些课没有 PPT 截图索引:

python3 - <<'PY'import jsonfrom pathlib import Pathdata = json.loads(Path(”tmp/icourse/icourse_COURSE_ID_ppt_index.json”).read_text())for lesson in data.get(”lessons”, []): ppt = lesson.get(”ppt_index”) or {} if int(ppt.get(”total”) or 0) == 0: print(lesson.get(”sub_id”), lesson.get(”title”) or lesson.get(”date”), ”no ppt screenshots”)PY

如果某节课 ppt_index.total 为 0,说明平台没有提供 PPT 截图索引,脚本不会生成该节课的 PDF。

10.5 图片顺序不正确

脚本默认按照文件名中的数字自然排序。正常情况下,平台图片名就是页码顺序。

如果某门课文件名异常,可以检查:

output/icourse_COURSE_ID_slides/<lesson>/urls.txt

必要时可以手动调整图片文件名后重新合成 PDF。

11. 安全说明

请仅导出本人账号有权限访问的课程资源。

不要将账号密码写入脚本或教程。不要公开包含个人登录态的 Cookie、token 或完整浏览器会话信息。不要将导出的课程资料公开传播。

本流程只使用已登录浏览器当前用户可访问的课程资源,主要用于个人学习资料整理。

最新文章

随机文章

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