# Endor Campus 多页面示例 源码:[campus-lms.endor](../examples/campus-lms.endor)。这是参考 Instructure Canvas LMS 信息结构的本地学习环境示例,使用虚构学生、课程与作业数据。 ## 运行与页面 在 Tessera 按 F12 打开 Console,点击 `>` 输入位置,粘贴完整源码并按 Enter。 建议在新会话中运行一次;重复执行会创建另一组页面。 源码建立七个真正的 managed Page:仪表盘、程序设计、高等数学、学术英语、 作业中心、成绩总览和实验提交详情。每页进入应用现有的标签栏,可以切换、 关闭,再通过课程卡片或导航重新打开。没有额外模拟一套网页标签栏。 酒红侧栏提供全局导航,仪表盘用三种课程色区分课程,课程主页展示各自的 介绍和学习单元;作业中心汇总课程作业,成绩总览提供课程成绩与实验反馈。 侧栏的「课程」入口回到程序设计示例课,其余课程从仪表盘卡片或成绩行进入。 ## 对象与交互 三门课程各有一个 `CampusCourse` 对象。程序设计的 `CampusWork` 对象被 仪表盘、作业中心、成绩页和提交详情共同引用,界面通过 `ui.textOf` 绑定字段。 - 「模拟提交实验」更新提交内容和状态;作业中心同步显示等待评分。 - 「应用示例评分」写入预设的 92 / 100 与反馈,并把课程成绩改为 88.5%、 学习进度改为 4 / 6;课程主页、成绩总览和仪表盘同步更新。 - 「恢复演示数据」恢复未提交、无分数、课程 86.0% 和 3 / 6 的进度。 页面导航通过接收 `Event` 的 `CampusTarget.open` 方法调用零参数 `Page.open()`。 不能把有可选 Window 参数的 `Page.open` 直接当作点击回调,否则 Event 会被 误当作 Window。重新打开页面会保留共享对象中的状态。 ## 原生验证 通过原生 Console 输入源码并执行,实际点击检查了: - 三门课程内容各不相同,卡片和全局导航能切换真实 Page。 - 提交后作业中心显示「已提交 · 等待评分」。 - 评分后详情显示 92 / 100 与反馈,课程主页显示 88.5% 和 4 / 6, 成绩总览与仪表盘也显示 88.5%。 - 关闭高等数学标签,再从仪表盘卡片重新打开成功。 - 恢复数据后,详情和成绩总览恢复未提交、无分数和课程 86.0%。 截图保存在本次会话的 `/private/tmp/endor-campus-demo/`,包括仪表盘、 评分详情、成绩总览与恢复后的仪表盘。首次验证时没有成功的连续录屏; 后续建模视频见下节。 本阶段只增加 Endor 源码与说明,没有修改 Rust 渲染器。验证采用原生运行与 手动点击,以及 `git diff --check`;未运行 cargo test 或自动 smoke 脚本。 ## 建模过程视频(2026-10-25) [观看 MP4](media/endor-campus-modeling.mp4) · [中文字幕 SRT](media/endor-campus-modeling.zh.srt) 视频约 72 秒、1920 × 1200,无声,附带中文软字幕与章节。播放器未自动显示 字幕时可以开启中文字幕,或者加载同目录 SRT。 在新 Console 会话中分段执行同一份示例源码:先定义课程和作业模型,再定义 界面组件,创建共享对象图与七个 Page,逐步渲染仪表盘、课程、作业中心、 成绩总览,最后绑定提交与评分事件。末尾实际点击提交和预设评分,展示 作业状态、总评与学习进度在各页之间同步。代码分段粘贴,不是逐字输入。 系统屏幕采集设备虽然可被 FFmpeg 识别,但没有收到画面;因此使用原生 应用控制接口在操作期间连续抓取 Tessera 窗口,再由已有 FFmpeg 编码为 H.264。 共采集 299 帧,采样帧率随操作变化,剪去各采集段之间的等待;输出封装为 15 fps,重复帧不代表原始采样达到了 15 fps。没有使用静态成品截图重演操作。 应用重置后,在首次渲染前保留了上一次页面的显示快照,首次渲染后由新会话 的页面替换。视频包含该过程,并非从应用启动开始的系统录屏。 检查了视频参数、全片解码和抽帧画面;全片解码无错误。录制阶段没有修改 示例程序或 Rust 渲染器。 ## 范围 这是多页面交互示例,没有 Canvas 登录、服务器、持久化、真实文件上传或 通用成绩计算。提交文件名为示例字符串,评分和总评是明确的预设状态, 不是根据公式计算的结果。页面使用双向 ScrollBlock;未完成所有小窗口尺寸的 布局验证。它不替代完整的 LMS 产品。 参考的是 Canvas 的课程卡片、全局导航、作业状态和成绩反馈结构: [Dashboard 官方指南](https://community.instructure.com/en/kb/articles/664620-how-do-i-use-the-dashboard)、 [Grades 官方指南](https://community.instructure.com/en/kb/articles/661305-how-do-i-view-my-grades-in-a-current-course)。 没有登录或查看需要账户的学校数据。