From b7ca7bf3eda4b7db42b16f24d7cbbb33c38c73d8 Mon Sep 17 00:00:00 2001 From: skynono Date: Thu, 12 Feb 2026 14:49:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96:=20=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=9F=A5=E8=AF=A2=E9=80=9F=E5=BA=A6=E5=B9=B6?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E7=94=A8=E6=88=B7=E8=AF=A6=E6=83=85=20(#2905?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * perf: task log show userinfo * feat: add Tooltip component to TaskLogsColumnDefs --- model/task.go | 6 --- .../table/task-logs/TaskLogsColumnDefs.jsx | 40 +++++++++---------- .../table/task-logs/TaskLogsTable.jsx | 4 +- web/src/components/table/task-logs/index.jsx | 2 + web/src/hooks/task-logs/useTaskLogsData.js | 25 ++++++++++++ 5 files changed, 50 insertions(+), 27 deletions(-) diff --git a/model/task.go b/model/task.go index b37dd3e6..82c2e978 100644 --- a/model/task.go +++ b/model/task.go @@ -234,12 +234,6 @@ func TaskGetAllTasks(startIdx int, num int, queryParams SyncTaskQueryParams) []* return nil } - for _, task := range tasks { - if cache, err := GetUserCache(task.UserId); err == nil { - task.Username = cache.Username - } - } - return tasks } diff --git a/web/src/components/table/task-logs/TaskLogsColumnDefs.jsx b/web/src/components/table/task-logs/TaskLogsColumnDefs.jsx index 7fd930eb..c78d5773 100644 --- a/web/src/components/table/task-logs/TaskLogsColumnDefs.jsx +++ b/web/src/components/table/task-logs/TaskLogsColumnDefs.jsx @@ -18,7 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; -import { Progress, Tag, Typography } from '@douyinfe/semi-ui'; +import { Progress, Tag, Tooltip, Typography } from '@douyinfe/semi-ui'; import { Music, FileText, @@ -240,6 +240,7 @@ export const getTaskLogsColumns = ({ openContentModal, isAdminUser, openVideoModal, + showUserInfoFunc, }) => { return [ { @@ -293,31 +294,30 @@ export const getTaskLogsColumns = ({ { key: COLUMN_KEYS.USERNAME, title: t('用户'), - dataIndex: 'username', - render: (text, record, index) => { + dataIndex: 'user_id', + render: (userId, record, index) => { if (!isAdminUser) { return <>; } - const displayName = record.display_name; - const label = displayName || text || t('未知'); - const avatarText = - typeof displayName === 'string' && displayName.length > 0 - ? displayName[0] - : typeof text === 'string' && text.length > 0 - ? text[0] - : '?'; - + const displayText = String(record.username || userId || '?'); return ( - + showUserInfoFunc && showUserInfoFunc(userId)} + > + {displayText.slice(0, 1)} + + + showUserInfoFunc && showUserInfoFunc(userId)} > - {avatarText} - - - {label} + {userId} ); diff --git a/web/src/components/table/task-logs/TaskLogsTable.jsx b/web/src/components/table/task-logs/TaskLogsTable.jsx index c3b4d514..b62e15bd 100644 --- a/web/src/components/table/task-logs/TaskLogsTable.jsx +++ b/web/src/components/table/task-logs/TaskLogsTable.jsx @@ -40,6 +40,7 @@ const TaskLogsTable = (taskLogsData) => { copyText, openContentModal, openVideoModal, + showUserInfoFunc, isAdminUser, t, COLUMN_KEYS, @@ -53,9 +54,10 @@ const TaskLogsTable = (taskLogsData) => { copyText, openContentModal, openVideoModal, + showUserInfoFunc, isAdminUser, }); - }, [t, COLUMN_KEYS, copyText, openContentModal, openVideoModal, isAdminUser]); + }, [t, COLUMN_KEYS, copyText, openContentModal, openVideoModal, showUserInfoFunc, isAdminUser]); // Filter columns based on visibility settings const getVisibleColumns = () => { diff --git a/web/src/components/table/task-logs/index.jsx b/web/src/components/table/task-logs/index.jsx index bc5b9178..140725a8 100644 --- a/web/src/components/table/task-logs/index.jsx +++ b/web/src/components/table/task-logs/index.jsx @@ -25,6 +25,7 @@ import TaskLogsActions from './TaskLogsActions'; import TaskLogsFilters from './TaskLogsFilters'; import ColumnSelectorModal from './modals/ColumnSelectorModal'; import ContentModal from './modals/ContentModal'; +import UserInfoModal from '../usage-logs/modals/UserInfoModal'; import { useTaskLogsData } from '../../../hooks/task-logs/useTaskLogsData'; import { useIsMobile } from '../../../hooks/common/useIsMobile'; import { createCardProPagination } from '../../../helpers/utils'; @@ -45,6 +46,7 @@ const TaskLogsPage = () => { modalContent={taskLogsData.videoUrl} isVideo={true} /> + { const [isVideoModalOpen, setIsVideoModalOpen] = useState(false); const [videoUrl, setVideoUrl] = useState(''); + // User info modal state + const [showUserInfo, setShowUserInfoModal] = useState(false); + const [userInfoData, setUserInfoData] = useState(null); + // Form state const [formApi, setFormApi] = useState(null); let now = new Date(); @@ -273,6 +277,21 @@ export const useTaskLogsData = () => { setIsVideoModalOpen(true); }; + // User info function + const showUserInfoFunc = async (userId) => { + if (!isAdminUser) { + return; + } + const res = await API.get(`/api/user/${userId}`); + const { success, message, data } = res.data; + if (success) { + setUserInfoData(data); + setShowUserInfoModal(true); + } else { + showError(message); + } + }; + // Initialize data useEffect(() => { const localPageSize = @@ -319,6 +338,12 @@ export const useTaskLogsData = () => { compactMode, setCompactMode, + // User info modal + showUserInfo, + setShowUserInfoModal, + userInfoData, + showUserInfoFunc, + // Functions loadLogs, handlePageChange,