85 lines
4.9 KiB
Markdown
85 lines
4.9 KiB
Markdown
# 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)。
|
||
没有登录或查看需要账户的学校数据。
|