Files
xiaocai/client/src/components/CategoryIcon/CategoryIcon.vue
wangxiaogang e110cd5c5d fix: 全面修复 22 项问题
严重 Bug:
- NaN 金额校验绕过(add 页面 parseFloat 空字符串)
- 4 个页面补充 waitForReady(add/budget/category-manage/group-manage)
- 导出 Loading 遮罩不消失(profile exportData 缺 hideLoading)
- Store 吞掉请求错误不 re-throw(transaction/stats/budget/user)
- 分类排序 SQL 拼接改参数化查询(category PUT /sort)
- 备份接口添加管理员权限检查(backup requireAdmin)

中等问题:
- 群组加入竞态条件改为 INSERT IGNORE
- 统计页切月/切Tab添加 loadSeq 防竞态
- stats store 补全 loading 状态 + Overview 初始值补全 7 字段
- 保存成功后返回不再弹「放弃修改」确认框
- 群组管理创建/加入添加 saving 双重提交保护
- 预算页添加 onShow 刷新
- 服务端输入校验(name/color/invite_code/微信code)

UI/样式:
- 触摸目标: bell/nav-back/nav-save→88rpx, avatar-badge→64rpx, action-btn→80rpx
- :active 反馈: bell/profile-card/identity-card/id-manage/arrow/action-btn/group-btn/cat-info
- 内联样式改动态绑定(4处 spacer 使用 capsuleRight)
- FAB 文字+改用 Icon 组件
- prefers-reduced-motion 动画降级(Skeleton/profile/budget/add)
- 胶囊适配(add/category-manage/group-manage)
- CategoryIcon !important 改为 iconStyle 计算属性

文档:
- CLAUDE.md 补充 SaveSuccess/ChartWrapper 组件 + category/budget/index API
2026-06-04 17:06:02 +08:00

48 lines
1.1 KiB
Vue

<template>
<view class="cat-icon" :class="[size, { selected }]" :style="iconStyle">
<text class="icon-text" :style="{ color: color, fontSize: fontSize }">{{ label }}</text>
</view>
</template>
<script setup lang="ts">
import { computed } from 'vue'
const props = withDefaults(defineProps<{
label: string
color: string
bgColor?: string
size?: 'sm' | 'md' | 'lg'
selected?: boolean
}>(), { bgColor: '' })
const sizeMap = { sm: 64, md: 88, lg: 112 }
const fontMap = { sm: 28, md: 36, lg: 48 }
const iconStyle = computed(() => ({
background: props.selected ? '#FFE8E0' : (props.bgColor || (props.color + '15')),
width: (sizeMap[props.size || 'md']) + 'rpx',
height: (sizeMap[props.size || 'md']) + 'rpx',
}))
const fontSize = computed(() => (fontMap[props.size || 'md']) + 'rpx')
</script>
<style lang="scss" scoped>
.cat-icon {
border-radius: 28rpx;
display: flex;
align-items: center;
justify-content: center;
border: 2rpx solid transparent;
transition: all 0.2s;
}
.icon-text {
font-weight: 600;
}
.selected {
border-color: #FF8C69;
}
</style>