diff --git a/src/pages/events/list/model/useEventListModel.ts b/src/pages/events/list/model/useEventListModel.ts
index e3fef00..1e0ceb6 100644
--- a/src/pages/events/list/model/useEventListModel.ts
+++ b/src/pages/events/list/model/useEventListModel.ts
@@ -4,6 +4,7 @@ import { useState, useDebounce } from '@/hooks';
import { useRequest } from '@/hooks/useRequest';
import { useEffect } from '@/hooks/useEffect';
import { usePagination } from '@/hooks/usePagination';
+import { hasValue, isEmptyValue, safeTransform } from '@/utils';
import type { TournamentAdminVO, EventListQueryParams, PageData, ApiResult } from './services';
import { getEventList, toggleEventOnline } from './services';
import {
@@ -193,23 +194,3 @@ export function useEventListModel() {
handleToggleShelf,
};
}
-
-function hasValue(v: any): boolean {
- if (v == null) return false;
- if (Array.isArray(v)) return v.length > 0 && v.some((item) => item != null);
- if (typeof v === 'string') return v.trim() !== '';
- return true;
-}
-
-function isEmptyValue(v: any): boolean {
- return v == null || (typeof v === 'string' && v.trim() === '');
-}
-
-function safeTransform(value: any, transform?: (v: any) => any): any {
- if (!transform) return value;
- try {
- return transform(value) ?? value;
- } catch {
- return value;
- }
-}
diff --git a/src/pages/events/logs/index.tsx b/src/pages/events/logs/index.tsx
index 6070221..92e9564 100644
--- a/src/pages/events/logs/index.tsx
+++ b/src/pages/events/logs/index.tsx
@@ -10,21 +10,14 @@ import {
Tooltip,
Pagination,
} from 'ant-design-vue';
-import {
- useLogModel,
- ACTION_TYPE_OPTIONS,
- ACTION_SOURCE_OPTIONS,
- ACTION_SOURCE_MAP,
-} from './model/useLogModel';
+import { useLogModel, ACTION_TYPE_OPTIONS, ACTION_SOURCE_OPTIONS } from './model/useLogModel';
+import { useLogColumns } from './model/useLogColumns';
import { useState, useContainerSize } from '@/hooks';
import pageStyles from '@/assets/styles/pageLayout.module.less';
import './index.module.less';
const { RangePicker } = DatePicker;
-// ============================================================
-// LogContentCell: 操作内容单元格
-// ============================================================
const LogContentCell = defineComponent({
name: 'LogContentCell',
props: { text: { type: String, required: true } },
@@ -63,15 +56,14 @@ const LogContentCell = defineComponent({
},
});
-// ============================================================
-// bodyCell 渲染
-// ============================================================
-function renderBodyCell({ column, text }: { column: any; text: any }) {
- const value = text || '-';
- if (column.key === 'source') return {ACTION_SOURCE_MAP[text] || value};
- return {value};
-}
-
+/**
+ * 操作日志页面(纯视图层)
+ *
+ * 架构分层:
+ * - 数据层:services.ts(API 调用)
+ * - 逻辑层:useLogModel.ts(状态 + 业务逻辑 + 交互处理)
+ * - 视图层:useLogColumns.ts(表格列配置)+ 本组件(纯 UI 渲染)
+ */
export default defineComponent({
name: 'EventLogs',
setup() {
@@ -79,17 +71,24 @@ export default defineComponent({
filterForm,
loading,
dataSource,
- columns,
pagination,
handleSearch,
handleReset,
handlePageChange,
} = useLogModel();
+
+ const { columns } = useLogColumns();
const { containerRef, height } = useContainerSize({ headerOffset: 55 });
- onMounted(() => {
- handleSearch();
- });
+ /** 渲染 bodyCell */
+ const renderBodyCell = ({ column, text }: { column: any; text: any }) => {
+ if (column.key === 'content') {
+ const raw = text || '';
+ return raw ?