feat(admin): album management pages with members and categories

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-18 12:33:46 +08:00
parent a6cc190751
commit 50c59ca9d4
27 changed files with 2977 additions and 16 deletions
+179 -3
View File
@@ -232,7 +232,8 @@
},
"albums": {
"title": "Albums",
"manage": "Album Management"
"manage": "Album Management",
"detail": "Album Detail"
}
},
"table": {
@@ -264,11 +265,186 @@
"headerBackground": "Header BG"
},
"albumsManage": {
"placeholder": "Album management is under construction (list/upload/member management arrive in later P1b tasks)"
"list": {
"title": "Album List",
"create": "New Album",
"loadMore": "Load More",
"noMore": "All loaded",
"empty": "No albums yet — click \"New Album\" to create one",
"loadFailed": "Failed to load albums",
"retry": "Retry",
"colTitle": "Title",
"colToken": "Public Token",
"colStatus": "Status",
"colSwitches": "Switches",
"colStartAt": "Start",
"colEndAt": "End",
"colActions": "Actions",
"copyToken": "Copy public token",
"copied": "Copied",
"statusActive": "Active",
"statusOffline": "Offline",
"switchUpload": "Upload",
"switchPublic": "Public",
"switchDownload": "Download",
"switchOriginal": "Original",
"on": "On",
"off": "Off",
"actionEdit": "Edit",
"actionMembers": "Members",
"actionDetail": "Detail",
"endAtUndecided": "TBD"
},
"form": {
"createTitle": "New Album",
"editTitle": "Edit Album",
"tabZh": "Chinese (zh-CN)",
"tabEn": "English (en)",
"fieldTitle": "Title",
"fieldDescription": "Description",
"fieldVenue": "Venue",
"fieldAddress": "Address",
"fieldDefaultLocale": "Default Locale",
"fieldStartAt": "Start Time",
"fieldEndAt": "End Time",
"fieldTimezone": "Timezone (IANA)",
"fieldSwitches": "Switches",
"switchUpload": "Allow uploads",
"switchPublic": "Publicly visible",
"switchDownload": "Allow download (browse)",
"switchOriginal": "Allow original download",
"translationsReplaceHint": "Saving fully replaces all translations: entries without a title will be removed, and the default locale entry is required.",
"createSuccess": "Album created",
"updateSuccess": "Album updated",
"submit": "Save",
"cancel": "Cancel",
"errors": {
"startAtRequired": "Start time is required",
"defaultLocaleMissing": "Title for the default locale ({locale}) is required",
"titleRequired": "Title is required",
"titleRequiredWithFields": "Title is required when other fields of this locale are filled",
"endAtNotAfterStartAt": "End time must be later than start time"
}
},
"detail": {
"back": "Back to List",
"edit": "Edit Album",
"basicInfo": "Basic Info",
"banner": "Banner",
"tabPhotos": "Photos",
"tabMembers": "Members",
"tabCategories": "Categories",
"loadFailed": "Failed to load album",
"retry": "Retry",
"fieldTitle": "Title",
"fieldToken": "Public Token",
"fieldStatus": "Status",
"fieldTimezone": "Timezone",
"fieldStartAt": "Start",
"fieldEndAt": "End",
"fieldCreatedAt": "Created",
"fieldUpdatedAt": "Updated"
},
"banner": {
"kind": "Asset Kind",
"kindBanner": "Banner",
"kindCover": "Cover",
"kindLogo": "Logo",
"locale": "Locale (optional)",
"localeNone": "Locale-independent",
"pick": "Choose Image",
"pickHint": "jpg / png / heic — uploaded directly to object storage, then verified",
"stageInitializing": "Initializing upload session…",
"stageUploading": "Uploading…",
"stageCompleting": "Verifying…",
"stageDone": "Effective",
"stageError": "Upload failed",
"reupload": "Upload Again",
"preview": "Preview (signed URL, valid until {expiresAt})",
"invalidType": "Only jpg / png / heic images are supported"
},
"members": {
"title": "Album Members",
"searchPlaceholder": "Type an account prefix (min 2 chars) to search",
"searching": "Searching…",
"noMatch": "No matching account",
"invite": "Invite",
"invited": "Member added",
"removed": "Member removed",
"removeConfirm": "Remove member \"{account}\"?",
"colAccount": "Account",
"colDisplayName": "Name",
"colRole": "Role",
"colActions": "Actions",
"roleOwner": "Owner",
"roleCollaborator": "Collaborator",
"remove": "Remove",
"empty": "No members"
},
"categories": {
"title": "Categories",
"create": "New Category",
"edit": "Edit Category",
"colSort": "Sort",
"colZh": "Chinese Name",
"colEn": "English Name",
"colActions": "Actions",
"fieldSort": "Sort Order (ascending)",
"fieldNameZh": "Chinese Name",
"fieldNameEn": "English Name",
"nameRequired": "At least one locale name is required",
"delete": "Delete",
"createSuccess": "Category created",
"updateSuccess": "Category updated",
"deleteConfirm": "Delete category \"{name}\"?",
"deleteSuccess": "Category deleted",
"empty": "No categories",
"submit": "Save",
"cancel": "Cancel"
},
"photos": {
"title": "Photo Management",
"filterVisibility": "Visibility",
"visibilityAll": "All",
"filterCategory": "Category",
"categoryAll": "All Categories",
"uncategorized": "Uncategorized",
"colState": "State",
"colVisibility": "Visibility",
"colSize": "Size",
"colUploader": "Uploader",
"colUploadedAt": "Uploaded",
"colActions": "Actions",
"statePendingUpload": "Pending Upload",
"stateUploaded": "Uploaded",
"stateProcessing": "Processing",
"stateReady": "Ready",
"stateProcessingFailed": "Processing Failed",
"visibilityUnpublished": "Unpublished",
"visibilityPublished": "Published",
"visibilityHidden": "Hidden",
"visibilityDeleted": "Deleted",
"hide": "Hide",
"restore": "Restore",
"delete": "Delete",
"hideConfirm": "Hide this photo? It becomes invisible to the public immediately.",
"restoreConfirm": "Restore this photo to public?",
"deleteConfirm": "Delete this photo? (soft delete, cannot be restored here)",
"hidden": "Photo hidden",
"restored": "Photo restored",
"deleted": "Photo deleted",
"empty": "No photos"
}
},
"apiMsg": {
"AUTH_INVALID_CREDENTIALS": "Invalid account or password",
"AUTH_RATE_LIMITED": "Too many failed login attempts; try again later",
"VALIDATION_FAILED": "Request validation failed"
"VALIDATION_FAILED": "Request validation failed",
"MEMBER_CONFLICT": "This user is already a member",
"ALBUM_NOT_FOUND": "Album not found or not visible",
"PHOTO_NOT_FOUND": "Photo not found",
"UPLOAD_VERIFY_FAILED": "Upload verification failed, please retry",
"UPLOAD_SESSION_CONFLICT": "Upload session conflict, please start over",
"ALBUM_UPLOAD_DISABLED": "Upload is disabled for this album"
}
}
+179 -3
View File
@@ -232,7 +232,8 @@
},
"albums": {
"title": "相册管理",
"manage": "相册管理"
"manage": "相册管理",
"detail": "相册详情"
}
},
"table": {
@@ -264,11 +265,186 @@
"headerBackground": "表头背景"
},
"albumsManage": {
"placeholder": "相册管理功能建设中(P1b 后续任务接入列表/上传/成员管理)"
"list": {
"title": "相册列表",
"create": "新建相册",
"loadMore": "加载更多",
"noMore": "已全部加载",
"empty": "暂无相册,点击「新建相册」创建",
"loadFailed": "列表加载失败",
"retry": "重试",
"colTitle": "标题",
"colToken": "公开令牌",
"colStatus": "状态",
"colSwitches": "功能开关",
"colStartAt": "开始时间",
"colEndAt": "结束时间",
"colActions": "操作",
"copyToken": "复制公开令牌",
"copied": "已复制",
"statusActive": "活跃",
"statusOffline": "下线",
"switchUpload": "上传",
"switchPublic": "公开",
"switchDownload": "下载",
"switchOriginal": "原图",
"on": "开",
"off": "关",
"actionEdit": "编辑",
"actionMembers": "成员",
"actionDetail": "详情",
"endAtUndecided": "未定"
},
"form": {
"createTitle": "新建相册",
"editTitle": "编辑相册",
"tabZh": "中文(zh-CN)",
"tabEn": "英文(en)",
"fieldTitle": "标题",
"fieldDescription": "描述",
"fieldVenue": "场地名称",
"fieldAddress": "场地地址",
"fieldDefaultLocale": "默认语言",
"fieldStartAt": "开始时间",
"fieldEndAt": "结束时间",
"fieldTimezone": "时区(IANA)",
"fieldSwitches": "功能开关",
"switchUpload": "允许上传",
"switchPublic": "公开可见",
"switchDownload": "允许下载浏览版",
"switchOriginal": "允许下载原图",
"translationsReplaceHint": "保存将全量替换多语言内容:未填标题的语言条目会被移除,且必须保留默认语言条目。",
"createSuccess": "相册已创建",
"updateSuccess": "相册已更新",
"submit": "保存",
"cancel": "取消",
"errors": {
"startAtRequired": "开始时间必填",
"defaultLocaleMissing": "默认语言({locale})的标题必填",
"titleRequired": "标题必填",
"titleRequiredWithFields": "该语言已填写其他字段,标题也必填",
"endAtNotAfterStartAt": "结束时间必须晚于开始时间"
}
},
"detail": {
"back": "返回列表",
"edit": "编辑相册",
"basicInfo": "基础信息",
"banner": "宣传图(Banner)",
"tabPhotos": "照片管理",
"tabMembers": "成员管理",
"tabCategories": "分类管理",
"loadFailed": "相册加载失败",
"retry": "重试",
"fieldTitle": "标题",
"fieldToken": "公开令牌",
"fieldStatus": "状态",
"fieldTimezone": "时区",
"fieldStartAt": "开始时间",
"fieldEndAt": "结束时间",
"fieldCreatedAt": "创建时间",
"fieldUpdatedAt": "更新时间"
},
"banner": {
"kind": "资产类型",
"kindBanner": "宣传图(banner)",
"kindCover": "封面(cover)",
"kindLogo": "Logo",
"locale": "语言(可选)",
"localeNone": "语言无关",
"pick": "选择图片",
"pickHint": "jpg / png / heic,直传对象存储后核验生效",
"stageInitializing": "初始化上传会话…",
"stageUploading": "上传中…",
"stageCompleting": "核验中…",
"stageDone": "已生效",
"stageError": "上传失败",
"reupload": "重新上传",
"preview": "当前预览(签名 URL,{expiresAt} 前有效)",
"invalidType": "仅支持 jpg / png / heic 图片"
},
"members": {
"title": "相册成员",
"searchPlaceholder": "输入账号前缀(至少 2 字符)搜索",
"searching": "搜索中…",
"noMatch": "无匹配账号",
"invite": "邀请",
"invited": "成员已添加",
"removed": "成员已移除",
"removeConfirm": "确定移除成员「{account}」?",
"colAccount": "账号",
"colDisplayName": "姓名",
"colRole": "角色",
"colActions": "操作",
"roleOwner": "创建者",
"roleCollaborator": "协作者",
"remove": "移除",
"empty": "暂无成员"
},
"categories": {
"title": "分类管理",
"create": "新建分类",
"edit": "编辑分类",
"colSort": "排序",
"colZh": "中文名",
"colEn": "英文名",
"colActions": "操作",
"fieldSort": "排序序号(升序)",
"fieldNameZh": "中文名",
"fieldNameEn": "英文名",
"nameRequired": "至少填写一个语言的名称",
"delete": "删除",
"createSuccess": "分类已创建",
"updateSuccess": "分类已更新",
"deleteConfirm": "确定删除分类「{name}」?",
"deleteSuccess": "分类已删除",
"empty": "暂无分类",
"submit": "保存",
"cancel": "取消"
},
"photos": {
"title": "照片管理",
"filterVisibility": "可见性",
"visibilityAll": "全部",
"filterCategory": "分类",
"categoryAll": "全部分类",
"uncategorized": "未分类",
"colState": "处理状态",
"colVisibility": "可见性",
"colSize": "尺寸/大小",
"colUploader": "上传人",
"colUploadedAt": "上传时间",
"colActions": "操作",
"statePendingUpload": "待上传",
"stateUploaded": "已上传",
"stateProcessing": "处理中",
"stateReady": "就绪",
"stateProcessingFailed": "处理失败",
"visibilityUnpublished": "未发布",
"visibilityPublished": "已发布",
"visibilityHidden": "已隐藏",
"visibilityDeleted": "已删除",
"hide": "隐藏",
"restore": "恢复发布",
"delete": "删除",
"hideConfirm": "确定隐藏该照片?隐藏后公开端即刻不可见。",
"restoreConfirm": "确定恢复发布该照片?",
"deleteConfirm": "确定删除该照片?(软删除,管理端不可恢复)",
"hidden": "照片已隐藏",
"restored": "照片已恢复发布",
"deleted": "照片已删除",
"empty": "暂无照片"
}
},
"apiMsg": {
"AUTH_INVALID_CREDENTIALS": "账号或密码错误",
"AUTH_RATE_LIMITED": "登录失败次数过多,请稍后再试",
"VALIDATION_FAILED": "请求参数校验失败"
"VALIDATION_FAILED": "请求参数校验失败",
"MEMBER_CONFLICT": "该用户已是相册成员",
"ALBUM_NOT_FOUND": "相册不存在或不可见",
"PHOTO_NOT_FOUND": "照片不存在",
"UPLOAD_VERIFY_FAILED": "上传核验失败,请重试",
"UPLOAD_SESSION_CONFLICT": "上传会话状态冲突,请重新开始",
"ALBUM_UPLOAD_DISABLED": "该相册已关闭上传"
}
}