Skip to content

ClosedWHU/Luotopia

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

503 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Luotopia 社区开发指南

本文档面向接下来参与 Luotopia 共同开发的贡献者,欢迎大家直接选择自己心怡的模块直接开始开发!

Caution

开发前请一定、务必阅读 README 的开发规约部分。由于开发规约追加更新频繁,请时常查阅以免遗漏。

快速启动

后端

cd D:\Github\Luotopia\Luotopia\Luotopia-server

# 日常开发:Docker 只启动依赖服务,本机运行迁移和 API;该命令会复用已有 Postgres 数据卷
docker compose -f docker-compose.dev.yml up -d && go run ./cmd/migrate && go run ./cmd/server

完整容器化联调或更新服务镜像:

cd D:\Github\Luotopia\Luotopia\Luotopia-server
docker compose -f docker-compose.dev.yml --profile app up -d --build
# 1) 停止服务但保留 Postgres 数据卷
cd /home/projects/Luotopia/Luotopia-server
docker compose -f docker-compose.dev.yml --profile app down --remove-orphans

# 2) 拉取并使用开发态运行(2个 Docker 依赖 + 本机 Go 服务)
cd /home/projects/Luotopia
git pull

cd Luotopia-server
docker compose -f docker-compose.dev.yml up -d postgres redis && go run ./cmd/migrate && go run ./cmd/server

# 3) 拉取并使用打包部署态运行(重建服务镜像,保留数据库数据)
cd /home/projects/Luotopia
git pull

cd Luotopia-server
docker compose -f docker-compose.dev.yml --profile app up -d --build --force-recreate

更新服务时不要执行 docker compose -f docker-compose.dev.yml down -vdocker volume rmdocker system prune --volumes。Postgres 用户数据保存在 Compose 命名卷 luotopia-postgres-data 中,up -d --build 会重建应用镜像并保留该数据卷。

开发规约

代码结构

开发时请遵循现有项目结构:页面型功能放在 lib/features/pages/,可复用组件型能力放在 lib/features/components/,跨模块通用实体、仓储接口和值对象放在 lib/shared/,主题、路由、本地化、时间等基础设施放在 lib/core/

就校园页子应用页面来说,其代码应放在 lib/features/pages/campus/sub_apps/ 下。sub_apps/ 的每个一级代码目录必须与某个实际子应用一一对应,辅助代码应放在所属子应用。具体规则见 校园页子应用架构指南

页面层级与导航

Flutter 客户端页面路由必须按业务归属建模,而不是按入口来源建模。校园页子应用应挂在 /campus/...,设置页只挂真正的设置项,共享账户和认证流程统一挂在 /account/...。例如校园子页面需要武大认证时,应打开 /account/whu,不要跳到 /settings/... 下的登录页。

功能页面不要直接依赖 go_router,也不要直接调用 context.pushcontext.go。普通二级流程使用 AppNavigatorX.openSecondary,弹出式全屏流程使用 AppNavigatorX.openModal,主分支切换才使用 AppNavigatorX.goPrimary。返回页面或关闭 dialog、sheet、webview 时可以使用 Navigator.of(context).pop/maybePop

新增路由时应先在 AppRoutePaths 中定义常量,再在 app_router.dart 中挂到对应业务域。除非已明确做兼容迁移方案,否则不要为同一个页面保留新旧两套路由。

武汉大学教务认证

涉及武汉大学教务系统的能力请使用 whu_auth模块提供的接口,无需自行实现令牌获取、持久化等功能,可以参考 校园页教务认证开发指南

whu_auth 模块使用时如有力所不能及之处请提 issue 我们更新解决之。

Webview 的统一创建器

新增或迁移 WebView 页面时请使用 Webview 统一创建器( app_web_view_page.dart 中的 AppWebViewPage )。

统一创建器负责: WebViewController 的创建或复制加载层、错误层、返回、刷新逻辑。

属于业务页面负责:认证检查、CAS Cookie 准备、Header 规则、导航拦截、 JS Bridge。通过 AppWebViewPage 提供的回调接入。

详细接入方式见 WebView 页面调用规范

UI 规范

本仓库中的 UI 开发请使用 shadcn_flutter 组件库或与之风格相同的自建组件,以使全局风格统一。

自建组件请从页面中独立出来以便复用。

待开发功能列表目录

待开发模块分客户端功能服务端协同功能,前者可以直接在本仓库开发完了,后者需要一并认领Luotopia-Server仓库里的对应issue一并开发完成之。

待开发模块目录:

客户端功能

空闲教室

复杂度:

目的是用符合交互逻辑的简洁直观 UI 使用户能便捷了解/查询/决策全校全校区空闲教室相关信息。

模块需求:

  • 支持按日期、校区、教学楼、节次查询空闲教室。
  • 展示教室名称、容量、楼栋、可用节次等信息。
  • 支持加载、空结果、授权失败、接口异常、解析失败状态。
  • 缺省查询条件尽量保持轻量
  • 支持直接把选定的空间教室的自习工作直接加入日程。

要求设计交互逻辑合理简洁。

蹭课推荐

复杂度:

此功能依赖于全校课表功能的开发。

模块需求:

  • 基于用户当前空闲时间、本地课程表和全校课表数据生成可蹭课程候选。
  • 支持按当前时间、校区/地点距离、课程热度、教师、课程类型筛选。
  • 候选结果能查看课程详情,并可加入本地日程。
  • 有推荐时将结果推送至校园页主页

图书借阅

复杂度:

要求与 lib.whu 建立稳定的交互方式,使用户可以在应用页面里完成图书馆相关操作。

模块需求:

  • 接入图书馆馆藏查询系统。
  • 展示当前借阅、到期时间、续借状态、馆藏位置。
  • 支持续借、借阅历史、到期提醒。
  • 到期提醒应接入系统通知模块,而不是只在校园页展示静态提示。

图书馆座位预约

复杂度:

模块需求:

  • 支持查询可预约空间、日期、时间段和座位。
  • 支持创建预约、取消预约、查看我的预约。
  • 预约成功后可选择写入本地事项,并可设置提醒。
  • 使用合理的 UI 和交互逻辑设计。

运动场馆预约

复杂度:

模块需求:

  • 支持查询场馆、项目、日期、时段和可预约状态。
  • 支持预约、取消预约、查看我的预约。
  • 预约记录可同步为本地日程事项。
  • 使用合理的 UI 和交互逻辑设计。

珞珈 E 卡与 E 卡付款码

复杂度:

直接放俩 webview 在那儿就行。注意用正确的用户令牌权限传入方式。

成绩功能增强

复杂度:

成绩页可扩展为更完整的绩点/综测分析模块。

目前的问题主要是 UI 交互逻辑不太合理,并且功能也太少,允许并鼓励开发者重新设计一套 view 。 注意调研武大实际总绩点与综测计算规则。

模块需求:

  • 支持总成绩、绩点、学分统计、挂科/重修标识、课程类别筛选。
  • 支持历年成绩趋势和学期对比。
  • 支持导出或复制成绩摘要,但不要默认上传到服务端。
  • 与课程给分模块关联时,只传递必要课程标识,不上传用户个人成绩。

服务端协同功能

以下功能需要 Luotopia 账号或服务端接口协同。当前 Luotopia 登录注册已有客户端页面和本地 token 缓存,但 LuotopiaAuthRepository.baseUrl 仍是 http://10.0.2.2:8080,生产环境配置和服务端能力需要继续完善。

Luotopia 账号与服务端环境配置

复杂度:

模块需求:

  • 将服务端地址从硬编码本地模拟器地址改为可配置的环境配置。
  • 明确开发、测试、生产环境的 API baseUrl 管理方式。
  • 统一处理 token 过期、刷新、退出登录、服务端错误码。
  • 为需要登录的模块提供统一的授权请求封装。

验收标准:

  • token 失效后用户能重新登录,业务页不会无限失败。
  • 论坛、课程评价、学习资料共享等模块可复用同一认证能力。

全校课表

复杂度:

全校课表更新频率低,爬取逻辑复杂,适合放在服务端。 客户端每次打开全校课表应用时比对当前本地缓存,落后时从服务器更新新表,在本地持久化保存。

客户端重点在于性能优化,以及向用户公开丰富且合理的查询、筛选参数。 相关功能参考“https://jwgl.whu.edu.cn/design/viewFunc_cxDesignFuncPageIndex.html?gnmkdm=N214599&layout=default”

论坛:珞珈防空洞

复杂度: ——讨论后开发

天气模块

复杂度:

校园页顶部天气卡目前使用 mock 数据。要求服务端接入天气接口,客户端按需请求服务器显示实时天气。

模块需求:

  • 服务端代理天气接口,避免客户端暴露第三方天气 API Key。
  • 客户端展示实时天气、体感温度、最高/最低温、空气质量、逐小时预报。
  • 默认位置为武汉大学,可扩展用户当前位置。
  • 天气功能对所有用户开放,未登录状态也应通过公开统一拉取获取天气。
  • 支持缓存最近一次成功数据,接口失败时展示缓存时间和重试入口;首次无缓存时可显示 mock 数据,并在更新时间位置明确标注待更新。

设置页服务器头图

复杂度:

设置页顶部头图应作为服务端驱动内容,不受用户本地壁纸配置控制。当前设置页头图复用了应用内壁纸能力,后续应改为从 Luotopia Server 获取当前头图信息,客户端及时更新并缓存显示。

模块需求:

  • 服务端提供当前设置页头图信息,包括图片地址、更新时间、来源说明等必要元数据。
  • 客户端从 Luotopia Server 拉取头图,不在客户端暴露第三方图片 API Key 或服务端内部来源。
  • 客户端缓存最近一次成功图片,接口失败时继续展示缓存图片,并能记录或展示缓存更新时间。
  • 首次无缓存且请求失败时展示明确降级背景,不影响设置页账号与功能入口使用。
  • 设置页头图与用户自定义壁纸中心解耦,避免用户修改主页/列表壁纸时影响设置页品牌视觉。

验收标准:

  • 设置页头图能从服务端获取并显示。
  • 服务端更新头图后,客户端能在合理时机刷新本地缓存。
  • 离线或接口失败时能显示最近一次成功缓存。
  • 无缓存失败态不遮挡设置页主要内容。

课程给分

复杂度:

校园页已有“课程给分”入口,课程详情页也有静态给分展示,但没有真实数据和服务端接口。

模块需求:

  • 按课程维度展示给分统计:总评、平时、期末、成绩分布、样本数。
  • 支持按教师、学期、课程性质筛选。
  • 支持用户匿名提交自己的给分数据。
  • 服务端聚合数据,客户端只展示聚合结果,避免暴露个人成绩。
  • 与本地课程事项、全校课表结果建立课程标识映射。

验收标准:

  • 从校园页或课程详情页进入都能看到同一课程的真实给分统计。
  • 样本数不足时明确提示,不显示误导性统计。
  • 登录用户提交后能看到状态反馈,重复提交策略明确。

课程评价(原 whu.sb)

复杂度:

校园页已有“课程评价”入口,课程详情页有静态评价卡片。需要接入真实课程评价社区功能。

模块需求:

  • 展示课程评分、评价列表、评价标签、教师维度信息。
  • 登录用户可匿名发布评价、编辑或删除自己的评价。
  • 支持点赞、举报、排序和分页。
  • 服务端需要审核/风控能力,客户端展示待审核、已隐藏等状态。
  • 兼容原 whu.sb 的数据迁移或导入策略,如果服务端提供历史数据。

验收标准:

  • 课程详情页不再展示静态 mock 评价。
  • 用户能查看真实评价并提交新评价。
  • 被举报或审核中的内容有明确展示规则。

学习资料共享

复杂度:

需与 Openwhu 等友社组织讨论后确认接入方式。

校园页已有“学习资料共享”入口,当前无页面和服务端接口。

模块需求:

  • 按课程、教师、学期、资料类型检索资料。
  • 支持上传资料、下载资料、收藏资料。
  • 上传需要 Luotopia 登录,并记录审核状态。
  • 资料需支持基础元数据:标题、课程、教师、描述、文件类型、大小、上传者匿名信息。
  • 服务端负责文件存储、访问控制、审核和滥用处理。

验收标准:

  • 用户能按课程搜索并下载资料。
  • 登录用户能上传资料并看到审核状态。
  • 无资料、上传失败、文件过大、无权限等状态都有明确提示。

客户端扩展功能

壁纸中心与页面背景配置

复杂度:

项目已有 features/components/wallpaper/、Bing 每日图获取缓存能力和 AppWallpaperBackground,但还没有完整的壁纸配置中心。后续应把壁纸能力正式做成用户可控制的应用背景系统。

模块需求:

  • 支持用户选择“不设壁纸”、本地图片、Bing 每日图作为壁纸来源;缺省值为“不设壁纸”。
  • 本地图片和 Bing 图片地位等同,用户选哪个就使用哪个,不要默认强行显示在线壁纸。
  • 支持主页表格页配置背景图像,并保证表格、事项块、文字在浅色/深色图片上仍可读。
  • 支持任务列表页按分列表分别配置壁纸,至少覆盖“我的一天”“全部事项”“任务”“日程”“备忘”这些现有列表。
  • 复用并扩展现有 components/wallpaper 能力,不要另起一套壁纸下载、缓存和展示系统。
  • 支持图片缓存、图片读取失败、在线来源失败、无壁纸等状态的明确降级。

验收标准:

  • 用户可以在设置或列表设置入口选择壁纸来源。
  • 不设壁纸时,主页和列表页保持原有清爽背景,不请求不必要的在线壁纸。
  • 本地图片和 Bing 图片都能作为主页背景使用。
  • 列表页不同分列表可以显示不同壁纸配置。
  • 壁纸加载失败时页面仍可正常使用,不出现空白或遮挡主要内容。

提醒与系统通知

复杂度:

事项编辑器已经支持保存提醒选项,详情页也能展示提醒字段,但应用还没有真正调度系统通知。

模块需求:

  • 为任务、日程、备忘建立通知调度服务。
  • 根据 ReminderOption 计算通知触发时间,支持准时、提前 5 分钟、提前 15 分钟、提前 1 小时、提前 1 天。
  • 创建、编辑、删除事项时同步创建、更新、取消通知。
  • 应用启动时校准未来通知,避免本地数据和系统通知状态不一致。
  • Android 端处理通知权限申请、通知渠道、点击通知打开事项详情。

验收标准:

  • 创建带提醒的事项后,系统能在正确时间发出通知。
  • 修改事项时间或提醒策略后,旧通知不会继续触发。
  • 删除事项后,对应通知被取消。

重复事项与复杂重复规则

复杂度:

事项编辑器已有重复规则选择,RepeatSettingsPage 仍提示“复杂重复规则后续继续扩展”。当前重复规则还没有完整的事项实例展开、完成态处理和日历展示闭环。

模块需求:

  • 明确重复事项的数据模型:保存原始事项和重复规则,按视图范围展开实例。
  • 支持每天、工作日、每周、每月、每年这些现有 RepeatRule
  • 主页、列表页、AI 查询、详情页都能识别重复实例。
  • 支持单次完成、恢复完成、删除整组重复事项的最小闭环。
  • 后续复杂规则可扩展自定义间隔、结束日期、指定星期等,但第一阶段不要引入过度复杂模型。

验收标准:

  • 创建每周重复事项后,主页切换到后续周能看到对应实例。
  • 列表页“我的一天”能显示当天重复实例。
  • 完成当天实例不应错误地完成所有未来实例,除非明确选择整组操作。

AI 会话管理补全

复杂度:

AI 页已支持 OpenAI-compatible 接口、流式回复、事项草稿生成和会话列表,但 AI 会话虽然写入了 SharedPreferences,启动阶段还没有把 ai.sessionsai.activeSessionId 恢复到 aiChatBootstrapSessionStoreProvider

模块需求:

  • 在启动加载阶段读取 AI 会话列表和当前会话 ID。
  • 会话列表支持删除会话、重命名会话、清空历史。
  • 当前会话被删除时自动选择最近会话,没有会话时创建空会话。
  • AI 返回解析失败时保留用户输入和错误信息,方便重试。
  • 不把 API Key、系统提示词或隐私数据写进聊天消息明文以外的调试输出。

验收标准:

  • 重启应用后能看到历史 AI 会话。
  • 删除当前会话不会导致 AI 页空指针或无法发送。
  • 未配置 AI 时继续显示设置引导,不阻塞其它页面。

设置页占位入口

复杂度:

设置首页 Lorem Ipsum部分将是友情链接的地方

新增 Android 小组件与其它系统桌面小组件

复杂度:

项目已有部分 Android 小组件布局、刷新 worker 和同步服务。要求在现有能力基础上改善、新增 Android 桌面小组件,并为 iOS、macOS、Windows、Linux 等其它系统补齐各自平台可行的桌面小组件或等价入口。

模块需求:

  • Android 侧继续完善现有小组件:点击事项进入事项详情,点击新增进入事项编辑页。
  • Android 侧新增更多尺寸和形态的小组件,如今日事项、课程方格、周课程、快速创建、倒计时/即将开始事项等。
  • 根据设置同步语言、主题和刷新频率,支持深色模式与系统动态色的合理适配。
  • 支持课程方格、日程列表、快速创建等不同小组件的数据边界,当本地事项为空、数据过期或同步关闭时展示明确状态。
  • 调研并实现其它系统桌面小组件或等价能力:
    • iOS / iPadOS:WidgetKit 小组件,优先支持今日事项、课程表、快速查看。
    • macOS:优先复用 WidgetKit 或提供菜单栏/通知中心入口。
    • Windows:调研 Windows Widgets、托盘/开始菜单磁贴等可行入口,无法原生支持时给出替代方案。
    • Linux:调研桌面环境差异,优先提供托盘、通知或可嵌入面板的轻量入口。
  • 各平台实现应共享同一份事项快照语义,避免每个平台各自重新定义数据结构。

验收标准:

  • Android 小组件能稳定显示当前事项数据,应用内增删改事项后能及时刷新。
  • 新增 Android 小组件至少覆盖一个现有小组件没有覆盖的使用场景。
  • 至少完成一个非 Android 平台的小组件或等价桌面入口原型,并在文档中说明该平台限制。
  • 小组件入口跳转到正确页面,无法深链的系统需要给出明确降级行为。

About

次世代武汉大学校园生活应用

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors