hookehuyr

refactor(ui): 优化 ProductCard 组件视觉样式

- 升级为高端专业风格(白色背景 + 细腻阴影 + 装饰光晕)
- 移除 nut-button 依赖,改用原生 view 实现精确样式控制
- 增加点击微缩放交互效果 (active:scale-[0.99])
- 优化标签样式和标题排版对比度

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
...@@ -5,6 +5,26 @@ ...@@ -5,6 +5,26 @@
5 5
6 --- 6 ---
7 7
8 +## [2026-02-10] - 优化 ProductCard 组件视觉质感
9 +
10 +### 优化
11 +- **UI 升级**:将产品卡片从基础样式升级为“高端专业”风格
12 + - 背景:从 `bg-gray-50` 升级为 `bg-white` 配合细腻阴影 `box-shadow`,增加悬浮感
13 + - 装饰:右上角增加淡蓝色光晕装饰,提升视觉层次
14 + - 交互:增加点击时的微缩放效果 (`active:scale-[0.99]`)
15 +- **组件重构**
16 + - 移除 `nut-button` 依赖,改用原生 `view` + Flexbox 实现按钮,便于精确控制样式
17 + - 优化标签 (`tags`) 样式,增加动态边框逻辑
18 + - 优化排版,增强标题对比度 (`font-bold`, `tracking-tight`)
19 +
20 +**详细信息**
21 +- **影响文件**: src/components/cards/ProductCard.vue
22 +- **技术栈**: Vue 3, Tailwind CSS
23 +- **测试状态**: 待验证
24 +- **备注**: 保持了品牌色 (#2563EB) 一致性,提升了整体精致度
25 +
26 +---
27 +
8 ## [2026-02-10] - 移除 Apifox MCP 集成 28 ## [2026-02-10] - 移除 Apifox MCP 集成
9 29
10 ### 删除 30 ### 删除
......
1 <template> 1 <template>
2 - <view class="bg-gray-50 rounded-[24rpx] p-[28rpx] product-card"> 2 + <view
3 + class="relative bg-white rounded-[24rpx] p-[32rpx] border border-gray-100 product-card overflow-hidden transition-all duration-300 active:scale-[0.99]"
4 + style="box-shadow: 0 8rpx 30rpx rgba(0, 0, 0, 0.04);"
5 + >
6 + <!-- 装饰背景: 右上角淡蓝色光晕 -->
7 + <view class="absolute -right-[40rpx] -top-[40rpx] w-[160rpx] h-[160rpx] bg-blue-50 rounded-full opacity-60 blur-[30rpx] pointer-events-none"></view>
8 +
9 + <!-- 内容区域 -->
10 + <view class="relative z-10">
11 + <!-- 头部:标题与标签 -->
12 + <view class="mb-[36rpx]">
3 <!-- 产品名称 --> 13 <!-- 产品名称 -->
4 - <text class="block text-gray-800 text-[32rpx] font-medium mb-[20rpx]">{{ productName }}</text> 14 + <text class="block text-gray-900 text-[34rpx] font-bold leading-[1.4] mb-[20rpx] tracking-tight">
15 + {{ productName }}
16 + </text>
5 17
6 <!-- 产品标签 --> 18 <!-- 产品标签 -->
7 - <view v-if="tags && tags.length" class="flex flex-wrap gap-[12rpx] mb-[24rpx]"> 19 + <view v-if="tags && tags.length" class="flex flex-wrap gap-[12rpx]">
8 <view 20 <view
9 v-for="tag in tags" 21 v-for="tag in tags"
10 :key="tag.id" 22 :key="tag.id"
11 - class="text-[20rpx] px-[12rpx] py-[4rpx] rounded-full" 23 + class="text-[22rpx] px-[16rpx] py-[6rpx] rounded-[8rpx] font-medium flex items-center justify-center transition-opacity"
12 :style="{ 24 :style="{
13 - backgroundColor: tag.bg_color, 25 + backgroundColor: tag.bg_color || '#F3F4F6',
14 - color: tag.text_color 26 + color: tag.text_color || '#4B5563',
27 + border: `1px solid ${tag.bg_color ? 'transparent' : '#E5E7EB'}`
15 }" 28 }"
16 > 29 >
17 - <text class="text-[22rpx]">{{ tag.name }}</text> 30 + {{ tag.name }}
31 + </view>
18 </view> 32 </view>
19 </view> 33 </view>
20 34
21 - <!-- 操作按钮 --> 35 + <!-- 操作按钮组 -->
22 <view class="flex justify-between gap-[24rpx]"> 36 <view class="flex justify-between gap-[24rpx]">
23 - <nut-button 37 + <!-- 详情按钮: 次级样式 -->
24 - plain 38 + <view
25 - color="#2563EB" 39 + class="flex-1 h-[80rpx] flex items-center justify-center rounded-[16rpx] bg-gray-50 active:bg-gray-100 transition-colors border border-gray-100"
26 - class="flex-1 !h-[64rpx] !rounded-[16rpx] !text-[26rpx] !m-0 !border-blue-600" 40 + @tap.stop="handleDetail"
27 - @tap="handleDetail"
28 > 41 >
29 - 产品详情 42 + <text class="text-[28rpx] text-gray-600 font-medium">产品详情</text>
30 - </nut-button> 43 + </view>
31 - <nut-button 44 +
32 - color="#2563EB" 45 + <!-- 计划书按钮: 主要样式 -->
33 - class="flex-1 !h-[64rpx] !rounded-[16rpx] !text-[26rpx] !m-0" 46 + <view
34 - @tap="handlePlan" 47 + class="flex-1 h-[80rpx] flex items-center justify-center rounded-[16rpx] bg-blue-600 active:bg-blue-700 transition-all shadow-md shadow-blue-100"
48 + @tap.stop="handlePlan"
35 > 49 >
36 - 计划书 50 + <text class="text-[28rpx] text-white font-medium">制作计划书</text>
37 - </nut-button> 51 + </view>
52 + </view>
38 </view> 53 </view>
39 </view> 54 </view>
40 </template> 55 </template>
...@@ -101,6 +116,6 @@ const handlePlan = () => { ...@@ -101,6 +116,6 @@ const handlePlan = () => {
101 116
102 <style lang="less" scoped> 117 <style lang="less" scoped>
103 .product-card { 118 .product-card {
104 - // 可以添加卡片特定的样式 119 + // 保持 scoped 样式块,方便未来扩展
105 } 120 }
106 </style> 121 </style>
......