管理页面
This commit is contained in:
1 parent
4ef6f6c90d
commit
2fbc8c9285
37 files changed
+1792
-12
No files matched your search
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
- [x] 创建解决方案与模块边界:Identity、Organization、Election、Voting、OfflineCounting、Cms、PublicBoard、Audit。
|
- [x] 创建解决方案与模块边界:Identity、Organization、Election、Voting、OfflineCounting、Cms、PublicBoard、Audit。
|
||||||
- [x] 配置 MySQL、EF Core 初始迁移、开发环境配置与健康检查。
|
- [x] 配置 MySQL、EF Core 初始迁移、开发环境配置与健康检查。
|
||||||
- [ ] 接入身份认证,建立用户、角色、权限和组织范围授权。
|
- [x] 内置身份认证:ASP.NET Core Identity 本地用户、密码策略、锁定、安全 Cookie、首个系统管理员初始化,以及地域角色范围授权。
|
||||||
- [x] 建立统一 API 错误格式和分页响应模型;参数校验、排序和筛选随首个业务列表接口落地。
|
- [x] 建立统一 API 错误格式和分页响应模型;参数校验、排序和筛选随首个业务列表接口落地。
|
||||||
- [x] 建立基础审计拦截器;Serilog 与敏感字段脱敏随身份及业务字段接入时配置。
|
- [x] 建立基础审计拦截器;Serilog 与敏感字段脱敏随身份及业务字段接入时配置。
|
||||||
- [ ] 配置 Redis、Hangfire、对象存储和本地开发替代实现。
|
- [ ] 配置 Redis、Hangfire、对象存储和本地开发替代实现。
|
||||||
@@ -44,6 +44,7 @@
|
|||||||
- [ ] 选民资格规则:按组织、名单、身份属性或人工审核确定。
|
- [ ] 选民资格规则:按组织、名单、身份属性或人工审核确定。
|
||||||
- [x] 候选人管理:提名、自荐、服务端资格状态转换、撤回、取消资格和公示;资格材料文件待对象存储阶段接入。
|
- [x] 候选人管理:提名、自荐、服务端资格状态转换、撤回、取消资格和公示;资格材料文件待对象存储阶段接入。
|
||||||
- [x] 提供 Excel 批量导入,导入预校验并返回逐行错误;导出将在管理端与授权下载审计接入时实施。
|
- [x] 提供 Excel 批量导入,导入预校验并返回逐行错误;导出将在管理端与授权下载审计接入时实施。
|
||||||
|
- [x] 管理端基础资料页面:使用 Razor Pages + Blazor Interactive Server 提供地域、选民、候选人、角色、计票所与导入操作,不引入独立 SPA。
|
||||||
|
|
||||||
## 第三阶段:选举活动与在线投票
|
## 第三阶段:选举活动与在线投票
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# 管理端使用说明
|
||||||
|
|
||||||
|
管理端入口为 `/admin`。未认证请求会返回 `401`,不会展示任何选民、候选人、计票所或区域数据。
|
||||||
|
|
||||||
|
## 身份配置
|
||||||
|
|
||||||
|
主站使用 ASP.NET Core Identity 保存本地用户名、密码哈希、失败次数、锁定时间与安全戳;浏览器管理端使用 `__Host-election-auth` 安全 Cookie。登录入口是 `/account/login`,退出使用 `POST /account/logout`。
|
||||||
|
|
||||||
|
首次部署时,先执行数据库迁移,再通过用户机密或环境变量提供一次性的首个系统管理员信息:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
dotnet user-secrets set "Bootstrap:SystemAdministrator:UserName" "admin" --project src/ElectionSystem.Api
|
||||||
|
dotnet user-secrets set "Bootstrap:SystemAdministrator:DisplayName" "系统管理员" --project src/ElectionSystem.Api
|
||||||
|
dotnet user-secrets set "Bootstrap:SystemAdministrator:Password" "替换为至少12位的高强度密码" --project src/ElectionSystem.Api
|
||||||
|
```
|
||||||
|
|
||||||
|
应用启动后会创建该账号并授予无地域绑定的 `SystemAdministrator`。确认首次登录成功后,立即删除密码机密:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
dotnet user-secrets remove "Bootstrap:SystemAdministrator:Password" --project src/ElectionSystem.Api
|
||||||
|
```
|
||||||
|
|
||||||
|
此后在“本地用户”页面创建、停用、恢复及重置其他账号密码,再在“地域角色”页面授权业务范围。停用或重置密码会更新安全戳,使既有 Cookie 会话失效。
|
||||||
|
|
||||||
|
## 页面职责
|
||||||
|
|
||||||
|
- `/admin/dashboard`:仅显示当前授权范围内的汇总。
|
||||||
|
- `/admin/regions` 与 `/admin/region-import`:系统管理员导入 AreaCity 四级目录;村/社区使用本地确认目录。
|
||||||
|
- `/admin/voters` 与 `/admin/voter-import`:按地域维护选民、预校验并确认 Excel 导入。
|
||||||
|
- `/admin/candidates`:维护候选人资料和服务端允许的状态转换。
|
||||||
|
- `/admin/roles`:系统管理员授予地域管理员、计票员或监督员角色。
|
||||||
|
- `/admin/counting-stations`:建立辖区计票所,并向已获地域角色的人员分配具体计票所。
|
||||||
|
|
||||||
|
管理端用于第二阶段基础资料与授权操作。选举活动、匿名投票、线下双录计票和公开结果将在后续阶段接入相应菜单,且不会通过本阶段页面绕过其规则。
|
||||||
@@ -30,8 +30,12 @@ CMS 使用独立的 `ElectionSystem.Cms` Orchard Core 主机及数据库;具
|
|||||||
|
|
||||||
`identity_user_regional_roles` 将用户角色与地域范围分开保存。省、市、区、镇、村管理员的范围自动覆盖全部下级地域;系统管理员没有地域限制。计票员和监督员还必须经 `identity_user_counting_stations` 分配到具体计票所,未来线下计票接口必须同时检查地域角色和计票所分配。
|
`identity_user_regional_roles` 将用户角色与地域范围分开保存。省、市、区、镇、村管理员的范围自动覆盖全部下级地域;系统管理员没有地域限制。计票员和监督员还必须经 `identity_user_counting_stations` 分配到具体计票所,未来线下计票接口必须同时检查地域角色和计票所分配。
|
||||||
|
|
||||||
所有 `/api/admin/*` 路由要求 JWT Bearer 认证,并要求身份提供的本地用户 GUID(`nameidentifier` 或 `sub` claim)。部署时配置 `Authentication:Authority`、`Authentication:Audience`,并在 OpenIddict/Keycloak 的声明映射中提供该 GUID。未认证请求返回 401,不能触发地域范围查询或写入。
|
主站使用 ASP.NET Core Identity 的本地账号与安全 Cookie 认证;`ApplicationUser.Id` 是地域角色和选民账号关联的唯一主体。密码哈希、锁定、登录安全戳由成熟的 Identity 组件处理,业务表不保存明文密码。保留 JWT Bearer 验证注册,后续接 OpenIddict 或 Keycloak 时可为 API 客户端启用令牌流程;未认证请求不能触发地域范围查询或写入。
|
||||||
|
|
||||||
`voter_profiles` 是选民主数据,按地域、状态查询和写入均须先应用管理员范围。选民 Excel 采用“上传预校验—逐行错误—同一操作者确认”模式,预览在 30 分钟后失效,确认前重新检查范围和重复选民编号。它不保存投票内容,后续 `Voting` 模块只可从选民 ID 创建资格/已投状态。
|
`voter_profiles` 是选民主数据,按地域、状态查询和写入均须先应用管理员范围。选民 Excel 采用“上传预校验—逐行错误—同一操作者确认”模式,预览在 30 分钟后失效,确认前重新检查范围和重复选民编号。它不保存投票内容,后续 `Voting` 模块只可从选民 ID 创建资格/已投状态。
|
||||||
|
|
||||||
`candidate_profiles` 维护候选人地域归属和提名、审核、撤回、取消资格、公示状态;状态转换必须在服务端验证,撤回和取消资格必须说明原因。候选人材料文件将在对象存储接入后作为独立、授权的附件实体实现。
|
`candidate_profiles` 维护候选人地域归属和提名、审核、撤回、取消资格、公示状态;状态转换必须在服务端验证,撤回和取消资格必须说明原因。候选人材料文件将在对象存储接入后作为独立、授权的附件实体实现。
|
||||||
|
|
||||||
|
## 管理端
|
||||||
|
|
||||||
|
主站使用混合 Razor Pages 与 Blazor Interactive Server,不引入单页应用构建链。`/admin` 是需要认证的 Razor Pages 入口;`/admin/dashboard`、`/admin/regions`、`/admin/voters`、`/admin/candidates`、`/admin/roles`、`/admin/counting-stations` 使用 Blazor Server 完成交互;`/admin/voter-import` 和 `/admin/region-import` 使用 Razor Pages 的受控文件上传表单。两类页面均复用同一用户声明和 `RegionScopeService`,不能通过 UI 参数越出地域范围。
|
||||||
Loaded 3 of 37 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user