Files
election-system/docs/cms-setup.md
T
2026-08-29 16:16:26 +08:00

3.6 KiB

CMS 初始化与安全边界

运行模式

ElectionSystem.Cms 是独立的 Orchard Core 3.0.1 Headless CMS 主机。它仅管理公开内容、媒体、审核和发布历史,不是选举业务服务,也不能访问匿名选票、已投状态、线下计票或内部审计表。

首次启动时运行 dotnet run --project src/ElectionSystem.Cms 并访问 CMS 主机根路径,在初始化页面选择 Headless 配方和 MySql 提供程序,再输入连接字符串。生产环境应使用独立数据库,例如 election_cms;不要与 election 业务数据库共用表、账户或迁移历史。

请在部署前由数据库管理员创建 CMS 专用数据库及最小权限账户。Orchard Core 会验证连接后创建自己的表,但不会创建数据库;本仓库不会自动创建数据库或自动完成 CMS 初始化。

初始化完成后,在 Configuration → Features 启用 ElectionSystem.Cms.PublicContent。该模块的数据迁移会自动创建下列固定公开栏目和公共元数据字段;停用模块不会删除已有公开内容。

公开前台接入

选举主程序的 Razor Pages 通过 CMS 主机的只读 GET /api/public-content 接口读取内容,绝不直连 CMS 数据库。该接口只允许固定公开内容类型,并且只返回已发布版本的标题、正文、发布时间和公开元数据;草稿、历史版本、选民资料、投票状态、线下计票和内部审计记录均不会返回。

开发环境中主程序默认读取 http://localhost:5065。如 CMS 使用其他地址,配置主程序的 Cms:PublicContentBaseUrl(部署时使用环境变量 Cms__PublicContentBaseUrl)。CMS 未初始化、模块未启用或短暂不可用时,公开前台显示可恢复的“内容服务暂不可用”提示,选举业务不受影响。

内容编辑完成后必须先发布,才会出现在公开首页和 /content 各固定栏目中;前台内容详情固定为 /content/item/{内容 ID},不接受 CMS 编辑器自定义路由来覆盖选举系统路由。

首批内容类型

在 CMS 的 Content Definition 中创建以下类型,并统一启用 Title、HTML/Markdown 正文、SEO、Taxonomy、Autoroute、Publish Later、Archive Later 和版本历史:

类型 必需字段 限制
ElectionNotice 活动外部标识、适用受众、生效时间 不含选民名单或参与状态
PolicyDocument 规则版本、生效日期、附件 历史版本不能原地覆盖
CandidateDisclosure 活动外部标识、候选人公开资料、公示期 不含联系方式、内部审核意见
VoterGuide 引导类别、适用范围 不透露任何个体资格结果
ResultAnnouncement 结果发布版本标识、统计口径 只能引用 Election API 已发布结果
Faq 问题、答案、排序 不接收个人申诉材料
DownloadAsset 文件、版本、适用范围 受文件安全与下载策略控制

固定栏目以独立内容类型呈现,不能由编辑任意改名或删除;每项内容还带有“适用受众”和活动外部标识。后续将启用 Taxonomies 作为可扩展专题标签,但标签不能改变固定栏目或绕过发布审核。

发布与权限

配置 CMS 编辑、审核员、发布员、媒体管理员和选举联络员角色。发布流程必须是草稿、提交审核、退回或通过、定时/立即发布、下线/归档;回滚创建新版本并保留审计。

CMS 到公开站的集成只能是只读公开内容接口。结果、参与率和实时票数由 ElectionSystem.Api 根据活动公开策略裁决后提供;CMS 不得直接查询选举 MySQL 数据库。