노마드코더 클론코딩 팀 프로젝트

팀원

  • 동태완
  • 이재철
  • 이병길
  • 박재빈

Git

PPT

https://drive.google.com/file/d/1ofteccsHds765LtgQAxYyiI3h58RF-Bt/view?usp=sharing

영상

https://youtu.be/oUQMyUYTCfg

Backend

의존성

  • Spring Boot DevTools
  • Lombok
  • Spring Data JPA
  • MySQL Driver
  • Spring Security
  • Spring Web
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

<dependency>
	<groupId>com.auth0</groupId>
	<artifactId>java-jwt</artifactId>
	<version>3.10.3</version>
</dependency>

<dependency>
   <groupId>org.qlrm</groupId>
   <artifactId>qlrm</artifactId>
   <version>2.1.1</version>
</dependency>

DB 생성

create user 'nomad'@'%' identified by '1234';
GRANT ALL PRIVILEGES ON *.* TO 'nomad'@'%';
create database nomad;
use nomad;

yml 설정

server:
  port: 8080
  servlet:
    context-path: /
    encoding:
      charset: UTF-8
      enabled: true
      force: true
                                                                                                                     
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/nomad?serverTimezone=Asia/Seoul
    username: nomad
    password: 1234

  jpa:
    hibernate:
      ddl-auto: update  #create update none
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    show-sql: true
    properties:
      hibernate.format_sql: true

  jackson:
    serialization:
      fail-on-empty-beans: false
 
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB
      enabled: true
           
file:
  path: C:/Users/Dong/Desktop/NomadWork/nomadCloneProject-bachend/src/main/resources/uploads/

모델

  • Community
  • Courses
  • MyError
  • Faq
  • MyFile
  • Likes
  • Pay
  • Tech
  • User
  • Video

E-R 다이어그램

image

시큐리티

image

배치 프로그램

image

image

image

Web

메인페이지

image

  • Course 리스트 최대 6개까지 나타냄
  • Challenges 기능 구현 x

Courses

image

  • Courses 모든 리스트를 나타냄
  • Level, Price, Tech에 따라 필터링 가능
@Component
@RequiredArgsConstructor
public class CoursesQuery {
	
	private final EntityManager em;
	
	public List<CoursesFilterPreviewRespDto> findByFilter(String level, String isFree) {
		StringBuffer sb = new StringBuffer();
		sb.append("SELECT id, previewImage, title, subTitle, level, tech, price, videoId FROM courses ");
		if(level != "") {
			sb.append("WHERE level = '" + level + "' ");
		}else {
			if(isFree != "") {
				sb.append("WHERE ");
			}
		}
		if(isFree.equals("true")) {
			if(level != "") {
				sb.append("AND price = 0 ");
			}else {
				sb.append("price = 0 ");
			}
		}else if(isFree.equals("false")) {
			if(level != "") {
				sb.append("AND price != 0 ");
			}else {
				sb.append("price != 0 ");
			}
			
		}
		
	    Query query = em.createNativeQuery(sb.toString());
	    JpaResultMapper result  = new JpaResultMapper();
		return result.list(query, CoursesFilterPreviewRespDto.class);
	}

}

CoursesDetail

image

  • 해당 강의를 결제하기 전에 사용자에게 강의에 대한 정보를 제공
  • 무료 강의인 경우 버튼 클릭 시 바로 등록
  • 유료 강의인 경우 버튼 클릭 시 결제 페이지로 이동하여 결제를 진행

Communty

image

  • 카테고리에 따라 분류가 가능하고 최신순, 인기순으로 나열이 가능
  • 관리자계정의 경우 카테고리 등록 가능
  • 좋아요 기능
  • 글쓰기 기능

CommunityDetail

image

  • 게시글의 내용을 보는 페이지
  • 댓글 작성, 삭제가 가능

FAQ

image

image

대시보드

image

프로필 수정

image

커리큘럼 등록

image

image

Tech 관리

image

코스 등록

image

결제 리스트(관리자)

image

비디오

image

  • Vimeo API 사용

챗봇

image

  • 실시간 1:1 문의
  • 채널톡 API 사용

APP

메인, 로그인, 네비게이션

image

  • 로그인은 구글 로그인만 가능

Courses

image

CoursesDetail

image

image

image

Payment

image

DashBoard

image

Community

image

FAQ

image

Video

image

Edit Profile

image

챗봇

image