본문 바로가기

수업관련

로ㄱ,인

package board2;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);

		Board board = new Board();
		board.setScanner(scanner);

		board.start();

		scanner.close();

	}
}

class Board {// class Site
	Article[] articles;
	int articlesLastIndex;
	int lastArticleId;

	Member[] members;
	int membersLastIndex;
	boolean loggedInY_N;
	int memberOwnId;

	Member loggedInMember; // 현재 로그인한 멤버 정보 담을 리모콘

	Board() {
		articles = new Article[100];
		articlesLastIndex = -1;
		lastArticleId = 0;

		members = new Member[50];
		membersLastIndex = -1;
		loggedInY_N = false;
		memberOwnId = 0;
		loggedInMember = null; // 로그인 하기 전에는 기본적으로 비어있다

	}

	Scanner scanner;

// 스캐너 공유
	void setScanner(Scanner scanner) {
		this.scanner = scanner;
	}

//  게시물관리 실행
	void startBoard() {
		showHelp();
		while (true) {
			System.out.print("게시판) ");
			String cmd = scanner.next().trim();
			if (cmd.equals("help")) {
				showHelp();
			} else if (cmd.equals("list")) {
				scanner.nextLine();
				doCommandList();
			} else if (cmd.equals("add")) {
				scanner.nextLine();
				doCommandAdd();
			} else if (cmd.equals("exit")) {
				doCommandExit();
				break;
			} else if (cmd.equals("detail")) {
				int id = scanner.nextInt();
				scanner.nextLine();
				doCommandDetail(id);
			} else if (cmd.equals("modify")) {
				int id = scanner.nextInt();
				scanner.nextLine();
				doCommandModify(id);
			} else if (cmd.equals("delete")) {
				int id = scanner.nextInt();
				scanner.nextLine();
				doCommandDelete(id);
			} else {
				System.out.println("== 일치하는 명령어가 없습니다 ==");
			}
		}
	}

// 회원관리 메서드 ====================================================
	// 회원 관리 실행
	void start() {
		while (true) {
			showMenu();
			System.out.println("");
			System.out.print("> ");
			String cmd = scanner.next().trim();

			if (cmd.equals("1")) {
				scanner.nextLine();
				if (loggedInMember != null) {
					System.out.println("== 로그아웃이 필요합니다 ==");
				} else {
					String id = "";
					String pw = "";
					String nickName = "";
					doCommandSignUp(id, pw, nickName);
					System.out.println("");
				}
			} else if (cmd.equals("2")) {
				scanner.nextLine();
				doCommandLogIn();
				System.out.println("");
			} else if (cmd.equals("3")) {
				scanner.nextLine();
				doCommandLogOut();
				System.out.println("");
			} else if (cmd.equals("4")) {
				scanner.nextLine();
				doCommandEditMember();
				System.out.println("");
			} else if (cmd.equals("5")) {
				scanner.nextLine();
				if (loggedInY_N == true) {
					startBoard();
				} else if (loggedInY_N == false) {
					System.out.println("== 로그인이 필요합니다 ==");
				}
				System.out.println("");
			} else if (cmd.equals("exit")) {
				doCommandExit();
				break;
			} else {
				System.out.println("== 일치하는 명령어가 없습니다 ==");
				System.out.println("");
			}
		}
	}

	// 회원정보 수정
	void doCommandEditMember() {
		System.out.println("== 회원정보 수정==");

		if (loggedInY_N == true) {
			System.out.println("== 기존의 회원 정보를 입력해주세요 ==");

			System.out.print("아이디 : ");
			String id = scanner.next().trim();
			System.out.print("비밀번호 : ");
			String pw = scanner.next().trim();
			Member m = getMemberByLoginId_Pw(id, pw);
			if (loggedInMember == m) {
				System.out.println("== 새로운 정보를 입력해주세요 ==");
				System.out.print("닉네임 : ");
				String nickName = scanner.next().trim();
				System.out.print("비밀번호 : ");
				String pw1 = scanner.next().trim();
				m.nickName = nickName;
				m.pw = pw1;
				doCommandLogOut();
			} else {
				System.out.println("==아이디 혹은 비밀번호가 일치하지 않습니다==");
			}
		} else if (loggedInY_N == false) {
			System.out.println("== 로그인이 필요합니다==");
		}
	}

	Member getMemberByLoginId_Pw(String loginId, String pw) {// 아이디 비밀번호 받아서 일치하는지 확인
		Member member = null;
		for (int i = 0; i <= membersLastIndex; i++) {
			Member m = members[i];
			if (m.loginId.equals(loginId) && m.pw.equals(pw)) {
				member = m;
				break;
			}
		}
		return member;
	}

	void doCommandLogOut() {
		if (loggedInY_N == false) {
			System.out.println("== 로그인이 필요합니다 ==");
		} else if (loggedInY_N == true) {
			loggedInY_N = false;
			loggedInMember = null;
			System.out.println("== 로그아웃 되었습니다 ==");
		}
	}

	void doCommandLogIn() {

		while (true) {
			if (loggedInY_N == true) {
				System.out.println("== 이미 로그인되어있습니다 ==");
				break;
			} else {
				System.out.println("== 로그인 ==");
				System.out.print("아이디 : ");
				String id = scanner.next().trim();
				System.out.print("비밀번호 : ");
				String pw = scanner.next().trim();

				Member m = getMemberByLoginId_Pw(id, pw);

				if (m != null) {
					System.out.printf("%s님 환영합니다.\n", m.nickName);
					loggedInY_N = true;
					loggedInMember = m; // 로그인한 멤버의 정보를 현재 로그인한 멤버 리모콘에 넣어준다
					break;
				} else {
					System.out.println("아이디, 혹은 비밀번호가 일치하지 않습니다");
					break;
				}
			}
		}
	}

	void doCommandSignUp(String id, String pw, String nickName) { // 회원가입 정보 입력받기
		System.out.println("== 회원가입 ==");
		while (true) {
			System.out.print("사용할 아이디 : ");
			id = scanner.next().trim();

			if (getMemberIndexById(id) > -1) {
				System.out.println("이미 존재하는 아이디입니다.");
			} else if (getMemberIndexById(id) == -1) {
				break;
			}
		}

		System.out.print("사용할 비밀번호 : ");
		pw = scanner.next().trim();
		System.out.print("사용할 닉네임 : ");
		nickName = scanner.next().trim();

		System.out.printf("아이디 : %s 비밀번호 : %s 닉네임 : %s%n", id, pw, nickName);
		System.out.println("이대로 진행하시겠습니까? y / n");
		System.out.print("> ");
		String yn = scanner.next().trim();
		if (yn.equals("y")) {
			addMember(id, pw, nickName);
			System.out.println("== 회원이 되신것을 환영합니다 ==");
		}
	}

	void addMember(String id, String pw, String nickName) {// 멤버추가 후 배열에 저장

		Member member = new Member(id, pw, nickName);
		memberOwnId++;
		member.ownId = memberOwnId;
		membersLastIndex++;
		members[membersLastIndex] = member;
	}

	int getMemberIndexById(String id) { // 회원 인덱스 찾기
		int index = -1;
		for (int i = 0; i <= membersLastIndex; i++) {
			if (members[i].loginId.equals(id)) {
				index = i;
				break;
			}
		}
		return index;
	}

	void showMenu() {
		System.out.println("== 게시물 관리 프로그램에 오신 것을 환영합니다 ==");
		System.out.println("@ 번호 / 명령어를 입력 해주세요 @");
		System.out.println("1 ) 회원가입");
		System.out.println("2 ) 로그인");
		System.out.println("3 ) 로그아웃");
		System.out.println("4 ) 회원정보 수정");
		System.out.println("5 ) 게시판 실행");
		System.out.println("exit : 프로그램 종료");
	}

// 게시판 메서드 ============================================================
	void doCommandDelete(int id) {
		System.out.println("==게시물 삭제==");
		Article a = getArticleById(id);
		if (getArticleIndexById(id) == -1) {
			System.out.println("게시물이 존재하지 않습니다.");
		} else {
			if (loggedInMember.ownId == a.writerOwnId) {
				for (int i = getArticleIndexById(id); i <= articlesLastIndex - 1; i++) {
					articles[i] = articles[i + 1];
				}
				articlesLastIndex--;
			} else {
				System.out.println("== 작성자 본인만 삭제가 가능합니다 ==");
			}
		}
	}

	int getArticleIndexById(int id) { /* 게시물 인덱스 찾는 메서드 */
		int index = -1;
		for (int i = 0; i <= articlesLastIndex; i++) {
			Article a = articles[i];
			if (a.id == id) {
				index = i;
				break;
			}
		}
		return index;
	}

	void doCommandModify(int id) {
		System.out.println("==게시물 수정==");

		Article a = getArticleById(id);

		if (a == null) {
			System.out.println("게시물이 존재하지 않습니다.");
		} else {
			if (loggedInMember.ownId == a.writerOwnId) {

				System.out.print("제목 : ");
				a.title = scanner.next();
				System.out.print("내용 : ");
				a.body = scanner.next();
			} else {
				System.out.println("== 작성자 본인만 수정이 가능합니다 ==");
			}
		}
	}

	Article getArticleById(int id) {/* 번호 따른 게시물 찾고 리턴 */
		Article article = null;
		for (int i = 0; i <= articlesLastIndex; i++) {
			Article a = articles[i];
			if (a.id == id) {
				article = a;
				break;
			}
		}
		return article;
	}

	void doCommandDetail(int id) {

		System.out.println("==게시물 상세==");
		Article a = getArticleById(id); // 편리하게 쓰기 위한 리모콘 a
		if (getArticleById(id) == null) {
			System.out.println("게시물이 존재하지 않습니다.");
		} else {
			System.out.printf("번호 : %d%n", a.id);
			System.out.printf("날짜 : %s%n", a.regDate);
			System.out.printf("제목 : %s%n", a.title);
			System.out.printf("내용 : %s%n", a.body);
			a.views++;
			/**/
			doCommandLike(a);
		}
	}

	void doCommandLike(Article a) {
		System.out.printf("해당 글을 추천 하시겠습니까? yes / no%n");
		String yn = scanner.next().trim();

		if (yn.equals("yes")) {
			if (a.likes == 0) {
				System.out.println("해당글을 추천합니다.");
				a.likes++;
				a.likedMembers[0] = loggedInMember.ownId;
			} else {
				int likedHistory = -1; // 추천 기록 작성
				for (int i = 0; i < a.likes; i++) {
					if (a.likedMembers[i] == loggedInMember.ownId) {
						likedHistory = i;
						break;
					}
				}
				if (likedHistory == -1) {
					a.likes++;
					a.likedMembers[a.likes - 1] = loggedInMember.ownId;
					System.out.println("해당글을 추천합니다.");
				} else {
					a.likes--;
					for (int i = likedHistory; i < a.likes; i++) {
						a.likedMembers[i] = a.likedMembers[i + 1];
					}
					System.out.println("해당글의 추천을 취소합니다.");
				}
			}
		}else {
			System.out.println("==추천을 취소합니다==");
		}
	}
//	boolean checkRepetition() {
//		if (article
//			System.out.println("이미 추천한 게시물 입니다.");
//			return false;
//		} else if (likes[loggedInMember.ownId - 1].likedId != loggedInMember.ownId
//				&& likes[loggedInMember.ownId] == null) {
//			likes[loggedInMember.ownId].likedId = loggedInMember.ownId;
//		}
//		return true;
//	}

	void doCommandList() {
		System.out.println("== 게시물 리스트 ==");

		for (int i = 0; i <= articlesLastIndex; i++) {
			System.out.printf("번호| 날짜                | 제목 | 조회수 | 추천수 | 작성자 %n");
			System.out.printf("%d   | %s | %s  | %d      | %d      | %s\n", articles[i].id, articles[i].regDate,
					articles[i].title, articles[i].views, articles[i].likes, articles[i].writer);

		}
	}

	void doCommandAdd() {
		System.out.println("== 게시물 추가 ==");

		Article article = new Article();
		System.out.print("제목 : ");
		article.title = scanner.next();
		System.out.print("내용 : ");
		article.body = scanner.next();
		article.regDate = getRegDate();
		article.id = lastArticleId + 1;
		articlesLastIndex++;
		lastArticleId++;
		article.writer = loggedInMember.nickName;
		article.writerOwnId = loggedInMember.ownId; // 현재 로그인한 멤버의 고유 번호를 게시물 작성자 고유 번호에 넣어준다

		articles[articlesLastIndex] = article;
		System.out.printf("%d번 게시물이 생성되었습니다. %n", article.id);
	}

	String getRegDate() {
		DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
		LocalDateTime now = LocalDateTime.now();
		String time = dtf.format(now);
		return time;
	}

	void doCommandExit() {
		System.out.println("== 게시판이 종료됩니다 ==");
	}

	void showHelp() {
		System.out.println("== 명령어 리스트 ==\r\n" + "help : 명령어 리스트\r\n" + "list : 게시물 리스팅\r\n" + "add : 게시물 추가\r\n"
				+ "exit : 종료\r\n" + "detail ${게시물 번호} : 게시물 상세보기\r\n" + "게시판) list[엔터]");
	}
}

class Article {
	int id;
	String title;
	String body;
	String regDate;
	int views;
	int likes;
	int writerOwnId;
	String writer;
	int likedMember;
	int[] likedMembers = new int[10];

}

class Member {
	String loginId;
	String pw;
	String nickName;
	int ownId;

	Member(String id, String pw, String nickName) {
		this.loginId = id;
		this.pw = pw;
		this.nickName = nickName;
	}
}

class Like {
	int likedMemberId;
}

'수업관련' 카테고리의 다른 글

게시판 에드 참조  (0) 2020.05.20
jackson --  (0) 2020.05.18
회원가입..? 로그인..?  (0) 2020.05.13
추가 수정 삭제까지 0base에서 시작  (0) 2020.05.08
게시판 구현 현황  (0) 2020.05.08