17. 강좌 관리

kdew0308·2023년 4월 27일
0

학습 관리 시스템

목록 보기
17/17
post-thumbnail

1. 강좌 신청 내역

1-1) 기본 구조

1) CourseService.java 추가

List<CourseDto> listAll();

1) CourseServiceImpl.java 추가

@Override
    public List<CourseDto> listAll() {

        List<Course> courseList = courseRepository.findAll();

        return CourseDto.of(courseList);

    }

1) AdminTakeCourseController.java 수정

@GetMapping("/admin/takecourse/list.do")
    public String list(Model model, TakeCourseParam parameter) {

        parameter.init();

        List<TakeCourseDto> list = takeCourseService.list(parameter);


        long totalCount = 0;

        if (list != null && list.size() > 0) {
            totalCount = list.get(0).getTotalCount();
        }

        String queryString = parameter.getQueryString();
        String pagerHtml =  getPaperHtml(totalCount,parameter.getPageSize(), parameter.getPageIndex(), queryString);

        model.addAttribute("list", list);
        model.addAttribute("totalCount", totalCount);
        model.addAttribute("pager", pagerHtml);

        List<CourseDto> courseList = courseService.listAll();
        model.addAttribute("courseList",courseList);

        return "admin/takecourse/list";
    }

1) TakeCourseParam.java 추가

long searchCourseId;

1) list.html 추가

jquery 부분에

$('#searchCourseId').on('change', function () {
        var id = $(this).val();

        // 선택해줄때마다 주소를 courseId로 옮겨줌
        location.href = '?searchCourseId=' + id;
})

class 이름이 buttons인 div태그 안에

<select id="searchCourseId">
        <option value="">전체 강좌</option>
        <option th:each="x : ${courseList}"
                th:selected="${#strings.equals(param.searchCourseId, x.id)}"
                th:value="${x.id}" th:text="${x.subject}">자바프로그래밍</option>
</select>

1-2) 선택된 강의만 보기

1) AdminTakeCourseController.java 수정

@GetMapping("/admin/takecourse/list.do")
    public String list(Model model, TakeCourseParam parameter
                    , BindingResult bindingResult) {

        parameter.init();

        List<TakeCourseDto> list = takeCourseService.list(parameter);


        long totalCount = 0;

        if (list != null && list.size() > 0) {
            totalCount = list.get(0).getTotalCount();
        }

        String queryString = parameter.getQueryString();
        String pagerHtml =  getPaperHtml(totalCount,parameter.getPageSize(), parameter.getPageIndex(), queryString);

        model.addAttribute("list", list);
        model.addAttribute("totalCount", totalCount);
        model.addAttribute("pager", pagerHtml);

        List<CourseDto> courseList = courseService.listAll();
        model.addAttribute("courseList",courseList);

        return "admin/takecourse/list";
    }

2) TakeCourseMapper.xml 수정

<sql id="selectListWhere">

        <if test="searchCourseId > 0">
            AND c.id = #{searchCourseId}
        </if>

    </sql>

    <select id="selectListCount"
        parameterType="com.kdew.dewlms.course.model.CourseParam"
        resultType="long">

        SELECT count(*)
        FROM take_course tc
        JOIN course c ON tc.course_id = c.id
        JOIN member m ON tc.user_id = m.user_id
        WHERE 1=1
        <include refid="selectListWhere"></include>


    </select>

3) list.html 수정

내용이 없으면 "내용이 없습니다." 출력하고 페이지 번호는 삭제됩니다.

<tr th:if="${#lists.size(list) < 1}">
        <td colspan="8">
          <p class="nothing">내용이 없습니다.</p>
        </td>
      </tr>
      </tbody>

    </table>

    <div class="pager" th:if="${#lists.size(list) > 0}" th:utext="${pager}"></div>


2. 파일 업로드

2-1) 기본 구조

  • 파일을 서버로 전송하기 위해서는 form에 enctype="multipart/form-data"을 설정해줘야 함
  • 파일을 특정 폴더에 집어넣을 것임

1) add.html 추가

수정

<form id="submitForm" method="post" enctype="multipart/form-data">

추가

<tr>
          <th>첨부 파일</th>
          <td>
            <input type="file" name="file">
          </td>
</tr>

2) AdminCourseController

String getNewSaveFile(String basePath, String originalFilename) {
        //
        //
        LocalDate now = LocalDate.now();

        String[] dirs = {
                String.format("%s/%d/", basePath,now.getYear()),
                String.format("%s/%d/%02d/", basePath, now.getYear(),now.getMonthValue()),
                String.format("%s/%d/%02d/%02d/", basePath, now.getYear(), now.getMonthValue(), now.getDayOfMonth())};

        for(String dir : dirs) {
            File file = new File(dir);
            if (!file.isDirectory()) {
                file.mkdir();
            }
        }

        String fileExtension = "";
        if (originalFilename != null) {
            int dotPos = originalFilename.lastIndexOf("."); // .의 위치 가져오기
            if (dotPos > -1) {
                fileExtension = originalFilename.substring(dotPos + 1); // 파일 확장자 가져오기
            }
        }

        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        String newFilename = String.format("%s%s", dirs[2], uuid); // 확장자가 없는 경우 파일 이름
        if (fileExtension.length() > 0) {
            newFilename += "." + fileExtension; // 확장자가 있는 경우 파일 이름
        }

        return newFilename;
    }

    @PostMapping(value = {"/admin/course/add.do", "/admin/course/edit.do"})
    public String addSubmit(Model model, HttpServletRequest request
                            , MultipartFile file
                            , CourseInput parameter) {

        if (file != null) {

            String originalFilename = file.getOriginalFilename();
            String basePath = "D:/zerobase/springboot/dewlms/files";
            String saveFilename = getNewSaveFile(basePath, originalFilename);

            try {
                File newfile = new File(saveFilename);
                FileCopyUtils.copy(file.getInputStream(), new FileOutputStream(newfile));
            } catch (IOException e) {
                log.info("############");
                log.info(e.getMessage());
            }
        }

        boolean editMode = request.getRequestURI().contains("/edit.do");

        if(editMode) {

            long id = parameter.getId();

            CourseDto existCourse = courseService.getById(id); // 강좌 상세 정보 가져옴

            if (existCourse == null) {
                // 강좌 정보가 없으면 에러 처리
                model.addAttribute("message", "강좌 정보가 존재하지 않습니다.");
                return "common/error";
            }
            boolean result = courseService.set(parameter);
            // id가 존재하면 화면에 수정할 수 있도록 보여줌
        } else {
            boolean result = courseService.add(parameter);
        }

        return "redirect:/admin/course/list.do";
    }




2-2) 업로드한 파일 DB에 저장

AdminCourseController

addSubmit 부분에

String saveFilename = ""; // 파일 저장하기 위해서
parameter.setFilename(saveFilename);

CourseInput

String filename;

CourseServiceImpl

add에

.filename(parameter.getFilename())

set에

course.setFilename(parameter.getFilename());

Course

String filename;

2-3) 서버에서 받아서 보여주기

1) 톰캣 설치

다운로드

설정

Edit Configurations -> + -> Tomcat Server -> Local -> 톰캣 위치 설정해주고 -> 맨 아래 Fix버튼 클릭 -> dewlms-war exploded 클릭


Project Structure

  • webapp : web의 루트
  • dewlms는 타임리프 템플릿을 사용하기 때문에 static에 templetes를 바라보기 때문에webapp를 당장 쓰지는 않음
  • 만약 모듈들을 연동할 일이 있으면 webapp 밑에 데이터 저장하거나 라이브러리 저장해서 사용하기도 함

SecurityConfiguration.java

스프링에서 허용하지 않는 경로이기 때문에 이미지가 나오지 않음.
그래서 스프링에서 허용해줘야 함!

@Override
    public void configure(WebSecurity web) throws Exception {

        web.ignoring().antMatchers("favicon.ico", "files/**");

        super.configure(web);
    }

private String[] getNewSaveFile(String baseLocalPath, String baseUrlPath, String originalFilename) {
        //
        //
        LocalDate now = LocalDate.now();

        String[] dirs = {
                String.format("%s/%d/", baseLocalPath,now.getYear()),
                String.format("%s/%d/%02d/", baseLocalPath, now.getYear(),now.getMonthValue()),
                String.format("%s/%d/%02d/%02d/", baseLocalPath, now.getYear(), now.getMonthValue(), now.getDayOfMonth())};

        String urlDir = String.format("%s/%d/%02d/%02d/", baseUrlPath, now.getYear(), now.getMonthValue(), now.getDayOfMonth());

        for(String dir : dirs) {
            File file = new File(dir);
            if (!file.isDirectory()) {
                file.mkdir();
            }
        }

        String fileExtension = "";
        if (originalFilename != null) {
            int dotPos = originalFilename.lastIndexOf("."); // .의 위치 가져오기
            if (dotPos > -1) {
                fileExtension = originalFilename.substring(dotPos + 1); // 파일 확장자 가져오기
            }
        }

        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        String newFilename = String.format("%s%s", dirs[2], uuid); // 확장자가 없는 경우 파일 이름
        String newUrlFilename = String.format("%s%s", urlDir, uuid);
        if (fileExtension.length() > 0) {
            newFilename += "." + fileExtension; // 확장자가 있는 경우 파일 이름
            newUrlFilename += "." + fileExtension;
        }

        return new String[]{newFilename, newUrlFilename};
    }

    @PostMapping(value = {"/admin/course/add.do", "/admin/course/edit.do"})
    public String addSubmit(Model model, HttpServletRequest request
                            , MultipartFile file
                            , CourseInput parameter) {

        String saveFilename = ""; // 파일 저장하기 위해서
        String urlFilename = "";

        if (file != null) {

            String originalFilename = file.getOriginalFilename();
            String baseLocalPath = "D:/zerobase/springboot/dewlms/files";
            String baseUrlPath = "/files";

            String[] arrFilename = getNewSaveFile(baseLocalPath, baseUrlPath, originalFilename);

            saveFilename = arrFilename[0];
            urlFilename = arrFilename[1];


            try {
                File newfile = new File(saveFilename);
                FileCopyUtils.copy(file.getInputStream(), new FileOutputStream(newfile));
            } catch (IOException e) {
                log.info("############");
                log.info(e.getMessage());
            }
        }

        parameter.setFilename(saveFilename);
        parameter.setUrlFilename(urlFilename);

        boolean editMode = request.getRequestURI().contains("/edit.do");

        if(editMode) {

            long id = parameter.getId();

            CourseDto existCourse = courseService.getById(id); // 강좌 상세 정보 가져옴

            if (existCourse == null) {
                // 강좌 정보가 없으면 에러 처리
                model.addAttribute("message", "강좌 정보가 존재하지 않습니다.");
                return "common/error";
            }
            boolean result = courseService.set(parameter);
            // id가 존재하면 화면에 수정할 수 있도록 보여줌
        } else {
            boolean result = courseService.add(parameter);
        }

        return "redirect:/admin/course/list.do";
    }

AdminCourseController

CourseServiceImpl

set에

course.setUrlFilename(parameter.getUrlFilename());

add에

.urlFilename(parameter.getUrlFilename())

Course

String urlFilename;

CourseDto

String filename;
String urlFilename;

.filename(course.getFilename())
.urlFilename(course.getUrlFilename())

CourseInput

String urlFilename;

detail.html

<div>
      <img th:src="${detail.urlFilename}">
</div>


0개의 댓글

관련 채용 정보