feat: add admin user management with role-based access and self-protection

- Add AdminRequired middleware for admin-role routes
- Add login status check to reject disabled/locked accounts
- Add CRUD handlers (list, create, edit, delete) for users
- Add user_list and user_form templates with role/status badges
- Add nav entry and dashboard button for user management
- Add dynamic user count on admin dashboard
- Fix userIDFromSession to handle all numeric session types
- Self-protection: cannot delete/disable self or demote last admin
- Add EN/ZH i18n keys for all user management strings
This commit is contained in:
2026-06-22 18:11:39 +08:00
parent 6139b3ef2c
commit cefaeac618
11 changed files with 723 additions and 4 deletions
+84
View File
@@ -269,6 +269,48 @@ var translations = map[Lang]map[string]string{
"comment_settings_guest_approval": "Require approval for guest comments",
"comment_settings_use_gravatar": "Use Gravatar avatars",
"comment_settings_use_gravatar_hint": "When off, avatars show the author's initial on a colored background.",
// Admin: user management
"admin_users": "Users",
"admin_users_title": "Users",
"user_list_title": "User Management",
"user_new": "New User",
"user_create_title": "Create User",
"user_edit_title": "Edit User",
"user_col_username": "Username",
"user_col_display": "Display Name",
"user_col_email": "Email",
"user_col_role": "Role",
"user_col_status": "Status",
"user_col_created": "Created",
"user_col_actions": "Actions",
"user_username": "Username",
"user_password": "Password",
"user_password_hint": "Leave blank to keep the current password.",
"user_display_name": "Display Name",
"user_email": "Email",
"user_gender": "Gender",
"user_birthday": "Birthday",
"user_role": "Role",
"user_status": "Status",
"role_admin": "Admin",
"role_author": "Author",
"status_normal": "Normal",
"status_disabled": "Disabled",
"status_locked": "Locked",
"status_unactivated": "Unactivated",
"user_created": "User created.",
"user_updated": "User updated.",
"user_deleted": "User deleted.",
"user_delete_confirm": "Delete this user?",
"user_empty": "No users.",
"user_username_required": "Username is required.",
"user_password_required": "Password is required.",
"user_username_exists": "Username already exists.",
"user_cannot_delete_self": "You cannot delete your own account.",
"user_cannot_disable_self": "You cannot disable or lock your own account.",
"user_cannot_remove_last_admin": "Cannot remove the last administrator.",
"dash_user_mgmt": "Manage Users",
},
ZH: {
// 导航
@@ -523,6 +565,48 @@ var translations = map[Lang]map[string]string{
"comment_settings_guest_approval": "非登录用户评论需审核",
"comment_settings_use_gravatar": "使用 Gravatar 头像",
"comment_settings_use_gravatar_hint": "关闭后,头像将显示作者名称首字母的彩色占位。",
// 后台:用户管理
"admin_users": "用户",
"admin_users_title": "用户",
"user_list_title": "用户管理",
"user_new": "新建用户",
"user_create_title": "新建用户",
"user_edit_title": "编辑用户",
"user_col_username": "用户名",
"user_col_display": "显示名称",
"user_col_email": "邮箱",
"user_col_role": "角色",
"user_col_status": "状态",
"user_col_created": "创建时间",
"user_col_actions": "操作",
"user_username": "用户名",
"user_password": "密码",
"user_password_hint": "留空则保持原密码不变。",
"user_display_name": "显示名称",
"user_email": "邮箱",
"user_gender": "性别",
"user_birthday": "生日",
"user_role": "角色",
"user_status": "状态",
"role_admin": "管理员",
"role_author": "作者",
"status_normal": "正常",
"status_disabled": "禁用",
"status_locked": "锁定",
"status_unactivated": "未激活",
"user_created": "用户已创建。",
"user_updated": "用户已更新。",
"user_deleted": "用户已删除。",
"user_delete_confirm": "确认删除该用户?",
"user_empty": "暂无用户。",
"user_username_required": "请填写用户名。",
"user_password_required": "请填写密码。",
"user_username_exists": "用户名已存在。",
"user_cannot_delete_self": "不能删除自己的账号。",
"user_cannot_disable_self": "不能禁用或锁定自己的账号。",
"user_cannot_remove_last_admin": "不能移除最后一个管理员。",
"dash_user_mgmt": "用户管理",
},
}