第一次上传

This commit is contained in:
xxk
2026-06-11 09:53:11 +08:00
commit e257f2009e
89 changed files with 4336 additions and 0 deletions
File diff suppressed because one or more lines are too long
@@ -0,0 +1,9 @@
{
"navigationBarTitleText": "账单管理",
"enablePullDownRefresh": true,
"usingComponents": {
"section-card": "../../components/SectionCard",
"app-tab-bar": "../../components/AppTabBar",
"bill-editor-popup": "../../components/BillEditorPopup"
}
}
@@ -0,0 +1 @@
<view class="{{['app-page', 'data-v-ff523969', O]}}"><section-card wx:if="{{w}}" class="data-v-ff523969" u-s="{{['d']}}" u-i="ff523969-0" bind:__l="__l" u-p="{{w}}"><view class="chip-row data-v-ff523969"><view wx:for="{{a}}" wx:for-item="item" wx:key="b" class="{{['pill-button', 'data-v-ff523969', item.c && 'active']}}" bindtap="{{item.d}}">{{item.a}}</view></view><view class="chip-row compact-row data-v-ff523969"><view wx:for="{{b}}" wx:for-item="item" wx:key="b" class="{{['pill-button', 'mini-pill', 'data-v-ff523969', item.c && 'active']}}" bindtap="{{item.d}}">{{item.a}}</view><picker class="data-v-ff523969" mode="date" fields="month" value="{{d}}" bindchange="{{e}}"><view class="pill-button mini-pill data-v-ff523969">{{c}}</view></picker></view><view class="form-grid data-v-ff523969"><view class="input-shell data-v-ff523969"><input class="data-v-ff523969" placeholder="备注、分类或账户关键词" value="{{f}}" bindinput="{{g}}"/></view><view class="double-grid data-v-ff523969"><view class="input-shell data-v-ff523969"><input class="data-v-ff523969" type="digit" placeholder="最低金额" value="{{h}}" bindinput="{{i}}"/></view><view class="input-shell data-v-ff523969"><input class="data-v-ff523969" type="digit" placeholder="最高金额" value="{{j}}" bindinput="{{k}}"/></view></view></view><view class="picker-row data-v-ff523969"><picker class="data-v-ff523969" range="{{m}}" value="{{n}}" bindchange="{{o}}"><view class="input-shell picker-shell data-v-ff523969"><text class="data-v-ff523969">{{l}}</text><text class="tiny-text data-v-ff523969">分类</text></view></picker><picker class="data-v-ff523969" range="{{q}}" value="{{r}}" bindchange="{{s}}"><view class="input-shell picker-shell data-v-ff523969"><text class="data-v-ff523969">{{p}}</text><text class="tiny-text data-v-ff523969">账户</text></view></picker></view><view class="action-row data-v-ff523969"><view class="ghost-button data-v-ff523969" bindtap="{{t}}">清空筛选</view><view class="primary-button data-v-ff523969" bindtap="{{v}}">新增账单</view></view></section-card><section-card wx:if="{{F}}" class="data-v-ff523969" u-s="{{['action','d']}}" u-i="ff523969-1" bind:__l="__l" u-p="{{F}}"><text class="section-link data-v-ff523969" bindtap="{{y}}" slot="action">{{x}}</text><view class="summary-row data-v-ff523969"><view class="summary-item surface-strong data-v-ff523969"><text class="tiny-text data-v-ff523969">支出</text><text class="data-v-ff523969" style="margin-left:16rpx"></text><text class="summary-value negative data-v-ff523969">{{z}}</text></view><view class="summary-item surface-strong data-v-ff523969"><text class="tiny-text data-v-ff523969">收入</text><text class="data-v-ff523969" style="margin-left:16rpx"></text><text class="summary-value positive data-v-ff523969">{{A}}</text></view><view class="summary-item surface-strong data-v-ff523969"><text class="tiny-text data-v-ff523969">结余</text><text class="data-v-ff523969" style="margin-left:16rpx"></text><text class="summary-value data-v-ff523969">{{B}}</text></view></view><view wx:if="{{C}}" class="bill-list data-v-ff523969"><view wx:for="{{D}}" wx:for-item="bill" wx:key="j" class="bill-row data-v-ff523969" bindtap="{{bill.k}}" bindlongpress="{{bill.l}}"><view class="row-main data-v-ff523969"><view wx:if="{{E}}" class="{{['check-box', 'data-v-ff523969', bill.a && 'checked']}}"></view><view class="bill-dot data-v-ff523969" style="{{'background:' + bill.b}}"></view><view class="bill-body data-v-ff523969"><text class="bill-title data-v-ff523969">{{bill.c}}</text><text class="bill-meta data-v-ff523969">{{bill.d}} · {{bill.e}} · {{bill.f}}</text></view></view><text class="{{['bill-amount', 'data-v-ff523969', bill.i]}}">{{bill.g}}{{bill.h}}</text></view></view><view wx:else class="empty-card data-v-ff523969"><text class="section-subtitle data-v-ff523969">当前筛选条件下没有符合条件的账单记录。</text></view></section-card><view wx:if="{{G}}" class="surface-card batch-bar data-v-ff523969"><text class="batch-text data-v-ff523969">已选 {{H}} 笔</text><view class="ghost-button data-v-ff523969" bindtap="{{I}}">全选</view><view class="ghost-button danger-button data-v-ff523969" bindtap="{{J}}">删除所选</view></view><app-tab-bar wx:if="{{K}}" class="data-v-ff523969" u-i="ff523969-2" bind:__l="__l" u-p="{{K}}"/><bill-editor-popup wx:if="{{N}}" class="data-v-ff523969" bindclose="{{L}}" bindsave="{{M}}" u-i="ff523969-3" bind:__l="__l" u-p="{{N}}"/></view>
@@ -0,0 +1 @@
.chip-row.data-v-ff523969,.action-row.data-v-ff523969,.picker-row.data-v-ff523969,.summary-row.data-v-ff523969{display:flex;flex-wrap:wrap;gap:16rpx}.compact-row.data-v-ff523969{margin-top:16rpx}.mini-pill.data-v-ff523969{padding:16rpx 22rpx}.form-grid.data-v-ff523969{display:flex;flex-direction:column;gap:16rpx;margin:18rpx 0}.double-grid.data-v-ff523969,.picker-row.data-v-ff523969{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16rpx}.picker-shell.data-v-ff523969{justify-content:space-between}.action-row.data-v-ff523969{margin-top:18rpx}.action-row .ghost-button.data-v-ff523969,.action-row .primary-button.data-v-ff523969{flex:1}.section-link.data-v-ff523969{font-size:24rpx;color:var(--brand)}.summary-item.data-v-ff523969{flex:1;padding:22rpx;border-radius:24rpx}.summary-value.data-v-ff523969{margin-top:10rpx;font-size:30rpx;font-weight:700;color:var(--text-primary)}.bill-list.data-v-ff523969{display:flex;flex-direction:column;gap:16rpx;margin-top:22rpx}.bill-row.data-v-ff523969{display:flex;align-items:center;justify-content:space-between;gap:16rpx;padding:22rpx;border-radius:24rpx;background:var(--surface-muted)}.row-main.data-v-ff523969{display:flex;align-items:center;gap:16rpx;flex:1}.check-box.data-v-ff523969{width:30rpx;height:30rpx;border-radius:10rpx;border:2rpx solid var(--brand)}.check-box.checked.data-v-ff523969{background:var(--brand)}.bill-dot.data-v-ff523969{width:16rpx;height:16rpx;border-radius:50%}.bill-body.data-v-ff523969{flex:1}.bill-title.data-v-ff523969,.bill-amount.data-v-ff523969{font-size:28rpx;font-weight:600;color:var(--text-primary)}.bill-meta.data-v-ff523969{margin-top:8rpx;font-size:22rpx;color:var(--text-secondary);line-height:1.5}.empty-card.data-v-ff523969{padding:40rpx 0 10rpx;text-align:center}.batch-bar.data-v-ff523969{position:fixed;left:24rpx;right:24rpx;bottom:176rpx;display:flex;align-items:center;gap:16rpx;padding:20rpx 22rpx;z-index:18}.batch-text.data-v-ff523969{flex:1;font-size:26rpx;color:var(--text-primary)}
@@ -0,0 +1 @@
"use strict";const e=require("../../common/vendor.js"),t=require("../../utils/store.js"),a=require("../../utils/date.js"),u=require("../../utils/money.js");Math||(r+n)();const r=()=>"../../components/SectionCard.js",n=()=>"../../components/AppTabBar.js",o={__name:"index",setup(r){const n=t.useAppStore(),o=e.computed((()=>a.toMonthKey())),s=e.computed((()=>"dark"===n.state.settings.theme?"theme-dark":"")),l=e.ref(String(n.state.budgets.total||"")),d=e.reactive({}),c=e.computed((()=>n.state.bills.filter((e=>"expense"===e.type&&a.isSameMonth(e.date,o.value))))),i=e.computed((()=>c.value.reduce(((e,t)=>e+Number(t.amount)),0))),m=e.computed((()=>Number(n.state.budgets.total)||0)),p=e.computed((()=>m.value-i.value)),v=e.computed((()=>Math.max(p.value,0)/Math.max(1,a.getDaysLeftInMonth(o.value)))),g=e.computed((()=>m.value?u.formatPercent(i.value/Math.max(m.value,1)):"未设置")),f=e.computed((()=>u.clampPercent(i.value/Math.max(m.value||1,1)))),b=e.computed((()=>n.state.categories.expense.map((e=>{const t=c.value.filter((t=>t.categoryId===e.id)).reduce(((e,t)=>e+Number(t.amount)),0),a=Number(n.state.budgets.categoryBudgets[e.id]||0);return{...e,spent:t,budget:a,progressLabel:a?u.formatPercent(t/Math.max(a,1)):"未设置",progressWidth:u.clampPercent(t/Math.max(a||1,1))}})))),h=e.computed((()=>b.value.filter((e=>e.budget>0&&e.spent>e.budget))));function y(){n.setBudgetTotal(l.value),e.index.showToast({title:"总预算已保存",icon:"none"})}return e.watch((()=>n.state.budgets.total),(e=>{l.value=String(e||"")}),{immediate:!0}),e.watch(b,(e=>{e.forEach((e=>{d[e.id]=String(e.budget||"")}))}),{immediate:!0}),(t,a)=>e.e({a:e.t(e.unref(u.formatCurrency)(m.value)),b:e.t(e.unref(u.formatCurrency)(i.value)),c:f.value,d:e.t(g.value),e:e.t(p.value>=0?`剩余 ${e.unref(u.formatCurrency)(p.value)}`:`已超支 ${e.unref(u.formatCurrency)(Math.abs(p.value))}`),f:e.t(m.value?`日均可用 ${e.unref(u.formatCurrency)(v.value)}`:"设置预算后可查看剩余额度分配"),g:l.value,h:e.o((e=>l.value=e.detail.value)),i:e.o(y),j:e.p({title:"月度预算",subtitle:"设置总预算与分类预算,控制消费节奏"}),k:h.value.length},h.value.length?{l:e.f(h.value,((t,a,r)=>({a:e.t(t.name),b:e.t(e.unref(u.formatCurrency)(t.budget)),c:e.t(e.unref(u.formatCurrency)(t.spent)),d:t.id}))),m:e.p({title:"超支提醒",subtitle:"当前分类预算已被突破,建议尽快调整"})}:{},{n:e.f(b.value,((t,a,r)=>({a:t.color,b:e.t(t.name),c:e.t(e.unref(u.formatCurrency)(t.spent)),d:t.progressWidth,e:e.t(e.unref(u.formatCurrency)(t.budget)),f:e.t(t.progressLabel),g:e.n(t.budget>0&&t.spent>t.budget?"negative":""),h:d[t.id],i:e.o((e=>d[t.id]=e.detail.value),t.id),j:e.o((a=>{return u=t.id,n.setCategoryBudget(u,d[u]),void e.index.showToast({title:"分类预算已保存",icon:"none"});var u}),t.id),k:t.id}))),o:e.p({title:"分类预算",subtitle:"为高频分类分别设置预算,减少超支风险"}),p:e.p({current:"budget"}),q:e.n(s.value)})}},s=e._export_sfc(o,[["__scopeId","data-v-a56ca0c4"]]);wx.createPage(s);
@@ -0,0 +1,7 @@
{
"navigationBarTitleText": "预算管理",
"usingComponents": {
"section-card": "../../components/SectionCard",
"app-tab-bar": "../../components/AppTabBar"
}
}
@@ -0,0 +1 @@
<view class="{{['app-page', 'data-v-a56ca0c4', q]}}"><section-card wx:if="{{j}}" class="data-v-a56ca0c4" u-s="{{['d']}}" u-i="a56ca0c4-0" bind:__l="__l" u-p="{{j}}"><view class="budget-hero surface-strong data-v-a56ca0c4"><view class="data-v-a56ca0c4"><text class="tiny-text data-v-a56ca0c4">本月总预算</text><text class="budget-number data-v-a56ca0c4">{{a}}</text></view><view class="data-v-a56ca0c4"><text class="tiny-text data-v-a56ca0c4">本月已支出</text><text class="budget-number negative data-v-a56ca0c4">{{b}}</text></view></view><view class="progress-track data-v-a56ca0c4"><view class="progress-fill data-v-a56ca0c4" style="{{'width:' + c}}"></view></view><view class="budget-foot data-v-a56ca0c4"><text class="tiny-text data-v-a56ca0c4">使用进度 {{d}}</text><text class="tiny-text data-v-a56ca0c4">{{e}}</text></view><view class="budget-foot secondary-foot data-v-a56ca0c4"><text class="tiny-text data-v-a56ca0c4">{{f}}</text></view><view class="editor-row data-v-a56ca0c4"><view class="input-shell data-v-a56ca0c4"><input class="data-v-a56ca0c4" type="digit" placeholder="输入本月总预算" value="{{g}}" bindinput="{{h}}"/></view><view class="primary-button save-btn data-v-a56ca0c4" bindtap="{{i}}">保存</view></view></section-card><section-card wx:if="{{k}}" class="data-v-a56ca0c4" u-s="{{['d']}}" u-i="a56ca0c4-1" bind:__l="__l" u-p="{{m}}"><view class="alert-list data-v-a56ca0c4"><view wx:for="{{l}}" wx:for-item="item" wx:key="d" class="alert-item data-v-a56ca0c4"><text class="alert-title data-v-a56ca0c4">{{item.a}}</text><text class="alert-text data-v-a56ca0c4">预算 {{item.b}},已支出 {{item.c}}</text></view></view></section-card><section-card wx:if="{{o}}" class="data-v-a56ca0c4" u-s="{{['d']}}" u-i="a56ca0c4-2" bind:__l="__l" u-p="{{o}}"><view class="category-list data-v-a56ca0c4"><view wx:for="{{n}}" wx:for-item="item" wx:key="k" class="category-card surface-strong data-v-a56ca0c4"><view class="category-head data-v-a56ca0c4"><view class="category-title-row data-v-a56ca0c4"><view class="category-dot data-v-a56ca0c4" style="{{'background:' + item.a}}"></view><text class="category-title data-v-a56ca0c4">{{item.b}}</text></view><text class="tiny-text data-v-a56ca0c4">已花 {{item.c}}</text></view><view class="progress-track thin-track data-v-a56ca0c4"><view class="progress-fill data-v-a56ca0c4" style="{{'width:' + item.d}}"></view></view><view class="budget-foot data-v-a56ca0c4"><text class="tiny-text data-v-a56ca0c4">预算 {{item.e}}</text><text class="{{['tiny-text', 'data-v-a56ca0c4', item.g]}}">{{item.f}}</text></view><view class="editor-row data-v-a56ca0c4"><view class="input-shell data-v-a56ca0c4"><input class="data-v-a56ca0c4" type="digit" placeholder="设置分类预算" value="{{item.h}}" bindinput="{{item.i}}"/></view><view class="ghost-button save-btn data-v-a56ca0c4" bindtap="{{item.j}}">保存</view></view></view></view></section-card><app-tab-bar wx:if="{{p}}" class="data-v-a56ca0c4" u-i="a56ca0c4-3" bind:__l="__l" u-p="{{p}}"/></view>
@@ -0,0 +1 @@
.budget-hero.data-v-a56ca0c4,.category-card.data-v-a56ca0c4{padding:24rpx;border-radius:24rpx}.budget-hero.data-v-a56ca0c4,.category-head.data-v-a56ca0c4,.category-title-row.data-v-a56ca0c4,.budget-foot.data-v-a56ca0c4,.editor-row.data-v-a56ca0c4{display:flex;align-items:center;justify-content:space-between;gap:16rpx}.secondary-foot.data-v-a56ca0c4{margin-top:10rpx}.budget-number.data-v-a56ca0c4{display:block;margin-top:10rpx;font-size:34rpx;font-weight:700;color:var(--text-primary)}.progress-track.data-v-a56ca0c4{overflow:hidden;height:18rpx;margin:24rpx 0 16rpx;border-radius:999rpx;background:var(--surface-muted)}.thin-track.data-v-a56ca0c4{height:14rpx;margin:18rpx 0 14rpx}.progress-fill.data-v-a56ca0c4{height:100%;border-radius:inherit;background:linear-gradient(90deg,#5f8df5,#1f6f5f)}.editor-row.data-v-a56ca0c4{margin-top:20rpx}.editor-row .input-shell.data-v-a56ca0c4{flex:1}.save-btn.data-v-a56ca0c4{flex:0 0 180rpx}.alert-list.data-v-a56ca0c4,.category-list.data-v-a56ca0c4{display:flex;flex-direction:column;gap:18rpx}.alert-item.data-v-a56ca0c4{padding:20rpx 22rpx;border-radius:22rpx;background:var(--danger-soft)}.alert-title.data-v-a56ca0c4{font-size:28rpx;font-weight:600;color:var(--danger)}.alert-text.data-v-a56ca0c4{display:block;margin-top:8rpx;font-size:22rpx;color:var(--danger)}.category-dot.data-v-a56ca0c4{width:16rpx;height:16rpx;border-radius:50%}.category-title.data-v-a56ca0c4{font-size:28rpx;font-weight:600;color:var(--text-primary)}
@@ -0,0 +1 @@
"use strict";const e=require("../../common/vendor.js"),t=require("../../utils/store.js"),a=require("../../utils/date.js"),u=require("../../utils/money.js");Math||(o+n+r)();const o=()=>"../../components/SectionCard.js",n=()=>"../../components/AppTabBar.js",r=()=>"../../components/BillEditorPopup.js",l={__name:"index",setup(o){const n=t.useAppStore(),r=e.ref(!1),l=e.ref(null),c=e.ref(""),i=e.ref("expense"),s=e.computed((()=>a.toDateKey())),d=e.computed((()=>a.toMonthKey())),m=e.computed((()=>"dark"===n.state.settings.theme?"theme-dark":"")),v=e.computed((()=>a.formatDateLabel(s.value))),p=e.computed((()=>[...n.state.bills].sort(((e,t)=>t.createdAt-e.createdAt)))),f=e.computed((()=>p.value.slice(0,5))),x=e.computed((()=>p.value.filter((e=>e.date===s.value)))),h=e.computed((()=>p.value.filter((e=>a.isSameMonth(e.date,d.value))))),y=e.computed((()=>x.value.filter((e=>"expense"===e.type)).reduce(((e,t)=>e+Number(t.amount)),0))),b=e.computed((()=>h.value.filter((e=>"expense"===e.type)).reduce(((e,t)=>e+Number(t.amount)),0))),g=e.computed((()=>h.value.filter((e=>"income"===e.type)).reduce(((e,t)=>e+Number(t.amount)),0))),C=e.computed((()=>g.value-b.value)),w=e.computed((()=>Number(n.state.budgets.total)||0)),M=e.computed((()=>w.value-b.value)),j=e.computed((()=>Math.max(M.value,0)/Math.max(1,a.getDaysLeftInMonth(d.value)))),A=e.computed((()=>u.clampPercent(b.value/Math.max(w.value||1,1)))),I=e.computed((()=>w.value?u.formatPercent(b.value/Math.max(w.value,1)):"未设置")),_=e.computed((()=>w.value?M.value<0?`已超支 ${u.formatCurrency(Math.abs(M.value))}`:`日均可用 ${u.formatCurrency(j.value)}`:"设置预算后可查看日均可用额度")),D=e.computed((()=>n.state.categories.expense.slice(0,6)));function L(e){return(n.state.categories[e.type]||[]).find((t=>t.id===e.categoryId))||{}}function P(e){return n.state.accounts.find((t=>t.id===e.accountId))||{}}function S(e="",t="expense"){c.value=e,i.value=t,l.value=null,r.value=!0}function T(){r.value=!1,l.value=null,c.value="",i.value="expense"}function $(t){n.saveBill(t),e.index.showToast({title:t.id?"账单已更新":"账单已保存",icon:"none"})}function q(t){e.index.showActionSheet({itemList:["编辑账单","删除账单"],success:({tapIndex:a})=>{0===a&&(l.value={...t},r.value=!0),1===a&&function(t){e.index.showModal({title:"删除账单",content:`确认删除 ${L(t).name||"这笔账单"} 吗?`,success:({confirm:e})=>{e&&n.deleteBill(t.id)}})}(t)}})}function B(){e.index.redirectTo({url:"/pages/bills/index"})}function k(){e.index.redirectTo({url:"/pages/budget/index"})}e.onPullDownRefresh((()=>{setTimeout((()=>{e.index.stopPullDownRefresh()}),200)}));const N=e.ref(!1);function E(){if(N.value)return;N.value=!0;let t=null;e.wx$1.createInterstitialAd&&(t=e.wx$1.createInterstitialAd({adUnitId:"adunit-0abc32053b19a4e9"}),t.onLoad((()=>{})),t.onError((e=>{console.error("插屏广告加载失败",e)})),t.onClose((()=>{}))),setTimeout((()=>{t&&(t.show().catch((e=>{console.error("插屏广告显示失败",e)})),N.value=!1)}),5480)}return e.onLoad((()=>{E()})),e.onShow((()=>{E()})),e.onShareAppMessage((e=>({title:"账单助手",desc:"本地单机极简记账,支持收支记录、预算管控、消费报表,数据安全私密,轻便好用的个人账单管家。",path:"/pages/home/index"}))),(t,o)=>e.e({a:e.t(v.value),b:e.t(e.unref(u.formatCurrency)(y.value)),c:e.t(e.unref(u.formatCurrency)(b.value)),d:e.t(e.unref(u.formatCurrency)(g.value)),e:e.t(e.unref(u.formatCurrency)(C.value)),f:e.t(e.unref(u.formatCurrency)(M.value)),g:e.t(I.value),h:A.value,i:e.t(w.value?`总预算 ${e.unref(u.formatCurrency)(w.value)}`:"当前尚未设置月预算"),j:e.t(_.value),k:!w.value},w.value?{}:{l:e.o(k)},{m:e.p({title:"预算概览",subtitle:"实时查看预算执行情况与剩余额度"}),n:e.o((e=>S("","expense"))),o:e.o((e=>S("","income"))),p:e.f(D.value,((t,a,u)=>({a:t.color,b:e.t(t.name),c:t.id,d:e.o((e=>S(t.id,"expense")),t.id)}))),q:e.p({title:"快捷记账",subtitle:"常用场景一步录入,提高日常记录效率"}),r:e.o(B),s:f.value.length},f.value.length?{t:e.f(f.value,((t,o,n)=>({a:L(t).color||"#7b8794",b:e.t(L(t).name||"未分类"),c:e.t(P(t).name||"账户"),d:e.t(e.unref(a.formatDateLabel)(t.date)),e:e.t("income"===t.type?"+":"-"),f:e.t(e.unref(u.formatCurrency)(t.amount).replace("¥","")),g:e.n("income"===t.type?"positive":"negative"),h:e.t(t.note||"无备注"),i:t.id,j:e.o((e=>q(t)),t.id)})))}:{v:e.o((e=>S("","expense")))},{w:e.p({title:"最近记录",subtitle:"保留最近 5 笔账单,长按可编辑或删除"}),x:e.o((e=>S("","expense"))),y:e.p({current:"home"}),z:e.o(T),A:e.o($),B:e.p({visible:r.value,entry:l.value,categories:e.unref(n).state.categories,accounts:e.unref(n).state.accounts,"default-type":i.value,"initial-category-id":c.value}),C:e.n(m.value)})}},c=e._export_sfc(l,[["__scopeId","data-v-a0f5ea5d"]]);l.__runtimeHooks=2,wx.createPage(c);
@@ -0,0 +1,9 @@
{
"navigationBarTitleText": "首页",
"enablePullDownRefresh": true,
"usingComponents": {
"section-card": "../../components/SectionCard",
"app-tab-bar": "../../components/AppTabBar",
"bill-editor-popup": "../../components/BillEditorPopup"
}
}
@@ -0,0 +1 @@
<view class="{{['app-page', 'data-v-a0f5ea5d', C]}}"><view class="surface-card hero-card data-v-a0f5ea5d"><text class="hero-date data-v-a0f5ea5d">{{a}}</text><text class="hero-title data-v-a0f5ea5d">账单小管家</text><view class="hero-metrics data-v-a0f5ea5d"><view class="metric-block data-v-a0f5ea5d"><text class="tiny-text data-v-a0f5ea5d">今日支出</text><text class="metric-value negative data-v-a0f5ea5d">{{b}}</text></view><view class="metric-block data-v-a0f5ea5d"><text class="tiny-text data-v-a0f5ea5d">本月支出</text><text class="metric-value negative data-v-a0f5ea5d">{{c}}</text></view><view class="metric-block data-v-a0f5ea5d"><text class="tiny-text data-v-a0f5ea5d">本月收入</text><text class="metric-value positive data-v-a0f5ea5d">{{d}}</text></view><view class="metric-block data-v-a0f5ea5d"><text class="tiny-text data-v-a0f5ea5d">本月结余</text><text class="metric-value data-v-a0f5ea5d">{{e}}</text></view></view></view><ad-custom class="data-v-a0f5ea5d" unit-id="adunit-74730c6c27c95a37"></ad-custom><section-card wx:if="{{m}}" class="data-v-a0f5ea5d" u-s="{{['d']}}" u-i="a0f5ea5d-0" bind:__l="__l" u-p="{{m}}"><view class="budget-head data-v-a0f5ea5d"><view class="data-v-a0f5ea5d"><text class="budget-value data-v-a0f5ea5d">{{f}}</text><text class="data-v-a0f5ea5d" style="margin-left:16rpx"></text><text class="tiny-text data-v-a0f5ea5d">剩余预算</text></view><view class="budget-side data-v-a0f5ea5d"><text class="tiny-text data-v-a0f5ea5d">预算使用</text><text class="data-v-a0f5ea5d" style="margin-left:16rpx"></text><text class="budget-percent data-v-a0f5ea5d">{{g}}</text></view></view><view class="progress-track data-v-a0f5ea5d"><view class="progress-fill data-v-a0f5ea5d" style="{{'width:' + h}}"></view></view><view class="budget-note-row data-v-a0f5ea5d"><text class="tiny-text data-v-a0f5ea5d">{{i}}</text><text class="tiny-text data-v-a0f5ea5d">{{j}}</text></view><view wx:if="{{k}}" class="budget-action-row data-v-a0f5ea5d"><view class="ghost-button data-v-a0f5ea5d" bindtap="{{l}}">去设置预算</view></view></section-card><section-card wx:if="{{q}}" class="data-v-a0f5ea5d" u-s="{{['d']}}" u-i="a0f5ea5d-1" bind:__l="__l" u-p="{{q}}"><view class="quick-action-row data-v-a0f5ea5d"><view class="primary-button quick-main data-v-a0f5ea5d" bindtap="{{n}}">记录支出</view><view class="ghost-button quick-main data-v-a0f5ea5d" bindtap="{{o}}">记录收入</view></view><view class="quick-grid data-v-a0f5ea5d"><view wx:for="{{p}}" wx:for-item="item" wx:key="c" class="quick-chip data-v-a0f5ea5d" bindtap="{{item.d}}"><view class="quick-dot data-v-a0f5ea5d" style="{{'background:' + item.a}}"></view><text class="data-v-a0f5ea5d">{{item.b}}</text></view></view></section-card><section-card wx:if="{{w}}" class="data-v-a0f5ea5d" u-s="{{['action','d']}}" u-i="a0f5ea5d-2" bind:__l="__l" u-p="{{w}}"><text class="section-link data-v-a0f5ea5d" bindtap="{{r}}" slot="action">查看全部</text><view wx:if="{{s}}" class="bill-list data-v-a0f5ea5d"><view wx:for="{{t}}" wx:for-item="bill" wx:key="i" class="bill-item data-v-a0f5ea5d" bindlongpress="{{bill.j}}"><view class="bill-leading data-v-a0f5ea5d"><view class="bill-dot data-v-a0f5ea5d" style="{{'background:' + bill.a}}"></view><view class="data-v-a0f5ea5d"><text class="bill-title data-v-a0f5ea5d">{{bill.b}}</text><text class="bill-meta data-v-a0f5ea5d">{{bill.c}} · {{bill.d}}</text></view></view><view class="bill-right data-v-a0f5ea5d"><text class="{{['bill-amount', 'data-v-a0f5ea5d', bill.g]}}">{{bill.e}}{{bill.f}}</text><text class="tiny-text data-v-a0f5ea5d">{{bill.h}}</text></view></view></view><view wx:else class="empty-card data-v-a0f5ea5d"><text class="section-subtitle data-v-a0f5ea5d">还没有账单记录,先记下第一笔收支。</text><view class="ghost-button empty-action data-v-a0f5ea5d" bindtap="{{v}}">立即记账</view></view></section-card><view class="fab-button data-v-a0f5ea5d" bindtap="{{x}}">+ 记一笔</view><app-tab-bar wx:if="{{y}}" class="data-v-a0f5ea5d" u-i="a0f5ea5d-3" bind:__l="__l" u-p="{{y}}"/><bill-editor-popup wx:if="{{B}}" class="data-v-a0f5ea5d" bindclose="{{z}}" bindsave="{{A}}" u-i="a0f5ea5d-4" bind:__l="__l" u-p="{{B}}"/></view>
@@ -0,0 +1 @@
.hero-card.data-v-a0f5ea5d{display:flex;flex-direction:column;gap:18rpx;padding:32rpx;background:var(--bg-accent);color:#fff}.hero-date.data-v-a0f5ea5d,.hero-subtitle.data-v-a0f5ea5d,.hero-card .tiny-text.data-v-a0f5ea5d{color:rgba(255,255,255,.76)}.hero-title.data-v-a0f5ea5d{font-size:46rpx;font-weight:700}.hero-subtitle.data-v-a0f5ea5d{font-size:24rpx;line-height:1.7}.hero-metrics.data-v-a0f5ea5d{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18rpx;margin-top:10rpx}.metric-block.data-v-a0f5ea5d{padding:20rpx;border-radius:24rpx;background:rgba(255,255,255,.12)}.metric-value.data-v-a0f5ea5d{display:block;margin-top:10rpx;font-size:32rpx;font-weight:700;color:#fff}.budget-head.data-v-a0f5ea5d,.budget-note-row.data-v-a0f5ea5d,.quick-action-row.data-v-a0f5ea5d{display:flex;align-items:center;justify-content:space-between;gap:18rpx}.budget-side.data-v-a0f5ea5d{text-align:right}.budget-value.data-v-a0f5ea5d,.budget-percent.data-v-a0f5ea5d{font-size:36rpx;font-weight:700;color:var(--text-primary)}.progress-track.data-v-a0f5ea5d{overflow:hidden;height:18rpx;margin:24rpx 0 16rpx;border-radius:999rpx;background:var(--surface-muted)}.progress-fill.data-v-a0f5ea5d{height:100%;border-radius:inherit;background:linear-gradient(90deg,#d36c43,#1f6f5f)}.budget-action-row.data-v-a0f5ea5d{margin-top:18rpx}.quick-action-row .quick-main.data-v-a0f5ea5d{flex:1}.quick-grid.data-v-a0f5ea5d{display:flex;flex-wrap:wrap;gap:16rpx;margin-top:18rpx}.quick-chip.data-v-a0f5ea5d{display:flex;align-items:center;gap:12rpx;padding:16rpx 18rpx;border-radius:22rpx;background:var(--surface-muted);font-size:24rpx;color:var(--text-secondary)}.quick-dot.data-v-a0f5ea5d,.bill-dot.data-v-a0f5ea5d{width:16rpx;height:16rpx;border-radius:50%}.section-link.data-v-a0f5ea5d{font-size:24rpx;color:var(--brand)}.bill-list.data-v-a0f5ea5d{display:flex;flex-direction:column;gap:18rpx}.bill-item.data-v-a0f5ea5d{display:flex;align-items:center;justify-content:space-between;gap:16rpx;padding:22rpx;border-radius:24rpx;background:var(--surface-muted)}.bill-leading.data-v-a0f5ea5d{display:flex;align-items:center;gap:16rpx;flex:1}.bill-right.data-v-a0f5ea5d{display:flex;flex-direction:column;align-items:flex-end;gap:8rpx}.bill-title.data-v-a0f5ea5d,.bill-amount.data-v-a0f5ea5d{font-size:28rpx;font-weight:600;color:var(--text-primary)}.bill-meta.data-v-a0f5ea5d{margin-top:8rpx;font-size:22rpx;color:var(--text-secondary)}.empty-card.data-v-a0f5ea5d{padding:28rpx 0 8rpx;text-align:center}.empty-action.data-v-a0f5ea5d{margin-top:18rpx}.fab-button.data-v-a0f5ea5d{position:fixed;right:32rpx;bottom:348rpx;padding:24rpx 30rpx;border-radius:999rpx;background:var(--bg-accent);color:#fff;font-size:28rpx;font-weight:700;box-shadow:0 20rpx 42rpx rgba(16,42,67,.24);z-index:18}
@@ -0,0 +1 @@
"use strict";const e=require("../../../common/vendor.js"),t=require("../../../utils/store.js");Math||o();const o=()=>"../../../components/SectionCard.js",r={__name:"index",setup(o){const r=t.useAppStore();e.onShow((()=>{!function(){let t=null;e.wx$1.createInterstitialAd&&(t=e.wx$1.createInterstitialAd({adUnitId:"adunit-0abc32053b19a4e9"}),t.onLoad((()=>{})),t.onError((e=>{console.error("插屏广告加载失败",e)})),t.onClose((()=>{})));setTimeout((()=>{t&&t.show().catch((e=>{console.error("插屏广告显示失败",e)}))}),2280)}()}));const s=e.computed((()=>"dark"===r.state.settings.theme?"theme-dark":""));return(t,o)=>({a:e.p({title:"关于应用",subtitle:"面向日常收支记录、预算控制与月度复盘的轻量工具"}),b:e.p({title:"隐私与数据",subtitle:""}),c:e.n(s.value)})}},s=e._export_sfc(r,[["__scopeId","data-v-5d1e9385"]]);wx.createPage(s);
@@ -0,0 +1,6 @@
{
"navigationBarTitleText": "关于与隐私",
"usingComponents": {
"section-card": "../../../components/SectionCard"
}
}
@@ -0,0 +1 @@
<view class="{{['app-page', 'data-v-5d1e9385', c]}}"><view class="surface-card page-hero data-v-5d1e9385"><text class="hero-kicker data-v-5d1e9385">ABOUT</text><text class="hero-title data-v-5d1e9385">关于与隐私</text><text class="hero-desc data-v-5d1e9385">查看应用定位、数据说明与发布前应补齐的正式信息。</text><view class="hero-tags data-v-5d1e9385"><text class="hero-tag soft data-v-5d1e9385">发布说明</text></view></view><ad-custom class="data-v-5d1e9385" unit-id="adunit-64707ea333329399"></ad-custom><section-card wx:if="{{a}}" class="data-v-5d1e9385" u-s="{{['d']}}" u-i="5d1e9385-0" bind:__l="__l" u-p="{{a}}"><view class="about-card surface-strong data-v-5d1e9385"><text class="app-name data-v-5d1e9385">账单小管家</text><text class="about-text data-v-5d1e9385">定位为轻量、无广告的本地记账工具,适合学生、情侣、合租和个人日常记账场景。</text></view></section-card><section-card wx:if="{{b}}" class="data-v-5d1e9385" u-s="{{['d']}}" u-i="5d1e9385-1" bind:__l="__l" u-p="{{b}}"><view class="info-list data-v-5d1e9385"><view class="info-item surface-strong data-v-5d1e9385"><text class="info-title data-v-5d1e9385">本地存储</text><text class="info-text data-v-5d1e9385">账单、预算、分类、账户和设置默认保存在当前设备本地。</text></view><view class="info-item surface-strong data-v-5d1e9385"><text class="info-title data-v-5d1e9385">本地昵称</text><text class="info-text data-v-5d1e9385">昵称仅保存在当前设备,用于个人页展示和首字头像。</text></view><view class="info-item surface-strong data-v-5d1e9385"><text class="info-title data-v-5d1e9385">数据迁移</text><text class="info-text data-v-5d1e9385">如需换机迁移,可在“备份与恢复”中导出 JSON 并在新设备恢复。</text></view></view></section-card></view>
@@ -0,0 +1 @@
.page-hero.data-v-5d1e9385{padding:30rpx;background:linear-gradient(145deg,rgba(16,42,67,.96),rgba(31,111,95,.88) 60%,rgba(212,108,67,.82));color:#fff}.hero-kicker.data-v-5d1e9385,.hero-desc.data-v-5d1e9385,.hero-tag.soft.data-v-5d1e9385{color:rgba(255,255,255,.76)}.hero-kicker.data-v-5d1e9385{font-size:20rpx;letter-spacing:4rpx}.hero-title.data-v-5d1e9385{display:block;margin-top:12rpx;font-size:44rpx;font-weight:700}.hero-desc.data-v-5d1e9385{display:block;margin-top:14rpx;font-size:24rpx;line-height:1.7}.hero-tags.data-v-5d1e9385{display:flex;flex-wrap:wrap;gap:14rpx;margin-top:22rpx}.hero-tag.data-v-5d1e9385{padding:12rpx 18rpx;border-radius:999rpx;background:rgba(255,255,255,.16);font-size:22rpx}.about-card.data-v-5d1e9385,.info-item.data-v-5d1e9385,.tips-card.data-v-5d1e9385{padding:26rpx;border-radius:28rpx}.app-name.data-v-5d1e9385,.info-title.data-v-5d1e9385{display:block;font-size:31rpx;font-weight:700;color:var(--text-primary)}.app-version.data-v-5d1e9385{display:block;margin-top:10rpx;font-size:23rpx;color:var(--brand)}.about-text.data-v-5d1e9385,.info-text.data-v-5d1e9385,.tip-line.data-v-5d1e9385{display:block;margin-top:12rpx;font-size:24rpx;line-height:1.8;color:var(--text-secondary)}.info-list.data-v-5d1e9385{display:flex;flex-direction:column;gap:16rpx}.tip-row.data-v-5d1e9385{display:flex;align-items:flex-start;gap:16rpx;padding:10rpx 0}.tip-index.data-v-5d1e9385{width:56rpx;font-size:24rpx;font-weight:700;color:var(--brand)}
@@ -0,0 +1 @@
"use strict";const t=require("../../../common/vendor.js"),e=require("../../../utils/store.js");Math||a();const a=()=>"../../../components/SectionCard.js",n={__name:"index",setup(a){const n=e.useAppStore(),o=t.ref(""),s=t.computed((()=>"dark"===n.state.settings.theme?"theme-dark":""));function i(){!function(e){const a=(new Date).toLocaleString();if(void 0!==t.wx$1&&t.wx$1.getFileSystemManager){const o=`${t.wx$1.env.USER_DATA_PATH}/bill-helper-backup.json`;t.wx$1.getFileSystemManager().writeFile({filePath:o,data:e,encoding:"utf8",success:()=>{n.markBackup(a),t.index.showModal({title:"备份成功",content:`文件已生成:${o}`,showCancel:!1})},fail:()=>{t.index.setClipboardData({data:e})}})}else n.markBackup(a),t.index.setClipboardData({data:e})}(n.exportBackup())}function l(){if(o.value.trim())try{n.importBackup(o.value),o.value="",t.index.showToast({title:"备份恢复成功",icon:"none"})}catch(e){t.index.showToast({title:"备份内容无效",icon:"none"})}else t.index.showToast({title:"请先粘贴备份内容",icon:"none"})}function c(){t.index.setClipboardData({data:n.exportBackup()})}function r(){t.index.showModal({title:"清空全部数据",content:"确认删除当前设备中的账单、预算和设置吗?此操作不可撤销。",success:({confirm:e})=>{e&&(n.resetAll(),t.index.showToast({title:"本地数据已清空",icon:"none"}))}})}return t.onShow((()=>{!function(){let e=null;t.wx$1.createInterstitialAd&&(e=t.wx$1.createInterstitialAd({adUnitId:"adunit-0abc32053b19a4e9"}),e.onLoad((()=>{})),e.onError((t=>{console.error("插屏广告加载失败",t)})),e.onClose((()=>{})));setTimeout((()=>{e&&e.show().catch((t=>{console.error("插屏广告显示失败",t)}))}),2280)}()})),(e,a)=>t.e({a:t.t(t.unref(n).state.settings.lastBackupAt?"最近已备份":"尚未备份"),b:t.t(t.unref(n).state.settings.lastBackupAt?"可继续备份":"建议先备份"),c:t.o(i),d:t.unref(n).state.settings.lastBackupAt},t.unref(n).state.settings.lastBackupAt?{e:t.t(t.unref(n).state.settings.lastBackupAt)}:{},{f:t.p({title:"导出备份",subtitle:"将账单、预算和设置导出为 JSON 文件,便于迁移设备或手动保存"}),g:o.value,h:t.o((t=>o.value=t.detail.value)),i:t.o((t=>o.value="")),j:t.o(l),k:t.p({title:"恢复备份",subtitle:"粘贴之前导出的 JSON 内容,恢复后将覆盖当前设备数据"}),l:t.o(c),m:t.o(r),n:t.p({title:"数据操作",subtitle:"谨慎执行不可撤销的本地清理操作"}),o:t.n(s.value)})}},o=t._export_sfc(n,[["__scopeId","data-v-15765fe6"]]);wx.createPage(o);
@@ -0,0 +1,6 @@
{
"navigationBarTitleText": "备份与恢复",
"usingComponents": {
"section-card": "../../../components/SectionCard"
}
}
@@ -0,0 +1 @@
<view class="{{['app-page', 'data-v-15765fe6', o]}}"><view class="surface-card page-hero data-v-15765fe6"><text class="hero-kicker data-v-15765fe6">BACKUP</text><text class="hero-title data-v-15765fe6">备份与恢复</text><text class="hero-desc data-v-15765fe6">导出本地 JSON 备份,恢复时覆盖当前设备数据,适合换机或手动留档。</text><view class="hero-tags data-v-15765fe6"><text class="hero-tag data-v-15765fe6">本地文件</text><text class="hero-tag soft data-v-15765fe6">{{a}}</text></view></view><ad-custom class="data-v-15765fe6" unit-id="adunit-64707ea333329399"></ad-custom><section-card wx:if="{{f}}" class="data-v-15765fe6" u-s="{{['d']}}" u-i="15765fe6-0" bind:__l="__l" u-p="{{f}}"><view class="hero-panel surface-strong data-v-15765fe6"><view class="data-v-15765fe6"><text class="panel-title data-v-15765fe6">安全备份当前数据</text><text class="panel-desc data-v-15765fe6">所有数据均为本地文件,不会自动上传服务器。</text></view><view class="status-chip data-v-15765fe6">{{b}}</view></view><view class="action-row single-row data-v-15765fe6"><view class="primary-button data-v-15765fe6" bindtap="{{c}}">导出备份</view></view><text wx:if="{{d}}" class="tiny-text info-line data-v-15765fe6">最近备份:{{e}}</text></section-card><section-card wx:if="{{k}}" class="data-v-15765fe6" u-s="{{['d']}}" u-i="15765fe6-1" bind:__l="__l" u-p="{{k}}"><view class="input-shell textarea-shell data-v-15765fe6"><block wx:if="{{r0}}"><textarea class="data-v-15765fe6" placeholder="请粘贴备份 JSON" value="{{g}}" bindinput="{{h}}"></textarea></block></view><view class="action-row data-v-15765fe6"><view class="ghost-button data-v-15765fe6" bindtap="{{i}}">清空内容</view><view class="primary-button data-v-15765fe6" bindtap="{{j}}">开始恢复</view></view></section-card><section-card wx:if="{{n}}" class="data-v-15765fe6" u-s="{{['d']}}" u-i="15765fe6-2" bind:__l="__l" u-p="{{n}}"><view class="menu-list data-v-15765fe6"><view class="menu-item surface-strong data-v-15765fe6" bindtap="{{l}}"><view class="data-v-15765fe6"><text class="menu-title data-v-15765fe6">复制备份内容</text></view><text class="status-chip data-v-15765fe6">复制</text></view><view class="menu-item surface-strong danger-shell data-v-15765fe6" bindtap="{{m}}"><view class="data-v-15765fe6"><text class="menu-title negative data-v-15765fe6">清空全部数据</text></view><text class="danger-text data-v-15765fe6">执行</text></view></view></section-card></view>
@@ -0,0 +1 @@
.page-hero.data-v-15765fe6{padding:30rpx;background:linear-gradient(145deg,rgba(16,42,67,.96),rgba(61,102,178,.92));color:#fff}.hero-kicker.data-v-15765fe6,.hero-desc.data-v-15765fe6,.hero-tag.soft.data-v-15765fe6{color:rgba(255,255,255,.76)}.hero-kicker.data-v-15765fe6{font-size:20rpx;letter-spacing:4rpx}.hero-title.data-v-15765fe6{display:block;margin-top:12rpx;font-size:44rpx;font-weight:700}.hero-desc.data-v-15765fe6{display:block;margin-top:14rpx;font-size:24rpx;line-height:1.7}.hero-tags.data-v-15765fe6{display:flex;flex-wrap:wrap;gap:14rpx;margin-top:22rpx}.hero-tag.data-v-15765fe6,.status-chip.data-v-15765fe6{padding:12rpx 18rpx;border-radius:999rpx;background:rgba(255,255,255,.16);font-size:22rpx}.hero-panel.data-v-15765fe6,.menu-item.data-v-15765fe6,.action-row.data-v-15765fe6{display:flex;align-items:center;gap:16rpx}.hero-panel.data-v-15765fe6,.menu-item.data-v-15765fe6{padding:26rpx;border-radius:28rpx}.hero-panel.data-v-15765fe6{justify-content:space-between}.panel-title.data-v-15765fe6,.menu-title.data-v-15765fe6{display:block;font-size:31rpx;font-weight:700;color:var(--text-primary)}.panel-desc.data-v-15765fe6,.status-chip.data-v-15765fe6{background:var(--brand-soft);color:var(--brand)}.action-row.data-v-15765fe6{margin-top:18rpx}.single-row .primary-button.data-v-15765fe6,.action-row .ghost-button.data-v-15765fe6,.action-row .primary-button.data-v-15765fe6{flex:1}.info-line.data-v-15765fe6{display:block;margin-top:16rpx}.textarea-shell.data-v-15765fe6{align-items:flex-start;min-height:280rpx;padding:20rpx 24rpx}.textarea-shell textarea.data-v-15765fe6{min-height:240rpx}.menu-list.data-v-15765fe6{display:flex;flex-direction:column;gap:16rpx}.menu-item.data-v-15765fe6{justify-content:space-between}.danger-shell.data-v-15765fe6{border:1rpx solid rgba(210,85,67,.12)}.danger-text.data-v-15765fe6{font-size:24rpx;color:var(--danger)}
@@ -0,0 +1 @@
"use strict";const e=require("../../../common/vendor.js"),t=require("../../../utils/store.js");Math||i();const i=()=>"../../../components/SectionCard.js",n={__name:"index",setup(i){const n=t.useAppStore(),s=e.computed((()=>"dark"===n.state.settings.theme?"theme-dark":"")),o=[{index:"01",title:"先设置月预算",desc:"进入预算页设置总预算与分类预算,首页会同步显示剩余额度。"},{index:"02",title:"用首页快捷记账",desc:"首页支持支出/收入快速录入,也能通过常用分类一键记账。"},{index:"03",title:"到账单页做筛选",desc:"账单页支持按月份、账户、金额区间和关键词精确筛选。"},{index:"04",title:"每月查看报表",desc:"报表页可导出 CSV,并查看支出结构、近 7 日趋势和月度对比。"}],a=[{q:"账单数据保存在哪里?",a:"默认仅保存在当前设备的本地存储中,不会自动上传云端。"},{q:"换手机后如何迁移?",a:"先进入“备份与恢复”导出 JSON 备份,再在新设备粘贴恢复。"},{q:"为什么预算进度显示超出 100%",a:"这代表本月支出已经超过预算,条形进度会封顶,但文字会继续显示真实比例。"},{q:"昵称可以怎么修改?",a:"进入“我的-账户资料”后可直接修改本地昵称,留空时默认显示为“用户”。"}];function d(t){e.index.navigateTo({url:t})}return e.onShow((()=>{!function(){let t=null;e.wx$1.createInterstitialAd&&(t=e.wx$1.createInterstitialAd({adUnitId:"adunit-0abc32053b19a4e9"}),t.onLoad((()=>{})),t.onError((e=>{console.error("插屏广告加载失败",e)})),t.onClose((()=>{})));setTimeout((()=>{t&&t.show().catch((e=>{console.error("插屏广告显示失败",e)}))}),2280)}()})),(t,i)=>({a:e.f(o,((t,i,n)=>({a:e.t(t.index),b:e.t(t.title),c:e.t(t.desc),d:t.title}))),b:e.p({title:"快速上手",subtitle:"初次使用建议先完成下面 4 个动作"}),c:e.f(a,((t,i,n)=>({a:e.t(t.q),b:e.t(t.a),c:t.q}))),d:e.p({title:"常见问题",subtitle:""}),e:e.o((e=>d("/pages/home/index"))),f:e.o((e=>d("/pages/budget/index"))),g:e.o((e=>d("/pages/stats/index"))),h:e.o((e=>d("/pages/mine/backup/index"))),i:e.p({title:"功能入口",subtitle:"需要操作时可直接跳转到对应模块"}),j:e.n(s.value)})}},s=e._export_sfc(n,[["__scopeId","data-v-7f3520d8"]]);wx.createPage(s);
@@ -0,0 +1,6 @@
{
"navigationBarTitleText": "使用帮助",
"usingComponents": {
"section-card": "../../../components/SectionCard"
}
}
@@ -0,0 +1 @@
<view class="{{['app-page', 'data-v-7f3520d8', j]}}"><view class="surface-card page-hero data-v-7f3520d8"><text class="hero-kicker data-v-7f3520d8">GUIDE</text><text class="hero-title data-v-7f3520d8">使用帮助</text><text class="hero-desc data-v-7f3520d8">通过上手步骤、常见问题和快捷入口,快速熟悉整个记账流程。</text><view class="hero-tags data-v-7f3520d8"><text class="hero-tag data-v-7f3520d8">4 个步骤</text><text class="hero-tag soft data-v-7f3520d8">FAQ 指南</text></view></view><ad-custom class="data-v-7f3520d8" unit-id="adunit-64707ea333329399"></ad-custom><section-card wx:if="{{b}}" class="data-v-7f3520d8" u-s="{{['d']}}" u-i="7f3520d8-0" bind:__l="__l" u-p="{{b}}"><view class="step-list data-v-7f3520d8"><view wx:for="{{a}}" wx:for-item="item" wx:key="d" class="step-item surface-strong data-v-7f3520d8"><text class="step-index data-v-7f3520d8">{{item.a}}</text><view class="step-body data-v-7f3520d8"><text class="step-title data-v-7f3520d8">{{item.b}}</text><text class="step-desc data-v-7f3520d8">{{item.c}}</text></view></view></view></section-card><section-card wx:if="{{d}}" class="data-v-7f3520d8" u-s="{{['d']}}" u-i="7f3520d8-1" bind:__l="__l" u-p="{{d}}"><view class="faq-list data-v-7f3520d8"><view wx:for="{{c}}" wx:for-item="item" wx:key="c" class="faq-item surface-strong data-v-7f3520d8"><text class="faq-question data-v-7f3520d8">{{item.a}}</text><text class="faq-answer data-v-7f3520d8">{{item.b}}</text></view></view></section-card><section-card wx:if="{{i}}" class="data-v-7f3520d8" u-s="{{['d']}}" u-i="7f3520d8-2" bind:__l="__l" u-p="{{i}}"><view class="entry-grid data-v-7f3520d8"><view class="entry-item surface-strong data-v-7f3520d8" bindtap="{{e}}"><text class="entry-title data-v-7f3520d8">首页记账</text></view><view class="entry-item surface-strong data-v-7f3520d8" bindtap="{{f}}"><text class="entry-title data-v-7f3520d8">预算设置</text></view><view class="entry-item surface-strong data-v-7f3520d8" bindtap="{{g}}"><text class="entry-title data-v-7f3520d8">查看报表</text></view><view class="entry-item surface-strong data-v-7f3520d8" bindtap="{{h}}"><text class="entry-title data-v-7f3520d8">备份恢复</text></view></view></section-card></view>
@@ -0,0 +1 @@
.page-hero.data-v-7f3520d8{padding:30rpx;background:linear-gradient(145deg,rgba(16,42,67,.96),rgba(127,86,217,.9));color:#fff}.hero-kicker.data-v-7f3520d8,.hero-desc.data-v-7f3520d8,.hero-tag.soft.data-v-7f3520d8{color:rgba(255,255,255,.76)}.hero-kicker.data-v-7f3520d8{font-size:20rpx;letter-spacing:4rpx}.hero-title.data-v-7f3520d8{display:block;margin-top:12rpx;font-size:44rpx;font-weight:700}.hero-desc.data-v-7f3520d8{display:block;margin-top:14rpx;font-size:24rpx;line-height:1.7}.hero-tags.data-v-7f3520d8{display:flex;flex-wrap:wrap;gap:14rpx;margin-top:22rpx}.hero-tag.data-v-7f3520d8{padding:12rpx 18rpx;border-radius:999rpx;background:rgba(255,255,255,.16);font-size:22rpx}.step-list.data-v-7f3520d8,.faq-list.data-v-7f3520d8{display:flex;flex-direction:column;gap:16rpx}.step-item.data-v-7f3520d8,.faq-item.data-v-7f3520d8{padding:24rpx;border-radius:28rpx}.step-item.data-v-7f3520d8{display:flex;gap:18rpx}.step-index.data-v-7f3520d8{width:74rpx;font-size:30rpx;font-weight:700;color:var(--brand)}.step-body.data-v-7f3520d8{flex:1}.step-title.data-v-7f3520d8,.faq-question.data-v-7f3520d8,.entry-title.data-v-7f3520d8{display:block;font-size:29rpx;font-weight:700;color:var(--text-primary)}.step-desc.data-v-7f3520d8,.faq-answer.data-v-7f3520d8{display:block;margin-top:10rpx;font-size:24rpx;line-height:1.75;color:var(--text-secondary)}.entry-grid.data-v-7f3520d8{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16rpx}.entry-item.data-v-7f3520d8{display:flex;align-items:center;justify-content:center;padding:28rpx 20rpx;border-radius:28rpx;text-align:center}
@@ -0,0 +1 @@
"use strict";const e=require("../../common/vendor.js"),t=require("../../utils/store.js");Math||(n+s)();const n=()=>"../../components/SectionCard.js",s=()=>"../../components/AppTabBar.js",a={__name:"index",setup(n){const s=t.useAppStore(),a=e.computed((()=>"dark"===s.state.settings.theme?"theme-dark":"")),i=e.computed((()=>s.state.settings.profile.nickname||"用户")),o=e.computed((()=>(s.state.settings.profile.nickname||"用户").slice(0,1))),r=e.ref(">");function u(e){s.setTheme(e)}function p(t){e.index.navigateTo({url:t})}return(t,n)=>({a:e.t(o.value),b:e.t(i.value),c:e.t(r.value),d:e.o((e=>p("/pages/mine/profile/index"))),e:"light"===e.unref(s).state.settings.theme?1:"",f:e.o((e=>u("light"))),g:"dark"===e.unref(s).state.settings.theme?1:"",h:e.o((e=>u("dark"))),i:e.p({title:"账户概览",subtitle:"集中管理本地昵称与主题设置"}),j:e.t(r.value),k:e.o((e=>p("/pages/mine/backup/index"))),l:e.t(r.value),m:e.o((e=>p("/pages/mine/guide/index"))),n:e.t(r.value),o:e.o((e=>p("/pages/mine/about/index"))),p:e.p({title:"数据管理",subtitle:"备份、恢复和清理等高频操作统一收口"}),q:e.p({current:"mine"}),r:e.n(a.value)})}},i=e._export_sfc(a,[["__scopeId","data-v-a8ac4929"]]);wx.createPage(i);
@@ -0,0 +1,7 @@
{
"navigationBarTitleText": "我的",
"usingComponents": {
"section-card": "../../components/SectionCard",
"app-tab-bar": "../../components/AppTabBar"
}
}
@@ -0,0 +1 @@
<view class="{{['app-page', 'data-v-a8ac4929', r]}}"><section-card wx:if="{{i}}" class="data-v-a8ac4929" u-s="{{['d']}}" u-i="a8ac4929-0" bind:__l="__l" u-p="{{i}}"><view class="profile-card surface-strong data-v-a8ac4929" bindtap="{{d}}"><view class="avatar-shell data-v-a8ac4929">{{a}}</view><view class="profile-body data-v-a8ac4929"><text class="profile-name data-v-a8ac4929">{{b}}</text><text class="section-subtitle data-v-a8ac4929"></text></view><text class="arrow-text data-v-a8ac4929">{{c}}</text></view><view class="theme-row data-v-a8ac4929"><view class="{{['pill-button', 'data-v-a8ac4929', e && 'active']}}" catchtap="{{f}}">浅色</view><view class="{{['pill-button', 'data-v-a8ac4929', g && 'active']}}" catchtap="{{h}}">深色</view></view></section-card><ad-custom class="data-v-a8ac4929" unit-id="adunit-74730c6c27c95a37"></ad-custom><section-card wx:if="{{p}}" class="data-v-a8ac4929" u-s="{{['d']}}" u-i="a8ac4929-1" bind:__l="__l" u-p="{{p}}"><view class="menu-list data-v-a8ac4929"><view class="menu-item data-v-a8ac4929" bindtap="{{k}}"><view class="data-v-a8ac4929"><text class="menu-title data-v-a8ac4929">备份与恢复</text></view><text class="arrow-text data-v-a8ac4929">{{j}}</text></view><view class="menu-item data-v-a8ac4929" bindtap="{{m}}"><view class="data-v-a8ac4929"><text class="menu-title data-v-a8ac4929">使用帮助</text></view><text class="arrow-text data-v-a8ac4929">{{l}}</text></view><view class="menu-item data-v-a8ac4929" bindtap="{{o}}"><view class="data-v-a8ac4929"><text class="menu-title data-v-a8ac4929">关于与隐私</text></view><text class="arrow-text data-v-a8ac4929">{{n}}</text></view></view></section-card><app-tab-bar wx:if="{{q}}" class="data-v-a8ac4929" u-i="a8ac4929-2" bind:__l="__l" u-p="{{q}}"/></view>
@@ -0,0 +1 @@
.profile-card.data-v-a8ac4929,.theme-row.data-v-a8ac4929,.menu-item.data-v-a8ac4929{display:flex;align-items:center;gap:16rpx}.profile-card.data-v-a8ac4929{padding:24rpx;border-radius:24rpx}.avatar-shell.data-v-a8ac4929{width:88rpx;height:88rpx;border-radius:50%;background:var(--bg-accent);color:#fff;display:flex;align-items:center;justify-content:center;font-size:34rpx;font-weight:700}.profile-body.data-v-a8ac4929{flex:1}.profile-name.data-v-a8ac4929,.menu-title.data-v-a8ac4929{font-size:30rpx;font-weight:600;color:var(--text-primary)}.arrow-text.data-v-a8ac4929{font-size:32rpx}.theme-row.data-v-a8ac4929{margin-top:18rpx}.theme-row .pill-button.data-v-a8ac4929{flex:1}.menu-list.data-v-a8ac4929,.action-grid.data-v-a8ac4929{display:flex;flex-direction:column;gap:16rpx}.menu-item.data-v-a8ac4929{justify-content:space-between;padding:22rpx;border-radius:24rpx;background:var(--surface-muted)}
@@ -0,0 +1 @@
"use strict";const e=require("../../../common/vendor.js"),t=require("../../../utils/store.js");Math||a();const a=()=>"../../../components/SectionCard.js",i={__name:"index",setup(a){const i=t.useAppStore(),n=e.computed((()=>"dark"===i.state.settings.theme?"theme-dark":"")),s=e.computed((()=>i.state.settings.profile.nickname||"用户")),o=e.computed((()=>s.value.slice(0,1))),l=e.ref(i.state.settings.profile.nickname||""),r=["昵称仅用于个人页展示和首字头像,不参与账单计算。","账单、预算和设置默认不会自动上传云端。","如需更换设备,请先在“备份与恢复”页面导出 JSON 备份。"];function u(){const t=l.value.trim();i.setProfile({authorized:!1,nickname:t,avatarUrl:""}),e.index.showToast({title:"昵称已保存",icon:"none"})}function c(){l.value="",i.setProfile({authorized:!1,nickname:"",avatarUrl:""}),e.index.showToast({title:"昵称已清空",icon:"none"})}return e.watch((()=>i.state.settings.profile.nickname),(e=>{l.value=e||""})),(t,a)=>({a:e.t(o.value),b:e.t(s.value),c:l.value,d:e.o((e=>l.value=e.detail.value)),e:e.o(c),f:e.o(u),g:e.p({title:"昵称设置",subtitle:"修改后仅用于个人页展示和首字头像,不参与账单计算"}),h:e.t(o.value),i:e.p({title:"显示与模式",subtitle:"集中展示当前账户页的生效状态"}),j:e.f(r,((t,a,i)=>({a:e.t(a+1),b:e.t(t),c:t}))),k:e.p({title:"使用提示",subtitle:"帮助用户理解昵称显示与数据边界"}),l:e.n(n.value)})}},n=e._export_sfc(i,[["__scopeId","data-v-94494afd"]]);wx.createPage(n);
@@ -0,0 +1,6 @@
{
"navigationBarTitleText": "账户资料",
"usingComponents": {
"section-card": "../../../components/SectionCard"
}
}
@@ -0,0 +1 @@
<view class="{{['app-page', 'data-v-94494afd', l]}}"><view class="surface-card page-hero data-v-94494afd"><text class="hero-kicker data-v-94494afd">ACCOUNT</text><text class="hero-title data-v-94494afd">账户资料</text><text class="hero-desc data-v-94494afd">管理本地昵称、显示资料与本机记账模式说明。</text><view class="hero-tags data-v-94494afd"><text class="hero-tag data-v-94494afd">本地资料</text><text class="hero-tag soft data-v-94494afd">本地存储</text></view></view><section-card wx:if="{{g}}" class="data-v-94494afd" u-s="{{['d']}}" u-i="94494afd-0" bind:__l="__l" u-p="{{g}}"><view class="profile-card surface-strong data-v-94494afd"><view class="avatar-shell data-v-94494afd">{{a}}</view><view class="profile-body data-v-94494afd"><text class="profile-name data-v-94494afd">{{b}}</text><text class="profile-meta data-v-94494afd">当前昵称仅保存在本地设备,可随时修改。</text></view><view class="status-badge data-v-94494afd">本地</view></view><view class="editor-block data-v-94494afd"><view class="input-shell data-v-94494afd"><input class="data-v-94494afd" maxlength="12" placeholder="请输入昵称" value="{{c}}" bindinput="{{d}}"/></view><text class="tiny-text editor-tip data-v-94494afd">留空时页面会统一显示“用户”。</text></view><view class="action-row data-v-94494afd"><view class="ghost-button data-v-94494afd" bindtap="{{e}}">清空昵称</view><view class="primary-button data-v-94494afd" bindtap="{{f}}">保存昵称</view></view></section-card><section-card wx:if="{{i}}" class="data-v-94494afd" u-s="{{['d']}}" u-i="94494afd-1" bind:__l="__l" u-p="{{i}}"><view class="info-list data-v-94494afd"><view class="info-item surface-strong data-v-94494afd"><view class="data-v-94494afd"><text class="info-title data-v-94494afd">昵称首字头像</text><text class="info-desc data-v-94494afd">当前显示 {{h}},自动根据昵称生成</text></view><text class="info-mark data-v-94494afd">已启用</text></view><view class="info-item surface-strong data-v-94494afd"><view class="data-v-94494afd"><text class="info-title data-v-94494afd">本机记账模式</text><text class="info-desc data-v-94494afd">账单与预算默认仅保存在当前设备本地</text></view><text class="info-mark data-v-94494afd">默认</text></view></view></section-card><section-card wx:if="{{k}}" class="data-v-94494afd" u-s="{{['d']}}" u-i="94494afd-2" bind:__l="__l" u-p="{{k}}"><view class="tips-card surface-strong data-v-94494afd"><view wx:for="{{j}}" wx:for-item="tip" wx:key="c" class="tip-row data-v-94494afd"><text class="tip-index data-v-94494afd">0{{tip.a}}</text><text class="tip-line data-v-94494afd">{{tip.b}}</text></view></view></section-card></view>
@@ -0,0 +1 @@
.page-hero.data-v-94494afd{padding:30rpx;background:linear-gradient(145deg,rgba(16,42,67,.96),rgba(31,111,95,.92));color:#fff}.hero-kicker.data-v-94494afd,.hero-desc.data-v-94494afd,.hero-tag.soft.data-v-94494afd{color:rgba(255,255,255,.76)}.hero-kicker.data-v-94494afd{font-size:20rpx;letter-spacing:4rpx}.hero-title.data-v-94494afd{display:block;margin-top:12rpx;font-size:44rpx;font-weight:700}.hero-desc.data-v-94494afd{display:block;margin-top:14rpx;font-size:24rpx;line-height:1.7}.hero-tags.data-v-94494afd{display:flex;flex-wrap:wrap;gap:14rpx;margin-top:22rpx}.hero-tag.data-v-94494afd{padding:12rpx 18rpx;border-radius:999rpx;background:rgba(255,255,255,.16);font-size:22rpx}.profile-card.data-v-94494afd,.info-item.data-v-94494afd,.action-row.data-v-94494afd,.tip-row.data-v-94494afd{display:flex;align-items:center;gap:16rpx}.profile-card.data-v-94494afd,.tips-card.data-v-94494afd{padding:26rpx;border-radius:28rpx}.avatar-shell.data-v-94494afd{width:108rpx;height:108rpx;border-radius:32rpx;background:var(--bg-accent);color:#fff;display:flex;align-items:center;justify-content:center;font-size:40rpx;font-weight:700;box-shadow:0 18rpx 32rpx rgba(16,42,67,.16)}.profile-body.data-v-94494afd{flex:1}.profile-name.data-v-94494afd,.info-title.data-v-94494afd{display:block;font-size:31rpx;font-weight:700;color:var(--text-primary)}.profile-meta.data-v-94494afd,.info-desc.data-v-94494afd,.tip-line.data-v-94494afd{display:block;margin-top:10rpx;font-size:24rpx;line-height:1.7;color:var(--text-secondary)}.status-badge.data-v-94494afd,.info-mark.data-v-94494afd{padding:10rpx 18rpx;border-radius:999rpx;background:var(--brand-soft);font-size:22rpx;color:var(--brand)}.editor-block.data-v-94494afd{margin-top:18rpx}.editor-tip.data-v-94494afd{display:block;margin-top:12rpx}.action-row.data-v-94494afd{margin-top:18rpx}.action-row .ghost-button.data-v-94494afd,.action-row .primary-button.data-v-94494afd{flex:1}.info-list.data-v-94494afd{display:flex;flex-direction:column;gap:16rpx}.info-item.data-v-94494afd{justify-content:space-between;padding:24rpx;border-radius:26rpx}.tip-row.data-v-94494afd{align-items:flex-start;padding:12rpx 0}.tip-index.data-v-94494afd{width:56rpx;font-size:24rpx;font-weight:700;color:var(--brand)}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
{
"navigationBarTitleText": "数据报表",
"usingComponents": {
"section-card": "../../components/SectionCard",
"app-tab-bar": "../../components/AppTabBar"
}
}
@@ -0,0 +1 @@
<view class="{{['app-page', 'data-v-7cab36fb', C]}}"><section-card wx:if="{{g}}" class="data-v-7cab36fb" u-s="{{['action','d']}}" u-i="7cab36fb-0" bind:__l="__l" u-p="{{g}}"><picker class="data-v-7cab36fb" mode="date" fields="month" value="{{b}}" bindchange="{{c}}" slot="action"><text class="section-link data-v-7cab36fb">{{a}}</text></picker><view class="summary-row data-v-7cab36fb"><view class="summary-item surface-strong data-v-7cab36fb"><text class="tiny-text data-v-7cab36fb">支出</text><text class="summary-value negative data-v-7cab36fb">{{d}}</text></view><view class="summary-item surface-strong data-v-7cab36fb"><text class="tiny-text data-v-7cab36fb">收入</text><text class="summary-value positive data-v-7cab36fb">{{e}}</text></view><view class="summary-item surface-strong data-v-7cab36fb"><text class="tiny-text data-v-7cab36fb">结余</text><text class="summary-value data-v-7cab36fb">{{f}}</text></view></view></section-card><ad-custom class="data-v-7cab36fb" unit-id="adunit-74730c6c27c95a37"></ad-custom><section-card wx:if="{{j}}" class="data-v-7cab36fb" u-s="{{['d']}}" u-i="7cab36fb-1" bind:__l="__l" u-p="{{j}}"><view wx:if="{{h}}" class="chart-list data-v-7cab36fb"><view wx:for="{{i}}" wx:for-item="item" wx:key="g" class="chart-row data-v-7cab36fb"><view class="chart-head data-v-7cab36fb"><view class="chart-title-row data-v-7cab36fb"><view class="chart-dot data-v-7cab36fb" style="{{'background:' + item.a}}"></view><text class="chart-title data-v-7cab36fb">{{item.b}}</text></view><text class="tiny-text data-v-7cab36fb">{{item.c}} · {{item.d}}</text></view><view class="bar-track data-v-7cab36fb"><view class="bar-fill data-v-7cab36fb" style="{{'width:' + item.e + ';' + ('background:' + item.f)}}"></view></view></view></view><view wx:else class="empty-card data-v-7cab36fb"><text class="section-subtitle data-v-7cab36fb">当前月份暂无支出数据,记一笔后会自动生成图表。</text></view></section-card><section-card wx:if="{{l}}" class="data-v-7cab36fb" u-s="{{['d']}}" u-i="7cab36fb-2" bind:__l="__l" u-p="{{l}}"><view class="column-chart data-v-7cab36fb"><view wx:for="{{k}}" wx:for-item="item" wx:key="d" class="column-item data-v-7cab36fb"><view class="column-track data-v-7cab36fb"><view class="column-fill data-v-7cab36fb" style="{{'height:' + item.a}}"></view></view><text class="tiny-text data-v-7cab36fb">{{item.b}}</text><text class="tiny-text data-v-7cab36fb">{{item.c}}</text></view></view></section-card><section-card wx:if="{{n}}" class="data-v-7cab36fb" u-s="{{['d']}}" u-i="7cab36fb-3" bind:__l="__l" u-p="{{n}}"><view class="compare-list data-v-7cab36fb"><view wx:for="{{m}}" wx:for-item="item" wx:key="f" class="compare-row data-v-7cab36fb"><text class="compare-label data-v-7cab36fb">{{item.a}}</text><view class="compare-bars data-v-7cab36fb"><view class="mini-track data-v-7cab36fb"><view class="mini-fill expense-fill data-v-7cab36fb" style="{{'width:' + item.b}}"></view></view><view class="mini-track data-v-7cab36fb"><view class="mini-fill income-fill data-v-7cab36fb" style="{{'width:' + item.c}}"></view></view></view><text class="tiny-text data-v-7cab36fb">{{item.d}} / {{item.e}}</text></view></view></section-card><section-card wx:if="{{q}}" class="data-v-7cab36fb" u-s="{{['d']}}" u-i="7cab36fb-4" bind:__l="__l" u-p="{{q}}"><view class="action-grid data-v-7cab36fb"><view class="primary-button data-v-7cab36fb" bindtap="{{o}}">导出 CSV</view><view class="ghost-button data-v-7cab36fb" bindtap="{{p}}">分享摘要</view></view></section-card><view wx:if="{{r}}" class="poster-shell data-v-7cab36fb" catchtouchmove="{{A}}"><view class="poster-mask data-v-7cab36fb" bindtap="{{s}}"></view><view class="surface-card poster-panel data-v-7cab36fb"><view class="poster-card data-v-7cab36fb"><text class="poster-month data-v-7cab36fb">{{t}}</text><text class="poster-title data-v-7cab36fb">收支月报</text><text class="poster-line data-v-7cab36fb">支出 {{v}}</text><text class="poster-line data-v-7cab36fb">收入 {{w}}</text><text class="poster-line data-v-7cab36fb">结余 {{x}}</text><text class="poster-tip data-v-7cab36fb">内容本地生成,可复制摘要或直接截图分享。</text></view><view class="action-grid data-v-7cab36fb"><view class="ghost-button data-v-7cab36fb" bindtap="{{y}}">复制摘要</view><view class="primary-button data-v-7cab36fb" bindtap="{{z}}">关闭</view></view></view></view><app-tab-bar wx:if="{{B}}" class="data-v-7cab36fb" u-i="7cab36fb-5" bind:__l="__l" u-p="{{B}}"/></view>
@@ -0,0 +1 @@
.summary-row.data-v-7cab36fb,.action-grid.data-v-7cab36fb{display:flex;gap:16rpx}.summary-item.data-v-7cab36fb{flex:1;padding:22rpx;border-radius:24rpx}.summary-value.data-v-7cab36fb{display:block;margin-top:10rpx;font-size:30rpx;font-weight:700;color:var(--text-primary)}.section-link.data-v-7cab36fb{font-size:24rpx;color:var(--brand)}.chart-list.data-v-7cab36fb,.compare-list.data-v-7cab36fb{display:flex;flex-direction:column;gap:18rpx}.chart-head.data-v-7cab36fb,.chart-title-row.data-v-7cab36fb,.compare-row.data-v-7cab36fb{display:flex;align-items:center;justify-content:space-between;gap:16rpx}.chart-dot.data-v-7cab36fb{width:16rpx;height:16rpx;border-radius:50%}.chart-title.data-v-7cab36fb{font-size:28rpx;font-weight:600;color:var(--text-primary)}.bar-track.data-v-7cab36fb,.mini-track.data-v-7cab36fb,.column-track.data-v-7cab36fb{overflow:hidden;border-radius:999rpx;background:var(--surface-muted)}.bar-track.data-v-7cab36fb{height:16rpx;margin-top:12rpx}.bar-fill.data-v-7cab36fb,.mini-fill.data-v-7cab36fb{height:100%;border-radius:inherit}.column-chart.data-v-7cab36fb{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:12rpx;align-items:end;height:260rpx}.column-item.data-v-7cab36fb{display:flex;flex-direction:column;align-items:center;gap:10rpx}.column-track.data-v-7cab36fb{display:flex;align-items:flex-end;justify-content:center;width:100%;height:180rpx;padding:0 6rpx}.column-fill.data-v-7cab36fb{width:100%;border-radius:999rpx 999rpx 16rpx 16rpx;background:linear-gradient(180deg,#5f8df5,#1f6f5f)}.compare-label.data-v-7cab36fb{width:64rpx;font-size:24rpx;color:var(--text-secondary)}.compare-bars.data-v-7cab36fb{flex:1;display:flex;flex-direction:column;gap:10rpx}.mini-track.data-v-7cab36fb{height:12rpx}.expense-fill.data-v-7cab36fb{background:#d36c43}.income-fill.data-v-7cab36fb{background:#1f6f5f}.action-grid.data-v-7cab36fb{margin-top:8rpx}.action-grid .primary-button.data-v-7cab36fb,.action-grid .ghost-button.data-v-7cab36fb{flex:1}.empty-card.data-v-7cab36fb{padding:32rpx 0 10rpx;text-align:center}.poster-shell.data-v-7cab36fb{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50}.poster-mask.data-v-7cab36fb{position:absolute;top:0;right:0;bottom:0;left:0;background:rgba(4,12,18,.42)}.poster-panel.data-v-7cab36fb{position:absolute;left:24rpx;right:24rpx;top:16vh;padding:28rpx}.poster-card.data-v-7cab36fb{padding:32rpx;border-radius:28rpx;background:linear-gradient(145deg,#102a43,#1f6f5f);color:#fff;margin-bottom:20rpx}.poster-month.data-v-7cab36fb,.poster-tip.data-v-7cab36fb{color:rgba(255,255,255,.76)}.poster-title.data-v-7cab36fb{display:block;margin:12rpx 0 20rpx;font-size:42rpx;font-weight:700}.poster-line.data-v-7cab36fb{display:block;margin-bottom:12rpx;font-size:28rpx}.poster-tip.data-v-7cab36fb{display:block;margin-top:24rpx;font-size:22rpx;line-height:1.6}