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;
}