个人财务管理系统项目
项目经历
- 东软个人理财系统App 2020.12-2021.1
项目简介
本系统主要涵盖的功能包括:用户登录模块、用户管理模块、收入模块、支出模块、密码管理模块、账目统计模块、报表输出模块以及查询模块。
我的主要工作
1.用户登录和用户管理
用户注册 | 主要用于注册用户 |
用户登陆 | 主要用于用户登陆及相关校验 |
用户注销 | 主要用于注销用户(只能注销当前登陆用户) |
普通用户修改自己的信息 | |
用户信息修改 | 主要用于修改已有用户的信息(当前登陆用户只能修改自己的信息) |
密码修改 | 修改当前用户的密码(通常我们单独提供修改密码的功能) |
管理员修改所有用户信息 | |
查询用户信息 | 主要用于查询指当前系统的用户 |
新建用户 | 主要用于新建用户 |
修改用户信息 | 主要用于修改已有用户的信息 |
删除用户 | 主要用于删除一个用户 |
2.收支管理
查询收入记录信息 | 主要用于查询指定家庭当前的收入记录 |
新建收入记录 | 主要用于新建一个收入记录 |
修改收入记录信息 | 主要用于修改已有收入记录信息 |
删除收入记录 | 主要用于删除一个收入记录 |
主要定位到支出信息维护 | |
主要用于显示支出列表 | |
查询支出记录信息 | 主要用于查询指定家庭当前的支出记录 |
新建支出记录 | 主要用于新建一个支出记录 |
修改支出记录信息 | 主要用于修改已有支出记录信息 |
删除支出记录 | 主要用于删除一个支出记录 |
项目效果图
主要技术点
后端搭建
后端是用Spring ToolSuite软件,通过tomcat来搭建的web服务器。在创建servlet服务器后,通过doGet方法来与前端进行交互:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setCharacterEncoding("utf-8");response.setContentType("application/json;charset=UTF-8");PrintWriter out = response.getWriter();String password=request.getParameter("password");String name=request.getParameter("name");String i=request.getParameter("i");if(i.equals("0")) {UserDao ud = new UserDao();Userinf result =ud.login(name, password);if(result !=null) {String userjson = JSONObject.toJSONString(result);System.out.println(userjson);out.print(userjson);}else {out.print("username or password is not right!");}out.flush();}else {UserDao ud = new UserDao();boolean result =ud.register(name, password);if(result ==true) {out.print("success register");}else {out.print("username is already exist!");}out.flush();}}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}
不过,也可以用doPost方法来与客户端进行交互,doGet在url里显式给servlet传送数据,并且只能传输字符串且有大小限制;doPost参数通过另外的流传递,不通过url,所以可以很大,也可以传递二进制数据,如文件的上传。
OkHttp与后端进行网络连接
异步请求不需要开启子线程,enqueue方法会自动将网络请求部分放入子线程中执行。
以下是以登陆操作为例:
第一步,创建一个OkHttpClient对象 OkHttpClient mClient = new OkHttpClient.Builder().build();
第二步,创建携带请求信息的Request对象 Request request = new Request.Builder().url("http://www.baidu.com").get().build();
第三步,创建Call对象 Call call = mClient.newCall(request);
第四步,call.enqueue() 需要注意的是,不能直接在Callback中更新UI,否则会报出异常
public void onClick(View view) {switch (view.getId()) {// 跳转到注册界面case R.id.tv_loginactivity_register:startActivity(new Intent(this, RegisterActivity.class));finish();case R.id.bt_loginactivity_login:button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String inputusername = username.getText().toString();String inputpassword = password.getText().toString();String url = "http://192.168.137.1:8080/server/control?i=0&name="+inputusername+"/&password=/"+inputpassword;if(!inputusername.equals("") && !inputpassword.equals("")){//网络连接,OKhttpclientOkHttpClient okHttpClient = new OkHttpClient();Request request = new Request.Builder().url(url).build();// 异步请求不需要开启子线程,enqueue方法会自动将网络请求部分放入子线程中执行。okHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.d("failure","网络连接失败");}@Overridepublic void onResponse(Call call, Response response) throws IOException {Log.d("success","网络连接成功");//Log.d("content:",response.body().string());//获取到网络响应数据,发消息Message msg = new Message();msg.obj = response.body().string();handler.sendMessage(msg);}});}else{Toast.makeText(LoginActivity.this,"用户名或密码不能为空!!!",Toast.LENGTH_LONG).show();}}});break;}
}
服务器端和客户端在同一局域网,所以url直接输入的是ip地址。
Handler
- 作用
在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,保证多线程并发更新UI时线程安全,实现异步消息的处理。 - 使用 步骤1:(自定义)新创建Handler子类(继承Handler类) & 复写handleMessage()方法
步骤2:在主线程中创建Handler实例
步骤3:创建工作线程(AsyncTask、Thread、Runnable)处理耗时操作,并创建需要发送的消息对象Message,并通过引用主线程的Handler发送
步骤4:开启工作线程
private Handler handler =new Handler() {@Overridepublic void handleMessage(Message msg) {//接收子线程传递的消息String responsestr = msg.obj.toString();try {JSONObject responsejson = new JSONObject(responsestr);//保存登录信息到手机中SharedPreferences sharedPreferences = getSharedPreferences("user", MODE_PRIVATE);SharedPreferences.Editor editor = sharedPreferences.edit();editor.putInt("user_id", responsejson.optInt("user_id"));editor.putFloat("salary", (float) responsejson.optDouble("salary"));editor.putString("user_name", responsejson.optString("user_name"));editor.commit();//跳转到主页面显示个人信息Intent intent = new Intent(LoginActivity.this, MainActivity.class);startActivity(intent);} catch (JSONException e) {e.printStackTrace();Toast.makeText(LoginActivity.this, responsestr, Toast.LENGTH_LONG).show();}}};
Glide
使用Glide实现圆形头像的绘制,创建GlideCircleTransform继承自BitmapTransformation
GlideCircleTransform.java
public class GlideCircleTransform extends BitmapTransformation {public GlideCircleTransform(Context context) {super(context);}@Overrideprotected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {return circleCrop(pool, toTransform);}private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {if (source == null) return null;int size = Math.min(source.getWidth(), source.getHeight());int x = (source.getWidth() - size) / 2;int y = (source.getHeight() - size) / 2;// TODO this could be acquired from the pool tooBitmap squared = Bitmap.createBitmap(source, x, y, size, size);Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);if (result == null) {result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);}Canvas canvas = new Canvas(result);Paint paint = new Paint();paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));paint.setAntiAlias(true);float r = size / 2f;canvas.drawCircle(r, r, r, paint);return result;}@Overridepublic String getId() {return getClass().getName();}
}
实现下拉刷新,上拉加载的具有分页机制的ListView
适配器 与 ListView 绑定,并且设置监听处理列表下拉刷新和上拉加载的监听事件的回调
public void initListView(){refreshListView = (RefreshListView) findViewById(R.id.listview_refresh);competitionAdapter = new CompetitionAdapter(this,competitionList);refreshListView.setAdapter(competitionAdapter);refreshListView.setRefreshListener(new RefreshListView.RefreshingListener() {@Overridepublic void refresh() {currentState = REFRESH_DATA;page = 0;getCompetitionListFromNet(page,limit);}@Overridepublic void load(){currentState = LOAD_DATA;page = 0;getCompetitionListFromNet(page,limit);}});}
收到数据后通过handler通知主线程对刷新列表视图进行更新
mHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {switch (currentState){case INITIAL_DATA:initListView();break;case REFRESH_DATA:refreshListView.onRefreshComplete();competitionAdapter.notifyDataSetChanged();break;case LOAD_DATA:refreshListView.onLoadComplete();competitionAdapter.notifyDataSetChanged();break;}}};
个人财务管理系统项目相关推荐
- 财务管理系统项目方案
项目方案 1. 项目要求 名称:班级财务管理系统 难易系数 ★★ 项目简介 财务管理系统实现了班费消费明细.入账等数据管理,主要通过图形界面进行人机交互,jdbc操作MySQL数据库进行数据持久化 ...
- java实现家庭财务管理_基于jsp的家庭财务管理系统-JavaEE实现家庭财务管理系统 - java项目源码...
基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的家庭财务管理系统, 该项目可用各类java课程设计大作业中, 家庭财务管理系统的系统架构分为前后台两部分, 最终实 ...
- springboot家庭财务管理系统
家庭财务管理系统 项目介绍 家庭财务管理系统,主要分三种角色:系统管理员.户主.用户: 管理员主要功能有: 支出管理:支出详情: 收入管理:收入详情: 统计报表:统计报表: 系统管理:用户管理.角色管 ...
- springboot家庭财务管理系统、
项目介绍: springboot家庭财务管理系统. 系统说明: 家庭财务管理系统 项目引见 家庭财务管理系统,主要分三种角色:系统管理员.户主.用户: 管理员主要功用有: 支出管理:支出详情: 收入管 ...
- python财务管理系统_SSM个人财务管理系统,源码分享
全微毕设擅长JAVA(SSM,SSH,SPRINGBOOT).PYTHON(DJANGO/FLASK).THINKPHP.C#.安卓.微信小程序.MYSQL.SQLSERVER等,欢迎咨询 每天记录学 ...
- Java项目:家庭财务管理系统(java+Springboot+ssm+mysql+maven)
源码获取:博客首页 "资源" 里下载! 一.项目简述 功能: 家庭财务管理系统,具有收入统计,支出统计,汇总报 表,工资录入,其他收入等录入开支信息,echart图标插 件弓I入展 ...
- Springboot毕设项目企业财务管理系统lmm93java+VUE+Mybatis+Maven+Mysql+sprnig)
Springboot毕设项目企业财务管理系统lmm93java+VUE+Mybatis+Maven+Mysql+sprnig) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysq ...
- C语言专题 ⑥项目实训-家庭财务管理系统
一.关于 (1)要求: 1.选题:家庭财务管理系统 2.项目简介:编程实现一个家庭财务管理系统,系统能够通过菜单提供功能选择,能够实现家庭财务收入及财务支出的添加.查询.删除. 修改等功能,能够实现家 ...
- 个人财务管理系统——Java期末项目开发实例
本次Java期末课程设计题目为个人财务管理系统,在已编辑成型的图形界面上通过添加代码实现用户密码修改.用户登录.账户信息增删改等操作,出于对Java文件和流相关知识考查,本项目使用了文件而非数据库作为 ...
最新文章
- 互联网大厂面试,谈索引就直逼这些底层?难的是我不懂这些原理
- DCMTK:OFnumeric_limits的单元测试
- axis2+myeclipse6.5环境搭建
- spring学习(37):注入list类型
- 使用视频作为网页背景的技术探讨
- android studio for android learning (二十三 )Android Orientation Sensor(方向传感器)与指南针实战(新方法替代orientation)
- 关于mangos多线程处理方式
- vue实现在线客服功能(附完整代码)
- 程序计数器的作用--简单易懂
- 联想G40-70旧物改造小总结——替换固态硬盘电池光驱啥的
- 用C#写差异文件备份工具
- ios 自定义拍照页面_iOS开发笔记:自定义相机拍照
- 50天计算机考研数学,50天数学冲刺:那些hold住高分的诀窍
- matlab 概率分布程序,常见的概率分布(matlab作图)
- NSSCTF刷题wp——Crypto入门
- 2.4 矩阵的特征值与特征向量
- 【前端基础】Vue学习笔记
- FP-growth:FP树的构建
- maven-war-plugin插件 overlays maven-war-plugin翻译
- IDM(功能强大的下载工具)IDM可以批量下载视频吗?
热门文章
- 焦虑症和植物神经紊乱是同一种疾病吗
- 范围变更管控案例_项目范围管理案例之范围确认案例
- 隐藏控件--HiddenField控件
- android+下落+动画,完美起航-Android面试题之动画+事件处理篇
- 构建DCT过完备字典
- ICC2 user guide(二)Placement and Optimization
- TypeError: Descriptors cannot not be created directly.
- 某年的第几个月或第几个周换算为具体的日期 -- vue
- android 经纬度 转换,andorid将经纬度转换到手机屏幕上显示
- Linux|看门狗的简单使用