From 87dbc7548a0bae552a73c47cdc50a715d8a7350a Mon Sep 17 00:00:00 2001 From: peng Date: Thu, 13 Nov 2025 14:52:52 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E8=AE=A4?= =?UTF-8?q?=E8=AF=81=E7=B3=BB=E7=BB=9F=E5=92=8C=E7=BB=84=E4=BB=B6=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E5=AE=89=E5=85=A8=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 safeLocalStorage 工具函数增强本地存储安全性 - 简化认证流程,重构用户数据结构和 token 管理 - 修复多个模块的 TypeScript 类型错误和导入问题 - 优化状态管理,重构各模块 store 结构 - 清理冗余代码,移除未使用的组件和函数 - 改进错误处理和边界情况处理 - 更新配置文件以支持最新的类型检查 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../components/aiDecisionDashboardReducer.tsx | 24 +- .../central-config/message/template/page.tsx | 15 +- .../login-log/components/loginLogApi.ts | 5 +- .../central-config/monitor/login-log/page.tsx | 2 - .../tenant/audit-history/page.tsx | 1 - .../tenant/enterprise-audit/page.tsx | 3 - .../tenant/enterprise-management/page.tsx | 1 - .../tenant/user-management/page.tsx | 3 - .../components/SoilQualityAnalysis.tsx | 14 +- .../app/(auth)/login/components/LoginForm.tsx | 32 +- crop-x-new/src/app/(auth)/register/page.tsx | 17 - .../src/components/auth/AuthContext.tsx | 52 +- .../components/auth/ClientAuthInterceptor.tsx | 2 +- .../common/searchFormPagination/page.tsx | 7 +- .../components/layouts/SideBar/SideBarOld.tsx | 12 +- .../layouts/components/UserProfile.tsx | 4 +- crop-x-new/src/lib/api/client/client.gen.ts | 1 - crop-x-new/src/stores/modules/ai-model.ts | 418 +--------- crop-x-new/src/stores/modules/asset.ts | 454 +++-------- crop-x-new/src/stores/modules/auth.ts | 2 +- crop-x-new/src/stores/modules/config.ts | 746 +++--------------- crop-x-new/src/stores/modules/global.ts | 163 ++-- crop-x-new/src/stores/modules/irrigation.ts | 530 +++---------- crop-x-new/src/stores/modules/land.ts | 393 ++------- crop-x-new/src/stores/modules/machinery.ts | 357 ++------- crop-x-new/src/stores/modules/operation.ts | 471 +++-------- crop-x-new/src/utils/storage.ts | 110 +++ crop-x-new/src/utils/urlParams.ts | 271 +++++++ crop-x-new/tsconfig.json | 13 +- 29 files changed, 1122 insertions(+), 3001 deletions(-) create mode 100644 crop-x-new/src/utils/storage.ts create mode 100644 crop-x-new/src/utils/urlParams.ts diff --git a/crop-x-new/src/app/(app)/ai-crop-model/support/dashboard/components/aiDecisionDashboardReducer.tsx b/crop-x-new/src/app/(app)/ai-crop-model/support/dashboard/components/aiDecisionDashboardReducer.tsx index 8f9bc17..3b44513 100644 --- a/crop-x-new/src/app/(app)/ai-crop-model/support/dashboard/components/aiDecisionDashboardReducer.tsx +++ b/crop-x-new/src/app/(app)/ai-crop-model/support/dashboard/components/aiDecisionDashboardReducer.tsx @@ -5,6 +5,8 @@ * 规范:遵循crop-x/docs/开发项目规范.md,使用useReducer状态管理模式 */ +import { safeLocalStorage } from '@/utils/storage'; + // 决策类型 export type DecisionType = 'irrigation' | 'fertilizer' | 'pesticide' | 'harvest' | 'soil' | 'weather'; @@ -303,29 +305,25 @@ const calculateLatestDecisions = (decisions: DecisionRecord[]): DecisionRecord[] // 保存到本地存储 const saveToStorage = (state: AIDecisionDashboardState) => { - try { - localStorage.setItem('ai-decision-dashboard', JSON.stringify({ - decisions: state.decisions, - lastUpdated: state.lastUpdated, - })); - } catch (error) { - console.warn('Failed to save to localStorage:', error); - } + safeLocalStorage.setItem('ai-decision-dashboard', JSON.stringify({ + decisions: state.decisions, + lastUpdated: state.lastUpdated, + })); }; // 从本地存储加载 const loadFromStorage = () => { - try { - const stored = localStorage.getItem('ai-decision-dashboard'); - if (stored) { + const stored = safeLocalStorage.getItem('ai-decision-dashboard'); + if (stored) { + try { const data = JSON.parse(stored); return { decisions: data.decisions || initialDecisions, lastUpdated: data.lastUpdated || new Date().toISOString(), }; + } catch (error) { + console.warn('Failed to parse stored data:', error); } - } catch (error) { - console.warn('Failed to load from localStorage:', error); } return null; }; diff --git a/crop-x-new/src/app/(app)/central-config/message/template/page.tsx b/crop-x-new/src/app/(app)/central-config/message/template/page.tsx index b60ab45..072d14d 100644 --- a/crop-x-new/src/app/(app)/central-config/message/template/page.tsx +++ b/crop-x-new/src/app/(app)/central-config/message/template/page.tsx @@ -62,19 +62,6 @@ export default function MessageTemplatePage() { updatedAt: '2024-01-01T00:00:00', createdBy: 'admin', }, - { - id: 'tpl-2', - code: 'EQUIPMENT_WARNING', - name: '设备预警通知', - type: 'sms', - content: '【智慧农业】设备预警:{{equipmentName}}检测到异常,{{warningType}},请及时处理。', - variables: ['equipmentName', 'warningType'], - isActive: true, - description: '设备出现异常时发送短信通知', - createdAt: '2024-01-01T00:00:00', - updatedAt: '2024-01-01T00:00:00', - createdBy: 'admin', - }, { id: 'tpl-3', code: 'MAINTENANCE_REMINDER', @@ -200,7 +187,7 @@ export default function MessageTemplatePage() { } // 检查变量是否都填写了 - const emptyVars = Object.entries(testData.variables).filter(([k, v]) => !v.trim()); + const emptyVars = Object.entries(testData.variables).filter(([k, v]) => !(v as string).trim()); if (emptyVars.length > 0) { toast.error('请填写变量:' + emptyVars.map(([k]) => k).join(', ')); return; diff --git a/crop-x-new/src/app/(app)/central-config/monitor/login-log/components/loginLogApi.ts b/crop-x-new/src/app/(app)/central-config/monitor/login-log/components/loginLogApi.ts index 474a943..e7d0d76 100644 --- a/crop-x-new/src/app/(app)/central-config/monitor/login-log/components/loginLogApi.ts +++ b/crop-x-new/src/app/(app)/central-config/monitor/login-log/components/loginLogApi.ts @@ -38,6 +38,7 @@ export interface LoginLogsQueryParams { ip_address?: string; sort_order?: 'asc' | 'desc'; order_by?: string; + keyword?:string; } // 分页状态接口 @@ -83,13 +84,11 @@ export const fetchLoginLogs = async (params: LoginLogsQueryParams = {}) => { query: { page: params.page || 1, size: params.size || 10, - username: params.username, + keyword: params.keyword, status: params.status, start_time: params.start_time, end_time: params.end_time, ip_address: params.ip_address, - sort_order: params.sort_order || 'desc', - order_by: params.order_by || 'created_at', } }); diff --git a/crop-x-new/src/app/(app)/central-config/monitor/login-log/page.tsx b/crop-x-new/src/app/(app)/central-config/monitor/login-log/page.tsx index cfd6879..c59c4d6 100644 --- a/crop-x-new/src/app/(app)/central-config/monitor/login-log/page.tsx +++ b/crop-x-new/src/app/(app)/central-config/monitor/login-log/page.tsx @@ -19,7 +19,6 @@ import { LoginLog, PaginationState, LoginLogsQueryParams, - fetchLoginStatistics, exportLoginLogs } from './components/loginLogApi'; @@ -39,7 +38,6 @@ export default function LoginLogPage() { search: '', status: 'all' }); - const isFirstLoad = useRef(true); // 搜索字段配置 const searchFields: SearchFieldConfig[] = [ diff --git a/crop-x-new/src/app/(app)/central-config/tenant/audit-history/page.tsx b/crop-x-new/src/app/(app)/central-config/tenant/audit-history/page.tsx index 4b8827b..4e3b231 100644 --- a/crop-x-new/src/app/(app)/central-config/tenant/audit-history/page.tsx +++ b/crop-x-new/src/app/(app)/central-config/tenant/audit-history/page.tsx @@ -519,7 +519,6 @@ useEffect(() => { onPageChange: handlePageChange, onSizeChange: handleSizeChange, onSearch: handleSearch, - onSort: handleSort, emptyIcon: , emptyText: "暂无审核记录", sizeOptions: [10, 20, 50, 100] diff --git a/crop-x-new/src/app/(app)/central-config/tenant/enterprise-audit/page.tsx b/crop-x-new/src/app/(app)/central-config/tenant/enterprise-audit/page.tsx index 390de75..392e3ef 100644 --- a/crop-x-new/src/app/(app)/central-config/tenant/enterprise-audit/page.tsx +++ b/crop-x-new/src/app/(app)/central-config/tenant/enterprise-audit/page.tsx @@ -516,12 +516,9 @@ export default function EnterpriseAuditPage() { loading={state.loading} error={state.error} pagination={state.pagination} - sortBy={state.sortBy} - sortOrder={state.sortOrder} onPageChange={handlePageChange} onSizeChange={handleSizeChange} onSearch={handleSearch} - onSort={handleSort} emptyIcon={} emptyText="暂无企业审核数据" showSizeSelector={true} diff --git a/crop-x-new/src/app/(app)/central-config/tenant/enterprise-management/page.tsx b/crop-x-new/src/app/(app)/central-config/tenant/enterprise-management/page.tsx index 04c17cb..4658613 100644 --- a/crop-x-new/src/app/(app)/central-config/tenant/enterprise-management/page.tsx +++ b/crop-x-new/src/app/(app)/central-config/tenant/enterprise-management/page.tsx @@ -602,7 +602,6 @@ export default function EnterpriseManagement() { onPageChange={handlePageChange} onSizeChange={handleSizeChange} onSearch={handleSearch} - onSort={handleSort} emptyIcon={} emptyText="暂无企业数据" /> diff --git a/crop-x-new/src/app/(app)/central-config/tenant/user-management/page.tsx b/crop-x-new/src/app/(app)/central-config/tenant/user-management/page.tsx index 6511622..a157bb6 100644 --- a/crop-x-new/src/app/(app)/central-config/tenant/user-management/page.tsx +++ b/crop-x-new/src/app/(app)/central-config/tenant/user-management/page.tsx @@ -622,12 +622,9 @@ export default function TenantUserManagementPage() { loading={state.loading} error={state.error} pagination={state.pagination} - sortBy={state.sortBy} - sortOrder={state.sortOrder} onPageChange={handlePageChange} onSizeChange={handleSizeChange} onSearch={handleSearch} - onSort={handleSort} emptyText="暂无用户数据" sizeOptions={[10, 20, 50, 100]} /> diff --git a/crop-x-new/src/app/(app)/land-information/analysis/soil-quality/components/SoilQualityAnalysis.tsx b/crop-x-new/src/app/(app)/land-information/analysis/soil-quality/components/SoilQualityAnalysis.tsx index 1312b19..77c17ea 100644 --- a/crop-x-new/src/app/(app)/land-information/analysis/soil-quality/components/SoilQualityAnalysis.tsx +++ b/crop-x-new/src/app/(app)/land-information/analysis/soil-quality/components/SoilQualityAnalysis.tsx @@ -34,7 +34,6 @@ import { Download, RefreshCw, Eye, - Settings, Target, Award, AlertTriangle, @@ -43,20 +42,19 @@ import { import { toast } from 'sonner'; import { SoilQualityService, - SoilQualityEvaluation, - SoilIndicator, - SoilRecommendation, - SoilQualityHistory, - SoilAnalysisForm, formatSoilScore, getSoilGradeColor, getIndicatorStatusColor, formatDate } from './soilQualityService'; import { - SOIL_TYPES, SOIL_TEXTURES, - DRAINAGE_LEVELS + DRAINAGE_LEVELS, + SoilQualityEvaluation, + SoilIndicator, + SoilRecommendation, + SoilQualityHistory, + SoilAnalysisForm, } from './soilTypes'; export function SoilQualityAnalysis() { diff --git a/crop-x-new/src/app/(auth)/login/components/LoginForm.tsx b/crop-x-new/src/app/(auth)/login/components/LoginForm.tsx index d68c52a..84ade3d 100644 --- a/crop-x-new/src/app/(auth)/login/components/LoginForm.tsx +++ b/crop-x-new/src/app/(auth)/login/components/LoginForm.tsx @@ -117,18 +117,8 @@ export function LoginForm({ onRegisterClick }: LoginFormProps) { if (response.data) { // 登录成功,提取用户信息 const userData = { - id: response.data.user_id || '1', - username: state.passwordForm.username, - realName: response.data.real_name || state.passwordForm.username, - phone: response.data.phone || '', - email: response.data.email || '', - role: response.data.role || 'user', - permissions: response.data.permissions || [], - enterpriseId: response.data.enterprise_id || '', - enterpriseName: response.data.enterprise_name || '', - createdAt: response.data.created_at || new Date().toISOString(), // 重要:存储token到用户对象中 - token: response.data.access_token || response.data.token || null, + token: response.data.access_token || null, refreshToken:response.data.refresh_token || '' }; @@ -188,26 +178,6 @@ export function LoginForm({ onRegisterClick }: LoginFormProps) { try { // 模拟手机号登录 await new Promise(resolve => setTimeout(resolve, 1000)); - - if (state.phoneForm.code === '123456') { - login({ - id: '2', - username: 'user_' + state.phoneForm.phone.slice(-4), - realName: '用户', - phone: state.phoneForm.phone, - email: '', - role: 'user', - permissions: [], - enterpriseId: '', - enterpriseName: '', - createdAt: new Date().toISOString(), - }); - toast.success('登录成功!'); - window.location.href = '/'; - } else { - dispatch({ type: 'SET_ERROR', payload: '验证码错误' }); - toast.error('验证码错误'); - } } catch (error) { console.error('???????:', error); dispatch({ type: 'SET_ERROR', payload: '??????????' }); diff --git a/crop-x-new/src/app/(auth)/register/page.tsx b/crop-x-new/src/app/(auth)/register/page.tsx index d50459d..110c07d 100644 --- a/crop-x-new/src/app/(auth)/register/page.tsx +++ b/crop-x-new/src/app/(auth)/register/page.tsx @@ -225,23 +225,6 @@ export default function RegisterPage() { if (form.code === '123456') { setSuccess('注册成功!正在为您自动登录...'); toast.success('注册成功!'); - - // 自动登录 - setTimeout(() => { - login({ - id: '3', - username: form.username, - realName: form.realName, - email: form.email, - phone: form.phone, - role: 'user', - permissions: [], - enterpriseId: form.enterpriseId, - enterpriseName: enterprises.find(e => e.id === form.enterpriseId)?.name || '', - createdAt: new Date().toISOString(), - }); - handleNavigateToHome(); - }, 1500); } else { setError('短信验证码错误'); toast.error('短信验证码错误'); diff --git a/crop-x-new/src/components/auth/AuthContext.tsx b/crop-x-new/src/components/auth/AuthContext.tsx index 8ba0181..ec81d0c 100644 --- a/crop-x-new/src/components/auth/AuthContext.tsx +++ b/crop-x-new/src/components/auth/AuthContext.tsx @@ -3,7 +3,9 @@ import React, { createContext, useContext, useState, ReactNode, useRef } from 'react'; import { getCurrentUserInfoApiV1AuthMeGet, refreshTokenApiV1AuthRefreshPost, listAdminSettingsApiV1AdminSettingsGet } from '@/lib/api/sdk.gen'; import { setAuthUser, getAuthUser, setSettings } from '@/stores/modules/auth'; - +import { useRouter } from 'next/navigation'; +import {AuthUser,SettingsResponse} from "@/stores/modules/auth" +import { safeLocalStorage } from '@/utils/storage'; // Cookie 操作工具 const setTokenCookie = (token: string) => { if (typeof document !== 'undefined') { @@ -22,16 +24,22 @@ const removeTokenCookie = () => { interface User { id: string; username: string; - realName: string; + realName?: string; email?: string; phone?: string; enterpriseId?: string; token?: string; + refreshToken?:string; + is_superuser?: boolean; +} +interface Token{ + token: string + refreshToken:string } interface AuthContextType { user: User | null; - login: (user: User) => void; + login: (user: Token) => void; logout: () => void; isAuthenticated: boolean; loading: boolean; @@ -46,17 +54,18 @@ interface AuthProviderProps { export function AuthProvider({ children }: AuthProviderProps) { const [user, setUser] = useState(null); + const [, setToken] = useState(null); const [loading, setLoading] = useState(true); const refreshTimerRef = useRef(null); - - const login = (userData: User) => { - setUser(userData); + const router = useRouter(); + const login = (tokenData: Token) => { + setToken(tokenData); // 存储到 localStorage - localStorage.setItem('user', JSON.stringify(userData)); + safeLocalStorage.setItem('user', JSON.stringify(tokenData)); // 同时设置 cookie(供中间件使用) - if (userData.token) { - setTokenCookie(userData.token); + if (tokenData.token) { + setTokenCookie(tokenData.token); } setLoading(false); @@ -67,7 +76,7 @@ export function AuthProvider({ children }: AuthProviderProps) { const logout = () => { setUser(null); - localStorage.removeItem('user'); + safeLocalStorage.removeItem('user'); removeTokenCookie(); // 清除 cookie setLoading(false); @@ -86,7 +95,7 @@ export function AuthProvider({ children }: AuthProviderProps) { // 刷新 token 的函数 const refreshAccessToken = async () => { try { - const storedUser = localStorage.getItem('user'); + const storedUser = safeLocalStorage.getItem('user'); if (!storedUser) { console.warn('⚠️ 未找到用户信息,无法刷新 token'); return; @@ -127,7 +136,7 @@ export function AuthProvider({ children }: AuthProviderProps) { }; // 更新 localStorage - localStorage.setItem('user', JSON.stringify(updatedUserData)); + safeLocalStorage.setItem('user', JSON.stringify(updatedUserData)); // 更新状态 setUser(updatedUserData); @@ -195,7 +204,7 @@ export function AuthProvider({ children }: AuthProviderProps) { // 验证当前用户信息 const validateUser = async () => { try { - const storedUser = localStorage.getItem('user'); + const storedUser = safeLocalStorage.getItem('user'); if (!storedUser) { setLoading(false); return; @@ -229,18 +238,18 @@ export function AuthProvider({ children }: AuthProviderProps) { // 更新用户信息(可能包含最新的权限、角色等) const updatedUserData = { ...userData, - ...userResponse.data, // 合并最新的用户信息 + ...userResponse.data as any, // 合并最新的用户信息 }; setUser(updatedUserData); // 存储到 Zustand store - setAuthUser(userResponse.data); + setAuthUser(userResponse.data as AuthUser); console.log('✅ 用户验证成功,最新用户信息:', userResponse.data); console.log('📦 从 Zustand store 取出的用户数据:', getAuthUser()); // 存储设置数据到 Zustand store if (settingsResponse && settingsResponse.data) { - setSettings(settingsResponse.data); + setSettings(settingsResponse.data as SettingsResponse); console.log('✅ 设置数据获取成功:', settingsResponse.data); } @@ -249,13 +258,16 @@ export function AuthProvider({ children }: AuthProviderProps) { } else { // Token无效,清除用户信息 console.warn('⚠️ Token验证失败,清除用户信息'); - localStorage.removeItem('user'); + safeLocalStorage.removeItem('user'); + const currentPath = window.location.pathname; + const loginUrl = `/login${currentPath !== '/' ? `?redirect=${encodeURIComponent(currentPath)}` : ''}`; + router.push(loginUrl); setUser(null); } } catch (error: any) { console.error('❌ 用户验证失败:', error); // 验证失败时也清除用户信息,避免不一致状态 - localStorage.removeItem('user'); + safeLocalStorage.removeItem('user'); setUser(null); } finally { setLoading(false); @@ -277,7 +289,7 @@ export function AuthProvider({ children }: AuthProviderProps) { } // 检查是否有存储的用户信息和 token,并设置 cookie - const storedUser = localStorage.getItem('user'); + const storedUser = safeLocalStorage.getItem('user'); if (storedUser) { try { const userData = JSON.parse(storedUser); @@ -287,7 +299,7 @@ export function AuthProvider({ children }: AuthProviderProps) { } } catch (error) { console.error('解析存储用户信息失败:', error); - localStorage.removeItem('user'); + safeLocalStorage.removeItem('user'); } } diff --git a/crop-x-new/src/components/auth/ClientAuthInterceptor.tsx b/crop-x-new/src/components/auth/ClientAuthInterceptor.tsx index 230af26..d843c82 100644 --- a/crop-x-new/src/components/auth/ClientAuthInterceptor.tsx +++ b/crop-x-new/src/components/auth/ClientAuthInterceptor.tsx @@ -22,7 +22,7 @@ export function ClientAuthInterceptor({ children }: ClientAuthInterceptorProps) const currentPath = window.location.pathname; // 如果已经在认证页面(包括 /login 开头的所有路径、/register 和根路径),不需要重定向 - if (currentPath.startsWith('/login') || currentPath === '/register' || currentPath === '/') { + if (currentPath.startsWith('/login') || currentPath === '/register') { console.log(`📄 已在认证页面,跳过拦截: ${currentPath}`); return; } diff --git a/crop-x-new/src/components/common/searchFormPagination/page.tsx b/crop-x-new/src/components/common/searchFormPagination/page.tsx index 7e06d17..f796e70 100644 --- a/crop-x-new/src/components/common/searchFormPagination/page.tsx +++ b/crop-x-new/src/components/common/searchFormPagination/page.tsx @@ -493,12 +493,11 @@ export function SearchFormPagination({ // 更新内部状态 setInternalPagination(newPagination); - - // 通知父组件分页变化 - onPageChange?.(page); - + // 同步到URL(标记为用户操作) updateUrl(filters, newPagination, 'user'); + // 通知父组件分页变化 + onPageChange?.(page); }, [internalPagination, filters, onPageChange, updateUrl]); const handleSizeChange = useCallback((size: number) => { diff --git a/crop-x-new/src/components/layouts/SideBar/SideBarOld.tsx b/crop-x-new/src/components/layouts/SideBar/SideBarOld.tsx index b34fdfb..32fd3e7 100644 --- a/crop-x-new/src/components/layouts/SideBar/SideBarOld.tsx +++ b/crop-x-new/src/components/layouts/SideBar/SideBarOld.tsx @@ -10,7 +10,7 @@ import { cn } from '@/lib/utils'; interface NavItem { title: string; url: string; - icon: string; + icon: React.ReactNode; items?: { title: string; url: string; @@ -35,7 +35,7 @@ const defaultSideBarData: SideBarData = { { title: "租户管理", url: "/central-config/tenant", - icon: "🏢", + icon: "🏢" as React.ReactNode, items: [ { title: "企业审核", @@ -62,7 +62,7 @@ const defaultSideBarData: SideBarData = { { title: "用户管理", url: "/central-config/user", - icon: "👥", + icon: "👥" as React.ReactNode, items: [ { title: "员工管理", @@ -89,7 +89,7 @@ const defaultSideBarData: SideBarData = { { title: "系统参数", url: "/central-config/system", - icon: "🔧", + icon: "🔧" as React.ReactNode, items: [ { title: "系统设置", @@ -111,7 +111,7 @@ const defaultSideBarData: SideBarData = { { title: "系统监控", url: "/central-config/monitor", - icon: "📈", + icon: "📈" as React.ReactNode, items: [ { title: "登录日志", @@ -138,7 +138,7 @@ const defaultSideBarData: SideBarData = { { title: "消息中心", url: "/central-config/message", - icon: "📨", + icon: "📨" as React.ReactNode, items: [ { title: "消息发送", diff --git a/crop-x-new/src/components/layouts/components/UserProfile.tsx b/crop-x-new/src/components/layouts/components/UserProfile.tsx index 85f7e67..af86913 100644 --- a/crop-x-new/src/components/layouts/components/UserProfile.tsx +++ b/crop-x-new/src/components/layouts/components/UserProfile.tsx @@ -57,7 +57,7 @@ export function UserProfile({ onProfileClick }: UserProfileProps) { 手机号: {user?.phone} - {user?.enterpriseName && ( + {/* {user?.enterpriseName && (
所属企业: @@ -76,7 +76,7 @@ export function UserProfile({ onProfileClick }: UserProfileProps) { 上次登录: {user?.lastLoginTime}
- )} + )} */}