百度网盘链接:https://pan.baidu.com/s/1zN9lrIypi1t_QpuoBcdBNQ?pwd=xj5h
提取码:xj5h
项目设计内容
1.基本功能描述
电子记账本是一种在线财务管理工具,用于帮助用户记录和管理他们的收入与支出。以下是电子记账本的内容和基本功能的详细说明:
1.1用户登录界面:记账本启动后默认进入的界面,在该界面下已拥有账户的用户可以直接输入用户名和密码来进入记账本首页,新用户则需点击“注册”按钮以进入用户注册界面创建新用户信息。
1.2用户注册界面:新用户需要设置一个用户名并设置密码才能使用电子记账本,一旦注册成功,用户就可以返回登录界面并通过输入用户名和密码来进入记账本首页。
1.3记账本首页:用户通过在成功登录后进入的页面,该页面主要用于跳转至其他功能性页面,包括新增数据、数据汇总、数据分析以及系统设置界面。
1.4新增收入数据界面:用户可以在该界面中添加新的收入记录。包括收入的金额、日期、付款方和类别等信息。输入数据后点击“添加”按钮,系统即可将数据录入数据库中,以便后续的查询和汇总分析处理。
1.5新增支出数据界面:与新增收入界面类似,用户可以在该界面中添加新的支出记录,包括支出的金额、日期、收款方和类别等信息。输入数据后点击“添加”按钮,系统即可将数据录入数据库中,以便后续的查询和汇总分析处理。
1.6收入明细界面:该界面将列出用户在“新增收入”界面中录入的所有收入记录,为用户提供数据查询功能。
1.7支出明细界面:与“收入明细”类似,该界面将列出用户在“新增支出”界面中录入的所有支出记录,为用户提供数据查询功能。
1.8数据修改界面:用户可通过点击“收入/支出明细”界面中的数据直接跳转至对应数据的修改界面,在该界面下,用户可修改或删除当前的收入/支出数据,点击保存后,系统会将修改的新数据覆盖此前的旧数据。
1.8数据汇总界面:电子记账本可以自动汇总用户的总收入和总支出,并计算出整体收支情况,这些汇总信息可以帮助用户了解他们的财务状况,并制定相应的预算计划。
1.9数据分析界面:电子记账本利用折线统计图对数据走势进行统计分析,以帮助用户更好地理解他们的财务状况。
1.10系统设置界面:如果用户想要更改他们的密码,他们可以在该界面下进行操作。通常,这需要输入当前的密码,然后输入新的密码并再次确认密码。系统在确认新密码与旧密码不同且不为空,并且两次输入的新密码相同后,会用新的密码数据覆盖旧的密码数据,完成密码修改。
2.工作流程
图 1.1 记账本工作流程图
2.1记账簿工作流程如下:
用户启动记账簿后,默认进入登录界面。已有账户的用户可在输入用户名和密码后直接点击“登录”按钮,系统在数据库的用户表中查询到对应的用户数据后即可进入记账本首页,没有相关信息的新用户则可在登录界面中点击“注册”按钮跳转至注册界面进行新用户信息的录入,成功注册后系统会将新的用户数据录入用户表中,随后即可返回用户登录界面进行登录。
用户登录成功后进入首页,在该界面下,可点击对应图标跳转至各个功能界面。
首次使用该记账本时,需先点击“新增收入”或“新增支出”进入对应界面进行收支数据的录入。输入数据并点击“保存”按钮后,系统会将输入的数据录入对应的收入/支出表中,便于后续的数据处理。
返回记账簿首页,点击“收入明细”或“支出明细”即可进入对应的数据明细界面。在该页面下,系统会将此前用户在“新增”界面下录入的收支数据列出,便于用户进行数据查询。同时,在该界面下点击收支数据即可跳转至相应的数据修改界面,在数据修改界面用户可自行修改收支数据的各项属性,点击“修改”按钮,系统会将新的数据覆盖旧的数据,点击“删除”按钮,系统会将当前数据从数据库中删除,以此达到修改数据的目的。
返回记账簿首页,点击首页顶部图片即可进入数据汇总界面,该界面中,系统从数据库中提取出收支金额并进行总和计算,得出总收入、总支出和整体收支情况,并列出,便于用户查看整体账目数据。
返回记账簿首页,点击“数据分析”即可进入数据分析页面,该页面将此前“新增”或“修改”的数据处理后生成统计图,用户可以直观的查询收入或支出的变化。
在首页点击“系统设置”以跳转至用户密码修改界面,该界面的左上角会标记出当前用户的名称,用户可以在该界面下修改自己的登录密码,系统核对新的密码与旧密码不同且不为空,并且与第二次输入的新密码相同后,会将新的密码数据录入数据库的用户表中,并覆盖旧的密码数据,以此达到修改密码的目的。
3.数据库设计
3.1项目相关数据库如表1.1、表1.2、表1.3所示。
用户表(tb_userinfo)
字段名 | 类型 | 属性 | 说明 |
ID | integer | PK,IDENTITY | 用户ID |
name | varchar(10) | NOT NULL | 用户名 |
pwd | varchar(15) | NOT NULL | 用户登录密码 |
表1.1
收入表(in_com)
字段名 | 类型 | 属性 | 说明 |
ID | integer | PK,IDENTITY | 收入数据ID |
inmoney | double | NULL | 收入金额 |
intime | varchar(20) | NULL | 收入时间 |
intype | varchar(30) | NULL | 收入类型 |
inpayer | varchar(100) | NULL | 付款方 |
inremark | varchar(500) | NULL | 备注 |
表1.2
支出表(pay_out)
字段名 | 类型 | 属性 | 说明 |
ID | integer | PK,IDENTITY | 支出数据ID |
outmoney | double | NULL | 支出金额 |
outtime | varchar(20) | NULL | 支出时间 |
outtype | varchar(30) | NULL | 支出类型 |
outpayee | varchar(100) | NULL | 收款方 |
outremark | varchar(500) | NULL | 备注 |
表1.3
4.程序运行结果
图 4.1用户注册界面 图 4.2用户登录界面 图 4.3记账本首页
图 4.4新增收入界面 图 4.5新增支出界面 图 4.6收入明细界面
图 4.7支出明细界面 图 4.8数据分析界面 图 4.9系统设置界面
图 4.10数据修改界面 图 4.11数据汇总界面
5.部分代码示例
5.1新增收入页面
package com.example.tallybook.activity;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import com.example.tallybook.R;
import com.example.tallybook.db.MyDBHelper;
import com.example.tallybook.view.Home;
public class NewInComeActivity extends AppCompatActivity {
EditText et_money,et_time,et_payer,et_remark;
Spinner sp_type;
Button bt_sava,bt_cancel;
MyDBHelper mhelper;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_in_come);
initView();
btnSave();
btnCancel();
}
private void initView() {
et_money = findViewById(R.id.et_money_newin);
et_time = findViewById(R.id.et_time_newin);
sp_type = findViewById(R.id.sp_type_newin);
et_payer = findViewById(R.id.et_payer_newin);
et_remark = findViewById(R.id.et_remake_newin);
bt_sava = findViewById(R.id.bt_save_newin);
bt_cancel = findViewById(R.id.bt_cancel_newin);
mhelper = new MyDBHelper(NewInComeActivity.this);
db = mhelper.getWritableDatabase();
}
private void btnSave(){
bt_sava.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
ContentValues values = new ContentValues();
values.put("inmoney",et_money.getText().toString());
values.put("intime",et_time.getText().toString());
values.put("intype",sp_type.getSelectedItem().toString());
values.put("inpayer",et_payer.getText().toString());
values.put("inremark",et_remark.getText().toString());
db.insert("in_come",null,values);
Toast.makeText(NewInComeActivity.this,"保存成功", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(NewInComeActivity.this,NewInComeActivity.class);
startActivity(intent);
finish();
}
});
}
private void btnCancel() {
bt_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(NewInComeActivity.this, Home.class);
startActivity(intent);
finish();
}
});
}
}
5.2收入明细界面
package com.example.tallybook.activity;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import android.annotation.SuppressLint;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import com.example.tallybook.R;
import com.example.tallybook.adapter.IncomeAdapter;
import com.example.tallybook.bean.IncomeBean;
import com.example.tallybook.db.MyDBHelper;
import java.util.ArrayList;
import java.util.List;
public class InComeDetailActivity extends AppCompatActivity {
RecyclerView recy_view;
MyDBHelper mhelper;
SQLiteDatabase db;
List<IncomeBean> arr1 = new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_in_come_detail);
initView();
initData();
IncomeAdapter adapter = new IncomeAdapter(InComeDetailActivity.this,arr1);
StaggeredGridLayoutManager st = new StaggeredGridLayoutManager(StaggeredGridLayoutManager.VERTICAL,1);
recy_view.setLayoutManager(st);
recy_view.setAdapter(adapter);
}
private void initView(){
recy_view = findViewById(R.id.recy_view_indetail);
mhelper = new MyDBHelper(InComeDetailActivity.this);
db = mhelper.getWritableDatabase();
}
private void initData(){
Cursor cursor = db.rawQuery("select * from in_come",null);
while (cursor.moveToNext()){
@SuppressLint("Range") int myid = cursor.getInt(cursor.getColumnIndex("id"));
@SuppressLint("Range") double mymoney = cursor.getDouble(cursor.getColumnIndex("inmoney"));
@SuppressLint("Range") String mytime = cursor.getString(cursor.getColumnIndex("intime"));
@SuppressLint("Range") String mytype = cursor.getString(cursor.getColumnIndex("intype"));
@SuppressLint("Range") String mypayer = cursor.getString(cursor.getColumnIndex("inpayer"));
@SuppressLint("Range") String myremark = cursor.getString(cursor.getColumnIndex("inremark"));
IncomeBean incomeBean = new IncomeBean(myid,mymoney,mytime,mytype,mypayer,myremark);
arr1.add(incomeBean);
}
}
}
5.3数据库
package com.example.tallybook.db;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import com.example.tallybook.R;
import com.example.tallybook.activity.NewInComeActivity;
public class MyDBHelper extends SQLiteOpenHelper {
private static final String DBNAME = "financial.db";
private static final int VERSION = 1;
public MyDBHelper(Context context) {
super(context, DBNAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//用户表
db.execSQL("create table tb_userinfo(id integer primary key autoincrement,name varchar(10),pwd varchar(15))");
//收入表
db.execSQL("create table in_come(id integer primary key autoincrement,inmoney double,intime varchar(20)," +
"intype varchar(30),inpayer varchar(100),inremark varchar(500))");
//支出表
db.execSQL("create table pay_out(id integer primary key autoincrement,outmoney double,outtime varchar(20)," +
"outtype varchar(30),outpayer varchar(100),outpayee varchar(100),outremark varchar(500))");
}
@Override
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
}
}