最新JAVA简单项目购物系统的整个开发过程详解(内含源码和注释).docx
-
资源ID:35272902
资源大小:525.87KB
全文页数:135页
- 资源格式: DOCX
下载积分:15金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
最新JAVA简单项目购物系统的整个开发过程详解(内含源码和注释).docx
Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateJAVA简单项目购物系统的整个开发过程详解(内含源码和注释)JAVA简单项目购物系统的整个开发过程详解(内含源码和注释)1. 购物系统的需求分析和类划分 购物系统本身是一个十分复杂的系统,有很多细节问题如果深究会更加复杂,并且一般购物系统都是网页类型的,要有一个友好的界面,但是作为一个简单项目,该项目只是为了给JAVA初学者介绍一下开发的基本思想,以及面向对象时应该怎样去设计框架和实现流程,所以只是基于eclipse开发的一个简单的项目,并没有GUI的参与,并且很多细节问题作为后续研究,整体的设计比较简单,但是足以说明很多设计思想和设计理念,那么下面对基本的需求进行分析。 作为一个简单的购物系统,至少需要具备以下功能(这些功能分布在不同级的菜单中): (1)用户登录功能、用户账号密码修改功能,暂时不提供注册功能; (2)用户成功登录后,需要具备客户信息的管理功能、购物结算功能以及一些抽奖活动等; (3)客户信息管理功能下面又可以分出很多功能,比如说:查询、修改、增加等; (4)购物结算功能下面又可以分出很多功能,比如说:商品选购、付款、账单等; (5)抽奖活动下面又可以设计出多种的抽奖形式,从而进一步划分为许多新的功能模块。 (6)在一级菜单中要提供退出系统的功能,在二级菜单中要提供注销登录的功能,其他级菜单都要能够返回上一级菜单。 上面的这些功能都是一些比较基本的功能,那么如果按照面向流程的思想来设计,就会划分很多功能模块,然后按照流程一步步走就行,但是现在我们采用面向对象的思想来设计,那么应该如何考虑设计框架呢?面向对象的主要思想就是将一些需求抽象为许多类,然后建立这些类之间的联系,通过不同类之间的协同合作,就可以实现所有的功能。所以,现在的主要任务就是如何合理地抽象出这些类,以及这些类要实现什么功能,类之间的联系又是什么?下面通过本次设计的结构对这一过程进行分析。 (1)StartSMS类:用于系统的启动。我们的系统肯定需要一个启动类,这个类里面包含了main方法,用来启动这个系统,这个类是最顶层的,所以不能牵涉太多底层的细节实现,只需要实现一些顶层的基本流程就行,主要还是要调用底层其他类的一些方法来实现功能。 (2)Data类:用来存放我们的所有数据信息,本次设计主要存放的是已经预存的一些可供购买的商品信息和已经注册的会员信息。为什么需要这个类呢?大家想一想,在面向对象的设计中,我们的数据比较多,肯定不能零散地到处定义、任意修改,这样会使得系统的聚合程度太低,容易出现很多错误,并且难以进行后期功能扩展和错误修改,所以我们要把用到的一些公有的数据进行归类,然后放在一个类中,并且在该类中提供对这些数据进行操作的方法。 (3)Menu类:用于显示及处理各级菜单。既然我们设计的是一个购物系统,那么即使再简单,也需要一个基本的菜单,用来和用户进行交互,由于菜单的比较多,并且各级菜单之间层层相连,所以我们需要对菜单进行统一管理,故而出现了菜单类。注意,这里的菜单只是一些顶层的菜单显示和基本的功能调用,具体底层的算法还是需要更加底层的类来实现的。 (4)Manager类:用于存储用户的账户和密码。既然我们需要用户登录,那么肯定需要一个单独的类来管理用户的账户和密码,从而使系统的独立性更强一些。本次设计的用户只有一个账户和密码,只允许修改账户和密码,但是不允许注册。 (5)VerifyEqual类:用于验证登录信息。这个类相当于是把登录这项功能抽象成了一个类,这个实现其实并不是非常必要,但是为了使得系统功能划分更加清晰,所以设计了此类,用来对登录信息和已有的账户和密码进行校验,从而给出校验结果。 (6)CustManagement类:用于客户信息的管理,该类实现了底层的一些功能,比如说查询、修改、增加等。当我们进入到客户信息管理这个菜单的时候,肯定需要对客户信息进行许多操作,为了方便管理这些操作,并考虑到后续的扩展性,这里把客户信息管理的所有功能都抽象出来,放在此类中,上一级菜单通过调用该类中的方法实现客户信息的管理。 (7)Pay类:用于处理购物和结算操作。该类和上面的类存在的原理基本一致,当客户选择进行购物的时候,肯定要有很多操作,比如说买什么、多少钱、付款、找零等,这些功能比较零碎,所以我们对其进行集中管理,从而抽象出该类,对购物和结算的菜单选项的底层算法进行实现,上一级菜单通过调用该类的方法实现购物和结算功能,并且可以返回上一级菜单。 (8)GiftManagement类:用于处理抽奖活动的相关功能。这个类和(6)、(7)中的类存在的理由基本一致,该类对抽奖活动进行了统一管理,上一级菜单只需要通过调用该类的方法就可以实现抽奖的功能。 (9)Gift类:用于管理礼物。既然设计了抽奖环节,那么肯定需要礼物,那么我们会给出什么样的礼物呢,我们总不能每一样礼物都详细列出来吧,这样十分冗余,也很麻烦,所以我们干脆抽象出一个礼物类,把礼物的一些属性:礼物名称和价格等保存成该类的成员变量,然后就可以很方便的管理该类,需要什么样的礼物就直接新建一个礼物对象,然后对该对象的属性进行修改和管理即可,这样的实现类似于一个接口,但是又和接口完全不一样,功能差不多。 总之,上面的类都是经过一些功能模块划分后抽象出来的,有些地方也并不一定合理,主要还是需要看需求,根据不同的需求制定不同的方案。在这里,我想就”Gift类“再强调一点,这个类的设计十分符合面向对象的思想,举个例子来看,如果购物系统中需要很多礼物,比如手机、电脑、移动电源等,那么如果我们一个个写这些礼物,会使得系统代码十分冗余,因为礼物的属性基本一样,所以我们就可以抽象成一个类,从而在需要什么礼物的时候只定义一个对象,然后赋予一定的属性即可,比如需要手机、电脑,那么我们只需要new一个Gift类的对象,然后在需要手机的时候设置其属性为手机,在需要电脑的时候设置其属性为电脑,需要什么设置什么即可,这样就使得我们的代码得到了简化,也使得结构比较清晰。在更为复杂的系统中,其实礼物用接口来实现更为合理,这样就可以根据该接口实现不同的礼物类,从而满足不同的需求,就类似于我们的电脑上的USB接口,只需要这个接口,我们就可以插上很多各种各样的外围设备,道理差不多。2. 购物系统的类之间的关系和流程(用图示法表示) 下图是我用Microsoft Office Visio 2003画图工具画出的这9个类之间的关系。 从上图中可以清晰地看出来各类之间的关系,大致关系和流程如下所述: (1)StartSMS类是启动类,内含main方法,这个类里面定义了VerifyEqual类和Data类的对象,用来存储数据和验证信息,同时Data类中包含了Manager类,用来存储预存的用户账号信息,然后在main方法中通过一定的逻辑,去调用Menu类中的showLoginMenu()方法,用于处理一级菜单-登录修改流程; (2)如果登录成功,就调用Menu类中的showMainMenu()方法,用于处理二级菜单-购物系统的主流程,如果登录失败3次,就直接退出系统; (3)在Menu类中的showMainMenu()方法中,通过选择不同的二级菜单选项,从而调用Menu类中的showCustMMenu()方法来处理客户信息管理流程或者调用Menu类中的showSendMenu()方法来处理抽奖活动流程,亦或者调用Pay类中的calcPrice()方法来处理购物结算流程; (4)如果选择了二级菜单中的客户信息管理选项,那么就会调用Menu类中的showCustMMenu()方法,这个方法会调用CustManagement类中的各种方法,用以处理客户信息管理的不同操作; (5)如果选择了二级菜单中的购物结算选项,那么就会调用Pay类中的calcPrice()方法,从而处理购物结算的流程,注意在Pay类中的getDiscount()方法是用来根据客户会员信息来计算打折率的; (6)如果选择了二级菜单中的真情回馈选项,即抽奖活动,那么就会调用Menu类中的showSendMenu()方法,这个方法会调用GiftManagement类中的各种方法,用以处理抽奖活动的不同操作; 注意到在CustManagement类和GiftManagement类中都有一个returnLastMenu()方法,该方法是用来返回上一级菜单使用的。3. 代码实现 需要说明的一点是这些代码都应该放在cn.itcast包下。 3.1 StartSMS类javaview plaincopy1. package cn.itcast; 2. import java.util.Scanner; 3. /*4. * 该类是这个系统的主方法类,用于启动购物系统5. * 6. * author 7. * 8. */9. publicclass StartSMS 10. /*11. * 空构造方法12. * 13. */14. public StartSMS() 15. 16. /*17. * 系统主方法18. * 19. * param args20. */21. publicstaticvoid main(String args) 22. / 创建已有的数据类的对象,并初始化已有的商品信息和顾客信息23. Data data = new Data(); 24. data.initial(); 25. / 创建菜单类的对象26. Menu menu = new Menu(); 27. / 这里将初始化的已有数据信息送给了菜单对象28. menu.setData( 29. data.goodsName, 30. data.goodsPrice, 31. data.custNo, 32. data.custBirth, 33. data.custScore); 34. / 显示一级菜单,即登录界面35. menu.showLoginMenu(); 36. / 该标志用来判断是否发生了系统操作错误,当操作不当的时候flag为假,从而退出系统,默认为无错误37. boolean flag = true; 38. / 处理整个系统的流程39. do 40. / 发生操作错误,退出系统41. if (!flag) 42. break; 43. / 创建验证用户登录的账户和密码是否正确的类的对象,这里只创建对象,并没有执行验证方法44. VerifyEqual verifyequal = new VerifyEqual(); 45. / 输入一级菜单中的选择46. Scanner scanner = new Scanner(System.in); 47. int i = scanner.nextInt(); 48. / 根据用户对一级菜单的选择做出不同的响应,注意这里就是经典的switch-case的用法49. switch (i) 50. case1: / 用户选择"登录系统"51. / 定义计数器,表示用户最多只能尝试3次,3次输入错误直接退出系统52. int j = 3; 53. / 处理登录系统的流程54. do 55. if (verifyequal.verify(data.manager.username, 56. data.manager.password) 57. / 用户登录成功,显示购物二级菜单!58. menu.showMainMenu(); 59. break; 60. 61. if (j != 1) 62. / 用户输入有误,还没有达到3次,允许重新输入63. System.out.println("n用户名和密码不匹配,请重新输入:"); 64. else 65. / 3次尝试结束,设置退出标志,并退出do-while循环66. System.out.println("n您没有权限进入系统!谢谢!"); 67. flag = false; 68. break; 69. 70. / 每输入一次将计数器减1,用于表示已经尝试了多少次71. j-; 72. while (true); 73. break; 74. case2: / 用户选择"更改管理员信息"75. if (verifyequal.verify(data.manager.username, 76. data.manager.password) 77. / 输入新信息前要先验证原来的信息,此处表示已经验证成功78. System.out.print("请输入新的用户名:"); 79. data.manager.username = scanner.next(); 80. System.out.print("请输入新的密码:"); 81. data.manager.password = scanner.next(); 82. System.out.println("用户名和密码已更改!"); 83. / 信息更改成功,选择下一步的操作84. System.out.println("n请选择,输入数字:"); 85. else 86. / 信息验证失败,设置退出标志87. System.out.println("抱歉,你没有权限修改!"); 88. flag = false; 89. 90. break; 91. case3: / 用户选择"退出"92. System.out.println("谢谢您的使用!"); 93. System.exit(0); 94. break; 95. default: / 一级菜单输入错误,需要重新选择96. System.out.print("n输入有误!请重新选择,输入数字: "); 97. break; 98. 99. while (flag); 100. 101. 3.2 Data类javaview plaincopy1. package cn.itcast; 2. /*3. * 存放购物系统的初始化数据的数据类,该类只是存放了已有的商品信息和顾客信息4. * 5. * author 6. * 7. */8. publicclass Data 9. /*10. * 默认构造方法,初始化变量,由于都是数组对象或类对象,所以都需要采用new11. * 12. */13. public Data() 14. goodsName = new String50 15. goodsPrice = newdouble50 16. custNo = newint100 17. custBirth = new String100; 18. custScore = newint100 19. manager = new Manager() 20. 21. /*22. * 初始化该类的数据23. * 24. */25. publicvoid initial() 26. /*=添加了初始的7种商品信息=*/27. goodsName 0 = "addidas运动鞋" 28. goodsPrice0 = 880D; 29. goodsName 1 = "Kappa网球裙" 30. goodsPrice1 = 200D; 31. goodsName 2 = "网球拍" 32. goodsPrice2 = 780D; 33. goodsName 3 = "addidasT恤" 34. goodsPrice3 = 420.77999999999997D; 35. goodsName 4 = "Nike运动鞋" 36. goodsPrice4 = 900D; 37. goodsName 5 = "Kappa网球" 38. goodsPrice5 = 45D; 39. goodsName 6 = "KappaT恤" 40. goodsPrice6 = 245D; 41. /*=添加了初始的7个顾客信息=*/42. custNo 0 = 1900; 43. custBirth0 = "08/05" 44. custScore0 = 2000; 45. custNo 1 = 1711; 46. custBirth1 = "07/13" 47. custScore1 = 4000; 48. custNo 2 = 1623; 49. custBirth2 = "06/26" 50. custScore2 = 5000; 51. custNo 3 = 1545; 52. custBirth3 = "04/08" 53. custScore3 = 2200; 54. custNo 4 = 1464; 55. custBirth4 = "08/16" 56. custScore4 = 1000; 57. custNo 5 = 1372; 58. custBirth5 = "12/23" 59. custScore5 = 3000; 60. custNo 6 = 1286; 61. custBirth6 = "12/21" 62. custScore6 = 10080; 63. 64. /*=定义该类所拥有的变量=*/65. public String goodsName / 商品的名称66. publicdouble goodsPrice; / 商品的价格67. publicint custNo / 顾客的会员号68. public String custBirth / 顾客的生日69. publicint custScore / 顾客的积分70. public Manager manager / 管理员类,仅仅存储了管理员的用户名和密码71. 3.3 Manager类javaview plaincopy1. package cn.itcast; 2. /*3. * 管理员类,仅仅存储了管理员的用户名和密码4. * 5. * author6. * 7. */8. publicclass Manager 9. /*10. * 设置默认的用户名和密码11. * 12. */13. public Manager() 14. username = "itcast" 15. password = "itcast" 16. 17. /*=定义该类所拥有的变量=*/18. public String username; / 用户名19. public String password; / 密码20. 3.4 VerifyEqual类javaview plaincopy1. package cn.itcast; 2. import java.util.Scanner; 3. /*4. * 验证用户登录的账户和密码是否正确的类5. * 6. * author7. * 8. */9. publicclass VerifyEqual 10. /*11. * 空构造方法12. * 13. */14. public VerifyEqual() 15. 16. /*17. * 执行验证的方法18. * 19. * param s 用于验证的正确的用户名20. * param s1 用于验证的正确的密码21. * return22. */23. publicboolean verify(String s, String s1) 24. / 由用户输入用户名25. System.out.print("请输入用户名:"); 26. Scanner scanner = new Scanner(System.in); 27. String s2 = scanner.next(); 28. / 由用户输入密码29. System.out.print("请输入密码:"); 30. scanner = new Scanner(System.in); 31. String s3 = scanner.next(); 32. / 判断用户输入的信息是否和已有的信息一致33. return s2.equals(s) && s1.equals(s3); 34. 35. 3.5 Menu类javaview plaincopy1. package cn.itcast; 2. import java.util.Scanner; 3. /*4. * 菜单类,用于显示所有级菜单供用户选择5. * 6. * author7. * 8. */9. publicclass Menu 10. /*11. * 空构造方法12. * 13. */14. public Menu() 15. 16. /*17. * 设置菜单类中的数据信息18. * 19. * param as20. * param ad21. * param ai22. * param as123. * param ai124. */25. publicvoid setData(String as, double ad, int ai, String as1, int ai1) 26. goodsName = as; 27. goodsPrice = ad; 28. custNo = ai; 29. custBirth = as1; 30. custScore = ai1; 31. 32. /*33. * 显示一级菜单,即登录界面34. * 35. */36. publicvoid showLoginMenu() 37. System.out.println("nnttt 欢迎使用itcast购物管理系统1.0版nn"); 38. System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *n"); 39. System.out.println("tttt 1. 登 录 系 统nn"); 40. System.out.println("tttt 2. 更 改 管 理 员 信 息nn"); 41. System.out.println("tttt 3. 退 出nn"); 42. System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *n"); 43. System.out.print("请选择,输入数字:"); 44. 45. /*46. * 显示二级菜单,即系统的主菜单,这个方法里面包含了对这个菜单处理的所有流程47. * 48. */49. publicvoid showMainMenu() 50. / 显示二级菜单,即系统的主菜单51. System.out.println("nntttt欢迎使用购物管理系统n"); 52. System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *n"); 53. System.out.println("tttt 1. 客 户 信 息 管 理n"); 54. System.out.println("tttt 2. 购 物 结 算n"); 55. System.out.println("tttt 3. 真 情 回 馈n"); 56. System.out.println("tttt 4. 注 销n"); 57. System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *n"); 58. / 用户选择服务项目59. System.out.print("请选择,输入数字:"); 60. Scanner scanner = new Scanner(System.in); 61. / 设置标志用于控制循环62. boolean flag = false; 63. do 64. String s = scanner.next(); 65. / 用户选择"客户信息管理"66. if (s.equals("1") 67. / 显示客户信息管理菜单并处理这个菜单的整个流程,当这个流程处理完68. showCustMMenu(); 69. break; 70. 71. / 用户选择"购物结算"72. if (s.equals("2") 73. / 定义购物结算类的对象,并处理整个购物结算的流程74. Pay pay = new Pay(); 75. pay.setData(goodsName, goodsPrice, custNo, custBirth, custScore); 76. pay.calcPrice(); 77. break; 78. 79. / 用户选择"真情回馈"80. if (s.equals("3") 81. / 处理真情回馈的整个处理流程82. showSendGMenu(); 83. break; 84. 85. / 用户选择"注销"86. if (s.equals("4") 87. / 显示一级菜单,此时会返回至StartSMS类中的一级菜单处理流程88. showLoginMenu(); 89. break; 90. 91. System.out.print("输入错误,请重新输入数字:"); 92. flag = false; 93. while (!flag); 94. 95. /*96. * 显示三级菜单-客户信息管理,并处理所有客户信息管理的流程97. * 98. */99. publicvoid showCustMMenu() 100. System.out.println("购物管理系统 > 客户信息管理n"); 101. System.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *n"); 102. System.out.println("tttt 1. 显 示 所 有 客 户 信 息n"); 103. System.out.println("tttt 2. 添 加 客 户 信 息n"); 104. System.out.println("tttt 3. 修 改 客 户 信 息n"); 105. System.out.println("tttt 4. 查 询 客 户 信 息n"); 106. System.out.println("* * * *