从0到1实现单机记账APP原理与细节uniApp内含源码 (二)

news2024/11/25 15:39:30

单机记账APP演示及源码

具体演示如下面视频所示。免费下载地址:点击进入
预览APP下载地址:http://8.142.10.182:8888/down/aWHWeGaEQE2W.apk (带宽很小所以下载速度慢)
由于资源已经通过了,页面的样式这里就不写了,主要把方法还有思路写下来。
第一章记账功能实现

请添加图片描述


单机记账APP

  • 单机记账APP演示及源码
    • 一、记账功能实现
      • 1.首页实现
      • 2.全部账单实现
      • 3.个人中心
    • 小总结

一、记账功能实现

1.首页实现

界面效果如下:
在这里插入图片描述
上面的支出、收入、预算的就不说了。预算其实可以考虑本地缓存一个数据用于存储变量,将预算设置为活的。我这里面没有设置。
在onshow里面调用getBook方法,然后取到本地缓存数据,先通过sort将数据进行排序,随后通过map方法算出支出/收益,将同一天的统计在一起。
方法如下。

// 查询本月账单
getBook() {
	let accName = this.yearTime + '-' + this.monthTime
	let resList = uni.getStorageSync(accName).list || []
	
	//指定排序列
	function orderBy(name) { 
		return function(object1, object2) {
			var val1 = object1[name];
			var val2 = object2[name];
			if (val1 < val2) return 1;
			else if (val1 > val2) return -1;
			else return 0;
		}
	}
	resList.sort(orderBy('datetime'));
	
	this.costMoney = 0 // 花费
	this.wageMoney = 0 // 收入



	resList.map(accValue => {
		if (accValue.statusPay == 0) {
			this.costMoney += parseInt(accValue.money)
		} else {
			this.wageMoney += parseInt(accValue.money)
		}
		accValue['title'] = uni.$u.date((accValue.datetime), 'mm月dd日')
		this.typeList.map(typeValue => {
			if (typeValue.id == accValue.typeStatu) {
				accValue['img'] = typeValue.img
				accValue['name'] = typeValue.name
			}
		})
	})

	// 进行分类
	let dataArr = [];
	resList.map(accValue => {
		if (dataArr.length == 0) {
			dataArr.push({
				title: accValue.title,
				List: [accValue]
			})
		} else {
			let res = dataArr.some(item => { //判断相同日期,有就添加到当前项
				if (item.title == accValue.title) {
					item.List.push(accValue)
					return true
				}
			})
			if (!res) { //如果没找相同日期添加一个新对象
				dataArr.push({
					title: accValue.title,
					List: [accValue]
				})
			}
		}
	})
	this.accList = dataArr
	
},

2.全部账单实现

界面效果如下:
在这里插入图片描述
在这里插入图片描述
这里最新时间没有在最上面,把排序的方法转变一下就可以实现了。方法其实和首页的类似。最开始没有想到全部账本,后续写的时候,需要这个了,然后考虑到如果每次进来全部循环遍历计算支出金额,就太无脑了。给每一个每月存储的数据加了一个总支出。然而实际情况下我还是无脑遍历了一遍。写文章的时候才发现自己无脑遍历了。应该把查询每月账本getBook()方法从for循环抽出来,在setSelet()查看每一个详情的时候再调用这个方法。
这个关键的是const res = uni.getStorageInfoSync(); 取到缓存中所有的字段名字,当字段名字等于7个字符时就认为账本信息,然后去取信息。
在这里插入图片描述

方法如下:

setSelet(i){
if(this.seletInxde == i){
		this.seletInxde = null
	}else{
		this.seletInxde = i
	}
},
getAllBook(){
	this.accAllList = []
	const res = uni.getStorageInfoSync();
	for(var i=0;i<res.keys.length;i++){
		if(res.keys[i].length == 7){
			this.getBook(res.keys[i])
			this.accAllList.push(this.accList) 
		}
	}
	console.log(this.accAllList)
},
// 查询每月账本
getBook(accName) {
	this.accList = {}
	let resList = uni.getStorageSync(accName).list
	//指定排序列
	function orderBy(name) { 
		return function(object1, object2) {
			var val1 = object1[name];
			var val2 = object2[name];
			if (val1 < val2) return 1;
			else if (val1 > val2) return -1;
			else return 0;
		}
	}
	resList.sort(orderBy('datetime'));

	resList.map(accValue => {
		accValue['title'] = uni.$u.date((accValue.datetime), 'mm月dd日')
		this.typeList.map(typeValue => {
			if (typeValue.id == accValue.typeStatu) {
				accValue['img'] = typeValue.img
				accValue['name'] = typeValue.name
			}
		})
	})

	// 进行分类
	let dataArr = [];
	resList.map(accValue => {
		if (dataArr.length == 0) {
			dataArr.push({
				'title': accValue.title,
				'allMoney':uni.getStorageSync(accName).allMoney,
				'dataTitle':accName,
				'List': [accValue]
			})
		} else {
			let res = dataArr.some(item => { //判断相同日期,有就添加到当前项
				if (item.title == accValue.title) {
					item.List.push(accValue)
					return true
				}
			})
			if (!res) { //如果没找相同日期添加一个新对象
				dataArr.push({
					'title': accValue.title,
					'allMoney':uni.getStorageSync(accName).allMoney,
					'dataTitle':accName,
					'List': [accValue]
				})
			}
		}
	})
	this.accList = dataArr
	
},

3.个人中心

在这里插入图片描述
这里的图表使用的是插件市场里面的Ucharts,然后照着。【ECharts配置手册】 , 根据配置手册进行想要的配置。

小总结

总体下来没有多少技术难点,小小练手。可以的话点个赞吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/385208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯单片机组省赛十二届第一场(关于矩阵,温度ds18b20,时间ds1302的学习,以及继电器等外设的综合利用)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、该题目如下二、使用步骤1.矩阵键盘实现2.温度传感器ds18b20的实现总结提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、该题目如下 分…

使用Containerd搭建K8s集群【v1.25】

[toc] 一、安装要求 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: 一台或多台机器,操作系统 CentOS7.x-86_x64硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多集群中所有机器之间网络互通可以访问外网,需要拉取镜像禁止swap分区二、准备环境 角色IP…

重磅新品 / 酷炫展品 / 强大生态,广和通玩转 MWC Barcelona 2023

2月27日&#xff0c;2023世界移动通信大会&#xff08;MWC Barcelona 2023&#xff09;在西班牙巴塞罗那正式开幕。全球知名移动运营商、设备制造商、技术提供商、物联网企业齐聚一堂&#xff0c;以领先的技术、创新的场景、前瞻的洞察向全行业输送最新鲜的行业观点。作为全球领…

python的opencv操作记录13——区域生长及分水岭算法

文章目录图像区域基本算法——形态学运算腐蚀与膨胀开运算与闭运算opencv中的形态学运算距离计算——distanceTransform函数连通域连通的定义计算连通域——connectedComponents连通域实验基于区域的分割区域生长算法自定义一个最简单区域生长算法实现区域分割一般区域分割open…

解决vscode无法自动更新

一&#xff0e;前言 要在&#xff56;&#xff53;&#xff43;&#xff4f;&#xff44;&#xff45;里面安装插件&#xff0c;被提示版本不匹配&#xff0c;然后得更新&#xff0c;然后我发现我的&#xff07;帮助&#xff07;菜单栏下没有检查更新&#xff0c;然后我去&…

19- CNN进行Fashion-MNIST分类 (tensorflow系列) (项目十九)

项目要点 Fashion-MNIST总共有十个类别的图像。代码运行位置 CPU: cputf.config.set_visible_devices(tf.config.list_physical_devices("CPU"))fashion_mnist keras.datasets.fashion_mnist # fashion_mnist 数据导入训练数据和测试数据拆分: x_valid, x_train…

WebAPI

WebAPI知识详解day11.Web API 基本认知作用和分类什么是DOM&#xff1f;DOM树的概念DOM对象2.获取DOM对象通过css选择器获取dom对象通过其他方法获取dom3.设置/修改DOM元素内容方法1. document.write() 方法方法2. 对象.innerText 属性方法3. 对象.innerHTML4.设置/修改DOM元素…

【TypeScript】的上手学习指南!

目录TS简介TypeScript是什么&#xff1f;为什么要推荐使用TypeScript生态支持安装TypeScriptTS简介 TypeScript是什么&#xff1f; TypeScript官网 简介&#xff1a;TypeScript是JavaScript类型的超集&#xff0c;它可以编译成纯JavaScript。TypeScript可以在任何浏览器、任何计…

JVM之执行引擎详解

1、概述javac将.java文件编译成.class文件&#xff0c;然后.class文件通过类加载子系统将字节码加载到运行时数据区&#xff0c;这时运行时数据区中的数据是java字节码&#xff0c;字节码是不能直接运行在操作系统之上&#xff0c;因为字节码指令并非等价于本地机器指令&#x…

Python练习题

作业1&#xff1a;判断一个数&#xff0c;是否是2的指数 2的指数 0000 0010 0000 0001 0000 0100 0000 0011 0000 1000 0000 0111 0001 0000 0000 1111 提示&#xff1a;所有2的指数&#xff1a;n&(n - 1) 0 exponent int(…

mybatisplus复习(黑马)

学习目标能够基于MyBatisPlus完成标准Dao开发能够掌握MyBatisPlus的条件查询能够掌握MyBatisPlus的字段映射与表名映射能够掌握id生成策略控制能够理解代码生成器的相关配置一、MyBatisPlus简介MyBatisPlus&#xff08;简称MP&#xff09;是基于MyBatis框架基础上开发的增强型工…

Linux:进程间通信

目录 进程间通信目的 进程间通信分类 管道 System V IPC POSIX IPC 什么是管道 站在文件描述符角度-深度理解管道 管道使用 管道通信的四种情况 管道通信的特点 进程池管理 命名管道 创建一个命名管道 命名管道的打开规则 命名管道通信实例 匿名管道与命名管道的…

C语言实现三子棋【详解+全部源码】

大家好&#xff0c;我是你们熟悉的恒川 今天我们用C语言来实现三子棋 实现的过程很难&#xff0c;但我们一定要不放弃 三子棋1. 配置运行环境2. 三子棋游戏的初步实现2.1 建立三子棋分布模块2.2 创建一个名为board的二维数组并进行初始化2.3 搭建棋盘3. 接下来该讨论的事情3.1 …

【微信小程序】-- 网络数据请求(十九)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

Jmeter接口测试教程之【参数化技巧总结】,总有一个是你不知道的

目录&#xff1a;导读 一、随机值 二、随机字符串 三、时间戳 四、唯一字符串UUID 说起接口测试&#xff0c;相信大家在工作中用的最多的还是Jmeter。 大家看这个目录就知道jmeter的应用有多广泛了&#xff1a;https://www.bilibili.com/video/BV1e44y1X78S/? JMeter是一个…

C#:Krypton控件使用方法详解(第十一讲) ——kryptonScrollBar

今天介绍的Krypton控件中的kryptonScrollBar。下面介绍这个控件的外观属性&#xff1a;BackColor属性&#xff1a;表示控件的背景色&#xff0c;属性值如下图所示&#xff1a;BackgroundImage属性&#xff1a;表示用于该控件的背景图像&#xff0c;属性值可以为本地导入图片。B…

final修饰符使用中遇到的一些问题

文章目录final修饰符1. final不能用来修饰构造方法2. final修饰变量的一些注意问题2.1 final修饰成员变量2.2 final修饰引用类型2.2.1 演示代码中lombok链式编程介绍final修饰符 final具有“不可改变”的含义&#xff0c;它可以修饰非抽象类、非抽象成员方法和变量。 用final…

day3 动态的web 开发一个带有Servlet(Java小程序)的webapp

文章目录对于一个动态的web应用来说&#xff0c;一个请求和响应的过程有多少个角色参与&#xff0c;角色和角色之间有多少个协议开发一个带有Servlet&#xff08;Java小程序&#xff09;的webapp&#xff08;重点&#xff09;对于一个动态的web应用来说&#xff0c;一个请求和响…

【算法经典题集】二分(持续更新~~~)

&#x1f63d;PREFACE&#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐ 评论&#x1f4dd;&#x1f4e2;系列专栏&#xff1a;算法经典题集&#x1f50a;本专栏涉及到的知识点或者题目是算法专栏的补充与应用&#x1f4aa;种一棵树最好是十年前其次是现在二分整数二分机器人…

java25种设计模式之工厂模式

Java设计模式 - 工厂模式 工厂模式是一种创建模式&#xff0c;因为此模式提供了更好的方法来创建对象。 在工厂模式中&#xff0c;我们创建对象而不将创建逻辑暴露给客户端。 例子 在以下部分中&#xff0c;我们将展示如何使用工厂模式创建对象。 由工厂模式创建的对象将是…