个人记账簿管理系统.docx
- 文档编号:7406359
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:26
- 大小:516.88KB
个人记账簿管理系统.docx
《个人记账簿管理系统.docx》由会员分享,可在线阅读,更多相关《个人记账簿管理系统.docx(26页珍藏版)》请在冰豆网上搜索。
个人记账簿管理系统
代码行数
570
项目名称
个人记账簿管理系统
1.实训目的
面向对象程序设计课程设计是计算机科学与技术专业培养计划中的重要实践教学环节,旨在通过一个管理信息系统的开发,加深学生对Java语言的理解和应用,尤其是对面向对象编程思想、Java编码规范、图形用户接口、JDBC访问数据库的理解,巩固软件工程课程的相关知识,了解软件开发的基本流程,进一步提高学生的学习能力、理解能力、表达能力及沟通能力。
2.实训内容
使用MyEclipse为开发工具,使用RationalRose为建模工具,使用MySQL为数据库服务器,基于GUI和JDBC技术,分析、设计并实现一个管理信息系统。
3.需求分析
3.1需求描述
登录:
输入账号和密码,完成登录操作,进入主界面,显示个人记账簿管理系统中所有的账单基本信息(主键、名称、消费时间、花费总额等)以及可进行的相关操作的选项。
退出:
登录后可进行退出操作,结束整个程序。
注册:
输入账户、密码和确认密码完成新用户的注册。
显示账单信息:
登录成功后在主界面中以表格形式显示所有账单的信息。
添加账单:
输入一份账单的各项基本信息(名称、消费时间等),再输入这份账单中的各项花销,完成账单的添加操作,添加成功后显示所有账单的基本信息。
删除账单:
根据显示的账单基本信息,输入某个账单的主键,完成账单的删除操作,删除成功后以表格形式按创建时间升序显示剩余账单的基本信息。
修改账单:
根据显示的账单基本信息,输入某个账单的主键,显示账单的基本信息和账单中的各项花费,根据提示信息,选择要修改账单基本信息或某项花费或要删除的某项花费,输入相应字段值或要删除的某项花费的主键,完成账单信息的修改,修改成功后显示该账单修改后的详细信息。
查询账单:
利用主键查询,获得一份账单的详细信息。
3.2用例描述
1、用例:
添加账单
简单描述:
用户在数据库上添加账单信息
主参与者:
user
副参与者:
数据库
前置条件:
连接上数据库且有信息更新需要
主流:
用户打开MyEclipse
JDBC访问数据库
在控制台输入信息
输入回车,完成账单输入
后置条件:
账单添加成功
附加流:
数据库添加失败是提醒错误原因并询问否需要重新输入
2、用例:
删除账单
简单描述:
用户在数据库上删除账单信息
主参与者:
user
副参与者:
数据库
前置条件:
连接上数据库且有信息需要删除
主流:
用户打开MyEclipse
JDBC访问数据库
在控制台输入某个账单的主键
输入回车,完成账单删除
显示剩余账单的基本信息
后置条件:
账单删除成功
附加流:
数据库删除失败是提醒错误原因并询问否需要重新删除
3、用例:
修改账单
简单描述:
用户在数据库上修改账单信息
主参与者:
user
副参与者:
数据库
前置条件:
连接上数据库且有信息需要修改
主流:
用户打开MyEclipse
JDBC访问数据库
在控制台输入某个账单的主键
根据提示选择修改账单基本信息
输入回车,完成账单修改
显示剩余账单的基本信息
后置条件:
账单修改成功
附加流:
数据库修改失败是提醒错误原因并询问否需要重新删除
4、用例:
查询账单
简单描述:
用户在数据库上查新账单信息
主参与者:
user
副参与者:
数据库
前置条件:
连接上数据库且有信息需要查询
主流:
用户打开MyEclipse
JDBC访问数据库
在控制台输入某个账单的主键
输入回车,完成账单修改
获得一份账单的详细信息
后置条件:
账单查询成功
附加流:
数据库查询失败是提醒错误原因并询问否需要重新删除
4.功能设计
4.1系统层次方框图
4.2算法设计(活动图或时序图)
1.登录功能
在主界面(MainView)输入账号和密码,封装成Login对象后发后给业务层(LoginService),在业务层中组合成执行登录操作的SQL语句,再将其传递给数据库访问类(DB),由其完成数据库的查询操作。
依据查询结果,如果成功则创建控制类(Controller)对象,显示欢迎信息和对账单信息进行维护的选项;如果失败,则显示提示信息并允许重新输入账号和密码。
1.1登录功能时序图
2.注册功能
在主界面输入数字1,表示进行注册操作。
依次输入账户、密码和确认密码,当密码和确认密码不一致时,需要重新输入密码和确认密码。
之后,账户和密码封装至Login对象中,传递给业务层(LoginService),由业务层组合成添加SQL语句,发送至数据库访问类(DB),完成添加操作。
如果添加成功,则返回主界面,输入新注册的账户和密码进行登录;如果添加失败,则重新进行输入。
2.1注册功能时序图
3.显示所有账单信息功能
登录成功及完成对账单信息增、删、改操作后,均需要进行所有账单信息的显示,由控制类(Controller)调用视图层(MainView)中的方法,在方法中再利用业务层(UserService)完成对数据库访问类(DB)的访问,获取t_bill表的所有记录。
3.1显示所有账单信息时序图
4.添加账单信息功能
在控制类(Controller)输出的选择信息的提示下(1表示执行添加操作),利用简单工厂模式创建视图层(AddView)对象,之后回调接口方法,完成对业务层(UserService)中注册方法的调用,在该方法中向数据库访问类(DB)发送添加SQL语句。
如果添加成功,则显示所有账单信息;如果添加失败,则提示重新输入。
4.1账单信息添加时序图
5.查询账单信息功能
在控制类(Controller)输出的选择信息的提示下(4表示执行添加操作),利用简单工厂模式创建视图层(QueryView)对象,之后回调接口方法,在方法中输入要查询的账单名,再对业务层(UserService)中查询方法执行调用,在该方法中向数据库访问类(DB)发送模糊查询SQL语句。
如果查询成功,则显示查询到的账单信息;如果查询失败,则提示重新输入。
5.1查询用户信息时序图
5.数据设计
5.1类图设计
1.数据库访问层
DB类用于封装JDBC的操作,完成对数据库的直接访问,采用单态模式创建对象,具体内容如下所示:
1.1数据库访问层类图
2.数据封装类
Login类和User类分别用于登录、注册操作时的数据封装和用户信息管理时的数据封装,具体内容如下图所示:
2.1数据封装类类图
3.业务层
LoginService类进行登录、注册等对Login类的访问操作,UserService类进行账单信息管理的操作,两者均采用单态模式创建对象,具体内容如下图所示:
3.1业务层类图
4.控制层
Controller类用于进行系统的流程控制,具体内容如下所示:
4.1控制层类图
5.视图层
MainView类用于完成登录、注册等提示信息的显示和系统主界面的显示,具体内容如下所示:
5.1MainView类图
Operation接口是增、删、改、查等操作的抽象,AddView类、DeleteView类、ModifyView类和QueryView类均使用Operation接口,分别完成增、删、改、查等操作,利用简单工厂模式与Controller类建立关系,具体内容如下所示:
5.2视图层类图
6.其它
Test类是程序的主类,用于启动系统,具体内容如下:
Test类是程序的主类
5.2数据表设计
序号
字段名
类型
长度
备注
1
id
int
4
主键
2
account
char
20
唯一性、不为空
3
password
char
20
不为空
表4-2t_user表
序号
字段名
类型
长度
备注
1
id
int
4
主键
2
name
char
20
不为空
3
Money
Double
2
不为空
4
time
date
默认
不为空
6.运行结果
登录并显示账单信息
添加账单信息
删除账单信息
修改账单信息
查询账单信息
7.关键代码
DB类
publicclassDB{
privateConnectioncon;
privatePreparedStatementpre;
privateResultSetrs;
privatestaticDBdb;
static{
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}
}
privateDB(){}
publicstaticDBgetInstance(){
if(db==null){
db=newDB();
}
returndb;
}
privatevoidbuildConnection(){
try{
con=DriverManager.getConnection("jdbc:
mysql:
//localhost:
3306/user","root","root");
}catch(SQLExceptione){
e.printStackTrace();
}
}
publicResultSetexecuteQueryByParam(Stringsql,Object...o){
this.buildConnection();
try{
pre=con.prepareStatement(sql);
for(inti=0;i pre.setObject(i+1,o[i]); } rs=pre.executeQuery(); }catch(SQLExceptione){ e.printStackTrace(); } returnrs; } publicResultSetexecuteQueryNoParam(Stringsql){ this.buildConnection();; try{ pre=con.prepareStatement(sql); rs=pre.executeQuery(); }catch(SQLExceptione){ e.printStackTrace(); } returnrs; } publicintexecuteUpdate(Stringsql,Object...o){ this.buildConnection(); try{ pre=con.prepareStatement(sql); for(inti=0;i pre.setObject(i+1,o[i]); } intcount=pre.executeUpdate(); returncount; }catch(SQLExceptione){ e.printStackTrace(); return0; } } publicvoidclose(){ try{ if(rs! =null){ rs.close(); } pre.close(); con.close(); }catch(SQLExceptione){ e.printStackTrace(); } } } 业务层 publicclassLoginService{ privateDBdb; privatestaticLoginServiceservice; privateLoginService(){ db=DB.getInstance(); } publicstaticLoginServicegetInstatnce(){ if(service==null){ service=newLoginService(); } returnservice; } publicbooleanlogin(Loginlo){ Stringsql="select*fromt_loginwhereusername=? andpassword=? "; ResultSetrs=db.executeQueryByParam(sql,lo.getUsername(),lo.getPassword()); try{ if(rs.next()){ returntrue; } }catch(SQLExceptione){ e.printStackTrace(); }finally{ db.close(); } returnfalse; } publicbooleanregister(Loginlo){ Stringsql="insertintot_login(username,password)values(? ? )"; intcount=db.executeUpdate(sql,lo.getUsername(),lo.getPassword()); db.close(); if(count>0){ returntrue; }else{ returnfalse; } } } publicclassUserService{ privateDBdb; privatestaticUserServiceservice; privateUserService(){ db=DB.getInstance(); } publicstaticUserServicegetInstance(){ if(service==null){ service=newUserService(); } returnservice; } publicList Stringsql="select*fromt_user"; ResultSetrs=db.executeQueryNoParam(sql); List try{ users=this.getList(rs); }catch(SQLExceptione){ e.printStackTrace(); }finally{ db.close(); } returnusers; } publicList Stringsql="select*fromt_userwherenamelike? "; ResultSetrs=db.executeQueryByParam(sql,"%"+name+"%"); List try{ users=this.getList(rs); }catch(SQLExceptione){ e.printStackTrace(); }finally{ db.close(); } returnusers; } privateList List Useruser; while(rs.next()){ user=newUser(); user.setId(rs.getInt (1)); user.setName(rs.getString (2)); user.setMoney(rs.getInt(3)); user.setTime(rs.getDate(4)); users.add(user); } returnusers; } publicbooleaninsertOneUser(Stringname,doublemoney,Datetime){ Stringsql="insertintot_user(name,money,time)values(? ? ? )"; intcount=db.executeUpdate(sql,name,money,time); db.close(); if(count>0){ returntrue; }else{ returnfalse; } } publicbooleandeleteUserById(intid){ Stringsql="deletefromt_userwhereid=? "; intcount=db.executeUpdate(sql,id); db.close(); if(count>0){ returntrue; }else{ returnfalse; } } publicbooleanupdateUser(intid,Stringname,doublemoney,Datetime){ Stringsql="updatet_usersetname=? money=? time=? whereid=? "; intcount=db.executeUpdate(sql,name,money,time,id); db.close(); if(count>0){ returntrue; }else{ returnfalse; } } publicUsergetUserById(intid){ Stringsql="select*fromt_userwhereid=? "; ResultSetrs=db.executeQueryByParam(sql,id); try{ if(rs.next()){ Useruser=newUser(); user.setId(id); user.setName(rs.getString (2)); user.setMoney(rs.getInt(3)); user.setTime(rs.getDate(4)); returnuser; } }catch(SQLExceptione){ e.printStackTrace(); }finally{ db.close(); } returnnull; } } Controller类 publicclassController{ publicvoidcontroller()throwsInputMismatchException{ Scannerscan=newScanner(System.in); while(true){ MainView.showMain(); System.out.println("pleaseselectyouroperation: "); System.out.println("1.insert2.delete3.modify4.query5.exit"); inti=scan.nextInt(); UserServiceservice=UserService.getInstance(); Operationo=null; booleanflag=true; switch(i){ case1: o=newAddView(); break; case2: o=newDeleteView(); break; case3: o=newModifyView(); break; case4: o=newQueryView(); break; case5: System.out.println("Bye~~~~~~~~~"); return; default: //scan.close(); System.out.println("inputerror,pleaseinput1~5! "); flag=false; } if(flag){ o.operation(service); } } } } 视图层 publicclassMainView{ publicstaticvoidstart(){ Scannerscan=newScanner(System.in); while(true){ LoginServiceservice; System.out.println("pleaseinputyouraccountandpasswordtologin,enter1forregisteronenewuser."); Stringusername=scan.next(); Stringpassword; while("1".equals(username)){ System.out.println("pleaseinputaccount: "); StringnewUsername=scan.next(); StringnewPwd; while(true){ System.out.println("pleaseinputpassword: "); newPwd=scan.next(); System.out.println("pleaseinputconfirmationpassword: "); StringconfirmPwd=scan.next(); if(newPwd.equals(confirmPwd)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 个人 记账 管理 系统