Skip to main content
Version: Current

项目介绍

主席选举系统(仓库 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。

详见 System Architecture。