项目经历

  • 东软个人理财系统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

  1. 作用
    在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,保证多线程并发更新UI时线程安全,实现异步消息的处理。
  2. 使用                                                                                                                                        步骤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. 财务管理系统项目方案

    项目方案 1. 项目要求 名称:班级财务管理系统 难易系数 ★★ 项目简介 ​ 财务管理系统实现了班费消费明细.入账等数据管理,主要通过图形界面进行人机交互,jdbc操作MySQL数据库进行数据持久化 ...

  2. java实现家庭财务管理_基于jsp的家庭财务管理系统-JavaEE实现家庭财务管理系统 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的家庭财务管理系统, 该项目可用各类java课程设计大作业中, 家庭财务管理系统的系统架构分为前后台两部分, 最终实 ...

  3. springboot家庭财务管理系统

    家庭财务管理系统 项目介绍 家庭财务管理系统,主要分三种角色:系统管理员.户主.用户: 管理员主要功能有: 支出管理:支出详情: 收入管理:收入详情: 统计报表:统计报表: 系统管理:用户管理.角色管 ...

  4. springboot家庭财务管理系统、

    项目介绍: springboot家庭财务管理系统. 系统说明: 家庭财务管理系统 项目引见 家庭财务管理系统,主要分三种角色:系统管理员.户主.用户: 管理员主要功用有: 支出管理:支出详情: 收入管 ...

  5. python财务管理系统_SSM个人财务管理系统,源码分享

    全微毕设擅长JAVA(SSM,SSH,SPRINGBOOT).PYTHON(DJANGO/FLASK).THINKPHP.C#.安卓.微信小程序.MYSQL.SQLSERVER等,欢迎咨询 每天记录学 ...

  6. Java项目:家庭财务管理系统(java+Springboot+ssm+mysql+maven)

    源码获取:博客首页 "资源" 里下载! 一.项目简述 功能: 家庭财务管理系统,具有收入统计,支出统计,汇总报 表,工资录入,其他收入等录入开支信息,echart图标插 件弓I入展 ...

  7. Springboot毕设项目企业财务管理系统lmm93java+VUE+Mybatis+Maven+Mysql+sprnig)

    Springboot毕设项目企业财务管理系统lmm93java+VUE+Mybatis+Maven+Mysql+sprnig) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysq ...

  8. C语言专题 ⑥项目实训-家庭财务管理系统

    一.关于 (1)要求: 1.选题:家庭财务管理系统 2.项目简介:编程实现一个家庭财务管理系统,系统能够通过菜单提供功能选择,能够实现家庭财务收入及财务支出的添加.查询.删除. 修改等功能,能够实现家 ...

  9. 个人财务管理系统——Java期末项目开发实例

    本次Java期末课程设计题目为个人财务管理系统,在已编辑成型的图形界面上通过添加代码实现用户密码修改.用户登录.账户信息增删改等操作,出于对Java文件和流相关知识考查,本项目使用了文件而非数据库作为 ...

最新文章

  1. 互联网大厂面试,谈索引就直逼这些底层?难的是我不懂这些原理
  2. DCMTK:OFnumeric_limits的单元测试
  3. axis2+myeclipse6.5环境搭建
  4. spring学习(37):注入list类型
  5. 使用视频作为网页背景的技术探讨
  6. android studio for android learning (二十三 )Android Orientation Sensor(方向传感器)与指南针实战(新方法替代orientation)
  7. 关于mangos多线程处理方式
  8. vue实现在线客服功能(附完整代码)
  9. 程序计数器的作用--简单易懂
  10. 联想G40-70旧物改造小总结——替换固态硬盘电池光驱啥的
  11. 用C#写差异文件备份工具
  12. ios 自定义拍照页面_iOS开发笔记:自定义相机拍照
  13. 50天计算机考研数学,50天数学冲刺:那些hold住高分的诀窍
  14. matlab 概率分布程序,常见的概率分布(matlab作图)
  15. NSSCTF刷题wp——Crypto入门
  16. 2.4 矩阵的特征值与特征向量
  17. 【前端基础】Vue学习笔记
  18. FP-growth:FP树的构建
  19. maven-war-plugin插件 overlays maven-war-plugin翻译
  20. IDM(功能强大的下载工具)IDM可以批量下载视频吗?

热门文章

  1. 焦虑症和植物神经紊乱是同一种疾病吗
  2. 范围变更管控案例_项目范围管理案例之范围确认案例
  3. 隐藏控件--HiddenField控件
  4. android+下落+动画,完美起航-Android面试题之动画+事件处理篇
  5. 构建DCT过完备字典
  6. ICC2 user guide(二)Placement and Optimization
  7. TypeError: Descriptors cannot not be created directly.
  8. 某年的第几个月或第几个周换算为具体的日期 -- vue
  9. android 经纬度 转换,andorid将经纬度转换到手机屏幕上显示
  10. Linux|看门狗的简单使用