feat(threads): add real-time forum and chat system

Implement DB schema, API, and WebSocket for channels and messages
Add frontend views, AI moderation, and admin management
This commit is contained in:
2026-05-07 11:28:14 +08:00
parent 23a7301598
commit cbb101336b
16 changed files with 3567 additions and 10 deletions

View File

@@ -65,6 +65,7 @@ export const systemWordingMessages = {
clothes: 'Clothes',
checklist: 'CheckList',
life: 'Life',
threads: 'Threads',
admin: 'Admin',
main: 'Main navigation',
openMenu: 'Open navigation',
@@ -1020,6 +1021,45 @@ export const systemWordingMessages = {
moderationRetryFailed: 'Review retry failed',
charactersLeft: '{count} characters left'
},
threads: {
kicker: 'Community Threads',
title: 'Threads',
subtitle: 'Browse channel discussions and chat inside each thread.',
channels: 'Channels',
allChannels: 'All channels',
newThread: 'New Thread',
threadTitle: 'Title',
firstMessage: 'First message',
message: 'Message',
send: 'Send',
sending: 'Sending',
follow: 'Follow',
unfollow: 'Unfollow',
lock: 'Lock',
unlock: 'Unlock',
locked: 'Locked',
unread: 'Unread',
tags: 'Tags',
language: 'Language',
allLanguages: 'All languages',
sort: 'Sort',
sortLastActive: 'Last active',
sortLatest: 'Latest',
sortMostDiscussed: 'Most discussed',
loadMoreThreads: 'Load more threads',
loadOlder: 'Load older',
jumpToPresent: 'Jump to Present',
unreadDivider: 'Unread messages',
noThreads: 'No threads yet',
noMessages: 'No messages yet',
selectThread: 'Select a thread',
messageReviewing: 'Reviewing',
messageRejected: 'Not approved',
createFailed: 'Thread could not be created',
messageFailed: 'Message could not be sent',
reactionFailed: 'Reaction could not be updated',
followFailed: 'Follow could not be updated'
},
admin: {
title: 'Admin',
subtitle: 'Manage Wiki content, configuration, localization, and access.',
@@ -1041,6 +1081,13 @@ export const systemWordingMessages = {
recipeList: 'Recipe list',
dishList: 'Dish list',
habitatList: 'Habitat list',
threadChannels: 'Thread channels',
newThreadChannel: 'New Thread channel',
editThreadChannel: 'Edit Thread channel',
allowUserThreads: 'Allow users to create Threads',
userThreadsAllowed: 'Users can create Threads',
userThreadsDisabled: 'User Thread creation disabled',
threadTagsPlaceholder: 'tag, tag, tag',
dataTools: 'Data tools',
dataToolRefresh: 'Refresh',
dataToolExport: 'Export data',
@@ -1461,6 +1508,7 @@ export const systemWordingMessages = {
clothes: '服装',
checklist: 'CheckList',
life: 'Life',
threads: '讨论',
admin: '管理',
main: '主导航',
openMenu: '打开导航',
@@ -2390,6 +2438,45 @@ export const systemWordingMessages = {
moderationRetryFailed: '重新审核失败',
charactersLeft: '还可以输入 {count} 个字符'
},
threads: {
kicker: '社区讨论',
title: '讨论',
subtitle: '按频道浏览帖子,并在帖子内用聊天消息讨论。',
channels: '频道',
allChannels: '全部频道',
newThread: '新帖子',
threadTitle: '标题',
firstMessage: '首条消息',
message: '消息',
send: '发送',
sending: '发送中',
follow: '关注',
unfollow: '取消关注',
lock: '锁定',
unlock: '解锁',
locked: '已锁定',
unread: '未读',
tags: '标签',
language: '语言',
allLanguages: '全部语言',
sort: '排序',
sortLastActive: '最后活跃',
sortLatest: '最新发布',
sortMostDiscussed: '讨论数',
loadMoreThreads: '加载更多帖子',
loadOlder: '加载旧消息',
jumpToPresent: '跳到最新',
unreadDivider: '未读消息',
noThreads: '暂无帖子',
noMessages: '暂无消息',
selectThread: '选择一个帖子',
messageReviewing: '审核中',
messageRejected: '未通过',
createFailed: '帖子创建失败',
messageFailed: '消息发送失败',
reactionFailed: 'Reaction 更新失败',
followFailed: '关注状态更新失败'
},
admin: {
title: '管理',
subtitle: '管理 Wiki 内容、配置、本地化和访问权限。',
@@ -2411,6 +2498,13 @@ export const systemWordingMessages = {
recipeList: '材料单列表',
dishList: '料理列表',
habitatList: '栖息地列表',
threadChannels: '讨论频道',
newThreadChannel: '新增讨论频道',
editThreadChannel: '编辑讨论频道',
allowUserThreads: '允许用户创建帖子',
userThreadsAllowed: '用户可创建帖子',
userThreadsDisabled: '用户不可创建帖子',
threadTagsPlaceholder: '标签, 标签, 标签',
dataTools: '数据工具',
dataToolRefresh: '刷新',
dataToolExport: '导出数据',