r110/data.js · 约 10866 字符
1/* r110 家有账 · 种子数据与本地存储 */
2var SG = {
3 k: function (n) { return 'jyz_' + n; },
4 get: function (n, d) {
5 try { var v = localStorage.getItem(SG.k(n)); return v ? JSON.parse(v) : d; } catch (e) { return d; }
6 },
7 set: function (n, v) { try { localStorage.setItem(SG.k(n), JSON.stringify(v)); } catch (e) {} }
8};
9
10/* 支出分类 */
11var CATS = [
12 { id: 'food', n: '餐饮', e: '🍜', c: '#ff7a45' },
13 { id: 'grocery', n: '买菜', e: '🥬', c: '#52c41a' },
14 { id: 'traffic', n: '交通', e: '🚌', c: '#40a9ff' },
15 { id: 'shop', n: '购物', e: '🛍️', c: '#f759ab' },
16 { id: 'house', n: '居住', e: '🏠', c: '#9254de' },
17 { id: 'util', n: '水电燃', e: '💡', c: '#faad14' },
18 { id: 'phone', n: '通讯', e: '📱', c: '#13c2c2' },
19 { id: 'medical', n: '医疗', e: '💊', c: '#ff4d4f' },
20 { id: 'edu', n: '教育', e: '📚', c: '#2f54eb' },
21 { id: 'fun', n: '娱乐', e: '🎬', c: '#eb2f96' },
22 { id: 'gift', n: '人情', e: '🎁', c: '#fa541c' },
23 { id: 'baby', n: '母婴', e: '🍼', c: '#ffc069' },
24 { id: 'pet', n: '宠物', e: '🐶', c: '#a0d911' },
25 { id: 'cloth', n: '服饰', e: '👕', c: '#597ef7' },
26 { id: 'daily', n: '日用', e: '🧴', c: '#36cfc9' },
27 { id: 'beauty', n: '美容', e: '💄', c: '#ff85c0' },
28 { id: 'sport', n: '运动', e: '🏸', c: '#73d13d' },
29 { id: 'travel', n: '旅行', e: '✈️', c: '#4096ff' },
30 { id: 'car', n: '汽车', e: '🚗', c: '#8c8c8c' },
31 { id: 'repay', n: '还款', e: '💳', c: '#d4380d' },
32 { id: 'other', n: '其他', e: '📦', c: '#8c8c8c' }
33];
34/* 收入分类 */
35var INCATS = [
36 { id: 'salary', n: '工资', e: '💰', c: '#0f9d76' },
37 { id: 'bonus', n: '奖金', e: '🧧', c: '#e5484d' },
38 { id: 'parttime', n: '兼职', e: '💼', c: '#2f54eb' },
39 { id: 'invest', n: '理财', e: '📈', c: '#faad14' },
40 { id: 'reimb', n: '报销', e: '🧾', c: '#13c2c2' },
41 { id: 'redpkg', n: '红包', e: '🎊', c: '#f759ab' },
42 { id: 'rent', n: '租金', e: '🏘️', c: '#9254de' },
43 { id: 'inother', n: '其他', e: '➕', c: '#8c8c8c' }
44];
45function catOf(id) {
46 var i;
47 for (i = 0; i < CATS.length; i++) { if (CATS[i].id === id) return CATS[i]; }
48 for (i = 0; i < INCATS.length; i++) { if (INCATS[i].id === id) return INCATS[i]; }
49 return { id: id, n: '其他', e: '📦', c: '#8c8c8c' };
50}
51
52/* 账户 */
53var ACCOUNTS = [
54 { id: 'a1', n: '招商银行储蓄卡', e: '🏦', tail: '6688', bal: 86420.35, kind: 'fund', c: '#e5484d' },
55 { id: 'a2', n: '微信零钱', e: '💚', tail: '', bal: 3286.4, kind: 'fund', c: '#16a34a' },
56 { id: 'a3', n: '支付宝余额', e: '🔵', tail: '', bal: 1875.6, kind: 'fund', c: '#2563eb' },
57 { id: 'a4', n: '余额宝', e: '🐷', tail: '', bal: 52300.0, kind: 'fund', c: '#f59e0b' },
58 { id: 'a5', n: '现金钱包', e: '💵', tail: '', bal: 620.0, kind: 'fund', c: '#0f9d76' },
59 { id: 'a6', n: '招行信用卡', e: '💳', tail: '3021', bal: -4286.5, kind: 'credit', limit: 50000, bill: '每月 5 日', due: '每月 23 日', c: '#7c5cff' },
60 { id: 'a7', n: '中信信用卡', e: '💳', tail: '7712', bal: -1320.0, kind: 'credit', limit: 30000, bill: '每月 12 日', due: '每月 30 日', c: '#d4380d' },
61 { id: 'a8', n: '天天基金', e: '📈', tail: '', bal: 68900.0, kind: 'invest', profit: 4260.8, c: '#faad14' },
62 { id: 'a9', n: '公积金账户', e: '🏛️', tail: '', bal: 43800.0, kind: 'invest', profit: 0, c: '#2f54eb' }
63];
64function accOf(id) {
65 for (var i = 0; i < ACCOUNTS.length; i++) { if (ACCOUNTS[i].id === id) return ACCOUNTS[i]; }
66 return { id: id, n: '未知账户', e: '💼', c: '#8c8c8c' };
67}
68
69/* 家庭成员 */
70var MEMBERS = [
71 { id: 'm1', n: '我', role: '管理员', e: '🙋', c: '#0f9d76', perm: '全部权限', month: 4286.5, cnt: 68 },
72 { id: 'm2', n: '老公', role: '成员', e: '👨', c: '#2563eb', perm: '记账 + 查看', month: 3620.0, cnt: 41 },
73 { id: 'm3', n: '妈妈', role: '成员', e: '👵', c: '#f59e0b', perm: '记账 + 查看', month: 1980.4, cnt: 53 },
74 { id: 'm4', n: '女儿', role: '成员', e: '👧', c: '#f759ab', perm: '仅记账', month: 486.0, cnt: 12 }
75];
76function memOf(id) {
77 for (var i = 0; i < MEMBERS.length; i++) { if (MEMBERS[i].id === id) return MEMBERS[i]; }
78 return MEMBERS[0];
79}
80
81/* 账本 */
82var BOOKS = [
83 { id: 'b1', n: '家庭日常账本', e: '🏡', desc: '4 位成员 · 本月 174 笔', on: true },
84 { id: 'b2', n: '我的个人账本', e: '👛', desc: '仅自己可见 · 本月 26 笔', on: false },
85 { id: 'b3', n: '装修专项账本', e: '🔨', desc: '预算 18 万 · 已用 62%', on: false },
86 { id: 'b4', n: '宝宝成长账本', e: '🍼', desc: '记录教育与养育开销', on: false }
87];
88
89/* 流水(date: YYYY-MM-DD) */
90var BILLS = [
91 { id: 't01', t: 'pay', cat: 'food', n: '海底捞 · 家庭聚餐', amt: 486.00, acc: 'a6', mem: 'm2', date: '2026-08-06', time: '19:24', note: '女儿生日小聚,用了 8 折券', tags: ['聚餐'] },
92 { id: 't02', t: 'pay', cat: 'grocery', n: '盒马鲜生 · 生鲜采买', amt: 168.50, acc: 'a2', mem: 'm3', date: '2026-08-06', time: '09:12', note: '牛肉、三文鱼、时蔬', tags: [] },
93 { id: 't03', t: 'pay', cat: 'traffic', n: '地铁通勤', amt: 12.00, acc: 'a3', mem: 'm1', date: '2026-08-06', time: '08:05', note: '', tags: [] },
94 { id: 't04', t: 'inc', cat: 'reimb', n: '公司差旅报销到账', amt: 1280.00, acc: 'a1', mem: 'm1', date: '2026-08-05', time: '16:40', note: '7 月杭州出差', tags: ['报销'] },
95 { id: 't05', t: 'pay', cat: 'edu', n: '女儿钢琴课 · 8 月课时', amt: 1600.00, acc: 'a1', mem: 'm1', date: '2026-08-05', time: '10:30', note: '共 8 节课', tags: ['固定'] },
96 { id: 't06', t: 'pay', cat: 'util', n: '8 月电费', amt: 236.80, acc: 'a2', mem: 'm3', date: '2026-08-05', time: '08:50', note: '空调开得多', tags: ['周期'] },
97 { id: 't07', t: 'pay', cat: 'shop', n: '京东 · 空气炸锅', amt: 399.00, acc: 'a6', mem: 'm2', date: '2026-08-04', time: '21:10', note: '', tags: [] },
98 { id: 't08', t: 'pay', cat: 'medical', n: '社区医院 · 儿童体检', amt: 320.00, acc: 'a1', mem: 'm3', date: '2026-08-04', time: '14:20', note: '医保报销 120 元后自费', tags: [] },
99 { id: 't09', t: 'pay', cat: 'food', n: '楼下早餐铺', amt: 18.00, acc: 'a5', mem: 'm1', date: '2026-08-04', time: '07:40', note: '', tags: [] },
100 { id: 't10', t: 'inc', cat: 'salary', n: '8 月工资 · 我', amt: 16800.00, acc: 'a1', mem: 'm1', date: '2026-08-03', time: '10:00', note: '已扣五险一金', tags: ['固定'] },
101 { id: 't11', t: 'inc', cat: 'salary', n: '8 月工资 · 老公', amt: 13500.00, acc: 'a1', mem: 'm2', date: '2026-08-03', time: '10:00', note: '', tags: ['固定'] },
102 { id: 't12', t: 'pay', cat: 'house', n: '房贷月供', amt: 6820.00, acc: 'a1', mem: 'm1', date: '2026-08-03', time: '09:00', note: '剩余 218 期', tags: ['周期', '固定'] },
103 { id: 't13', t: 'pay', cat: 'pet', n: '猫粮 + 猫砂', amt: 268.00, acc: 'a3', mem: 'm4', date: '2026-08-02', time: '15:30', note: '', tags: [] },
104 { id: 't14', t: 'pay', cat: 'fun', n: '电影票 x3', amt: 126.00, acc: 'a2', mem: 'm2', date: '2026-08-02', time: '20:00', note: '暑期档动画', tags: [] },
105 { id: 't15', t: 'pay', cat: 'cloth', n: '优衣库 · 换季衣物', amt: 596.00, acc: 'a6', mem: 'm1', date: '2026-08-01', time: '16:12', note: '一家三口', tags: [] },
106 { id: 't16', t: 'pay', cat: 'gift', n: '同事结婚随礼', amt: 800.00, acc: 'a2', mem: 'm2', date: '2026-08-01', time: '11:00', note: '', tags: ['人情'] },
107 { id: 't17', t: 'inc', cat: 'invest', n: '基金赎回收益', amt: 862.30, acc: 'a4', mem: 'm1', date: '2026-08-01', time: '15:00', note: '持有 14 个月', tags: [] },
108 { id: 't18', t: 'pay', cat: 'daily', n: '山姆 · 家庭日用囤货', amt: 742.60, acc: 'a6', mem: 'm3', date: '2026-07-31', time: '17:45', note: '纸巾、洗衣液、牛奶', tags: [] }
109];
110
111/* 分类预算 */
112var BUDGETS = [
113 { cat: 'food', limit: 2800, used: 2186.5 },
114 { cat: 'grocery', limit: 1600, used: 1248.3 },
115 { cat: 'traffic', limit: 600, used: 386.0 },
116 { cat: 'shop', limit: 1500, used: 1682.0 },
117 { cat: 'edu', limit: 2000, used: 1600.0 },
118 { cat: 'util', limit: 700, used: 536.8 },
119 { cat: 'fun', limit: 800, used: 426.0 },
120 { cat: 'medical', limit: 600, used: 320.0 }
121];
122var BUDGET_TOTAL = { limit: 16000, used: 12386.9, leftDays: 25 };
123
124/* 储蓄目标 */
125var GOALS = [
126 { n: '三亚亲子旅行基金', e: '🏝️', target: 30000, saved: 21600, due: '2026-12-31' },
127 { n: '换车首付', e: '🚙', target: 120000, saved: 58400, due: '2027-06-30' },
128 { n: '女儿教育金', e: '🎓', target: 200000, saved: 96800, due: '2032-09-01' }
129];
130
131/* 周期账单 */
132var RECURS = [
133 { n: '房贷月供', e: '🏠', amt: 6820, day: '每月 3 日', acc: 'a1', on: true },
134 { n: '物业费', e: '🧹', amt: 386, day: '每月 8 日', acc: 'a2', on: true },
135 { n: '宽带 + 手机套餐', e: '📶', amt: 268, day: '每月 10 日', acc: 'a3', on: true },
136 { n: '车位租金', e: '🅿️', amt: 450, day: '每月 15 日', acc: 'a2', on: false }
137];
138
139/* 待办提醒 */
140var TODOS = [
141 { n: '招行信用卡待还', e: '💳', amt: 4286.5, sub: '8 月 23 日到期 · 还有 17 天', lv: 'a' },
142 { n: '女儿秋季学费', e: '🎒', amt: 5800.0, sub: '8 月 20 日前缴纳', lv: 'r' },
143 { n: '车险续保', e: '🚗', amt: 3260.0, sub: '9 月 2 日到期', lv: 'b' }
144];
145
146/* 近 6 月收支 */
147var TREND = [
148 { m: '3月', inc: 30100, pay: 18620 },
149 { m: '4月', inc: 30300, pay: 21480 },
150 { m: '5月', inc: 32800, pay: 19260 },
151 { m: '6月', inc: 30300, pay: 24310 },
152 { m: '7月', inc: 34200, pay: 22860 },
153 { m: '8月', inc: 32442, pay: 12386 }
154];
155
156/* 分类占比(本月支出) */
157var PIE = [
158 { cat: 'house', v: 6820 },
159 { cat: 'food', v: 2186 },
160 { cat: 'edu', v: 1600 },
161 { cat: 'shop', v: 1682 },
162 { cat: 'grocery', v: 1248 },
163 { cat: 'gift', v: 800 },
164 { cat: 'daily', v: 742 },
165 { cat: 'other', v: 1308 }
166];
167
168/* 日历热力(本月 1-31 日支出) */
169var DAYPAY = [1596, 394, 6820, 338, 2156, 666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
170
171/* 家庭动态 */
172var FEEDS = [
173 { mem: 'm3', act: '记了一笔', n: '盒马鲜生 · 生鲜采买', amt: 168.5, t: '今天 09:12' },
174 { mem: 'm2', act: '记了一笔', n: '海底捞 · 家庭聚餐', amt: 486.0, t: '今天 19:24' },
175 { mem: 'm1', act: '修改了预算', n: '购物类月预算 1200 → 1500', amt: 0, t: '昨天 21:05' },
176 { mem: 'm4', act: '记了一笔', n: '猫粮 + 猫砂', amt: 268.0, t: '8 月 2 日' },
177 { mem: 'm1', act: '邀请成员加入', n: '妈妈 加入家庭日常账本', amt: 0, t: '7 月 28 日' }
178];
179