Skip to content

About

面向学生协会的门户:内容发布、会员身份核验与账号管理。v1.0.0 为首个测试版,尚未经过长期生产环境验证。

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Association Portal · 协会门户

为小型协会提供内容发布、会员身份核验与账号管理的网站。公开站点和管理后台分开运行,适合希望自行托管、愿意维护 Node.js 与 PostgreSQL 的开发者和协会技术人员。

v1.0.0 是首个测试版,尚未经过长期生产环境验证。 当前建议在隔离环境使用虚构数据试用。版本号不代表稳定性保证。维护者不承诺持续更新、技术支持、安全修复时限或服务等级,详见 维护与责任说明。

项目特色:围绕协会实际工作组织功能

协会网站的工作会随着活动和人员变化持续发生:有人写公告,有人核验会员,新干事需要账号,旧维护者需要退出。这个项目把这些操作接在同一套后台里,公开站点读取对应的发布结果。

人员按学年或任务更替,账号可以设置相应期限。

例如,为本学年的宣传干事建立独立账号,设置角色和有效期;临时增加某项权限时,也可以单独限定范围及期限。人员离开时停用账号,系统撤销其会话。新同事通过一次性临时凭证设置自己的密码,不必接手上一位同事的密码。账号及权限的关键变更有审计记录,方便接任者追查操作。这些能力用于日常人员管理;正式 owner 的初始化与交接恢复仍需后续补齐。见账号操作手册。

线下确认身份,线上由本人认领账号并设置密码。

例如,协会已在线下确认某位同学的会员身份,管理员可以关联会员档案、预配置账号及目标角色;本人在公开认领页核验信息并设置密码,管理员批准后才可登录。申请人填写的身份不会直接变成系统权限。无法匹配档案的人可以进入人工核验,管理员明确决定关联已有档案还是新建档案;核验通过后再处理账号,避免把“会员资料已确认”和“已经获得登录权限”混在一起。见会员认领流程。

改稿与公开分开,正在编辑的内容不会直接替换访客看到的版本。

例如,一条公告已经发布,编辑者正在修正正文,可以先保存新版草稿,访客继续看到旧公开版本;具备发布权限的人确认后再发布变更。公告、新闻、协会页面、活动和画廊采用这一发布方式。需要撤下内容时有明确的下线动作,关闭相应公开入口;首页首次发布后保留,通过新版更新。这是草稿与发布机制,当前不包含多级内容审批队列。可先按公告手册试完整流程。

活动取消后仍能告知访客发生了什么。

例如,原定观星活动因天气取消,可以发布取消状态和说明,活动继续留在目录及详情中,原链接仍能告知变化。确实需要从目录撤下时再使用下线操作。临时活动记录开始与结束时间,常驻活动记录开放时间说明,适合同时维护一次性讲座、观测活动和长期开放安排。见活动操作手册。

图片先作为私有资产上传,再随画廊作品公开。

例如,成员提交一张摄影作品,上传后系统生成四种 WebP 展示尺寸并移除元数据。编辑者填写替代文本、作者或公开笔名,确认展示权利及适用的人像同意后发布。上传本身不会产生公开图片入口;公开署名保留发布时的快照。换图可以先存草稿,下线作品会关闭该作品的图片入口。系统不保留上传原件,原始照片需另行保存。见媒体与画廊手册。

如果你的协会也需要同时处理内容发布、会员核验和人员权限交接,这些已经衔接的流程是选择本项目的主要理由,可以在此基础上调整角色、页面和业务规则。

它适合上述工作流相近、希望在此基础上改造的协会。若只需要一个静态介绍页,运行两个应用和数据库的维护成本可能不划算。当前不提供在线收费、邮件/短信通知、通用建站编辑器或完整的会员自助系统。历史动态招新表单保留为开发 Demo,不作为正式招新入口。

在本机试用

需要 Node.js 24.14.1、pnpm 10.34.5、Docker 与 Docker Compose 2.24+。Windows 请使用 Docker Desktop 的 Linux 容器模式。先用 Git 获取源码;也可在 GitHub 的 Code 菜单下载 ZIP,解压后从 corepack enable 开始执行。首次安装需要访问 npm 与容器镜像仓库。

git clone https://github.com/glgust/association-portal.git
cd association-portal
corepack enable
corepack prepare pnpm@10.34.5 --activate
pnpm install --frozen-lockfile
pnpm demo:init
docker compose up -d --wait postgres
pnpm --dir apps/cms migrate
pnpm --dir apps/cms seed
pnpm dev

demo:init 生成随机应用密钥、三组演示账号密码和绝对媒体目录;遇到已有 .env 会停止,避免覆盖配置。PostgreSQL 使用仅供本机测试的固定凭据,端口只绑定回环地址。若已有其他项目使用 5432,请先看端口冲突处理。

打开公开站点 http://127.0.0.1:3000,再打开后台 http://127.0.0.1:3001/admin。从本地 apps/cms/.env 读取 DEMO_ADMIN_USERNAME 和 DEMO_ADMIN_PASSWORD 登录;不要将该文件发到 Issue。首次 seed 会建立并发布“示例协会”首页,其他内容为空是正常状态。

先在“内容管理 → 公告”新建一条虚构公告,保存草稿、发布,再访问 /announcements 核对。接着试一次修改草稿和下线,完整步骤见公告操作说明。

日常启动只需 docker compose up -d --wait postgres 和 pnpm dev。不要每次运行 seed:重跑会重设演示账号密码并覆盖首页内容。 停止应用用 Ctrl+C,停止数据库用 docker compose stop postgres;数据会保留。

按任务阅读

我想做什么 从这里开始
配置、重启、备份或排错 运维手册
建立账号、激活、停用、改权限 后台账号与权限
处理会员认领或人工核验 会员身份核验与账号认领
更改首页、介绍和联系方式 协会页面
发布活动、新闻或图片 活动 · 新闻 · 画廊
改代码、运行测试 开发指南 · 贡献说明

架构和定制

apps/web 是 Next.js 公开站点及同源 API 转发层;apps/cms 是 Next.js + Payload 后台,负责权限、业务流程和 PostgreSQL;packages/contracts 提供双方共享的运行时数据约束。Web 不直接访问数据库。数据库结构通过显式迁移更新,禁用自动同步。

修改站点侧栏名称及全局元信息,请编辑 apps/web/src/site.ts 并重新构建;首页名称、正文和联系方式在后台修改。页面中的 PORTAL 是通用栏目装饰文字,可按需替换。示例数据不表示任何真实协会的内容或授权。

许可与维护

源码和仓库原创文档采用 Apache License 2.0。软件按现状提供,担保排除和责任限制以许可证及适用法律为准。开源不转让原作者的著作权,也不授予协会名称、标识、域名或实际运营内容的使用权。第三方组件沿用各自许可证,见 第三方说明。

开源版采用独立仓库与独立发布历史;自用站点的配置、数据和内部工作记录不随本项目分发。已知限制见 v1.0.0 发布说明,漏洞反馈见 SECURITY.md。

About

面向学生协会的门户:内容发布、会员身份核验与账号管理。v1.0.0 为首个测试版,尚未经过长期生产环境验证。

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages