Server Actions
业务写操作全部是 'use server' 函数。没有对外 REST 资源。下表按模块列出;权限以代码为准。
用户(仅 admin)
| 函数 | 文件 | 作用 | 副作用 |
|---|---|---|---|
updateUserRole | app/(dashboard)/admin/users/actions.ts | 改角色 | 不能去掉唯一 admin |
addEmailsFromText | 同上 | 文本批量加邮箱 | 插入 users |
| 单条创建 / 更新资料 / 导入表格 / 删除 | 同上 | CRUD 与 xlsx 导入 | revalidatePath('/admin/users') 等 |
竞选(仅 admin,入卷例外)
| 函数 | 文件 | 作用 |
|---|---|---|
createCampaign | app/(dashboard)/admin/campaigns/actions.ts | 插入竞选、规则、名簿;candidateCanVote/HasVote 固定 false |
| 更新竞选 / 名簿 | 同上 | 名簿走 syncCampaignCandidateNameOptions(全量替换) |
| 保存规则 | rule-actions.ts → persistCampaignRuleWeightRows | 写 campaign_rule_weights 并同步权重 |
enrollRegisteredUsersInCampaign | enroll-action.ts | admin 或 moderator;只入卷 role=voter |
加入与投票
| 函数 | 文件 | 权限 | 作用 |
|---|---|---|---|
joinOngoingCampaign | campaigns/join-action.ts | 已登录 | 进行中才能加入;写 participation + ballot |
submitCastVote | campaigns/[id]/vote/actions.ts | 已登录且非 admin | 校验 ongoing、候选人、合计等于权重、尚未投过 |
选票管理(admin 或 moderator)
| 函数 | 文件 | 作用 |
|---|---|---|
setCampaignOngoing | ballots/ballot-page-actions.ts | 开启 / 结束投票 |
resetCampaignBallots | 同上 | DELETE FROM ballots WHERE campaign = ?(分票级联删除) |
共享库(非 Action,但写库)
| 函数 | 文件 | 作用 |
|---|---|---|
syncBallotWeightsForCampaign | lib/campaign-voter-weight.ts | 刷新 weight,按比例缩放已有分票 |
syncCampaignCandidateNameOptions | lib/campaign-candidate-sync.ts | 删除并重建名簿 |
refreshCampaignBallotsAfterParticipation | lib/refresh-campaign-ballots.ts | 按参与关系补全 / 清理选票行 |