@aiyiran/myclaw 1.1.91 → 1.1.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/assets/myclaw-artifacts.js +185 -8
  2. package/index.js +8 -5
  3. package/package.json +1 -1
  4. package/skills/yiran-course-template-pipeline/scripts/identify_template.py +2 -2
  5. package/skills/yiran-course-template-pipeline/template-index.json +183 -1
  6. package/skills/yiran-course-template-pipeline/template-index.md +63 -0
  7. package/skills/yiran-playground-template-use/prompts/remix-handoff.txt +24 -8
  8. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220/1.jpg +0 -0
  9. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220/2.jpg +0 -0
  10. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220/3.jpg +0 -0
  11. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220/4.jpg +0 -0
  12. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220/AI/344/270/215/347/224/250/347/234/213/347/232/204/345/216/237/345/247/213/346/217/220/347/244/272/350/257/215/344/272/272/347/261/273/347/234/213/__/351/200/211/351/242/230/345/274/225/346/223/216__.html +589 -0
  13. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220/AI/344/270/215/347/224/250/347/234/213/347/232/204/345/216/237/345/247/213/346/217/220/347/244/272/350/257/215/344/272/272/347/261/273/347/234/213//345/216/237/345/247/213/346/217/220/347/244/272/350/257/215.md +125 -0
  14. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220/AI/344/270/215/347/224/250/347/234/213/347/232/204/345/216/237/345/247/213/346/217/220/347/244/272/350/257/215/344/272/272/347/261/273/347/234/213//350/200/201/350/202/226/347/210/206/346/254/276/351/200/211/351/242/230/345/274/225/346/223/216.md +179 -0
  15. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220/AI/344/270/215/347/224/250/347/234/213/347/232/204/345/216/237/345/247/213/346/217/220/347/244/272/350/257/215/344/272/272/347/261/273/347/234/213//350/200/201/350/202/226/351/207/221/345/217/245/345/272/223v1.md +594 -0
  16. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220/__demo__.html +588 -0
  17. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220/__student-view__.html +77 -0
  18. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220/__student__.json +54 -0
  19. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220/__teacher-view__.html +52 -0
  20. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220/__teacher__.json +46 -0
  21. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220/index.html +148 -0
  22. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220//344/270/211/344/270/252/350/247/206/351/242/221/345/216/237/345/247/213/345/206/205/345/256/271/1-/344/273/200/344/271/210/346/230/257/344/274/230/347/247/200/347/232/204/345/255/251/345/255/220+/350/223/235/346/230/237/344/277/261/344/271/220/351/203/250/345/210/233/345/212/236+/347/210/266/346/257/215/345/244/251/350/201/214/357/274/210/351/200/220/345/255/227/347/250/277/357/274/211.md +48 -0
  23. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220//344/270/211/344/270/252/350/247/206/351/242/221/345/216/237/345/247/213/345/206/205/345/256/271/2-/350/277/207/347/250/213/345/206/231/344/275/234/350/257/276/347/250/213/345/210/206/344/272/253/357/274/210/351/200/220/345/255/227/347/250/277/357/274/211.md +27 -0
  24. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220//344/270/211/344/270/252/350/247/206/351/242/221/345/216/237/345/247/213/345/206/205/345/256/271/3-/350/202/262/345/204/277/345/273/272/350/256/256/357/274/232/345/242/236/351/207/217/344/277/241/346/201/257+/346/214/207/345/274/225vs/345/216/237/345/210/231+/345/210/206/344/272/253/347/224/237/346/264/273/347/273/206/350/212/202/357/274/210/351/200/220/345/255/227/347/250/277/357/274/211.md +204 -0
  25. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220//344/270/211/344/270/252/350/247/206/351/242/221/345/216/237/345/247/213/345/206/205/345/256/271//346/213/206/345/210/206/345/211/215/345/275/225/351/237/263/346/226/207/346/234/254.md +267 -0
  26. package//350/223/235/346/230/237/345/276/256/344/277/241/347/237/255/350/247/206/351/242/221/345/210/206/346/236/220//350/264/242/345/212/241/345/210/206/346/236/220.html +411 -0
  27. package//350/264/246/345/215/225/345/210/206/346/236/220/345/212/251/346/211/213/__demo__.html +411 -0
  28. package//350/264/246/345/215/225/345/210/206/346/236/220/345/212/251/346/211/213/__student-view__.html +77 -0
  29. package//350/264/246/345/215/225/345/210/206/346/236/220/345/212/251/346/211/213/__student__.json +54 -0
  30. package//350/264/246/345/215/225/345/210/206/346/236/220/345/212/251/346/211/213/__teacher-view__.html +52 -0
  31. package//350/264/246/345/215/225/345/210/206/346/236/220/345/212/251/346/211/213/__teacher__.json +50 -0
  32. package//350/264/246/345/215/225/345/210/206/346/236/220/345/212/251/346/211/213/index.html +148 -0
@@ -0,0 +1,411 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>5月支出财务分析</title>
7
+ <style>
8
+ :root {
9
+ --bg: #f5f7fb;
10
+ --card: #ffffff;
11
+ --text: #1f2937;
12
+ --muted: #6b7280;
13
+ --line: #e5e7eb;
14
+ --primary: #2563eb;
15
+ --good: #059669;
16
+ --warn: #d97706;
17
+ --danger: #dc2626;
18
+ }
19
+ * { box-sizing: border-box; }
20
+ body {
21
+ margin: 0;
22
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
23
+ background: var(--bg);
24
+ color: var(--text);
25
+ }
26
+ .wrap {
27
+ max-width: 1200px;
28
+ margin: 0 auto;
29
+ padding: 24px;
30
+ }
31
+ h1 {
32
+ margin: 0 0 8px;
33
+ font-size: 32px;
34
+ }
35
+ .sub {
36
+ color: var(--muted);
37
+ margin-bottom: 20px;
38
+ }
39
+ .grid {
40
+ display: grid;
41
+ grid-template-columns: repeat(4, 1fr);
42
+ gap: 16px;
43
+ margin-bottom: 20px;
44
+ }
45
+ .card {
46
+ background: var(--card);
47
+ border: 1px solid var(--line);
48
+ border-radius: 16px;
49
+ padding: 16px;
50
+ box-shadow: 0 6px 24px rgba(15, 23, 42, 0.05);
51
+ }
52
+ .card h3 {
53
+ margin: 0 0 8px;
54
+ font-size: 14px;
55
+ color: var(--muted);
56
+ font-weight: 600;
57
+ }
58
+ .big {
59
+ font-size: 28px;
60
+ font-weight: 700;
61
+ }
62
+ .filters {
63
+ display: grid;
64
+ grid-template-columns: repeat(6, 1fr);
65
+ gap: 12px;
66
+ margin-bottom: 20px;
67
+ }
68
+ label {
69
+ display: block;
70
+ font-size: 13px;
71
+ color: var(--muted);
72
+ margin-bottom: 6px;
73
+ }
74
+ input, select, button {
75
+ width: 100%;
76
+ padding: 10px 12px;
77
+ border: 1px solid var(--line);
78
+ border-radius: 10px;
79
+ font-size: 14px;
80
+ background: white;
81
+ }
82
+ button {
83
+ cursor: pointer;
84
+ background: var(--primary);
85
+ color: white;
86
+ border: none;
87
+ font-weight: 600;
88
+ margin-top: 20px;
89
+ }
90
+ button.secondary {
91
+ background: white;
92
+ color: var(--text);
93
+ border: 1px solid var(--line);
94
+ }
95
+ .table-wrap {
96
+ overflow: auto;
97
+ background: var(--card);
98
+ border: 1px solid var(--line);
99
+ border-radius: 16px;
100
+ }
101
+ table {
102
+ width: 100%;
103
+ border-collapse: collapse;
104
+ min-width: 900px;
105
+ }
106
+ th, td {
107
+ padding: 12px 14px;
108
+ border-bottom: 1px solid var(--line);
109
+ text-align: left;
110
+ font-size: 14px;
111
+ }
112
+ th {
113
+ background: #f8fafc;
114
+ color: #374151;
115
+ position: sticky;
116
+ top: 0;
117
+ }
118
+ .tag {
119
+ display: inline-block;
120
+ padding: 4px 8px;
121
+ border-radius: 999px;
122
+ font-size: 12px;
123
+ background: #eff6ff;
124
+ color: #1d4ed8;
125
+ }
126
+ .summary-list {
127
+ display: grid;
128
+ grid-template-columns: 1fr 1fr;
129
+ gap: 16px;
130
+ margin-top: 20px;
131
+ }
132
+ ul.rank {
133
+ margin: 0;
134
+ padding-left: 18px;
135
+ }
136
+ ul.rank li {
137
+ margin: 10px 0;
138
+ }
139
+ .hint {
140
+ color: var(--muted);
141
+ font-size: 13px;
142
+ margin-top: 8px;
143
+ }
144
+ @media (max-width: 960px) {
145
+ .grid, .filters, .summary-list { grid-template-columns: 1fr 1fr; }
146
+ }
147
+ @media (max-width: 640px) {
148
+ .grid, .filters, .summary-list { grid-template-columns: 1fr; }
149
+ h1 { font-size: 24px; }
150
+ }
151
+ </style>
152
+ </head>
153
+ <body>
154
+ <div class="wrap">
155
+ <h1>5月支出财务分析</h1>
156
+ <div class="sub">可以筛选、排序、看汇总,也能快速找出高消费项目。</div>
157
+
158
+ <div class="grid">
159
+ <div class="card">
160
+ <h3>总支出</h3>
161
+ <div class="big" id="totalExpense">0</div>
162
+ </div>
163
+ <div class="card">
164
+ <h3>记录条数</h3>
165
+ <div class="big" id="totalCount">0</div>
166
+ </div>
167
+ <div class="card">
168
+ <h3>单笔最高</h3>
169
+ <div class="big" id="maxExpense">0</div>
170
+ </div>
171
+ <div class="card">
172
+ <h3>笔均支出</h3>
173
+ <div class="big" id="avgExpense">0</div>
174
+ </div>
175
+ </div>
176
+
177
+ <div class="card" style="margin-bottom: 20px;">
178
+ <div class="filters">
179
+ <div>
180
+ <label>关键词</label>
181
+ <input id="keyword" placeholder="搜商户、备注、类别" />
182
+ </div>
183
+ <div>
184
+ <label>类别</label>
185
+ <select id="categoryFilter">
186
+ <option value="">全部类别</option>
187
+ </select>
188
+ </div>
189
+ <div>
190
+ <label>最小金额</label>
191
+ <input id="minAmount" type="number" placeholder="例如 50" />
192
+ </div>
193
+ <div>
194
+ <label>最大金额</label>
195
+ <input id="maxAmount" type="number" placeholder="例如 300" />
196
+ </div>
197
+ <div>
198
+ <label>排序方式</label>
199
+ <select id="sortBy">
200
+ <option value="amountDesc">金额从高到低</option>
201
+ <option value="amountAsc">金额从低到高</option>
202
+ <option value="dateAsc">日期从早到晚</option>
203
+ <option value="dateDesc">日期从晚到早</option>
204
+ </select>
205
+ </div>
206
+ <div>
207
+ <button id="resetBtn" class="secondary">重置筛选</button>
208
+ </div>
209
+ </div>
210
+ <div class="hint">财务角度的小帮助:你可以先筛选高于 100 元的支出,更容易看到大头花费。</div>
211
+ </div>
212
+
213
+ <div class="table-wrap">
214
+ <table>
215
+ <thead>
216
+ <tr>
217
+ <th>日期</th>
218
+ <th>金额</th>
219
+ <th>类型</th>
220
+ <th>商户/事项</th>
221
+ <th>财务类别</th>
222
+ <th>备注</th>
223
+ </tr>
224
+ </thead>
225
+ <tbody id="tableBody"></tbody>
226
+ </table>
227
+ </div>
228
+
229
+ <div class="summary-list">
230
+ <div class="card">
231
+ <h3>类别汇总</h3>
232
+ <ul class="rank" id="categorySummary"></ul>
233
+ </div>
234
+ <div class="card">
235
+ <h3>商户/事项前五</h3>
236
+ <ul class="rank" id="merchantSummary"></ul>
237
+ </div>
238
+ </div>
239
+ </div>
240
+
241
+ <script>
242
+ const rawData = [
243
+ { date: '5月1日', amount: 38, type: '支出', merchant: '瑞幸咖啡', note: '早餐咖啡' },
244
+ { date: '5月1日', amount: 126, type: '支出', merchant: '盒马', note: '买菜' },
245
+ { date: '5月2日', amount: 42, type: '支出', merchant: '美团外卖', note: '午餐' },
246
+ { date: '5月2日', amount: 28, type: '支出', merchant: '地铁', note: '通勤' },
247
+ { date: '5月3日', amount: 299, type: '支出', merchant: '京东', note: '蓝牙耳机' },
248
+ { date: '5月4日', amount: 68, type: '支出', merchant: '滴滴', note: '晚上回家' },
249
+ { date: '5月5日', amount: 36, type: '支出', merchant: '瑞幸咖啡', note: '咖啡' },
250
+ { date: '5月6日', amount: 218, type: '支出', merchant: '山姆', note: '日用品' },
251
+ { date: '5月7日', amount: 88, type: '支出', merchant: '电影院', note: '周末娱乐' },
252
+ { date: '5月8日', amount: 49, type: '支出', merchant: '美团外卖', note: '晚餐' },
253
+ { date: '5月9日', amount: 199, type: '支出', merchant: '得到App', note: '课程' },
254
+ { date: '5月10日', amount: 35, type: '支出', merchant: '便利店', note: '零食' },
255
+ { date: '5月11日', amount: 520, type: '支出', merchant: '淘宝', note: '衣服' },
256
+ { date: '5月12日', amount: 45, type: '支出', merchant: '瑞幸咖啡', note: '咖啡' },
257
+ { date: '5月13日', amount: 168, type: '支出', merchant: '餐厅', note: '朋友聚餐' },
258
+ { date: '5月14日', amount: 25, type: '支出', merchant: '地铁', note: '通勤' },
259
+ { date: '5月15日', amount: 980, type: '支出', merchant: '体检', note: '健康检查' },
260
+ { date: '5月16日', amount: 58, type: '支出', merchant: '美团外卖', note: '午餐' },
261
+ { date: '5月17日', amount: 32, type: '支出', merchant: '未知消费', note: '备注不清' },
262
+ { date: '5月18日', amount: 260, type: '支出', merchant: '加油站', note: '出行' },
263
+ { date: '5月19日', amount: 39, type: '支出', merchant: '瑞幸咖啡', note: '咖啡' },
264
+ { date: '5月20日', amount: 399, type: '支出', merchant: '拼多多', note: '家居用品' },
265
+ ];
266
+
267
+ function getCategory(item) {
268
+ const merchant = item.merchant;
269
+ const note = item.note;
270
+ if (merchant.includes('瑞幸') || merchant.includes('美团外卖') || merchant.includes('餐厅') || note.includes('午餐') || note.includes('晚餐') || note.includes('咖啡')) return '餐饮';
271
+ if (merchant.includes('地铁') || merchant.includes('滴滴') || merchant.includes('加油站')) return '交通';
272
+ if (merchant.includes('淘宝') || merchant.includes('京东') || merchant.includes('拼多多') || merchant.includes('山姆') || merchant.includes('盒马') || merchant.includes('便利店')) return '购物';
273
+ if (merchant.includes('体检')) return '医疗健康';
274
+ if (merchant.includes('电影院')) return '娱乐';
275
+ if (merchant.includes('得到App')) return '学习成长';
276
+ return '其他';
277
+ }
278
+
279
+ const data = rawData.map((item, index) => ({
280
+ ...item,
281
+ category: getCategory(item),
282
+ day: Number(item.date.match(/5月(\d+)日/)[1]),
283
+ id: index + 1,
284
+ }));
285
+
286
+ const els = {
287
+ totalExpense: document.getElementById('totalExpense'),
288
+ totalCount: document.getElementById('totalCount'),
289
+ maxExpense: document.getElementById('maxExpense'),
290
+ avgExpense: document.getElementById('avgExpense'),
291
+ keyword: document.getElementById('keyword'),
292
+ categoryFilter: document.getElementById('categoryFilter'),
293
+ minAmount: document.getElementById('minAmount'),
294
+ maxAmount: document.getElementById('maxAmount'),
295
+ sortBy: document.getElementById('sortBy'),
296
+ resetBtn: document.getElementById('resetBtn'),
297
+ tableBody: document.getElementById('tableBody'),
298
+ categorySummary: document.getElementById('categorySummary'),
299
+ merchantSummary: document.getElementById('merchantSummary'),
300
+ };
301
+
302
+ function formatMoney(n) {
303
+ return '¥' + n.toFixed(0);
304
+ }
305
+
306
+ function fillCategoryOptions() {
307
+ const categories = [...new Set(data.map(item => item.category))];
308
+ categories.forEach(category => {
309
+ const option = document.createElement('option');
310
+ option.value = category;
311
+ option.textContent = category;
312
+ els.categoryFilter.appendChild(option);
313
+ });
314
+ }
315
+
316
+ function getFilteredData() {
317
+ const keyword = els.keyword.value.trim().toLowerCase();
318
+ const category = els.categoryFilter.value;
319
+ const minAmount = Number(els.minAmount.value || 0);
320
+ const maxAmount = els.maxAmount.value ? Number(els.maxAmount.value) : Infinity;
321
+
322
+ let result = data.filter(item => {
323
+ const matchKeyword = !keyword || [item.date, item.type, item.merchant, item.note, item.category].join(' ').toLowerCase().includes(keyword);
324
+ const matchCategory = !category || item.category === category;
325
+ const matchMin = item.amount >= minAmount;
326
+ const matchMax = item.amount <= maxAmount;
327
+ return matchKeyword && matchCategory && matchMin && matchMax;
328
+ });
329
+
330
+ const sortBy = els.sortBy.value;
331
+ result.sort((a, b) => {
332
+ if (sortBy === 'amountDesc') return b.amount - a.amount;
333
+ if (sortBy === 'amountAsc') return a.amount - b.amount;
334
+ if (sortBy === 'dateAsc') return a.day - b.day;
335
+ if (sortBy === 'dateDesc') return b.day - a.day;
336
+ return 0;
337
+ });
338
+ return result;
339
+ }
340
+
341
+ function renderTable(list) {
342
+ els.tableBody.innerHTML = '';
343
+ list.forEach(item => {
344
+ const tr = document.createElement('tr');
345
+ tr.innerHTML = `
346
+ <td>${item.date}</td>
347
+ <td>${formatMoney(item.amount)}</td>
348
+ <td>${item.type}</td>
349
+ <td>${item.merchant}</td>
350
+ <td><span class="tag">${item.category}</span></td>
351
+ <td>${item.note}</td>
352
+ `;
353
+ els.tableBody.appendChild(tr);
354
+ });
355
+ }
356
+
357
+ function renderStats(list) {
358
+ const total = list.reduce((sum, item) => sum + item.amount, 0);
359
+ const max = list.length ? Math.max(...list.map(item => item.amount)) : 0;
360
+ const avg = list.length ? total / list.length : 0;
361
+ els.totalExpense.textContent = formatMoney(total);
362
+ els.totalCount.textContent = list.length;
363
+ els.maxExpense.textContent = formatMoney(max);
364
+ els.avgExpense.textContent = formatMoney(avg);
365
+ }
366
+
367
+ function renderCategorySummary(list) {
368
+ const map = new Map();
369
+ list.forEach(item => {
370
+ map.set(item.category, (map.get(item.category) || 0) + item.amount);
371
+ });
372
+ const sorted = [...map.entries()].sort((a, b) => b[1] - a[1]);
373
+ els.categorySummary.innerHTML = sorted.map(([name, total]) => `<li><strong>${name}</strong>:${formatMoney(total)}</li>`).join('');
374
+ }
375
+
376
+ function renderMerchantSummary(list) {
377
+ const map = new Map();
378
+ list.forEach(item => {
379
+ map.set(item.merchant, (map.get(item.merchant) || 0) + item.amount);
380
+ });
381
+ const sorted = [...map.entries()].sort((a, b) => b[1] - a[1]).slice(0, 5);
382
+ els.merchantSummary.innerHTML = sorted.map(([name, total]) => `<li><strong>${name}</strong>:${formatMoney(total)}</li>`).join('');
383
+ }
384
+
385
+ function render() {
386
+ const list = getFilteredData();
387
+ renderTable(list);
388
+ renderStats(list);
389
+ renderCategorySummary(list);
390
+ renderMerchantSummary(list);
391
+ }
392
+
393
+ [els.keyword, els.categoryFilter, els.minAmount, els.maxAmount, els.sortBy].forEach(el => {
394
+ el.addEventListener('input', render);
395
+ el.addEventListener('change', render);
396
+ });
397
+
398
+ els.resetBtn.addEventListener('click', () => {
399
+ els.keyword.value = '';
400
+ els.categoryFilter.value = '';
401
+ els.minAmount.value = '';
402
+ els.maxAmount.value = '';
403
+ els.sortBy.value = 'amountDesc';
404
+ render();
405
+ });
406
+
407
+ fillCategoryOptions();
408
+ render();
409
+ </script>
410
+ </body>
411
+ </html>
@@ -0,0 +1,77 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>做一份自己看得懂的消费报告</title>
7
+ <style>
8
+ * { box-sizing: border-box; }
9
+ body { margin: 0; font-family: "PingFang SC", "Microsoft YaHei", sans-serif; background: #f4f7fb; color: #24324a; }
10
+ .page { max-width: 1440px; margin: 0 auto; padding: 20px 20px 48px; }
11
+ .header-bar { background: linear-gradient(135deg,#5f82ff 0%,#8c74ff 100%); border-radius: 24px; padding: 20px 24px; box-shadow: 0 16px 36px rgba(92,108,192,.24); }
12
+ .header-left h1 { margin: 0; font-size: 26px; line-height: 1.3; color: #fff; font-weight: 800; }
13
+ .header-left .subtitle { margin: 8px 0 0; font-size: 13px; line-height: 1.8; color: rgba(255,255,255,.88); }
14
+ .main-section { margin-top: 18px; }
15
+ .block { background: #fff; border-radius: 24px; padding: 22px; box-shadow: 0 10px 28px rgba(100,122,166,.12); }
16
+ .content-layout { display: grid; grid-template-columns: 220px minmax(0,1fr) 220px; gap: 14px; align-items: stretch; }
17
+ .task-panel, .goal-panel { background: #f8faff; border: 1px solid #e7eefc; border-radius: 20px; padding: 16px; display: flex; flex-direction: column; gap: 14px; }
18
+ .panel-group h3 { margin: 0 0 10px; color: #334d98; font-size: 17px; }
19
+ .task-item { margin-bottom: 10px; }
20
+ .task-item:last-child { margin-bottom: 0; }
21
+ .item-top { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; font-size: 12px; font-weight: 600; color: #7a89ad; }
22
+ .item-body { background: #fff; border: 1px solid #e7eefc; border-radius: 12px; padding: 10px 12px; font-size: 13px; color: #60708b; line-height: 1.7; }
23
+ .task-item .num { min-width: 22px; height: 22px; padding: 0 7px; border-radius: 999px; background: #edf2ff; color: #7a89ad; font-size: 10px; font-weight: 700; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; }
24
+ .star-item .num { background: #fff7dc; color: #b89a4f; }
25
+ .sample-frame-wrap { background: #f8faff; border: 1px solid #e7eefc; border-radius: 20px; padding: 14px; min-width: 0; }
26
+ .sample-frame-head { display: flex; justify-content: flex-start; align-items: center; gap: 10px; margin-bottom: 12px; }
27
+ .sample-frame-head h3 { margin: 0; color: #334d98; font-size: 17px; }
28
+ .tips-block { margin-top: 16px; background: #fff; border-radius: 24px; padding: 22px; box-shadow: 0 10px 28px rgba(100,122,166,.12); }
29
+ .tips-block h3 { margin: 0 0 14px; color: #334d98; font-size: 18px; }
30
+ .tips-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
31
+ .tip-item { background: #f8faff; border: 1px solid #e7eefc; border-radius: 16px; padding: 14px; }
32
+ .tip-title { font-size: 14px; font-weight: 700; color: #334d98; margin-bottom: 8px; }
33
+ .tip-desc { font-size: 13px; color: #60708b; line-height: 1.7; margin-bottom: 8px; }
34
+ .tip-prompt { font-size: 12px; color: #4f5f7c; line-height: 1.8; background: #fff; border: 1px dashed #d6e2ff; border-radius: 12px; padding: 10px 12px; }
35
+ iframe { width: 100%; height: 560px; border: 1px solid #dfe7fb; border-radius: 16px; background: #fff; display: block; }
36
+ @media (max-width: 960px) { .page { padding: 14px 12px 32px; } .header-bar { padding: 16px 18px; } .header-left h1 { font-size: 22px; } .header-left .subtitle { font-size: 12px; } .content-layout { grid-template-columns: 1fr; } .task-panel, .goal-panel, .sample-frame-wrap, .tips-block { padding: 14px; } .tips-list { grid-template-columns: 1fr; } iframe { height: 360px; } }
37
+ </style>
38
+ </head>
39
+ <body>
40
+ <div class="page">
41
+ <header class="header-bar">
42
+ <div class="header-left">
43
+ <h1>做一份自己看得懂的消费报告</h1>
44
+ <p class="subtitle">下载一份真实账单,让AI帮你分类汇总,生成一份本月消费报告,最后做成一个下个月还能继续用的网页工具。</p>
45
+ </div>
46
+ </header>
47
+ <div class="main-section">
48
+ <section class="block">
49
+ <div class="content-layout">
50
+ <div class="task-panel">
51
+ <div class="panel-group">
52
+ <h3>步骤</h3>
53
+ <div class="task-item"><div class="item-top"><span class="num">1</span><span>下载账单并脱敏</span></div><div class="item-body">从支付宝、微信或银行App下载最近一个月的账单(Excel或截图都行)。下载后先删掉不想暴露的信息:完整卡号、手机号、家庭地址。保留:日期、金额、商户名称、备注。控制在5分钟内,不要追求完美。</div></div><div class="task-item"><div class="item-top"><span class="num">2</span><span>让AI做第一版分析</span></div><div class="item-body">把账单内容粘贴给AI,用下面这段提示词:「这是我的本月消费账单,请帮我:1.按类别分类(餐饮/交通/购物/学习/医疗/娱乐/其他);2.汇总每类金额和占比;3.找出3个值得注意的消费现象;4.给我3条具体可执行的建议。不要空泛建议,只根据这份账单说。」</div></div><div class="task-item"><div class="item-top"><span class="num">3</span><span>追问和修正</span></div><div class="item-body">看AI的第一版,找出不对的地方再追问。比如:分类太粗就说「请把外卖和堂食分开」;算错了就说「请重新检查金额,列出计算过程」。目标不是第一版完美,而是能拉回来。</div></div><div class="task-item"><div class="item-top"><span class="num">4</span><span>生成最终报告网页</span></div><div class="item-body">让AI帮你把分析结果做成一个HTML网页,里面包括:总支出、各类别金额、值得注意的消费现象、3条行动建议。参考示例页面的样式。</div></div><div class="task-item"><div class="item-top"><span class="num">5</span><span>存下复用模板</span></div><div class="item-body">让AI给你输出一段提示词,下个月你只需要粘贴新账单就能重新跑。把这段提示词保存下来,这是今天最值钱的东西。</div></div>
54
+ </div>
55
+ </div>
56
+ <div class="sample-frame-wrap">
57
+ <div class="sample-frame-head"><h3>示范样例</h3></div>
58
+ <iframe src="__demo__.html" title="示范样例"></iframe>
59
+ </div>
60
+ <div class="goal-panel">
61
+ <div class="panel-group">
62
+ <h3>评价目标</h3>
63
+ <div class="task-item star-item"><div class="item-top"><span class="num">一星</span><span>一星</span></div><div class="item-body">完成账单整理,让AI成功输出分类汇总和至少3个消费现象。</div></div><div class="task-item star-item"><div class="item-top"><span class="num">二星</span><span>二星</span></div><div class="item-body">经过追问修正,得到一份自己觉得基本准确的消费分析报告。</div></div><div class="task-item star-item"><div class="item-top"><span class="num">三星</span><span>三星</span></div><div class="item-body">做出一个可以筛选和查看的消费报告网页,并保存好下个月复用的提示词模板。</div></div>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </section>
68
+ <section class="tips-block">
69
+ <h3>小提示</h3>
70
+ <div class="tips-list">
71
+ <div class="tip-item"><div class="tip-title">第一版不用完美</div><div class="tip-desc">AI第一次分类不准很正常,重要的是能追问拉回来,而不是一开始就喂完美数据。</div><div class="tip-prompt">参考提示词:你的分类有些粗,请重新分类。把明显的外卖、咖啡、堂食拆开,把一次性大额支出和高频小额支出分开分析。</div></div><div class="tip-item"><div class="tip-title">让AI算错了就追</div><div class="tip-desc">AI会算错金额,发现了直接追问,不要自己手动算。</div><div class="tip-prompt">参考提示词:请检查金额汇总是否有错误。如果你不确定,请列出你用于汇总的明细和计算过程。</div></div>
72
+ </div>
73
+ </section>
74
+ </div>
75
+ </div>
76
+ </body>
77
+ </html>
@@ -0,0 +1,54 @@
1
+ {
2
+ "任务标题": "做一份自己看得懂的消费报告",
3
+ "一句话说明": "下载一份真实账单,让AI帮你分类汇总,生成一份本月消费报告,最后做成一个下个月还能继续用的网页工具。",
4
+ "步骤": [
5
+ {
6
+ "标题": "下载账单并脱敏",
7
+ "说明": "从支付宝、微信或银行App下载最近一个月的账单(Excel或截图都行)。下载后先删掉不想暴露的信息:完整卡号、手机号、家庭地址。保留:日期、金额、商户名称、备注。控制在5分钟内,不要追求完美。"
8
+ },
9
+ {
10
+ "标题": "让AI做第一版分析",
11
+ "说明": "把账单内容粘贴给AI,用下面这段提示词:「这是我的本月消费账单,请帮我:1.按类别分类(餐饮/交通/购物/学习/医疗/娱乐/其他);2.汇总每类金额和占比;3.找出3个值得注意的消费现象;4.给我3条具体可执行的建议。不要空泛建议,只根据这份账单说。」"
12
+ },
13
+ {
14
+ "标题": "追问和修正",
15
+ "说明": "看AI的第一版,找出不对的地方再追问。比如:分类太粗就说「请把外卖和堂食分开」;算错了就说「请重新检查金额,列出计算过程」。目标不是第一版完美,而是能拉回来。"
16
+ },
17
+ {
18
+ "标题": "生成最终报告网页",
19
+ "说明": "让AI帮你把分析结果做成一个HTML网页,里面包括:总支出、各类别金额、值得注意的消费现象、3条行动建议。参考示例页面的样式。"
20
+ },
21
+ {
22
+ "标题": "存下复用模板",
23
+ "说明": "让AI给你输出一段提示词,下个月你只需要粘贴新账单就能重新跑。把这段提示词保存下来,这是今天最值钱的东西。"
24
+ }
25
+ ],
26
+ "评价目标": [
27
+ {
28
+ "等级": "一星",
29
+ "说明": "完成账单整理,让AI成功输出分类汇总和至少3个消费现象。"
30
+ },
31
+ {
32
+ "等级": "二星",
33
+ "说明": "经过追问修正,得到一份自己觉得基本准确的消费分析报告。"
34
+ },
35
+ {
36
+ "等级": "三星",
37
+ "说明": "做出一个可以筛选和查看的消费报告网页,并保存好下个月复用的提示词模板。"
38
+ }
39
+ ],
40
+ "示例区标题": "示范样例",
41
+ "示例页面文件": "__demo__.html",
42
+ "小提示": [
43
+ {
44
+ "标题": "第一版不用完美",
45
+ "说明": "AI第一次分类不准很正常,重要的是能追问拉回来,而不是一开始就喂完美数据。",
46
+ "参考提示词": "你的分类有些粗,请重新分类。把明显的外卖、咖啡、堂食拆开,把一次性大额支出和高频小额支出分开分析。"
47
+ },
48
+ {
49
+ "标题": "让AI算错了就追",
50
+ "说明": "AI会算错金额,发现了直接追问,不要自己手动算。",
51
+ "参考提示词": "请检查金额汇总是否有错误。如果你不确定,请列出你用于汇总的明细和计算过程。"
52
+ }
53
+ ]
54
+ }
@@ -0,0 +1,52 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>D102 · 做一份自己看得懂的消费报告</title>
7
+ <style>
8
+ * { box-sizing: border-box; }
9
+ body { margin: 0; font-family: "PingFang SC", "Microsoft YaHei", sans-serif; background: #f4f7fb; color: #24324a; }
10
+ .page { max-width: 1400px; margin: 0 auto; padding: 20px; }
11
+ .hero { background: linear-gradient(135deg,#5f82ff 0%,#8c74ff 100%); color: #fff; border-radius: 24px; padding: 22px 24px; box-shadow: 0 16px 36px rgba(92,108,192,.22); }
12
+ .hero h1 { margin: 0; font-size: 28px; }
13
+ .hero p { margin: 8px 0 0; opacity: .92; font-size: 14px; }
14
+ .layout { margin-top: 18px; display: grid; grid-template-columns: 360px minmax(0,1fr); gap: 16px; align-items: start; }
15
+ .sidebar { display: grid; gap: 16px; }
16
+ .card, .preview-card { background: #fff; border: 1px solid #e7eefc; border-radius: 20px; padding: 18px; box-shadow: 0 10px 24px rgba(100,122,166,.08); }
17
+ .card h2, .preview-head h2 { margin: 0 0 12px; font-size: 18px; color: #314a96; }
18
+ .meta-grid { display: grid; grid-template-columns: 1fr; gap: 10px; }
19
+ .meta-item { background: #f8faff; border: 1px solid #e7eefc; border-radius: 14px; padding: 12px; }
20
+ .meta-item .label { font-size: 12px; color: #7a89ad; margin-bottom: 6px; }
21
+ .meta-item .value { font-size: 14px; color: #24324a; font-weight: 700; }
22
+ .tags { display: flex; flex-wrap: wrap; gap: 8px; }
23
+ .tag { display: inline-flex; align-items: center; padding: 7px 12px; border-radius: 999px; background: #edf2ff; color: #4c65c3; font-size: 13px; font-weight: 700; }
24
+ .list { display: grid; gap: 10px; }
25
+ .list-item { background: #f8faff; border: 1px solid #e7eefc; border-radius: 14px; padding: 12px; line-height: 1.7; font-size: 14px; color: #60708b; }
26
+ .issue { border-left: 4px solid #8c74ff; background: #faf8ff; }
27
+ .issue strong { color: #314a96; display: block; margin: 6px 0; }
28
+ iframe { width: 100%; height: 900px; border: 1px solid #dfe7fb; border-radius: 16px; background: #fff; display: block; }
29
+ .empty-box { background: #f8faff; border: 1px dashed #cfdcff; border-radius: 14px; padding: 24px; color: #7a89ad; line-height: 1.8; }
30
+ @media (max-width: 960px) { .layout { grid-template-columns: 1fr; } iframe { height: 420px; } }
31
+ </style>
32
+ </head>
33
+ <body>
34
+ <div class="page">
35
+ <section class="hero">
36
+ <h1>D102 · 做一份自己看得懂的消费报告</h1>
37
+ <p>这是根据教师 JSON 自动生成的可视化查看页,左边快速扫读,右边直接看作品预览。</p>
38
+ </section>
39
+ <section class="layout">
40
+ <div class="sidebar">
41
+ <div class="card"><h2>基础信息</h2><div class="meta-grid"><div class="meta-item"><div class="label">主能力标签</div><div class="value">第三能力:问题判断</div></div><div class="meta-item"><div class="label">任务类型标签</div><div class="value">改编优化</div></div></div></div>
42
+ <div class="card"><h2>适合学生类型</h2><div class="tags"><span class="tag">成人学员(25-45岁)</span><span class="tag">有真实账单可以使用</span><span class="tag">想用AI解决实际生活问题的用户</span></div></div>
43
+ <div class="card"><h2>训练重点</h2><div class="list"><div class="list-item">用真实数据驱动AI工作,而不是让AI凭空生成</div><div class="list-item">追问和修正能力:第一版不够好时能拉回来</div><div class="list-item">判断力:能识别AI的错误(算错/分类不合理)</div><div class="list-item">工具化思维:把一次分析沉淀成下个月可复用的提示词模板</div></div></div>
44
+ <div class="card"><h2>卡点和解决方案</h2><div class="list"><div class="list-item issue"><strong>卡点</strong>账单导出很麻烦,卡在第一步<strong>解决方案</strong>提前告知:截图或手动复制粘贴也可以,不必非要Excel。导出困难本身就是课程记录的信息之一。</div><div class="list-item issue"><strong>卡点</strong>AI分类结果与实际差异很大,学员觉得AI不好用<strong>解决方案</strong>引导学员追问修正,而不是放弃。核心示范点:第一版不好没关系,能被拉回来才是重点。</div><div class="list-item issue"><strong>卡点</strong>AI算错金额,学员不知道如何处理<strong>解决方案</strong>教学员直接说&#x27;请检查金额并列出计算过程&#x27;,让AI自己暴露错误,而不是学员手动核算。</div><div class="list-item issue"><strong>卡点</strong>学员觉得自己的账单太乱、太私密不敢用<strong>解决方案</strong>强调脱敏步骤5分钟就够,保留日期/金额/商户就足够AI分析,不需要完整流水。</div><div class="list-item issue"><strong>卡点</strong>做出来的网页很空,只有标题没有真实数据<strong>解决方案</strong>要求学员先在对话里确认分析结论,再让AI做网页。顺序是:数据→分析→报告→网页,不能跳步。</div></div></div>
45
+ <div class="card"><h2>可拓展方向</h2><div class="list"><div class="list-item">多月对比:把两个月的账单都给AI,让它对比消费变化趋势</div><div class="list-item">预算设定:根据本月数据,让AI帮你设定下个月各类别的预算上限</div><div class="list-item">家庭版:把两个人的账单合并分析,识别家庭支出结构</div><div class="list-item">年度复盘:把12个月的数据汇总,做一份年度消费报告</div></div></div>
46
+ <div class="card"><h2>课后作业</h2><div class="list"><div class="list-item">把今天的复用提示词模板存好。下个月账单出来后,自己独立跑一遍,看看和今天的结果有什么变化,把发现写两句话记下来。</div></div></div>
47
+ </div>
48
+ <div class="preview-card"><div class="preview-head"><h2>作品预览</h2></div><iframe src="__demo__.html" title="作品预览"></iframe></div>
49
+ </section>
50
+ </div>
51
+ </body>
52
+ </html>
@@ -0,0 +1,50 @@
1
+ {
2
+ "任务类别": "D",
3
+ "任务编号": "103",
4
+ "任务名称": "做一份自己看得懂的消费报告",
5
+ "主能力标签": "第三能力:问题判断",
6
+ "任务类型标签": "改编优化",
7
+ "适合学生类型": [
8
+ "成人学员(25-45岁)",
9
+ "有真实账单可以使用",
10
+ "想用AI解决实际生活问题的用户"
11
+ ],
12
+ "训练重点": [
13
+ "用真实数据驱动AI工作,而不是让AI凭空生成",
14
+ "追问和修正能力:第一版不够好时能拉回来",
15
+ "判断力:能识别AI的错误(算错/分类不合理)",
16
+ "工具化思维:把一次分析沉淀成下个月可复用的提示词模板"
17
+ ],
18
+ "卡点和解决方案": [
19
+ {
20
+ "卡点": "账单导出很麻烦,卡在第一步",
21
+ "解决方案": "提前告知:截图或手动复制粘贴也可以,不必非要Excel。导出困难本身就是课程记录的信息之一。"
22
+ },
23
+ {
24
+ "卡点": "AI分类结果与实际差异很大,学员觉得AI不好用",
25
+ "解决方案": "引导学员追问修正,而不是放弃。核心示范点:第一版不好没关系,能被拉回来才是重点。"
26
+ },
27
+ {
28
+ "卡点": "AI算错金额,学员不知道如何处理",
29
+ "解决方案": "教学员直接说'请检查金额并列出计算过程',让AI自己暴露错误,而不是学员手动核算。"
30
+ },
31
+ {
32
+ "卡点": "学员觉得自己的账单太乱、太私密不敢用",
33
+ "解决方案": "强调脱敏步骤5分钟就够,保留日期/金额/商户就足够AI分析,不需要完整流水。"
34
+ },
35
+ {
36
+ "卡点": "做出来的网页很空,只有标题没有真实数据",
37
+ "解决方案": "要求学员先在对话里确认分析结论,再让AI做网页。顺序是:数据→分析→报告→网页,不能跳步。"
38
+ }
39
+ ],
40
+ "可拓展方向": [
41
+ "多月对比:把两个月的账单都给AI,让它对比消费变化趋势",
42
+ "预算设定:根据本月数据,让AI帮你设定下个月各类别的预算上限",
43
+ "家庭版:把两个人的账单合并分析,识别家庭支出结构",
44
+ "年度复盘:把12个月的数据汇总,做一份年度消费报告"
45
+ ],
46
+ "课后作业": [
47
+ "把今天的复用提示词模板存好。下个月账单出来后,自己独立跑一遍,看看和今天的结果有什么变化,把发现写两句话记下来。"
48
+ ],
49
+ "_id": "631201a8"
50
+ }