第一次上传

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
@@ -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)}