From f786df1d9b429f5faf2f4d4ca2595c62ee7d662b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=8C=E1=85=B5=E1=86=AB=E1=84=80?= =?UTF-8?q?=E1=85=B5?= <> Date: Wed, 27 Nov 2024 16:23:07 +0900 Subject: [PATCH] =?UTF-8?q?/admin/content/list=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=95=20=EC=B2=98=EB=A6=AC=EC=99=80=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/contents/dao/AdminContentsDao.java | 45 ++++--- .../contents/vo/ContentsPagingQuery.java | 6 +- .../leejk0523/javavue/code/dao/CodeDAO.java | 48 ++++++++ .../javavue/code/service/CodeService.java | 10 ++ .../code/service/impl/CodeServiceImpl.java | 27 +++++ .../javavue/code/web/CodeController.java | 29 +++++ .../leejk0523/javavue/common/GridCode.java | 10 ++ .../leejk0523/javavue/common/PagingQuery.java | 6 + .../javavue/common/QueryDSLUtils.java | 18 +++ .../com/leejk0523/javavue/model/ComCd.java | 110 ++++++++++++++++++ .../com/leejk0523/javavue/model/IstInst.java | 52 +++++++++ .../src/main/resources/application.properties | 12 ++ nuxt/components/common/DefaultSelectCode.vue | 40 +++++++ nuxt/components/common/InstCodeSelect.vue | 29 +++++ nuxt/pages/admin/content/index.vue | 2 +- nuxt/pages/admin/content/list.vue | 34 +++--- nuxt/stores/contents/index.ts | 2 +- nuxt/stores/index.ts | 21 +--- nuxt/types/contents/index.ts | 2 +- 19 files changed, 449 insertions(+), 54 deletions(-) create mode 100644 java/src/main/java/com/leejk0523/javavue/code/dao/CodeDAO.java create mode 100644 java/src/main/java/com/leejk0523/javavue/code/service/CodeService.java create mode 100644 java/src/main/java/com/leejk0523/javavue/code/service/impl/CodeServiceImpl.java create mode 100644 java/src/main/java/com/leejk0523/javavue/code/web/CodeController.java create mode 100644 java/src/main/java/com/leejk0523/javavue/common/GridCode.java create mode 100644 java/src/main/java/com/leejk0523/javavue/common/PagingQuery.java create mode 100644 java/src/main/java/com/leejk0523/javavue/common/QueryDSLUtils.java create mode 100644 java/src/main/java/com/leejk0523/javavue/model/ComCd.java create mode 100644 java/src/main/java/com/leejk0523/javavue/model/IstInst.java create mode 100644 nuxt/components/common/DefaultSelectCode.vue create mode 100644 nuxt/components/common/InstCodeSelect.vue diff --git a/java/src/main/java/com/leejk0523/javavue/admin/contents/dao/AdminContentsDao.java b/java/src/main/java/com/leejk0523/javavue/admin/contents/dao/AdminContentsDao.java index a8b57c8..3d05297 100644 --- a/java/src/main/java/com/leejk0523/javavue/admin/contents/dao/AdminContentsDao.java +++ b/java/src/main/java/com/leejk0523/javavue/admin/contents/dao/AdminContentsDao.java @@ -1,12 +1,16 @@ package com.leejk0523.javavue.admin.contents.dao; +import ch.qos.logback.core.util.StringUtil; import com.leejk0523.javavue.admin.contents.vo.ContentsListResult; import com.leejk0523.javavue.admin.contents.vo.ContentsPagingQuery; +import com.leejk0523.javavue.common.QueryDSLUtils; import com.leejk0523.javavue.model.AsaContent; import com.leejk0523.javavue.model.QAsaContent; import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.core.types.dsl.Expressions; +import io.micrometer.common.util.StringUtils; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; @@ -18,6 +22,7 @@ import java.util.List; @Repository public class AdminContentsDao extends QuerydslRepositorySupport { + public AdminContentsDao() { super(AsaContent.class); } @@ -25,12 +30,33 @@ public class AdminContentsDao extends QuerydslRepositorySupport { public Page findContentsList(ContentsPagingQuery query) { QAsaContent asaContent = QAsaContent.asaContent; - final var offset = getOffset(query); - final var limit = getLimit(query); - final var pageable = getPageable(query); + final var offset = QueryDSLUtils.getOffset(query); + final var limit = QueryDSLUtils.getLimit(query); + final var pageable = QueryDSLUtils.getPageable(query); BooleanExpression expression = asaContent.delYn.eq("N"); + if (StringUtils.isNotEmpty(query.getKeyword())) { + switch (query.getType()) { + case CONTENT: { + expression = expression.and(asaContent.contents.contains(query.getKeyword())); + break; + } + case TITLE : { + expression = expression.and(asaContent.contentTitle.contains(query.getKeyword())); + break; + } + case TOTAL: { + expression = expression.and(asaContent.contents.contains(query.getKeyword()) + .or(asaContent.contentTitle.contains(query.getKeyword()))); + } + } + } + + if (StringUtils.isNotEmpty(query.getOrgId())) { + expression = expression.and(asaContent.orgId.eq(query.getOrgId())); + } + final var list = from(asaContent) .select( Projections.bean( @@ -55,17 +81,4 @@ public class AdminContentsDao extends QuerydslRepositorySupport { return new PageImpl<>(list, pageable, total); } - - private Pageable getPageable(ContentsPagingQuery query) { - return PageRequest.of(query.getPage() - 1, query.getSize()); - } - - private long getOffset(ContentsPagingQuery query) { - return (long) (query.getPage() - 1) * query.getSize(); - } - - private long getLimit(ContentsPagingQuery query) { - return query.getSize(); - } - } diff --git a/java/src/main/java/com/leejk0523/javavue/admin/contents/vo/ContentsPagingQuery.java b/java/src/main/java/com/leejk0523/javavue/admin/contents/vo/ContentsPagingQuery.java index 671e428..1021696 100644 --- a/java/src/main/java/com/leejk0523/javavue/admin/contents/vo/ContentsPagingQuery.java +++ b/java/src/main/java/com/leejk0523/javavue/admin/contents/vo/ContentsPagingQuery.java @@ -1,10 +1,11 @@ package com.leejk0523.javavue.admin.contents.vo; +import com.leejk0523.javavue.common.PagingQuery; import lombok.Data; import jakarta.validation.constraints.NotNull; @Data -public class ContentsPagingQuery { +public class ContentsPagingQuery implements PagingQuery { @NotNull private int page; @@ -19,6 +20,7 @@ public class ContentsPagingQuery { public enum Type { TITLE, - CONTENT + CONTENT, + TOTAL } } diff --git a/java/src/main/java/com/leejk0523/javavue/code/dao/CodeDAO.java b/java/src/main/java/com/leejk0523/javavue/code/dao/CodeDAO.java new file mode 100644 index 0000000..21ead7c --- /dev/null +++ b/java/src/main/java/com/leejk0523/javavue/code/dao/CodeDAO.java @@ -0,0 +1,48 @@ +package com.leejk0523.javavue.code.dao; + +import com.leejk0523.javavue.common.GridCode; +import com.leejk0523.javavue.model.ComCd; +import com.leejk0523.javavue.model.QAsaSite; +import com.leejk0523.javavue.model.QIstInst; +import com.querydsl.core.types.Projections; +import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class CodeDAO extends QuerydslRepositorySupport { + public CodeDAO() { + super(ComCd.class); + } + + public List findSiteCodeList() { + final var site = QAsaSite.asaSite; + + return from(site) + .select( + Projections.bean( + GridCode.class, + site.siteId.as("value"), + site.siteName.as("text"), + site.siteName.as("label") + ) + ) + .fetch(); + } + + public List findInstCodeList() { + final var inst = QIstInst.istInst; + + return from(inst) + .select( + Projections.bean( + GridCode.class, + inst.instNo.as("value"), + inst.instNm.as("label"), + inst.instNm.as("text") + ) + ) + .fetch(); + } +} diff --git a/java/src/main/java/com/leejk0523/javavue/code/service/CodeService.java b/java/src/main/java/com/leejk0523/javavue/code/service/CodeService.java new file mode 100644 index 0000000..5eab8ad --- /dev/null +++ b/java/src/main/java/com/leejk0523/javavue/code/service/CodeService.java @@ -0,0 +1,10 @@ +package com.leejk0523.javavue.code.service; + +import com.leejk0523.javavue.common.GridCode; + +import java.util.List; + +public interface CodeService { + List findSiteCodeList(); + List findInstCodeList(); +} diff --git a/java/src/main/java/com/leejk0523/javavue/code/service/impl/CodeServiceImpl.java b/java/src/main/java/com/leejk0523/javavue/code/service/impl/CodeServiceImpl.java new file mode 100644 index 0000000..2474de7 --- /dev/null +++ b/java/src/main/java/com/leejk0523/javavue/code/service/impl/CodeServiceImpl.java @@ -0,0 +1,27 @@ +package com.leejk0523.javavue.code.service.impl; + +import com.leejk0523.javavue.code.dao.CodeDAO; +import com.leejk0523.javavue.code.service.CodeService; +import com.leejk0523.javavue.common.GridCode; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service("lasp.codeServiceImpl") +@RequiredArgsConstructor +public class CodeServiceImpl implements CodeService { + private final CodeDAO codeDAO; + + @Override + public List findSiteCodeList() { + return codeDAO.findSiteCodeList(); + } + + @Override + public List findInstCodeList() { + return codeDAO.findInstCodeList(); + } + + +} \ No newline at end of file diff --git a/java/src/main/java/com/leejk0523/javavue/code/web/CodeController.java b/java/src/main/java/com/leejk0523/javavue/code/web/CodeController.java new file mode 100644 index 0000000..5e86329 --- /dev/null +++ b/java/src/main/java/com/leejk0523/javavue/code/web/CodeController.java @@ -0,0 +1,29 @@ +package com.leejk0523.javavue.code.web; + +import com.leejk0523.javavue.code.service.CodeService; +import com.leejk0523.javavue.common.GridCode; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +public class CodeController { + + private final CodeService codeService; + + @GetMapping("/api/admin/code/siteList") + public ResponseEntity> siteCodeList() { + final var results = codeService.findSiteCodeList(); + return ResponseEntity.ok(results); + } + + @GetMapping("/api/admin/code/instList") + public ResponseEntity> instCodeList() { + final var results = codeService.findInstCodeList(); + return ResponseEntity.ok(results); + } +} diff --git a/java/src/main/java/com/leejk0523/javavue/common/GridCode.java b/java/src/main/java/com/leejk0523/javavue/common/GridCode.java new file mode 100644 index 0000000..0398c3d --- /dev/null +++ b/java/src/main/java/com/leejk0523/javavue/common/GridCode.java @@ -0,0 +1,10 @@ +package com.leejk0523.javavue.common; + +import lombok.Data; + +@Data +public class GridCode { + private String label; + private String text; + private String value; +} diff --git a/java/src/main/java/com/leejk0523/javavue/common/PagingQuery.java b/java/src/main/java/com/leejk0523/javavue/common/PagingQuery.java new file mode 100644 index 0000000..b5f7436 --- /dev/null +++ b/java/src/main/java/com/leejk0523/javavue/common/PagingQuery.java @@ -0,0 +1,6 @@ +package com.leejk0523.javavue.common; + +public interface PagingQuery { + int getPage(); + int getSize(); +} diff --git a/java/src/main/java/com/leejk0523/javavue/common/QueryDSLUtils.java b/java/src/main/java/com/leejk0523/javavue/common/QueryDSLUtils.java new file mode 100644 index 0000000..255f1b2 --- /dev/null +++ b/java/src/main/java/com/leejk0523/javavue/common/QueryDSLUtils.java @@ -0,0 +1,18 @@ +package com.leejk0523.javavue.common; + +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +public class QueryDSLUtils { + public static Pageable getPageable(PagingQuery query) { + return PageRequest.of(query.getPage() - 1, query.getSize()); + } + + public static long getOffset(PagingQuery query) { + return (long) (query.getPage() - 1) * query.getSize(); + } + + public static long getLimit(PagingQuery query) { + return query.getSize(); + } +} diff --git a/java/src/main/java/com/leejk0523/javavue/model/ComCd.java b/java/src/main/java/com/leejk0523/javavue/model/ComCd.java new file mode 100644 index 0000000..f1dbe10 --- /dev/null +++ b/java/src/main/java/com/leejk0523/javavue/model/ComCd.java @@ -0,0 +1,110 @@ +package com.leejk0523.javavue.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Entity +@Table(name = "com_cd") +@IdClass(ComCd.Key.class) +public class ComCd { + @Id + @NotNull + @Size(max = 20) + @Column(name = "CD_GROUP_ID", nullable = false, length = 20) + private String cdGroupId; + + @Id + @Size(max = 6) + @NotNull + @Column(name = "COM_CD", nullable = false, length = 6) + private String comCd; + + @Size(max = 100) + @Column(name = "COM_CD_NM", length = 100) + private String comCdNm; + + @Size(max = 2000) + @Column(name = "COM_CD_EXPLN", length = 2000) + private String comCdExpln; + + @Column(name = "SORT_SEQ", nullable = false) + private Integer sortSeq; + + @Column(name = "USE_YN", length = 1, nullable = false) + private Boolean useYn; + + @Column(name = "DEL_YN", length = 1, nullable = false) + private Boolean delYn; + + @Size(max = 20) + @Column(name = "ARTCL_NM1", length = 20) + private String artclNm1; + + @Size(max = 20) + @Column(name = "ARTCL_NM2", length = 20) + private String artclNm2; + + @Size(max = 20) + @Column(name = "ARTCL_NM3", length = 20) + private String artclNm3; + + @Size(max = 20) + @Column(name = "ARTCL_NM4", length = 20) + private String artclNm4; + + @Size(max = 20) + @Column(name = "ARTCL_NM5", length = 20) + private String artclNm5; + + @Size(max = 20) + @Column(name = "ARTCL_NM6", length = 20) + private String artclNm6; + + @Size(max = 20) + @Column(name = "ARTCL_NM7", length = 20) + private String artclNm7; + + @Size(max = 20) + @Column(name = "ARTCL_NM8", length = 20) + private String artclNm8; + + @Size(max = 20) + @Column(name = "ARTCL_NM9", length = 20) + private String artclNm9; + + @Size(max = 20) + @Column(name = "ARTCL_NM10", length = 20) + private String artclNm10; + + @Column(name = "FRST_RGTR_ID", length = 50, nullable = false) + private String frstRgtrId; + + @Column(name = "FRST_REG_DT", nullable = false) + private LocalDateTime frstRegDt; + + @Column(name = "LAST_MDFR_ID", length = 50) + private String lastMdfrId; + + @Column(name = "LAST_MDFCN_DT") + private LocalDateTime lastMdfcnDt; + + @Data + public static class Key implements Serializable { + private static final long serialVersionUID = -3281903370957728656L; + private String cdGroupId; + private String comCd; + } + +} \ No newline at end of file diff --git a/java/src/main/java/com/leejk0523/javavue/model/IstInst.java b/java/src/main/java/com/leejk0523/javavue/model/IstInst.java new file mode 100644 index 0000000..e5bdfdc --- /dev/null +++ b/java/src/main/java/com/leejk0523/javavue/model/IstInst.java @@ -0,0 +1,52 @@ +package com.leejk0523.javavue.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import jakarta.persistence.*; +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Entity +@Table(name = "IST_INST") +public class IstInst { + + @Id + @Column(name = "INST_NO", length = 10, nullable = false) + private String instNo; + + @Column(name = "INST_CLSF_CD", length = 6, nullable = false) + private String instClsfCd; + + @Column(name = "INST_NM", length = 200, nullable = false) + private String instNm; + + @Column(name = "INST_SRVC_EXPLN", length = 50) + private String instSrvcExpln; + + @Column(name = "INST_CN") + private String instCn; + + @Column(name = "ATCH_FILE_ID", length = 20) + private String atchFileId; + + @Column(name = "USE_YN", length = 1, nullable = false) + private String useYn; + + @Column(name = "FRST_RGTR_ID", length = 50, nullable = false) + private String frstRgtrId; + + @Column(name = "FRST_REG_DT", nullable = false) + private LocalDateTime frstRegDt; + + @Column(name = "LAST_MDFR_ID", length = 50) + private String lastMdfrId; + + @Column(name = "LAST_MDFCN_DT") + private LocalDateTime lastMdfcnDt; +} diff --git a/java/src/main/resources/application.properties b/java/src/main/resources/application.properties index b9c05fe..64240d9 100644 --- a/java/src/main/resources/application.properties +++ b/java/src/main/resources/application.properties @@ -7,4 +7,16 @@ spring.datasource.password=Ghtkssk0325 spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.show-sql=true +# SQL 출력 +#spring.jpa.show-sql=true + +# SQL 포맷팅 spring.jpa.properties.hibernate.format_sql=true +spring.jpa.properties.hibernate.type=trace + +# 바인딩 파라미터 값 로깅 +logging.level.org.hibernate.type.descriptor.sql=TRACE + +# SQL에 바인딩된 파라미터 값도 출력 +logging.level.org.hibernate.SQL=DEBUG + diff --git a/nuxt/components/common/DefaultSelectCode.vue b/nuxt/components/common/DefaultSelectCode.vue new file mode 100644 index 0000000..1f06f20 --- /dev/null +++ b/nuxt/components/common/DefaultSelectCode.vue @@ -0,0 +1,40 @@ + + + diff --git a/nuxt/components/common/InstCodeSelect.vue b/nuxt/components/common/InstCodeSelect.vue new file mode 100644 index 0000000..23803fd --- /dev/null +++ b/nuxt/components/common/InstCodeSelect.vue @@ -0,0 +1,29 @@ + + + diff --git a/nuxt/pages/admin/content/index.vue b/nuxt/pages/admin/content/index.vue index 5b93df4..bb8c4f5 100644 --- a/nuxt/pages/admin/content/index.vue +++ b/nuxt/pages/admin/content/index.vue @@ -69,7 +69,7 @@ const nonValid = computed(() => { :colon="false" :label-col="{ span: 2 }" > - + diff --git a/nuxt/pages/admin/content/list.vue b/nuxt/pages/admin/content/list.vue index bc2133a..481bf36 100644 --- a/nuxt/pages/admin/content/list.vue +++ b/nuxt/pages/admin/content/list.vue @@ -2,13 +2,11 @@ import type { OptColumn, OptRowHeader } from 'tui-grid/types/options'; import { useContentStore } from '~/stores/contents'; import type { ContentType } from '~/types/contents'; -import { BOOLEANS } from '~/constants/grid'; -// import { useCommonCodeStore } from '~/stores'; +import { useCommonCodeStore } from '~/stores'; const router = useRouter(); -// const siteCodeList = await useCommonCodeStore().searchSiteCodeList(); -// const instCodeList = await useCommonCodeStore().searchInstCodeList(); +const instCodeList = await useCommonCodeStore().searchInstCodeList(); const contentStore = useContentStore(); const { contentsList, contentsQuery } = storeToRefs(contentStore); const gridRef = ref(); @@ -28,6 +26,15 @@ const columns: OptColumn[] = [ name: 'orgId', header: '관리기관', width: 100, + disabled: true, + formatter: 'listItemText', + resizable: true, + editor: { + type: 'select', + options: { + listItems: instCodeList + } + } }, { name: 'useYn', @@ -58,7 +65,7 @@ const columns: OptColumn[] = [ ]; const contentType = [ - { label: '전체', value: '' }, + { label: '전체', value: 'TOTAL' }, { label: '제목', value: 'TITLE' }, { label: '내용', value: 'CONTENT' } ]; @@ -72,7 +79,7 @@ onBeforeUnmount(() => { }); const search = () => { - // contentStore.searchContentList(); + contentStore.searchContentList(); }; const list = computed(() => { @@ -133,12 +140,12 @@ const editPage = (contentId: any) => { 관리기관 - - - - - - + @@ -151,7 +158,8 @@ const editPage = (contentId: any) => { v-model:value="contentsQuery.type" :options="contentType" /> - + diff --git a/nuxt/stores/contents/index.ts b/nuxt/stores/contents/index.ts index b89036b..af0bf26 100644 --- a/nuxt/stores/contents/index.ts +++ b/nuxt/stores/contents/index.ts @@ -16,7 +16,7 @@ const DEFAULT_CONTENT_QUERY: ContentListQueryType = { page: 1, siteId: '', size: 10, - type: '' + type: 'TOTAL' }; const DEFAULT_CONTENTS_LIST: Page = { diff --git a/nuxt/stores/index.ts b/nuxt/stores/index.ts index a24eec1..bbc51de 100644 --- a/nuxt/stores/index.ts +++ b/nuxt/stores/index.ts @@ -60,16 +60,6 @@ export const useDefaultStore = defineStore('useDefaultStore', () => { }); export const useCommonCodeStore = defineStore('useCommonCodeStore', () => { - const searchCommonCodeList = async ( - codeGroupId: string - ): Promise => { - const { data } = await useAxios().get('/api/admin/code/codeList', { - params: { - codeGroupId - } - }); - return data; - }; const searchSiteCodeList = async (): Promise => { const { data } = await useAxios().get('/api/admin/code/siteList'); @@ -83,17 +73,8 @@ export const useCommonCodeStore = defineStore('useCommonCodeStore', () => { return data; }; - const searchRoleCodeList = async (): Promise => { - const { data } = await useAxios().get( - '/api/admin/code/roleList' - ); - return data; - }; - return { searchInstCodeList, - searchSiteCodeList, - searchCommonCodeList, - searchRoleCodeList + searchSiteCodeList }; }); diff --git a/nuxt/types/contents/index.ts b/nuxt/types/contents/index.ts index 7f9a38b..c324b75 100644 --- a/nuxt/types/contents/index.ts +++ b/nuxt/types/contents/index.ts @@ -4,7 +4,7 @@ export type ContentListQueryType = { siteId: string; orgId: string; keyword: string; - type: '' | 'TITLE' | 'CONTENT'; + type: 'TOTAL' | 'TITLE' | 'CONTENT'; }; export type ContentListType = {