1. 项目背景与核心价值去年我开始认真记账后发现市面上大部分记账工具都存在两个痛点要么功能太简单无法满足个性化需求要么数据隐私让人担忧。作为一个全栈开发者我决定自己动手开发一套完整的个人记账系统包含网页端和微信小程序双平台。这套系统最核心的价值在于完全掌控数据所有权所有数据存储在个人服务器支持高度自定义的记账模板实现跨平台数据同步提供可视化数据分析功能2. 技术架构设计2.1 整体技术栈选型经过对比主流方案最终确定的技术组合前端Vue3 Vant小程序端用Uniapp跨端方案 后端Node.js Koa2 数据库MySQL Redis缓存 部署Docker Nginx选择这套方案主要考虑开发效率Vue和Uniapp生态完善组件丰富维护成本JS全栈技术统一团队协作方便性能需求记账系统并发要求不高MySQL完全够用扩展性Docker化部署方便后续扩容2.2 数据库设计要点核心表结构设计简化版CREATE TABLE accounts ( id int NOT NULL AUTO_INCREMENT, user_id int NOT NULL COMMENT 用户ID, amount decimal(10,2) NOT NULL COMMENT 金额, type tinyint NOT NULL COMMENT 1收入 2支出, category varchar(20) NOT NULL COMMENT 分类, remark varchar(255) DEFAULT NULL COMMENT 备注, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;特别要注意的细节金额使用decimal而非float避免精度丢失建立复合索引(user_id, create_time)提升查询效率添加字段版本号方便后续扩展3. 核心功能实现3.1 多端同步方案采用增量同步策略解决多端数据一致性问题客户端记录本地最后同步时间戳请求时携带时间戳获取增量数据服务端使用Redis存储同步状态冲突处理采用最后修改优先原则关键代码示例Node.jsrouter.post(/sync, async (ctx) { const { lastSync, clientData } ctx.request.body; // 获取服务端增量数据 const serverChanges await getChangesSince(lastSync); // 合并冲突 const mergedData mergeChanges(clientData, serverChanges); // 返回最终结果 ctx.body { changes: mergedData, newSyncTime: Date.now() }; });3.2 数据可视化实现使用ECharts实现消费趋势分析按日/周/月聚合消费数据动态生成环形图分类占比和折线图趋势变化添加时间范围选择器实现图表数据缓存Redis 24小时过期性能优化技巧预生成常用时间段的统计结果使用Web Worker处理大数据量计算实现懒加载图表组件4. 开发踩坑实录4.1 微信小程序兼容性问题遇到的典型问题及解决方案日期格式差异iOS和Android表现不同统一使用YYYY-MM-DD格式引入day.js处理日期登录态维护// 检查session是否过期 function checkSession() { return new Promise((resolve) { wx.checkSession({ success: () resolve(true), fail: () resolve(false) }); }); }图片上传限制压缩图片到1MB以内使用云存储CDN加速4.2 安全防护措施必须实现的几个安全防护接口防刷令牌桶限流100次/分钟SQL注入防护使用ORM或参数化查询XSS防护前端DOMPurify过滤敏感操作短信二次验证Nginx配置示例location /api/ { limit_req zoneapi burst20 nodelay; proxy_pass http://backend; }5. 部署与运维方案5.1 Docker化部署docker-compose.yml关键配置version: 3 services: db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} volumes: - ./mysql-data:/var/lib/mysql app: build: . ports: - 3000:3000 depends_on: - db environment: NODE_ENV: production5.2 监控与备份必备的运维措施使用PM2守护进程配置日志轮转logrotate每日自动数据库备份mysqldump 七牛云存储基础监控CPU/内存/磁盘报警备份脚本示例#!/bin/bash DATE$(date %Y%m%d) mysqldump -u root -p${DB_PASS} accounting /backups/accounting_${DATE}.sql rclone copy /backups qiniu:backups6. 扩展优化方向经过三个月实际使用后发现还可以优化OCR识别对接支付宝/微信账单自动导入多账本支持区分个人/家庭/旅行等场景预算功能设置月度消费预警API开放对接家庭NAS自动备份实现OCR的简要思路使用Tesseract.js进行文字识别设计正则表达式匹配金额和分类人工确认后存入数据库这个项目给我的最大启示是个人项目要控制好功能边界先实现核心功能再迭代扩展。记账系统的核心就是准确记录和清晰展示花里胡哨的功能反而会影响使用体验。