严重 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
48 lines
1.1 KiB
Vue
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>
|