feat: 小菜记账 v1.0 - 完整功能实现

核心功能:
- 记账CRUD(支出/收入/分类/备注/日期)
- 统计分析(概览/分类占比/每日趋势)
- 预算管理(按月设置/进度条/超支提醒)
- 数据导出CSV

安全与认证:
- HMAC-SHA256签名token认证
- 用户数据隔离
- 输入验证与错误处理
- CORS配置

前端优化:
- 骨架屏加载
- 账单按日期分组
- 预算页面重构(快捷预设+Numpad)
- SvgIcon组件(H5+微信双端适配)
- 下拉刷新

后端优化:
- 共享日期工具函数
- 数据库连接池优化
- 健康检查端点
- 优雅关闭处理

技术栈:
- 前端:Uni-app (Vue 3 + Pinia)
- 后端:Node.js + Express + MySQL
This commit is contained in:
2026-05-29 16:14:15 +08:00
commit c7f29aa7a7
70 changed files with 32282 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
<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 = defineProps<{
label: string
color: string
bgColor: string
size?: 'sm' | 'md' | 'lg'
selected?: boolean
}>()
const sizeMap = { sm: 64, md: 88, lg: 112 }
const fontMap = { sm: 28, md: 36, lg: 48 }
const iconStyle = computed(() => ({
background: 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;
background: #FFE8E0 !important;
}
</style>