项目介绍
主席选举系统(仓库 election,npm 名 bucssa-portal)是波士顿大学中国学生学者联合会(BUCSSA)的内部公投门户。它解决的是:在册成员按组织身份获得不同票数,把票拆分给本场候选人名簿,并在结束后按分票合计排名。
应用壳标题写的是「BUCSSA Portal」,容易和 Django 招新门户混淆,请按下表区分。
解决什么问题
- 用 Google 账号登录,且仅允许
public.users中已登记的邮箱进入 - 按「部门 + 职位」为每场竞选单独配置可投总票数
- 候选人来自管理员维护的展示名名簿,不必是系统用户账号
- 一张选票可拆给多名候选人,合计必须等于本场权重;提交后不可改
- 管理员 / 审核员开启或结束投票、批量入卷、清空本场选票、查看排名
不是什么
| 容易混淆的对象 | 关系 |
|---|---|
Django 门户系统(cssaportal,portal.bucssa.org) | 招新 / 报销 / 教室;与本仓库无关。门户文档见 门户 · Introduction |
top-voter 晚会节目投票 | 另一套投票应用,不是主席选举 |
仓库内旧 docs/项目说明.md | 历史说明。其中的单选投票、选票转移、邀请码加入、账号型候选人已不是当前行为 |
当前行为 vs 已废弃
| 状态 | 内容 |
|---|---|
| 当前行为 | 分票模型(ballot_allocations);名簿型候选人(campaign_candidate_options);自助加入或批量入卷 |
| 仍写入库、主流程不用 | campaigns.code / candidateCode / defaultBallots;角色枚举里的 candidate |
| 已废弃 | 选票委托转移路由;邀请码加入页;ballots.candidate 指向 users.id 的单选模型 |
| 待完善 | 仓库无完整建库脚本、无自动化测试、无 CI;结果页只校验「投票是否结束」,不限制角色 |
架构一句话
浏览器 → Next.js App Router(中间件只拦未登录)→ Server Components / Server Actions → 原生 SQL(public.*)→ Neon PostgreSQL;登录走 NextAuth v5 + Google OAuth。