From e257f2009e6f810ec2120dad049ebde1b177457c Mon Sep 17 00:00:00 2001 From: xxk <2584008029@qq.com> Date: Thu, 11 Jun 2026 09:53:11 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ad.txt | 24 + demant.txt | 73 +++ uniapp.zip | Bin 0 -> 125920 bytes uniapp/App.vue | 185 +++++++ uniapp/components/AppTabBar.vue | 85 +++ uniapp/components/BillEditorPopup.vue | 342 ++++++++++++ uniapp/components/SectionCard.vue | 45 ++ uniapp/index.html | 20 + uniapp/main.js | 22 + uniapp/manifest.json | 65 +++ uniapp/pages.json | 66 +++ uniapp/pages/bills/index.vue | 492 ++++++++++++++++++ uniapp/pages/budget/index.vue | 233 +++++++++ uniapp/pages/home/index.vue | 473 +++++++++++++++++ uniapp/pages/index/index.vue | 52 ++ uniapp/pages/mine/about/index.vue | 177 +++++++ uniapp/pages/mine/backup/index.vue | 277 ++++++++++ uniapp/pages/mine/guide/index.vue | 217 ++++++++ uniapp/pages/mine/index.vue | 136 +++++ uniapp/pages/mine/profile/index.vue | 255 +++++++++ uniapp/pages/stats/index.vue | 445 ++++++++++++++++ uniapp/static/logo.png | Bin 0 -> 4023 bytes uniapp/uni.promisify.adaptor.js | 13 + uniapp/uni.scss | 76 +++ uniapp/unpackage/dist/build/mp-weixin/app.js | 1 + .../unpackage/dist/build/mp-weixin/app.json | 20 + .../unpackage/dist/build/mp-weixin/app.wxss | 2 + .../dist/build/mp-weixin/common/vendor.js | 7 + .../build/mp-weixin/components/AppTabBar.js | 1 + .../build/mp-weixin/components/AppTabBar.json | 4 + .../build/mp-weixin/components/AppTabBar.wxml | 1 + .../build/mp-weixin/components/AppTabBar.wxss | 1 + .../mp-weixin/components/BillEditorPopup.js | 1 + .../mp-weixin/components/BillEditorPopup.json | 4 + .../mp-weixin/components/BillEditorPopup.wxml | 1 + .../mp-weixin/components/BillEditorPopup.wxss | 1 + .../build/mp-weixin/components/SectionCard.js | 1 + .../mp-weixin/components/SectionCard.json | 4 + .../mp-weixin/components/SectionCard.wxml | 1 + .../mp-weixin/components/SectionCard.wxss | 1 + .../dist/build/mp-weixin/pages/bills/index.js | 1 + .../build/mp-weixin/pages/bills/index.json | 9 + .../build/mp-weixin/pages/bills/index.wxml | 1 + .../build/mp-weixin/pages/bills/index.wxss | 1 + .../build/mp-weixin/pages/budget/index.js | 1 + .../build/mp-weixin/pages/budget/index.json | 7 + .../build/mp-weixin/pages/budget/index.wxml | 1 + .../build/mp-weixin/pages/budget/index.wxss | 1 + .../dist/build/mp-weixin/pages/home/index.js | 1 + .../build/mp-weixin/pages/home/index.json | 9 + .../build/mp-weixin/pages/home/index.wxml | 1 + .../build/mp-weixin/pages/home/index.wxss | 1 + .../build/mp-weixin/pages/mine/about/index.js | 1 + .../mp-weixin/pages/mine/about/index.json | 6 + .../mp-weixin/pages/mine/about/index.wxml | 1 + .../mp-weixin/pages/mine/about/index.wxss | 1 + .../mp-weixin/pages/mine/backup/index.js | 1 + .../mp-weixin/pages/mine/backup/index.json | 6 + .../mp-weixin/pages/mine/backup/index.wxml | 1 + .../mp-weixin/pages/mine/backup/index.wxss | 1 + .../build/mp-weixin/pages/mine/guide/index.js | 1 + .../mp-weixin/pages/mine/guide/index.json | 6 + .../mp-weixin/pages/mine/guide/index.wxml | 1 + .../mp-weixin/pages/mine/guide/index.wxss | 1 + .../dist/build/mp-weixin/pages/mine/index.js | 1 + .../build/mp-weixin/pages/mine/index.json | 7 + .../build/mp-weixin/pages/mine/index.wxml | 1 + .../build/mp-weixin/pages/mine/index.wxss | 1 + .../mp-weixin/pages/mine/profile/index.js | 1 + .../mp-weixin/pages/mine/profile/index.json | 6 + .../mp-weixin/pages/mine/profile/index.wxml | 1 + .../mp-weixin/pages/mine/profile/index.wxss | 1 + .../dist/build/mp-weixin/pages/stats/index.js | 1 + .../build/mp-weixin/pages/stats/index.json | 7 + .../build/mp-weixin/pages/stats/index.wxml | 1 + .../build/mp-weixin/pages/stats/index.wxss | 1 + .../dist/build/mp-weixin/project.config.json | 36 ++ .../mp-weixin/project.private.config.json | 22 + .../dist/build/mp-weixin/static/logo.png | Bin 0 -> 4023 bytes .../dist/build/mp-weixin/utils/constants.js | 1 + .../dist/build/mp-weixin/utils/date.js | 1 + .../dist/build/mp-weixin/utils/money.js | 1 + .../dist/build/mp-weixin/utils/store.js | 1 + .../dist/cache/.vite/deps/_metadata.json | 8 + .../dist/cache/.vite/deps/package.json | 3 + uniapp/utils/constants.js | 52 ++ uniapp/utils/date.js | 103 ++++ uniapp/utils/money.js | 15 + uniapp/utils/store.js | 179 +++++++ 89 files changed, 4336 insertions(+) create mode 100644 ad.txt create mode 100644 demant.txt create mode 100644 uniapp.zip create mode 100644 uniapp/App.vue create mode 100644 uniapp/components/AppTabBar.vue create mode 100644 uniapp/components/BillEditorPopup.vue create mode 100644 uniapp/components/SectionCard.vue create mode 100644 uniapp/index.html create mode 100644 uniapp/main.js create mode 100644 uniapp/manifest.json create mode 100644 uniapp/pages.json create mode 100644 uniapp/pages/bills/index.vue create mode 100644 uniapp/pages/budget/index.vue create mode 100644 uniapp/pages/home/index.vue create mode 100644 uniapp/pages/index/index.vue create mode 100644 uniapp/pages/mine/about/index.vue create mode 100644 uniapp/pages/mine/backup/index.vue create mode 100644 uniapp/pages/mine/guide/index.vue create mode 100644 uniapp/pages/mine/index.vue create mode 100644 uniapp/pages/mine/profile/index.vue create mode 100644 uniapp/pages/stats/index.vue create mode 100644 uniapp/static/logo.png create mode 100644 uniapp/uni.promisify.adaptor.js create mode 100644 uniapp/uni.scss create mode 100644 uniapp/unpackage/dist/build/mp-weixin/app.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/app.json create mode 100644 uniapp/unpackage/dist/build/mp-weixin/app.wxss create mode 100644 uniapp/unpackage/dist/build/mp-weixin/common/vendor.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/components/AppTabBar.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/components/AppTabBar.json create mode 100644 uniapp/unpackage/dist/build/mp-weixin/components/AppTabBar.wxml create mode 100644 uniapp/unpackage/dist/build/mp-weixin/components/AppTabBar.wxss create mode 100644 uniapp/unpackage/dist/build/mp-weixin/components/BillEditorPopup.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/components/BillEditorPopup.json create mode 100644 uniapp/unpackage/dist/build/mp-weixin/components/BillEditorPopup.wxml create mode 100644 uniapp/unpackage/dist/build/mp-weixin/components/BillEditorPopup.wxss create mode 100644 uniapp/unpackage/dist/build/mp-weixin/components/SectionCard.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/components/SectionCard.json create mode 100644 uniapp/unpackage/dist/build/mp-weixin/components/SectionCard.wxml create mode 100644 uniapp/unpackage/dist/build/mp-weixin/components/SectionCard.wxss create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/bills/index.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/bills/index.json create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/bills/index.wxml create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/bills/index.wxss create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/budget/index.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/budget/index.json create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/budget/index.wxml create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/budget/index.wxss create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/home/index.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/home/index.json create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/home/index.wxml create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/home/index.wxss create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/about/index.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/about/index.json create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/about/index.wxml create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/about/index.wxss create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/backup/index.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/backup/index.json create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/backup/index.wxml create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/backup/index.wxss create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/guide/index.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/guide/index.json create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/guide/index.wxml create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/guide/index.wxss create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/index.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/index.json create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/index.wxml create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/index.wxss create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/profile/index.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/profile/index.json create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/profile/index.wxml create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/mine/profile/index.wxss create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/stats/index.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/stats/index.json create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/stats/index.wxml create mode 100644 uniapp/unpackage/dist/build/mp-weixin/pages/stats/index.wxss create mode 100644 uniapp/unpackage/dist/build/mp-weixin/project.config.json create mode 100644 uniapp/unpackage/dist/build/mp-weixin/project.private.config.json create mode 100644 uniapp/unpackage/dist/build/mp-weixin/static/logo.png create mode 100644 uniapp/unpackage/dist/build/mp-weixin/utils/constants.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/utils/date.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/utils/money.js create mode 100644 uniapp/unpackage/dist/build/mp-weixin/utils/store.js create mode 100644 uniapp/unpackage/dist/cache/.vite/deps/_metadata.json create mode 100644 uniapp/unpackage/dist/cache/.vite/deps/package.json create mode 100644 uniapp/utils/constants.js create mode 100644 uniapp/utils/date.js create mode 100644 uniapp/utils/money.js create mode 100644 uniapp/utils/store.js diff --git a/ad.txt b/ad.txt new file mode 100644 index 0000000..40c8e93 --- /dev/null +++ b/ad.txt @@ -0,0 +1,24 @@ +=== 插屏 +// 在页面中定义插屏广告 +let interstitialAd = null + +// 在页面onLoad回调事件中创建插屏广告实例 +if (wx.createInterstitialAd) { + interstitialAd = wx.createInterstitialAd({ + adUnitId: 'adunit-0abc32053b19a4e9' + }) + interstitialAd.onLoad(() => {}) + interstitialAd.onError((err) => { + console.error('插屏广告加载失败', err) + }) + interstitialAd.onClose(() => {}) +} + +// 在适合的场景显示插屏广告 +if (interstitialAd) { + interstitialAd.show().catch((err) => { + console.error('插屏广告显示失败', err) + }) +} + +=== 原生广告 \ No newline at end of file diff --git a/demant.txt b/demant.txt new file mode 100644 index 0000000..83551a1 --- /dev/null +++ b/demant.txt @@ -0,0 +1,73 @@ +微信小程序「账单小管家」精简版开发需求报告 + +一、项目概述 + +定位:极简无广告、面向年轻人(学生/职场新人/情侣/合租党)的轻量化记账工具,核心解决“快速记账、清晰控支、多人AA”需求,适配微信生态,操作极简、数据安全。 + +技术基础:本地存储(无需云开发),微信授权登录(仅用于身份标识,数据不上传),无需单独注册,数据仅保存在本地设备。 + +设计风格:简约清新,支持深色模式,无广告,记账步骤≤3步。 + +二、核心功能模块(必做+高价值) + +1. 首页(核心入口) + +- 实时显示今日/本月收支、结余、预算进度条 + +- 悬浮一键记账按钮,常用分类快捷入口 + +- 最近账单快速查看,下拉刷新,长按编辑/删除 + +2. 账单管理(核心功能) + +- 新增/编辑/删除账单:支持收支切换、金额输入、分类选择、备注、时间调整、账户选择 + +- 筛选查询:按时间、分类、账户、金额区间筛选,关键词搜索 + +- 支持批量删除账单 + +3. 预算管理 + +- 设置月度总预算、分类单独预算 + +- 超支提醒(小程序红点+微信服务通知) + +- 显示剩余日均可花金额 + +4. 数据统计与报表 + +- 可视化图表:支出分类饼图、每日趋势折线图、月度对比柱状图 + +- 支持Excel账单导出、月度消费海报生成(可分享) + +6. 个人中心与设置 + +- 微信授权登录,主题切换(浅/深色) + +- 数据本地备份(导出本地文件)与恢复,清除缓存 + +- 反馈入口、关于我们 + +三、增强功能(二期迭代) + +- 固定收支管理(自动记账) + +- 存款目标设置与进度显示 + +- 记账习惯打卡、月度勋章 + +四、技术与微信能力要求 + +- 本地存储:设计用户、账单、分类等相关本地数据表,确保数据仅保存在设备本地,不进行云端上传。 + +- 微信能力:仅保留授权登录(身份标识)、海报生成(本地生成,不涉及云端)功能,无需云存储、好友/群分享、服务通知。 + +- 交互:手势操作、柔和动画,适配手机各机型 + +五、开发优先级 + +- 一期(必做):首页+账单管理+预算管理+报表+个人中心 + +- 二期(迭代):固定收支+存款目标+记账打卡(均为本地功能) + +- 三期(迭代):增强功能+细节优化 diff --git a/uniapp.zip b/uniapp.zip new file mode 100644 index 0000000000000000000000000000000000000000..242ab16b9bdaadfc4f35f1371cc3a49b44028ba5 GIT binary patch literal 125920 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 +export default { + onLaunch() { + console.log('Bill Helper Launch') + } +} + + + + + diff --git a/uniapp/components/AppTabBar.vue b/uniapp/components/AppTabBar.vue new file mode 100644 index 0000000..48a08e4 --- /dev/null +++ b/uniapp/components/AppTabBar.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/uniapp/components/BillEditorPopup.vue b/uniapp/components/BillEditorPopup.vue new file mode 100644 index 0000000..1b8e12b --- /dev/null +++ b/uniapp/components/BillEditorPopup.vue @@ -0,0 +1,342 @@ + + + + + + diff --git a/uniapp/components/SectionCard.vue b/uniapp/components/SectionCard.vue new file mode 100644 index 0000000..c903d95 --- /dev/null +++ b/uniapp/components/SectionCard.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/uniapp/index.html b/uniapp/index.html new file mode 100644 index 0000000..b5d330d --- /dev/null +++ b/uniapp/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + +
+ + + diff --git a/uniapp/main.js b/uniapp/main.js new file mode 100644 index 0000000..c1caf36 --- /dev/null +++ b/uniapp/main.js @@ -0,0 +1,22 @@ +import App from './App' + +// #ifndef VUE3 +import Vue from 'vue' +import './uni.promisify.adaptor' +Vue.config.productionTip = false +App.mpType = 'app' +const app = new Vue({ + ...App +}) +app.$mount() +// #endif + +// #ifdef VUE3 +import { createSSRApp } from 'vue' +export function createApp() { + const app = createSSRApp(App) + return { + app + } +} +// #endif \ No newline at end of file diff --git a/uniapp/manifest.json b/uniapp/manifest.json new file mode 100644 index 0000000..6a4a017 --- /dev/null +++ b/uniapp/manifest.json @@ -0,0 +1,65 @@ +{ + "name" : "账单小管家", + "appid" : "__UNI__8989AB7", + "description" : "本地记账、预算管理与消费统计微信小程序", + "versionName" : "1.0.0", + "versionCode" : "100", + "transformPx" : false, + "app-plus" : { + "usingComponents" : true, + "nvueStyleCompiler" : "uni-app", + "compilerVersion" : 3, + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + "modules" : {}, + "distribute" : { + "android" : { + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "ios" : {}, + "sdkConfigs" : {} + } + }, + "quickapp" : {}, + "mp-weixin" : { + "appid" : "wx8a928bb8a3945a16", + "setting" : { + "urlCheck" : false, + "minified" : true + }, + "usingComponents" : true + }, + "mp-alipay" : { + "usingComponents" : true + }, + "mp-baidu" : { + "usingComponents" : true + }, + "mp-toutiao" : { + "usingComponents" : true + }, + "uniStatistics" : { + "enable" : false + }, + "vueVersion" : "3" +} diff --git a/uniapp/pages.json b/uniapp/pages.json new file mode 100644 index 0000000..5f988ca --- /dev/null +++ b/uniapp/pages.json @@ -0,0 +1,66 @@ +{ + "pages": [ + { + "path": "pages/home/index", + "style": { + "navigationBarTitleText": "首页", + "enablePullDownRefresh": true + } + }, + { + "path": "pages/bills/index", + "style": { + "navigationBarTitleText": "账单管理", + "enablePullDownRefresh": true + } + }, + { + "path": "pages/budget/index", + "style": { + "navigationBarTitleText": "预算管理" + } + }, + { + "path": "pages/stats/index", + "style": { + "navigationBarTitleText": "数据报表" + } + }, + { + "path": "pages/mine/index", + "style": { + "navigationBarTitleText": "我的" + } + }, + { + "path": "pages/mine/profile/index", + "style": { + "navigationBarTitleText": "账户资料" + } + }, + { + "path": "pages/mine/backup/index", + "style": { + "navigationBarTitleText": "备份与恢复" + } + }, + { + "path": "pages/mine/guide/index", + "style": { + "navigationBarTitleText": "使用帮助" + } + }, + { + "path": "pages/mine/about/index", + "style": { + "navigationBarTitleText": "关于与隐私" + } + } + ], + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarBackgroundColor": "#F4EDE3", + "backgroundColor": "#F4EDE3", + "backgroundTextStyle": "dark" + } +} diff --git a/uniapp/pages/bills/index.vue b/uniapp/pages/bills/index.vue new file mode 100644 index 0000000..2577d24 --- /dev/null +++ b/uniapp/pages/bills/index.vue @@ -0,0 +1,492 @@ + + + + + diff --git a/uniapp/pages/budget/index.vue b/uniapp/pages/budget/index.vue new file mode 100644 index 0000000..46e0f54 --- /dev/null +++ b/uniapp/pages/budget/index.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/uniapp/pages/home/index.vue b/uniapp/pages/home/index.vue new file mode 100644 index 0000000..110c037 --- /dev/null +++ b/uniapp/pages/home/index.vue @@ -0,0 +1,473 @@ + + + + + diff --git a/uniapp/pages/index/index.vue b/uniapp/pages/index/index.vue new file mode 100644 index 0000000..ec0ec26 --- /dev/null +++ b/uniapp/pages/index/index.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/uniapp/pages/mine/about/index.vue b/uniapp/pages/mine/about/index.vue new file mode 100644 index 0000000..9941e3d --- /dev/null +++ b/uniapp/pages/mine/about/index.vue @@ -0,0 +1,177 @@ + + + + + + diff --git a/uniapp/pages/mine/backup/index.vue b/uniapp/pages/mine/backup/index.vue new file mode 100644 index 0000000..31323fb --- /dev/null +++ b/uniapp/pages/mine/backup/index.vue @@ -0,0 +1,277 @@ + + + + + + + diff --git a/uniapp/pages/mine/guide/index.vue b/uniapp/pages/mine/guide/index.vue new file mode 100644 index 0000000..ef6ecff --- /dev/null +++ b/uniapp/pages/mine/guide/index.vue @@ -0,0 +1,217 @@ + + + + + + diff --git a/uniapp/pages/mine/index.vue b/uniapp/pages/mine/index.vue new file mode 100644 index 0000000..aa38acb --- /dev/null +++ b/uniapp/pages/mine/index.vue @@ -0,0 +1,136 @@ + + + + + diff --git a/uniapp/pages/mine/profile/index.vue b/uniapp/pages/mine/profile/index.vue new file mode 100644 index 0000000..897bd74 --- /dev/null +++ b/uniapp/pages/mine/profile/index.vue @@ -0,0 +1,255 @@ + + + + + diff --git a/uniapp/pages/stats/index.vue b/uniapp/pages/stats/index.vue new file mode 100644 index 0000000..d6e2156 --- /dev/null +++ b/uniapp/pages/stats/index.vue @@ -0,0 +1,445 @@ + + + + + diff --git a/uniapp/static/logo.png b/uniapp/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b5771e209bb677e2ebd5ff766ad5ee11790f305a GIT binary patch literal 4023 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 SYs}WS&%*SCNx89m_ { + res.then((res) => { + if (!res) return resolve(res) + return res[0] ? reject(res[0]) : resolve(res[1]) + }); + }); + }, +}); \ No newline at end of file diff --git a/uniapp/uni.scss b/uniapp/uni.scss new file mode 100644 index 0000000..b9249e9 --- /dev/null +++ b/uniapp/uni.scss @@ -0,0 +1,76 @@ +/** + * 这里是uni-app内置的常用样式变量 + * + * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 + * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App + * + */ + +/** + * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 + * + * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 + */ + +/* 颜色变量 */ + +/* 行为相关颜色 */ +$uni-color-primary: #007aff; +$uni-color-success: #4cd964; +$uni-color-warning: #f0ad4e; +$uni-color-error: #dd524d; + +/* 文字基本颜色 */ +$uni-text-color:#333;//基本色 +$uni-text-color-inverse:#fff;//反色 +$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 +$uni-text-color-placeholder: #808080; +$uni-text-color-disable:#c0c0c0; + +/* 背景颜色 */ +$uni-bg-color:#ffffff; +$uni-bg-color-grey:#f8f8f8; +$uni-bg-color-hover:#f1f1f1;//点击状态颜色 +$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 + +/* 边框颜色 */ +$uni-border-color:#c8c7cc; + +/* 尺寸变量 */ + +/* 文字尺寸 */ +$uni-font-size-sm:12px; +$uni-font-size-base:14px; +$uni-font-size-lg:16px; + +/* 图片尺寸 */ +$uni-img-size-sm:20px; +$uni-img-size-base:26px; +$uni-img-size-lg:40px; + +/* Border Radius */ +$uni-border-radius-sm: 2px; +$uni-border-radius-base: 3px; +$uni-border-radius-lg: 6px; +$uni-border-radius-circle: 50%; + +/* 水平间距 */ +$uni-spacing-row-sm: 5px; +$uni-spacing-row-base: 10px; +$uni-spacing-row-lg: 15px; + +/* 垂直间距 */ +$uni-spacing-col-sm: 4px; +$uni-spacing-col-base: 8px; +$uni-spacing-col-lg: 12px; + +/* 透明度 */ +$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 + +/* 文章场景相关 */ +$uni-color-title: #2C405A; // 文章标题颜色 +$uni-font-size-title:20px; +$uni-color-subtitle: #555555; // 二级标题颜色 +$uni-font-size-subtitle:26px; +$uni-color-paragraph: #3F536E; // 文章段落颜色 +$uni-font-size-paragraph:15px; diff --git a/uniapp/unpackage/dist/build/mp-weixin/app.js b/uniapp/unpackage/dist/build/mp-weixin/app.js new file mode 100644 index 0000000..3179563 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/app.js @@ -0,0 +1 @@ +"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./common/vendor.js");Math;const o={onLaunch(){console.log("Bill Helper Launch")}};function t(){return{app:e.createSSRApp(o)}}t().app.mount("#app"),exports.createApp=t; diff --git a/uniapp/unpackage/dist/build/mp-weixin/app.json b/uniapp/unpackage/dist/build/mp-weixin/app.json new file mode 100644 index 0000000..2e89195 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/app.json @@ -0,0 +1,20 @@ +{ + "pages": [ + "pages/home/index", + "pages/bills/index", + "pages/budget/index", + "pages/stats/index", + "pages/mine/index", + "pages/mine/profile/index", + "pages/mine/backup/index", + "pages/mine/guide/index", + "pages/mine/about/index" + ], + "window": { + "navigationBarTextStyle": "black", + "navigationBarBackgroundColor": "#F4EDE3", + "backgroundColor": "#F4EDE3", + "backgroundTextStyle": "dark" + }, + "usingComponents": {} +} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/app.wxss b/uniapp/unpackage/dist/build/mp-weixin/app.wxss new file mode 100644 index 0000000..e3f217d --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/app.wxss @@ -0,0 +1,2 @@ +page{background:#f4ede3;color:#16202a;font-family:PingFang SC,HarmonyOS Sans SC,sans-serif;--bg-app: #f4ede3;--bg-accent: linear-gradient(135deg, #102a43 0%, #1f6f5f 100%);--surface-card: rgba(255, 255, 255, .9);--surface-strong: #ffffff;--surface-muted: rgba(255, 255, 255, .68);--text-primary: #16202a;--text-secondary: #617081;--text-muted: #91a0af;--line-soft: rgba(22, 32, 42, .08);--brand: #1f6f5f;--brand-soft: rgba(31, 111, 95, .14);--danger: #d25543;--danger-soft: rgba(210, 85, 67, .14);--warning: #c48a1f;--shadow-card: 0 18rpx 40rpx rgba(16, 42, 67, .08)}view,text,button,input,textarea,scroll-view{box-sizing:border-box}button{margin:0;padding:0;background:transparent;line-height:1;border:0}button:after{border:0}.app-page{display:flex;flex-direction:column;gap:24rpx;min-height:100vh;padding:28rpx 28rpx 188rpx;background:radial-gradient(circle at top right,rgba(31,111,95,.16),transparent 32%),var(--bg-app);color:var(--text-primary)}.theme-dark{--bg-app: #0f1720;--bg-accent: linear-gradient(135deg, #09111a 0%, #1d4e46 100%);--surface-card: rgba(19, 29, 40, .92);--surface-strong: #162331;--surface-muted: rgba(24, 35, 49, .76);--text-primary: #eef5fb;--text-secondary: #9db0c2;--text-muted: #7c90a3;--line-soft: rgba(255, 255, 255, .08);--brand: #64c6a9;--brand-soft: rgba(100, 198, 169, .14);--danger: #ff8c78;--danger-soft: rgba(255, 140, 120, .14);--warning: #f2c56d;--shadow-card: 0 18rpx 48rpx rgba(0, 0, 0, .28)}.surface-card{background:var(--surface-card);border:1rpx solid var(--line-soft);border-radius:30rpx;box-shadow:var(--shadow-card);-webkit-backdrop-filter:blur(12rpx);backdrop-filter:blur(12rpx)}.surface-strong{background:var(--surface-strong)}.section-title{font-size:34rpx;font-weight:600;color:var(--text-primary)}.section-subtitle{font-size:24rpx;color:var(--text-secondary)}.pill-button{display:inline-flex;align-items:center;justify-content:center;padding:18rpx 24rpx;border-radius:999rpx;background:var(--surface-muted);color:var(--text-secondary);font-size:24rpx}.pill-button.active{background:var(--brand);color:#fff}.primary-button{display:inline-flex;align-items:center;justify-content:center;padding:22rpx 28rpx;border-radius:24rpx;background:var(--bg-accent);color:#fff;font-size:28rpx;font-weight:600}.ghost-button{display:inline-flex;align-items:center;justify-content:center;padding:20rpx 26rpx;border-radius:22rpx;background:var(--brand-soft);color:var(--brand);font-size:26rpx;font-weight:600}.danger-button{background:var(--danger-soft);color:var(--danger)}.input-shell{display:flex;align-items:center;min-height:86rpx;padding:0 24rpx;border-radius:24rpx;background:var(--surface-muted);border:1rpx solid transparent}.input-shell input,.input-shell textarea{width:100%;font-size:28rpx;color:var(--text-primary)}.muted-text{color:var(--text-secondary)}.tiny-text{font-size:22rpx;color:var(--text-muted)}.positive{color:var(--brand)}.negative{color:var(--danger)} +page{--status-bar-height:25px;--top-window-height:0px;--window-top:0px;--window-bottom:0px;--window-left:0px;--window-right:0px;--window-magin:0px}[data-c-h="true"]{display: none !important;} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/common/vendor.js b/uniapp/unpackage/dist/build/mp-weixin/common/vendor.js new file mode 100644 index 0000000..0da861d --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/common/vendor.js @@ -0,0 +1,7 @@ +"use strict"; +/** +* @vue/shared v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +function e(e,t){const n=new Set(e.split(","));return t?e=>n.has(e.toLowerCase()):e=>n.has(e)}const t={},n=[],o=()=>{},r=()=>!1,s=e=>111===e.charCodeAt(0)&&110===e.charCodeAt(1)&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),i=e=>e.startsWith("onUpdate:"),c=Object.assign,a=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},l=Object.prototype.hasOwnProperty,u=(e,t)=>l.call(e,t),f=Array.isArray,p=e=>"[object Map]"===x(e),d=e=>"[object Set]"===x(e),h=e=>"function"==typeof e,g=e=>"string"==typeof e,m=e=>"symbol"==typeof e,v=e=>null!==e&&"object"==typeof e,_=e=>(v(e)||h(e))&&h(e.then)&&h(e.catch),y=Object.prototype.toString,x=e=>y.call(e),b=e=>"[object Object]"===x(e),w=e=>g(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,$=e(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),S=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},k=/-(\w)/g,O=S((e=>e.replace(k,((e,t)=>t?t.toUpperCase():"")))),P=/\B([A-Z])/g,C=S((e=>e.replace(P,"-$1").toLowerCase())),E=S((e=>e.charAt(0).toUpperCase()+e.slice(1))),I=S((e=>e?`on${E(e)}`:"")),A=(e,t)=>!Object.is(e,t),j=(e,t)=>{for(let n=0;n{const t=parseFloat(e);return isNaN(t)?e:t};function L(e){let t="";if(g(e))t=e;else if(f(e))for(let n=0;nt&&t.__v_isRef?T(e,t.value):p(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n],o)=>(e[M(t,o)+" =>"]=n,e)),{})}:d(t)?{[`Set(${t.size})`]:[...t.values()].map((e=>M(e)))}:m(t)?M(t):!v(t)||f(t)||b(t)?t:String(t),M=(e,t="")=>{var n;return m(e)?`Symbol(${null!=(n=e.description)?n:t})`:e};function V(e,t=null){let n;return(...o)=>(e&&(n=e.apply(t,o),e=null),n)}function D(e,t){if(!g(t))return;const n=(t=t.replace(/\[(\d+)\]/g,".$1")).split(".");let o=n[0];return e||(e={}),1===n.length?e[o]:D(e[o],n.slice(1).join("."))}function H(e){let t={};return b(e)&&Object.keys(e).sort().forEach((n=>{const o=n;t[o]=e[o]})),Object.keys(t)?t:e}const N=/:/g;const B=encodeURIComponent;function U(e,t=B){const n=e?Object.keys(e).map((n=>{let o=e[n];return void 0===typeof o||null===o?o="":b(o)&&(o=JSON.stringify(o)),t(n)+"="+t(o)})).filter((e=>e.length>0)).join("&"):null;return n?`?${n}`:""}const W=["onInit","onLoad","onShow","onHide","onUnload","onBackPress","onPageScroll","onTabItemTap","onReachBottom","onPullDownRefresh","onShareTimeline","onShareAppMessage","onShareChat","onAddToFavorites","onSaveExitState","onNavigationBarButtonTap","onNavigationBarSearchInputClicked","onNavigationBarSearchInputChanged","onNavigationBarSearchInputConfirmed","onNavigationBarSearchInputFocusChanged"];const z=["onShow","onHide","onLaunch","onError","onThemeChange","onPageNotFound","onUnhandledRejection","onExit","onInit","onLoad","onReady","onUnload","onResize","onBackPress","onPageScroll","onTabItemTap","onReachBottom","onPullDownRefresh","onShareTimeline","onAddToFavorites","onShareAppMessage","onShareChat","onSaveExitState","onNavigationBarButtonTap","onNavigationBarSearchInputClicked","onNavigationBarSearchInputChanged","onNavigationBarSearchInputConfirmed","onNavigationBarSearchInputFocusChanged"],F=(()=>({onPageScroll:1,onShareAppMessage:2,onShareTimeline:4,onShareChat:8}))();function K(e,t,n=!0){return!(n&&!h(t))&&(z.indexOf(e)>-1||0===e.indexOf("on"))}let q;const G=[];const J=V(((e,t)=>t(e))),Z=function(){};Z.prototype={_id:1,on:function(e,t,n){var o=this.e||(this.e={});return(o[e]||(o[e]=[])).push({fn:t,ctx:n,_id:this._id}),this._id++},once:function(e,t,n){var o=this;function r(){o.off(e,r),t.apply(n,arguments)}return r._=t,this.on(e,r,n)},emit:function(e){for(var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),o=0,r=n.length;o=0;s--)if(o[s].fn===t||o[s].fn._===t||o[s]._id===t){o.splice(s,1);break}r=o}return r.length?n[e]=r:delete n[e],this}};var Q=Z;function X(e,t){if(!e)return;if(e=e.trim().replace(/_/g,"-"),t&&t[e])return e;if("chinese"===(e=e.toLowerCase()))return"zh-Hans";if(0===e.indexOf("zh"))return e.indexOf("-hans")>-1?"zh-Hans":e.indexOf("-hant")>-1?"zh-Hant":(n=e,["-tw","-hk","-mo","-cht"].find((e=>-1!==n.indexOf(e)))?"zh-Hant":"zh-Hans");var n;let o=["en","fr","es"];t&&Object.keys(t).length>0&&(o=Object.keys(t));const r=function(e,t){return t.find((t=>0===e.indexOf(t)))}(e,o);return r||void 0}function Y(e){return function(){try{return e.apply(e,arguments)}catch(t){console.error(t)}}}let ee=1;const te={};function ne(e,t,n){if("number"==typeof e){const o=te[e];if(o)return o.keepAlive||delete te[e],o.callback(t,n)}return t}const oe="success",re="fail",se="complete";function ie(e,t={},{beforeAll:n,beforeSuccess:o}={}){b(t)||(t={});const{success:r,fail:s,complete:i}=function(e){const t={};for(const n in e){const o=e[n];h(o)&&(t[n]=Y(o),delete e[n])}return t}(t),c=h(r),a=h(s),l=h(i),u=ee++;return function(e,t,n,o=!1){te[e]={name:t,keepAlive:o,callback:n}}(u,e,(u=>{(u=u||{}).errMsg=function(e,t){return e&&-1!==e.indexOf(":fail")?t+e.substring(e.indexOf(":fail")):t+":ok"}(u.errMsg,e),h(n)&&n(u),u.errMsg===e+":ok"?(h(o)&&o(u,t),c&&r(u)):a&&s(u),l&&i(u)})),u}const ce="success",ae="fail",le="complete",ue={},fe={};function pe(e,t){return function(n){return e(n,t)||n}}function de(e,t,n){let o=!1;for(let r=0;re(t),catch(){}}}function he(e,t={}){return[ce,ae,le].forEach((n=>{const o=e[n];if(!f(o))return;const r=t[n];t[n]=function(e){de(o,e,t).then((e=>h(r)&&r(e)||e))}})),t}function ge(e,t){const n=[];f(ue.returnValue)&&n.push(...ue.returnValue);const o=fe[e];return o&&f(o.returnValue)&&n.push(...o.returnValue),n.forEach((e=>{t=e(t)||t})),t}function me(e){const t=Object.create(null);Object.keys(ue).forEach((e=>{"returnValue"!==e&&(t[e]=ue[e].slice())}));const n=fe[e];return n&&Object.keys(n).forEach((e=>{"returnValue"!==e&&(t[e]=(t[e]||[]).concat(n[e]))})),t}function ve(e,t,n,o){const r=me(e);if(r&&Object.keys(r).length){if(f(r.invoke)){return de(r.invoke,n).then((n=>t(he(me(e),n),...o)))}return t(he(r,n),...o)}return t(n,...o)}function _e(e,t){return(n={},...o)=>function(e){return!(!b(e)||![oe,re,se].find((t=>h(e[t]))))}(n)?ge(e,ve(e,t,c({},n),o)):ge(e,new Promise(((r,s)=>{ve(e,t,c({},n,{success:r,fail:s}),o)})))}function ye(e,t,n,o={}){const r=t+":fail";let s="";return s=n?0===n.indexOf(r)?n:r+" "+n:r,delete o.errCode,ne(e,c({errMsg:s},o))}function xe(e,t,n,o){const r=function(e,t){e[0]}(t);if(r)return r}function be(e,t,n,o){return n=>{const r=ie(e,n,o),s=xe(0,[n]);return s?ye(r,e,s):t(n,{resolve:t=>function(e,t,n){return ne(e,c(n||{},{errMsg:t+":ok"}))}(r,e,t),reject:(t,n)=>ye(r,e,function(e){return!e||g(e)?e:e.stack?("undefined"!=typeof globalThis&&globalThis.harmonyChannel||console.error(e.message+"\n"+e.stack),e.message):e}(t),n)})}}function we(e,t,n,o){return function(e,t,n,o){return(...e)=>{const n=xe(0,e);if(n)throw new Error(n);return t.apply(null,e)}}(0,t)}let $e=!1,Se=0,ke=0;const Oe=we(0,((e,t)=>{if(0===Se&&function(){var e,t;let n,o,r;{const s=(null===(e=wx.getWindowInfo)||void 0===e?void 0:e.call(wx))||wx.getSystemInfoSync(),i=(null===(t=wx.getDeviceInfo)||void 0===t?void 0:t.call(wx))||wx.getSystemInfoSync();n=s.windowWidth,o=s.pixelRatio,r=i.platform}Se=n,ke=o,$e="ios"===r}(),0===(e=Number(e)))return 0;let n=e/750*(t||Se);return n<0&&(n=-n),n=Math.floor(n+1e-4),0===n&&(n=1!==ke&&$e?.5:1),e<0?-n:n}));function Pe(e,t){Object.keys(t).forEach((n=>{h(t[n])&&(e[n]=function(e,t){const n=t?e?e.concat(t):f(t)?t:[t]:e;return n?function(e){const t=[];for(let n=0;n{const o=e[n],r=t[n];f(o)&&h(r)&&a(o,r)}))}const Ee=we(0,((e,t)=>{g(e)&&b(t)?Pe(fe[e]||(fe[e]={}),t):b(e)&&Pe(ue,e)})),Ie=we(0,((e,t)=>{g(e)?b(t)?Ce(fe[e],t):delete fe[e]:b(e)&&Ce(ue,e)}));const Ae=new class{constructor(){this.$emitter=new Q}on(e,t){return this.$emitter.on(e,t)}once(e,t){return this.$emitter.once(e,t)}off(e,t){e?this.$emitter.off(e,t):this.$emitter.e={}}emit(e,...t){this.$emitter.emit(e,...t)}},je=we(0,((e,t)=>(Ae.on(e,t),()=>Ae.off(e,t)))),Re=we(0,((e,t)=>(Ae.once(e,t),()=>Ae.off(e,t)))),Le=we(0,((e,t)=>{f(e)||(e=e?[e]:[]),e.forEach((e=>{Ae.off(e,t)}))})),Te=we(0,((e,...t)=>{Ae.emit(e,...t)}));let Me,Ve,De;function He(e){try{return JSON.parse(e)}catch(t){}return e}const Ne=[];function Be(e,t){Ne.forEach((n=>{n(e,t)})),Ne.length=0}const Ue=_e(We="getPushClientId",function(e,t,n,o){return be(e,t,0,o)}(We,((e,{resolve:t,reject:n})=>{Promise.resolve().then((()=>{void 0===De&&(De=!1,Me="",Ve="uniPush is not enabled"),Ne.push(((e,o)=>{e?t({cid:e}):n(o)})),void 0!==Me&&Be(Me,Ve)}))}),0,ze));var We,ze;const Fe=[],Ke=/^\$|__f__|getLocale|setLocale|sendNativeEvent|restoreGlobal|requireGlobal|getCurrentSubNVue|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|rpx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64|getDeviceInfo|getAppBaseInfo|getWindowInfo|getSystemSetting|getAppAuthorizeSetting/,qe=/^create|Manager$/,Ge=["createBLEConnection"],Je=["request","downloadFile","uploadFile","connectSocket"],Ze=["createBLEConnection"],Qe=/^on|^off/;function Xe(e){return qe.test(e)&&-1===Ge.indexOf(e)}function Ye(e){return Ke.test(e)&&-1===Ze.indexOf(e)}function et(e){return-1!==Je.indexOf(e)}function tt(e){return!(Xe(e)||Ye(e)||function(e){return Qe.test(e)&&"onPush"!==e}(e))}function nt(e,t){return tt(e)&&h(t)?function(n={},...o){return h(n.success)||h(n.fail)||h(n.complete)?ge(e,ve(e,t,c({},n),o)):ge(e,new Promise(((r,s)=>{ve(e,t,c({},n,{success:r,fail:s}),o)})))}:t}Promise.prototype.finally||(Promise.prototype.finally=function(e){const t=this.constructor;return this.then((n=>t.resolve(e&&e()).then((()=>n))),(n=>t.resolve(e&&e()).then((()=>{throw n}))))});const ot=["success","fail","cancel","complete"];const rt=()=>{const e=h(getApp)&&getApp({allowDefault:!0});return e&&e.$vm?e.$vm.$locale:function(){var e;let t="";{const n=(null===(e=wx.getAppBaseInfo)||void 0===e?void 0:e.call(wx))||wx.getSystemInfoSync();t=X(n&&n.language?n.language:"en")||"en"}return t}()},st=[];"undefined"!=typeof global&&(global.getLocale=rt);let it;function ct(e=wx){return function(t,n){it=it||e.getStorageSync("__DC_STAT_UUID"),it||(it=Date.now()+""+Math.floor(1e7*Math.random()),wx.setStorage({key:"__DC_STAT_UUID",data:it})),n.deviceId=it}}function at(e,t){if(e.safeArea){const n=e.safeArea;t.safeAreaInsets={top:n.top,left:n.left,right:e.windowWidth-n.right,bottom:e.screenHeight-n.bottom}}}function lt(e,t){let n="",o="";switch(n=e.split(" ")[0]||t,o=e.split(" ")[1]||"",n=n.toLowerCase(),n){case"harmony":case"ohos":case"openharmony":n="harmonyos";break;case"iphone os":n="ios";break;case"mac":case"darwin":n="macos";break;case"windows_nt":n="windows"}return{osName:n,osVersion:o}}function ut(e,t){let n=e.deviceType||"phone";{const e={ipad:"pad",windows:"pc",mac:"pc"},o=Object.keys(e),r=t.toLowerCase();for(let t=0;t{at(e,t),ct()(e,t),function(e,t){const{brand:n="",model:o="",system:r="",language:s="",theme:i,version:a,platform:l,fontSizeSetting:u,SDKVersion:f,pixelRatio:p,deviceOrientation:d}=e,{osName:h,osVersion:g}=lt(r,l);let m=a,v=ut(e,o),_=ft(n),y=dt(e),x=d,b=p,w=f;const $=(s||"").replace(/_/g,"-"),S={appId:"__UNI__8989AB7",appName:"账单小管家",appVersion:"1.0.0",appVersionCode:"100",appLanguage:pt($),uniCompileVersion:"4.87",uniCompilerVersion:"4.87",uniRuntimeVersion:"4.87",uniPlatform:"mp-weixin",deviceBrand:_,deviceModel:o,deviceType:v,devicePixelRatio:b,deviceOrientation:x,osName:h,osVersion:g,hostTheme:i,hostVersion:m,hostLanguage:$,hostName:y,hostSDKVersion:w,hostFontSizeSetting:u,windowTop:0,windowBottom:0,osLanguage:void 0,osTheme:void 0,ua:void 0,hostPackageName:void 0,browserName:void 0,browserVersion:void 0,isUniAppX:!1};c(t,S)}(e,t)}},gt=ht,mt={args(e,t){let n=parseInt(e.current);if(isNaN(n))return;const o=e.urls;if(!f(o))return;const r=o.length;return r?(n<0?n=0:n>=r&&(n=r-1),n>0?(t.current=o[n],t.urls=o.filter(((e,t)=>!(t{const{brand:n,model:o,system:r="",platform:s=""}=e;let i=ut(e,o),a=ft(n);ct()(e,t);const{osName:l,osVersion:u}=lt(r,s);t=H(c(t,{deviceType:i,deviceBrand:a,deviceModel:o,osName:l,osVersion:u}))}},yt={returnValue:(e,t)=>{const{version:n,language:o,SDKVersion:r,theme:s}=e;let i=dt(e),a=(o||"").replace(/_/g,"-");const l={hostVersion:n,hostLanguage:a,hostName:i,hostSDKVersion:r,hostTheme:s,appId:"__UNI__8989AB7",appName:"账单小管家",appVersion:"1.0.0",appVersionCode:"100",appLanguage:pt(a),isUniAppX:!1,uniPlatform:"mp-weixin",uniCompileVersion:"4.87",uniCompilerVersion:"4.87",uniRuntimeVersion:"4.87"};c(t,l)}},xt={returnValue:(e,t)=>{at(e,t),t=H(c(t,{windowTop:0,windowBottom:0}))}},bt={args(e){const t=getApp({allowDefault:!0})||{};t.$vm?nr("onError",e,t.$vm.$):(wx.$onErrorHandlers||(wx.$onErrorHandlers=[]),wx.$onErrorHandlers.push(e))}},wt={args(e){const t=getApp({allowDefault:!0})||{};if(t.$vm){if(e.__weh){const n=t.$vm.$.onError;if(n){const t=n.indexOf(e.__weh);t>-1&&n.splice(t,1)}}}else{if(!wx.$onErrorHandlers)return;const t=wx.$onErrorHandlers.findIndex((t=>t===e));-1!==t&&wx.$onErrorHandlers.splice(t,1)}}},$t={args(){if(wx.__uni_console__){if(wx.__uni_console_warned__)return;wx.__uni_console_warned__=!0,console.warn("开发模式下小程序日志回显会使用 socket 连接,为了避免冲突,建议使用 SocketTask 的方式去管理 WebSocket 或手动关闭日志回显功能。[详情](https://uniapp.dcloud.net.cn/tutorial/run/mp-log.html)")}}},St=$t,kt={$on:je,$off:Le,$once:Re,$emit:Te,upx2px:Oe,rpx2px:Oe,interceptors:{},addInterceptor:Ee,removeInterceptor:Ie,onCreateVueApp:function(e){if(q)return e(q);G.push(e)},invokeCreateVueAppHook:function(e){q=e,G.forEach((t=>t(e)))},getLocale:rt,setLocale:e=>{const t=h(getApp)&&getApp();if(!t)return!1;return t.$vm.$locale!==e&&(t.$vm.$locale=e,st.forEach((t=>t({locale:e}))),!0)},onLocaleChange:e=>{-1===st.indexOf(e)&&st.push(e)},getPushClientId:Ue,onPushMessage:e=>{-1===Fe.indexOf(e)&&Fe.push(e)},offPushMessage:e=>{if(e){const t=Fe.indexOf(e);t>-1&&Fe.splice(t,1)}else Fe.length=0},invokePushCallback:function(e){if("enabled"===e.type)De=!0;else if("clientId"===e.type)Me=e.cid,Ve=e.errMsg,Be(Me,e.errMsg);else if("pushMsg"===e.type){const t={type:"receive",data:He(e.message)};for(let e=0;e{t({type:"click",data:He(e.message)})}))},__f__:function(e,t,...n){t&&n.push(t),console[e].apply(console,n)}};const Ot=["qy","env","error","version","lanDebug","cloud","serviceMarket","router","worklet","__webpack_require_UNI_MP_PLUGIN__"],Pt=["lanDebug","router","worklet"],Ct=wx.getLaunchOptionsSync?wx.getLaunchOptionsSync():null;function Et(e){return(!Ct||1154!==Ct.scene||!Pt.includes(e))&&(Ot.indexOf(e)>-1||"function"==typeof wx[e])}function It(){const e={};for(const t in wx)Et(t)&&(e[t]=wx[t]);return"undefined"!=typeof globalThis&&"undefined"==typeof requireMiniProgram&&(globalThis.wx=e),e}const At=["__route__","__wxExparserNodeId__","__wxWebviewId__"],jt=(Rt={oauth:["weixin"],share:["weixin"],payment:["wxpay"],push:["weixin"]},function({service:e,success:t,fail:n,complete:o}){let r;Rt[e]?(r={errMsg:"getProvider:ok",service:e,provider:Rt[e]},h(t)&&t(r)):(r={errMsg:"getProvider:fail:服务["+e+"]不存在"},h(n)&&n(r)),h(o)&&o(r)});var Rt;const Lt=It();Lt.canIUse("getAppBaseInfo")||(Lt.getAppBaseInfo=Lt.getSystemInfoSync),Lt.canIUse("getWindowInfo")||(Lt.getWindowInfo=Lt.getSystemInfoSync),Lt.canIUse("getDeviceInfo")||(Lt.getDeviceInfo=Lt.getSystemInfoSync);let Tt=Lt.getAppBaseInfo&&Lt.getAppBaseInfo();Tt||(Tt=Lt.getSystemInfoSync());const Mt=Tt?Tt.host:null,Vt=Mt&&"SAAASDK"===Mt.env?Lt.miniapp.shareVideoMessage:Lt.shareVideoMessage;var Dt=Object.freeze({__proto__:null,createSelectorQuery:function(){const e=Lt.createSelectorQuery(),t=e.in;return e.in=function(e){return e.$scope?t.call(this,e.$scope):t.call(this,function(e){const t=Object.create(null);return At.forEach((n=>{t[n]=e[n]})),t}(e))},e},getProvider:jt,shareVideoMessage:Vt});const Ht={args(e,t){e.compressedHeight&&!t.compressHeight&&(t.compressHeight=e.compressedHeight),e.compressedWidth&&!t.compressWidth&&(t.compressWidth=e.compressedWidth)}};var Nt=Object.freeze({__proto__:null,compressImage:Ht,getAppAuthorizeSetting:{returnValue:function(e,t){const{locationReducedAccuracy:n}=e;t.locationAccuracy="unsupported",!0===n?t.locationAccuracy="reduced":!1===n&&(t.locationAccuracy="full")}},getAppBaseInfo:yt,getDeviceInfo:_t,getSystemInfo:ht,getSystemInfoSync:gt,getWindowInfo:xt,offError:wt,onError:bt,onSocketMessage:St,onSocketOpen:$t,previewImage:mt,redirectTo:{},showActionSheet:vt});const Bt=It();var Ut=function(e,t,n=wx){const o=function(e){function t(e,t,n){return function(r){return t(o(e,r,n))}}function n(e,n,o={},r={},s=!1){if(b(n)){const i=!0===s?n:{};h(o)&&(o=o(n,i)||{});for(const c in n)if(u(o,c)){let t=o[c];h(t)&&(t=t(n[c],n,i)),t?g(t)?i[t]=n[c]:b(t)&&(i[t.name?t.name:c]=t.value):console.warn(`微信小程序 ${e} 暂不支持 ${c}`)}else if(-1!==ot.indexOf(c)){const o=n[c];h(o)&&(i[c]=t(e,o,r))}else s||u(i,c)||(i[c]=n[c]);return i}return h(n)&&(h(o)&&o(n,{}),n=t(e,n,r)),n}function o(t,o,r,s=!1){return h(e.returnValue)&&(o=e.returnValue(t,o)),n(t,o,r,{},s||!1)}return function(t,r){const s=u(e,t);if(!s&&"function"!=typeof wx[t])return r;const i=s||h(e.returnValue)||Xe(t)||et(t),c=s||h(r);if(!s&&!r)return function(){console.error(`微信小程序 暂不支持${t}`)};if(!i||!c)return r;const a=e[t];return function(e,r){let s=a||{};h(a)&&(s=a(e));const i=[e=n(t,e,s.args,s.returnValue)];void 0!==r&&i.push(r);const c=wx[s.name||t].apply(wx,i);return(Xe(t)||et(t))&&c&&!c.__v_skip&&(c.__v_skip=!0),Ye(t)?o(t,c,s.returnValue,Xe(t)):c}}}(t);return new Proxy({},{get:(t,r)=>u(t,r)?t[r]:u(e,r)?nt(r,e[r]):u(kt,r)?nt(r,kt[r]):nt(r,o(r,n[r]))})}(Dt,Nt,Bt);let Wt,zt;class Ft{constructor(e=!1){this.detached=e,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Wt,!e&&Wt&&(this.index=(Wt.scopes||(Wt.scopes=[])).push(this)-1)}get active(){return this._active}run(e){if(this._active){const t=Wt;try{return Wt=this,e()}finally{Wt=t}}}on(){Wt=this}off(){Wt=this.parent}stop(e){if(this._active){let t,n;for(t=0,n=this.effects.length;t=4))break}1===this._dirtyLevel&&(this._dirtyLevel=0),en()}return this._dirtyLevel>=4}set dirty(e){this._dirtyLevel=e?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let e=Zt,t=zt;try{return Zt=!0,zt=this,this._runnings++,qt(this),this.fn()}finally{Gt(this),this._runnings--,zt=t,Zt=e}}stop(){var e;this.active&&(qt(this),Gt(this),null==(e=this.onStop)||e.call(this),this.active=!1)}}function qt(e){e._trackId++,e._depsLength=0}function Gt(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},an=new WeakMap,ln=Symbol(""),un=Symbol("");function fn(e,t,n){if(Zt&&zt){let t=an.get(e);t||an.set(e,t=new Map);let o=t.get(n);o||t.set(n,o=cn((()=>t.delete(n)))),on(zt,o)}}function pn(e,t,n,o,r,s){const i=an.get(e);if(!i)return;let c=[];if("clear"===t)c=[...i.values()];else if("length"===n&&f(e)){const e=Number(o);i.forEach(((t,n)=>{("length"===n||!m(n)&&n>=e)&&c.push(t)}))}else switch(void 0!==n&&c.push(i.get(n)),t){case"add":f(e)?w(n)&&c.push(i.get("length")):(c.push(i.get(ln)),p(e)&&c.push(i.get(un)));break;case"delete":f(e)||(c.push(i.get(ln)),p(e)&&c.push(i.get(un)));break;case"set":p(e)&&c.push(i.get(ln))}tn();for(const a of c)a&&sn(a,4);nn()}const dn=e("__proto__,__v_isRef,__isVue"),hn=new Set(Object.getOwnPropertyNames(Symbol).filter((e=>"arguments"!==e&&"caller"!==e)).map((e=>Symbol[e])).filter(m)),gn=mn();function mn(){const e={};return["includes","indexOf","lastIndexOf"].forEach((t=>{e[t]=function(...e){const n=no(this);for(let t=0,r=this.length;t{e[t]=function(...e){Yt(),tn();const n=no(this)[t].apply(this,e);return nn(),en(),n}})),e}function vn(e){const t=no(this);return fn(t,0,e),t.hasOwnProperty(e)}class _n{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){const o=this._isReadonly,r=this._isShallow;if("__v_isReactive"===t)return!o;if("__v_isReadonly"===t)return o;if("__v_isShallow"===t)return r;if("__v_raw"===t)return n===(o?r?Gn:qn:r?Kn:Fn).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;const s=f(e);if(!o){if(s&&u(gn,t))return Reflect.get(gn,t,n);if("hasOwnProperty"===t)return vn}const i=Reflect.get(e,t,n);return(m(t)?hn.has(t):dn(t))?i:(o||fn(e,0,t),r?i:lo(i)?s&&w(t)?i:i.value:v(i)?o?Qn(i):Zn(i):i)}}class yn extends _n{constructor(e=!1){super(!1,e)}set(e,t,n,o){let r=e[t];if(!this._isShallow){const t=eo(r);if(to(n)||eo(n)||(r=no(r),n=no(n)),!f(e)&&lo(r)&&!lo(n))return!t&&(r.value=n,!0)}const s=f(e)&&w(t)?Number(t)e,kn=e=>Reflect.getPrototypeOf(e);function On(e,t,n=!1,o=!1){const r=no(e=e.__v_raw),s=no(t);n||(A(t,s)&&fn(r,0,t),fn(r,0,s));const{has:i}=kn(r),c=o?Sn:n?so:ro;return i.call(r,t)?c(e.get(t)):i.call(r,s)?c(e.get(s)):void(e!==r&&e.get(t))}function Pn(e,t=!1){const n=this.__v_raw,o=no(n),r=no(e);return t||(A(e,r)&&fn(o,0,e),fn(o,0,r)),e===r?n.has(e):n.has(e)||n.has(r)}function Cn(e,t=!1){return e=e.__v_raw,!t&&fn(no(e),0,ln),Reflect.get(e,"size",e)}function En(e){e=no(e);const t=no(this);return kn(t).has.call(t,e)||(t.add(e),pn(t,"add",e,e)),this}function In(e,t){t=no(t);const n=no(this),{has:o,get:r}=kn(n);let s=o.call(n,e);s||(e=no(e),s=o.call(n,e));const i=r.call(n,e);return n.set(e,t),s?A(t,i)&&pn(n,"set",e,t):pn(n,"add",e,t),this}function An(e){const t=no(this),{has:n,get:o}=kn(t);let r=n.call(t,e);r||(e=no(e),r=n.call(t,e)),o&&o.call(t,e);const s=t.delete(e);return r&&pn(t,"delete",e,void 0),s}function jn(){const e=no(this),t=0!==e.size,n=e.clear();return t&&pn(e,"clear",void 0,void 0),n}function Rn(e,t){return function(n,o){const r=this,s=r.__v_raw,i=no(s),c=t?Sn:e?so:ro;return!e&&fn(i,0,ln),s.forEach(((e,t)=>n.call(o,c(e),c(t),r)))}}function Ln(e,t,n){return function(...o){const r=this.__v_raw,s=no(r),i=p(s),c="entries"===e||e===Symbol.iterator&&i,a="keys"===e&&i,l=r[e](...o),u=n?Sn:t?so:ro;return!t&&fn(s,0,a?un:ln),{next(){const{value:e,done:t}=l.next();return t?{value:e,done:t}:{value:c?[u(e[0]),u(e[1])]:u(e),done:t}},[Symbol.iterator](){return this}}}}function Tn(e){return function(...t){return"delete"!==e&&("clear"===e?void 0:this)}}function Mn(){const e={get(e){return On(this,e)},get size(){return Cn(this)},has:Pn,add:En,set:In,delete:An,clear:jn,forEach:Rn(!1,!1)},t={get(e){return On(this,e,!1,!0)},get size(){return Cn(this)},has:Pn,add:En,set:In,delete:An,clear:jn,forEach:Rn(!1,!0)},n={get(e){return On(this,e,!0)},get size(){return Cn(this,!0)},has(e){return Pn.call(this,e,!0)},add:Tn("add"),set:Tn("set"),delete:Tn("delete"),clear:Tn("clear"),forEach:Rn(!0,!1)},o={get(e){return On(this,e,!0,!0)},get size(){return Cn(this,!0)},has(e){return Pn.call(this,e,!0)},add:Tn("add"),set:Tn("set"),delete:Tn("delete"),clear:Tn("clear"),forEach:Rn(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach((r=>{e[r]=Ln(r,!1,!1),n[r]=Ln(r,!0,!1),t[r]=Ln(r,!1,!0),o[r]=Ln(r,!0,!0)})),[e,n,t,o]}const[Vn,Dn,Hn,Nn]=Mn();function Bn(e,t){const n=t?e?Nn:Hn:e?Dn:Vn;return(t,o,r)=>"__v_isReactive"===o?!e:"__v_isReadonly"===o?e:"__v_raw"===o?t:Reflect.get(u(n,o)&&o in t?n:t,o,r)}const Un={get:Bn(!1,!1)},Wn={get:Bn(!1,!0)},zn={get:Bn(!0,!1)},Fn=new WeakMap,Kn=new WeakMap,qn=new WeakMap,Gn=new WeakMap;function Jn(e){return e.__v_skip||!Object.isExtensible(e)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((e=>x(e).slice(8,-1))(e))}function Zn(e){return eo(e)?e:Xn(e,!1,bn,Un,Fn)}function Qn(e){return Xn(e,!0,wn,zn,qn)}function Xn(e,t,n,o,r){if(!v(e))return e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;const s=r.get(e);if(s)return s;const i=Jn(e);if(0===i)return e;const c=new Proxy(e,2===i?o:n);return r.set(e,c),c}function Yn(e){return eo(e)?Yn(e.__v_raw):!(!e||!e.__v_isReactive)}function eo(e){return!(!e||!e.__v_isReadonly)}function to(e){return!(!e||!e.__v_isShallow)}function no(e){const t=e&&e.__v_raw;return t?no(t):e}function oo(e){return Object.isExtensible(e)&&((e,t,n)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})})(e,"__v_skip",!0),e}const ro=e=>v(e)?Zn(e):e,so=e=>v(e)?Qn(e):e;class io{constructor(e,t,n,o){this.getter=e,this._setter=t,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new Kt((()=>e(this._value)),(()=>ao(this,2===this.effect._dirtyLevel?2:3))),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=n}get value(){const e=no(this);return e._cacheable&&!e.effect.dirty||!A(e._value,e._value=e.effect.run())||ao(e,4),co(e),e.effect._dirtyLevel>=2&&ao(e,2),e._value}set value(e){this._setter(e)}get _dirty(){return this.effect.dirty}set _dirty(e){this.effect.dirty=e}}function co(e){var t;Zt&&zt&&(e=no(e),on(zt,null!=(t=e.dep)?t:e.dep=cn((()=>e.dep=void 0),e instanceof io?e:void 0)))}function ao(e,t=4,n){const o=(e=no(e)).dep;o&&sn(o,t)}function lo(e){return!(!e||!0!==e.__v_isRef)}function uo(e){return function(e,t){if(lo(e))return e;return new fo(e,t)}(e,!1)}class fo{constructor(e,t){this.__v_isShallow=t,this.dep=void 0,this.__v_isRef=!0,this._rawValue=t?e:no(e),this._value=t?e:ro(e)}get value(){return co(this),this._value}set value(e){const t=this.__v_isShallow||to(e)||eo(e);e=t?e:no(e),A(e,this._rawValue)&&(this._rawValue=e,this._value=t?e:ro(e),ao(this,4))}}function po(e){return lo(e)?e.value:e}const ho={get:(e,t,n)=>po(Reflect.get(e,t,n)),set:(e,t,n,o)=>{const r=e[t];return lo(r)&&!lo(n)?(r.value=n,!0):Reflect.set(e,t,n,o)}};function go(e){return Yn(e)?e:new Proxy(e,ho)}function mo(e,t,n,o){try{return o?e(...o):e()}catch(r){_o(r,t,n)}}function vo(e,t,n,o){if(h(e)){const r=mo(e,t,n,o);return r&&_(r)&&r.catch((e=>{_o(e,t,n)})),r}const r=[];for(let s=0;s>>1,r=wo[o],s=Lo(r);snull==e.id?1/0:e.id,To=(e,t)=>{const n=Lo(e)-Lo(t);if(0===n){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Mo(e){bo=!1,xo=!0,wo.sort(To);try{for($o=0;$oLo(e)-Lo(t)));if(So.length=0,ko)return void ko.push(...e);for(ko=e,Oo=0;Oog(e)?e.trim():e))),n&&(s=o.map(R))}let a,l=r[a=I(n)]||r[a=I(O(n))];!l&&i&&(l=r[a=I(C(n))]),l&&vo(l,e,6,s);const u=r[a+"Once"];if(u){if(e.emitted){if(e.emitted[a])return}else e.emitted={};e.emitted[a]=!0,vo(u,e,6,s)}}function Do(e,t,n=!1){const o=t.emitsCache,r=o.get(e);if(void 0!==r)return r;const s=e.emits;let i={},a=!1;if(!h(e)){const o=e=>{const n=Do(e,t,!0);n&&(a=!0,c(i,n))};!n&&t.mixins.length&&t.mixins.forEach(o),e.extends&&o(e.extends),e.mixins&&e.mixins.forEach(o)}return s||a?(f(s)?s.forEach((e=>i[e]=null)):c(i,s),v(e)&&o.set(e,i),i):(v(e)&&o.set(e,null),null)}function Ho(e,t){return!(!e||!s(t))&&(t=t.slice(2).replace(/Once$/,""),u(e,t[0].toLowerCase()+t.slice(1))||u(e,C(t))||u(e,t))}let No=null;function Bo(e){const t=No;return No=e,e&&e.type.__scopeId,t}const Uo={};function Wo(e,t,n){return zo(e,t,n)}function zo(e,n,{immediate:r,deep:s,flush:i,once:c,onTrack:l,onTrigger:u}=t){if(n&&c){const e=n;n=(...t)=>{e(...t),k()}}const p=zr,d=e=>!0===s?e:qo(e,!1===s?1:void 0);let g,m,v=!1,_=!1;if(lo(e)?(g=()=>e.value,v=to(e)):Yn(e)?(g=()=>d(e),v=!0):f(e)?(_=!0,v=e.some((e=>Yn(e)||to(e))),g=()=>e.map((e=>lo(e)?e.value:Yn(e)?d(e):h(e)?mo(e,p,2):void 0))):g=h(e)?n?()=>mo(e,p,2):()=>(m&&m(),vo(e,p,3,[y])):o,n&&s){const e=g;g=()=>qo(e())}let y=e=>{m=$.onStop=()=>{mo(e,p,4),m=$.onStop=void 0}},x=_?new Array(e.length).fill(Uo):Uo;const b=()=>{if($.active&&$.dirty)if(n){const e=$.run();(s||v||(_?e.some(((e,t)=>A(e,x[t]))):A(e,x)))&&(m&&m(),vo(n,p,3,[e,x===Uo?void 0:_&&x[0]===Uo?[]:x,y]),x=e)}else $.run()};let w;b.allowRecurse=!!n,"sync"===i?w=b:"post"===i?w=()=>Hr(b,p&&p.suspense):(b.pre=!0,p&&(b.id=p.uid),w=()=>Io(b));const $=new Kt(g,o,w),S=Wt,k=()=>{$.stop(),S&&a(S.effects,$)};return n?r?b():x=$.run():"post"===i?Hr($.run.bind($),p&&p.suspense):$.run(),k}function Fo(e,t,n){const o=this.proxy,r=g(e)?e.includes(".")?Ko(o,e):()=>o[e]:e.bind(o,o);let s;h(t)?s=t:(s=t.handler,n=t);const i=Gr(this),c=zo(r,s.bind(o),n);return i(),c}function Ko(e,t){const n=t.split(".");return()=>{let t=e;for(let e=0;e0){if(n>=t)return e;n++}if((o=o||new Set).has(e))return e;if(o.add(e),lo(e))qo(e.value,t,n,o);else if(f(e))for(let r=0;r{qo(e,t,n,o)}));else if(b(e))for(const r in e)qo(e[r],t,n,o);return e}function Go(){return{app:null,config:{isNativeTag:r,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Jo=0;let Zo=null;function Qo(e,t,n=!1){const o=zr||No;if(o||Zo){const r=o?null==o.parent?o.vnode.appContext&&o.vnode.appContext.provides:o.parent.provides:Zo._context.provides;if(r&&e in r)return r[e];if(arguments.length>1)return n&&h(t)?t.call(o&&o.proxy):t}}function Xo(e,t){er(e,"a",t)}function Yo(e,t){er(e,"da",t)}function er(e,t,n=zr){const o=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(nr(t,o,n),n){let e=n.parent;for(;e&&e.parent;)e.parent.vnode.type.__isKeepAlive&&tr(o,t,n,e),e=e.parent}}function tr(e,t,n,o){const r=nr(t,e,o,!0);lr((()=>{a(o[t],r)}),n)}function nr(e,t,n=zr,o=!1){if(n){(function(e){return W.indexOf(e)>-1})(e)&&(n=n.root);const r=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;Yt();const r=Gr(n),s=vo(t,n,e,o);return r(),en(),s});return o?r.unshift(s):r.push(s),s}}const or=e=>(t,n=zr)=>(!Qr||"sp"===e)&&nr(e,((...e)=>t(...e)),n),rr=or("bm"),sr=or("m"),ir=or("bu"),cr=or("u"),ar=or("bum"),lr=or("um"),ur=or("sp"),fr=or("rtg"),pr=or("rtc");function dr(e,t=zr){nr("ec",e,t)}const hr=e=>e?Zr(e)?es(e)||e.proxy:hr(e.parent):null;const gr=c(Object.create(null),{$:function(e){return e},$el:e=>e.__$el||(e.__$el={}),$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>hr(e.parent),$root:e=>hr(e.root),$emit:e=>e.emit,$options:e=>$r(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,Io(e.update)}),$watch:e=>Fo.bind(e)}),mr=(e,n)=>e!==t&&!e.__isScriptSetup&&u(e,n),vr={get({_:e},n){const{ctx:o,setupState:r,data:s,props:i,accessCache:c,type:a,appContext:l}=e;let f;if("$"!==n[0]){const a=c[n];if(void 0!==a)switch(a){case 1:return r[n];case 2:return s[n];case 4:return o[n];case 3:return i[n]}else{if(mr(r,n))return c[n]=1,r[n];if(s!==t&&u(s,n))return c[n]=2,s[n];if((f=e.propsOptions[0])&&u(f,n))return c[n]=3,i[n];if(o!==t&&u(o,n))return c[n]=4,o[n];yr&&(c[n]=0)}}const p=gr[n];let d,h;return p?("$attrs"===n&&fn(e,0,n),p(e)):(d=a.__cssModules)&&(d=d[n])?d:o!==t&&u(o,n)?(c[n]=4,o[n]):(h=l.config.globalProperties,u(h,n)?h[n]:void 0)},set({_:e},n,o){const{data:r,setupState:s,ctx:i}=e;return mr(s,n)?(s[n]=o,!0):r!==t&&u(r,n)?(r[n]=o,!0):!u(e.props,n)&&(("$"!==n[0]||!(n.slice(1)in e))&&(i[n]=o,!0))},has({_:{data:e,setupState:n,accessCache:o,ctx:r,appContext:s,propsOptions:i}},c){let a;return!!o[c]||e!==t&&u(e,c)||mr(n,c)||(a=i[0])&&u(a,c)||u(r,c)||u(gr,c)||u(s.config.globalProperties,c)},defineProperty(e,t,n){return null!=n.get?e._.accessCache[t]=0:u(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function _r(e){return f(e)?e.reduce(((e,t)=>(e[t]=null,e)),{}):e}let yr=!0;function xr(e){const t=$r(e),n=e.proxy,r=e.ctx;yr=!1,t.beforeCreate&&br(t.beforeCreate,e,"bc");const{data:s,computed:i,methods:c,watch:a,provide:l,inject:u,created:p,beforeMount:d,mounted:g,beforeUpdate:m,updated:_,activated:y,deactivated:x,beforeDestroy:b,beforeUnmount:w,destroyed:$,unmounted:S,render:k,renderTracked:O,renderTriggered:P,errorCaptured:C,serverPrefetch:E,expose:I,inheritAttrs:A,components:j,directives:R,filters:L}=t;if(u&&function(e,t,n=o){f(e)&&(e=Pr(e));for(const o in e){const n=e[o];let r;r=v(n)?"default"in n?Qo(n.from||o,n.default,!0):Qo(n.from||o):Qo(n),lo(r)?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>r.value,set:e=>r.value=e}):t[o]=r}}(u,r,null),c)for(const o in c){const e=c[o];h(e)&&(r[o]=e.bind(n))}if(s){const t=s.call(n,n);v(t)&&(e.data=Zn(t))}if(yr=!0,i)for(const f in i){const e=i[f],t=h(e)?e.bind(n,n):h(e.get)?e.get.bind(n,n):o,s=!h(e)&&h(e.set)?e.set.bind(n):o,c=ts({get:t,set:s});Object.defineProperty(r,f,{enumerable:!0,configurable:!0,get:()=>c.value,set:e=>c.value=e})}if(a)for(const o in a)wr(a[o],r,n,o);function T(e,t){f(t)?t.forEach((t=>e(t.bind(n)))):t&&e(t.bind(n))}if(function(){if(l){const e=h(l)?l.call(n):l;Reflect.ownKeys(e).forEach((t=>{!function(e,t){if(zr){let n=zr.provides;const o=zr.parent&&zr.parent.provides;o===n&&(n=zr.provides=Object.create(o)),n[e]=t,"app"===zr.type.mpType&&zr.appContext.app.provide(e,t)}}(t,e[t])}))}}(),p&&br(p,e,"c"),T(rr,d),T(sr,g),T(ir,m),T(cr,_),T(Xo,y),T(Yo,x),T(dr,C),T(pr,O),T(fr,P),T(ar,w),T(lr,S),T(ur,E),f(I))if(I.length){const t=e.exposed||(e.exposed={});I.forEach((e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t})}))}else e.exposed||(e.exposed={});k&&e.render===o&&(e.render=k),null!=A&&(e.inheritAttrs=A),j&&(e.components=j),R&&(e.directives=R),e.ctx.$onApplyOptions&&e.ctx.$onApplyOptions(t,e,n)}function br(e,t,n){vo(f(e)?e.map((e=>e.bind(t.proxy))):e.bind(t.proxy),t,n)}function wr(e,t,n,o){const r=o.includes(".")?Ko(n,o):()=>n[o];if(g(e)){const n=t[e];h(n)&&Wo(r,n)}else if(h(e))Wo(r,e.bind(n));else if(v(e))if(f(e))e.forEach((e=>wr(e,t,n,o)));else{const o=h(e.handler)?e.handler.bind(n):t[e.handler];h(o)&&Wo(r,o,e)}}function $r(e){const t=e.type,{mixins:n,extends:o}=t,{mixins:r,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,c=s.get(t);let a;return c?a=c:r.length||n||o?(a={},r.length&&r.forEach((e=>Sr(a,e,i,!0))),Sr(a,t,i)):a=t,v(t)&&s.set(t,a),a}function Sr(e,t,n,o=!1){const{mixins:r,extends:s}=t;s&&Sr(e,s,n,!0),r&&r.forEach((t=>Sr(e,t,n,!0)));for(const i in t)if(o&&"expose"===i);else{const o=kr[i]||n&&n[i];e[i]=o?o(e[i],t[i]):t[i]}return e}const kr={data:Or,props:Ir,emits:Ir,methods:Er,computed:Er,beforeCreate:Cr,created:Cr,beforeMount:Cr,mounted:Cr,beforeUpdate:Cr,updated:Cr,beforeDestroy:Cr,beforeUnmount:Cr,destroyed:Cr,unmounted:Cr,activated:Cr,deactivated:Cr,errorCaptured:Cr,serverPrefetch:Cr,components:Er,directives:Er,watch:function(e,t){if(!e)return t;if(!t)return e;const n=c(Object.create(null),e);for(const o in t)n[o]=Cr(e[o],t[o]);return n},provide:Or,inject:function(e,t){return Er(Pr(e),Pr(t))}};function Or(e,t){return t?e?function(){return c(h(e)?e.call(this,this):e,h(t)?t.call(this,this):t)}:t:e}function Pr(e){if(f(e)){const t={};for(let n=0;n{d=!0;const[t,n]=Lr(e,o,!0);c(l,t),n&&p.push(...n)};!r&&o.mixins.length&&o.mixins.forEach(t),e.extends&&t(e.extends),e.mixins&&e.mixins.forEach(t)}if(!a&&!d)return v(e)&&s.set(e,n),n;if(f(a))for(let n=0;n-1,o[1]=n<0||t-1||u(o,"default"))&&p.push(e)}}}const g=[l,p];return v(e)&&s.set(e,g),g}function Tr(e){return"$"!==e[0]&&!$(e)}function Mr(e){if(null===e)return"null";if("function"==typeof e)return e.name||"";if("object"==typeof e){return e.constructor&&e.constructor.name||""}return""}function Vr(e,t){return Mr(e)===Mr(t)}function Dr(e,t){return f(t)?t.findIndex((t=>Vr(t,e))):h(t)&&Vr(t,e)?0:-1}const Hr=jo;function Nr(e){return e?Yn(t=e)||eo(t)||"__vInternal"in e?c({},e):e:null;var t}const Br=Go();let Ur=0;function Wr(e,n,o){const r=e.type,s=(n?n.appContext:e.appContext)||Br,i={uid:Ur++,vnode:e,type:r,parent:n,appContext:s,root:null,next:null,subTree:null,effect:null,update:null,scope:new Ft(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:n?n.provides:Object.create(s.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:Lr(r,s),emitsOptions:Do(r,s),emit:null,emitted:null,propsDefaults:t,inheritAttrs:r.inheritAttrs,ctx:t,data:t,props:t,attrs:t,slots:t,refs:t,setupState:t,setupContext:null,attrsProxy:null,slotsProxy:null,suspense:o,suspenseId:o?o.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null,$uniElements:new Map,$templateUniElementRefs:[],$templateUniElementStyles:{},$eS:{},$eA:{}};return i.ctx={_:i},i.root=n?n.root:i,i.emit=Vo.bind(null,i),e.ce&&e.ce(i),i}let zr=null;const Fr=()=>zr||No;let Kr,qr;Kr=e=>{zr=e},qr=e=>{Qr=e};const Gr=e=>{const t=zr;return Kr(e),e.scope.on(),()=>{e.scope.off(),Kr(t)}},Jr=()=>{zr&&zr.scope.off(),Kr(null)};function Zr(e){return 4&e.vnode.shapeFlag}let Qr=!1;function Xr(e,t=!1){t&&qr(t);const{props:n}=e.vnode,o=Zr(e);Ar(e,n,o,t);const r=o?function(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=oo(new Proxy(e.ctx,vr));const{setup:o}=n;if(o){const t=e.setupContext=o.length>1?function(e){const t=t=>{e.exposed=t||{}};return{get attrs(){return function(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get:(t,n)=>(fn(e,0,"$attrs"),t[n])}))}(e)},slots:e.slots,emit:e.emit,expose:t}}(e):null,n=Gr(e);Yt();const r=mo(o,e,0,[e.props,t]);en(),n(),_(r)?r.then(Jr,Jr):function(e,t,n){h(t)?e.render=t:v(t)&&(e.setupState=go(t));Yr(e)}(e,r)}else Yr(e)}(e):void 0;return t&&qr(!1),r}function Yr(e,t,n){const r=e.type;e.render||(e.render=r.render||o);{const t=Gr(e);Yt();try{xr(e)}finally{en(),t()}}}function es(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(go(oo(e.exposed)),{get:(t,n)=>n in t?t[n]:e.proxy[n],has:(e,t)=>t in e||t in gr}))}const ts=(e,t)=>{const n=function(e,t,n=!1){let r,s;const i=h(e);return i?(r=e,s=o):(r=e.get,s=e.set),new io(r,s,i||!s,n)}(e,0,Qr);return n},ns="3.4.21";function os(e){return po(e)}const rs="[object Array]",ss="[object Object]";function is(e,t){const n={};return cs(e,t),as(e,t,"",n),n}function cs(e,t){if((e=os(e))===t)return;const n=x(e),o=x(t);if(n==ss&&o==ss)for(let r in t){const n=e[r];void 0===n?e[r]=null:cs(n,t[r])}else n==rs&&o==rs&&e.length>=t.length&&t.forEach(((t,n)=>{cs(e[n],t)}))}function as(e,t,n,o){if((e=os(e))===t)return;const r=x(e),s=x(t);if(r==ss)if(s!=ss||Object.keys(e).length{as(e,s[t],(""==n?"":n+".")+i+"["+t+"]",o)}));else if(c==ss)if(a!=ss||Object.keys(r).length{as(e,t[r],n+"["+r+"]",o)})):ls(o,n,e)}function ls(e,t,n){e[t]=n}function us(e){const t=e.ctx.__next_tick_callbacks;if(t&&t.length){const e=t.slice(0);t.length=0;for(let t=0;t{t?mo(t.bind(e.proxy),e,14):o&&o(e.proxy)})),new Promise((e=>{o=e}))}function ps(e,t){const n=typeof(e=os(e));if("object"===n&&null!==e){let n=t.get(e);if(void 0!==n)return n;if(f(e)){const o=e.length;n=new Array(o),t.set(e,n);for(let r=0;r{o[e]=n[e]})),o}(r,s));Object.keys(i).length?(o.__next_tick_pending=!0,r.setData(i,(()=>{o.__next_tick_pending=!1,us(e)})),Ro()):us(e)}}function gs(e,t,n){t.appContext.config.globalProperties.$applyOptions(e,t,n);const o=e.computed;if(o){const e=Object.keys(o);if(e.length){const n=t.ctx;n.$computedKeys||(n.$computedKeys=[]),n.$computedKeys.push(...e)}}delete t.ctx.$onApplyOptions}function ms(e,t=!1){const{setupState:n,$templateRefs:o,$templateUniElementRefs:r,ctx:{$scope:s,$mpPlatform:i}}=e;if("mp-alipay"===i)return;if(!s||!o&&!r)return;if(t)return o&&o.forEach((e=>vs(e,null,n))),void(r&&r.forEach((e=>vs(e,null,n))));const c="mp-baidu"===i||"mp-toutiao"===i,a=e=>{if(0===e.length)return[];const t=(s.selectAllComponents(".r")||[]).concat(s.selectAllComponents(".r-i-f")||[]);return e.filter((e=>{const o=function(e,t){const n=e.find((e=>e&&(e.properties||e.props).uI===t));if(n){const e=n.$vm;return e?es(e.$)||e:function(e){v(e)&&oo(e);return e}(n)}return null}(t,e.i);return!(!c||null!==o)||(vs(e,o,n),!1)}))},l=()=>{if(o){const t=a(o);t.length&&e.proxy&&e.proxy.$scope&&e.proxy.$scope.setData({r1:1},(()=>{a(t)}))}};r&&r.length&&fs(e,(()=>{r.forEach((e=>{f(e.v)?e.v.forEach((t=>{vs(e,t,n)})):vs(e,e.v,n)}))})),s._$setRef?s._$setRef(l):fs(e,l)}function vs({r:e,f:t},n,o){if(h(e))e(n,{});else{const r=g(e),s=lo(e);if(r||s)if(t){if(!s)return;f(e.value)||(e.value=[]);const t=e.value;if(-1===t.indexOf(n)){if(t.push(n),!n)return;n.$&&ar((()=>a(t,n)),n.$)}}else r?u(o,e)&&(o[e]=n):lo(e)&&(e.value=n)}}const _s=jo;function ys(e,t){const n=e.component=Wr(e,t.parentComponent,null);return n.renderer=t.mpType?t.mpType:"component",n.ctx.$onApplyOptions=gs,n.ctx.$children=[],"app"===t.mpType&&(n.render=o),t.onBeforeSetup&&t.onBeforeSetup(n,t),Xr(n),t.parentComponent&&n.proxy&&t.parentComponent.ctx.$children.push(es(n)||n.proxy),function(e){const t=ws.bind(e);e.$updateScopedSlots=()=>Eo((()=>Io(t)));const n=()=>{if(e.isMounted){const{next:t,bu:n,u:o}=e;$s(e,!1),Yt(),Ro(),en(),n&&j(n),$s(e,!0),hs(e,xs(e)),o&&_s(o)}else ar((()=>{ms(e,!0)}),e),hs(e,xs(e))},r=e.effect=new Kt(n,o,(()=>Io(s)),e.scope),s=e.update=()=>{r.dirty&&r.run()};s.id=e.uid,$s(e,!0),s()}(n),n.proxy}function xs(e){const{type:t,vnode:n,proxy:o,withProxy:r,props:i,propsOptions:[c],slots:a,attrs:l,emit:u,render:f,renderCache:p,data:d,setupState:h,ctx:g,uid:m,appContext:{app:{config:{globalProperties:{pruneComponentPropsCache:v}}}},inheritAttrs:_}=e;let y;e.$uniElementIds=new Map,e.$templateRefs=[],e.$templateUniElementRefs=[],e.$templateUniElementStyles={},e.$ei=0,v(m),e.__counter=0===e.__counter?1:0;const x=Bo(e);try{if(4&n.shapeFlag){bs(_,i,c,l);const e=r||o;y=f.call(e,e,p,i,h,d,g)}else{bs(_,i,c,t.props?l:(e=>{let t;for(const n in e)("class"===n||"style"===n||s(n))&&((t||(t={}))[n]=e[n]);return t})(l));const e=t;y=e.length>1?e(i,{attrs:l,slots:a,emit:u}):e(i,null)}}catch(b){_o(b,e,1),y=!1}return ms(e),Bo(x),y}function bs(e,t,n,o){if(t&&o&&!1!==e){const e=Object.keys(o).filter((e=>"class"!==e&&"style"!==e));if(!e.length)return;n&&e.some(i)?e.forEach((e=>{i(e)&&e.slice(9)in n||(t[e]=o[e])})):e.forEach((e=>t[e]=o[e]))}}function ws(){const e=this.$scopedSlotsData;if(!e||0===e.length)return;const t=this.ctx.$scope,n=t.data,o=Object.create(null);e.forEach((({path:e,index:t,data:r})=>{const s=D(n,e),i=g(t)?`${e}.${t}`:`${e}[${t}]`;if(void 0===s||void 0===s[t])o[i]=r;else{const e=is(r,s[t]);Object.keys(e).forEach((t=>{o[i+"."+t]=e[t]}))}})),e.length=0,Object.keys(o).length&&t.setData(o)}function $s({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}const Ss=function(e,t=null){h(e)||(e=c({},e)),null==t||v(t)||(t=null);const n=Go(),o=new WeakSet,r=n.app={_uid:Jo++,_component:e,_props:t,_container:null,_context:n,_instance:null,version:ns,get config(){return n.config},set config(e){},use:(e,...t)=>(o.has(e)||(e&&h(e.install)?(o.add(e),e.install(r,...t)):h(e)&&(o.add(e),e(r,...t))),r),mixin:e=>(n.mixins.includes(e)||n.mixins.push(e),r),component:(e,t)=>t?(n.components[e]=t,r):n.components[e],directive:(e,t)=>t?(n.directives[e]=t,r):n.directives[e],mount(){},unmount(){},provide:(e,t)=>(n.provides[e]=t,r),runWithContext(e){const t=Zo;Zo=r;try{return e()}finally{Zo=t}}};return r};function ks(e,t=null){("undefined"!=typeof window?window:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof global?global:"undefined"!=typeof my?my:void 0).__VUE__=!0;const n=Ss(e,t),r=n._context;r.config.globalProperties.$nextTick=function(e){return fs(this.$,e)};const s=e=>(e.appContext=r,e.shapeFlag=6,e),i=function(e,t){return ys(s(e),t)},c=function(e){return e&&function(e){const{bum:t,scope:n,update:o,um:r}=e;t&&j(t);{const t=e.parent;if(t){const n=t.ctx.$children,o=es(e)||e.proxy,r=n.indexOf(o);r>-1&&n.splice(r,1)}}n.stop(),o&&(o.active=!1),r&&_s(r),_s((()=>{e.isUnmounted=!0}))}(e.$)};return n.mount=function(){e.render=o;const t=ys(s({type:e}),{mpType:"app",mpInstance:null,parentComponent:null,slots:[],props:null});return n._instance=t.$,t.$app=n,t.$createComponent=i,t.$destroyComponent=c,r.$appInstance=t,t},n.unmount=function(){},n}function Os(e,t,n,o){h(t)&&nr(e,t.bind(n),o)}function Ps(e,t,n){!function(e,t,n){const o=e.mpType||n.$mpType;!o||"component"===o||"page"===o&&"component"===t.renderer||Object.keys(e).forEach((o=>{if(K(o,e[o],!1)){const r=e[o];f(r)?r.forEach((e=>Os(o,e,n,t))):Os(o,r,n,t)}}))}(e,t,n)}function Cs(e,t,n){return e[t]=n}function Es(e,...t){const n=this[e];return n?n(...t):(console.error(`method ${e} not found`),null)}function Is(e){const t=e.config.errorHandler;return function(n,o,r){t&&t(n,o,r);const s=e._instance;if(!s||!s.proxy)throw n;s.onError?s.proxy.$callHook("onError",n):yo(n,0,o&&o.$.vnode,!1)}}function As(e,t){return e?[...new Set([].concat(e,t))]:t}let js;const Rs="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",Ls=/^(?:[A-Za-z\d+/]{4})*?(?:[A-Za-z\d+/]{2}(?:==)?|[A-Za-z\d+/]{3}=?)?$/;function Ts(){const e=Ut.getStorageSync("uni_id_token")||"",t=e.split(".");if(!e||3!==t.length)return{uid:null,role:[],permission:[],tokenExpired:0};let n;try{n=JSON.parse((o=t[1],decodeURIComponent(js(o).split("").map((function(e){return"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)})).join(""))))}catch(r){throw new Error("获取当前用户信息出错,详细错误信息为:"+r.message)}var o;return n.tokenExpired=1e3*n.exp,delete n.exp,delete n.iat,n}function Ms(e){const t=e.config;var n;t.errorHandler=J(e,Is),n=t.optionMergeStrategies,z.forEach((e=>{n[e]=As}));const o=t.globalProperties;!function(e){e.uniIDHasRole=function(e){const{role:t}=Ts();return t.indexOf(e)>-1},e.uniIDHasPermission=function(e){const{permission:t}=Ts();return this.uniIDHasRole("admin")||t.indexOf(e)>-1},e.uniIDTokenValid=function(){const{tokenExpired:e}=Ts();return e>Date.now()}}(o),o.$set=Cs,o.$applyOptions=Ps,o.$callMethod=Es,Ut.invokeCreateVueAppHook(e)}js="function"!=typeof atob?function(e){if(e=String(e).replace(/[\t\n\f\r ]+/g,""),!Ls.test(e))throw new Error("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.");var t;e+="==".slice(2-(3&e.length));for(var n,o,r="",s=0;s>16&255):64===o?String.fromCharCode(t>>16&255,t>>8&255):String.fromCharCode(t>>16&255,t>>8&255,255&t);return r}:atob;const Vs=Object.create(null);function Ds(e){delete Vs[e]}function Hs(e){if(!e)return;const[t,n]=e.split(",");return Vs[t]?Vs[t][parseInt(n)]:void 0}var Ns={install(e){Ms(e),e.config.globalProperties.pruneComponentPropsCache=Ds;const t=e.mount;e.mount=function(n){const o=t.call(e,n),r=function(){const e="createApp";if("undefined"!=typeof global&&void 0!==global[e])return global[e];if("undefined"!=typeof my)return my[e]}();return r?r(o):"undefined"!=typeof createMiniProgramApp&&createMiniProgramApp(o),o}}};function Bs(e,t){const n=Fr(),r=n.ctx,s=void 0===t||"mp-weixin"!==r.$mpPlatform&&"mp-qq"!==r.$mpPlatform&&"mp-xhs"!==r.$mpPlatform||!g(t)&&"number"!=typeof t?"":"_"+t,i="e"+n.$ei+++s,a=r.$scope;if(!e)return delete a[i],i;const l=a[i];return l?l.value=e:a[i]=function(e,t){const n=e=>{var r;(r=e).type&&r.target&&(r.preventDefault=o,r.stopPropagation=o,r.stopImmediatePropagation=o,u(r,"detail")||(r.detail={}),u(r,"markerId")&&(r.detail="object"==typeof r.detail?r.detail:{},r.detail.markerId=r.markerId),b(r.detail)&&u(r.detail,"checked")&&!u(r.detail,"value")&&(r.detail.value=r.detail.checked),b(r.detail)&&(r.target=c({},r.target,r.detail)));let s=[e];t&&t.ctx.$getTriggerEventDetail&&"number"==typeof e.detail&&(e.detail=t.ctx.$getTriggerEventDetail(e.detail)),e.detail&&e.detail.__args__&&(s=e.detail.__args__);const i=n.value,a=()=>vo(function(e,t){if(f(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n&&n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e(t)))}return t}(e,i),t,5,s),l=e.target,p=!!l&&(!!l.dataset&&"true"===String(l.dataset.eventsync));if(!Us.includes(e.type)||p){const t=a();if("input"===e.type&&(f(t)||_(t)))return;return t}setTimeout(a)};return n.value=e,n}(e,n),i}const Us=["tap","longpress","longtap","transitionend","animationstart","animationiteration","animationend","touchforcechange"];const Ws=function(e,t=null){return e&&(e.mpType="app"),ks(e,t).use(Ns)};const zs=["externalClasses"];const Fs=/_(.*)_worklet_factory_/;function Ks(e,t){const n=e.$children;for(let r=n.length-1;r>=0;r--){const e=n[r];if(e.$scope._$vueId===t)return e}let o;for(let r=n.length-1;r>=0;r--)if(o=Ks(n[r],t),o)return o}const qs=["createSelectorQuery","createIntersectionObserver","selectAllComponents","selectComponent"];function Gs(e,t){const n=e.ctx;n.mpType=t.mpType,n.$mpType=t.mpType,n.$mpPlatform="mp-weixin",n.$scope=t.mpInstance,Object.defineProperties(n,{virtualHostId:{get(){const e=this.$scope.data.virtualHostId;return void 0===e?"":e}}}),n.$mp={},n._self={},e.slots={},f(t.slots)&&t.slots.length&&(t.slots.forEach((t=>{e.slots[t]=!0})),e.slots.d&&(e.slots.default=!0)),n.getOpenerEventChannel=function(){return t.mpInstance.getOpenerEventChannel()},n.$hasHook=Js,n.$callHook=Zs,e.emit=function(e,t){return function(n,...o){const r=t.$scope;if(r&&n){const e={__args__:o};r.triggerEvent(n,e)}return e.apply(this,[n,...o])}}(e.emit,n)}function Js(e){const t=this.$[e];return!(!t||!t.length)}function Zs(e,t){"mounted"===e&&(Zs.call(this,"bm"),this.$.isMounted=!0,e="m");const n=this.$[e];return n&&((e,t)=>{let n;for(let o=0;o{K(n,e[n])&&t.add(n)}));{const{extends:n,mixins:o}=e;o&&o.forEach((e=>Xs(e,t))),n&&Xs(n,t)}}return t}function Ys(e,t,n){-1!==n.indexOf(t)||u(e,t)||(e[t]=function(e){return this.$vm&&this.$vm.$callHook(t,e)})}const ei=["onReady"];function ti(e,t,n=ei){t.forEach((t=>Ys(e,t,n)))}function ni(e,t,n=ei){Xs(t).forEach((t=>Ys(e,t,n)))}const oi=V((()=>{const e=[],t=h(getApp)&&getApp({allowDefault:!0});if(t&&t.$vm&&t.$vm.$){const n=t.$vm.$.appContext.mixins;if(f(n)){const t=Object.keys(F);n.forEach((n=>{t.forEach((t=>{u(n,t)&&!e.includes(t)&&e.push(t)}))}))}}return e}));const ri=["onShow","onHide","onError","onThemeChange","onPageNotFound","onUnhandledRejection"];function si(e,t){const n=e.$,o={globalData:e.$options&&e.$options.globalData||{},$vm:e,onLaunch(t){this.$vm=e;const o=n.ctx;this.$vm&&o.$scope&&o.$callHook||(Gs(n,{mpType:"app",mpInstance:this,slots:[]}),o.globalData=this.globalData,e.$callHook("onLaunch",t))}},r=wx.$onErrorHandlers;r&&(r.forEach((e=>{nr("onError",e,n)})),r.length=0),function(e){const t=uo(function(){var e;let t="";{const n=(null===(e=wx.getAppBaseInfo)||void 0===e?void 0:e.call(wx))||wx.getSystemInfoSync();t=X(n&&n.language?n.language:"en")||"en"}return t}());Object.defineProperty(e,"$locale",{get:()=>t.value,set(e){t.value=e}})}(e);const s=e.$.type;ti(o,ri),ni(o,s);{const e=s.methods;e&&c(o,e)}return o}function ii(e,t){if(h(e.onLaunch)){const t=wx.getLaunchOptionsSync&&wx.getLaunchOptionsSync();e.onLaunch(t)}h(e.onShow)&&wx.onAppShow&&wx.onAppShow((e=>{t.$callHook("onShow",e)})),h(e.onHide)&&wx.onAppHide&&wx.onAppHide((e=>{t.$callHook("onHide",e)}))}const ci=["eO","uR","uRIF","uI","uT","uP","uS"];function ai(e){e.properties||(e.properties={}),c(e.properties,function(e,t=!1){const n={};if(!t){let e=function(e){const t=Object.create(null);e&&e.forEach((e=>{t[e]=!0})),this.setData({$slots:t})};ci.forEach((e=>{n[e]={type:null,value:""}})),n.uS={type:null,value:[]},n.uS.observer=e}return e.behaviors&&e.behaviors.includes("wx://form-field")&&(e.properties&&e.properties.name||(n.name={type:null,value:""}),e.properties&&e.properties.value||(n.value={type:null,value:""})),n}(e),function(e){const t={};return e&&e.virtualHost&&(t.virtualHostStyle={type:null,value:""},t.virtualHostClass={type:null,value:""},t.virtualHostHidden={type:null,value:""},t.virtualHostId={type:null,value:""}),t}(e.options))}const li=[String,Number,Boolean,Object,Array,null];function ui(e,t){const n=function(e,t){return f(e)&&1===e.length?e[0]:e}(e);return-1!==li.indexOf(n)?n:null}function fi(e,t){return(t?function(e){const t={};b(e)&&Object.keys(e).forEach((n=>{-1===ci.indexOf(n)&&(t[n]=e[n])}));return t}(e):Hs(e.uP))||{}}function pi(e){const t=function(){const e=this.properties.uP;e&&(this.$vm?function(e,t){const n=no(t.props),o=Hs(e)||{};di(n,o)&&(!function(e,t,n,o){const{props:r,attrs:s,vnode:{patchFlag:i}}=e,c=no(r),[a]=e.propsOptions;let l=!1;if(!(o||i>0)||16&i){let o;jr(e,t,r,s)&&(l=!0);for(const s in c)t&&(u(t,s)||(o=C(s))!==s&&u(t,o))||(a?!n||void 0===n[s]&&void 0===n[o]||(r[s]=Rr(a,c,s,void 0,e,!0)):delete r[s]);if(s!==c)for(const e in s)t&&u(t,e)||(delete s[e],l=!0)}else if(8&i){const n=e.vnode.dynamicProps;for(let o=0;o-1&&function(e){const t=wo.indexOf(e);t>$o&&wo.splice(t,1)}(t.update),t.update());var r}(e,this.$vm.$):"m"===this.properties.uT&&function(e,t){const n=t.properties,o=Hs(e)||{};di(n,o,!1)&&t.setData(o)}(e,this))};e.observers||(e.observers={}),e.observers.uP=t}function di(e,t,n=!0){const o=Object.keys(t);if(n&&o.length!==Object.keys(e).length)return!0;for(let r=0;r{o.push(e.replace("uni://","wx://")),"uni://form-field"===e&&(f(n)?(n.push("name"),n.push("modelValue")):(n.name={type:String,default:""},n.modelValue={type:[String,Number,Boolean,Array,Object,Date],default:""}))})),o}(t)}function gi(e,{parse:t,mocks:n,isPage:o,isPageInProject:r,initRelation:s,handleLink:i,initLifetimes:a}){e=e.default||e;const l={multipleSlots:!0,addGlobalClass:!0,pureDataPattern:/^uP$/};f(e.mixins)&&e.mixins.forEach((e=>{v(e.options)&&c(l,e.options)})),e.options&&c(l,e.options);const p={options:l,lifetimes:a({mocks:n,isPage:o,initRelation:s,vueOptions:e}),pageLifetimes:{show(){this.$vm&&this.$vm.$callHook("onPageShow")},hide(){this.$vm&&this.$vm.$callHook("onPageHide")},resize(e){this.$vm&&this.$vm.$callHook("onPageResize",e)}},methods:{__l:i}};var d,h,g,m;return hi(p,e),ai(p),pi(p),function(e,t){zs.forEach((n=>{u(t,n)&&(e[n]=t[n])}))}(p,e),d=p.methods,h=e.wxsCallMethods,f(h)&&h.forEach((e=>{d[e]=function(t){return this.$vm[e](t)}})),g=p.methods,(m=e.methods)&&Object.keys(m).forEach((e=>{const t=e.match(Fs);if(t){const n=t[1];g[e]=m[e],g[n]=m[n]}})),t&&t(p,{handleLink:i}),p}let mi,vi;function _i(){return getApp().$vm}function yi(e,t){const{parse:n,mocks:o,isPage:r,initRelation:s,handleLink:i,initLifetimes:c}=t,a=gi(e,{mocks:o,isPage:r,isPageInProject:!0,initRelation:s,handleLink:i,initLifetimes:c});!function({properties:e},t){f(t)?t.forEach((t=>{e[t]={type:String,value:""}})):b(t)&&Object.keys(t).forEach((n=>{const o=t[n];if(b(o)){let t=o.default;h(t)&&(t=t());const r=o.type;o.type=ui(r),e[n]={type:o.type,value:t}}else e[n]={type:ui(o)}}))}(a,(e.default||e).props);const l=a.methods;return l.onLoad=function(e){var t;return this.options=e,this.$page={fullPath:(t=this.route+U(e),function(e){return 0===e.indexOf("/")}(t)?t:"/"+t)},this.$vm&&this.$vm.$callHook("onLoad",e)},ti(l,Qs),ni(l,e),function(e,t){if(!t)return;Object.keys(F).forEach((n=>{t&F[n]&&Ys(e,n,[])}))}(l,e.__runtimeHooks),ti(l,oi()),n&&n(a,{handleLink:i}),a}const xi=Page,bi=Component;function wi(e){const t=e.triggerEvent,n=function(n,...o){return t.apply(e,[(r=n,O(r.replace(N,"-"))),...o]);var r};try{e.triggerEvent=n}catch(o){e._triggerEvent=n}}function $i(e,t,n){const o=t[e];t[e]=o?function(...e){return wi(this),o.apply(this,e)}:function(){wi(this)}}Page=function(e){return $i("onLoad",e),xi(e)},Component=function(e){$i("created",e);return e.properties&&e.properties.uP||(ai(e),pi(e)),bi(e)};var Si=Object.freeze({__proto__:null,handleLink:function(e){const t=e.detail||e.value,n=t.vuePid;let o;n&&(o=Ks(this.$vm,n)),o||(o=this.$vm),t.parent=o},initLifetimes:function({mocks:e,isPage:t,initRelation:n,vueOptions:o}){return{attached(){let r=this.properties;!function(e,t){if(!e)return;const n=e.split(","),o=n.length;1===o?t._$vueId=n[0]:2===o&&(t._$vueId=n[0],t._$vuePid=n[1])}(r.uI,this);const s={vuePid:this._$vuePid};n(this,s);const i=this,c=t(i);let a=r;this.$vm=function(e,t){mi||(mi=_i().$createComponent);const n=mi(e,t);return es(n.$)||n}({type:o,props:fi(a,c)},{mpType:c?"page":"component",mpInstance:i,slots:r.uS||{},parentComponent:s.parent&&s.parent.$,onBeforeSetup(t,n){!function(e,t){Object.defineProperty(e,"refs",{get(){const e={};return function(e,t,n){e.selectAllComponents(t).forEach((e=>{const t=e.properties.uR;n[t]=e.$vm||e}))}(t,".r",e),t.selectAllComponents(".r-i-f").forEach((t=>{const n=t.properties.uR;n&&(e[n]||(e[n]=[]),e[n].push(t.$vm||t))})),e}})}(t,i),function(e,t,n){const o=e.ctx;n.forEach((n=>{u(t,n)&&(e[n]=o[n]=t[n])}))}(t,i,e),function(e,t){Gs(e,t);const n=e.ctx;qs.forEach((e=>{n[e]=function(...t){const o=n.$scope;if(o&&o[e])return o[e].apply(o,t)}}))}(t,n)}}),c||function(e){const t=e.$options;f(t.behaviors)&&t.behaviors.includes("uni://form-field")&&e.$watch("modelValue",(()=>{e.$scope&&e.$scope.setData({name:e.name,value:e.modelValue})}),{immediate:!0})}(this.$vm)},ready(){this.$vm&&(this.$vm.$callHook("mounted"),this.$vm.$callHook("onReady"))},detached(){var e;this.$vm&&(Ds(this.$vm.$.uid),e=this.$vm,vi||(vi=_i().$destroyComponent),vi(e))}}},initRelation:function(e,t){e.triggerEvent("__l",t)},isPage:function(e){return!!e.route},mocks:["__route__","__wxExparserNodeId__","__wxWebviewId__"]});const ki=function(e){return App(si(e))},Oi=(Pi=Si,function(e){return Component(yi(e,Pi))});var Pi;const Ci=function(e){return function(t){return Component(gi(t,e))}}(Si),Ei=function(e){ii(si(e),e)},Ii=function(e){const t=si(e),n=h(getApp)&&getApp({allowDefault:!0});if(!n)return;e.$.ctx.$scope=n;const o=n.globalData;o&&Object.keys(t.globalData).forEach((e=>{u(o,e)||(o[e]=t.globalData[e])})),Object.keys(t).forEach((e=>{u(n,e)||(n[e]=t[e])})),ii(t,e)};!function(){if(h(wx.preloadAssets)){const e=String.fromCharCode(99,100,110,49,46,100,99,108,111,117,100,46,110,101,116,46,99,110);setTimeout((()=>{wx.preloadAssets({data:[{type:"image",src:"https://"+e+"/4f446b344f5546434e79556c6433673459546b794f474a694f47457a4f54513159544532/img/shadow-grey.png"}]})}),3e3)}}(),wx.createApp=global.createApp=ki,wx.createPage=Oi,wx.createComponent=Ci,wx.createPluginApp=global.createPluginApp=Ei,wx.createSubpackageApp=global.createSubpackageApp=Ii;const Ai=(e,t=0)=>(t,n=Fr())=>{!Qr&&nr(e,t,n)},ji=Ai("onShow",3),Ri=Ai("onLoad",2),Li=Ai("onPullDownRefresh",2),Ti=Ai("onShareAppMessage",2);exports._export_sfc=(e,t)=>{const n=e.__vccOpts||e;for(const[o,r]of t)n[o]=r;return n},exports.computed=ts,exports.createSSRApp=Ws,exports.e=(e,...t)=>c(e,...t),exports.f=(e,t)=>function(e,t){let n;if(f(e)||g(e)){n=new Array(e.length);for(let o=0,r=e.length;ot(e,n,n)));else{const o=Object.keys(e);n=new Array(o.length);for(let r=0,s=o.length;rL(e),exports.o=(e,t)=>Bs(e,t),exports.onLoad=Ri,exports.onPullDownRefresh=Li,exports.onShareAppMessage=Ti,exports.onShow=ji,exports.p=e=>function(e){const{uid:t,__counter:n}=Fr();return t+","+((Vs[t]||(Vs[t]=[])).push(Nr(e))-1)+","+n}(e),exports.reactive=Zn,exports.ref=uo,exports.t=e=>(e=>g(e)?e:null==e?"":f(e)||v(e)&&(e.toString===y||!h(e.toString))?JSON.stringify(e,T,2):String(e))(e),exports.unref=po,exports.watch=Wo,exports.wx$1=Bt; diff --git a/uniapp/unpackage/dist/build/mp-weixin/components/AppTabBar.js b/uniapp/unpackage/dist/build/mp-weixin/components/AppTabBar.js new file mode 100644 index 0000000..6b63149 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/components/AppTabBar.js @@ -0,0 +1 @@ +"use strict";const e=require("../common/vendor.js"),t={__name:"AppTabBar",props:{current:{type:String,default:"home"}},setup(t){const a=t,o=[{id:"home",label:"首页",path:"/pages/home/index",color:"#1f6f5f"},{id:"bills",label:"账单",path:"/pages/bills/index",color:"#d36c43"},{id:"budget",label:"预算",path:"/pages/budget/index",color:"#5f8df5"},{id:"stats",label:"报表",path:"/pages/stats/index",color:"#7f56d9"},{id:"mine",label:"我的",path:"/pages/mine/index",color:"#44546a"}];return(r,d)=>({a:e.f(o,((o,r,d)=>({a:t.current===o.id?o.color:"var(--line-soft)",b:e.t(o.label),c:o.id,d:t.current===o.id?1:"",e:e.o((t=>function(t){t.id!==a.current&&e.index.redirectTo({url:t.path})}(o)),o.id)})))})}},a=e._export_sfc(t,[["__scopeId","data-v-c3788da6"]]);wx.createComponent(a); diff --git a/uniapp/unpackage/dist/build/mp-weixin/components/AppTabBar.json b/uniapp/unpackage/dist/build/mp-weixin/components/AppTabBar.json new file mode 100644 index 0000000..e8cfaaf --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/components/AppTabBar.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/components/AppTabBar.wxml b/uniapp/unpackage/dist/build/mp-weixin/components/AppTabBar.wxml new file mode 100644 index 0000000..976b378 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/components/AppTabBar.wxml @@ -0,0 +1 @@ +{{item.b}} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/components/AppTabBar.wxss b/uniapp/unpackage/dist/build/mp-weixin/components/AppTabBar.wxss new file mode 100644 index 0000000..cdbecc2 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/components/AppTabBar.wxss @@ -0,0 +1 @@ +.tabbar.data-v-c3788da6{position:fixed;left:24rpx;right:24rpx;bottom:24rpx;display:flex;align-items:center;justify-content:space-between;padding:18rpx 12rpx env(safe-area-inset-bottom);z-index:20}.tab-item.data-v-c3788da6{flex:1;display:flex;flex-direction:column;align-items:center;gap:10rpx;padding:14rpx 0;border-radius:22rpx}.tab-item.active.data-v-c3788da6{background:var(--brand-soft)}.tab-dot.data-v-c3788da6{width:18rpx;height:18rpx;border-radius:50%}.tab-label.data-v-c3788da6{font-size:22rpx;color:var(--text-secondary)}.tab-item.active .tab-label.data-v-c3788da6{color:var(--text-primary);font-weight:600} diff --git a/uniapp/unpackage/dist/build/mp-weixin/components/BillEditorPopup.js b/uniapp/unpackage/dist/build/mp-weixin/components/BillEditorPopup.js new file mode 100644 index 0000000..158026d --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/components/BillEditorPopup.js @@ -0,0 +1 @@ +"use strict";const e=require("../common/vendor.js"),t=require("../utils/date.js"),a={__name:"BillEditorPopup",props:{visible:{type:Boolean,default:!1},entry:{type:Object,default:null},categories:{type:Object,required:!0},accounts:{type:Array,required:!0},defaultType:{type:String,default:"expense"},initialCategoryId:{type:String,default:""}},emits:["close","save"],setup(a,{emit:o}){const d=a,i=o,c=[{label:"支出",value:"expense"},{label:"收入",value:"income"}],n=e.reactive({id:"",type:"expense",amount:"",categoryId:"",accountId:"",date:t.toDateKey(),note:"",createdAt:0}),l=e.computed((()=>d.categories[n.type]||[]));function u(e){n.date=e.detail.value}function r(){Number(n.amount)?n.categoryId&&n.accountId?(i("save",{id:n.id,type:n.type,amount:Number(n.amount),categoryId:n.categoryId,accountId:n.accountId,date:n.date,note:n.note.trim(),createdAt:n.createdAt}),i("close")):e.index.showToast({title:"请选择分类和账户",icon:"none"}):e.index.showToast({title:"请输入有效金额",icon:"none"})}return e.watch((()=>d.visible),(e=>{e&&function(){var e,a,o;const i=d.entry||{},c=i.type||d.defaultType||"expense",l=d.initialCategoryId&&(d.categories[c]||[]).some((e=>e.id===d.initialCategoryId))?d.initialCategoryId:(null==(a=null==(e=d.categories[c])?void 0:e[0])?void 0:a.id)||"";n.id=i.id||"",n.type=c,n.amount=i.amount?String(i.amount):"",n.categoryId=i.categoryId||l,n.accountId=i.accountId||(null==(o=d.accounts[0])?void 0:o.id)||"",n.date=i.date||t.toDateKey(),n.note=i.note||"",n.createdAt=i.createdAt||0}()}),{immediate:!0}),e.watch((()=>n.type),(e=>{const t=(d.categories[e]||[]).map((e=>e.id));t.includes(n.categoryId)||(n.categoryId=t[0]||"")})),(t,o)=>e.e({a:a.visible},a.visible?{b:e.o((e=>i("close"))),c:e.t(n.id?"编辑账单":"新增账单"),d:e.o((e=>i("close"))),e:e.f(c,((t,a,o)=>({a:e.t(t.label),b:t.value,c:n.type===t.value?1:"",d:e.o((e=>n.type=t.value),t.value)}))),f:n.amount,g:e.o((e=>n.amount=e.detail.value)),h:e.f(l.value,((t,a,o)=>({a:t.color,b:e.t(t.name),c:t.id,d:n.categoryId===t.id?1:"",e:e.o((e=>n.categoryId=t.id),t.id)}))),i:e.f(a.accounts,((t,a,o)=>({a:t.color,b:e.t(t.name),c:t.id,d:n.accountId===t.id?1:"",e:e.o((e=>n.accountId=t.id),t.id)}))),j:e.t(n.date),k:n.date,l:e.o(u),m:n.note,n:e.o((e=>n.note=e.detail.value)),o:e.o((e=>i("close"))),p:e.o(r),q:e.o((()=>{}))}:{})}},o=e._export_sfc(a,[["__scopeId","data-v-eeef8b0e"]]);wx.createComponent(o); diff --git a/uniapp/unpackage/dist/build/mp-weixin/components/BillEditorPopup.json b/uniapp/unpackage/dist/build/mp-weixin/components/BillEditorPopup.json new file mode 100644 index 0000000..e8cfaaf --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/components/BillEditorPopup.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/components/BillEditorPopup.wxml b/uniapp/unpackage/dist/build/mp-weixin/components/BillEditorPopup.wxml new file mode 100644 index 0000000..e956737 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/components/BillEditorPopup.wxml @@ -0,0 +1 @@ +{{c}}3 步完成记录,所有数据仅保存在本机关闭收支类型{{item.a}}金额¥分类{{item.b}}账户{{item.b}}日期{{j}}选择备注取消保存账单 \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/components/BillEditorPopup.wxss b/uniapp/unpackage/dist/build/mp-weixin/components/BillEditorPopup.wxss new file mode 100644 index 0000000..ce27f47 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/components/BillEditorPopup.wxss @@ -0,0 +1 @@ +.popup-shell.data-v-eeef8b0e{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50}.popup-mask.data-v-eeef8b0e{position:absolute;top:0;right:0;bottom:0;left:0;background:rgba(3,12,21,.42)}.popup-panel.data-v-eeef8b0e{position:absolute;left:16rpx;right:16rpx;bottom:16rpx;max-height:84vh;padding:28rpx 28rpx 32rpx;display:flex;flex-direction:column;gap:24rpx}.popup-head.data-v-eeef8b0e{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx}.close-text.data-v-eeef8b0e{padding:10rpx 0;font-size:24rpx;color:var(--text-secondary)}.popup-body.data-v-eeef8b0e{max-height:58vh}.field-block.data-v-eeef8b0e{display:flex;flex-direction:column;gap:18rpx;margin-bottom:24rpx}.field-label.data-v-eeef8b0e{font-size:26rpx;font-weight:600;color:var(--text-primary)}.pill-row.data-v-eeef8b0e,.chip-grid.data-v-eeef8b0e{display:flex;flex-wrap:wrap;gap:16rpx}.chip-item.data-v-eeef8b0e{display:flex;align-items:center;gap:10rpx;padding:16rpx 20rpx;border-radius:22rpx;background:var(--surface-muted);color:var(--text-secondary);font-size:24rpx}.chip-item.active.data-v-eeef8b0e{background:var(--brand-soft);color:var(--text-primary)}.chip-dot.data-v-eeef8b0e{width:14rpx;height:14rpx;border-radius:50%}.amount-shell.data-v-eeef8b0e{gap:12rpx}.prefix-text.data-v-eeef8b0e{font-size:36rpx;font-weight:600;color:var(--text-primary)}.picker-shell.data-v-eeef8b0e{justify-content:space-between}.textarea-shell.data-v-eeef8b0e{padding:20rpx 24rpx;min-height:160rpx;align-items:flex-start}.textarea-shell textarea.data-v-eeef8b0e{min-height:120rpx}.popup-foot.data-v-eeef8b0e{display:flex;align-items:center;gap:16rpx}.popup-foot .ghost-button.data-v-eeef8b0e{flex:0 0 180rpx}.save-button.data-v-eeef8b0e{flex:1} diff --git a/uniapp/unpackage/dist/build/mp-weixin/components/SectionCard.js b/uniapp/unpackage/dist/build/mp-weixin/components/SectionCard.js new file mode 100644 index 0000000..6194c7e --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/components/SectionCard.js @@ -0,0 +1 @@ +"use strict";const t=require("../common/vendor.js"),e={__name:"SectionCard",props:{title:{type:String,default:""},subtitle:{type:String,default:""}},setup:e=>(i,s)=>t.e({a:e.title||e.subtitle||i.$slots.action},e.title||e.subtitle||i.$slots.action?t.e({b:e.title},e.title?{c:t.t(e.title)}:{},{d:e.subtitle},e.subtitle?{e:t.t(e.subtitle)}:{}):{})},i=t._export_sfc(e,[["__scopeId","data-v-55faa340"]]);wx.createComponent(i); diff --git a/uniapp/unpackage/dist/build/mp-weixin/components/SectionCard.json b/uniapp/unpackage/dist/build/mp-weixin/components/SectionCard.json new file mode 100644 index 0000000..e8cfaaf --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/components/SectionCard.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/components/SectionCard.wxml b/uniapp/unpackage/dist/build/mp-weixin/components/SectionCard.wxml new file mode 100644 index 0000000..52cd708 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/components/SectionCard.wxml @@ -0,0 +1 @@ +{{c}}{{e}} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/components/SectionCard.wxss b/uniapp/unpackage/dist/build/mp-weixin/components/SectionCard.wxss new file mode 100644 index 0000000..6800c16 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/components/SectionCard.wxss @@ -0,0 +1 @@ +.card.data-v-55faa340{padding:28rpx}.head.data-v-55faa340{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx;margin-bottom:24rpx}.title-group.data-v-55faa340{display:flex;flex-direction:column;gap:10rpx} diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/bills/index.js b/uniapp/unpackage/dist/build/mp-weixin/pages/bills/index.js new file mode 100644 index 0000000..c475e27 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/bills/index.js @@ -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||(n+o+l)();const n=()=>"../../components/SectionCard.js",o=()=>"../../components/AppTabBar.js",l=()=>"../../components/BillEditorPopup.js",r={__name:"index",setup(n){const o=t.useAppStore(),l=e.ref(!1),r=e.ref(null),i=e.ref(!1),c=e.ref([]),d=e.computed((()=>"dark"===o.state.settings.theme?"theme-dark":"")),m=e.reactive({type:"all",period:"month",month:a.toMonthKey(),keyword:"",categoryId:"",accountId:"",minAmount:"",maxAmount:""}),v=[{label:"全部",value:"all"},{label:"支出",value:"expense"},{label:"收入",value:"income"}],s=[{label:"本月",value:"month"},{label:"近 7 天",value:"7d"},{label:"近 30 天",value:"30d"},{label:"全部",value:"all"}],p=e.computed((()=>[...o.state.bills].sort(((e,t)=>t.createdAt-e.createdAt)))),f=e.computed((()=>[{id:"",name:"全部分类"},..."all"===m.type?[...o.state.categories.expense,...o.state.categories.income]:o.state.categories[m.type]])),y=e.computed((()=>[{id:"",name:"全部账户"},...o.state.accounts])),h=e.computed((()=>f.value.map((e=>e.name)))),b=e.computed((()=>y.value.map((e=>e.name)))),g=e.computed((()=>Math.max(0,f.value.findIndex((e=>e.id===m.categoryId))))),x=e.computed((()=>Math.max(0,y.value.findIndex((e=>e.id===m.accountId))))),I=e.computed((()=>{var e;return(null==(e=f.value[g.value])?void 0:e.name)||"全部分类"})),w=e.computed((()=>{var e;return(null==(e=y.value[x.value])?void 0:e.name)||"全部账户"})),A=e.computed((()=>a.formatMonthLabel(m.month))),k=e.computed((()=>m.month));function M(e){const t=new Date,u=a.parseDate(e);return(t.getTime()-u.getTime())/864e5}const j=e.computed((()=>p.value.filter((e=>{if("all"!==m.type&&e.type!==m.type)return!1;if("month"===m.period&&!a.isSameMonth(e.date,m.month))return!1;if("7d"===m.period&&M(e.date)>7)return!1;if("30d"===m.period&&M(e.date)>30)return!1;if(m.categoryId&&e.categoryId!==m.categoryId)return!1;if(m.accountId&&e.accountId!==m.accountId)return!1;if(m.minAmount&&Number(e.amount)Number(m.maxAmount))return!1;if(m.keyword){const t=B(e).name||"",a=D(e).name||"",u=m.keyword.trim().toLowerCase();if(!`${e.note||""} ${t} ${a}`.toLowerCase().includes(u))return!1}return!0})))),N=e.computed((()=>j.value.filter((e=>"expense"===e.type)).reduce(((e,t)=>e+Number(t.amount)),0))),C=e.computed((()=>j.value.filter((e=>"income"===e.type)).reduce(((e,t)=>e+Number(t.amount)),0)));function B(e){return(o.state.categories[e.type]||[]).find((t=>t.id===e.categoryId))||{}}function D(e){return o.state.accounts.find((t=>t.id===e.accountId))||{}}function L(e){var t;m.categoryId=(null==(t=f.value[Number(e.detail.value)])?void 0:t.id)||""}function T(e){var t;m.accountId=(null==(t=y.value[Number(e.detail.value)])?void 0:t.id)||""}function $(e){m.month=String(e.detail.value).slice(0,7),m.period="month"}function _(){m.type="all",m.period="month",m.month=a.toMonthKey(),m.keyword="",m.categoryId="",m.accountId="",m.minAmount="",m.maxAmount=""}function q(e=null){r.value=e?{...e}:null,l.value=!0}function S(){l.value=!1,r.value=null}function P(t){o.saveBill(t),e.index.showToast({title:t.id?"账单已更新":"账单已保存",icon:"none"})}function K(t){e.index.showActionSheet({itemList:["编辑账单","删除账单"],success:({tapIndex:a})=>{0===a&&q(t),1===a&&function(t){e.index.showModal({title:"删除账单",content:`确认删除 ${B(t).name||"该账单"} 吗?`,success:({confirm:e})=>{e&&o.deleteBill(t.id)}})}(t)}})}function E(){i.value=!i.value,c.value=[]}function R(){c.value=j.value.map((e=>e.id))}function z(){c.value.length?e.index.showModal({title:"批量删除",content:`确认删除 ${c.value.length} 笔账单吗?`,success:({confirm:e})=>{e&&(o.deleteBills(c.value),c.value=[],i.value=!1)}}):e.index.showToast({title:"请选择账单",icon:"none"})}return e.onPullDownRefresh((()=>{setTimeout((()=>{e.index.stopPullDownRefresh()}),200)})),(t,n)=>e.e({a:e.f(v,((t,a,u)=>({a:e.t(t.label),b:t.value,c:m.type===t.value?1:"",d:e.o((e=>{m.type=t.value,m.categoryId=""}),t.value)}))),b:e.f(s,((t,a,u)=>({a:e.t(t.label),b:t.value,c:m.period===t.value?1:"",d:e.o((e=>m.period=t.value),t.value)}))),c:e.t(A.value),d:k.value,e:e.o($),f:m.keyword,g:e.o((e=>m.keyword=e.detail.value)),h:m.minAmount,i:e.o((e=>m.minAmount=e.detail.value)),j:m.maxAmount,k:e.o((e=>m.maxAmount=e.detail.value)),l:e.t(I.value),m:h.value,n:g.value,o:e.o(L),p:e.t(w.value),q:b.value,r:x.value,s:e.o(T),t:e.o(_),v:e.o((e=>q())),w:e.p({title:"账单筛选",subtitle:"按月份、分类、账户、金额区间和关键词组合查询"}),x:e.t(i.value?"退出批量":"批量删除"),y:e.o(E),z:e.t(e.unref(u.formatCurrency)(N.value)),A:e.t(e.unref(u.formatCurrency)(C.value)),B:e.t(e.unref(u.formatCurrency)(C.value-N.value)),C:j.value.length},j.value.length?{D:e.f(j.value,((t,n,o)=>e.e(i.value?{a:c.value.includes(t.id)?1:""}:{},{b:B(t).color||"#7b8794",c:e.t(B(t).name||"未分类"),d:e.t(D(t).name||"账户"),e:e.t(e.unref(a.formatDateLabel)(t.date)),f:e.t(t.note||"无备注"),g:e.t("income"===t.type?"+":"-"),h:e.t(e.unref(u.formatCurrency)(t.amount).replace("¥","")),i:e.n("income"===t.type?"positive":"negative"),j:t.id,k:e.o((e=>{return i.value?(a=t.id,void(i.value&&(c.value=c.value.includes(a)?c.value.filter((e=>e!==a)):[...c.value,a]))):q(t);var a}),t.id),l:e.o((e=>K(t)),t.id)}))),E:i.value}:{},{F:e.p({title:"账单概览",subtitle:`共 ${j.value.length} 笔记录,点击编辑,长按可删除`}),G:i.value},i.value?{H:e.t(c.value.length),I:e.o(R),J:e.o(z)}:{},{K:e.p({current:"bills"}),L:e.o(S),M:e.o(P),N:e.p({visible:l.value,entry:r.value,categories:e.unref(o).state.categories,accounts:e.unref(o).state.accounts}),O:e.n(d.value)})}},i=e._export_sfc(r,[["__scopeId","data-v-ff523969"]]);wx.createPage(i); diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/bills/index.json b/uniapp/unpackage/dist/build/mp-weixin/pages/bills/index.json new file mode 100644 index 0000000..b95a9cf --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/bills/index.json @@ -0,0 +1,9 @@ +{ + "navigationBarTitleText": "账单管理", + "enablePullDownRefresh": true, + "usingComponents": { + "section-card": "../../components/SectionCard", + "app-tab-bar": "../../components/AppTabBar", + "bill-editor-popup": "../../components/BillEditorPopup" + } +} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/bills/index.wxml b/uniapp/unpackage/dist/build/mp-weixin/pages/bills/index.wxml new file mode 100644 index 0000000..db47404 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/bills/index.wxml @@ -0,0 +1 @@ +{{item.a}}{{item.a}}{{c}}{{l}}分类{{p}}账户清空筛选新增账单{{x}}支出{{z}}收入{{A}}结余{{B}}{{bill.c}}{{bill.d}} · {{bill.e}} · {{bill.f}}{{bill.g}}{{bill.h}}当前筛选条件下没有符合条件的账单记录。已选 {{H}} 笔全选删除所选 \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/bills/index.wxss b/uniapp/unpackage/dist/build/mp-weixin/pages/bills/index.wxss new file mode 100644 index 0000000..f3d0796 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/bills/index.wxss @@ -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)} diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/budget/index.js b/uniapp/unpackage/dist/build/mp-weixin/pages/budget/index.js new file mode 100644 index 0000000..9d1f5c2 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/budget/index.js @@ -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); diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/budget/index.json b/uniapp/unpackage/dist/build/mp-weixin/pages/budget/index.json new file mode 100644 index 0000000..0d9953d --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/budget/index.json @@ -0,0 +1,7 @@ +{ + "navigationBarTitleText": "预算管理", + "usingComponents": { + "section-card": "../../components/SectionCard", + "app-tab-bar": "../../components/AppTabBar" + } +} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/budget/index.wxml b/uniapp/unpackage/dist/build/mp-weixin/pages/budget/index.wxml new file mode 100644 index 0000000..b8afc43 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/budget/index.wxml @@ -0,0 +1 @@ +本月总预算{{a}}本月已支出{{b}}使用进度 {{d}}{{e}}{{f}}保存{{item.a}}预算 {{item.b}},已支出 {{item.c}}{{item.b}}已花 {{item.c}}预算 {{item.e}}{{item.f}}保存 \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/budget/index.wxss b/uniapp/unpackage/dist/build/mp-weixin/pages/budget/index.wxss new file mode 100644 index 0000000..38ff1a3 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/budget/index.wxss @@ -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)} diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/home/index.js b/uniapp/unpackage/dist/build/mp-weixin/pages/home/index.js new file mode 100644 index 0000000..a87b675 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/home/index.js @@ -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); diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/home/index.json b/uniapp/unpackage/dist/build/mp-weixin/pages/home/index.json new file mode 100644 index 0000000..21c987c --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/home/index.json @@ -0,0 +1,9 @@ +{ + "navigationBarTitleText": "首页", + "enablePullDownRefresh": true, + "usingComponents": { + "section-card": "../../components/SectionCard", + "app-tab-bar": "../../components/AppTabBar", + "bill-editor-popup": "../../components/BillEditorPopup" + } +} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/home/index.wxml b/uniapp/unpackage/dist/build/mp-weixin/pages/home/index.wxml new file mode 100644 index 0000000..3ed8809 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/home/index.wxml @@ -0,0 +1 @@ +{{a}}账单小管家今日支出{{b}}本月支出{{c}}本月收入{{d}}本月结余{{e}}{{f}}剩余预算预算使用{{g}}{{i}}{{j}}去设置预算记录支出记录收入{{item.b}}查看全部{{bill.b}}{{bill.c}} · {{bill.d}}{{bill.e}}{{bill.f}}{{bill.h}}还没有账单记录,先记下第一笔收支。立即记账+ 记一笔 \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/home/index.wxss b/uniapp/unpackage/dist/build/mp-weixin/pages/home/index.wxss new file mode 100644 index 0000000..2dcdc65 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/home/index.wxss @@ -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} diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/about/index.js b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/about/index.js new file mode 100644 index 0000000..ea1cb6c --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/about/index.js @@ -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); diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/about/index.json b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/about/index.json new file mode 100644 index 0000000..ec0a983 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/about/index.json @@ -0,0 +1,6 @@ +{ + "navigationBarTitleText": "关于与隐私", + "usingComponents": { + "section-card": "../../../components/SectionCard" + } +} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/about/index.wxml b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/about/index.wxml new file mode 100644 index 0000000..c7334e7 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/about/index.wxml @@ -0,0 +1 @@ +ABOUT关于与隐私查看应用定位、数据说明与发布前应补齐的正式信息。发布说明账单小管家定位为轻量、无广告的本地记账工具,适合学生、情侣、合租和个人日常记账场景。本地存储账单、预算、分类、账户和设置默认保存在当前设备本地。本地昵称昵称仅保存在当前设备,用于个人页展示和首字头像。数据迁移如需换机迁移,可在“备份与恢复”中导出 JSON 并在新设备恢复。 \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/about/index.wxss b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/about/index.wxss new file mode 100644 index 0000000..ca98927 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/about/index.wxss @@ -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)} diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/backup/index.js b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/backup/index.js new file mode 100644 index 0000000..98b14be --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/backup/index.js @@ -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); diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/backup/index.json b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/backup/index.json new file mode 100644 index 0000000..c5c339f --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/backup/index.json @@ -0,0 +1,6 @@ +{ + "navigationBarTitleText": "备份与恢复", + "usingComponents": { + "section-card": "../../../components/SectionCard" + } +} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/backup/index.wxml b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/backup/index.wxml new file mode 100644 index 0000000..7ab2af6 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/backup/index.wxml @@ -0,0 +1 @@ +BACKUP备份与恢复导出本地 JSON 备份,恢复时覆盖当前设备数据,适合换机或手动留档。本地文件{{a}}安全备份当前数据所有数据均为本地文件,不会自动上传服务器。{{b}}导出备份最近备份:{{e}}清空内容开始恢复复制备份内容复制清空全部数据执行 \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/backup/index.wxss b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/backup/index.wxss new file mode 100644 index 0000000..21de8cf --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/backup/index.wxss @@ -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)} diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/guide/index.js b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/guide/index.js new file mode 100644 index 0000000..d08db4e --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/guide/index.js @@ -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); diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/guide/index.json b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/guide/index.json new file mode 100644 index 0000000..4f77f39 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/guide/index.json @@ -0,0 +1,6 @@ +{ + "navigationBarTitleText": "使用帮助", + "usingComponents": { + "section-card": "../../../components/SectionCard" + } +} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/guide/index.wxml b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/guide/index.wxml new file mode 100644 index 0000000..5639a14 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/guide/index.wxml @@ -0,0 +1 @@ +GUIDE使用帮助通过上手步骤、常见问题和快捷入口,快速熟悉整个记账流程。4 个步骤FAQ 指南{{item.a}}{{item.b}}{{item.c}}{{item.a}}{{item.b}}首页记账预算设置查看报表备份恢复 \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/guide/index.wxss b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/guide/index.wxss new file mode 100644 index 0000000..72ea2fb --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/guide/index.wxss @@ -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} diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/index.js b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/index.js new file mode 100644 index 0000000..4625235 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/index.js @@ -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); diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/index.json b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/index.json new file mode 100644 index 0000000..ec681ad --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/index.json @@ -0,0 +1,7 @@ +{ + "navigationBarTitleText": "我的", + "usingComponents": { + "section-card": "../../components/SectionCard", + "app-tab-bar": "../../components/AppTabBar" + } +} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/index.wxml b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/index.wxml new file mode 100644 index 0000000..4813f1e --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/index.wxml @@ -0,0 +1 @@ +{{a}}{{b}}{{c}}浅色深色备份与恢复{{j}}使用帮助{{l}}关于与隐私{{n}} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/index.wxss b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/index.wxss new file mode 100644 index 0000000..4cbce7a --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/index.wxss @@ -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)} diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/profile/index.js b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/profile/index.js new file mode 100644 index 0000000..d2f7f64 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/profile/index.js @@ -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); diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/profile/index.json b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/profile/index.json new file mode 100644 index 0000000..756dce7 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/profile/index.json @@ -0,0 +1,6 @@ +{ + "navigationBarTitleText": "账户资料", + "usingComponents": { + "section-card": "../../../components/SectionCard" + } +} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/profile/index.wxml b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/profile/index.wxml new file mode 100644 index 0000000..7990dac --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/profile/index.wxml @@ -0,0 +1 @@ +ACCOUNT账户资料管理本地昵称、显示资料与本机记账模式说明。本地资料本地存储{{a}}{{b}}当前昵称仅保存在本地设备,可随时修改。本地留空时页面会统一显示“用户”。清空昵称保存昵称昵称首字头像当前显示 {{h}},自动根据昵称生成已启用本机记账模式账单与预算默认仅保存在当前设备本地默认0{{tip.a}}{{tip.b}} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/mine/profile/index.wxss b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/profile/index.wxss new file mode 100644 index 0000000..4e0f638 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/mine/profile/index.wxss @@ -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)} diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/stats/index.js b/uniapp/unpackage/dist/build/mp-weixin/pages/stats/index.js new file mode 100644 index 0000000..7f65a9f --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/stats/index.js @@ -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||(n+r)();const n=()=>"../../components/SectionCard.js",r=()=>"../../components/AppTabBar.js",o={__name:"index",setup(n){const r=t.useAppStore(),o=e.ref(a.toMonthKey()),l=e.ref(!1),i=e.computed((()=>"dark"===r.state.settings.theme?"theme-dark":"")),c=e.computed((()=>o.value.slice(0,7))),s=e.computed((()=>a.formatMonthLabel(c.value))),m=e.computed((()=>o.value)),d=e.computed((()=>r.state.bills.filter((e=>a.isSameMonth(e.date,c.value))))),p=e.computed((()=>d.value.filter((e=>"expense"===e.type)))),f=e.computed((()=>p.value.reduce(((e,t)=>e+Number(t.amount)),0))),v=e.computed((()=>d.value.filter((e=>"income"===e.type)).reduce(((e,t)=>e+Number(t.amount)),0))),b=e.computed((()=>{const e=Math.max(f.value,1);return r.state.categories.expense.map((t=>{const a=p.value.filter((e=>e.categoryId===t.id)).reduce(((e,t)=>e+Number(t.amount)),0);return{...t,total:a,percentLabel:u.formatPercent(a/e),percentWidth:u.clampPercent(a/e)}})).filter((e=>e.total>0)).sort(((e,t)=>t.total-e.total))})),h=e.computed((()=>{const[e,t]=c.value.split("-").map(Number),u=a.toDateKey(),n=new Date(e,t,0),r=a.toMonthKey(u)===c.value?new Date:n,o=a.getRecentDateKeys(7,r),l=Math.max(1,...o.map((e=>p.value.filter((t=>t.date===e)).reduce(((e,t)=>e+Number(t.amount)),0))));return o.map((e=>{const t=p.value.filter((t=>t.date===e)).reduce(((e,t)=>e+Number(t.amount)),0);return{date:e,label:e.slice(5),value:Number(t.toFixed(2)),height:`${Math.max(8,t/l*100)}%`}}))})),x=e.computed((()=>{const e=a.getMonthSeries(6,c.value),t=Math.max(1,...e.map((e=>r.state.bills.filter((t=>"expense"===t.type&&a.isSameMonth(t.date,e))).reduce(((e,t)=>e+Number(t.amount)),0)))),u=Math.max(1,...e.map((e=>r.state.bills.filter((t=>"income"===t.type&&a.isSameMonth(t.date,e))).reduce(((e,t)=>e+Number(t.amount)),0))));return e.map((e=>{const n=r.state.bills.filter((t=>"expense"===t.type&&a.isSameMonth(t.date,e))).reduce(((e,t)=>e+Number(t.amount)),0),o=r.state.bills.filter((t=>"income"===t.type&&a.isSameMonth(t.date,e))).reduce(((e,t)=>e+Number(t.amount)),0);return{month:e,label:e.slice(5),expense:n,income:o,expenseWidth:`${Math.max(8,n/t*100)}%`,incomeWidth:`${Math.max(8,o/u*100)}%`}}))}));function y(e){o.value=String(e.detail.value).slice(0,7)}function g(e){var t;return(null==(t=(r.state.categories[e.type]||[]).find((t=>t.id===e.categoryId)))?void 0:t.name)||"未分类"}function M(e){var t;return(null==(t=r.state.accounts.find((t=>t.id===e.accountId)))?void 0:t.name)||"未知账户"}function C(e){const t=String(e??"");return/[",\n]/.test(t)?`"${t.replace(/"/g,'""')}"`:t}function $(){const t=d.value.map((e=>[C(e.date),C("income"===e.type?"收入":"支出"),C(g(e)),C(M(e)),C(Number(e.amount).toFixed(2)),C(e.note||"")].join(",")));!function(t,a,u){if(void 0!==e.wx$1&&e.wx$1.getFileSystemManager){const n=`${e.wx$1.env.USER_DATA_PATH}/${t}`;e.wx$1.getFileSystemManager().writeFile({filePath:n,data:a,encoding:"utf8",success:()=>{e.index.showModal({title:u,content:`文件已生成:${n}`,showCancel:!1})},fail:()=>{e.index.setClipboardData({data:a})}})}else e.index.setClipboardData({data:a})}(`账单-${c.value}.csv`,["\ufeff日期,类型,分类,账户,金额,备注",...t].join("\n"),"CSV 导出成功")}function S(){const t=`${s.value},支出 ${u.formatCurrency(f.value)},收入 ${u.formatCurrency(v.value)},结余 ${u.formatCurrency(v.value-f.value)}。`;e.index.setClipboardData({data:t})}return e.onShareAppMessage((()=>({title:`${s.value}收支摘要`,path:"/pages/stats/index"}))),(t,a)=>e.e({a:e.t(s.value),b:m.value,c:e.o(y),d:e.t(e.unref(u.formatCurrency)(f.value)),e:e.t(e.unref(u.formatCurrency)(v.value)),f:e.t(e.unref(u.formatCurrency)(v.value-f.value)),g:e.p({title:"报表总览",subtitle:"按月份查看收支分布、消费趋势和月度对比"}),h:b.value.length},b.value.length?{i:e.f(b.value,((t,a,n)=>({a:t.color,b:e.t(t.name),c:e.t(e.unref(u.formatCurrency)(t.total)),d:e.t(t.percentLabel),e:t.percentWidth,f:t.color,g:t.id})))}:{},{j:e.p({title:"支出分类",subtitle:"查看本月主要消费去向与占比结构"}),k:e.f(h.value,((t,a,u)=>({a:t.height,b:e.t(t.label),c:e.t(0===t.value?"-":t.value),d:t.date}))),l:e.p({title:"近 7 日趋势",subtitle:"观察近一周消费变化,便于发现异常高峰"}),m:e.f(x.value,((t,a,n)=>({a:e.t(t.label),b:t.expenseWidth,c:t.incomeWidth,d:e.t(e.unref(u.formatCurrency)(t.expense)),e:e.t(e.unref(u.formatCurrency)(t.income)),f:t.month}))),n:e.p({title:"月度对比",subtitle:"最近 6 个月收入与支出走势一目了然"}),o:e.o($),p:e.o((e=>l.value=!0)),q:e.p({title:"导出与分享",subtitle:"支持导出当月 CSV 账单与生成分享文案"}),r:l.value},l.value?{s:e.o((e=>l.value=!1)),t:e.t(s.value),v:e.t(e.unref(u.formatCurrency)(f.value)),w:e.t(e.unref(u.formatCurrency)(v.value)),x:e.t(e.unref(u.formatCurrency)(v.value-f.value)),y:e.o(S),z:e.o((e=>l.value=!1)),A:e.o((()=>{}))}:{},{B:e.p({current:"stats"}),C:e.n(i.value)})}},l=e._export_sfc(o,[["__scopeId","data-v-7cab36fb"]]);o.__runtimeHooks=2,wx.createPage(l); diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/stats/index.json b/uniapp/unpackage/dist/build/mp-weixin/pages/stats/index.json new file mode 100644 index 0000000..a9b9bb1 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/stats/index.json @@ -0,0 +1,7 @@ +{ + "navigationBarTitleText": "数据报表", + "usingComponents": { + "section-card": "../../components/SectionCard", + "app-tab-bar": "../../components/AppTabBar" + } +} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/stats/index.wxml b/uniapp/unpackage/dist/build/mp-weixin/pages/stats/index.wxml new file mode 100644 index 0000000..a3ffd4a --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/stats/index.wxml @@ -0,0 +1 @@ +{{a}}支出{{d}}收入{{e}}结余{{f}}{{item.b}}{{item.c}} · {{item.d}}当前月份暂无支出数据,记一笔后会自动生成图表。{{item.b}}{{item.c}}{{item.a}}{{item.d}} / {{item.e}}导出 CSV分享摘要{{t}}收支月报支出 {{v}}收入 {{w}}结余 {{x}}内容本地生成,可复制摘要或直接截图分享。复制摘要关闭 \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/pages/stats/index.wxss b/uniapp/unpackage/dist/build/mp-weixin/pages/stats/index.wxss new file mode 100644 index 0000000..eeff5be --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/pages/stats/index.wxss @@ -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} diff --git a/uniapp/unpackage/dist/build/mp-weixin/project.config.json b/uniapp/unpackage/dist/build/mp-weixin/project.config.json new file mode 100644 index 0000000..81c3416 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/project.config.json @@ -0,0 +1,36 @@ +{ + "description": "项目配置文件。", + "packOptions": { + "ignore": [] + }, + "setting": { + "urlCheck": false, + "es6": true, + "postcss": false, + "minified": true, + "newFeature": true, + "bigPackageSizeSupport": true + }, + "compileType": "miniprogram", + "libVersion": "", + "appid": "wx64fbe7ae2180912a", + "projectname": "账单小管家", + "condition": { + "search": { + "current": -1, + "list": [] + }, + "conversation": { + "current": -1, + "list": [] + }, + "game": { + "current": -1, + "list": [] + }, + "miniprogram": { + "current": -1, + "list": [] + } + } +} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/project.private.config.json b/uniapp/unpackage/dist/build/mp-weixin/project.private.config.json new file mode 100644 index 0000000..d90fdb6 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/project.private.config.json @@ -0,0 +1,22 @@ +{ + "libVersion": "3.14.3", + "projectname": "mp-weixin", + "condition": {}, + "setting": { + "urlCheck": false, + "coverView": false, + "lazyloadPlaceholderEnable": false, + "skylineRenderEnable": false, + "preloadBackgroundData": false, + "autoAudits": false, + "useApiHook": true, + "showShadowRootInWxmlPanel": false, + "useStaticServer": false, + "useLanDebug": false, + "showES6CompileOption": false, + "compileHotReLoad": true, + "checkInvalidKey": true, + "ignoreDevUnusedFiles": true, + "bigPackageSizeSupport": true + } +} \ No newline at end of file diff --git a/uniapp/unpackage/dist/build/mp-weixin/static/logo.png b/uniapp/unpackage/dist/build/mp-weixin/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b5771e209bb677e2ebd5ff766ad5ee11790f305a GIT binary patch literal 4023 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 SYs}WS&%*SCNx89m_=0;u-=1){const t=new Date(a);t.setMonth(a.getMonth()-u),s.push(r(t))}return s},exports.getRecentDateKeys=function(t,r=new Date){const o=[],a=e(r);for(let e=t-1;e>=0;e-=1){const t=new Date(a);t.setDate(a.getDate()-e),o.push(n(t))}return o},exports.isSameMonth=function(t,e){return r(t)===e},exports.parseDate=e,exports.toDateKey=n,exports.toMonthKey=r; diff --git a/uniapp/unpackage/dist/build/mp-weixin/utils/money.js b/uniapp/unpackage/dist/build/mp-weixin/utils/money.js new file mode 100644 index 0000000..a6aa933 --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/utils/money.js @@ -0,0 +1 @@ +"use strict";function r(r){return Math.max(0,Math.round(100*(Number(r)||0)))}exports.clampPercent=function(t){return`${Math.min(100,r(t))}%`},exports.formatCurrency=function(r){return`¥${Number(r||0).toFixed(2)}`},exports.formatPercent=function(t){return`${r(t)}%`}; diff --git a/uniapp/unpackage/dist/build/mp-weixin/utils/store.js b/uniapp/unpackage/dist/build/mp-weixin/utils/store.js new file mode 100644 index 0000000..fbdaa3d --- /dev/null +++ b/uniapp/unpackage/dist/build/mp-weixin/utils/store.js @@ -0,0 +1 @@ +"use strict";const e=require("../common/vendor.js"),t=require("./constants.js"),s="bill-helper-miniapp-v1";function n(e){return JSON.parse(JSON.stringify(e))}function i(e){var s,n,i,l,o,a,c,r,u,g,d,p;const f=t.createDefaultData(),b=e||{};return{categories:{expense:Array.isArray(null==(s=b.categories)?void 0:s.expense)&&b.categories.expense.length?b.categories.expense:f.categories.expense,income:Array.isArray(null==(n=b.categories)?void 0:n.income)&&b.categories.income.length?b.categories.income:f.categories.income},accounts:Array.isArray(b.accounts)&&b.accounts.length?b.accounts:f.accounts,bills:Array.isArray(b.bills)?b.bills:f.bills,budgets:{total:Number(null==(i=b.budgets)?void 0:i.total)||f.budgets.total,categoryBudgets:(null==(l=b.budgets)?void 0:l.categoryBudgets)||f.budgets.categoryBudgets},settings:{theme:(null==(o=b.settings)?void 0:o.theme)||f.settings.theme,profile:{authorized:Boolean(null==(c=null==(a=b.settings)?void 0:a.profile)?void 0:c.authorized),nickname:(null==(u=null==(r=b.settings)?void 0:r.profile)?void 0:u.nickname)||f.settings.profile.nickname,avatarUrl:(null==(d=null==(g=b.settings)?void 0:g.profile)?void 0:d.avatarUrl)||""},lastBackupAt:(null==(p=b.settings)?void 0:p.lastBackupAt)||""}}}const l=e.reactive(i(function(){try{const n=e.index.getStorageSync(s);if(!n){const n=t.createDefaultData();return e.index.setStorageSync(s,n),n}return i(n)}catch(n){return t.createDefaultData()}}()));function o(e){l.categories.expense.splice(0,l.categories.expense.length,...e.categories.expense),l.categories.income.splice(0,l.categories.income.length,...e.categories.income),l.accounts.splice(0,l.accounts.length,...e.accounts),l.bills.splice(0,l.bills.length,...e.bills),l.budgets.total=Number(e.budgets.total)||0,l.budgets.categoryBudgets={...e.budgets.categoryBudgets},l.settings.theme=e.settings.theme,l.settings.profile={...e.settings.profile},l.settings.lastBackupAt=e.settings.lastBackupAt||""}function a(){e.index.setStorageSync(s,n(l))}exports.useAppStore=function(){return{state:l,saveBill:function(e){const t=function(e){return{id:e.id||`bill-${Date.now()}`,type:e.type||"expense",amount:Number(e.amount)||0,categoryId:e.categoryId||"",accountId:e.accountId||"",note:e.note||"",date:e.date,createdAt:e.createdAt||Date.now()}}(e),s=l.bills.findIndex((e=>e.id===t.id));-1===s?l.bills.unshift(t):l.bills.splice(s,1,t),a()},deleteBill:function(e){l.bills.splice(0,l.bills.length,...l.bills.filter((t=>t.id!==e))),a()},deleteBills:function(e){const t=new Set(e);l.bills.splice(0,l.bills.length,...l.bills.filter((e=>!t.has(e.id)))),a()},setBudgetTotal:function(e){l.budgets.total=Number(e)||0,a()},setCategoryBudget:function(e,t){l.budgets.categoryBudgets={...l.budgets.categoryBudgets,[e]:Number(t)||0},a()},setTheme:function(e){l.settings.theme=e,a()},setProfile:function(e){l.settings.profile={...l.settings.profile,...e},a()},markBackup:function(e){l.settings.lastBackupAt=e,a()},exportBackup:function(){return JSON.stringify(n(l),null,2)},importBackup:function(e){o(i(JSON.parse(e))),a()},resetAll:function(){o(t.createDefaultData()),a()}}}; diff --git a/uniapp/unpackage/dist/cache/.vite/deps/_metadata.json b/uniapp/unpackage/dist/cache/.vite/deps/_metadata.json new file mode 100644 index 0000000..e3245c0 --- /dev/null +++ b/uniapp/unpackage/dist/cache/.vite/deps/_metadata.json @@ -0,0 +1,8 @@ +{ + "hash": "cd0b394e", + "configHash": "0843ca34", + "lockfileHash": "e3b0c442", + "browserHash": "9273fc72", + "optimized": {}, + "chunks": {} +} \ No newline at end of file diff --git a/uniapp/unpackage/dist/cache/.vite/deps/package.json b/uniapp/unpackage/dist/cache/.vite/deps/package.json new file mode 100644 index 0000000..3dbc1ca --- /dev/null +++ b/uniapp/unpackage/dist/cache/.vite/deps/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/uniapp/utils/constants.js b/uniapp/utils/constants.js new file mode 100644 index 0000000..18c58df --- /dev/null +++ b/uniapp/utils/constants.js @@ -0,0 +1,52 @@ +export const EXPENSE_CATEGORIES = [ + { id: 'food', name: '餐饮', color: '#d36c43' }, + { id: 'transport', name: '交通', color: '#5a8dee' }, + { id: 'rent', name: '住房', color: '#6e5ef7' }, + { id: 'shopping', name: '购物', color: '#d14b7d' }, + { id: 'entertainment', name: '娱乐', color: '#f0a33a' }, + { id: 'medical', name: '医疗', color: '#17a589' }, + { id: 'travel', name: '旅行', color: '#008b8b' }, + { id: 'daily', name: '日用', color: '#7b8794' } +] + +export const INCOME_CATEGORIES = [ + { id: 'salary', name: '工资', color: '#1f8f6d' }, + { id: 'bonus', name: '奖金', color: '#3c9d5e' }, + { id: 'allowance', name: '生活费', color: '#5f8df5' }, + { id: 'refund', name: '退款', color: '#e39b2d' }, + { id: 'sidejob', name: '副业', color: '#7f56d9' } +] + +export const DEFAULT_ACCOUNTS = [ + { id: 'wechat', name: '微信', color: '#1aad19' }, + { id: 'alipay', name: '支付宝', color: '#1677ff' }, + { id: 'cash', name: '现金', color: '#ff8a3d' }, + { id: 'bank', name: '银行卡', color: '#44546a' } +] + +export const DEFAULT_THEME = 'light' + +export function createDefaultData() { + return { + categories: { + expense: [...EXPENSE_CATEGORIES], + income: [...INCOME_CATEGORIES] + }, + accounts: [...DEFAULT_ACCOUNTS], + bills: [], + budgets: { + total: 0, + categoryBudgets: {} + }, + settings: { + theme: DEFAULT_THEME, + profile: { + authorized: false, + nickname: '', + avatarUrl: '' + }, + lastBackupAt: '' + } + } +} + diff --git a/uniapp/utils/date.js b/uniapp/utils/date.js new file mode 100644 index 0000000..9f6d56b --- /dev/null +++ b/uniapp/utils/date.js @@ -0,0 +1,103 @@ +function pad(value) { + return String(value).padStart(2, '0') +} + +export function parseDate(input = new Date()) { + if (input instanceof Date) { + return new Date(input.getTime()) + } + + if (typeof input === 'number') { + return new Date(input) + } + + if (typeof input === 'string') { + if (/^\d{4}-\d{2}-\d{2}$/.test(input)) { + const [year, month, day] = input.split('-').map(Number) + return new Date(year, month - 1, day) + } + + if (/^\d{4}-\d{2}$/.test(input)) { + const [year, month] = input.split('-').map(Number) + return new Date(year, month - 1, 1) + } + + return new Date(input.replace(/-/g, '/')) + } + + return new Date() +} + +export function toDateKey(input = new Date()) { + const date = parseDate(input) + return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}` +} + +export function toMonthKey(input = new Date()) { + const date = parseDate(input) + return `${date.getFullYear()}-${pad(date.getMonth() + 1)}` +} + +export function formatDateLabel(value) { + if (!value) { + return '' + } + + const date = parseDate(value) + const weekMap = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'] + return `${date.getMonth() + 1}月${date.getDate()}日 ${weekMap[date.getDay()]}` +} + +export function formatMonthLabel(monthKey) { + if (!monthKey) { + return '' + } + + const [year, month] = monthKey.split('-') + return `${year}年${Number(month)}月` +} + +export function isSameMonth(dateValue, monthKey) { + return toMonthKey(dateValue) === monthKey +} + +export function getMonthDays(monthKey) { + const [year, month] = monthKey.split('-').map(Number) + return new Date(year, month, 0).getDate() +} + +export function getDaysLeftInMonth(monthKey) { + const today = new Date() + if (toMonthKey(today) !== monthKey) { + return getMonthDays(monthKey) + } + + return getMonthDays(monthKey) - today.getDate() + 1 +} + +export function getRecentDateKeys(days, endDate = new Date()) { + const result = [] + const end = parseDate(endDate) + + for (let index = days - 1; index >= 0; index -= 1) { + const current = new Date(end) + current.setDate(end.getDate() - index) + result.push(toDateKey(current)) + } + + return result +} + +export function getMonthSeries(length, endMonthKey = toMonthKey()) { + const [year, month] = endMonthKey.split('-').map(Number) + const cursor = new Date(year, month - 1, 1) + const result = [] + + for (let index = length - 1; index >= 0; index -= 1) { + const current = new Date(cursor) + current.setMonth(cursor.getMonth() - index) + result.push(toMonthKey(current)) + } + + return result +} diff --git a/uniapp/utils/money.js b/uniapp/utils/money.js new file mode 100644 index 0000000..e1ce9d0 --- /dev/null +++ b/uniapp/utils/money.js @@ -0,0 +1,15 @@ +export function formatCurrency(value) { + return `¥${Number(value || 0).toFixed(2)}` +} + +function toPercentNumber(value) { + return Math.max(0, Math.round((Number(value) || 0) * 100)) +} + +export function formatPercent(value) { + return `${toPercentNumber(value)}%` +} + +export function clampPercent(value) { + return `${Math.min(100, toPercentNumber(value))}%` +} diff --git a/uniapp/utils/store.js b/uniapp/utils/store.js new file mode 100644 index 0000000..bba8317 --- /dev/null +++ b/uniapp/utils/store.js @@ -0,0 +1,179 @@ +import { reactive } from 'vue' +import { createDefaultData } from './constants' + +const STORAGE_KEY = 'bill-helper-miniapp-v1' + +function deepClone(value) { + return JSON.parse(JSON.stringify(value)) +} + +function normalizeData(raw) { + const fallback = createDefaultData() + const source = raw || {} + + return { + categories: { + expense: Array.isArray(source.categories?.expense) && source.categories.expense.length + ? source.categories.expense + : fallback.categories.expense, + income: Array.isArray(source.categories?.income) && source.categories.income.length + ? source.categories.income + : fallback.categories.income + }, + accounts: Array.isArray(source.accounts) && source.accounts.length ? source.accounts : fallback.accounts, + bills: Array.isArray(source.bills) ? source.bills : fallback.bills, + budgets: { + total: Number(source.budgets?.total) || fallback.budgets.total, + categoryBudgets: source.budgets?.categoryBudgets || fallback.budgets.categoryBudgets + }, + settings: { + theme: source.settings?.theme || fallback.settings.theme, + profile: { + authorized: Boolean(source.settings?.profile?.authorized), + nickname: source.settings?.profile?.nickname || fallback.settings.profile.nickname, + avatarUrl: source.settings?.profile?.avatarUrl || '' + }, + lastBackupAt: source.settings?.lastBackupAt || '' + } + } +} + +function loadData() { + try { + const raw = uni.getStorageSync(STORAGE_KEY) + if (!raw) { + const seeded = createDefaultData() + uni.setStorageSync(STORAGE_KEY, seeded) + return seeded + } + return normalizeData(raw) + } catch (error) { + return createDefaultData() + } +} + +const state = reactive(normalizeData(loadData())) + +function patchState(nextState) { + state.categories.expense.splice(0, state.categories.expense.length, ...nextState.categories.expense) + state.categories.income.splice(0, state.categories.income.length, ...nextState.categories.income) + state.accounts.splice(0, state.accounts.length, ...nextState.accounts) + state.bills.splice(0, state.bills.length, ...nextState.bills) + state.budgets.total = Number(nextState.budgets.total) || 0 + state.budgets.categoryBudgets = { ...nextState.budgets.categoryBudgets } + state.settings.theme = nextState.settings.theme + state.settings.profile = { ...nextState.settings.profile } + state.settings.lastBackupAt = nextState.settings.lastBackupAt || '' +} + +function persist() { + uni.setStorageSync(STORAGE_KEY, deepClone(state)) +} + +function buildBillPayload(payload) { + return { + id: payload.id || `bill-${Date.now()}`, + type: payload.type || 'expense', + amount: Number(payload.amount) || 0, + categoryId: payload.categoryId || '', + accountId: payload.accountId || '', + note: payload.note || '', + date: payload.date, + createdAt: payload.createdAt || Date.now() + } +} + +export function useAppStore() { + function saveBill(payload) { + const nextBill = buildBillPayload(payload) + const index = state.bills.findIndex((item) => item.id === nextBill.id) + + if (index === -1) { + state.bills.unshift(nextBill) + } else { + state.bills.splice(index, 1, nextBill) + } + + persist() + } + + function deleteBill(id) { + state.bills.splice( + 0, + state.bills.length, + ...state.bills.filter((item) => item.id !== id) + ) + persist() + } + + function deleteBills(ids) { + const idSet = new Set(ids) + state.bills.splice( + 0, + state.bills.length, + ...state.bills.filter((item) => !idSet.has(item.id)) + ) + persist() + } + + function setBudgetTotal(value) { + state.budgets.total = Number(value) || 0 + persist() + } + + function setCategoryBudget(categoryId, value) { + state.budgets.categoryBudgets = { + ...state.budgets.categoryBudgets, + [categoryId]: Number(value) || 0 + } + persist() + } + + function setTheme(theme) { + state.settings.theme = theme + persist() + } + + function setProfile(profile) { + state.settings.profile = { + ...state.settings.profile, + ...profile + } + persist() + } + + function markBackup(timeLabel) { + state.settings.lastBackupAt = timeLabel + persist() + } + + function exportBackup() { + return JSON.stringify(deepClone(state), null, 2) + } + + function importBackup(payload) { + const parsed = normalizeData(JSON.parse(payload)) + patchState(parsed) + persist() + } + + function resetAll() { + patchState(createDefaultData()) + persist() + } + + return { + state, + saveBill, + deleteBill, + deleteBills, + setBudgetTotal, + setCategoryBudget, + setTheme, + setProfile, + markBackup, + exportBackup, + importBackup, + resetAll + } +}