├── app └── images │ ├── 智能记账.jpg │ ├── 智能配置.jpg │ ├── 我的.jpg │ ├── 统计.jpg │ ├── 首页.jpg │ ├── 分类详情.jpg │ ├── 图标管理.jpg │ ├── 按住说话.jpg │ ├── 智能体配置.jpg │ ├── 预算管理.jpg │ ├── 按住说话-1.jpg │ ├── 智能记账-1.jpg │ ├── 智能记账-2.jpg │ ├── 智能记账-3.jpg │ └── 语音识别配置.jpg ├── pages ├── category-manage │ └── category-manage.vue ├── ai-config │ └── ai-config.vue ├── category │ └── category.vue ├── add │ └── add.vue ├── voice-config │ └── voice-config.vue ├── icon-manage │ └── icon-manage.vue ├── category-detail │ └── category-detail.vue └── statistics │ └── statistics.vue ├── static ├── logo.png ├── test.mp3 ├── tab-chat.png ├── tab-home.png ├── tab-stats.png ├── tab-category.png ├── tab-profile.png ├── tab-chat-active.png ├── tab-home-active.png ├── tab-stats-active.png ├── tab-category-active.png └── tab-profile-active.png ├── unpackage └── res │ └── icons │ ├── 20x20.png │ ├── 29x29.png │ ├── 40x40.png │ ├── 58x58.png │ ├── 60x60.png │ ├── 72x72.png │ ├── 76x76.png │ ├── 80x80.png │ ├── 87x87.png │ ├── 96x96.png │ ├── 1024x1024.png │ ├── 120x120.png │ ├── 144x144.png │ ├── 152x152.png │ ├── 167x167.png │ ├── 180x180.png │ └── 192x192.png ├── .hbuilderx └── launch.json ├── uni.promisify.adaptor.js ├── .gitignore ├── index.html ├── main.js ├── LICENSE ├── uni.scss ├── pages.json ├── App.vue ├── manifest.json ├── utils └── globalMethods.js └── README.md /app/images/智能记账.jpg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/images/智能配置.jpg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pages/category-manage/category-manage.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/static/logo.png -------------------------------------------------------------------------------- /static/test.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/static/test.mp3 -------------------------------------------------------------------------------- /app/images/我的.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/app/images/我的.jpg -------------------------------------------------------------------------------- /app/images/统计.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/app/images/统计.jpg -------------------------------------------------------------------------------- /app/images/首页.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/app/images/首页.jpg -------------------------------------------------------------------------------- /app/images/分类详情.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/app/images/分类详情.jpg -------------------------------------------------------------------------------- /app/images/图标管理.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/app/images/图标管理.jpg -------------------------------------------------------------------------------- /app/images/按住说话.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/app/images/按住说话.jpg -------------------------------------------------------------------------------- /app/images/智能体配置.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/app/images/智能体配置.jpg -------------------------------------------------------------------------------- /app/images/预算管理.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/app/images/预算管理.jpg -------------------------------------------------------------------------------- /static/tab-chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/static/tab-chat.png -------------------------------------------------------------------------------- /static/tab-home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/static/tab-home.png -------------------------------------------------------------------------------- /static/tab-stats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/static/tab-stats.png -------------------------------------------------------------------------------- /app/images/按住说话-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/app/images/按住说话-1.jpg -------------------------------------------------------------------------------- /app/images/智能记账-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/app/images/智能记账-1.jpg -------------------------------------------------------------------------------- /app/images/智能记账-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/app/images/智能记账-2.jpg -------------------------------------------------------------------------------- /app/images/智能记账-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/app/images/智能记账-3.jpg -------------------------------------------------------------------------------- /app/images/语音识别配置.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/app/images/语音识别配置.jpg -------------------------------------------------------------------------------- /static/tab-category.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/static/tab-category.png -------------------------------------------------------------------------------- /static/tab-profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/static/tab-profile.png -------------------------------------------------------------------------------- /static/tab-chat-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/static/tab-chat-active.png -------------------------------------------------------------------------------- /static/tab-home-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/static/tab-home-active.png -------------------------------------------------------------------------------- /static/tab-stats-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/static/tab-stats-active.png -------------------------------------------------------------------------------- /static/tab-category-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/static/tab-category-active.png -------------------------------------------------------------------------------- /static/tab-profile-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/static/tab-profile-active.png -------------------------------------------------------------------------------- /unpackage/res/icons/20x20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/20x20.png -------------------------------------------------------------------------------- /unpackage/res/icons/29x29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/29x29.png -------------------------------------------------------------------------------- /unpackage/res/icons/40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/40x40.png -------------------------------------------------------------------------------- /unpackage/res/icons/58x58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/58x58.png -------------------------------------------------------------------------------- /unpackage/res/icons/60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/60x60.png -------------------------------------------------------------------------------- /unpackage/res/icons/72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/72x72.png -------------------------------------------------------------------------------- /unpackage/res/icons/76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/76x76.png -------------------------------------------------------------------------------- /unpackage/res/icons/80x80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/80x80.png -------------------------------------------------------------------------------- /unpackage/res/icons/87x87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/87x87.png -------------------------------------------------------------------------------- /unpackage/res/icons/96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/96x96.png -------------------------------------------------------------------------------- /unpackage/res/icons/1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/1024x1024.png -------------------------------------------------------------------------------- /unpackage/res/icons/120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/120x120.png -------------------------------------------------------------------------------- /unpackage/res/icons/144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/144x144.png -------------------------------------------------------------------------------- /unpackage/res/icons/152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/152x152.png -------------------------------------------------------------------------------- /unpackage/res/icons/167x167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/167x167.png -------------------------------------------------------------------------------- /unpackage/res/icons/180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/180x180.png -------------------------------------------------------------------------------- /unpackage/res/icons/192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timwenx/SimpleAccount/HEAD/unpackage/res/icons/192x192.png -------------------------------------------------------------------------------- /.hbuilderx/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version" : "1.0", 3 | "configurations" : [ 4 | { 5 | "playground" : "standard", 6 | "type" : "uni-app:app-android" 7 | } 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /uni.promisify.adaptor.js: -------------------------------------------------------------------------------- 1 | uni.addInterceptor({ 2 | returnValue (res) { 3 | if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) { 4 | return res; 5 | } 6 | return new Promise((resolve, reject) => { 7 | res.then((res) => { 8 | if (!res) return resolve(res) 9 | return res[0] ? reject(res[0]) : resolve(res[1]) 10 | }); 11 | }); 12 | }, 13 | }); -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | node_modules/ 3 | 4 | # Build outputs 5 | unpackage/dist/ 6 | unpackage/build/ 7 | unpackage/resources/ 8 | unpackage/release/ 9 | 10 | # Cache 11 | unpackage/cache/ 12 | 13 | # IDE 14 | .vscode/ 15 | .idea/ 16 | *.swp 17 | *.swo 18 | 19 | # OS 20 | .DS_Store 21 | Thumbs.db 22 | 23 | # Logs 24 | *.log 25 | npm-debug.log* 26 | yarn-debug.log* 27 | yarn-error.log* 28 | 29 | # Environment variables 30 | .env 31 | .env.local 32 | .env.development.local 33 | .env.test.local 34 | .env.production.local 35 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | import App from './App' 2 | 3 | // #ifndef VUE3 4 | import Vue from 'vue' 5 | import './uni.promisify.adaptor' 6 | 7 | 8 | Vue.config.productionTip = false 9 | App.mpType = 'app' 10 | 11 | const app = new Vue({ 12 | ...App 13 | }) 14 | app.$mount() 15 | // #endif 16 | 17 | // #ifdef VUE3 18 | import { createSSRApp } from 'vue' 19 | import { saveStorageAndFile, saveJSONToDCIM, checkStoragePermission } from './utils/globalMethods' 20 | 21 | export function createApp() { 22 | const app = createSSRApp(App) 23 | 24 | // ✅ 挂载到全局属性 25 | app.config.globalProperties.$saveStorageAndFile = saveStorageAndFile 26 | app.config.globalProperties.$saveJSONToDCIM = saveJSONToDCIM 27 | app.config.globalProperties.$checkStoragePermission = checkStoragePermission 28 | return { 29 | app 30 | } 31 | } 32 | // #endif -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 tim wen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /uni.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * 这里是uni-app内置的常用样式变量 3 | * 4 | * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 5 | * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App 6 | * 7 | */ 8 | 9 | /** 10 | * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 11 | * 12 | * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 13 | */ 14 | 15 | /* 颜色变量 */ 16 | 17 | /* 行为相关颜色 */ 18 | $uni-color-primary: #007aff; 19 | $uni-color-success: #4cd964; 20 | $uni-color-warning: #f0ad4e; 21 | $uni-color-error: #dd524d; 22 | 23 | /* 文字基本颜色 */ 24 | $uni-text-color:#333;//基本色 25 | $uni-text-color-inverse:#fff;//反色 26 | $uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 27 | $uni-text-color-placeholder: #808080; 28 | $uni-text-color-disable:#c0c0c0; 29 | 30 | /* 背景颜色 */ 31 | $uni-bg-color:#ffffff; 32 | $uni-bg-color-grey:#f8f8f8; 33 | $uni-bg-color-hover:#f1f1f1;//点击状态颜色 34 | $uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 35 | 36 | /* 边框颜色 */ 37 | $uni-border-color:#c8c7cc; 38 | 39 | /* 尺寸变量 */ 40 | 41 | /* 文字尺寸 */ 42 | $uni-font-size-sm:12px; 43 | $uni-font-size-base:14px; 44 | $uni-font-size-lg:16px; 45 | 46 | /* 图片尺寸 */ 47 | $uni-img-size-sm:20px; 48 | $uni-img-size-base:26px; 49 | $uni-img-size-lg:40px; 50 | 51 | /* Border Radius */ 52 | $uni-border-radius-sm: 2px; 53 | $uni-border-radius-base: 3px; 54 | $uni-border-radius-lg: 6px; 55 | $uni-border-radius-circle: 50%; 56 | 57 | /* 水平间距 */ 58 | $uni-spacing-row-sm: 5px; 59 | $uni-spacing-row-base: 10px; 60 | $uni-spacing-row-lg: 15px; 61 | 62 | /* 垂直间距 */ 63 | $uni-spacing-col-sm: 4px; 64 | $uni-spacing-col-base: 8px; 65 | $uni-spacing-col-lg: 12px; 66 | 67 | /* 透明度 */ 68 | $uni-opacity-disabled: 0.3; // 组件禁用态的透明度 69 | 70 | /* 文章场景相关 */ 71 | $uni-color-title: #2C405A; // 文章标题颜色 72 | $uni-font-size-title:20px; 73 | $uni-color-subtitle: #555555; // 二级标题颜色 74 | $uni-font-size-subtitle:26px; 75 | $uni-color-paragraph: #3F536E; // 文章段落颜色 76 | $uni-font-size-paragraph:15px; 77 | 78 | /* 记账APP自定义样式变量 */ 79 | $primary-color: #007AFF; 80 | $secondary-color: #667eea; 81 | $success-color: #4ECDC4; 82 | $danger-color: #FF6B6B; 83 | $warning-color: #FFA500; 84 | $info-color: #999999; 85 | $background-color: #F5F5F5; 86 | $card-background: #ffffff; 87 | $text-color: #333333; 88 | $text-muted: #999999; 89 | -------------------------------------------------------------------------------- /pages.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages": [ 3 | { 4 | "path": "pages/index/index", 5 | "style": { 6 | "navigationBarTitleText": "我的账本" 7 | } 8 | }, 9 | { 10 | "path": "pages/add/add", 11 | "style": { 12 | "navigationBarTitleText": "记一笔" 13 | } 14 | }, 15 | { 16 | "path": "pages/statistics/statistics", 17 | "style": { 18 | "navigationBarTitleText": "统计" 19 | } 20 | }, 21 | { 22 | "path": "pages/category/category", 23 | "style": { 24 | "navigationBarTitleText": "分类浏览" 25 | } 26 | }, 27 | { 28 | "path": "pages/profile/profile", 29 | "style": { 30 | "navigationBarTitleText": "我的" 31 | } 32 | }, 33 | { 34 | "path": "pages/category-detail/category-detail", 35 | "style": { 36 | "navigationBarTitleText": "分类详情" 37 | } 38 | }, 39 | { 40 | "path": "pages/icon-manage/icon-manage", 41 | "style": { 42 | "navigationBarTitleText": "分类管理" 43 | } 44 | }, 45 | { 46 | "path": "pages/ai-config/ai-config", 47 | "style": { 48 | "navigationBarTitleText": "智能体配置" 49 | } 50 | }, 51 | { 52 | "path": "pages/voice-config/voice-config", 53 | "style": { 54 | "navigationBarTitleText": "语音识别配置" 55 | } 56 | }, 57 | { 58 | "path": "pages/chat/chat", 59 | "style": { 60 | "navigationBarTitleText": "智能记账" 61 | } 62 | }, 63 | { 64 | "path": "pages/budget-manage/budget-manage", 65 | "style": { 66 | "navigationBarTitleText": "预算管理" 67 | } 68 | } 69 | ], 70 | "globalStyle": { 71 | "navigationBarTextStyle": "white", 72 | "navigationBarTitleText": "我的账本", 73 | "navigationBarBackgroundColor": "#007AFF", 74 | "backgroundColor": "#F5F5F5", 75 | "app-plus": { 76 | "bounce": "none" 77 | } 78 | }, 79 | "tabBar": { 80 | "color": "#999999", 81 | "selectedColor": "#007AFF", 82 | "backgroundColor": "#ffffff", 83 | "borderStyle": "white", 84 | "position": "bottom", 85 | "height": "50px", 86 | "fontSize": "12px", 87 | "list": [ 88 | { 89 | "pagePath": "pages/index/index", 90 | "text": "首页", 91 | "iconPath": "static/tab-home.png", 92 | "selectedIconPath": "static/tab-home-active.png" 93 | }, 94 | { 95 | "pagePath": "pages/chat/chat", 96 | "text": "智能记账", 97 | "iconPath": "static/tab-chat.png", 98 | "selectedIconPath": "static/tab-chat-active.png" 99 | }, 100 | { 101 | "pagePath": "pages/statistics/statistics", 102 | "text": "统计", 103 | "iconPath": "static/tab-stats.png", 104 | "selectedIconPath": "static/tab-stats-active.png" 105 | }, 106 | { 107 | "pagePath": "pages/profile/profile", 108 | "text": "我的", 109 | "iconPath": "static/tab-profile.png", 110 | "selectedIconPath": "static/tab-profile-active.png" 111 | } 112 | ] 113 | }, 114 | "uniIdRouter": {} 115 | } 116 | -------------------------------------------------------------------------------- /App.vue: -------------------------------------------------------------------------------- 1 | 63 | 64 | 229 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "简账", 3 | "appid" : "__UNI__B5EBC6F", 4 | "description" : "一个自用记账APP", 5 | "versionName" : "1.0.4", 6 | "versionCode" : "100", 7 | "transformPx" : false, 8 | /* 5+App特有相关 */ 9 | "app-plus" : { 10 | "usingComponents" : true, 11 | "nvueStyleCompiler" : "uni-app", 12 | "compilerVersion" : 3, 13 | "splashscreen" : { 14 | "alwaysShowBeforeRender" : true, 15 | "waiting" : true, 16 | "autoclose" : true, 17 | "delay" : 0 18 | }, 19 | "compatible" : { 20 | "ignoreVersion" : true //true表示忽略版本检查提示框,HBuilderX1.9.0及以上版本支持 21 | }, 22 | /* 模块配置 */ 23 | "modules" : { 24 | "Record" : {} 25 | }, 26 | /* 应用发布信息 */ 27 | "distribute" : { 28 | /* android打包配置 */ 29 | "android" : { 30 | "permissions" : [ 31 | "", 32 | "", 33 | "", 34 | "", 35 | "", 36 | "", 37 | "", 38 | "", 39 | "", 40 | "", 41 | "", 42 | "", 43 | "", 44 | "" 45 | ], 46 | "abiFilters" : [ "armeabi-v7a", "arm64-v8a" ] 47 | }, 48 | /* ios打包配置 */ 49 | "ios" : { 50 | "dSYMs" : false 51 | }, 52 | /* SDK配置 */ 53 | "sdkConfigs" : {}, 54 | "icons" : { 55 | "android" : { 56 | "hdpi" : "unpackage/res/icons/72x72.png", 57 | "xhdpi" : "unpackage/res/icons/96x96.png", 58 | "xxhdpi" : "unpackage/res/icons/144x144.png", 59 | "xxxhdpi" : "unpackage/res/icons/192x192.png" 60 | }, 61 | "ios" : { 62 | "appstore" : "unpackage/res/icons/1024x1024.png", 63 | "ipad" : { 64 | "app" : "unpackage/res/icons/76x76.png", 65 | "app@2x" : "unpackage/res/icons/152x152.png", 66 | "notification" : "unpackage/res/icons/20x20.png", 67 | "notification@2x" : "unpackage/res/icons/40x40.png", 68 | "proapp@2x" : "unpackage/res/icons/167x167.png", 69 | "settings" : "unpackage/res/icons/29x29.png", 70 | "settings@2x" : "unpackage/res/icons/58x58.png", 71 | "spotlight" : "unpackage/res/icons/40x40.png", 72 | "spotlight@2x" : "unpackage/res/icons/80x80.png" 73 | }, 74 | "iphone" : { 75 | "app@2x" : "unpackage/res/icons/120x120.png", 76 | "app@3x" : "unpackage/res/icons/180x180.png", 77 | "notification@2x" : "unpackage/res/icons/40x40.png", 78 | "notification@3x" : "unpackage/res/icons/60x60.png", 79 | "settings@2x" : "unpackage/res/icons/58x58.png", 80 | "settings@3x" : "unpackage/res/icons/87x87.png", 81 | "spotlight@2x" : "unpackage/res/icons/80x80.png", 82 | "spotlight@3x" : "unpackage/res/icons/120x120.png" 83 | } 84 | } 85 | } 86 | } 87 | }, 88 | /* 快应用特有相关 */ 89 | "quickapp" : {}, 90 | /* H5特有相关 */ 91 | "h5" : { 92 | "title" : "我的账本", 93 | "template" : "index.html", 94 | "router" : { 95 | "mode" : "hash", 96 | "base" : "./" 97 | }, 98 | "optimization" : { 99 | "treeShaking" : { 100 | "enable" : false 101 | } 102 | } 103 | }, 104 | /* 小程序特有相关 */ 105 | "mp-weixin" : { 106 | "appid" : "", 107 | "setting" : { 108 | "urlCheck" : false 109 | }, 110 | "usingComponents" : true 111 | }, 112 | "mp-alipay" : { 113 | "usingComponents" : true 114 | }, 115 | "mp-baidu" : { 116 | "usingComponents" : true 117 | }, 118 | "mp-toutiao" : { 119 | "usingComponents" : true 120 | }, 121 | "uniStatistics" : { 122 | "enable" : false 123 | }, 124 | "vueVersion" : "3" 125 | } 126 | -------------------------------------------------------------------------------- /utils/globalMethods.js: -------------------------------------------------------------------------------- 1 | 2 | export function saveStorageAndFile(key,value) { 3 | console.log("存储-key:{},value:{}",key,value); 4 | uni.setStorageSync(key, value); 5 | // #ifdef APP-PLUS 6 | try{ 7 | let obj = []; 8 | uni.getStorageInfoSync().keys.forEach(e => { 9 | if (e) { 10 | let o = {}; 11 | o[e] = uni.getStorageSync(e); 12 | obj[obj.length] = o; 13 | } 14 | }); 15 | const recordCount = obj.length; 16 | const fileName = 'record_info.json'; 17 | this.$saveJSONToDCIM(JSON.stringify(obj), recordCount, fileName); 18 | }catch(e){ 19 | console.log("error",e) 20 | } 21 | // #endif 22 | } 23 | 24 | export function saveJSONToDCIM(jsonContent, recordCount, fileName = 'record_info.json') { 25 | console.log('=== 开始保存JSON到外部公共存储 ==='); 26 | console.log('文件名:', fileName); 27 | console.log('记录数量:', recordCount); 28 | 29 | this.$checkStoragePermission().then(() => { 30 | try { 31 | const Environment = plus.android.importClass('android.os.Environment'); 32 | const File = plus.android.importClass('java.io.File'); 33 | const FileOutputStream = plus.android.importClass('java.io.FileOutputStream'); 34 | const OutputStreamWriter = plus.android.importClass('java.io.OutputStreamWriter'); 35 | 36 | const state = Environment.getExternalStorageState(); 37 | if (state !== Environment.MEDIA_MOUNTED) { 38 | throw new Error('外部存储不可用'); 39 | } 40 | 41 | let publicDownloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 42 | 43 | if (publicDownloadsDir === null || publicDownloadsDir === undefined) { 44 | const externalStorageDir = Environment.getExternalStorageDirectory(); 45 | if (externalStorageDir !== null) { 46 | publicDownloadsDir = new File(externalStorageDir, 'Download'); 47 | console.log('使用备用下载目录路径:', publicDownloadsDir.getAbsolutePath()); 48 | } else { 49 | throw new Error('无法获取任何外部存储目录,设备可能不支持'); 50 | } 51 | } else { 52 | console.log('公共下载目录:', publicDownloadsDir.getAbsolutePath()); 53 | } 54 | 55 | if (!publicDownloadsDir.exists()) { 56 | const created = publicDownloadsDir.mkdirs(); 57 | if (!created) { 58 | throw new Error('下载目录不存在且无法创建'); 59 | } 60 | } 61 | 62 | if (!publicDownloadsDir.canWrite()) { 63 | throw new Error('下载目录不可写,请检查权限'); 64 | } 65 | 66 | const accountDataDir = new File(publicDownloadsDir, 'AccountData'); 67 | if (!accountDataDir.exists()) { 68 | const created = accountDataDir.mkdirs(); 69 | console.log('创建AccountData目录结果:', created); 70 | if (!created) { 71 | throw new Error('无法创建AccountData目录'); 72 | } 73 | } 74 | 75 | const jsonFile = new File(accountDataDir, fileName); 76 | const absolutePath = jsonFile.getAbsolutePath(); 77 | console.log('目标文件完整路径:', absolutePath); 78 | 79 | if (jsonFile.exists()) { 80 | jsonFile.delete(); 81 | } 82 | 83 | const fos = new FileOutputStream(jsonFile); 84 | const writer = new OutputStreamWriter(fos, 'UTF-8'); 85 | 86 | const bom = '\ufeff'; 87 | const fullContent = bom + jsonContent; 88 | 89 | writer.write(fullContent); 90 | writer.flush(); 91 | writer.close(); 92 | fos.close(); 93 | 94 | const fileSize = jsonFile.length(); 95 | console.log('JSON文件写入完成,大小:', fileSize); 96 | 97 | } catch (error) { 98 | console.error('原生文件操作失败:', error); 99 | } 100 | }).catch((err) => { 101 | console.error('存储权限检查失败:', err); 102 | uni.showModal({ 103 | title: '权限不足', 104 | content: '需要存储权限才能保存到公共目录。请在应用设置中授予存储权限。', 105 | showCancel: true, 106 | confirmText: '去设置', 107 | cancelText: '取消', 108 | success: (res) => { 109 | if (res.confirm) { 110 | const Intent = plus.android.importClass('android.content.Intent'); 111 | const Settings = plus.android.importClass('android.provider.Settings'); 112 | const Uri = plus.android.importClass('android.net.Uri'); 113 | const main = plus.android.runtimeMainActivity(); 114 | 115 | const intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 116 | const uri = Uri.fromParts('package', main.getPackageName(), null); 117 | intent.setData(uri); 118 | main.startActivity(intent); 119 | } 120 | } 121 | }); 122 | }); 123 | } 124 | 125 | export function checkStoragePermission() { 126 | return new Promise((resolve, reject) => { 127 | const Context = plus.android.importClass('android.content.Context'); 128 | const PackageManager = plus.android.importClass('android.content.pm.PackageManager'); 129 | const Manifest = plus.android.importClass('android.Manifest'); 130 | const main = plus.android.runtimeMainActivity(); 131 | 132 | const writePermission = main.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); 133 | const readPermission = main.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE); 134 | 135 | if (writePermission === PackageManager.PERMISSION_GRANTED && 136 | readPermission === PackageManager.PERMISSION_GRANTED) { 137 | console.log('存储权限已授予'); 138 | resolve(); 139 | } else { 140 | console.log('存储权限未授予,尝试请求权限'); 141 | const ActivityCompat = plus.android.importClass('androidx.core.app.ActivityCompat'); 142 | ActivityCompat.requestPermissions(main, [ 143 | Manifest.permission.WRITE_EXTERNAL_STORAGE, 144 | Manifest.permission.READ_EXTERNAL_STORAGE 145 | ], 1001); 146 | 147 | setTimeout(() => { 148 | const newWritePermission = main.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); 149 | const newReadPermission = main.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE); 150 | 151 | if (newWritePermission === PackageManager.PERMISSION_GRANTED && 152 | newReadPermission === PackageManager.PERMISSION_GRANTED) { 153 | resolve(); 154 | } else { 155 | reject(new Error('用户未授予存储权限')); 156 | } 157 | }, 2000); 158 | } 159 | }); 160 | } 161 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 简帐 📊 2 | 3 |

4 | 简帐应用图标 5 |

6 | 7 |

一款简洁优雅的本地记账应用,采用 uni-app 框架开发,支持多端运行。

8 | 9 | ## 🚀 快速开始 10 | 11 | ### 📱 立即下载 12 |

13 | 14 | GitHub下载 15 | 16 |    17 | 18 | Gitee下载 19 | 20 |

21 | 22 | > 🔥 **获取最新版本**: 23 | > - 🌍 **国际用户**: 前往 [GitHub Releases](https://github.com/timwenx/SimpleAccount/releases/) 下载 24 | > - 🇨🇳 **国内用户**: 前往 [Gitee Releases](https://gitee.com/timwenx/simple-account/releases/) 下载 25 | 26 | ### 🎯 核心功能 27 | - ✅ 本地数据存储,隐私安全 28 | - ✅ 支持收支分类管理 29 | - ✅ 可视化数据统计 30 | - ✅ CSV 数据导入导出 31 | - ✅ 精美UI设计 32 | - 🆕 **AI智能记账** - 语音/文字输入自动识别记账信息 33 | - 🆕 **智能体配置** - 自定义AI模型和提示词 34 | - 🆕 **语音识别** - 支持按住说话功能,自动转换语音为文字 35 | 36 | --- 37 | 38 | ## ✨ 功能特色 39 | 40 | - 💰 **记账管理** - 快速记录收支,支持分类管理 41 | - 📈 **数据统计** - 多维度数据分析,趋势图表展示 42 | - 🏷️ **分类管理** - 自定义收支分类,图标管理 43 | - 📊 **可视化图表** - 饼状图、柱状图展示消费趋势 44 | - 💾 **数据导入导出** - 支持 CSV 格式数据备份 45 | - 🎨 **精美界面** - 渐变色设计,流畅动画效果 46 | - 🤖 **AI智能记账** - 自然语言输入,智能解析记账信息 47 | - ⚙️ **智能体配置** - 支持自定义AI模型接口和提示词 48 | - �️ **语音识别** - 支持按住说话,语音转文字记账 49 | - �🎯 **丰富图标库** - 20+图标,支持自定义分类图标 50 | 51 | ## 🚀 技术栈 52 | 53 | - **框架**: uni-app 54 | - **语言**: JavaScript + Vue.js 55 | - **存储**: 本地存储 (localStorage/Storage API) 56 | - **UI**: 自定义组件 + CSS3 动画 57 | - **AI集成**: OpenAI API / 兼容接口 58 | - **语音识别**: 字节跳动火山引擎语音识别服务 59 | - **智能解析**: 自然语言处理 + JSON结构化数据 60 | 61 | ## 📱 页面结构 62 | 63 | ``` 64 | pages/ 65 | ├── index/ # 首页 - 收支记录列表 66 | ├── add/ # 添加记录页面 67 | ├── category/ # 分类页面 68 | ├── category-detail/ # 分类详情统计 69 | ├── category-manage/ # 分类管理 70 | ├── icon-manage/ # 图标管理 71 | ├── statistics/ # 统计分析页面 72 | ├── profile/ # 个人中心/设置页面 73 | ├── chat/ # AI智能记账聊天页面 74 | ├── ai-config/ # AI智能体配置页面 75 | └── voice-config/ # 语音识别配置页面 76 | ``` 77 | 78 | ## 🛠️ 安装运行 79 | 80 | ### 开发环境 81 | 82 | #### 环境要求 83 | - Node.js 14+ 84 | - HBuilderX 或 VS Code 85 | - uni-app 开发环境 86 | 87 | #### 运行步骤 88 | 89 | 1. **克隆项目** 90 | ```bash 91 | git clone 92 | cd 简帐 93 | ``` 94 | 95 | 2. **使用 HBuilderX** 96 | - 打开 HBuilderX 97 | - 文件 > 导入 > 从本地目录导入 98 | - 选择项目目录 99 | - 运行到浏览器或手机设备 100 | 101 | 3. **使用 VS Code** 102 | ```bash 103 | # 安装依赖 104 | npm install 105 | 106 | # 运行到 H5 107 | npm run dev:h5 108 | 109 | # 打包 110 | npm run build:h5 111 | ``` 112 | 113 | ## 💡 主要功能说明 114 | 115 | ### 记账功能 116 | - 快速添加收支记录 117 | - 支持金额、分类、备注、时间记录 118 | - 收支类型自动识别和统计 119 | 120 | ### 分类管理 121 | - 自定义收支分类 122 | - 丰富的图标库(20+图标) 123 | - 支持分类的增删改查 124 | - 智能图标匹配推荐 125 | 126 | ### AI智能记账 127 | - 自然语言输入记账信息 128 | - 智能解析金额、分类、备注 129 | - 支持单笔和批量记账识别 130 | - 自动创建新分类并匹配图标 131 | - 多种AI模型接口支持 132 | 133 | ### 智能体配置 134 | - 自定义AI接口地址和密钥 135 | - 预设记账助手和财务顾问模板 136 | - 支持自定义系统提示词 137 | - 连接测试和状态监控 138 | 139 | ### 语音识别配置 140 | - 支持字节跳动火山引擎语音识别服务 141 | - 可配置App ID和Access Key 142 | - 支持多种识别模型选择 143 | - 可开启标点符号、数字转换等功能 144 | - 内置演示模式,无需配置即可体验 145 | - 🔗 [火山引擎控制台 - 语音识别服务](https://console.volcengine.com/ark/region:ark+cn-beijing/tts/recordingRecognition) 146 | 147 | ### 数据统计 148 | - 月度/年度收支统计 149 | - 分类占比饼状图 150 | - 收支趋势图表 151 | - 详细的数据分析报告 152 | 153 | ### 数据管理 154 | - CSV 格式数据导出 155 | - 数据导入功能 156 | - 本地数据清理 157 | 158 | ## 🤖 AI智能记账功能 159 | 160 | ### ✨ 核心特性 161 | - **自然语言输入**: 支持"今天早餐20元,打车15元"等自然语言记账 162 | - **语音输入支持**: 按住说话按钮,自动将语音转换为文字后智能解析 163 | - **智能解析**: 自动识别金额、分类、备注和时间信息 164 | - **批量处理**: 一次输入多笔记账,智能分离处理 165 | - **分类智能匹配**: 优先使用现有分类,必要时自动创建新分类 166 | - **图标自动匹配**: 新分类自动匹配合适的图标 167 | 168 | ### 🔧 配置说明 169 | 170 | #### AI智能体配置 171 | 1. **进入设置**: 个人中心 → AI智能体配置 172 | 2. **API配置**: 输入OpenAI或兼容接口的API地址和密钥 173 | 3. **模型选择**: 支持GPT-3.5、GPT-4等主流模型 174 | 4. **提示词自定义**: 可使用预设模板或自定义智能体指令 175 | 5. **测试连接**: 确保API配置正确 176 | 177 | #### 语音识别配置 178 | 1. **进入设置**: 个人中心 → 语音识别配置 179 | 2. **选择模式**: 180 | - **演示模式**: 无需配置,可直接体验语音录制功能 181 | - **火山引擎模式**: 需配置API密钥,支持真实语音识别 182 | 3. **API配置**: 输入字节跳动App ID和Access Key 183 | 4. **识别设置**: 184 | - 选择识别模型(bigmodel/general) 185 | - 开启标点符号识别 186 | - 开启数字转换功能 187 | - 开启说话人识别(可选) 188 | 5. **测试配置**: 确保语音识别服务正常 189 | 190 | ### 💬 使用示例 191 | 192 | #### 文字输入示例 193 | ``` 194 | 用户输入: "今天中午吃饭花了35元,下午买衣服200元" 195 | AI解析: 196 | - 支出 35元 餐饮 备注:中午吃饭 时间:今天中午 197 | - 支出 200元 购物 备注:买衣服 时间:今天下午 198 | ``` 199 | 200 | #### 语音输入示例 201 | ``` 202 | 用户语音: "早上打车花了二十五块钱" 203 | 语音识别: "早上打车花了二十五块钱" 204 | AI解析: 205 | - 支出 25元 交通 备注:打车 时间:早上 206 | ``` 207 | 208 | ### 🎯 智能体模板 209 | - **记账助手**: 专门解析记账信息,严格按照JSON格式返回 210 | - **财务顾问**: 除记账外,还能提供理财建议和财务分析 211 | 212 | ## 🎙️ 语音识别功能 213 | 214 | ### ✨ 核心特性 215 | - **按住说话**: 在聊天页面长按语音按钮开始录音 216 | - **实时识别**: 松开按钮自动识别并转换为文字 217 | - **智能解析**: 语音转文字后自动进行记账信息解析 218 | - **多种模式**: 支持演示模式和真实识别模式 219 | - **高准确率**: 基于字节跳动火山引擎语音识别技术 220 | 221 | ### 🔧 配置选项 222 | - **识别模型**: bigmodel(大模型)/ general(通用模型) 223 | - **标点符号**: 自动添加标点符号 224 | - **数字转换**: 将语音中的数字词汇转换为阿拉伯数字 225 | - **说话人识别**: 多人对话场景下的说话人区分 226 | 227 | ### 🚀 使用流程 228 | 1. **配置服务**: 个人中心 → 语音识别配置 → 输入API密钥 229 | 2. **开始录音**: 聊天页面 → 切换到语音模式 → 按住说话按钮 230 | 3. **语音输入**: 清晰说出记账信息,如"今天午餐花了30元" 231 | 4. **自动识别**: 松开按钮,系统自动识别语音并转换为文字 232 | 5. **智能解析**: AI自动解析记账信息并生成记录 233 | 234 | ### 🎪 演示模式 235 | - **零配置体验**: 无需API密钥即可体验语音录制流程 236 | - **功能完整**: 支持语音录制、界面交互等所有功能 237 | - **快速上手**: 新用户可快速了解语音记账的操作方式 238 | 239 | ## 🎨 图标管理系统 240 | 241 | ### 📦 图标资源 242 | - **总数量**: 20+ emoji图标 243 | - **分类覆盖**: 餐饮、交通、购物、娱乐、医疗、教育等12大类 244 | - **智能推荐**: 根据分类名称自动推荐合适图标 245 | - **自由选择**: 支持从图标库中自由选择任意图标 246 | 247 | ### 🔄 分类图标 248 | - 餐饮美食: 🍽️ 🍕 🍔 🍟 🍗 等20+图标 249 | - 交通出行: 🚗 🚙 🚌 ✈️ 🚲 等30+图标 250 | - 购物消费: 🛍️ 🛒 💳 👕 👜 等25+图标 251 | - 娱乐休闲: 🎬 🎮 🎲 🏀 ⚽ 等30+图标 252 | - 更多分类持续更新... 253 | 254 | ## 🎨 界面预览 255 | 256 | 应用采用现代化的渐变色设计风格: 257 | - 主色调:蓝紫渐变 (#667eea → #764ba2) 258 | - 卡片式布局,圆角设计 259 | - 流畅的动画效果和交互反馈 260 | 261 | ### 应用截图 262 | 263 |
264 | 265 | **首页 - 记账概览** 266 | 267 | 首页界面 268 | 269 | **AI智能记账 - 自然语言输入** 270 | 271 | AI智能记账界面 272 | 273 | **智能记账 - 批量识别** 274 | 275 | 批量记账识别 276 | 277 | **智能记账 - 确认记录** 278 | 279 | 确认记账 280 | 281 | **智能体配置 - AI模型设置** 282 | 283 | 智能体配置页面 284 | 285 | **语音识别配置 - 按住说话设置** 286 | 287 | 语音识别配置页面 288 | 289 | **按住说话演示** 290 | 291 | 按住说话演示 292 | 293 | **按住说话演示2** 294 | 295 | 按住说话演示2 296 | 297 | **统计分析** 298 | 299 | 统计页面 300 | 301 | **分类详情** 302 | 303 | 分类详情页面 304 | 305 | **图标管理** 306 | 307 | 图标管理页面 308 | 309 | **预算管理** 310 | 311 | 预算管理页面 312 | 313 | **个人中心** 314 | 315 | 个人中心页面 316 | 317 |
318 | 319 | ### 界面特色 320 | - 🎨 **渐变背景** - 优雅的蓝紫色渐变设计 321 | - 📱 **响应式布局** - 适配不同屏幕尺寸 322 | - 💫 **流畅动画** - 丰富的交互动效 323 | - 🎯 **直观图表** - 清晰的数据可视化 324 | - 🔄 **一致体验** - 统一的设计语言 325 | - 🤖 **智能交互** - AI聊天界面,自然语言记账 326 | - �️ **语音交互** - 按住说话,语音转文字记账功能 327 | - �🎭 **图标丰富** - 20+emoji图标,涵盖各行各业 328 | 329 | ## 📄 许可证 330 | 331 | MIT License 332 | 333 | ## 🤝 贡献 334 | 335 | 欢迎提交 Issue 和 Pull Request! 336 | 337 | ## 📞 联系方式 338 | 339 | 如有问题或建议,欢迎联系开发者。 340 | -------------------------------------------------------------------------------- /pages/ai-config/ai-config.vue: -------------------------------------------------------------------------------- 1 | 102 | 103 | 296 | 297 | 515 | -------------------------------------------------------------------------------- /pages/category/category.vue: -------------------------------------------------------------------------------- 1 | 67 | 68 | 224 | 225 | 613 | -------------------------------------------------------------------------------- /pages/add/add.vue: -------------------------------------------------------------------------------- 1 |