1.歡購網購物平臺的需求分析
本案例並沒有GUI參與,只是用eclipse模擬了購物平臺的一些簡單操作。主要是對javaEE基礎知識的綜合運用,介紹面向對象的思想(面向過程分析,以及封裝、繼承、多態)。本案例肯定還存在一些bug,一些細節後續再改進。
1. 用戶的數據類:UserData類
姓名,年齡,出生日期,積分等,相當於用戶基本信息庫。
2. 校驗類:Check類
校驗用戶名,密碼和管理員用戶名、密碼 等。
3. 用戶的操作類:UserService類
用戶信息查詢,查詢客戶信息, 添加客戶信息, 修改客戶信息, 刪除客戶信息,幸運客戶,生日回饋等方法。
4. 管理員的數據類: AdDate類
專門封裝管理員的賬號信息,以後要是想修改或者添加管理員就非常方便,相當於是管理員數據庫
5. 購物商品類(商品數據庫):GoodsData類
在面向對象的設計中,我們的數據比較多,任意放置會出問題,這樣也不方便以後維護。這就相當於商品庫一樣,以後哪裏需要就送到哪裏。
6. 購物結算:Pay類
由於購物結算比較複雜,所以專門分出一個類用於購物結算(選擇購買,付款等)。
7. 禮物類:Gift類
這就相當於系統內置的禮物庫一樣,當你需要的時候,由系統送出。
8. 菜單類:Menu類
所有的一級菜單、二級菜單、三級菜單。
9.測試類: StartSMS
用於啓動用戶管理系統。
開始拿到一個項目可能會很茫然,老虎吃天無從下抓的感覺。那麼就先分析需求,劃分好類,就相當於倉庫分類管理一樣,什麼東西屬於哪個倉庫就放在哪個倉庫。然後用的時候,類與類會產生關係,其實這就是面向對象思想。
2.歡購網項目類與類之間的關係分析:
1,啓動StartSMS(SMS就是Subscriber Management System用戶管理系統的意思)之後,首先是一級菜單,就是mainMenu,有登錄歡購網、註冊歡購網、修改賬號、退出歡購網等。這裏可以有一個do while語句加上flag(定義一個布爾標記)控制。
2.在登錄成功時啓動二級菜單。客戶信息、購物結算、幸運客戶、生日回饋等。這裏需要在菜單類中控制,也是需要do while語句加上flag(定義一個布爾標記)控制。
注意的是:每次要返回上一級菜單的時候都需要調用寫好的返回菜單方法。
3.代碼實現(所有的代碼都在一個包中,cn.jason)
3.1 StartSMS類
package cn.jason;
import java.util.Scanner;
/**
* 這是用戶管理啓動類
*
* @author cassandra
* @version v1.1
*/
public class StartSMS {
public static void main(String[] args) {
GoodsData goods = new GoodsData();// 先對產品信息初始化,加載到服務器
goods.goodsIfo();// 把產品信息加載到數組中
Menu menu = new Menu();// 創建菜單對象,方便後面調取二級三級菜單
menu.setUserDate(goods.goodsName, goods.goodsPrice, goods.score);
Check check = new Check();// 創建校驗對象
UserService us = new UserService();
boolean flag = true;// 判斷標誌,方便控制do while語句
do {
menu.mainMenu();// 調取一級菜單
Scanner sc = new Scanner(System.in);
String yourChoice = sc.nextLine();
switch (yourChoice) {
// 登錄
case "1":
for (int i = 3; i >= 1; i--) { // 給用戶三次輸入機會
System.out.println("請輸入用戶名");
String username = sc.nextLine();
System.out.println("請輸入密碼");
String password = sc.nextLine();
// 校驗登錄的用戶名和密碼
if (!check.isLogin(username, password) ) {
if (i != 1)
System.out.println("用戶名或密碼有誤,請重新輸入");
else {
System.out.println("你已經輸錯三次,爲了保證賬號安全,請24小時候後在登錄.");
flag = false;
}
} else {
System.out.println("恭喜你,登錄成功\n");
menu.secondMenu();// 登錄成功,那麼調用二級菜單
flag = false;
}
}
break;
// 註冊
// 校驗用戶名是否符合要求
case "2":
String newUsername;
while (true) {
System.out.println("請輸入用戶名");
newUsername = sc.nextLine();
if (!check.checkUserName(newUsername))
System.out.println("6~10個字符,支持小寫英文、數字和'_'下劃線格式,請以英文字母開頭");
else
break;
}
// 校驗出生年月是否符合要求
String bornDate;
while (true) {
System.out.println("請輸入出生日期,格式是xxxx-xx-xx");
bornDate = sc.nextLine();
if (check.checkBornDate(bornDate) == false)
System.out.println("你輸入的格式有誤,請重新輸入");
else
break;
}
// 校驗年齡是否符合要求
String age;
while (true) {
System.out.println("請輸入年齡");
age = sc.nextLine();
if (!check.checkAge(age))
System.out.println("你輸入的年齡有誤,請重新輸入");
else
break;
}
// 校驗用戶密碼是否符合要求
String newPassword;
while (true) {
System.out.println("請輸入密碼");
newPassword = sc.nextLine();
if (!check.checkPassword(newPassword))
System.out.println("你的密碼格式不正確,長度在6~10位,由數字和26個英文字母組成");
else
break;
}
// 註冊成功時,系統隨機分配一個VIP賬戶
int vipNumber = us.giveRandomNo();
System.out.println("恭喜你註冊成功,你的VIP賬號是" + vipNumber);
// 把用戶註冊的基本信息保存在集合array裏面,也就是保存到服務器
UserData user = new UserData();
user.setUsername(newUsername);
user.setAge(age);
user.setBornDate(bornDate);
user.setPassword(newPassword);
user.setVipNumber(vipNumber);
check.isRegister(user);
break;
// 修改用戶名和密碼
case "3":
System.out.println("請輸入用戶名");
String username = sc.nextLine();
System.out.println("請輸入密碼");
String password = sc.nextLine();
if (!check.isLogin(username, password))
System.out.println("用戶名或密碼有誤,請重新輸入");
else {
check.changePassword(username, password);
}
break;
default:
break;
}
} while (flag);
}
}
3.2UserData類
package cn.jason;
/**
* 這是用戶基本信息類。
*
* @author cassandra
* @version 1.1
*/
public class UserData {
private String username;//用戶名
private String age;//用戶年齡
private String bornDate;//用戶出生年齡
private String password;//用戶密碼
private int vipNumber;//用戶vip賬戶
public UserData() {
super();
}
public int getVipNumber() {
return vipNumber;
}
public void setVipNumber(int vipNumber) {
this.vipNumber = vipNumber;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getBornDate() {
return bornDate;
}
public void setBornDate(String bornDate) {
this.bornDate = bornDate;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
3.3AdData類
package cn.jason;
/**
* 這是管理員類(管理員的賬號和密碼)
* @author cassandra
* @version v1.1
*/
public class AdData {
private String AdName1;//管理員賬號1
private String AdPassword1;//管理員1密碼
private String AdName2;//管理員賬號2
private String AdPassword2;//管理員2密碼
public AdData(){
AdName1="Jason";
AdPassword1="Jason";
AdName2="Cassandra";
AdPassword2="Cassandra";
}
}
3.4Check類
package cn.jason;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Scanner;
import java.util.regex.Pattern;
/**
* 這是用戶操作的具體實現類
*
* @author cassandra
* @version @1.0
*/
public class Check {
public static ArrayList<UserData> array = new ArrayList<UserData>();
/**
* 這是校驗用戶登錄的方法
*
* @param username
* 這是要驗證的用戶名
* @param password
* 這是要驗證的密碼
* @return 這是校驗的結果
*/
public boolean isLogin(String username, String password) {
boolean flag = false;
if ((username.equalsIgnoreCase("jason") && password.equalsIgnoreCase("jason"))
|| (username.equalsIgnoreCase("cassandra") && password.equalsIgnoreCase("cassandra")))
flag = true;
else {
for (UserData u : array) {
if (u.getUsername().equals(username) && u.getPassword().equals(password)) {
flag = true;
break;
}
}
}
return flag;
}
/**
* 這是校驗是否爲管理員或者還沒有註冊的用戶
*/
public boolean isLoginUsername(String username) {
boolean flag = false;
if (username.equalsIgnoreCase("jason") || username.equalsIgnoreCase("cassandra")) {
flag = true;
} else {
for (UserData u : array) {
if (u.getUsername().equals(username)) {
flag = true;
break;
}
}
}
return flag;
}
/**
* 這是把註冊信息傳到服務器的方法。
*
* @param user
* 要傳到服務器的用戶信息
*/
public void isRegister(UserData user) {
array.add(user);
}
/**
* 這是校驗註冊的用戶名是否符合要求的方法。
*
* @param username
* 這是用戶的註冊名
* @return 返回校驗結果
*/
public boolean checkUserName(String username) {
boolean flag = false;
// 字母開頭,允許6~10字節,允許字母數字下劃線
String regex = "^[a-zA-Z][a-zA-Z0-9_]{5,9}$";
flag = Pattern.matches(regex, username);
if (flag) {
if (username.length() < 6 || username.length() > 10)
flag = false;
}
return flag;
}
/**
* 這是校驗註冊的出生年月是否符合要求的方法。
*/
public boolean checkBornDate(String bornDate) {
boolean flag = false;
String regex = "\\d{4}-\\d{1,2}-\\d{1,2}";
String regex1 = "-";
String[] st = bornDate.split(regex1);// 把出生日期轉換成數組
Calendar cl = Calendar.getInstance();
int year = cl.get(cl.YEAR);// 獲取當前年份
flag = Pattern.matches(regex, bornDate);
//校驗年月日
if (flag) {
//是否爲閏年
if( Integer.parseInt(st[0])%4==0){
//判斷年份有沒有超過當前年份,月份有麼有超過12
if (Integer.parseInt(st[0]) > year || Integer.parseInt(st[1]) > 12)
flag = false;
//判斷閏年2月份是否超過29天
else if( Integer.parseInt(st[1])==2 || Integer.parseInt(st[2])>29)
flag = false;
}else {
if (Integer.parseInt(st[0]) > year || Integer.parseInt(st[1]) > 12)
flag = false;
else if( Integer.parseInt(st[1])==2 || Integer.parseInt(st[2])>28)
flag = false;
}
}
return flag;
}
/**
* 這是校驗年齡的方法
*
* @param age
* @return 年齡是否符合要求的結果
*/
public boolean checkAge(String age) {
boolean flag = false;
if (Integer.parseInt(age) > 0 && Integer.parseInt(age) < 100) {
flag = true;
}
return flag;
}
/**
* 這是校驗註冊用戶的密碼是否符合要求的方法
*
* @param password
* 這是註冊用戶的密碼
* @return 這是返回校驗結果
*/
public boolean checkPassword(String password) {
boolean flag = false;
String regex = "\\d+";
// 只要匹配成功,那麼flag就是true,只要在判斷長度是否符合要求。
flag = Pattern.matches(regex, password);
if (flag) {
if (password.length() < 6 || password.length() > 10)
flag = false;
}
return flag;
}
/**
* 這是更改賬號和密碼的方法
*
* @param username
* 這是要更改的用戶名
* @param password
* 這是要更改的密碼
*/
public void changePassword(String username, String password) {
Scanner sc = new Scanner(System.in);
String newUserword;
while (true) {
System.out.println("請輸入新用戶名");
newUserword = sc.nextLine();
if (checkUserName(newUserword) == true)
break;
else
System.out.println("6~10個字符,支持小寫英文、數字和'_'下劃線格式,請以英文字母開頭");
}
String newPassword;
while (true) {
System.out.println("請輸入新密碼");
newPassword = sc.nextLine();
if (checkPassword(newPassword) == true)
break;
else
System.out.println("你的密碼格式不正確,長度在6~10位,由數字和26個英文字母組成");
}
//更改之後把新的用戶名和密碼存儲在服務器中
UserData user = new UserData();
user.setUsername(newUserword);
user.setPassword(newPassword);
isRegister(user);
//刪除更改之前的用戶名和密碼
for (int x = 0; x < array.size(); x++) {
UserData u = array.get(x);
if (u.getUsername().equals(username) && u.getPassword().equals(password))
array.remove(x);
}
System.out.println("恭喜你,密碼修改成功\n");
}
}
3.5Menu類
package cn.jason;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/**
* 這是菜單的類
*
* @author cassandra
* @version v1.1
*/
public class Menu {
private String[] goodsName;
private double[] goodsPrice;
private int[] score;
/**
* 把商品庫的東西傳過來,方便在這個類中遍歷數組
*
* @param goodsName
* 商品名稱
* @param goodsPrice
* 商品價格
* @param score
* 用戶積分
*/
public void setUserDate(String[] goodsName, double[] goodsPrice, int[] score) {
this.goodsName = goodsName;
this.goodsPrice = goodsPrice;
this.score = score;
}
public Menu() {
super();
}
/**
* 這是一級菜單
*/
public void mainMenu() {
System.out.println("**---------------歡迎來到歡購網----------------**\n");
System.out.println("\t\t 1.登錄歡購網 \n");
System.out.println("\t\t 2.註冊歡購網 \n");
System.out.println("\t\t 3.修改賬號 \n");
System.out.println("\t\t 4.退出歡購網 \n");
System.out.println("**------------------------------------------**");
System.out.println("請選擇:");
}
/**
* 這是二級菜單
*/
public void secondMenu() {
System.out.println("**----------------歡迎進入歡購網----------------**\n");
System.out.println("\t\t 1.客戶信息管 理 \n");
System.out.println("\t\t 2.購物結算 \n");
System.out.println("\t\t 3.幸運客戶 \n");
System.out.println("\t\t 4.生日回饋 \n");
System.out.println("**------------------------------------------**");
System.out.println("請選擇,輸入數字或按'n'返回上一級菜單:");
Scanner sc = new Scanner(System.in);
UserService uu = new UserService();
boolean flag = true;
do {
String choice = sc.next();
if (choice.equals("1")) {
cusMenu();
break;
}
if (choice.equals("2")) {
shopingMenu();
break;
}
if (choice.equals("3")) {
uu.luckyCus();
break;
}
if (choice.equals("4")) {
uu.birthday();
break;
}
if (choice.equalsIgnoreCase("n")) {
mainMenu();
break;
}
System.out.println("你輸入有誤,請重新輸入");
flag = false;
} while (!flag);
}
/**
* 這是客戶信息管理的子菜單
*/
public void cusMenu() {
System.out.println("* * * * * * * *客 戶 信 息 管理>客戶信息 * * * * * * * *\n");
System.out.println("\t\t 1. 顯示所有客 戶 信 息 \n");
System.out.println("\t\t 2. 添加客戶信息\n");
System.out.println("\t\t 3. 修改客戶信息\n");
System.out.println("\t\t 4. 清除客戶信息\n");
System.out.println("* * * * * * * * * ** * * * * * * * * * * * * *");
System.out.println("請選擇,輸入數字或按'n'返回上一級菜單:");
Scanner sc = new Scanner(System.in);
UserService uu = new UserService();
Check check = new Check();
boolean flag = true;
do {
String choice = sc.next();
if (choice.equals("1")) {
uu.showCustomIfo();// 調用顯示多有客戶信息的方法
break;
}
if (choice.equals("2")) {
uu.addIfo();// 調取增加客戶信息的方法
break;
}
if (choice.equals("3")) {
uu.modify();// 調取修改客戶信息的方法
break;
}
if (choice.equals("4")) {
uu.clear();// 選擇清除客戶信息的方法
break;
}
if (choice.equalsIgnoreCase("n")) {
secondMenu();// 如果選擇n那麼調取用二級菜單,也就是返回上一級菜單
break;
}
System.out.println("你輸入有誤,請重新輸入");
flag = false;
} while (!flag);
}
/**
* 這是購物菜單
*/
public void shopingMenu() {
setUserDate(goodsName, goodsPrice, score);
System.out.println("* * * * * * * *購物結算>商品信息信息 * * * * * * * *\n");
System.out.println("\t商品 \t\t單價 \t\t總計");
for (int x = 0, y = 0; x < goodsName.length && y < goodsPrice.length; x++, y++) {
if (goodsName[x] != null && goodsPrice[y] != 0)
System.out.println(
new StringBuilder().append("0" + (x + 1) + ":" + goodsName[x]).append("\t" + goodsPrice[y]));
else
break;
}
Pay p = new Pay();
//調取購物結算方法,此處的calcMoney就是英文(calculateMoney)的意思
p.calcMoney();
UserService us = new UserService();
//這是購物結算完畢要返回上一級菜單
us.returnSecondMenu();
}
}
3.6UserService類
package cn.jason;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;
/**
* 這是用戶操作的類。
*
* @author cassandra
* @version v1.1
*/
public class UserService {
public String[] giftName;
public String[] giftPrice;
// 這是把禮物庫的對象傳過來,方便在本類中遍歷數組等操作
public void setGift(String[] giftName, String[] giftPrice) {
this.giftName = giftName;
this.giftPrice = giftPrice;
}
/**
* 這是用於返回一級菜單的方法
*/
public void returnLastMenu() {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入n返回上一級菜單");
while (true) {
if (sc.next().equalsIgnoreCase("n")) {
Menu menu = new Menu();
menu.cusMenu();
break;
} else
System.out.println("你輸入有誤,請重新輸入");
}
}
/**
* 這是用於返回二級菜單的方法
*/
public void returnSecondMenu() {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入n返回上一級菜單");
while (true) {
if (sc.next().equalsIgnoreCase("n")) {
Menu menu = new Menu();
menu.secondMenu();
break;
} else
System.out.println("你輸入有誤,請重新輸入");
}
}
/**
* 這是用戶和管理員查詢用戶信息的方法。
*
* @param username
* 這是用戶名或者管理員名
*/
public void showCustomIfo() {
if (Check.array.size() == 0)
System.out.println("還沒用用戶信息");
else
for (int x = 0; x < Check.array.size(); x++) {
UserData u = Check.array.get(x);
System.out.println((new StringBuilder()).append(u.getUsername()).append("\t" + u.getBornDate())
.append("\t" + u.getAge()).append("\t" + u.getVipNumber()));
}
returnLastMenu();
returnSecondMenu();
}
/**
* 這是管理員增加用戶信息到服務器的方法。
*
* @param user
*/
public void addIfo() {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入要添加的用戶名");
String newName = sc.nextLine();
System.out.println("請輸入要添加的用戶名的出生年月");
String newDate = sc.nextLine();
System.out.println("請輸入要添加的用戶名的年齡");
String newAge = sc.nextLine();
System.out.println("請輸入要添加的用戶名的Vip賬號");
String newVip = sc.nextLine();
UserData u = new UserData();
//把心增加的用戶信息保存在服務器中
u.setUsername(newName);
u.setBornDate(newDate);
u.setAge(newAge);
u.setVipNumber(Integer.parseInt(newVip));
Check check = new Check();
check.isRegister(u);//這是調取保存服務器的方法
System.out.println("恭喜你,添加成功\n");
//添加成功返回上一級菜單
returnLastMenu();
returnSecondMenu();
}
/**
* 這是管理員修改用戶信息的方法。
*
* @param user
*/
public void clear() {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入要清除的用戶名");
String name = sc.nextLine();
for (UserData u1 : Check.array) {
if (u1.getUsername() == name) {
Check.array.remove(u1);
break;
}
}
System.out.println("恭喜你,清除成功\n");
returnLastMenu();
returnSecondMenu();
}
/**
* 這是用戶修改信息的方法
*/
public void modify() {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入要修改的用戶名");
String mName = sc.nextLine();
System.out.println("請輸入要修改的出生年月");
String mBornDate = sc.nextLine();
for (int x = 0; x < Check.array.size(); x++) {
UserData u = Check.array.get(x);
if (u.getUsername().equals(mName) && u.getBornDate().equals(mBornDate)) {
//先移除用戶的信息
Check.array.remove(x);
//在把修改的信息保存服務器
u.setUsername(mName);
u.setBornDate(mBornDate);
Check check = new Check();
check.isRegister(u);
break;
}
}
System.out.println("恭喜你,修改成功\n");
//修改成功返回上一級菜單
returnLastMenu();
returnSecondMenu();
}
/**
* 這是針對用戶註冊成功時,系統自動分配的VIP賬號
*/
public int giveRandomNo() {
int randomNumber = (int) (Math.random() * 100 + 1);
return randomNumber;
}
/**
* 這是幸運抽獎的方法
*
* @return 返回的是抽獎用戶的卡號
*/
public void luckyCus() {
Gift gift = new Gift();
gift.giftIfo();// 把禮物信息加載到數組中
setGift(gift.giftName, gift.giftPrice);// 把數組傳過來
int randomNumber = (int) (Math.random() * 30);
boolean flag = true;
//如果禮物庫中的某一個索引與隨機數相等,那麼就獲得獎品,否則,沒有抽到獎品
for (int y = 0, z = 0; y < giftName.length && z < giftPrice.length; y++, z++) {
if ((giftName[y] != null && giftPrice[z] != null) && y == randomNumber) {
System.out.println(
(new StringBuilder("恭喜您獲得").append(giftPrice[randomNumber]).append(giftName[randomNumber])));
flag = false;
break;
}
}
if (flag)
System.out.println("不好意思,你沒有抽到獎品");
//返回上一級菜單
Menu menu = new Menu();
menu.secondMenu();
}
/**
* 這是校驗用戶生日的方法
*
* @param number
* 這是用Vip賬號
*/
public void birthday() {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入你的vip賬號");
String vipNumber = sc.nextLine();
System.out.println("請輸入你的birthday,格式是xx-xx");
String bornDate = sc.nextLine();
String regex = "-";
String[] st = bornDate.split(regex);
boolean flag = false;
Calendar cl = Calendar.getInstance();
int month = cl.get(cl.MONTH);
int day = cl.get(cl.DAY_OF_MONTH);
//比較用戶的vip賬號是否和服務器中的相同,月份和日期是否和今天的相同,若相同,則送500元優惠券,否則,沒有過生日,
//返回上一級菜單
for (UserData u : Check.array) {
if (u.getVipNumber() == Integer.parseInt(vipNumber) && (st[0].equals(String.valueOf(month + 1)))
&& st[1].equals(String.valueOf(day))) {
System.out.println("歡購網祝你生日快樂,送你一張500元優惠券");
break;
}
}
System.out.println("抱歉,你還沒有過生日,不能領取生日禮包");
//返回上一級菜單
Menu menu = new Menu();
menu.secondMenu();
}
}
3.7Pay類
package cn.jason;
import java.util.Scanner;
/**
* 這是用戶結算的方法
*
* @author cassandra
* @version v1.1
*/
public class Pay {
public String[] goodsName;
public double[] goodsPrice;
public void setGoods(String[] goodsName, double[] goodsPrice) {
this.goodsName = goodsName;
this.goodsPrice = goodsPrice;
}
/**
* 這是購買羽毛球拍的方法。
*
* @param number
* @return
*/
public Double getBSum(String number) {
return 1880 * (Double.parseDouble(number));
}
/**
* 這是購買網球拍的方法。
*
* @param number
* @return
*/
public Double getTSum(String number) {
return 2500 * (Double.parseDouble(number));
}
/**
* 這是購買足球的方法。
*
* @param number
* @return
*/
public Double getFSum(String number) {
return 1500 * (Double.parseDouble(number));
}
/**
* 這是購買nike球鞋的方法。
*
* @param number
* @return
*/
public Double getNSSum(String number) {
return 1300 * (Double.parseDouble(number));
}
/**
* 這是購買KP球鞋的方法。
*
* @param number
* @return
*/
public Double getKPSum(String number) {
return 1200 * (Double.parseDouble(number));
}
/**
* 這是購買阿迪鞋的方法。
*
* @param number
* @return
*/
public Double getADSum(String number) {
return 1200 * (Double.parseDouble(number));
}
/**
* 這是購物結算的具體方法
*/
public void calcMoney() {
Scanner sc = new Scanner(System.in);
GoodsData gd = new GoodsData();
setGoods(gd.goodsName, gd.goodsPrice);
int s1 = 0;
int s2 = 0;
int s3 = 0;
int s4 = 0;
int s5 = 0;
int s6 = 0;
boolean flag = true;
do {
System.out.println("請選擇購買的產品:");
String select = sc.nextLine();
if (select.equals("01")) {
System.out.println("請輸入數量:");
String number = sc.nextLine();
s1 += getBSum(number);
System.out.println("還要繼續購買嗎?y/n,輸入n返回上一級目錄");
String string = sc.nextLine();
if (string.equalsIgnoreCase("n")) {
System.out.println("總計" + s1 + "元,謝謝你選擇歡購網.");
break;
}
}
if (select.equals("02")) {
System.out.println("請輸入數量:");
String number1 = sc.nextLine();
s2 += getTSum(number1);
System.out.println("還要繼續購買嗎?y/n,輸入n返回上一級目錄");
String string = sc.nextLine();
if (string.equalsIgnoreCase("n")) {
System.out.println("總計" + (s1 + s2) + "元,謝謝你選擇歡購網.");
break;
}
}
if (select.equals("03")) {
System.out.println("請輸入數量:");
String number2 = sc.nextLine();
s3 += getFSum(number2);
System.out.println("還要繼續購買嗎?y/n,輸入n返回上一級目錄");
String string2 = sc.nextLine();
if (string2.equalsIgnoreCase("n")) {
System.out.println("總計" + (s1 + s2 + s3) + "元,謝謝你選擇歡購網.");
break;
}
}
if (select.equals("04")) {
System.out.println("請輸入數量:");
String number3 = sc.nextLine();
s4 += getNSSum(number3);
System.out.println("還要繼續購買嗎?y/n,輸入n返回上一級目錄");
String string3 = sc.nextLine();
if (string3.equalsIgnoreCase("n")) {
System.out.println("總計" + (s1 + s2 + s3 + s4) + "元,謝謝你選擇歡購網.");
break;
}
}
if (select.equals("05")) {
System.out.println("請輸入數量:");
String number4 = sc.nextLine();
s5 += getKPSum(number4);
System.out.println("還要繼續購買嗎?y/n,輸入n返回上一級目錄");
String string = sc.nextLine();
if (string.equalsIgnoreCase("n")) {
System.out.println("總計" + (s1 + s2 + s3 + s4 + s5) + "元,謝謝你選擇歡購網.");
break;
}
}
if (select.equals("06")) {
System.out.println("請輸入數量:");
String number5 = sc.nextLine();
s6 += getADSum(number5);
System.out.println("還要繼續購買嗎?y/n,輸入n返回上一級目錄");
String string = sc.nextLine();
if (string.equalsIgnoreCase("n")) {
System.out.println("總計" + (s1 + s2 + s3 + s4 + s5 + s6) + "元,謝謝你選擇歡購網.");
break;
}
}
// 如果輸入不再範圍內,則提示輸入有誤
if (Integer.parseInt(select) < 0 || Integer.parseInt(select) > 6)
System.out.println("你輸入有誤,請重新輸入");
flag = false;
} while (!flag);
}
}
3.8GoodsData類
package cn.jason;
/**
* 這是用戶信息
*
* @author cassandra
* @version v1.1
*/
public class GoodsData {
public String[] goodsName;// 商品名稱
public double[] goodsPrice;// 商品價格
public int[] score;// 用戶積分
// 設置數組長度
public GoodsData() {
goodsName = new String[40];
goodsPrice = new double[40];
score = new int[40];
AdData ad = new AdData();// 初始化商品時候,順便對管理員初始化。
}
// 商品的具體信息
public void goodsIfo() {
goodsName[0] = "羽毛球拍";
goodsPrice[0] = 1880;
goodsName[1] = "網球拍";
goodsPrice[1] = 2500;
goodsName[2] = "足球";
goodsPrice[2] = 1500;
goodsName[3] = "nike球鞋";
goodsPrice[3] = 1300;
goodsName[4] = "KP球鞋";
goodsPrice[4] = 1200;
goodsName[5] = "阿迪鞋";
goodsPrice[5] = 1200;
}
}
3.9Gift類
package cn.jason;
/**
* 這是存放禮物的類
* @author cassandra
* @version v1.1
*/
public class Gift {
public String[] giftName;//禮物的名稱
public String[] giftPrice;//禮物的價格
//設置數組的長度,長度給大一點,方便以後添加商品
public Gift() {
giftName = new String[30];
giftPrice = new String[30];
}
//禮物的具體信息
public void giftIfo() {
giftName[0] = "一臺ipa平板電腦";
giftPrice[0] = "價值5000元";
giftName[1] = "一部iPhone 7手機";
giftPrice[1] = "價值5288元";
giftName[2] = "一臺蘋果筆記本電腦";
giftPrice[2] = "價值10000元";
giftName[3] = "一部寶馬X5";
giftPrice[3] = "價值600000元";
giftName[4] = "一張500元代金券";
giftPrice[4] = "價值500元";
giftName[5] = "一臺富士單反相機";
giftPrice[5] = "價值3500元";
giftName[6] = "一臺小米智能電視";
giftPrice[6] = "價值1500元";
}
}
4.總結
類與類的關係一定要簡潔,清晰,儘量避免耦合性。這個小項目中,禮物類和用戶操作類其實可以定義爲接口,因爲現在只是用一種方法實現(集合實現),但是以後要是用GUI、數據庫等其它方法,那就不便於操作。所以框架一定要明確,不然只會反覆修改。
2.命名要規範
只有命名規範了,那麼不管有多少類,當你需要方法實現時,就不用再一個一個找,因爲你腦中已經有這個方法了,可以高效快捷一些。不然你都弄不清這個要用的方法在哪個類。
3.節省內存空間,合理優化代碼
雖說萬事萬物皆對象,不假。但是每次創建對象,堆內存都會佔用空間,這個對象使用完畢不會立即被回收,在垃圾回收器空閒時纔會回收,所以還是要少創建對象。字符串拼接儘量用源代碼中的StringBuilder緩衝區拼接,好處就是不會每次創建對象,沒有才會創建對象,而且它還是不同步的,更是大大提高效率。
5.知識點歸納
2.有多級菜單時,要返回上一級菜單,那麼就要單獨寫一個返回菜單的功能,每次需要的時候就可以方便的調用。
3.測試類,只是測試功能,儘量減少直接在測試類中寫其他代碼。