java開發項目之歡購網購物平臺

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.二級菜單中分別有下一級菜單,也是用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.總結

1.框架一定要明確

類與類的關係一定要簡潔,清晰,儘量避免耦合性。這個小項目中,禮物類和用戶操作類其實可以定義爲接口,因爲現在只是用一種方法實現(集合實現),但是以後要是用GUI、數據庫等其它方法,那就不便於操作。所以框架一定要明確,不然只會反覆修改。

2.命名要規範

只有命名規範了,那麼不管有多少類,當你需要方法實現時,就不用再一個一個找,因爲你腦中已經有這個方法了,可以高效快捷一些。不然你都弄不清這個要用的方法在哪個類。

3.節省內存空間,合理優化代碼

雖說萬事萬物皆對象,不假。但是每次創建對象,堆內存都會佔用空間,這個對象使用完畢不會立即被回收,在垃圾回收器空閒時纔會回收,所以還是要少創建對象。字符串拼接儘量用源代碼中的StringBuilder緩衝區拼接,好處就是不會每次創建對象,沒有才會創建對象,而且它還是不同步的,更是大大提高效率。

5.知識點歸納

1.本項目中多次使用do while語句和switch經典用法加flag控制循環,個人覺得尤其flag在循環中非常便捷。

2.有多級菜單時,要返回上一級菜單,那麼就要單獨寫一個返回菜單的功能,每次需要的時候就可以方便的調用。

3.測試類,只是測試功能,儘量減少直接在測試類中寫其他代碼。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章