🏗️ refactor: Replace model categories with vendor-based filtering and optimize data structure

- **Backend Changes:**
  - Refactor pricing API to return separate vendors array with ID-based model references
  - Remove redundant vendor_name/vendor_icon fields from pricing records, use vendor_id only
  - Add vendor_description to pricing response for frontend display
  - Maintain 1-minute cache protection for pricing endpoint security

- **Frontend Data Flow:**
  - Update useModelPricingData hook to build vendorsMap from API response
  - Enhance model records with vendor info during data processing
  - Pass vendorsMap through component hierarchy for consistent vendor data access

- **UI Component Replacements:**
  - Replace PricingCategories with PricingVendors component for vendor-based filtering
  - Replace PricingCategoryIntro with PricingVendorIntro in header section
  - Remove all model category related components and logic

- **Header Improvements:**
  - Implement vendor intro with real backend data (name, icon, description)
  - Add text collapsible feature (2-line limit with expand/collapse functionality)
  - Support carousel animation for "All Vendors" view with vendor icon rotation

- **Model Detail Modal Enhancements:**
  - Update ModelHeader to use real vendor icons via getLobeHubIcon()
  - Move tags from header to ModelBasicInfo content area to avoid SideSheet title width constraints
  - Display only custom tags from backend with stringToColor() for consistent styling
  - Use Space component with wrap property for proper tag layout

- **Table View Optimizations:**
  - Integrate RenderUtils for description and tags columns
  - Implement renderLimitedItems for tags (max 3 visible, +x popover for overflow)
  - Use renderDescription for text truncation with tooltip support

- **Filter Logic Updates:**
  - Vendor filter shows disabled options instead of hiding when no models match
  - Include "Unknown Vendor" category for models without vendor information
  - Remove all hardcoded vendor descriptions, use real backend data

- **Code Quality:**
  - Fix import paths after component relocation
  - Remove unused model category utilities and hardcoded mappings
  - Ensure consistent vendor data usage across all pricing views
  - Maintain backward compatibility with existing pricing calculation logic

This refactor provides a more scalable vendor-based architecture while eliminating
data redundancy and improving user experience with real-time backend data integration.
This commit is contained in:
t0ng7u
2025-08-04 21:36:31 +08:00
parent fc69f4f757
commit 0e9c3cde7c
24 changed files with 780 additions and 576 deletions

View File

@@ -698,14 +698,13 @@ const DEFAULT_PRICING_FILTERS = {
filterGroup: 'all',
filterQuotaType: 'all',
filterEndpointType: 'all',
filterVendor: 'all',
currentPage: 1,
};
// 重置模型定价筛选条件
export const resetPricingFilters = ({
handleChange,
setActiveKey,
availableCategories,
setShowWithRecharge,
setCurrency,
setShowRatio,
@@ -713,11 +712,11 @@ export const resetPricingFilters = ({
setFilterGroup,
setFilterQuotaType,
setFilterEndpointType,
setFilterVendor,
setCurrentPage,
setTokenUnit,
}) => {
handleChange?.(DEFAULT_PRICING_FILTERS.search);
availableCategories?.length > 0 && setActiveKey?.(availableCategories[0]);
setShowWithRecharge?.(DEFAULT_PRICING_FILTERS.showWithRecharge);
setCurrency?.(DEFAULT_PRICING_FILTERS.currency);
setShowRatio?.(DEFAULT_PRICING_FILTERS.showRatio);
@@ -726,5 +725,6 @@ export const resetPricingFilters = ({
setFilterGroup?.(DEFAULT_PRICING_FILTERS.filterGroup);
setFilterQuotaType?.(DEFAULT_PRICING_FILTERS.filterQuotaType);
setFilterEndpointType?.(DEFAULT_PRICING_FILTERS.filterEndpointType);
setFilterVendor?.(DEFAULT_PRICING_FILTERS.filterVendor);
setCurrentPage?.(DEFAULT_PRICING_FILTERS.currentPage);
};