Compare commits

..

20 Commits

Author SHA1 Message Date
thkim f8fcda0369 feat: '위원회 일정 등록' 페이지 로딩 시, 필요한 데이터 불러 오는 API 구현 완료 건
관리자 단에서 '위원회 관리' > '위원회 일정 관리'에 '등록' 버튼을 누른 후 '위원회 일정 등록' 페이지 로딩 시, 필요한 데이터 불러 오는 API 구현 완료.
2024-01-05 17:49:31 +09:00
thkim 823ff346e8 Merge branch 'master' of http://118.219.150.34:50501/DBNT/kcscDev into thkim 2024-01-05 17:32:58 +09:00
thkim 33ed87a6d8 feat:'위원회 일정 등록' 페이지 로딩 시, 필요한 데이터 불러 오는 API listTopOrg 목록 추가\관리자 단에서 '위원회 관리' > '위원회 일정 관리'에 '등록' 버튼을 누른 후 '위원회 일정 등록' 페이지 로딩 시, 필요한 데이터 불러 오는 API 2024-01-05 17:32:38 +09:00
thkim e3cc93b986 feat:'위원회 일정 등록' 페이지 로딩 시, 필요한 데이터 불러 오는 API listTopOrg 목록 추가관리자 단에서 '위원회 관리' > '위원회 일정 관리'에 '등록' 버튼을 누른 후 '위원회 일정 등록' 페이지 로딩 시, 필요한 데이터 불러 오는 API 2024-01-05 17:32:08 +09:00
강석 최 4d4cb60413 사용자관리 작업중. 페이지네이션 수정. 2024-01-05 17:31:38 +09:00
thkim c18143c542 Merge branch 'master' of http://118.219.150.34:50501/DBNT/kcscDev into thkim 2024-01-05 16:44:03 +09:00
thkim 549a78b47e feat:'위원회 일정 등록' 페이지 로딩 시, 필요한 데이터 불러 오는 API 일부 기능 추가 관리자 단에서 '위원회 관리' > '위원회 일정 관리'에 '등록' 버튼을 누른 후 '위원회 일정 등록' 페이지 로딩 시, 필요한 데이터 불러 오는 API 2024-01-05 16:43:54 +09:00
Lim\jun 4248a47916 왼쪽메뉴 하단이랑 붙는 경우 대비 20px 공간추가 2024-01-05 15:00:25 +09:00
Lim\jun 6c3a17f0f2 paging css 수정 2024-01-05 13:55:17 +09:00
Lim\jun 71e621d63e 왼쪽메뉴 상단 및 본문 간격 줄임 2024-01-05 13:46:11 +09:00
thkim 7549c0bcd7 Merge branch 'master' of http://118.219.150.34:50501/DBNT/kcscDev into thkim 2024-01-05 09:59:53 +09:00
thkim 83f11fb4e5 feat: merged egovframe-template-simple-react-contribution/yarn.lock 2024-01-05 09:59:49 +09:00
thkim a799f454e2 feat: '위원회 일정 등록' 페이지 로딩 API를 개발하기 위한 폴더 구조 생성
관리자 단에서 '위원회 관리' > '위원회 일정 관리'에 '등록'버튼을 누른 후 '위원회 일정 등록' 페이지 로딩 시, 필요한 데이터 불러오는 API 제작
2024-01-05 09:58:08 +09:00
Lim\jun ff14346de4 로그현황 - 개인정보 로그 2024-01-04 18:33:36 +09:00
강석 최 5fa0e3f25f 사용자 목록 작업중. 2024-01-04 18:01:35 +09:00
강석 최 dc59f66c11 코드관리 작업완료. 2024-01-04 16:43:56 +09:00
강석 최 37b84a9975 코드관리 작업중.
front gitignore 수정.
2024-01-04 16:11:31 +09:00
강석 최 6713bc933d Merge branch 'master' of http://118.219.150.34:50501/DBNT/kcscDev 2024-01-03 17:59:17 +09:00
강석 최 021f61f126 기본코드관리 작업중. 2024-01-03 17:59:14 +09:00
유민형 0e16df04a4 대시보드 사용자 접속현황 그래프(6개월 전으로 해놓음) 2024-01-03 17:33:17 +09:00
74 changed files with 13737 additions and 8014 deletions

2
.gitignore vendored
View File

@ -1,2 +0,0 @@
**/.idea
**/.vscode

View File

@ -3,6 +3,8 @@
.github/
.Docs/
.idea/
**/.idea
**/.vscode
# dependencies
/node_modules

View File

@ -8,9 +8,7 @@
"name": "template.web.boot.simple.homepage",
"version": "0.1.0",
"dependencies": {
"axios": "^1.6.1",
"bootstrap": "^5.3.2",
"http-proxy-middleware": "^2.0.6",
"qs": "^6.11.0",
"react": "^18.2.0",
"react-bootstrap": "^2.9.0",
@ -20,6 +18,7 @@
"react-loader-spinner": "^5.4.5",
"react-router-dom": "^6.4.0",
"react-scripts": "5.0.1",
"recharts": "^2.10.3",
"styled-components": "^6.0.9",
"web-vitals": "^2.1.4"
},
@ -3960,6 +3959,60 @@
"@types/node": "*"
}
},
"node_modules/@types/d3-array": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz",
"integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="
},
"node_modules/@types/d3-color": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
"integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="
},
"node_modules/@types/d3-ease": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
"integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="
},
"node_modules/@types/d3-interpolate": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
"integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
"dependencies": {
"@types/d3-color": "*"
}
},
"node_modules/@types/d3-path": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.2.tgz",
"integrity": "sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA=="
},
"node_modules/@types/d3-scale": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz",
"integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==",
"dependencies": {
"@types/d3-time": "*"
}
},
"node_modules/@types/d3-shape": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz",
"integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==",
"dependencies": {
"@types/d3-path": "*"
}
},
"node_modules/@types/d3-time": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz",
"integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw=="
},
"node_modules/@types/d3-timer": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
"integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="
},
"node_modules/@types/eslint": {
"version": "8.21.1",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz",
@ -4625,7 +4678,8 @@
"node_modules/abab": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
"integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="
"integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
"deprecated": "Use your platform's native atob() and btoa() methods instead"
},
"node_modules/accepts": {
"version": "1.3.8",
@ -5059,29 +5113,6 @@
"node": ">=4"
}
},
"node_modules/axios": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz",
"integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==",
"dependencies": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/axios/node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/axobject-query": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz",
@ -5778,6 +5809,14 @@
"wrap-ansi": "^7.0.0"
}
},
"node_modules/clsx": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz",
"integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==",
"engines": {
"node": ">=6"
}
},
"node_modules/co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@ -6514,6 +6553,116 @@
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
"integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
},
"node_modules/d3-array": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
"integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
"dependencies": {
"internmap": "1 - 2"
},
"engines": {
"node": ">=12"
}
},
"node_modules/d3-color": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
"integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
"engines": {
"node": ">=12"
}
},
"node_modules/d3-ease": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
"integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
"engines": {
"node": ">=12"
}
},
"node_modules/d3-format": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
"integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
"engines": {
"node": ">=12"
}
},
"node_modules/d3-interpolate": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
"integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
"dependencies": {
"d3-color": "1 - 3"
},
"engines": {
"node": ">=12"
}
},
"node_modules/d3-path": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
"integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
"engines": {
"node": ">=12"
}
},
"node_modules/d3-scale": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
"integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
"dependencies": {
"d3-array": "2.10.0 - 3",
"d3-format": "1 - 3",
"d3-interpolate": "1.2.0 - 3",
"d3-time": "2.1.1 - 3",
"d3-time-format": "2 - 4"
},
"engines": {
"node": ">=12"
}
},
"node_modules/d3-shape": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
"integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
"dependencies": {
"d3-path": "^3.1.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/d3-time": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
"integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
"dependencies": {
"d3-array": "2 - 3"
},
"engines": {
"node": ">=12"
}
},
"node_modules/d3-time-format": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
"integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
"dependencies": {
"d3-time": "1 - 3"
},
"engines": {
"node": ">=12"
}
},
"node_modules/d3-timer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
"integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
"engines": {
"node": ">=12"
}
},
"node_modules/damerau-levenshtein": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
@ -6565,6 +6714,11 @@
"resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
"integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
},
"node_modules/decimal.js-light": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
"integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="
},
"node_modules/dedent": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
@ -6851,6 +7005,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
"integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
"deprecated": "Use your platform's native DOMException instead",
"dependencies": {
"webidl-conversions": "^5.0.0"
},
@ -7958,6 +8113,14 @@
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"node_modules/fast-equals": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz",
"integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/fast-glob": {
"version": "3.2.12",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
@ -9096,6 +9259,14 @@
"node": ">= 0.4"
}
},
"node_modules/internmap": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
"integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
"engines": {
"node": ">=12"
}
},
"node_modules/invariant": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
@ -13987,11 +14158,6 @@
"node": ">= 0.10"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"node_modules/psl": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@ -14484,6 +14650,43 @@
}
}
},
"node_modules/react-smooth": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.5.tgz",
"integrity": "sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==",
"dependencies": {
"fast-equals": "^5.0.0",
"react-transition-group": "2.9.0"
},
"peerDependencies": {
"prop-types": "^15.6.0",
"react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/react-smooth/node_modules/dom-helpers": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz",
"integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==",
"dependencies": {
"@babel/runtime": "^7.1.2"
}
},
"node_modules/react-smooth/node_modules/react-transition-group": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz",
"integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==",
"dependencies": {
"dom-helpers": "^3.4.0",
"loose-envify": "^1.4.0",
"prop-types": "^15.6.2",
"react-lifecycles-compat": "^3.0.4"
},
"peerDependencies": {
"react": ">=15.0.0",
"react-dom": ">=15.0.0"
}
},
"node_modules/react-transition-group": {
"version": "4.4.5",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
@ -14531,6 +14734,42 @@
"node": ">=8.10.0"
}
},
"node_modules/recharts": {
"version": "2.10.3",
"resolved": "https://registry.npmjs.org/recharts/-/recharts-2.10.3.tgz",
"integrity": "sha512-G4J96fKTZdfFQd6aQnZjo2nVNdXhp+uuLb00+cBTGLo85pChvm1+E67K3wBOHDE/77spcYb2Cy9gYWVqiZvQCg==",
"dependencies": {
"clsx": "^2.0.0",
"eventemitter3": "^4.0.1",
"lodash": "^4.17.19",
"react-is": "^16.10.2",
"react-smooth": "^2.0.5",
"recharts-scale": "^0.4.4",
"tiny-invariant": "^1.3.1",
"victory-vendor": "^36.6.8"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
"prop-types": "^15.6.0",
"react": "^16.0.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/recharts-scale": {
"version": "0.4.5",
"resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz",
"integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==",
"dependencies": {
"decimal.js-light": "^2.4.1"
}
},
"node_modules/recharts/node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"node_modules/recursive-readdir": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
@ -16028,6 +16267,11 @@
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
"integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
},
"node_modules/tiny-invariant": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
"integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
},
"node_modules/tmpl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
@ -16423,6 +16667,27 @@
"node": ">= 0.8"
}
},
"node_modules/victory-vendor": {
"version": "36.7.0",
"resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.7.0.tgz",
"integrity": "sha512-nqYuTkLSdTTeACyXcCLbL7rl0y6jpzLPtTNGOtSnajdR+xxMxBdjMxDjfNJNlhR+ZU8vbXz+QejntcbY7h9/ZA==",
"dependencies": {
"@types/d3-array": "^3.0.3",
"@types/d3-ease": "^3.0.0",
"@types/d3-interpolate": "^3.0.1",
"@types/d3-scale": "^4.0.2",
"@types/d3-shape": "^3.1.0",
"@types/d3-time": "^3.0.0",
"@types/d3-timer": "^3.0.0",
"d3-array": "^3.1.6",
"d3-ease": "^3.0.1",
"d3-interpolate": "^3.0.1",
"d3-scale": "^4.0.2",
"d3-shape": "^3.1.0",
"d3-time": "^3.0.0",
"d3-timer": "^3.0.1"
}
},
"node_modules/w3c-hr-time": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
@ -20092,6 +20357,60 @@
"@types/node": "*"
}
},
"@types/d3-array": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz",
"integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="
},
"@types/d3-color": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
"integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="
},
"@types/d3-ease": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
"integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="
},
"@types/d3-interpolate": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
"integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
"requires": {
"@types/d3-color": "*"
}
},
"@types/d3-path": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.2.tgz",
"integrity": "sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA=="
},
"@types/d3-scale": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz",
"integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==",
"requires": {
"@types/d3-time": "*"
}
},
"@types/d3-shape": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz",
"integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==",
"requires": {
"@types/d3-path": "*"
}
},
"@types/d3-time": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz",
"integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw=="
},
"@types/d3-timer": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
"integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="
},
"@types/eslint": {
"version": "8.21.1",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz",
@ -20950,28 +21269,6 @@
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz",
"integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg=="
},
"axios": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz",
"integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==",
"requires": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
},
"dependencies": {
"form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
}
}
}
},
"axobject-query": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz",
@ -21490,6 +21787,11 @@
"wrap-ansi": "^7.0.0"
}
},
"clsx": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz",
"integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg=="
},
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@ -22020,6 +22322,83 @@
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
"integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
},
"d3-array": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
"integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
"requires": {
"internmap": "1 - 2"
}
},
"d3-color": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
"integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="
},
"d3-ease": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
"integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="
},
"d3-format": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
"integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="
},
"d3-interpolate": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
"integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
"requires": {
"d3-color": "1 - 3"
}
},
"d3-path": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
"integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="
},
"d3-scale": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
"integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
"requires": {
"d3-array": "2.10.0 - 3",
"d3-format": "1 - 3",
"d3-interpolate": "1.2.0 - 3",
"d3-time": "2.1.1 - 3",
"d3-time-format": "2 - 4"
}
},
"d3-shape": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
"integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
"requires": {
"d3-path": "^3.1.0"
}
},
"d3-time": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
"integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
"requires": {
"d3-array": "2 - 3"
}
},
"d3-time-format": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
"integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
"requires": {
"d3-time": "1 - 3"
}
},
"d3-timer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
"integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="
},
"damerau-levenshtein": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
@ -22053,6 +22432,11 @@
"resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
"integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
},
"decimal.js-light": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
"integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="
},
"dedent": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
@ -23096,6 +23480,11 @@
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"fast-equals": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz",
"integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ=="
},
"fast-glob": {
"version": "3.2.12",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
@ -23919,6 +24308,11 @@
"side-channel": "^1.0.4"
}
},
"internmap": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
"integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="
},
"invariant": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
@ -27413,11 +27807,6 @@
}
}
},
"proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"psl": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@ -27773,6 +28162,36 @@
"workbox-webpack-plugin": "^6.4.1"
}
},
"react-smooth": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.5.tgz",
"integrity": "sha512-BMP2Ad42tD60h0JW6BFaib+RJuV5dsXJK9Baxiv/HlNFjvRLqA9xrNKxVWnUIZPQfzUwGXIlU/dSYLU+54YGQA==",
"requires": {
"fast-equals": "^5.0.0",
"react-transition-group": "2.9.0"
},
"dependencies": {
"dom-helpers": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz",
"integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==",
"requires": {
"@babel/runtime": "^7.1.2"
}
},
"react-transition-group": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz",
"integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==",
"requires": {
"dom-helpers": "^3.4.0",
"loose-envify": "^1.4.0",
"prop-types": "^15.6.2",
"react-lifecycles-compat": "^3.0.4"
}
}
}
},
"react-transition-group": {
"version": "4.4.5",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
@ -27810,6 +28229,36 @@
"picomatch": "^2.2.1"
}
},
"recharts": {
"version": "2.10.3",
"resolved": "https://registry.npmjs.org/recharts/-/recharts-2.10.3.tgz",
"integrity": "sha512-G4J96fKTZdfFQd6aQnZjo2nVNdXhp+uuLb00+cBTGLo85pChvm1+E67K3wBOHDE/77spcYb2Cy9gYWVqiZvQCg==",
"requires": {
"clsx": "^2.0.0",
"eventemitter3": "^4.0.1",
"lodash": "^4.17.19",
"react-is": "^16.10.2",
"react-smooth": "^2.0.5",
"recharts-scale": "^0.4.4",
"tiny-invariant": "^1.3.1",
"victory-vendor": "^36.6.8"
},
"dependencies": {
"react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
}
}
},
"recharts-scale": {
"version": "0.4.5",
"resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz",
"integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==",
"requires": {
"decimal.js-light": "^2.4.1"
}
},
"recursive-readdir": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
@ -28905,6 +29354,11 @@
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
"integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
},
"tiny-invariant": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
"integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
},
"tmpl": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
@ -29196,6 +29650,27 @@
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
},
"victory-vendor": {
"version": "36.7.0",
"resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.7.0.tgz",
"integrity": "sha512-nqYuTkLSdTTeACyXcCLbL7rl0y6jpzLPtTNGOtSnajdR+xxMxBdjMxDjfNJNlhR+ZU8vbXz+QejntcbY7h9/ZA==",
"requires": {
"@types/d3-array": "^3.0.3",
"@types/d3-ease": "^3.0.0",
"@types/d3-interpolate": "^3.0.1",
"@types/d3-scale": "^4.0.2",
"@types/d3-shape": "^3.1.0",
"@types/d3-time": "^3.0.0",
"@types/d3-timer": "^3.0.0",
"d3-array": "^3.1.6",
"d3-ease": "^3.0.1",
"d3-interpolate": "^3.0.1",
"d3-scale": "^4.0.2",
"d3-shape": "^3.1.0",
"d3-time": "^3.0.0",
"d3-timer": "^3.0.1"
}
},
"w3c-hr-time": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",

View File

@ -13,6 +13,7 @@
"react-loader-spinner": "^5.4.5",
"react-router-dom": "^6.4.0",
"react-scripts": "5.0.1",
"recharts": "^2.10.3",
"styled-components": "^6.0.9",
"web-vitals": "^2.1.4"
},

View File

@ -75,7 +75,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
<li><NavLink to={URL.INTRO} className={({ isActive }) => (isActive ? "cur" : "")}>정보마당</NavLink></li>
<li><NavLink to={URL.SUPPORT} className={({ isActive }) => (isActive ? "cur" : "")}>고객지원</NavLink></li>
<li><NavLink to={URL.INFORM} className={({ isActive }) => (isActive ? "cur" : "")}>알림마당</NavLink></li>
{sessionUserSe ==='ADM' &&
{sessionUserSe ==='ACC_TP01' &&
<li><NavLink to={URL.ADMIN} className={({ isActive }) => (isActive ? "cur" : "")}>사이트관리</NavLink></li>
}
</ul>
@ -86,7 +86,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
{/* 로그아웃 : 로그인 정보 있을때 */}
{sessionUserId &&
<>
<span className="person">{sessionUserId} </span> 님이, {sessionUserSe==='ADM'?'관리자':'사용자'} 로그인하셨습니다.
<span className="person">{sessionUserId} </span> 님이, {sessionUserSe==='ACC_TP01'?'관리자':'사용자'} 로그인하셨습니다.
<button onClick={logOutHandler} className="btn">로그아웃</button>
</>
}
@ -141,7 +141,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
<li><NavLink to={URL.INFORM_GALLERY} className={({ isActive }) => (isActive ? "cur" : "")}>사이트 갤러리</NavLink></li>
</ul>
</div>
{sessionUserSe ==='ADM' &&
{sessionUserSe ==='ACC_TP01' &&
<div className="col">
<h3>사이트관리</h3>
<ul>
@ -207,7 +207,7 @@ function EgovHeader({ loginUser, onChangeLogin }) {
<li><NavLink to={URL.INFORM_GALLERY} className={({ isActive }) => (isActive ? "cur" : "")}>사이트 갤러리</NavLink></li>
</ul>
</div>
{sessionUserSe ==='ADM' &&
{sessionUserSe ==='ACC_TP01' &&
<>
<h3><Link to={URL.ADMIN}>사이트관리</Link></h3>
<div className="submenu closed">

View File

@ -1,18 +1,55 @@
import React from 'react';
function EgovPaging(props) {
function EgovPaging({pagination, moveToPage}) {
console.groupCollapsed("EgovPaging");
console.log("EgovPaging [props] : ", props);
console.log("EgovPaging [pagination] : ", pagination);
let paginationTag = [];
if (props.pagination === undefined) {
if (pagination === undefined) {
paginationTag = "-";
} else {
const currentPageNo = props.pagination.currentPageNo;
const pageSize = props.pagination.pageSize;
const totalRecordCount = props.pagination.totalRecordCount;
const recordCountPerPage = props.pagination.recordCountPerPage;
if(pagination.startNum>1){
//
paginationTag.push(<li key="fp" className="btn">
<button onClick={e => {moveToPage(1)}} className="first">처음</button>
</li>);
//
const prevPageIndex = pagination.pageIndex-10 < 0?1:(pagination.pageIndex-10)
paginationTag.push(<li key="pp" className="btn">
<button onClick={e => {moveToPage(prevPageIndex)}} className="prev">이전</button>
</li>);
}
for (let i = pagination.startNum; i <= pagination.endNum; i++) {
if (i === pagination.pageIndex) {
//
paginationTag.push(<li key={i}>
<button className="cur">{i}</button>
</li>);
} else {
//
paginationTag.push(<li key={i}>
<button onClick={e => {moveToPage(i)}}>{i}</button>
</li>);
}
}
if(pagination.endNum!=pagination.maxNum){
//
const nextPageIndex = pagination.pageIndex+10 < pagination.maxNum?pagination.maxNum:(pagination.pageIndex-10)
paginationTag.push(<li key="np" className="btn">
<button onClick={e => {moveToPage(nextPageIndex)}} className="next">다음</button>
</li>);
//
paginationTag.push(<li key="lp" className="btn">
<button onClick={e => {moveToPage(pagination.maxNum)}} className="last"></button>
</li>);
}
/*const currentPageNo = pagination.currentPageNo;
const pageSize = pagination.pageSize;
const totalRecordCount = pagination.contentCnt;
const recordCountPerPage = pagination.rowCnt;
const totalPageCount = Math.ceil(totalRecordCount / recordCountPerPage);
const currentFirstPage = Math.floor((currentPageNo - 1) / pageSize) * pageSize + 1;
@ -22,13 +59,13 @@ function EgovPaging(props) {
if (totalPageCount > pageSize) {
//
const firstPageTag = <li key="fp" className="btn">
<button onClick={e => {props.moveToPage(1)}} className="first">처음</button></li>;
<button onClick={e => {moveToPage(1)}} className="first">처음</button></li>;
paginationTag.push(firstPageTag);
//
const prevPageIndex = (currentPageNo - 1 > 0) ? currentPageNo - 1 : 1;
const previousPageTag = <li key="pp" className="btn">
<button onClick={e => {props.moveToPage(prevPageIndex)}} className="prev">이전</button></li>;
<button onClick={e => {moveToPage(prevPageIndex)}} className="prev">이전</button></li>;
paginationTag.push(previousPageTag);
}
@ -42,25 +79,26 @@ function EgovPaging(props) {
} else {
//
const otherPage = <li key={i}>
<button onClick={e => {props.moveToPage(i)}}>{i}</button>
<button onClick={e => {moveToPage(i)}}>{i}</button>
</li>;
console.log("@@@ otherpage : " + otherPage);
paginationTag.push(otherPage);
}
}
if (totalPageCount > pageSize) {
//
const nextPageIndex = (currentLastPage + 1 < totalPageCount) ? currentLastPage + 1 : totalPageCount;
const nextPageTag = <li key="np" className="btn">
<button onClick={e => {props.moveToPage(nextPageIndex)}} className="next">다음</button>
<button onClick={e => {moveToPage(nextPageIndex)}} className="next">다음</button>
</li>;
paginationTag.push(nextPageTag);
//
const lastPageTag = <li key="lp" className="btn">
<button onClick={e => {props.moveToPage(totalPageCount)}} className="last"></button></li>;
<button onClick={e => {moveToPage(totalPageCount)}} className="last"></button></li>;
paginationTag.push(lastPageTag);
}
}*/
}
console.log("paginationTag", paginationTag);
console.groupEnd("EgovPaging");

View File

@ -25,10 +25,10 @@ function EgovLeftNavAdmin({activeKey}) {
</Accordion.Item>
<Accordion.Item eventKey={"1"}>
<Accordion.Header>사용자현황</Accordion.Header>
<Accordion.Header>사용자 관리</Accordion.Header>
<Accordion.Body>
<ul className="menu4">
<li><NavLink to={URL.ADMIN__USERS__LIST} className={({ isActive }) => (isActive ? "cur" : "")}>사용자 현황</NavLink></li>
<li><NavLink to={URL.ADMIN__USERS__LIST} className={({ isActive }) => (isActive ? "cur" : "")}>사용자 목록</NavLink></li>
</ul>
</Accordion.Body>
</Accordion.Item>

View File

@ -1,6 +1,6 @@
const CODE = {
RCV_SUCCESS : "200", // 성공
TOKEN_EXPIRED : "303", // 만료된 토큰
RCV_ERROR_AUTH : "403", // 인증 오류
RCV_ERROR_DELETE : "700", // 삭제 오류
RCV_ERROR_SAVE : "800", // 저장 오류

View File

@ -76,12 +76,12 @@ const URL = {
ADMIN_MANAGER : "/admin/manager/", // 사이트관리/사이트관리자 암호변경 기능 추가 2023.04.15(토) 김일국
ADMIN_BASE_CODE : "/admin/config/baseCodeMgt", // 사이트관리/환경설정/기본코드관리
ADMIN_STANDARD_CODE : "/admin/config/standardCodeMgt", // 사이트관리/환경설정/건설기준코드관리
ADMIN_COMMITTEE_CODE : "/admin/config/committeeCodeMgt", // 사이트관리/환경설정/위원회코드관리
ADMIN_MENU : "/admin/config/menuMgt", // 사이트관리/환경설정/메뉴 관리
ADMIN_MENU_AUTH : "/admin/config/menuAuthMgt", // 사이트관리/환경설정/메뉴권한 관리
ADMIN_ABOUT_SITE : "/admin/config/aboutSiteMgt", // 사이트관리/환경설정/관련사이트 관리
ADMIN_BASE_CODE : "/admin/config/base-code-mgt", // 사이트관리/환경설정/기본코드관리
ADMIN_STANDARD_CODE : "/admin/config/standard-code-mgt", // 사이트관리/환경설정/건설기준코드관리
ADMIN_COMMITTEE_CODE : "/admin/config/committee-code-mgt", // 사이트관리/환경설정/위원회코드관리
ADMIN_MENU : "/admin/config/menu-mgt", // 사이트관리/환경설정/메뉴 관리
ADMIN_MENU_AUTH : "/admin/config/menu-auth-mgt", // 사이트관리/환경설정/메뉴권한 관리
ADMIN_ABOUT_SITE : "/admin/config/about-site-mgt", // 사이트관리/환경설정/관련사이트 관리
// 관리자 - 사용자 현황
ADMIN__USERS__LIST : "/admin/users/list", // 사용자 현황

View File

@ -32,9 +32,11 @@
/* Board */
.board_list {border-top: 2px solid #222;}
.board_list .head {display: table; table-layout: fixed; width: 100%;}
.board_list .head > span {display: table-cell; padding: 25px 0 27px 0; border-bottom: 1px solid #888; font-size: 16px; font-weight: 500px; text-align: center;}
/* changed by lim padding: 25px 0 27px 0; */
.board_list .head > span {display: table-cell; padding: 10px 0 10px 0; border-bottom: 1px solid #888; font-size: 16px; font-weight: 500px; text-align: center;}
.board_list .result .list_item {display: table; width: 100%; table-layout: fixed;}
.board_list .result .list_item > div {display: table-cell; padding: 18px 0 20px 0; border-bottom: 1px solid #dde2e5; color: #666; font-size: 16px; text-align: center; vertical-align: middle;}
/* changed by lim padding: 18px 0 20px 0; */
.board_list .result .list_item > div {display: table-cell; padding: 7px 0 7px 0; border-bottom: 1px solid #dde2e5; color: #666; font-size: 16px; text-align: center; vertical-align: middle;}
.board_list .result .list_item > div.al {padding: 18px 30px 20px 30px; text-align: left;}
.board_list .result .list_item > div.reply {position: relative; padding: 18px 30px 20px 52px;}
.board_list .result .list_item > div.reply::before {content: ""; display: block; position: absolute; left: 27px; top: 24px; width: 22px; height: 14px; background: url(css/images/ico_reply.png) no-repeat;}
@ -43,12 +45,12 @@
.board_bot {margin-top: 40px;}
.paging {text-align: center;}
.paging .btn {margin-top: 0;}
.paging .btn {margin-top: 0; padding: 5px;} /* added by lim padding: 5px; */
.paging .btn + .btn {margin-left: 5px;}
.paging .btn button {display: inline-block; width: 42px; height: 42px; border: 1px solid #dde2e5; border-radius: 5px; font-size: 0;}
.paging .btn button {display: inline-block; width: 32px; height: 32px; border: 1px solid #dde2e5; border-radius: 5px; font-size: 0;} /* changed by lim width: 42px; height: 42px; */
.paging .first {background: url(css/images/ico_prev.png) no-repeat center; vertical-align: top; }
.paging .prev {margin-right: 26px; background: url(css/images/ico_arrow_r_gray_9x15.png) no-repeat center; vertical-align: top; transform: rotate(180deg);}
.paging .next {margin-left: 26px; background: url(css/images/ico_arrow_r_gray_9x15.png) no-repeat center; vertical-align: top;}
.paging .prev {margin-right: 6px; background: url(css/images/ico_arrow_r_gray_9x15.png) no-repeat center; vertical-align: top; transform: rotate(180deg);} /* changed by lim margin-right: 26px; */
.paging .next {margin-left: 6px; background: url(css/images/ico_arrow_r_gray_9x15.png) no-repeat center; vertical-align: top;} /* changed by lim margin-left: 26px; */
.paging .last {background: url(css/images/ico_prev.png) no-repeat center; vertical-align: top; transform: rotate(180deg);}
.paging ul {display: inline-block; vertical-align: top;}
.paging ul li {display: inline-block; margin-top: 4px; vertical-align: top;}
@ -245,7 +247,7 @@ select::-ms-expand {display:none;}
/* Title */
.tit_1 {position: relative; padding-bottom: 50px; color: #222; font-size: 48px; font-weight: 500; letter-spacing: -2px; line-height: 48px;}
.tit_1 {position: relative; padding-bottom: 20px; color: #222; font-size: 38px; font-weight: 500; letter-spacing: -2px; line-height: 48px;} /* changed by lim padding-bottom: 50px; font-size: 48px;*/
.tit_1::after {content: ""; display: block; position: absolute; left: 0; bottom: 0; width: 30px; height: 2px; background: #0465be;}
.tit_2 {font-size: 30px; font-weight: 700;}

View File

@ -47,24 +47,24 @@ body {min-width: 1400px;}
.container {min-height: calc(100vh - 300px);}
.c_wrap {width: 1400px; margin: 0 auto; padding: 0 50px;}
.c_wrap .layout {display: table; width: 100%; table-layout: fixed;}
.c_wrap .layout {display: table; width: 100%; table-layout: fixed; padding-bottom: 20px;} /* added by lim padding-bottom: 20px; */
/* sub navigation */
.c_wrap .layout .nav {display: table-cell; width: 260px; vertical-align: top;}
.c_wrap .layout .nav .inner {border: 1px solid #dde2e5; border-radius: 10px;}
.nav_title{padding: 35px 30px 26px 30px;} /* border-bottom: 4px solid #dde2e5; changed by lim*/
.nav_title{padding: 35px 30px 26px 30px;} /* changed by lim border-bottom: 4px solid #dde2e5; */
.c_wrap .layout .nav h2 {color: #222; font-size: 24px;}
.c_wrap .layout .nav ul {}/*padding: 26px 30px 27px 30px;*/
.c_wrap .layout .nav ul li + li {margin-top: 18px;} /* margin-top: 27px; changed by lim*/
.c_wrap .layout .nav ul li a {display: block; position: relative; color: #666; font-size: 14px;} /* font-size: 18px; changed by lim*/
.c_wrap .layout .nav ul li + li {margin-top: 18px;} /* changed by lim margin-top: 27px; */
.c_wrap .layout .nav ul li a {display: block; position: relative; color: #666; font-size: 14px;} /* changed by lim font-size: 18px; */
.c_wrap .layout .nav ul li a:hover::after {content: ""; display: block; position: absolute; right: 0px; top: 50%; transform: translateY(-50%); width: 9px; height: 15px; background: url(css/images/ico_arrow_r_gray_9x15.png) no-repeat;}
.c_wrap .layout .nav ul li a.cur {color: #222; font-weight: 700;}
.c_wrap .layout .contents {display: table-cell; width: auto; padding: 0 0 120px 70px; vertical-align: top;}
.c_wrap .layout .contents {display: table-cell; width: auto; padding: 0 0 50px 30px; vertical-align: top;} /* changed by lim padding: 0 0 120px 70px; */
/* location */
.location {height: 70px; padding-top: 43px; text-align: right;}
.location {height: 30px; padding-top: 23px; text-align: right;} /* chagned by lim height: 70px; padding-top: 43px; */
.location ul, .location ul li {display: inline-block; vertical-align: top;}
.location ul li {position: relative; color: #666; font-size: 14px;}
.location ul li + li::before {content: ""; display: inline-block; width: 4px; height: 7px; margin: 0 9px 0 3px; line-height: 18px; background: url(css/images/ico_arrow_r_gray_4x7.png) no-repeat; vertical-align: 2px;}

View File

@ -7,11 +7,22 @@ import URL from 'constants/url';
import CODE from 'constants/code';
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
import EgovAttachFile from 'components/EgovAttachFile';
import EgovRadioButtonGroup from 'components/EgovRadioButtonGroup';
import 'react-datepicker/dist/react-datepicker.css';
import styled from "styled-components";
const StyledDiv = styled.div`
.org-under-id {
margin-left: 20px;
@media only screen and (max-width: 768px) {
display: block;
margin-left: 0px;
margin-top: 20px;
}
}
`;
function SchedulesEdit(props) {
console.group("EgovAdminScheduleEdit");
console.log("[Start] EgovAdminScheduleEdit ------------------------------");
@ -21,11 +32,8 @@ function SchedulesEdit(props) {
const location = useLocation();
console.log("EgovAdminScheduleEdit [location] : ", location);
const reptitSeCodeRadioGroup = [{ value: "1", label: "당일" }, { value: "2", label: "반복" }, { value: "3", label: "연속" }];
const [modeInfo, setModeInfo] = useState({ mode: props.mode });
const [scheduleDetail, setScheduleDetail] = useState({ schdulDeptName: "관리자부서", schdulChargerName: "관리자", schdulKindCode: 2, reptitSeCode: "1", startDate: new Date(), endDate: new Date() });
const [boardAttachFiles, setBoardAttachFiles] = useState();
const [scheduleDetail, setScheduleDetail] = useState({ startDate: new Date(), endDate: new Date() });
const [schdulBgndeHH, setSchdulBgndeHH] = useState();
const [schdulBgndeMM, setSchdulBgndeMM] = useState();
@ -69,24 +77,31 @@ function SchedulesEdit(props) {
}
const retrieveDetail = () => {
if (modeInfo.mode === CODE.MODE_CREATE) {// /
setScheduleDetail({
...scheduleDetail,
schdulBgnde: location.state.iUseDate,
schdulEndde: location.state.iUseDate,
startDate: convertDate(location.state.iUseDate),
endDate: convertDate(location.state.iUseDate),
});
return;
}
const retrieveDetailURL = `/schedule/${location.state?.schdulId}`;
const requestOptions = {
method: "GET",
headers: {
'Content-type': 'application/json'
}
}
EgovNet.requestFetch("/schedule/init",
requestOptions,
function (resp) {
let rawScheduleDetail = resp;
console.log( 'kimtheho kimtheho kimtheho kimtheho kimtheho kimtheho kimtheho kimtheho' + rawScheduleDetail );
}
);
if (modeInfo.mode === CODE.MODE_CREATE) {// /
setScheduleDetail({
...scheduleDetail
});
return;
}
const retrieveDetailURL = `/schedule/${location.state?.schdulId}`;
EgovNet.requestFetch(retrieveDetailURL,
requestOptions,
function (resp) {
@ -98,10 +113,13 @@ function SchedulesEdit(props) {
startDate: convertDate(rawScheduleDetail.schdulBgnde),
endDate: convertDate(rawScheduleDetail.schdulEndde),
atchFileId : rawScheduleDetail.atchFileId.trim(),
schdulIpcrCode : "B",
});
setBoardAttachFiles(resp.result.resultFiles);
}
);
}
const updateSchedule = () => {
@ -207,31 +225,40 @@ function SchedulesEdit(props) {
{/* <!-- <h2 className="tit_2">위원회 일정 추가</h2> --> */}
{/* <!-- 게시판 상세보기 --> */}
<div className="board_view2">
<StyledDiv className="board_view2">
<dl>
<dt>일정구분<span className="req">필수</span></dt>
<dt>구분<span className="req">필수</span></dt>
<dd>
<label className="f_select w_130" htmlFor="schdulSe">
<select id="schdulSe" name="schdulSe" title="일정구분"
value={scheduleDetail.schdulSe}
onChange={(e) => setScheduleDetail({ ...scheduleDetail, schdulSe: e.target.value })}>
<option value="">선택</option>
<option value="1">회의</option>
<option value="2">세미나</option>
<option value="3">강의</option>
<option value="4">교육</option>
<option value="5">기타</option>
<option value="1">일반회의</option>
<option value="2">기준기획</option>
<option value="3">제개정검토</option>
<option value="4">기준심의</option>
</select>
</label>
</dd>
</dl>
<dl>
<dt>중요도<span className="req">필수</span></dt>
<dt>심의위원회<span className="req">필수</span></dt>
<dd>
<label className="f_select w_130" htmlFor="schdulIpcrCode">
<select id="schdulIpcrCode" name="schdulIpcrCode" title="중요도"
value={scheduleDetail.schdulIpcrCode}
onChange={(e) => setScheduleDetail({ ...scheduleDetail, schdulIpcrCode: e.target.value })}>
<label className="f_select w_150 org-group-id" htmlFor="orgGroupId">
<select id="orgGroupId" name="orgGroupId" title="중요도"
value={scheduleDetail.orgGroupId}
onChange={(e) => setScheduleDetail({ ...scheduleDetail, orgGroupId: e.target.value })}>
<option value="">선택</option>
<option value="A">높음</option>
<option value="B">보통</option>
<option value="C">낮음</option>
</select>
</label>
<label className="f_select w_150 org-under-id" htmlFor="orgUnderId">
<select id="orgUnderId" name="orgUnderId" title="중요도"
value={scheduleDetail.orgUnderId}
onChange={(e) => setScheduleDetail({ ...scheduleDetail, orgUnderId: e.target.value })}>
<option value="">선택</option>
<option value="A">높음</option>
<option value="B">보통</option>
@ -241,7 +268,7 @@ function SchedulesEdit(props) {
</dd>
</dl>
<dl>
<dt><label htmlFor="schdulDeptName">부서</label><span className="req">필수</span></dt>
<dt><label htmlFor="schdulDeptName">제목</label><span className="req">필수</span></dt>
<dd>
<input className="f_input2 w_full" type="text" name="schdulDeptName" title="부서" id="schdulDeptName"
value={scheduleDetail.schdulDeptName} readOnly
@ -249,32 +276,13 @@ function SchedulesEdit(props) {
</dd>
</dl>
<dl>
<dt><label htmlFor="schdulNm">일정명</label><span className="req">필수</span></dt>
<dt><label htmlFor="schdulNm">장소</label><span className="req">필수</span></dt>
<dd>
<input className="f_input2 w_full" type="text" name="schdulNm" title="부서" id="schdulNm" placeholder="일정 테스트"
defaultValue={scheduleDetail.schdulNm}
onChange={(e) => setScheduleDetail({ ...scheduleDetail, schdulNm: e.target.value })} />
</dd>
</dl>
<dl>
<dt><label htmlFor="schdulCn">일정내용</label><span className="req">필수</span></dt>
<dd>
<textarea className="f_txtar w_full h_100" name="schdulCn" id="schdulCn" cols="30" rows="10" placeholder="일정내용"
defaultValue={scheduleDetail.schdulCn}
onChange={(e) => setScheduleDetail({ ...scheduleDetail, schdulCn: e.target.value })}
></textarea>
</dd>
</dl>
<dl>
<dt>반복구분<span className="req">필수</span></dt>
<dd>
<EgovRadioButtonGroup
name="reptitSeCode"
radioGroup={reptitSeCodeRadioGroup}
setValue={scheduleDetail.reptitSeCode.trim()}
setter={(v) => setScheduleDetail({ ...scheduleDetail, reptitSeCode: v })} />
</dd>
</dl>
<dl>
<dt>날짜/시간<span className="req">필수</span></dt>
<dd className="datetime">
@ -316,27 +324,14 @@ function SchedulesEdit(props) {
</dd>
</dl>
<dl>
<dt><label htmlFor="schdulChargerName">담당자</label><span className="req">필수</span></dt>
<dt><label htmlFor="schdulCn">내용</label><span className="req">필수</span></dt>
<dd>
<input className="f_input2 w_full" type="text" name="schdulChargerName" id="schdulChargerName" defaultValue="관리자" readOnly
/>
<textarea className="f_txtar w_full h_100" name="schdulCn" id="schdulCn" cols="30" rows="10" placeholder="일정내용"
defaultValue={scheduleDetail.schdulCn}
onChange={(e) => setScheduleDetail({ ...scheduleDetail, schdulCn: e.target.value })}
></textarea>
</dd>
</dl>
<EgovAttachFile
fnChangeFile={(attachfile) => {
console.log("====>>> Changed attachfile file = ", attachfile);
const arrayConcat = { ...scheduleDetail}; // ( for)
for ( let i = 0; i < attachfile.length; i++) {
arrayConcat[`file_${i}`] = attachfile[i];
}
setScheduleDetail(arrayConcat);
}}
fnDeleteFile={(deletedFile) => {
console.log("====>>> Delete deletedFile = ", deletedFile);
setBoardAttachFiles(deletedFile);
}}
boardFiles={boardAttachFiles}
mode={props.mode} />
{/* <!-- 버튼영역 --> */}
<div className="board_btn_area">
@ -352,7 +347,7 @@ function SchedulesEdit(props) {
</div>
</div>
{/* <!--// 버튼영역 --> */}
</div>
</StyledDiv>
{/* <!-- 게시판 상세보기 --> */}
{/* <!--// 본문 --> */}

View File

@ -1,5 +1,4 @@
import React from 'react';
import CODE from "../../../constants/code";
import React, {useRef} from 'react';
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
import {Link} from "react-router-dom";
import URL from "../../../constants/url";
@ -11,14 +10,22 @@ import ChildCodeDiv from "./baseCode/ChildCodeDiv";
function BaseCodeMgt(props) {
// ParentCodeDiv ChildCodeDiv
// https://velog.io/@hssarah/React%EC%97%90%EC%84%9C-%EB%8B%A4%EB%A5%B8-Function-Component%EC%97%90-%EC%9E%88%EB%8A%94-%ED%95%A8%EC%88%98-%ED%98%B8%EC%B6%9C-React-Calling-Function-From-Another-Function-Component
const childRef = useRef(null);
function getCodeItem(grpCd){
childRef.current.getCodeItemList(grpCd);
}
return (
<div className="container">
<div className="c_wrap">
<div className="location">
<ul>
<li><Link to={URL.MAIN} className="home">Home</Link></li>
<li><Link to={URL.ADMIN}>사이트관리</Link></li>
<li>기본 코드 관리</li>
<li>사이트관리</li>
<li>환경설정</li>
<li><Link to={URL.ADMIN_BASE_CODE}>기본 코드 관리</Link></li>
</ul>
</div>
<div className="layout">
@ -33,10 +40,10 @@ function BaseCodeMgt(props) {
<Row>
<Col xs={"6"}>
<ParentCodeDiv/>
<ParentCodeDiv getCodeItem={getCodeItem}/>
</Col>
<Col xs={"6"}>
<ChildCodeDiv/>
<ChildCodeDiv ref={childRef}/>
</Col>
</Row>
</div>

View File

@ -1,30 +1,159 @@
import React, {useState, useImperativeHandle, forwardRef} from "react";
import * as EgovNet from "api/egovFetch";
import {Container} from "react-bootstrap";
import Row from "react-bootstrap/Row";
import Col from "react-bootstrap/Col";
import Form from 'react-bootstrap/Form'
import Button from "react-bootstrap/Button";
import CODE from "../../../../constants/code";
function ChildCodeDiv({}, ref){
const [codeItemRow, setCodeItemRow] = useState();
const [grpCd, setGrpCd] = useState();
useImperativeHandle(ref, ()=>({
getCodeItemList
}))
async function getCodeItemList(parentCd){
setCodeItemRow([]);
setGrpCd(parentCd)
EgovNet.requestFetch(
'/admin/config/code-item?grpCd='+parentCd,
{
method: "GET"
},
(resp) => {
const codeItemList = resp.result.codeItemList;
const itemTag = [];
codeItemList.forEach(function (item, index){
itemTag.push(
<Row className={"py-2 border-bottom"}>
<Col xs={3}><Form.Control type={"text"} size={"sm"} className={"itemCd"} defaultValue={item.itemCd}/></Col>
<Col xs={4}><Form.Control type={"text"} size={"sm"} className={"itemNm"} defaultValue={item.itemNm}/></Col>
<Col xs={2}><Form.Control type={"text"} size={"sm"} className={"grpOrder"} defaultValue={item.grpOrder}/></Col>
<Col xs={1}><Button variant={"danger"} size={"sm"} onClick={(e)=>{modifyCodeItem(e, "delete")}}>삭제</Button></Col>
<Col xs={1}><Button variant={"primary"} size={"sm"} onClick={(e)=>{modifyCodeItem(e, "modify")}}>수정</Button></Col>
</Row>
)
})
setCodeItemRow(itemTag);
},
function (resp) {
console.log("err response : ", resp);
}
);
}
function addCodeItem(){
const itemCd = document.querySelector("#itemCd");
const itemNm = document.querySelector("#itemNm");
const grpOrder = document.querySelector("#grpOrder");
if(!itemCd.value || !itemNm.value){
alert("코드와 코드명을 입력해주세요.")
}else{
EgovNet.requestFetch(
'/admin/config/code-item',
{
method: "POST",
headers: {
'Content-type': 'application/json'
},
body: JSON.stringify({
itemCd: itemCd.value,
grpCd: document.querySelector("#codeItemDiv").querySelector("#grpCd").value,
itemNm: itemNm.value,
grpOrder: grpOrder.value
})
},
(resp) => {
switch (resp.resultCode) {
case Number(CODE.RCV_SUCCESS):
itemCd.value = "";
itemNm.value = "";
grpOrder.value = "";
getCodeItemList(grpCd);
break;
case Number(CODE.RCV_ERROR_SAVE)||Number(CODE.RCV_ERROR_AUTH):
alert(resp.resultMessage);
break;
}
},
function (resp) {
console.log("err response : ", resp);
}
);
}
}
function modifyCodeItem(e, action){
const row = e.target.parentElement.parentElement;
const selectedGrpCd = document.querySelector("#codeItemDiv").querySelector("#grpCd").value;
const codeItem = {
grpCd: selectedGrpCd,
itemCd: row.querySelector(".itemCd").value,
itemNm: row.querySelector(".itemNm").value,
grpOrder: row.querySelector(".grpOrder").value,
useYn: action==="modify"?'Y':'N'
}
EgovNet.requestFetch(
'/admin/config/code-item',
{
method: "PUT",
headers: {
'Content-type': 'application/json'
},
body: JSON.stringify(codeItem)
},
(resp) => {
switch (resp.resultCode) {
case Number(CODE.RCV_SUCCESS):
getCodeItemList(selectedGrpCd);
break;
case Number(CODE.RCV_ERROR_SAVE)||Number(CODE.RCV_ERROR_AUTH):
alert(resp.resultMessage);
break;
}
},
function (resp) {
console.log("err response : ", resp);
}
);
}
function ChildCodeDiv(){
return (
<Container className={"pt-3"}>
<Container className={"pt-3"} id={"codeItemDiv"}>
<input type={"hidden"} id={"grpCd"} value={grpCd}/>
<Row className={"py-2 bg-light border-bottom"}>
<Col xs={4}>코드</Col>
<Col xs={3}>코드</Col>
<Col xs={4}>코드명</Col>
<Col xs={2}>삭제</Col>
<Col xs={2}>수정</Col>
<Col xs={2}>순번</Col>
<Col xs={3}>삭제&nbsp;&nbsp;&nbsp;&nbsp;수정</Col>
</Row>
{}
{codeItemRow}
{grpCd!=null?(
<Row className={"py-1"}>
<Col xs={4}>
<Form.Control type={"text"} placeholder={"코드"} size={"sm"}/>
<Col xs={3}>
<Form.Control type={"text"} placeholder={"코드"} size={"sm"} id={"itemCd"}/>
</Col>
<Col xs={4}>
<Form.Control type={"text"} placeholder={"코드명"} size={"sm"}/>
<Form.Control type={"text"} placeholder={"코드명"} size={"sm"} id={"itemNm"}/>
</Col>
<Col xs={{span:2, offset:2}}><Button type={"button"} variant={"primary"} size={"sm"}>등록</Button></Col>
<Col xs={2}>
<Form.Control type={"text"} placeholder={"순번"} size={"sm"} id={"grpOrder"}/>
</Col>
<Col xs={2}><Button type={"button"} variant={"primary"} size={"sm"} onClick={addCodeItem}>등록</Button></Col>
</Row>
):(
<Row className={"py-1"}>
<Col>코드 그룹을 선택해주세요.</Col>
</Row>
)}
</Container>
);
}
export default ChildCodeDiv;
export default forwardRef(ChildCodeDiv);

View File

@ -1,27 +1,90 @@
import React, { useState, useEffect, useCallback } from 'react';
import * as EgovNet from "api/egovFetch";
import {Container} from "react-bootstrap";
import Row from "react-bootstrap/Row";
import Col from "react-bootstrap/Col";
import Form from 'react-bootstrap/Form'
import Button from "react-bootstrap/Button";
import * as EgovNet from "api/egovFetch";
import { FaRegHandPointRight } from "react-icons/fa";
import CODE from "../../../../constants/code";
function ParentCodeDiv(props){
function ParentCodeDiv({getCodeItem}){
const [codeGrpRow, setCodeGrpRow] = useState();
function getCodeGrp(){
const getCodeGrp = useCallback(()=>{
EgovNet.requestFetch(
'/admin/config/code-grp',
{
method: "GET",
method: "GET"
},
(resp) => {
const codeGrpList = resp.result.codeGrpList;
const grpTag = [];
codeGrpList.forEach(function (item, index){
grpTag.push(
<Row className={"py-2 border-bottom"}>
<Form.Control type={"hidden"} className={"grpCd"} defaultValue={item.grpCd}/>
<Col xs={3}>
<FaRegHandPointRight className={"selectIcon d-none"}/>&nbsp;
<a href={"#"} onClick={(e)=>{codeGrpChoose(e, item.grpCd)}} data-grpcd={item.grpCd}>{item.grpCd}</a>
</Col>
<Col xs={5}><Form.Control type={"text"} size={"sm"} className={"grpCdNm"} defaultValue={item.grpCdNm}/></Col>
<Col xs={2}><Button variant={"danger"} size={"sm"} onClick={(e)=>{modifyCodeGrp(e, "remove")}}>삭제</Button></Col>
<Col xs={2}><Button variant={"primary"} size={"sm"} onClick={(e)=>{modifyCodeGrp(e, "modify")}}>수정</Button></Col>
</Row>
)
})
setCodeGrpRow(grpTag);
},
function (resp) {
console.log("err response : ", resp);
}
);
});
useEffect(() => {
getCodeGrp();
}, []);
function codeGrpChoose(e, grpCd){
document.querySelectorAll(".selectIcon").forEach(function (item){
item.classList.value = 'selectIcon d-none'
})
e.target.parentElement.querySelector(".selectIcon").classList.value = "selectIcon"
getCodeItem(grpCd)
}
function addCodeGrp(){
const grpCd = document.querySelector("#grpCd");
const grpCdNm = document.querySelector("#grpCdNm");
if(!grpCd.value){
alert("코드 그룹을 입력해주세요.")
}else{
EgovNet.requestFetch(
'/admin/config/code-grp',
{
method: "POST",
headers: {
'Content-type': 'application/json'
},
body: JSON.stringify({})
body: JSON.stringify({
grpCd: grpCd.value,
grpCdNm: grpCdNm.value
})
},
(resp) => {
debugger
switch (resp.resultCode) {
case Number(CODE.RCV_SUCCESS):
grpCd.value = "";
grpCdNm.value = "";
getCodeGrp();
getCodeItem();
break;
case Number(CODE.RCV_ERROR_SAVE)||Number(CODE.RCV_ERROR_AUTH):
alert(resp.resultMessage);
break;
}
},
function (resp) {
console.log("err response : ", resp);
@ -29,27 +92,59 @@ function ParentCodeDiv(props){
);
}
useEffect(() => {
}
function modifyCodeGrp(e, action){
const row = e.target.parentElement.parentElement;
const codeGrp = {
grpCd: row.querySelector(".grpCd").value,
grpCdNm: row.querySelector(".grpCdNm").value,
useYn: action==="modify"?'Y':'N'
}
EgovNet.requestFetch(
'/admin/config/code-grp',
{
method: "PUT",
headers: {
'Content-type': 'application/json'
},
body: JSON.stringify(codeGrp)
},
(resp) => {
switch (resp.resultCode) {
case Number(CODE.RCV_SUCCESS):
getCodeGrp();
}, []);
getCodeItem();
break;
case Number(CODE.RCV_ERROR_SAVE)||Number(CODE.RCV_ERROR_AUTH):
alert(resp.resultMessage);
break;
}
},
function (resp) {
console.log("err response : ", resp);
}
);
}
return (
<Container className={"pt-3"}>
<Container className={"pt-3"} >
<Row className={"py-2 bg-light border-bottom"}>
<Col xs={4}>코드그룹</Col>
<Col xs={4}>코드그룹명</Col>
<Col xs={3}>코드그룹</Col>
<Col xs={5}>코드그룹명</Col>
<Col xs={2}>삭제</Col>
<Col xs={2}>수정</Col>
</Row>
{codeGrpRow}
<Row className={"py-1"}>
<Col xs={4}>
<Form.Control type={"text"} placeholder={"코드그룹"} size={"sm"}/>
<Col xs={3}>
<Form.Control type={"text"} id={"grpCd"} placeholder={"코드그룹"} size={"sm"}/>
</Col>
<Col xs={4}>
<Form.Control type={"text"} placeholder={"코드그룹명"} size={"sm"}/>
<Col xs={5}>
<Form.Control type={"text"} id={"grpCdNm"} placeholder={"코드그룹명"} size={"sm"}/>
</Col>
<Col xs={{span:2, offset:2}}><Button type={"button"} variant={"primary"} size={"sm"}>등록</Button></Col>
<Col xs={{span:2, offset:2}}><Button type={"button"} variant={"primary"} size={"sm"} onClick={addCodeGrp}>등록</Button></Col>
</Row>
</Container>
);

View File

@ -1,13 +1,147 @@
import React from 'react';
import React, { useState, useEffect, useCallback, useRef } from 'react';
import { Link, useLocation } from 'react-router-dom';
import * as EgovNet from 'api/egovFetch';
import URL from 'constants/url';
function UserConnections(props) {
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
import EgovPaging from 'components/EgovPaging';
import { itemIdxByPage } from 'utils/calc';
function PrivacyConnections(props) {
// console.group("EgovAdminPrivacyList");
// console.log("[Start] EgovAdminPrivacyList ------------------------------");
// console.log("EgovAdminPrivacyList [props] : ", props);
const location = useLocation();
// console.log("EgovAdminPrivacyList [location] : ", location);
// const cndRef = useRef();
// const wrdRef = useRef();
// eslint-disable-next-line no-unused-vars
const [searchCondition, setSearchCondition] = useState(location.state?.searchCondition || { pageIndex: 1, searchCnd: '0', searchWrd: '' });// ||
const [paginationInfo, setPaginationInfo] = useState({});
const [listTag, setListTag] = useState([]);
const retrieveList = useCallback((srchCnd) => {
// console.groupCollapsed("EgovAdminUsageList.retrieveList()");
const retrieveListURL = '/admin/logs/privacy';
const requestOptions = {
method: "POST",
headers: {
'Content-type': 'application/json',
},
body: JSON.stringify(srchCnd)
}
EgovNet.requestFetch(retrieveListURL,
requestOptions,
(resp) => {
setPaginationInfo(resp.result.paginationInfo);
let mutListTag = [];
listTag.push(<p className="no_data" key="0">데이터가 없습니다.</p>); //
const resultCnt = parseInt(resp.result.resultCnt);
const currentPageNo = resp.result.paginationInfo.currentPageNo;
const pageSize = resp.result.paginationInfo.pageSize;
const startIndex = (currentPageNo - 1) * pageSize;
const endIndex = Math.min(startIndex + pageSize, resultCnt);
//
for (let index = startIndex; index < endIndex; index++) {
const listIdx = itemIdxByPage(resultCnt, currentPageNo, 0, index); // pageSize listIdx 2 0
const item = resp.result.resultList[index];
mutListTag.push(
<div key={listIdx} className="list_item">
<div>{listIdx}</div>
<div>{item.userId}</div>
<div>{item.targetUserId}</div>
<div>{item.accessType === "PRV_LIST" ? "사용자현황 조회" : item.accessType === "PRV_VIEW" ? "User 상세조회" : "User 수정"}</div>
<div>{item.ipAddress}</div>
<div>{item.accessDt}</div>
</div>
);
}
setListTag(mutListTag);
},
function (resp) {
console.log("err response : ", resp);
}
);
// console.groupEnd("EgovAdminPrivacyList.retrieveList()");
},[listTag]);
useEffect(() => {
retrieveList(searchCondition);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
// console.log("------------------------------EgovAdminPrivacyList [End]");
// console.groupEnd("EgovAdminPrivacyList");
return (
<div className="container">
UserConnections
<div className="c_wrap">
{/* <!-- Location --> */}
<div className="location">
<ul>
<li><Link to={URL.MAIN} className="home">Home</Link></li>
<li><Link to={URL.ADMIN} >사이트관리</Link></li>
<li>로그현황</li>
</ul>
</div>
{/* <!--// Location --> */}
<div className="layout">
{/* <!-- Navigation --> */}
<EgovLeftNav></EgovLeftNav>
{/* <!--// Navigation --> */}
<div className="contents NOTICE_LIST" id="contents">
{/* <!-- 본문 --> */}
<div className="top_tit">
<h1 className="tit_1">개인정보 로그현황</h1>
</div>
{/* <!-- 게시판목록 --> */}
<div className="board_list BRD009">
<div className="head">
<span>번호</span>
<span>관리자 ID</span>
<span>수정 ID</span>
<span>타입</span>
<span>접속IP</span>
<span>변경일자</span>
</div>
<div className="result">
{listTag}
</div>
</div>
{/* <!--// 게시판목록 --> */}
<div className="board_bot">
{/* <!-- Paging --> */}
<EgovPaging pagination={paginationInfo} moveToPage={passedPage => {
retrieveList({ ...searchCondition, pageIndex: passedPage }) //, searchCnd: cndRef.current.value, searchWrd: wrdRef.current.value
}} />
{/* <!--/ Paging --> */}
</div>
{/* <!--// 본문 --> */}
</div>
</div>
</div>
</div>
);
}
export default UserConnections;
export default PrivacyConnections;

View File

@ -1,11 +1,12 @@
import React, { useState, useEffect, useCallback } from 'react';
import { Link, useLocation } from 'react-router-dom';
import React, {useState, useEffect, useCallback, PureComponent} from 'react';
import {Link, useLocation} from 'react-router-dom';
import {BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer} from 'recharts';
import * as EgovNet from 'api/egovFetch';
import URL from 'constants/url';
import CODE from 'constants/code';
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
import {default as EgovLeftNav} from 'components/leftmenu/EgovLeftNavAdmin';
function EgovAdminScheduleList(props) {
console.group("EgovAdminScheduleList");
@ -18,10 +19,11 @@ function EgovAdminScheduleList(props) {
const DATE = new Date();
const TODAY = new Date(DATE.getFullYear(), DATE.getMonth(), DATE.getDate());
const [searchCondition, setSearchCondition] = useState(location.state?.searchCondition || { schdulSe: '', year: TODAY.getFullYear(), month: TODAY.getMonth(), date: TODAY.getDate() });
const [searchCondition, setSearchCondition] = useState(location.state?.searchCondition || {schdulSe: '', year: TODAY.getFullYear(), month: TODAY.getMonth(), date: TODAY.getDate()});
const [calendarTag, setCalendarTag] = useState([]);
const [scheduleList, setScheduleList] = useState([]);
const [dailyUserLogList, setDailyUserLogList] = useState([]);
const innerConsole = (...args) => {
console.log(...args);
@ -45,13 +47,13 @@ function EgovAdminScheduleList(props) {
if (target === CODE.DATE_MONTH) {
changedDate = new Date(searchCondition.year, searchCondition.month + amount, searchCondition.date);
}
setSearchCondition({ ...searchCondition, year: changedDate.getFullYear(), month: changedDate.getMonth(), date: changedDate.getDate() });
setSearchCondition({...searchCondition, year: changedDate.getFullYear(), month: changedDate.getMonth(), date: changedDate.getDate()});
}
const retrieveList = useCallback((srchcnd) => {
console.groupCollapsed("EgovAdminScheduleList.retrieveList()");
const retrieveListURL = '/schedule/month'+EgovNet.getQueryString(srchcnd);
const retrieveListURL = '/schedule/month' + EgovNet.getQueryString(srchcnd);
const requestOptions = {
method: "GET",
@ -70,7 +72,7 @@ function EgovAdminScheduleList(props) {
}
);
console.groupEnd("EgovAdminScheduleList.retrieveList()");
},[]);
}, []);
const drawCalendar = () => {
console.groupCollapsed("EgovAdminScheduleList.drawCalendar()");
@ -151,7 +153,8 @@ function EgovAdminScheduleList(props) {
if (scheduleList.length > 0) {//
return (
<td key={keyIdx++}>
<Link to={{pathname: URL.ADMIN_SCHEDULE_CREATE}} state={{iUseDate : mutsUseYearMonth + sDate + "000000"}} className="day" key={keyIdx++}>{day}</Link><br />
<Link to={{pathname: URL.ADMIN_SCHEDULE_CREATE}} state={{iUseDate: mutsUseYearMonth + sDate + "000000"}} className="day"
key={keyIdx++}>{day}</Link><br/>
{
scheduleList.map((schedule, scheduleIdx) => {
let iBeginDate = Number(schedule.schdulBgnde.substring(0, 8));
@ -162,10 +165,10 @@ function EgovAdminScheduleList(props) {
return (
<>
<Link to={{pathname: URL.ADMIN_SCHEDULE_DETAIL}}
state={{schdulId : schedule.schdulId}}
state={{schdulId: schedule.schdulId}}
key={keyIdx++}>{schedule.schdulNm}
</Link>
<br />
<br/>
</>
);
} else return <></>
@ -176,7 +179,8 @@ function EgovAdminScheduleList(props) {
} else {//
return (
<td key={keyIdx++}>
<Link to={{pathname: URL.ADMIN_SCHEDULE_CREATE}} state={{iUseDate : mutsUseYearMonth + sDate + "000000"}} className="day" key={keyIdx++}>{day}</Link><br />
<Link to={{pathname: URL.ADMIN_SCHEDULE_CREATE}} state={{iUseDate: mutsUseYearMonth + sDate + "000000"}} className="day"
key={keyIdx++}>{day}</Link><br/>
</td>);
}
} else if (day === 0) {// /
@ -212,13 +216,115 @@ function EgovAdminScheduleList(props) {
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [scheduleList]);
const getDailyUserLogList = useCallback(() => {
console.groupCollapsed("EgovAdminScheduleList.getDailyUserLogList()");
const dailyUserLogListURL = '/admin/dashboard/daily-user-log-list';
const requestOptions = {
method: "GET",
headers: {
'Content-type': 'application/json',
}
}
EgovNet.requestFetch(dailyUserLogListURL,
requestOptions,
(resp) => {
setDailyUserLogList(resp.result.dailyUserLogList);
console.log("@@@ : " + dailyUserLogList);
},
function (resp) {
console.log("err response : ", resp);
}
);
console.groupEnd("EgovAdminScheduleList.getDailyUserLogList()");
}, []);
useEffect(() => {
getDailyUserLogList();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
const data = dailyUserLogList.map(item => ({
logDt: item.logDt,
uv: item.mobileCnt,
"사용자 접속현황": item.logCnt,
amt: item.pcCnt,
}));
const getIntroOfPage = (label) => {
if (label === 'Page A') {
return "Page A is about men's clothing";
}
if (label === 'Page B') {
return "Page B is about women's dress";
}
if (label === 'Page C') {
return "Page C is about women's bag";
}
if (label === 'Page D') {
return 'Page D is about household goods';
}
if (label === 'Page E') {
return 'Page E is about food';
}
if (label === 'Page F') {
return 'Page F is about baby food';
}
return '';
};
const CustomTooltip = ({active, payload, label}) => {
if (active && payload && payload.length) {
return (
<div className="custom-tooltip">
<p className="desc">사용자 접속 현황</p>
<p className="label">{`${label} : ${payload[0].value}`}</p>
<p className="intro">{getIntroOfPage(label)}</p>
</div>
);
}
return null;
};
class Example extends PureComponent {
static demoUrl = 'https://codesandbox.io/s/tooltip-with-customized-content-lyxvs';
render() {
return (
<ResponsiveContainer width="100%" height="100%">
<BarChart
width={500}
height={300}
data={data}
margin={{
top: 5,
right: 30,
left: 20,
bottom: 5,
}}
>
<CartesianGrid strokeDasharray="3 3"/>
<XAxis dataKey="logDt"/>
<YAxis/>
<Tooltip content={<CustomTooltip/>}/>
<Legend/>
<Bar dataKey="사용자 접속현황" barSize={20} fill="#87CEFA"/>
</BarChart>
</ResponsiveContainer>
);
}
}
console.log("------------------------------EgovAdminScheduleList [End]");
console.groupEnd("EgovAdminScheduleList");
return (
<div className="container">
<div className="c_wrap">
{/* <!-- Location --> */}
<Location />
<Location/>
{/* <!--// Location --> */}
<div className="layout">
@ -235,6 +341,10 @@ function EgovAdminScheduleList(props) {
<h2 className="tit_2">일정관리</h2>
<div style={{width: 1000, height: 300}}>
<Example/>
</div>
{/* <!-- 검색조건 --> */}
<div className="condition">
<ul>
@ -242,7 +352,7 @@ function EgovAdminScheduleList(props) {
<label className="f_select" htmlFor="sel1">
<select name="schdulSe" id="sel1" title="조건"
onChange={e => {
setSearchCondition({ ...searchCondition, schdulSe: e.target.value });
setSearchCondition({...searchCondition, schdulSe: e.target.value});
}}
>
<option value="">전체</option>

View File

@ -1,11 +1,186 @@
import React from 'react';
import React, {useCallback, useEffect, useRef, useState} from 'react';
import {Link, useLocation} from "react-router-dom";
import URL from "constants/url";
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
import EgovPaging from "components/EgovPaging";
import * as EgovNet from "api/egovFetch";
import {itemIdxByPage} from "utils/calc";
import Button from "react-bootstrap/Button";
function List(props) {
const location = useLocation();
const [searchCondition, setSearchCondition] = useState(location.state?.searchCondition || { pageIndex: 1, searchCnd: '0', searchWrd: '' });// ||
const [listTag, setListTag] = useState([]);
const [paginationInfo, setPaginationInfo] = useState({});
const cndRef = useRef();
const wrdRef = useRef();
const retrieveList = useCallback((searchCondition) => {
const params = "?";
EgovNet.requestFetch(
'/admin/users/list'+params,
{
method: "GET"
},
(resp) => {
setPaginationInfo(resp.result.paginationInfo);
let mutListTag = [];
const resultCnt = parseInt(resp.result.contentCnt);
const currentPageNo = resp.result.paginationInfo.pageIndex;
const pageSize = resp.result.paginationInfo.rowCnt;
setListTag([]);
//
resp.result.userList.forEach(function (item, index) {
const listIdx = itemIdxByPage(resultCnt , currentPageNo, pageSize, index);
mutListTag.push(
<div>
<span>{item.userSe}</span>
<span>{item.userId}</span>
<span>{item.userNm}</span>
<span>{item.email}</span>
<span>{item.phoneNum}</span>
<span>{item.useYn}</span>
<span><Button variant={"danger"} size={"sm"}>삭제</Button></span>
</div>
);
/*<Link to={{pathname: URL.ADMIN_NOTICE_DETAIL}}
state={{
nttId: item.nttId,
searchCondition: searchCondition
}}
key={listIdx} className="list_item" >
<div>{listIdx}</div>
{(item.replyLc * 1 ? true : false) &&
<><div className="al reply">
{item.nttSj}
</div></>}
{(item.replyLc * 1 ? false : true) &&
<><div className="al">
{item.nttSj}
</div></>}
<div>{item.frstRegisterNm}</div>
<div>{item.frstRegisterPnttm}</div>
<div>{item.inqireCo}</div>
</Link>*/
});
if(!mutListTag.length) mutListTag.push(<p className="no_data" key="0">검색된 결과가 없습니다.</p>); //
setListTag(mutListTag);
},
function (resp) {
console.log("err response : ", resp);
}
);
},[]);
useEffect(() => {
retrieveList(searchCondition);
}, []);
return (
<div className="container">
List
<div className="c_wrap">
<div className="location">
<ul>
<li><Link to={URL.MAIN} className="home">Home</Link></li>
<li>사이트관리</li>
<li>사용자 관리</li>
<li><Link to={URL.ADMIN__USERS__LIST}>사용자 목록</Link></li>
</ul>
</div>
<div className="layout">
{/* <!-- Navigation --> */}
<EgovLeftNav activeKey={"1"}></EgovLeftNav>
<div className="contents NOTICE_LIST" id="contents">
{/* <!-- 본문 --> */}
<div className="top_tit">
<h1 className="tit_1">사용자 목록</h1>
</div>
<h2 className="tit_2"></h2>
{/* <!-- 검색조건 --> */}
<div className="condition">
<ul>
<li className="third_1 L">
<label className="f_select" htmlFor="sel1">
<select id="sel1" title="조건" defaultValue={searchCondition.searchCnd} ref={cndRef}
onChange={e => {cndRef.current.value = e.target.value;}}>
<option value="0">전체</option>
<option value="1">일반사용자</option>
<option value="2">관리자</option>
</select>
</label>
</li>
<li className="third_1 L">
<label className="f_select" htmlFor="sel1">
<select id="sel1" title="조건" defaultValue={searchCondition.searchCnd} ref={cndRef}
onChange={e => {cndRef.current.value = e.target.value;}}>
<option value="id">아이디</option>
<option value="name">이름</option>
<option value="email">이메일</option>
<option value="phoneNum">전화번호</option>
</select>
</label>
</li>
<li className="third_2 R">
<span className="f_search w_500">
<input type="text" name="" defaultValue={searchCondition.searchWrd} placeholder="" ref={wrdRef}
onChange={e => {
wrdRef.current.value = e.target.value;
}}
/>
<button type="button"
onClick={() => {
retrieveList({ ...searchCondition, pageIndex: 1, searchCnd: cndRef.current.value, searchWrd: wrdRef.current.value });
}}>조회</button>
</span>
</li>
{/*{masterBoard.bbsUseFlag === 'Y' &&
<li>
<Link to={URL.ADMIN_NOTICE_CREATE} state={{bbsId: bbsId}} className="btn btn_blue_h46 pd35">등록</Link>
</li>
}*/}
</ul>
</div>
<div className="board_list BRD002">
<div className="head">
<span>구분</span>
<span>아이디</span>
<span>이름</span>
<span>이메일</span>
<span>전화번호</span>
<span>상태</span>
<span>삭제</span>
</div>
<div className="result">
{listTag}
</div>
</div>
<div className="board_bot">
<EgovPaging pagination={paginationInfo}
moveToPage={passedPage => {
retrieveList({
...searchCondition,
pageIndex: passedPage,
searchCnd: cndRef.current.value,
searchWrd: wrdRef.current.value
})
}} />
</div>
</div>
</div>
</div>
</div>
);
}

View File

@ -22,7 +22,7 @@ function EgovLoginContent(props) {
const location = useLocation();
console.log("EgovLoginContent [location] : ", location);
const [userInfo, setUserInfo] = useState({ username: '', password: 'default', email: '', userSe: 'USR'});
const [userInfo, setUserInfo] = useState({ username: '', password: 'default', email: '', userSe: 'ACC_TP02'});
// eslint-disable-next-line no-unused-vars
const [saveIDFlag, setSaveIDFlag] = useState(false);
@ -64,7 +64,7 @@ function EgovLoginContent(props) {
useEffect(() => {
let data = getLocalItem(KEY_ID);
if (data !== null) {
setUserInfo({ username: data, password: 'default', email: '', userSe: 'USR' });
setUserInfo({ username: data, password: 'default', email: '', userSe: 'ACC_TP02' });
}
}, []);

View File

@ -257,7 +257,7 @@ function CodeViewer(props) {
item.full_content = item.full_content.replace('<table ', '<table class="table table-bordered "')
}
if(item.error_cd !== null){
if(sessionUserSe === "ADM"){
if(sessionUserSe === "ACC_TP01"){
item.full_content = "<p class='errorText' id='error"+item.doc_cont_seq+"'>"+item.error_cd+"</p><br>"+
"<div class='input-group w-25 d-none errorEditDiv'>" +
"<input type='hidden' class='docContSeq' value='"+item.doc_cont_seq+"' />"+
@ -315,7 +315,7 @@ function CodeViewer(props) {
docLinkActionAppend(el)
bookmarkBtnActionAppend(el)
checkboxActionAppend(el)
if(sessionUserSe === "ADM"){
if(sessionUserSe === "ACC_TP01"){
errorTextActionAppend(el)
errorEditSaveBtnActionAppend(el)
errorEditCancelBtnActionAppend(el)

File diff suppressed because it is too large Load Diff

View File

@ -59,10 +59,16 @@ dependencies {
/*전자정부*/
implementation(group: 'org.egovframe.rte', name: 'org.egovframe.rte.ptl.mvc', version:'4.1.0') {
exclude(module: 'commons-logging')
exclude(module: 'spring-modules-validation')
}
implementation group: 'org.egovframe.rte', name: 'org.egovframe.rte.fdl.cmmn', version:'4.1.0'
implementation group: 'org.egovframe.rte', name: 'org.egovframe.rte.fdl.property', version:'4.1.0'
implementation group: 'org.egovframe.rte', name: 'org.egovframe.rte.fdl.crypto', version:'4.1.0'
implementation group: 'org.egovframe.rte', name: 'org.egovframe.rte.fdl.idgnr', version:'4.1.0'
implementation group: 'org.egovframe.rte', name: 'org.egovframe.rte.psl.dataaccess', version:'4.1.0'
implementation group: 'org.springmodules', name: 'spring-modules-validation', version:'0.9'
// https://mvnrepository.com/artifact/io.springfox/springfox-swagger2
implementation group: 'io.springfox', name: 'springfox-swagger2', version: '3.0.0'
@ -81,5 +87,7 @@ dependencies {
// https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-jackson
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'
implementation 'org.apache.commons:commons-lang3'
}

View File

@ -0,0 +1,85 @@
package com.dbnt.kcscbackend.admin.committee.schedules.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.*;
import org.springframework.core.env.Environment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.support.lob.DefaultLobHandler;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.io.IOException;
/**
* @ClassName : EgovConfigAppMapper.java
* @Description : Mapper
*
* @author :
* @since : 2021. 7. 20
* @version : 1.0
*
* <pre>
* << (Modification Information) >>
*
*
* ------------- ------------ ---------------------
* 2021. 7. 20
* </pre>
*
*/
@Configuration
@PropertySources({
@PropertySource("classpath:/application.properties")
})
public class EgovConfigAppMapper {
@Autowired
DataSource dataSource;
@Autowired
Environment env;
private String dbType;
@PostConstruct
void init() {
dbType = env.getProperty("Globals.DbType");
}
@Bean
@Lazy
public DefaultLobHandler lobHandler() {
return new DefaultLobHandler();
}
@Bean(name = {"sqlSession", "egov.sqlSession"})
public SqlSessionFactoryBean sqlSession() {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setConfigLocation(
pathMatchingResourcePatternResolver
.getResource("classpath:/admin/committee/schedules/mapper/config/mapper-config.xml"));
try {
sqlSessionFactoryBean.setMapperLocations(
pathMatchingResourcePatternResolver
.getResources("classpath:/egovframework/mapper/let/**/*_" + dbType + ".xml"));
} catch (IOException e) {
// TODO Exception 처리 필요
}
return sqlSessionFactoryBean;
}
@Bean
public SqlSessionTemplate egovSqlSessionTemplate(@Qualifier("sqlSession") SqlSessionFactory sqlSession) {
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSession);
return sqlSessionTemplate;
}
}

View File

@ -0,0 +1,192 @@
package com.dbnt.kcscbackend.admin.committee.schedules.controller;
import com.dbnt.kcscbackend.admin.committee.schedules.repository.FileVO;
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovFileMngService;
import com.dbnt.kcscbackend.config.egov.EgovProperties;
import com.dbnt.kcscbackend.config.egov.EgovWebUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.fdl.cmmn.exception.EgovBizException;
import org.egovframe.rte.fdl.cryptography.EgovCryptoService;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Base64;
import java.util.Map;
/**
*
* @author
* @since 2009.06.01
* @version 1.0
* @see
*
* <pre>
* << (Modification Information) >>
*
*
* ------- -------- ---------------------------
* 2009.3.25
*
* Copyright (C) 2009 by MOPAS All right reserved.
* </pre>
*/
@Slf4j
@Controller
@Tag(name="EgovFileDownloadController",description = "파일 다운로드")
public class EgovFileDownloadController {
@Resource(name = "EgovFileMngService")
private EgovFileMngService fileService;
/** 암호화서비스 */
@Resource(name="egovARIACryptoService")
EgovCryptoService cryptoService;
public static final String ALGORITM_KEY = EgovProperties.getProperty("Globals.crypto.algoritm");
/**
* .
*
* @param request
* @return
*/
private String getBrowser(HttpServletRequest request) {
String header = request.getHeader("User-Agent");
if (header.indexOf("MSIE") > -1) {
return "MSIE";
} else if (header.indexOf("Trident") > -1) { // IE11 문자열 깨짐 방지
return "Trident";
} else if (header.indexOf("Chrome") > -1) {
return "Chrome";
} else if (header.indexOf("Opera") > -1) {
return "Opera";
}
return "Firefox";
}
/**
* Disposition .
*
* @param filename
* @param request
* @param response
* @throws Exception
*/
private void setDisposition(String filename, HttpServletRequest request, HttpServletResponse response)
throws Exception {
String browser = getBrowser(request);
String dispositionPrefix = "attachment; filename=";
String encodedFilename = null;
if (browser.equals("MSIE")) {
encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20");
} else if (browser.equals("Trident")) { // IE11 문자열 깨짐 방지
encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20");
} else if (browser.equals("Firefox")) {
encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
} else if (browser.equals("Opera")) {
encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
} else if (browser.equals("Chrome")) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < filename.length(); i++) {
char c = filename.charAt(i);
if (c > '~') {
sb.append(URLEncoder.encode("" + c, "UTF-8"));
} else {
sb.append(c);
}
}
encodedFilename = sb.toString();
} else {
//throw new RuntimeException("Not supported browser");
throw new IOException("Not supported browser");
}
response.setHeader("Content-Disposition", dispositionPrefix + encodedFilename);
if ("Opera".equals(browser)) {
response.setContentType("application/octet-stream;charset=UTF-8");
}
}
/**
* .
*
* @param commandMap
* @param response
* @throws Exception
*/
@Operation(
summary = "파일 다운로드",
description = "첨부파일로 등록된 파일에 대하여 다운로드를 제공",
tags = {"EgovFileDownloadController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "성공")
})
@GetMapping(value = "/cmm/fms/FileDown.do")
public void cvplFileDownload(@RequestParam Map<String, Object> commandMap, HttpServletRequest request, HttpServletResponse response) throws Exception {
// 암호화된 atchFileId 를 복호화 (2022.12.06 추가) - 파일아이디가 유추 불가능하도록 조치
String param_atchFileId = (String) commandMap.get("atchFileId");
param_atchFileId = param_atchFileId.replaceAll(" ", "+");
byte[] decodedBytes = Base64.getDecoder().decode(param_atchFileId);
String decodedFileId = new String(cryptoService.decrypt(decodedBytes,ALGORITM_KEY));
String fileSn = (String) commandMap.get("fileSn");
FileVO fileVO = new FileVO();
fileVO.setAtchFileId(decodedFileId);
fileVO.setFileSn(fileSn);
FileVO fvo = fileService.selectFileInf(fileVO);
String fileStreCours = EgovWebUtil.filePathBlackList(fvo.getFileStreCours());
String streFileNm = EgovWebUtil.filePathBlackList(fvo.getStreFileNm());
File uFile = new File(fileStreCours, streFileNm);
long fSize = uFile.length();
if (fSize > 0) {
//String mimetype = "application/x-msdownload";
String mimetype = "application/x-stuff";
//response.setBufferSize(fSize); // OutOfMemeory 발생
response.setContentType(mimetype);
//response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fvo.getOrignlFileNm(), "utf-8") + "\"");
setDisposition(fvo.getOrignlFileNm(), request, response);
//response.setContentLength(fSize);
/*
* FileCopyUtils.copy(in, response.getOutputStream());
* in.close();
* response.getOutputStream().flush();
* response.getOutputStream().close();
*/
// Try-with-resources를 이용한 자원 해제 처리 (try 구문에 선언한 리소스를 자동 반납)
// try에 전달할 수 있는 자원은 java.lang.AutoCloseable 인터페이스의 구현 객체로 한정
try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(uFile));
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());){
FileCopyUtils.copy(in, out);
out.flush();
} catch (FileNotFoundException ex) {
log.debug("IGNORED: {}", ex.getMessage());
}
} else {
throw new EgovBizException();
}
}
}

View File

@ -0,0 +1,694 @@
package com.dbnt.kcscbackend.admin.committee.schedules.controller;
import com.dbnt.kcscbackend.admin.committee.schedules.repository.ComDefaultCodeVO;
import com.dbnt.kcscbackend.admin.committee.schedules.repository.FileVO;
import com.dbnt.kcscbackend.admin.committee.schedules.repository.IndvdlSchdulManageVO;
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovCmmUseService;
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovFileMngService;
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovIndvdlSchdulManageService;
import com.dbnt.kcscbackend.auth.entity.LoginVO;
import com.dbnt.kcscbackend.auth.entity.UserInfo;
import com.dbnt.kcscbackend.auth.repository.UserInfoRepository;
import com.dbnt.kcscbackend.config.common.ResponseCode;
import com.dbnt.kcscbackend.config.common.ResultVO;
import com.dbnt.kcscbackend.config.egov.EgovMessageSource;
import io.swagger.models.auth.In;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.egovframe.rte.fdl.cryptography.EgovCryptoService;
import org.egovframe.rte.fdl.property.EgovPropertyService;
import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
* Controller Class
* @since 2009.04.10
* @see
* <pre>
* << (Modification Information) >>
*
* ------- -------- ---------------------------
* 2009.04.10
* 2011.05.31 JJY
* </pre>
* @author
* @version 1.0
* @created 09-6-2011 10:08:04
*/
@RestController
@Tag(name="SchedulesApiController",description = "일정관리")
public class SchedulesApiController {
/** EgovMessageSource */
@Resource(name = "egovMessageSource")
EgovMessageSource egovMessageSource;
@Resource(name = "egovIndvdlSchdulManageService")
private EgovIndvdlSchdulManageService egovIndvdlSchdulManageService;
@Resource(name = "EgovCmmUseService")
private EgovCmmUseService cmmUseService;
/** EgovPropertyService */
@Resource(name = "propertiesService")
protected EgovPropertyService propertiesService;
// 첨부파일 관련
@Resource(name = "EgovFileMngService")
private EgovFileMngService fileMngService;
/** 암호화서비스 */
@Resource(name="egovARIACryptoService")
EgovCryptoService cryptoService;
/**
* () .
* @param request
* @param commandMap
* @return resultVO
* @throws Exception
*/
@Operation(
summary = "월별 일정 조회",
description = "일정(월별) 목록을 조회",
tags = {"SchedulesApiController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@GetMapping(value = "/schedule/month")
public ResultVO EgovIndvdlSchdulManageMonthList(@AuthenticationPrincipal LoginVO loginVO, HttpServletRequest request,
@RequestParam Map<String, Object> commandMap) throws Exception {
ResultVO resultVO = new ResultVO();
Map<String, Object> resultMap = new HashMap<String, Object>();
//일정구분 검색 유지
resultMap.put("searchKeyword",
commandMap.get("searchKeyword") == null ? "" : (String)commandMap.get("searchKeyword"));
resultMap.put("searchCondition",
commandMap.get("searchCondition") == null ? "" : (String)commandMap.get("searchCondition"));
Calendar cal = Calendar.getInstance();
String sYear = String.valueOf(commandMap.get("year"));
String sMonth = String.valueOf(commandMap.get("month"));
int iYear = cal.get(Calendar.YEAR);
int iMonth = cal.get(Calendar.MONTH);
//int iDate = cal.get(java.util.Calendar.DATE);
//검색 설정
String sSearchDate = "";
if (sYear == null || sMonth == null) {
sSearchDate += Integer.toString(iYear);
sSearchDate += Integer.toString(iMonth + 1).length() == 1 ? "0" + Integer.toString(iMonth + 1)
: Integer.toString(iMonth + 1);
} else {
iYear = Integer.parseInt(sYear);
iMonth = Integer.parseInt(sMonth);
sSearchDate += sYear;
sSearchDate += Integer.toString(iMonth + 1).length() == 1 ? "0" + Integer.toString(iMonth + 1)
: Integer.toString(iMonth + 1);
}
//공통코드 일정종류
ComDefaultCodeVO voComCode = new ComDefaultCodeVO();
voComCode = new ComDefaultCodeVO();
voComCode.setCodeId("COM030");
resultMap.put("schdulSe", cmmUseService.selectCmmCodeDetail(voComCode));
commandMap.put("searchMonth", sSearchDate);
commandMap.put("searchMode", "MONTH");
resultMap.put("resultList", egovIndvdlSchdulManageService.selectIndvdlSchdulManageRetrieve(commandMap));
resultMap.put("prevRequest", commandMap);
resultVO.setResult(resultMap);
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
return resultVO;
}
/**
* .
* @param request
* @param multiRequest
* @param indvdlSchdulManageVO
* @param bindingResult
* @return resultVO
* @throws Exception
*/
@Operation(
summary = "일정 등록",
description = "일정을 등록 처리",
tags = {"SchedulesApiController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "등록 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님"),
@ApiResponse(responseCode = "900", description = "입력값 무결성 오류")
})
@PostMapping(value = "/schedule")
public ResultVO IndvdlSchdulManageRegistActor(
HttpServletRequest request,
final MultipartHttpServletRequest multiRequest,
IndvdlSchdulManageVO indvdlSchdulManageVO,
BindingResult bindingResult,
@AuthenticationPrincipal LoginVO loginVO
) throws Exception {
ResultVO resultVO = new ResultVO();
//서버 validate 체크
////beanValidator.validate(indvdlSchdulManageVO, bindingResult);
if (bindingResult.hasErrors()) {
resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode());
resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage());
return resultVO;
}
// 첨부파일 관련 첨부파일ID 생성
List<FileVO> _result = null;
String _atchFileId = "";
final Map<String, MultipartFile> files = multiRequest.getFileMap();
if (!files.isEmpty()) {
//_result = fileUtil.parseFileInf(files, "DSCH_", 0, "", "");
_atchFileId = fileMngService.insertFileInfs(_result); //파일이 생성되고나면 생성된 첨부파일 ID를 리턴한다.
}
// 리턴받은 첨부파일ID를 셋팅한다..
indvdlSchdulManageVO.setAtchFileId(_atchFileId); // 첨부파일 ID
//아이디 설정
indvdlSchdulManageVO.setFrstRegisterId(loginVO.getUniqId());
indvdlSchdulManageVO.setLastUpdusrId(loginVO.getUniqId());
indvdlSchdulManageVO.setSchdulDeptName("관리자부서");
indvdlSchdulManageVO.setSchdulDeptId("ORGNZT_0000000000000");
indvdlSchdulManageVO.setSchdulChargerName("관리자");
indvdlSchdulManageVO.setSchdulChargerId("USRCNFRM_00000000000");
egovIndvdlSchdulManageService.insertIndvdlSchdulManage(indvdlSchdulManageVO);
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
return resultVO;
}
/**
* .
* @param schdulId
* @param user
* @return
* @throws Exception
*/
@Operation(
summary = "일정 상세조회",
description = "일정 목록을 상세조회",
tags = {"SchedulesApiController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공")
})
@GetMapping(value = "/schedule/{schdulId}")
public ResultVO EgovIndvdlSchdulManageDetail(
@PathVariable("schdulId") String schdulId,
@AuthenticationPrincipal LoginVO user)
throws Exception {
ResultVO resultVO = new ResultVO();
Map<String, Object> resultMap = new HashMap<String, Object>();
IndvdlSchdulManageVO indvdlSchdulManageVO = new IndvdlSchdulManageVO();
indvdlSchdulManageVO.setSchdulId(schdulId);
//일정시작일자(시)
resultMap.put("schdulBgndeHH", getTimeHH());
//일정시작일자(분)
resultMap.put("schdulBgndeMM", getTimeMM());
//일정종료일자(시)
resultMap.put("schdulEnddeHH", getTimeHH());
//일정정료일자(분)
resultMap.put("schdulEnddeMM", getTimeMM());
//공통코드 중요도 조회
ComDefaultCodeVO voComCode = new ComDefaultCodeVO();
voComCode.setCodeId("COM019");
resultMap.put("schdulIpcrCode", cmmUseService.selectCmmCodeDetail(voComCode));
//공통코드 일정구분 조회
voComCode = new ComDefaultCodeVO();
voComCode.setCodeId("COM030");
resultMap.put("schdulSe", cmmUseService.selectCmmCodeDetail(voComCode));
//공통코드 반복구분 조회
voComCode = new ComDefaultCodeVO();
voComCode.setCodeId("COM031");
resultMap.put("reptitSeCode", cmmUseService.selectCmmCodeDetail(voComCode));
IndvdlSchdulManageVO scheduleDetail = egovIndvdlSchdulManageService
.selectIndvdlSchdulManageDetail(indvdlSchdulManageVO);
resultMap.put("scheduleDetail", scheduleDetail);
// 첨부파일 확인
if (scheduleDetail.getAtchFileId() != null && !scheduleDetail.getAtchFileId().isEmpty()) {
FileVO fileVO = new FileVO();
fileVO.setAtchFileId(scheduleDetail.getAtchFileId());
List<FileVO> resultFiles = fileMngService.selectFileInfs(fileVO);
// FileId를 유추하지 못하도록 암호화하여 표시한다. (2022.12.06 추가) - 파일아이디가 유추 불가능하도록 조치
for (FileVO file : resultFiles) {
String toEncrypt = file.atchFileId;
file.setAtchFileId(Base64.getEncoder().encodeToString(cryptoService.encrypt(toEncrypt.getBytes(),EgovFileDownloadController.ALGORITM_KEY)));
}
resultMap.put("resultFiles", resultFiles);
}
resultMap.put("user", user);
resultVO.setResult(resultMap);
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
return resultVO;
}
/**
* .
* @param schdulId
* @return
* @throws Exception
*/
@Operation(
summary = "일정 삭제",
description = "일정을 삭제 처리",
tags = {"SchedulesApiController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "등록 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@DeleteMapping(value = "/schedule/{schdulId}")
public ResultVO EgovIndvdlSchdulManageDelete(
@PathVariable("schdulId") String schdulId
) throws Exception {
ResultVO resultVO = new ResultVO();
IndvdlSchdulManageVO indvdlSchdulManageVO = new IndvdlSchdulManageVO();
indvdlSchdulManageVO.setSchdulId(schdulId);
egovIndvdlSchdulManageService.deleteIndvdlSchdulManage(indvdlSchdulManageVO);//schdulId
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
return resultVO;
}
/**
* .
* @param multiRequest
* @param indvdlSchdulManageVO
* @param bindingResult
* @return resultVO
* @throws Exception
*/
@Operation(
summary = "일정 수정",
description = "일정을 수정 처리",
tags = {"SchedulesApiController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "등록 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님"),
@ApiResponse(responseCode = "900", description = "입력값 무결성 오류")
})
@PutMapping(value = "/schedule/{schdulId}")
public ResultVO IndvdlSchdulManageModifyActor(
final MultipartHttpServletRequest multiRequest,
IndvdlSchdulManageVO indvdlSchdulManageVO,
BindingResult bindingResult,
@PathVariable("schdulId") String schdulId,
@AuthenticationPrincipal LoginVO user)
throws Exception {
ResultVO resultVO = new ResultVO();
Map<String, Object> resultMap = new HashMap<String, Object>();
//서버 validate 체크
indvdlSchdulManageVO.setSchdulId(schdulId);
////beanValidator.validate(indvdlSchdulManageVO, bindingResult);
if (bindingResult.hasErrors()) {
resultVO.setResult(resultMap);
resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode());
resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage());
return resultVO;
}
/* *****************************************************************
// 아이디 설정
****************************************************************** */
indvdlSchdulManageVO.setFrstRegisterId(user.getUniqId());
indvdlSchdulManageVO.setLastUpdusrId(user.getUniqId());
/* *****************************************************************
// 첨부파일 관련 ID 생성 start....
****************************************************************** */
String _atchFileId = indvdlSchdulManageVO.getAtchFileId();
final Map<String, MultipartFile> files = multiRequest.getFileMap();
if (!files.isEmpty()) {
String atchFileAt = multiRequest.getAttribute("atchFileAt") == null ? "" : (String)multiRequest.getAttribute("atchFileAt");
if ("N".equals(atchFileAt) || _atchFileId.equals("")) {
//기존 첨부 파일이 존재하지 않는 경우
////List<FileVO> _result = fileUtil.parseFileInf(files, "DSCH_", 0, _atchFileId, "");
////_atchFileId = fileMngService.insertFileInfs(_result);
// 첨부파일 ID 셋팅
indvdlSchdulManageVO.setAtchFileId(_atchFileId); // 첨부파일 ID
} else {
//기존 첨부 파일이 하나라도 존재하는 경우
FileVO fvo = new FileVO();
fvo.setAtchFileId(_atchFileId);
int _cnt = fileMngService.getMaxFileSN(fvo);
////List<FileVO> _result = fileUtil.parseFileInf(files, "DSCH_", _cnt, _atchFileId, "");
////fileMngService.updateFileInfs(_result);
}
}
/* *****************************************************************
// 일정관리정보 업데이트 처리
****************************************************************** */
egovIndvdlSchdulManageService.updateIndvdlSchdulManage(indvdlSchdulManageVO);
resultVO.setResult(resultMap);
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
return resultVO;
}
/**
* () .
* @param commandMap
* @return resultVO
* @throws Exception
*/
@Operation(
summary = "일별 일정 조회",
description = "일정(일별) 목록을 조회",
tags = {"SchedulesApiController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@GetMapping(value = "/schedule/daily")
public ResultVO EgovIndvdlSchdulManageDailyList(@RequestParam Map<String, Object> commandMap) throws Exception {
ResultVO resultVO = new ResultVO();
Map<String, Object> resultMap = new HashMap<String, Object>();
//일정구분 검색 유지
resultMap.put("searchKeyword",
commandMap.get("searchKeyword") == null ? "" : (String)commandMap.get("searchKeyword"));
resultMap.put("searchCondition",
commandMap.get("searchCondition") == null ? "" : (String)commandMap.get("searchCondition"));
//공통코드 일정종류
ComDefaultCodeVO voComCode = new ComDefaultCodeVO();
voComCode = new ComDefaultCodeVO();
voComCode.setCodeId("COM030");
resultMap.put("schdulSe", cmmUseService.selectCmmCodeDetail(voComCode));
/* *****************************************************************
// 캘런더 설정 로직
****************************************************************** */
Calendar calNow = Calendar.getInstance();
String strYear = String.valueOf(commandMap.get("year"));
String strMonth = String.valueOf(commandMap.get("month"));
String strDay = String.valueOf(commandMap.get("date"));
String strSearchDay = "";
int iNowYear = calNow.get(Calendar.YEAR);
int iNowMonth = calNow.get(Calendar.MONTH);
int iNowDay = calNow.get(Calendar.DATE);
if (strYear != null) {
iNowYear = Integer.parseInt(strYear);
iNowMonth = Integer.parseInt(strMonth);
iNowDay = Integer.parseInt(strDay);
}
strSearchDay = Integer.toString(iNowYear);
strSearchDay += DateTypeIntForString(iNowMonth + 1);
strSearchDay += DateTypeIntForString(iNowDay);
commandMap.put("searchMode", "DAILY");
commandMap.put("searchDay", strSearchDay);
resultMap.put("year", iNowYear);
resultMap.put("month", iNowMonth);
resultMap.put("day", iNowDay);
resultMap.put("resultList", egovIndvdlSchdulManageService.selectIndvdlSchdulManageRetrieve(commandMap));
resultVO.setResult(resultMap);
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
return resultVO;
}
/**
* () .
* @param commandMap
* @return resultVO
* @throws Exception
*/
@Operation(
summary = "주간별 일정 조회",
description = "일정(주간별) 목록을 조회",
tags = {"SchedulesApiController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@GetMapping(value = "/schedule/week")
public ResultVO EgovIndvdlSchdulManageWeekList(
@RequestParam Map<String, Object> commandMap)
throws Exception {
ResultVO resultVO = new ResultVO();
Map<String, Object> resultMap = new HashMap<String, Object>();
//일정구분 검색 유지
resultMap.put("searchKeyword",
commandMap.get("searchKeyword") == null ? "" : (String)commandMap.get("searchKeyword"));
resultMap.put("searchCondition",
commandMap.get("searchCondition") == null ? "" : (String)commandMap.get("searchCondition"));
//공통코드 일정종류
ComDefaultCodeVO voComCode = new ComDefaultCodeVO();
voComCode = new ComDefaultCodeVO();
voComCode.setCodeId("COM030");
resultMap.put("schdulSe", cmmUseService.selectCmmCodeDetail(voComCode));
/* *****************************************************************
// 캘런더 설정 로직
****************************************************************** */
Calendar calNow = Calendar.getInstance();
String strYear = String.valueOf(commandMap.get("year"));
String strMonth = String.valueOf(commandMap.get("month"));
String strDate = String.valueOf(commandMap.get("date"));
int iNowMonth = calNow.get(Calendar.MONTH);
if (strYear != null) {
iNowMonth = Integer.parseInt(strMonth);
}
//프론트에서 넘어온 값은 1월을 0으로 간주하므로 1달 더해 줌
int realMonth = iNowMonth + 1;
strMonth = String.valueOf(realMonth);
//자릿수 보정
strMonth = (strMonth.length() == 1) ? "0" + strMonth : strMonth;
strDate = (strDate.length() == 1) ? "0" + strDate : strDate;
//시작일자
String schdulBgnde = strYear + strMonth + strDate;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
Calendar calNext = Calendar.getInstance();
calNext.set(Integer.parseInt(strYear), Integer.parseInt(strMonth)-1, Integer.parseInt(strDate));
calNext.add(Calendar.DATE, 6);
//종료일자
String schdulEndde = dateFormat.format(calNext.getTime());
commandMap.put("searchMode", "WEEK");
commandMap.put("schdulBgnde", schdulBgnde);
commandMap.put("schdulEndde", schdulEndde);
resultMap.put("resultList", egovIndvdlSchdulManageService.selectIndvdlSchdulManageRetrieve(commandMap));
resultVO.setResult(resultMap);
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
return resultVO;
}
/**
* LIST .
* @return List
* @throws
*/
private List<ComDefaultCodeVO> getTimeHH() {
ArrayList<ComDefaultCodeVO> listHH = new ArrayList<ComDefaultCodeVO>();
//HashMap hmHHMM;
for (int i = 0; i < 24; i++) {
String sHH = "";
String strI = String.valueOf(i);
if (i < 10) {
sHH = "0" + strI;
} else {
sHH = strI;
}
ComDefaultCodeVO codeVO = new ComDefaultCodeVO();
codeVO.setCode(sHH);
codeVO.setCodeNm(sHH);
listHH.add(codeVO);
}
return listHH;
}
/**
* LIST .
* @return List
* @throws
*/
private List<ComDefaultCodeVO> getTimeMM() {
ArrayList<ComDefaultCodeVO> listMM = new ArrayList<ComDefaultCodeVO>();
//HashMap hmHHMM;
for (int i = 0; i < 60; i++) {
String sMM = "";
String strI = String.valueOf(i);
if (i < 10) {
sMM = "0" + strI;
} else {
sMM = strI;
}
ComDefaultCodeVO codeVO = new ComDefaultCodeVO();
codeVO.setCode(sMM);
codeVO.setCodeNm(sMM);
listMM.add(codeVO);
}
return listMM;
}
/**
* 0
* @return String
* @throws
*/
public String DateTypeIntForString(int iInput) {
String sOutput = "";
if (Integer.toString(iInput).length() == 1) {
sOutput = "0" + Integer.toString(iInput);
} else {
sOutput = Integer.toString(iInput);
}
return sOutput;
}
/**
* ' ' > ' ' '' ' ' , API
* @param commandMap
* @return resultVO
* @throws Exception
*/
@Operation(
summary = "'위원회 일정 등록' 페이지 로딩 시, 필요한 데이터 불러 오는 API",
description = "관리자 단에서 '위원회 관리' > '위원회 일정 관리'에 '등록' 버튼을 누른 후 '위원회 일정 등록' 페이지 로딩 시, 필요한 데이터 불러 오는 API",
tags = {"SchedulesApiController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@GetMapping(value = "/schedule/init")
public ResultVO ScheduleInit(@RequestParam Map<String, Object> commandMap) throws Exception {
ResultVO resultVO = new ResultVO();
return egovIndvdlSchdulManageService.ScheduleInit(resultVO);
}
/**
* ' ' , API
* @param paramCodeGroup
* @return
* @throws Exception
*/
@Operation(
summary = "'위원회 일정 등록' 페이지에서 심의위원회 첫 번째 거 선택 시, 하위 목록 불러오는 API",
description = "관리자 단에서 '위원회 관리' > '위원회 일정 관리'에 '등록' 버튼을 누른 후 '위원회 일정 등록' 페이지에서 심의위원회 첫 번째 거 선택 시, 하위 목록 불러오는 API",
tags = {"SchedulesApiController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@GetMapping(value = "/schedule/api/org-api/depth/list")
public ResultVO ScheduleApiOrgApiDepthList(@RequestParam Integer paramCodeGroup) throws Exception {
ResultVO resultVO = new ResultVO();
return egovIndvdlSchdulManageService.ScheduleApiOrgApiDepthList(resultVO, paramCodeGroup);
}
}

View File

@ -0,0 +1,67 @@
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
import com.dbnt.kcscbackend.admin.committee.schedules.service.CmmnDetailCode;
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovComAbstractDAO;
import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.List;
/**
* @Class Name : CmmUseDAO.java
* @Description :
* @Modification Information
*
*
* ------- ------- -------------------
* 2009. 3. 11.
*
* @author
* @since 2009. 3. 11.
* @version
* @see
*
*/
@Repository("cmmUseDAO")
public class CmmUseDAO extends EgovComAbstractDAO {
/**
* .
*
* @param vo
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public List<CmmnDetailCode> selectCmmCodeDetail(ComDefaultCodeVO vo) throws Exception {
////return (List<CmmnDetailCode>) list("CmmUseDAO.selectCmmCodeDetail", vo);
return new ArrayList<CmmnDetailCode>();
}
/**
* .
*
* @param vo
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public List<CmmnDetailCode> selectOgrnztIdDetail(ComDefaultCodeVO vo) throws Exception {
//// return (List<CmmnDetailCode>) list("CmmUseDAO.selectOgrnztIdDetail", vo);
return new ArrayList<CmmnDetailCode>();
}
/**
* .
*
* @param vo
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public List<CmmnDetailCode> selectGroupIdDetail(ComDefaultCodeVO vo) throws Exception {
////return (List<CmmnDetailCode>) list("CmmUseDAO.selectGroupIdDetail", vo);
return new ArrayList<CmmnDetailCode>();
}
}

View File

@ -0,0 +1,60 @@
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.builder.ToStringBuilder;
import java.io.Serializable;
/**
*
* @author
* @since 2009.06.01
* @version 1.0
* @see
*
* <pre>
* << (Modification Information) >>
*
*
* ------- -------- ---------------------------
* 2009.3.11
*
* </pre>
*/
@Getter
@Setter
public class ComDefaultCodeVO implements Serializable {
/**
* serialVersion UID
*/
private static final long serialVersionUID = -2020648489890016404L;
/** 코드 ID */
private String codeId = "";
/** 상세코드 */
private String code = "";
/** 코드명 */
private String codeNm = "";
/** 코드설명 */
private String codeDc = "";
/** 특정테이블명 */
private String tableNm = ""; //특정테이블에서 코드정보를추출시 사용
/** 상세 조건 여부 */
private String haveDetailCondition = "N";
/** 상세 조건 */
private String detailCondition = "";
/**
* toString .
*/
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}

View File

@ -0,0 +1,68 @@
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.builder.ToStringBuilder;
import java.io.Serializable;
/**
* @Class Name : ComDefaultVO.java
* @Description : ComDefaultVO class
* @Modification Information
* @
* @
* @ ------- -------- ---------------------------
* @ 2009.02.01
*
* @author
* @since 2009.02.01
* @version 1.0
* @see
*
*/
@Getter
@Setter
public class ComDefaultVO implements Serializable {
private static final long serialVersionUID = 1L;
/** 검색조건 */
private String searchCondition = "";
/** 검색Keyword */
private String searchKeyword = "";
/** 검색사용여부 */
private String searchUseYn = "";
/** 현재페이지 */
private int pageIndex = 1;
/** 페이지갯수 */
private int pageUnit = 10;
/** 페이지사이즈 */
private int pageSize = 10;
/** firstIndex */
private int firstIndex = 1;
/** lastIndex */
private int lastIndex = 1;
/** recordCountPerPage */
private int recordCountPerPage = 10;
/** 검색KeywordFrom */
private String searchKeywordFrom = "";
/** 검색KeywordTo */
private String searchKeywordTo = "";
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}

View File

@ -0,0 +1,182 @@
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
import com.dbnt.kcscbackend.admin.committee.schedules.repository.FileVO;
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovComAbstractDAO;
import org.springframework.stereotype.Repository;
import java.util.Iterator;
import java.util.List;
/**
* @Class Name : EgovFileMngDAO.java
* @Description :
* @Modification Information
*
*
* ------- ------- -------------------
* 2009. 3. 25.
*
* @author
* @since 2009. 3. 25.
* @version
* @see
*
*/
@Repository("FileManageDAO")
public class FileManageDAO extends EgovComAbstractDAO {
/**
* ( ) .
*
* @param fileList
* @return
* @throws Exception
*/
public String insertFileInfs(List<?> fileList) throws Exception {
FileVO vo = (FileVO) fileList.get(0);
String atchFileId = vo.getAtchFileId();
insert("FileManageDAO.insertFileMaster", vo);
Iterator<?> iter = fileList.iterator();
while (iter.hasNext()) {
vo = (FileVO) iter.next();
insert("FileManageDAO.insertFileDetail", vo);
}
return atchFileId;
}
/**
* ( ) .
*
* @param vo
* @throws Exception
*/
public void insertFileInf(FileVO vo) throws Exception {
insert("FileManageDAO.insertFileMaster", vo);
insert("FileManageDAO.insertFileDetail", vo);
}
/**
* ( ) .
*
* @param fileList
* @throws Exception
*/
public void updateFileInfs(List<?> fileList) throws Exception {
FileVO vo;
Iterator<?> iter = fileList.iterator();
while (iter.hasNext()) {
vo = (FileVO) iter.next();
insert("FileManageDAO.insertFileDetail", vo);
}
}
/**
* .
*
* @param fileList
* @throws Exception
*/
public void deleteFileInfs(List<?> fileList) throws Exception {
Iterator<?> iter = fileList.iterator();
FileVO vo;
while (iter.hasNext()) {
vo = (FileVO) iter.next();
delete("FileManageDAO.deleteFileDetail", vo);
}
}
/**
* .
*
* @param fvo
* @throws Exception
*/
public void deleteFileInf(FileVO fvo) throws Exception {
delete("FileManageDAO.deleteFileDetail", fvo);
}
/**
* .
*
* @param vo
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public List<FileVO> selectFileInfs(FileVO vo) throws Exception {
return (List<FileVO>) list("FileManageDAO.selectFileList", vo);
}
/**
* .
*
* @param fvo
* @return
* @throws Exception
*/
public int getMaxFileSN(FileVO fvo) throws Exception {
return (Integer) selectOne("FileManageDAO.getMaxFileSN", fvo);
}
/**
* .
*
* @param fvo
* @return
* @throws Exception
*/
public FileVO selectFileInf(FileVO fvo) throws Exception {
return (FileVO) selectOne("FileManageDAO.selectFileInf", fvo);
}
/**
* .
*
* @param fvo
* @throws Exception
*/
public void deleteAllFileInf(FileVO fvo) throws Exception {
update("FileManageDAO.deleteCOMTNFILE", fvo);
}
/**
* .
*
* @param vo
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public List<FileVO> selectFileListByFileNm(FileVO fvo) throws Exception {
return (List<FileVO>) list("FileManageDAO.selectFileListByFileNm", fvo);
}
/**
* .
*
* @param fvo
* @return
* @throws Exception
*/
public int selectFileListCntByFileNm(FileVO fvo) throws Exception {
return (Integer) selectOne("FileManageDAO.selectFileListCntByFileNm", fvo);
}
/**
* .
*
* @param vo
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public List<FileVO> selectImageFileList(FileVO vo) throws Exception {
return (List<FileVO>) list("FileManageDAO.selectImageFileList", vo);
}
}

View File

@ -0,0 +1,69 @@
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.builder.ToStringBuilder;
import java.io.Serializable;
/**
* @Class Name : FileVO.java
* @Description : VO
* @Modification Information
*
*
* ------- ------- -------------------
* 2009. 3. 25.
*
* @author
* @since 2009. 3. 25.
* @version
* @see
*
*/
@Schema(description = "파일 정보 VO")
@Getter
@Setter
public class FileVO implements Serializable {
/**
* serialVersion UID
*/
private static final long serialVersionUID = -287950405903719128L;
@Schema(description = "첨부파일 아이디")
public String atchFileId = "";
@Schema(description = "생성일자")
public String creatDt = "";
@Schema(description = "파일내용")
public String fileCn = "";
@Schema(description = "파일확장자")
public String fileExtsn = "";
@Schema(description = "파일크기")
public String fileMg = "";
@Schema(description = "파일연번")
public String fileSn = "";
@Schema(description = "파일저장경로")
public String fileStreCours = "";
@Schema(description = "원파일명")
public String orignlFileNm = "";
@Schema(description = "저장파일명")
public String streFileNm = "";
/**
* toString .
*/
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}

View File

@ -0,0 +1,125 @@
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
import com.dbnt.kcscbackend.admin.committee.schedules.service.CmmnDetailCode;
import org.egovframe.rte.psl.dataaccess.EgovAbstractMapper;
import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Dao Class
* @since 2009.04.10
* @see
* <pre>
* << (Modification Information) >> ------- ---
* ----- --------------------------- 2009.04.10 2011.05.31
* JJY
* </pre>
* @author
* @version 1.0
* @created 09-6-2011 10:08:07
*/
@Repository("indvdlSchdulManageDao")
public class IndvdlSchdulManageDao extends EgovAbstractMapper {
/**
* / Map(map) .
* @param map
* @return
* @throws Exception
*/
public List<?> selectIndvdlSchdulManageMainList(Map<?, ?> map) throws Exception {
return list("IndvdlSchdulManage.selectIndvdlSchdulManageMainList", map);
}
/**
* Map(map) .
* @param map
* @return
* @throws Exception
*/
public List<?> selectIndvdlSchdulManageRetrieve(Map<?, ?> map) throws Exception {
//// return list("IndvdlSchdulManage.selectIndvdlSchdulManageRetrieve", map);
return new ArrayList<CmmnDetailCode>();
}
/**
* VO(model) .
* @param indvdlSchdulManageVO - VO
* @return IndvdlSchdulManageVO
* @throws Exception
*/
public IndvdlSchdulManageVO selectIndvdlSchdulManageDetailVO(IndvdlSchdulManageVO indvdlSchdulManageVO)
throws Exception {
return (IndvdlSchdulManageVO)selectOne("IndvdlSchdulManage.selectIndvdlSchdulManageDetailVO",
indvdlSchdulManageVO);
}
/**
* .
* @param searchVO - VO
* @return List
* @throws Exception
*/
public List<?> selectIndvdlSchdulManageList(ComDefaultVO searchVO) throws Exception {
return list("IndvdlSchdulManage.selectIndvdlSchdulManage", searchVO);
}
/**
* () .
* @param indvdlSchdulManageVO - VO
* @return List
* @throws Exception
*/
// public List<?> selectIndvdlSchdulManageDetail(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception{
// return list("IndvdlSchdulManage.selectIndvdlSchdulManageDetail", indvdlSchdulManageVO);
//}
public IndvdlSchdulManageVO selectIndvdlSchdulManageDetail(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception {
return selectOne("IndvdlSchdulManage.selectIndvdlSchdulManageDetailVO", indvdlSchdulManageVO);
}
/**
* () () .
* @param searchVO - VO
* @return int
* @throws Exception
*/
public int selectIndvdlSchdulManageListCnt(ComDefaultVO searchVO) throws Exception {
return (Integer)selectOne("IndvdlSchdulManage.selectIndvdlSchdulManageCnt", searchVO);
}
/**
* () .
* @param indvdlSchdulManageVO
* @throws Exception
*/
public void insertIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception {
insert("IndvdlSchdulManage.insertIndvdlSchdulManage", indvdlSchdulManageVO);
}
/**
* () .
* @param indvdlSchdulManageVO - VO
* @throws Exception
*/
public void updateIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception {
insert("IndvdlSchdulManage.updateIndvdlSchdulManage", indvdlSchdulManageVO);
}
/**
* () .
* @param indvdlSchdulManageVO - VO
* @throws Exception
*/
public void deleteIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception {
// 일지 삭제
//delete("IndvdlSchdulManage.deleteDiaryManage", indvdlSchdulManageVO);
// 일정관리 삭제
delete("IndvdlSchdulManage.deleteIndvdlSchdulManage", indvdlSchdulManageVO);
}
}

View File

@ -0,0 +1,106 @@
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* VO Class
* @since 2009.04.10
* @see
* <pre>
* << (Modification Information) >> ------- ---
* ----- --------------------------- 2009.04.10 2011.05.31
* JJY
* </pre>
* @author
* @version 1.0
* @created 09-6-2011 10:08:07
*/
@Getter
@Setter
public class IndvdlSchdulManageVO implements Serializable {
/**
* serialVersionUID
*/
private static final long serialVersionUID = 1L;
/** 일정ID */
private String schdulId;
/** 일정구분(회의/교육/세미나/강의 기타) */
private String schdulSe;
/** 일정부서ID */
private String schdulDeptId;
/** 일정종류(부서일정/개인일정) */
private String schdulKindCode;
/** 일정시작일자 */
private String schdulBgnde;
/** 일정종료일자 */
private String schdulEndde;
/** 일정명 */
private String schdulNm;
/** 일정내용 */
private String schdulCn;
/** 일정장소 */
private String schdulPlace;
/** 일정중요도코드 */
private String schdulIpcrCode;
/** 일정담담자ID */
private String schdulChargerId;
/** 첨부파일ID */
private String atchFileId;
/** 반복구분(반복, 연속, 요일반복) */
private String reptitSeCode;
/** 최초등록시점 */
private String frstRegisterPnttm = "";
/** 최초등록자ID */
private String frstRegisterId = "";
/** 최종수정시점 */
private String lastUpdusrPnttm = "";
/** 최종수정ID */
private String lastUpdusrId = "";
/** 일정시작일자(시간) */
private String schdulBgndeHH = "";
/** 일정시작일자(분) */
private String schdulBgndeMM = "";
/** 일정종료일자(시간) */
private String schdulEnddeHH = "";
/** 일정종료일자(분) */
private String schdulEnddeMM = "";
/** 일정시작일자(Year/Month/Day) */
private String schdulBgndeYYYMMDD = "";
/** 일정종료일자(Year/Month/Day) */
private String schdulEnddeYYYMMDD = "";
/** 담당부서 */
private String schdulDeptName = "";
/** 담당자명 */
private String schdulChargerName = "";
}

View File

@ -0,0 +1,79 @@
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.Email;
import java.io.Serializable;
/**
* @Class Name : LoginVO.java
* @Description : Login VO class
* @Modification Information
* @
* @
* @ ------- -------- ---------------------------
* @ 2009.03.03
*
* @author
* @since 2009.03.03
* @version 1.0
* @see
*
*/
@Schema(description = "사용자 정보 VO")
@Getter
@Setter
public class LoginVO implements Serializable{
/**
*
*/
private static final long serialVersionUID = -8274004534207618049L;
@Schema(description = "아이디")
private String id;
@Schema(description = "이름")
private String name;
@Schema(description = "주민등록번호")
private String ihidNum;
@Email(regexp = "[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,3}")
@Schema(description = "이메일주소")
private String email;
@Schema(description = "비밀번호")
private String password;
@Schema(description = "비밀번호 힌트")
private String passwordHint;
@Schema(description = "비밀번호 정답")
private String passwordCnsr;
@Schema(description = "사용자 구분", allowableValues = {"GNR", "ENT", "USR"}, defaultValue = "USR")
private String userSe;
@Schema(description = "조직(부서)ID")
private String orgnztId;
@Schema(description = "조직(부서)명")
private String orgnztNm;
@Schema(description = "고유아이디")
private String uniqId;
@Schema(description = "로그인 후 이동할 페이지")
private String url;
@Schema(description = "사용자 IP정보")
private String ip;
@Schema(description = "GPKI인증 DN")
private String dn;
}

View File

@ -0,0 +1,50 @@
package com.dbnt.kcscbackend.admin.committee.schedules.repository;
/**
*
* @author :
* @since : 2023. 8. 9.
* @version : 1.0
*
* @package : egovframework.com.cmm
* @filename : ResponseCode.java
* @modificationInformation
*
* <pre>
* << (Modification Information) >>
*
*
* ---------- ---------- ----------------------
* 2023. 8. 9.
* </pre>
*
*
*/
public enum ResponseCode {
SUCCESS(200, "성공했습니다."),
AUTH_ERROR(403, "인가된 사용자가 아닙니다."),
DELETE_ERROR(700, "삭제 중 내부 오류가 발생했습니다."),
SAVE_ERROR(800, "저장시 내부 오류가 발생했습니다."),
INPUT_CHECK_ERROR(900, "입력값 무결성 오류 입니다.");
private int code;
private String message;
private ResponseCode(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}

View File

@ -0,0 +1,70 @@
package com.dbnt.kcscbackend.admin.committee.schedules.service;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
*
* @author
* @since 2009.04.01
* @version 1.0
* @see
*
* <pre>
* << (Modification Information) >>
*
*
* ------- -------- ---------------------------
* 2009.04.01
*
* </pre>
*/
@Getter
@Setter
public class CmmnDetailCode implements Serializable {
private static final long serialVersionUID = -6508801327314181679L;
/*
* ID
*/
private String codeId = "";
/*
* ID
*/
private String codeIdNm = "";
/*
*
*/
private String code = "";
/*
*
*/
private String codeNm = "";
/*
*
*/
private String codeDc = "";
/*
*
*/
private String useAt = "";
/*
* ID
*/
private String frstRegisterId = "";
/*
* ID
*/
private String lastUpdusrId = "";
}

View File

@ -0,0 +1,63 @@
package com.dbnt.kcscbackend.admin.committee.schedules.service;
import com.dbnt.kcscbackend.admin.committee.schedules.repository.ComDefaultCodeVO;
import java.util.List;
import java.util.Map;
/**
*
*
* @author
* @since 2009.04.01
* @version 1.0
* @see
*
* <pre>
* << (Modification Information) >>
*
*
* ------- -------- ---------------------------
* 2009.03.11
*
* </pre>
*/
public interface EgovCmmUseService {
/**
* .
*
* @param vo
* @return List()
* @throws Exception
*/
public List<CmmnDetailCode> selectCmmCodeDetail(ComDefaultCodeVO vo) throws Exception;
/**
* ComDefaultCodeVO .
*
* @param voList
* @return Map()
* @throws Exception
*/
public Map<String, List<CmmnDetailCode>> selectCmmCodeDetails(List<?> voList) throws Exception;
/**
* .
*
* @param vo
* @return List
* @throws Exception
*/
public List<CmmnDetailCode> selectOgrnztIdDetail(ComDefaultCodeVO vo) throws Exception;
/**
* .
*
* @param vo
* @return List
* @throws Exception
*/
public List<CmmnDetailCode> selectGroupIdDetail(ComDefaultCodeVO vo) throws Exception;
}

View File

@ -0,0 +1,32 @@
package com.dbnt.kcscbackend.admin.committee.schedules.service;
import org.apache.ibatis.session.SqlSessionFactory;
import org.egovframe.rte.psl.dataaccess.EgovAbstractMapper;
import javax.annotation.Resource;
/**
* EgovComAbstractDAO.java
*
* @author
* @since 2011. 9. 23.
* @version 1.0
* @see
*
* <pre>
* << (Modification Information) >>
*
*
* ------- ------------- ----------------------
* 2011. 9. 23.
* </pre>
*/
public abstract class EgovComAbstractDAO extends EgovAbstractMapper {
@Override
@Resource(name = "egov.sqlSession")
public void setSqlSessionFactory(SqlSessionFactory sqlSession) {
super.setSqlSessionFactory(sqlSession);
}
}

View File

@ -0,0 +1,117 @@
package com.dbnt.kcscbackend.admin.committee.schedules.service;
import com.dbnt.kcscbackend.admin.committee.schedules.repository.FileVO;
import java.util.List;
import java.util.Map;
/**
* @Class Name : EgovFileMngService.java
* @Description :
* @Modification Information
*
*
* ------- ------- -------------------
* 2009. 3. 25.
*
* @author
* @since 2009. 3. 25.
* @version
* @see
*
*/
public interface EgovFileMngService {
/**
* .
*
* @param fvo
* @return
* @throws Exception
*/
public List<FileVO> selectFileInfs(FileVO fvo) throws Exception;
/**
* ( ) .
*
* @param fvo
* @throws Exception
*/
public String insertFileInf(FileVO fvo) throws Exception;
/**
* ( ) .
*
* @param fvoList
* @throws Exception
*/
public String insertFileInfs(List<?> fvoList) throws Exception;
/**
* ( ) .
*
* @param fvoList
* @throws Exception
*/
public void updateFileInfs(List<?> fvoList) throws Exception;
/**
* .
*
* @param fvoList
* @throws Exception
*/
public void deleteFileInfs(List<?> fvoList) throws Exception;
/**
* .
*
* @param fvo
* @throws Exception
*/
public void deleteFileInf(FileVO fvo) throws Exception;
/**
* .
*
* @param fvo
* @return
* @throws Exception
*/
public FileVO selectFileInf(FileVO fvo) throws Exception;
/**
* .
*
* @param fvo
* @return
* @throws Exception
*/
public int getMaxFileSN(FileVO fvo) throws Exception;
/**
* .
*
* @param fvo
* @throws Exception
*/
public void deleteAllFileInf(FileVO fvo) throws Exception;
/**
* .
*
* @param fvo
* @return
* @throws Exception
*/
public Map<String, Object> selectFileListByFileNm(FileVO fvo) throws Exception;
/**
* .
*
* @param vo
* @return
* @throws Exception
*/
public List<FileVO> selectImageFileList(FileVO vo) throws Exception;
}

View File

@ -0,0 +1,113 @@
package com.dbnt.kcscbackend.admin.committee.schedules.service;
import com.dbnt.kcscbackend.admin.committee.schedules.repository.ComDefaultVO;
import com.dbnt.kcscbackend.admin.committee.schedules.repository.IndvdlSchdulManageVO;
import com.dbnt.kcscbackend.admin.config.entity.TcCodeItem;
import com.dbnt.kcscbackend.config.common.ResultVO;
import java.util.List;
import java.util.Map;
/**
*
* @since 2009.04.10
* @see
* <pre>
* << (Modification Information) >>
*
* ------- -------- ---------------------------
* 2009.04.10
* 2011.05.31 JJY
* </pre>
* @author
* @version 1.0
* @created 09-6-2011 10:08:04
*/
public interface EgovIndvdlSchdulManageService {
/**
* () .
*
* @param indvdlSchdulManageVO - VO
* @exception Exception Exception
*/
public void deleteIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception;
/**
* () .
*
* @param indvdlSchdulManageVO - VO
* @exception Exception Exception
*/
public void insertIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception;
/**
* () .
* @return List
*
* @param indvdlSchdulManageVO - VO
* @exception Exception Exception
*/
public IndvdlSchdulManageVO selectIndvdlSchdulManageDetail(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception;
/**
* VO(model) .
* @return List
*
* @param indvdlSchdulManageVO - VO
* @exception Exception Exception
*/
public IndvdlSchdulManageVO selectIndvdlSchdulManageDetailVO(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception;
/**
* .
* @return List
*
* @param searchVO - VO
* @exception Exception Exception
*/
public List<?> selectIndvdlSchdulManageList(ComDefaultVO searchVO) throws Exception;
/**
* () () .
* @return int
*
* @param searchVO - VO
* @exception Exception Exception
*/
public int selectIndvdlSchdulManageListCnt(ComDefaultVO searchVO) throws Exception;
/**
* /
* @return List
*
* @param map - map
* @exception Exception Exception
*/
public List<?> selectIndvdlSchdulManageMainList(Map<?, ?> map) throws Exception;
/**
* Map(map) .
* @param Map(map) - Map
* @return List
*
* @param map
* @exception Exception Exception
*/
public List<?> selectIndvdlSchdulManageRetrieve(Map<?, ?> map) throws Exception;
/**
* () .
*
* @param indvdlSchdulManageVO - VO
* @exception Exception Exception
*/
public void updateIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception;
public ResultVO ScheduleInit(ResultVO resultVO) throws Exception;
public ResultVO ScheduleApiOrgApiDepthList(ResultVO resultVO, Integer paramCodeGroup) throws Exception;
}

View File

@ -0,0 +1,94 @@
package com.dbnt.kcscbackend.admin.committee.schedules.service.impl;
import com.dbnt.kcscbackend.admin.committee.schedules.repository.CmmUseDAO;
import com.dbnt.kcscbackend.admin.committee.schedules.repository.ComDefaultCodeVO;
import com.dbnt.kcscbackend.admin.committee.schedules.service.CmmnDetailCode;
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovCmmUseService;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* @Class Name : EgovCmmUseServiceImpl.java
* @Description :
* @Modification Information
*
*
* ------- ------- -------------------
* 2009. 3. 11.
*
* @author
* @since 2009. 3. 11.
* @version
* @see
*
*/
@Service("EgovCmmUseService")
public class EgovCmmUseServiceImpl extends EgovAbstractServiceImpl implements EgovCmmUseService {
@Resource(name = "cmmUseDAO")
private CmmUseDAO cmmUseDAO;
/**
* .
*
* @param vo
* @return
* @throws Exception
*/
@Override
public List<CmmnDetailCode> selectCmmCodeDetail(ComDefaultCodeVO vo) throws Exception {
return cmmUseDAO.selectCmmCodeDetail(vo);
}
/**
* ComDefaultCodeVO .
*
* @param voList
* @return
* @throws Exception
*/
@Override
public Map<String, List<CmmnDetailCode>> selectCmmCodeDetails(List<?> voList) throws Exception {
ComDefaultCodeVO vo;
Map<String, List<CmmnDetailCode>> map = new HashMap<String, List<CmmnDetailCode>>();
Iterator<?> iter = voList.iterator();
while (iter.hasNext()) {
vo = (ComDefaultCodeVO) iter.next();
map.put(vo.getCodeId(), cmmUseDAO.selectCmmCodeDetail(vo));
}
return map;
}
/**
* .
*
* @param vo
* @return List
* @throws Exception
*/
@Override
public List<CmmnDetailCode> selectOgrnztIdDetail(ComDefaultCodeVO vo) throws Exception {
return cmmUseDAO.selectOgrnztIdDetail(vo);
}
/**
* .
*
* @param vo
* @return List
* @throws Exception
*/
@Override
public List<CmmnDetailCode> selectGroupIdDetail(ComDefaultCodeVO vo) throws Exception {
return cmmUseDAO.selectGroupIdDetail(vo);
}
}

View File

@ -0,0 +1,178 @@
package com.dbnt.kcscbackend.admin.committee.schedules.service.impl;
import com.dbnt.kcscbackend.admin.committee.schedules.repository.FileManageDAO;
import com.dbnt.kcscbackend.admin.committee.schedules.repository.FileVO;
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovFileMngService;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Class Name : EgovFileMngServiceImpl.java
* @Description :
* @Modification Information
*
*
* ------- ------- -------------------
* 2009. 3. 25.
*
* @author
* @since 2009. 3. 25.
* @version
* @see
*
*/
@Service("EgovFileMngService")
public class EgovFileMngServiceImpl extends EgovAbstractServiceImpl implements EgovFileMngService {
@Resource(name = "FileManageDAO")
private FileManageDAO fileMngDAO;
/**
* .
* @param fvoList
* @throws Exception
*/
@Override
public void deleteFileInfs(List<?> fvoList) throws Exception {
fileMngDAO.deleteFileInfs(fvoList);
}
/**
* ( ) .
* @param fvo
* @return
* @throws Exception
*/
@Override
public String insertFileInf(FileVO fvo) throws Exception {
String atchFileId = fvo.getAtchFileId();
fileMngDAO.insertFileInf(fvo);
return atchFileId;
}
/**
* ( ) .
* @param fvoList
* @return
* @throws Exception
*/
@Override
public String insertFileInfs(List<?> fvoList) throws Exception {
String atchFileId = "";
if (fvoList.size() != 0) {
atchFileId = fileMngDAO.insertFileInfs(fvoList);
}
if("".equals(atchFileId)){
atchFileId = null;
}
return atchFileId;
}
/**
* .
* @param fvo
* @return
* @throws Exception
*/
@Override
public List<FileVO> selectFileInfs(FileVO fvo) throws Exception {
return fileMngDAO.selectFileInfs(fvo);
}
/**
* ( ) .
* @param fvoList
* @throws Exception
*/
@Override
public void updateFileInfs(List<?> fvoList) throws Exception {
//Delete & Insert
fileMngDAO.updateFileInfs(fvoList);
}
/**
* .
* @param fvo
* @throws Exception
*/
@Override
public void deleteFileInf(FileVO fvo) throws Exception {
fileMngDAO.deleteFileInf(fvo);
}
/**
* .
* @param fvo
* @return
* @throws Exception
*/
@Override
public FileVO selectFileInf(FileVO fvo) throws Exception {
return fileMngDAO.selectFileInf(fvo);
}
/**
* .
* @param fvo
* @return
* @throws Exception
*/
@Override
public int getMaxFileSN(FileVO fvo) throws Exception {
return fileMngDAO.getMaxFileSN(fvo);
}
/**
* .
* @param fvo
* @throws Exception
*/
@Override
public void deleteAllFileInf(FileVO fvo) throws Exception {
fileMngDAO.deleteAllFileInf(fvo);
}
/**
* .
* @param fvo
* @return
* @throws Exception
*/
@Override
public Map<String, Object> selectFileListByFileNm(FileVO fvo) throws Exception {
List<FileVO> result = fileMngDAO.selectFileListByFileNm(fvo);
int cnt = fileMngDAO.selectFileListCntByFileNm(fvo);
Map<String, Object> map = new HashMap<String, Object>();
map.put("resultList", result);
map.put("resultCnt", Integer.toString(cnt));
return map;
}
/**
* .
* @param vo
* @return
* @throws Exception
*/
@Override
public List<FileVO> selectImageFileList(FileVO vo) throws Exception {
return fileMngDAO.selectImageFileList(vo);
}
}

View File

@ -0,0 +1,195 @@
package com.dbnt.kcscbackend.admin.committee.schedules.service.impl;
import com.dbnt.kcscbackend.admin.committee.schedules.repository.ComDefaultVO;
import com.dbnt.kcscbackend.admin.committee.schedules.repository.IndvdlSchdulManageDao;
import com.dbnt.kcscbackend.admin.committee.schedules.repository.IndvdlSchdulManageVO;
import com.dbnt.kcscbackend.admin.committee.schedules.service.EgovIndvdlSchdulManageService;
import com.dbnt.kcscbackend.admin.config.entity.TcCodeItem;
import com.dbnt.kcscbackend.admin.config.repository.TcCodeItemRepository;
import com.dbnt.kcscbackend.admin.config.repository.TnCmtOrgRepository;
import com.dbnt.kcscbackend.config.common.ResultVO;
import lombok.RequiredArgsConstructor;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* ServiceImpl Class
* @since 2009.04.10
* @see
* <pre>
* << (Modification Information) >> ------- ---
* ----- --------------------------- 2009.04.10 2011.05.31
* JJY
* </pre>
* @author
* @version 1.0
* @created 09-6-2011 10:08:05
*/
@Service("egovIndvdlSchdulManageService")
@RequiredArgsConstructor
public class EgovIndvdlSchdulManageServiceImpl extends EgovAbstractServiceImpl implements EgovIndvdlSchdulManageService {
@Resource(name="indvdlSchdulManageDao")
private IndvdlSchdulManageDao dao;
private final TcCodeItemRepository tcCodeItemRepository;
private final TnCmtOrgRepository tnCmtOrgRepository;
/**
* /
* @param map - map
* @return List
* @throws Exception
*/
@Override
public List<?> selectIndvdlSchdulManageMainList(Map<?, ?> map) throws Exception{
return dao.selectIndvdlSchdulManageMainList(map);
}
/**
* Map(map) .
* @param map
* @return
* @throws Exception
*/
@Override
public List<?> selectIndvdlSchdulManageRetrieve(Map<?, ?> map) throws Exception{
return dao.selectIndvdlSchdulManageRetrieve(map);
}
/**
* VO(model) .
* @param indvdlSchdulManageVO - VO
* @return List
* @throws Exception
*/
@Override
public IndvdlSchdulManageVO selectIndvdlSchdulManageDetailVO(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception{
return dao.selectIndvdlSchdulManageDetailVO(indvdlSchdulManageVO);
}
/**
* .
* @param searchVO - VO
* @return List
* @throws Exception
*/
@Override
public List<?> selectIndvdlSchdulManageList(ComDefaultVO searchVO) throws Exception{
return dao.selectIndvdlSchdulManageList(searchVO);
}
/**
* () .
* @param indvdlSchdulManageVO - VO
* @return
* @throws Exception
*/
@Override
public IndvdlSchdulManageVO selectIndvdlSchdulManageDetail(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception{
return dao.selectIndvdlSchdulManageDetail(indvdlSchdulManageVO);
}
/**
* () () .
* @param searchVO - VO
* @return int
* @throws Exception
*/
@Override
public int selectIndvdlSchdulManageListCnt(ComDefaultVO searchVO) throws Exception{
return dao.selectIndvdlSchdulManageListCnt(searchVO);
}
/**
* () .
* @param indvdlSchdulManageVO - VO
* @throws Exception
*/
@Override
public void insertIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception {
}
/**
* () .
* @param indvdlSchdulManageVO - VO
* @throws Exception
*/
@Override
public void updateIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception{
dao.updateIndvdlSchdulManage(indvdlSchdulManageVO);
}
/**
* () .
* @param indvdlSchdulManageVO - VO
* @throws Exception
*/
@Override
public void deleteIndvdlSchdulManage(IndvdlSchdulManageVO indvdlSchdulManageVO) throws Exception{
dao.deleteIndvdlSchdulManage(indvdlSchdulManageVO);
}
@Override
public ResultVO ScheduleInit(ResultVO resultVO) throws Exception {
Map<String, Object> resultMap = new HashMap<String, Object>();
List<String> listCodes = tcCodeItemRepository.findByGrpCdAndUseYnOrderByGrpOrder("EVT_TYPE", "Y").stream()
.map(lc -> lc.getItemNm())
.collect(Collectors.toList());
List<String> listSubOrg = tnCmtOrgRepository.findByUseYnAndUpCmtSeqOrderByCmtOrder("Y", 3).stream()
.map(lc -> lc.getCmtNm())
.collect(Collectors.toList());
List<String> listTopOrg = tnCmtOrgRepository.findByUseYnAndUpCmtSeqOrderByCmtOrder("Y", 2).stream()
.map(lc -> lc.getCmtNm())
.collect(Collectors.toList());
resultMap.put("listCodes", listCodes);
resultMap.put("listSubOrg", listSubOrg);
resultMap.put("listTopOrg", listTopOrg);
resultVO.setResult(resultMap);
return resultVO;
}
@Override
public ResultVO ScheduleApiOrgApiDepthList(ResultVO resultVO, Integer paramCodeGroup) throws Exception {
Map<String, Object> resultMap = new HashMap<String, Object>();
List<String> listCodes = tcCodeItemRepository.findByGrpCdAndUseYnOrderByGrpOrder("EVT_TYPE", "Y").stream()
.map(lc -> lc.getItemNm())
.collect(Collectors.toList());
List<String> listSubOrg = tnCmtOrgRepository.findByUseYnAndUpCmtSeqOrderByCmtOrder("Y", 3).stream()
.map(lc -> lc.getCmtNm())
.collect(Collectors.toList());
List<String> listTopOrg = tnCmtOrgRepository.findByUseYnAndUpCmtSeqOrderByCmtOrder("Y", 2).stream()
.map(lc -> lc.getCmtNm())
.collect(Collectors.toList());
resultMap.put("listCodes", listCodes);
resultMap.put("listSubOrg", listSubOrg);
resultMap.put("listTopOrg", listTopOrg);
resultVO.setResult(resultMap);
return resultVO;
}
}

View File

@ -0,0 +1,96 @@
package com.dbnt.kcscbackend.admin.committee.schedules.util;
import org.egovframe.rte.fdl.idgnr.impl.EgovTableIdGnrServiceImpl;
import org.egovframe.rte.fdl.idgnr.impl.strategy.EgovIdGnrStrategyImpl;
import javax.sql.DataSource;
/**
* @ClassName : EgovIdGnrBuilder.java
* @Description : IdGen builder
*
* @author :
* @since : 2021. 7. 20
* @version : 1.0
*
* <pre>
* << (Modification Information) >>
*
*
* ------------- ------------ ---------------------
* 2021. 7. 20
* </pre>
*
*/
public class EgovIdGnrBuilder {
// TODO : 기본값 설정, 예외처리 필요
private DataSource dataSource;
private EgovIdGnrStrategyImpl egovIdGnrStrategyImpl;
private String preFix;
private int cipers;
private char fillChar;
private int blockSize;
private String table;
private String tableName;
public EgovIdGnrBuilder setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
return this;
}
public EgovIdGnrBuilder setEgovIdGnrStrategyImpl(EgovIdGnrStrategyImpl egovIdGnrStrategyImpl) {
this.egovIdGnrStrategyImpl = egovIdGnrStrategyImpl;
return this;
}
public EgovIdGnrBuilder setPreFix(String preFix) {
this.preFix = preFix;
return this;
}
public EgovIdGnrBuilder setCipers(int cipers) {
this.cipers = cipers;
return this;
}
public EgovIdGnrBuilder setFillChar(char fillChar) {
this.fillChar = fillChar;
return this;
}
public EgovIdGnrBuilder setBlockSize(int blockSize) {
this.blockSize = blockSize;
return this;
}
public EgovIdGnrBuilder setTable(String table) {
this.table = table;
return this;
}
public EgovIdGnrBuilder setTableName(String tableName) {
this.tableName = tableName;
return this;
}
public EgovTableIdGnrServiceImpl build() {
EgovTableIdGnrServiceImpl egovTableIdGnrServiceImpl = new EgovTableIdGnrServiceImpl();
egovTableIdGnrServiceImpl.setDataSource(dataSource);
if(egovIdGnrStrategyImpl != null) {
egovIdGnrStrategyImpl = new EgovIdGnrStrategyImpl();
egovIdGnrStrategyImpl.setPrefix(preFix);
egovIdGnrStrategyImpl.setCipers(cipers);
egovIdGnrStrategyImpl.setFillChar(fillChar);
egovTableIdGnrServiceImpl.setStrategy(egovIdGnrStrategyImpl);
}
egovTableIdGnrServiceImpl.setBlockSize(blockSize);
egovTableIdGnrServiceImpl.setTable(table);
egovTableIdGnrServiceImpl.setTableName(tableName);
return egovTableIdGnrServiceImpl;
}
}

View File

@ -0,0 +1,888 @@
/**
* @Class Name : EgovStringUtil.java
* @Description :
* @Modification Information
*
*
* ------- -------- ---------------------------
* 2009.01.13
* 2009.02.13
*
* @author
* @since 2009. 01. 13
* @version 1.0
* @see
*
*/
package com.dbnt.kcscbackend.admin.committee.schedules.util;
/*
* Copyright 2001-2006 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the ";License&quot;);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS"; BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.security.SecureRandom;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Locale;
public class EgovStringUtil {
/**
* <code>""</code>.
*/
public static final String EMPTY = "";
/**
*
*/
public static SecureRandom rnd = new SecureRandom();
/**
* <p>Padding </p>
*/
// private static final int PAD_LIMIT = 8192;
/**
* <p>An array of <code>String</code>s used for padding.</p>
* <p>Used for efficient space padding. The length of each String expands as needed.</p>
*/
/*
private static final String[] PADDING = new String[Character.MAX_VALUE];
static {
// space padding is most common, start with 64 chars
PADDING[32] = " ";
}
*/
/**
* .
* @param source
* @param output
* @param slength
* @return
*/
public static String cutString(String source, String output, int slength) {
String returnVal = null;
if (source != null) {
if (source.length() > slength) {
returnVal = source.substring(0, slength) + output;
} else {
returnVal = source;
}
}
return returnVal;
}
/**
*
* @param source
* @param slength
* @return
*/
public static String cutString(String source, int slength) {
String result = null;
if (source != null) {
if (source.length() > slength) {
result = source.substring(0, slength);
} else {
result = source;
}
}
return result;
}
/**
* <p>
* String ("") null .
* </p>
*
* <pre>
* StringUtil.isEmpty(null) = true
* StringUtil.isEmpty("") = true
* StringUtil.isEmpty(" ") = false
* StringUtil.isEmpty("bob") = false
* StringUtil.isEmpty(" bob ") = false
* </pre>
*
* @param str - null
* @return <code>true</code> - String null
*/
public static boolean isEmpty(String str) {
return str == null || str.length() == 0;
}
/**
* <p> (char) .</p>
*
* <pre>
* StringUtil.remove(null, *) = null
* StringUtil.remove("", *) = ""
* StringUtil.remove("queued", 'u') = "qeed"
* StringUtil.remove("queued", 'z') = "queued"
* </pre>
*
* @param str
* @param remove
* @return . null null
*/
public static String remove(String str, char remove) {
if (isEmpty(str) || str.indexOf(remove) == -1) {
return str;
}
char[] chars = str.toCharArray();
int pos = 0;
for (int i = 0; i < chars.length; i++) {
if (chars[i] != remove) {
chars[pos++] = chars[i];
}
}
return new String(chars, 0, pos);
}
/**
* <p> character(,) .</p>
*
* <pre>
* StringUtil.removeCommaChar(null) = null
* StringUtil.removeCommaChar("") = ""
* StringUtil.removeCommaChar("asdfg,qweqe") = "asdfgqweqe"
* </pre>
*
* @param str
* @return " , "
* null null
*/
public static String removeCommaChar(String str) {
return remove(str, ',');
}
/**
* <p> character(-) .</p>
*
* <pre>
* StringUtil.removeMinusChar(null) = null
* StringUtil.removeMinusChar("") = ""
* StringUtil.removeMinusChar("a-sdfg-qweqe") = "asdfgqweqe"
* </pre>
*
* @param str
* @return " - "
* null null
*/
public static String removeMinusChar(String str) {
return remove(str, '-');
}
/**
*
* @param source
* @param subject
* @param object
* @return sb.toString()
*/
public static String replace(String source, String subject, String object) {
StringBuffer rtnStr = new StringBuffer();
String preStr = "";
String nextStr = source;
String srcStr = source;
while (srcStr.indexOf(subject) >= 0) {
preStr = srcStr.substring(0, srcStr.indexOf(subject));
nextStr = srcStr.substring(srcStr.indexOf(subject) + subject.length(), srcStr.length());
srcStr = nextStr;
rtnStr.append(preStr).append(object);
}
rtnStr.append(nextStr);
return rtnStr.toString();
}
/**
*
* @param source
* @param subject
* @param object
* @return sb.toString() / source
*/
public static String replaceOnce(String source, String subject, String object) {
StringBuffer rtnStr = new StringBuffer();
String preStr = "";
String nextStr = source;
if (source.indexOf(subject) >= 0) {
preStr = source.substring(0, source.indexOf(subject));
nextStr = source.substring(source.indexOf(subject) + subject.length(), source.length());
rtnStr.append(preStr).append(object).append(nextStr);
return rtnStr.toString();
} else {
return source;
}
}
/**
* <code>subject</code> object .
*
* @param source
* @param subject
* @param object
* @return sb.toString()
*/
public static String replaceChar(String source, String subject, String object) {
StringBuffer rtnStr = new StringBuffer();
String preStr = "";
String nextStr = source;
String srcStr = source;
char chA;
for (int i = 0; i < subject.length(); i++) {
chA = subject.charAt(i);
if (srcStr.indexOf(chA) >= 0) {
preStr = srcStr.substring(0, srcStr.indexOf(chA));
nextStr = srcStr.substring(srcStr.indexOf(chA) + 1, srcStr.length());
srcStr = rtnStr.append(preStr).append(object).append(nextStr).toString();
}
}
return srcStr;
}
/**
* <p><code>str</code> <code>searchStr</code> (index) .</p>
*
* <p> <code>null</code> <code>-1</code> .</p>
*
* <pre>
* StringUtil.indexOf(null, *) = -1
* StringUtil.indexOf(*, null) = -1
* StringUtil.indexOf("", "") = 0
* StringUtil.indexOf("aabaabaa", "a") = 0
* StringUtil.indexOf("aabaabaa", "b") = 2
* StringUtil.indexOf("aabaabaa", "ab") = 1
* StringUtil.indexOf("aabaabaa", "") = 0
* </pre>
*
* @param str
* @param searchStr
* @return null -1
*/
public static int indexOf(String str, String searchStr) {
if (str == null || searchStr == null) {
return -1;
}
return str.indexOf(searchStr);
}
/**
* <p> decode .
* <code>sourStr</code> <code>compareStr</code>
* <code>returStr</code> , <code>defaultStr</code> .
* </p>
*
* <pre>
* StringUtil.decode(null, null, "foo", "bar")= "foo"
* StringUtil.decode("", null, "foo", "bar") = "bar"
* StringUtil.decode(null, "", "foo", "bar") = "bar"
* StringUtil.decode("하이", "하이", null, "bar") = null
* StringUtil.decode("하이", "하이 ", "foo", null) = null
* StringUtil.decode("하이", "하이", "foo", "bar") = "foo"
* StringUtil.decode("하이", "하이 ", "foo", "bar") = "bar"
* </pre>
*
* @param sourceStr
* @param compareStr
* @param returnStr sourceStr compareStr
* @param defaultStr sourceStr compareStr
* @return sourceStr compareStr (equal) returnStr ,
* <br/> defaultStr .
*/
public static String decode(String sourceStr, String compareStr, String returnStr, String defaultStr) {
if (sourceStr == null && compareStr == null) {
return returnStr;
}
else if (sourceStr != null && sourceStr.trim().equals(compareStr)) {
return returnStr;
}
return defaultStr;
}
/**
* <p> decode .
* <code>sourStr</code> <code>compareStr</code>
* <code>returStr</code> , <code>sourceStr</code> .
* </p>
*
* <pre>
* StringUtil.decode(null, null, "foo") = "foo"
* StringUtil.decode("", null, "foo") = ""
* StringUtil.decode(null, "", "foo") = null
* StringUtil.decode("하이", "하이", "foo") = "foo"
* StringUtil.decode("하이", "하이 ", "foo") = "하이"
* StringUtil.decode("하이", "바이", "foo") = "하이"
* </pre>
*
* @param sourceStr
* @param compareStr
* @param returnStr sourceStr compareStr
* @return sourceStr compareStr (equal) returnStr ,
* <br/> sourceStr .
*/
public static String decode(String sourceStr, String compareStr, String returnStr) {
return decode(sourceStr, compareStr, returnStr, sourceStr);
}
/**
* null null ""
* @param object
* @return resultVal
*/
public static String isNullToString(Object object) {
String string = "";
if (object != null) {
string = object.toString().trim();
}
return string;
}
/**
*<pre>
* String null &quot;&quot; .
* &#064;param src null String .
* &#064;return String null &quot;&quot; String .
*</pre>
*/
public static String nullConvert(Object src) {
//if (src != null && src.getClass().getName().equals("java.math.BigDecimal")) {
if (src != null && src instanceof BigDecimal) {
return ((BigDecimal)src).toString();
}
if (src == null || src.equals("null")) {
return "";
} else {
return ((String)src).trim();
}
}
/**
*<pre>
* String null &quot;&quot; .
* &#064;param src null String .
* &#064;return String null &quot;&quot; String .
*</pre>
*/
public static String nullConvert(String src) {
if (src == null || src.equals("null") || "".equals(src) || " ".equals(src)) {
return "";
} else {
return src.trim();
}
}
/**
*<pre>
* String null &quot;0&quot; .
* &#064;param src null String .
* &#064;return String null &quot;0&quot; String .
*</pre>
*/
public static int zeroConvert(Object src) {
if (src == null || src.equals("null")) {
return 0;
} else {
return Integer.parseInt(((String)src).trim());
}
}
/**
*<pre>
* String null &quot;&quot; .
* &#064;param src null String .
* &#064;return String null &quot;&quot; String .
*</pre>
*/
public static int zeroConvert(String src) {
if (src == null || src.equals("null") || "".equals(src) || " ".equals(src)) {
return 0;
} else {
return Integer.parseInt(src.trim());
}
}
/**
* <p> {@link Character#isWhitespace(char)}
* .</p>
*
* <pre>
* StringUtil.removeWhitespace(null) = null
* StringUtil.removeWhitespace("") = ""
* StringUtil.removeWhitespace("abc") = "abc"
* StringUtil.removeWhitespace(" ab c ") = "abc"
* </pre>
*
* @param str
* @return the , null <code>null</code>
*/
public static String removeWhitespace(String str) {
if (isEmpty(str)) {
return str;
}
int sz = str.length();
char[] chs = new char[sz];
int count = 0;
for (int i = 0; i < sz; i++) {
if (!Character.isWhitespace(str.charAt(i))) {
chs[count++] = str.charAt(i);
}
}
if (count == sz) {
return str;
}
return new String(chs, 0, count);
}
/**
* Html
*
* @param strString
* @return HTML
*/
public static String checkHtmlView(String strString) {
String strNew = "";
StringBuffer strTxt = new StringBuffer("");
char chrBuff;
int len = strString.length();
for (int i = 0; i < len; i++) {
chrBuff = strString.charAt(i);
switch (chrBuff) {
case '<':
strTxt.append("&lt;");
break;
case '>':
strTxt.append("&gt;");
break;
case '"':
strTxt.append("&quot;");
break;
case 10:
strTxt.append("<br>");
break;
case ' ':
strTxt.append("&nbsp;");
break;
//case '&' :
//strTxt.append("&amp;");
//break;
default:
strTxt.append(chrBuff);
}
}
strNew = strTxt.toString();
return strNew;
}
/**
* .
* @param source
* @param separator
* @return result
*/
public static String[] split(String source, String separator) throws NullPointerException {
String[] returnVal = null;
int cnt = 1;
int index = source.indexOf(separator);
int index0 = 0;
while (index >= 0) {
cnt++;
index = source.indexOf(separator, index + 1);
}
returnVal = new String[cnt];
cnt = 0;
index = source.indexOf(separator);
while (index >= 0) {
returnVal[cnt] = source.substring(index0, index);
index0 = index + 1;
index = source.indexOf(separator, index + 1);
cnt++;
}
returnVal[cnt] = source.substring(index0);
return returnVal;
}
/**
* <p>{@link String#toLowerCase()} .</p>
*
* <pre>
* StringUtil.lowerCase(null) = null
* StringUtil.lowerCase("") = ""
* StringUtil.lowerCase("aBc") = "abc"
* </pre>
*
* @param str
* @return , null <code>null</code>
*/
public static String lowerCase(String str) {
if (str == null) {
return null;
}
return str.toLowerCase();
}
/**
* <p>{@link String#toUpperCase()} .</p>
*
* <pre>
* StringUtil.upperCase(null) = null
* StringUtil.upperCase("") = ""
* StringUtil.upperCase("aBc") = "ABC"
* </pre>
*
* @param str
* @return , null <code>null</code>
*/
public static String upperCase(String str) {
if (str == null) {
return null;
}
return str.toUpperCase();
}
/**
* <p> String (stripChars) .</p>
*
* <pre>
* StringUtil.stripStart(null, *) = null
* StringUtil.stripStart("", *) = ""
* StringUtil.stripStart("abc", "") = "abc"
* StringUtil.stripStart("abc", null) = "abc"
* StringUtil.stripStart(" abc", null) = "abc"
* StringUtil.stripStart("abc ", null) = "abc "
* StringUtil.stripStart(" abc ", null) = "abc "
* StringUtil.stripStart("yxabc ", "xyz") = "abc "
* </pre>
*
* @param str
* @param stripChars
* @return , null <code>null</code>
*/
public static String stripStart(String str, String stripChars) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return str;
}
int start = 0;
if (stripChars == null) {
while ((start != strLen) && Character.isWhitespace(str.charAt(start))) {
start++;
}
} else if (stripChars.length() == 0) {
return str;
} else {
while ((start != strLen) && (stripChars.indexOf(str.charAt(start)) != -1)) {
start++;
}
}
return str.substring(start);
}
/**
* <p> String (stripChars) .</p>
*
* <pre>
* StringUtil.stripEnd(null, *) = null
* StringUtil.stripEnd("", *) = ""
* StringUtil.stripEnd("abc", "") = "abc"
* StringUtil.stripEnd("abc", null) = "abc"
* StringUtil.stripEnd(" abc", null) = " abc"
* StringUtil.stripEnd("abc ", null) = "abc"
* StringUtil.stripEnd(" abc ", null) = " abc"
* StringUtil.stripEnd(" abcyx", "xyz") = " abc"
* </pre>
*
* @param str
* @param stripChars
* @return , null <code>null</code>
*/
public static String stripEnd(String str, String stripChars) {
int end;
if (str == null || (end = str.length()) == 0) {
return str;
}
if (stripChars == null) {
while ((end != 0) && Character.isWhitespace(str.charAt(end - 1))) {
end--;
}
} else if (stripChars.length() == 0) {
return str;
} else {
while ((end != 0) && (stripChars.indexOf(str.charAt(end - 1)) != -1)) {
end--;
}
}
return str.substring(0, end);
}
/**
* <p> String , (stripChars) .</p>
*
* <pre>
* StringUtil.strip(null, *) = null
* StringUtil.strip("", *) = ""
* StringUtil.strip("abc", null) = "abc"
* StringUtil.strip(" abc", null) = "abc"
* StringUtil.strip("abc ", null) = "abc"
* StringUtil.strip(" abc ", null) = "abc"
* StringUtil.strip(" abcyx", "xyz") = " abc"
* </pre>
*
* @param str
* @param stripChars
* @return , null <code>null</code>
*/
public static String strip(String str, String stripChars) {
if (isEmpty(str)) {
return str;
}
String srcStr = str;
srcStr = stripStart(srcStr, stripChars);
return stripEnd(srcStr, stripChars);
}
/**
* .
* @param source
* @param separator
* @param arraylength
* @return
*/
public static String[] split(String source, String separator, int arraylength) throws NullPointerException {
String[] returnVal = new String[arraylength];
int cnt = 0;
int index0 = 0;
int index = source.indexOf(separator);
while (index >= 0 && cnt < (arraylength - 1)) {
returnVal[cnt] = source.substring(index0, index);
index0 = index + 1;
index = source.indexOf(separator, index + 1);
cnt++;
}
returnVal[cnt] = source.substring(index0);
if (cnt < (arraylength - 1)) {
for (int i = cnt + 1; i < arraylength; i++) {
returnVal[i] = "";
}
}
return returnVal;
}
/**
* A Z
*
* @param startChr
* -
* @param endChr
* -
* @return
* @exception MyException
* @see
*/
public static String getRandomStr(char startChr, char endChr) {
int randomInt;
String randomStr = null;
// 시작문자 및 종료문자를 아스키숫자로 변환한다.
int startInt = Integer.valueOf(startChr);
int endInt = Integer.valueOf(endChr);
// 시작문자열이 종료문자열보가 클경우
if (startInt > endInt) {
throw new IllegalArgumentException("Start String: " + startChr + " End String: " + endChr);
}
do {
// 시작문자 및 종료문자 중에서 랜덤 숫자를 발생시킨다.
randomInt = rnd.nextInt(endInt + 1);
} while (randomInt < startInt); // 입력받은 문자 'A'(65)보다 작으면 다시 랜덤 숫자 발생.
// 랜덤 숫자를 문자로 변환 후 스트링으로 다시 변환
randomStr = (char)randomInt + "";
// 랜덤문자열를 리턴
return randomStr;
}
/**
* (EUC-KR[KSC5601],UTF-8..)
* String temp = new String(.getBytes("바꾸기전 인코딩"),"바꿀 인코딩");
* String temp = new String(.getBytes("8859_1"),"KSC5601"); => UTF-8
* EUC-KR
*
* @param srcString
* -
* @param srcCharsetNm
* - CharsetNm
* @param charsetNm
* - CharsetNm
* @return ()
* @exception MyException
* @see
*/
public static String getEncdDcd(String srcString, String srcCharsetNm, String cnvrCharsetNm) {
String rtnStr = null;
if (srcString == null) {
return null;
}
try {
rtnStr = new String(srcString.getBytes(srcCharsetNm), cnvrCharsetNm);
} catch (UnsupportedEncodingException e) {
rtnStr = null;
}
return rtnStr;
}
/**
* ('<' -> & lT)
* @param srcString - '<'
* @return ('<' -> "&lt"
* @exception MyException
* @see
*/
public static String getSpclStrCnvr(String srcString) {
String rtnStr = null;
StringBuffer strTxt = new StringBuffer("");
char chrBuff;
int len = srcString.length();
for (int i = 0; i < len; i++) {
chrBuff = srcString.charAt(i);
switch (chrBuff) {
case '<':
strTxt.append("&lt;");
break;
case '>':
strTxt.append("&gt;");
break;
case '&':
strTxt.append("&amp;");
break;
default:
strTxt.append(chrBuff);
}
}
rtnStr = strTxt.toString();
return rtnStr;
}
/**
* 17TIMESTAMP
*
* @param
* @return Timestamp
* @exception MyException
* @see
*/
public static String getTimeStamp() {
String rtnStr = null;
// 문자열로 변환하기 위한 패턴 설정(년도-월-일 시:분:초:초(자정이후 초))
String pattern = "yyyyMMddhhmmssSSS";
SimpleDateFormat sdfCurrent = new SimpleDateFormat(pattern, Locale.KOREA);
Timestamp ts = new Timestamp(System.currentTimeMillis());
rtnStr = sdfCurrent.format(ts.getTime());
return rtnStr;
}
/**
* html
*
* @param srcString
* @return String
* @exception Exception
* @see
*/
public static String getHtmlStrCnvr(String srcString) {
String tmpString = srcString;
tmpString = tmpString.replaceAll("&lt;", "<");
tmpString = tmpString.replaceAll("&gt;", ">");
tmpString = tmpString.replaceAll("&amp;", "&");
tmpString = tmpString.replaceAll("&nbsp;", " ");
tmpString = tmpString.replaceAll("&apos;", "\'");
tmpString = tmpString.replaceAll("&quot;", "\"");
return tmpString;
}
/**
* <p> character(-) .</p>
*
* <pre>
* StringUtil.addMinusChar("20100901") = "2010-09-01"
* </pre>
*
* @param date
* @return " - "
*/
public static String addMinusChar(String date) {
if (date.length() == 8) {
return date.substring(0, 4).concat("-").concat(date.substring(4, 6)).concat("-")
.concat(date.substring(6, 8));
} else {
return "";
}
}
}

View File

@ -1,8 +1,11 @@
package com.dbnt.kcscbackend.admin.config;
import com.dbnt.kcscbackend.admin.config.entity.TcCodeGrp;
import com.dbnt.kcscbackend.admin.config.entity.TcCodeItem;
import com.dbnt.kcscbackend.admin.config.service.AdminConfigService;
import com.dbnt.kcscbackend.auth.entity.LoginVO;
import com.dbnt.kcscbackend.config.common.BaseController;
import com.dbnt.kcscbackend.config.common.ResponseCode;
import com.dbnt.kcscbackend.config.common.ResultVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
@ -10,10 +13,13 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
@ -34,7 +40,7 @@ public class AdminConfigController extends BaseController {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.GET, value = "/code-grp", consumes = MediaType.APPLICATION_JSON_VALUE)
@RequestMapping(method = RequestMethod.GET, value = "/code-grp")
public ResultVO getCodeGrp() throws Exception{
ResultVO resultVO = new ResultVO();
Map<String, Object> resultMap = new HashMap<>();
@ -43,6 +49,80 @@ public class AdminConfigController extends BaseController {
return resultVO;
}
@Operation(
summary = "기본코드 그룹 저장",
description = "기본코드 그룹 저장",
tags = {"AdminConfigController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "저장 성공"),
@ApiResponse(responseCode = "303", description = "만료된 토큰"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.POST, value = "/code-grp", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResultVO addCodeGrp(@RequestBody TcCodeGrp codeGrp, @AuthenticationPrincipal LoginVO user) throws Exception{
ResultVO resultVO = new ResultVO();
if(user == null){
resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode());
}else{
if(!user.getUserSe().equals("ACC_TP01")){
resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode());
resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage());
}else if(codeGrp.getGrpCd().isEmpty()){
resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode());
resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage());
}else{
codeGrp.setFrstCrtDt(LocalDateTime.now());
codeGrp.setFrstCrtId(user.getId());
codeGrp.setUseYn("Y");
String result = adminConfigService.addCodeGrp(codeGrp);
if(result.equals("isSaved")){
resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode());
resultVO.setResultMessage("중복되는 코드그룹이 있습니다.");
}else{
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
}
}
}
return resultVO;
}
@Operation(
summary = "기본코드 그룹 수정",
description = "기본코드 그룹 수정",
tags = {"AdminConfigController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "수정 성공"),
@ApiResponse(responseCode = "303", description = "만료된 토큰"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.PUT, value = "/code-grp", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResultVO modifyCodeGrp(@RequestBody TcCodeGrp codeGrp, @AuthenticationPrincipal LoginVO user) throws Exception{
ResultVO resultVO = new ResultVO();
if(user == null){
resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode());
}else{
if(!user.getUserSe().equals("ACC_TP01")){
resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode());
resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage());
}else if(codeGrp.getGrpCd().isEmpty()){
resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode());
resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage());
}else{
codeGrp.setLastChgDt(LocalDateTime.now());
codeGrp.setLastChgId(user.getId());
String result = adminConfigService.modifyCodeGrp(codeGrp);
if(result.equals("modified")){
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
}else{
resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode());
}
}
}
return resultVO;
}
@Operation(
summary = "기본코드 아이템 조회",
description = "기본코드 아이템 조회",
@ -52,12 +132,87 @@ public class AdminConfigController extends BaseController {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.GET, value = "/code-item", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResultVO getCodeItem(TcCodeGrp param) throws Exception{
@RequestMapping(method = RequestMethod.GET, value = "/code-item")
public ResultVO getCodeItem(String grpCd) throws Exception{
ResultVO resultVO = new ResultVO();
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("codeItemList", adminConfigService.selectCodeItemList(param.getGrpCd()));
resultMap.put("codeItemList", adminConfigService.selectCodeItemList(grpCd));
resultVO.setResult(resultMap);
return resultVO;
}
@Operation(
summary = "기본코드 아이템 저장",
description = "기본코드 아이템 저장",
tags = {"AdminConfigController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "저장 성공"),
@ApiResponse(responseCode = "303", description = "만료된 토큰"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.POST, value = "/code-item", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResultVO addCodeItem(@RequestBody TcCodeItem codeItem, @AuthenticationPrincipal LoginVO user) throws Exception{
ResultVO resultVO = new ResultVO();
if(user == null){
resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode());
}else{
if(!user.getUserSe().equals("ACC_TP01")){
resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode());
resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage());
}else if(codeItem.getGrpCd()==null || codeItem.getGrpCd().isEmpty()){
resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode());
resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage());
}else{
codeItem.setFrstCrtDt(LocalDateTime.now());
codeItem.setFrstCrtId(user.getId());
codeItem.setUseYn("Y");
String result = adminConfigService.addCodeItem(codeItem);
if(result.equals("isSaved")){
resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode());
resultVO.setResultMessage("중복되는 코드가 있습니다.");
}else{
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
}
}
}
return resultVO;
}
@Operation(
summary = "기본코드 아이템 수정",
description = "기본코드 아이템 수정",
tags = {"AdminConfigController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "수정 성공"),
@ApiResponse(responseCode = "303", description = "만료된 토큰"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.PUT, value = "/code-item", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResultVO modifyCodeItem(@RequestBody TcCodeItem codeItem, @AuthenticationPrincipal LoginVO user) throws Exception{
ResultVO resultVO = new ResultVO();
if(user == null){
resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode());
}else{
if(!user.getUserSe().equals("ACC_TP01")){
resultVO.setResultCode(ResponseCode.AUTH_ERROR.getCode());
resultVO.setResultMessage(ResponseCode.AUTH_ERROR.getMessage());
}else if(codeItem.getGrpCd().isEmpty()){
resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode());
resultVO.setResultMessage(ResponseCode.INPUT_CHECK_ERROR.getMessage());
}else{
codeItem.setLastChgDt(LocalDateTime.now());
codeItem.setLastChgId(user.getId());
String result = adminConfigService.modifyCodeItem(codeItem);
if(result.equals("modified")){
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
}else{
resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode());
}
}
}
return resultVO;
}
}

View File

@ -0,0 +1,68 @@
package com.dbnt.kcscbackend.admin.config.entity;
import lombok.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDateTime;
@Getter
@Setter
@Entity
@NoArgsConstructor
@DynamicInsert
@DynamicUpdate
@Table(name = "tn_cmt_org")
public class TnCmtOrg {
@Id
@Column(name = "cmt_seq")
private Integer cmtSeq;
@Column(name = "cmt_nm")
private String cmtNm;
@Column(name = "cmt_type")
private String cmtType;
@Column(name = "cmt_desc")
private String cmtDesc;
@Column(name = "up_cmt_seq")
private Integer upCmtSeq;
@Column(name = "cmt_order")
private Integer cmtOrder;
@Column(name = "frst_crt_id")
private String frstCrtId;
@Column(name = "frst_crt_dt")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime frstCrtDt;
@Column(name = "last_chg_id")
private String lastChgId;
@Column(name = "last_chg_dt")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime lastChgDt;
@Column(name = "use_yn")
private String useYn;
@Column(name = "old_seq")
private Integer oldSeq;
@Embeddable
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class TnCmtOrgId implements Serializable {
private String cmtSeq;
}
}

View File

@ -1,7 +0,0 @@
package com.dbnt.kcscbackend.admin.config.mapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface AdminConfigMapper {
}

View File

@ -3,5 +3,8 @@ package com.dbnt.kcscbackend.admin.config.repository;
import com.dbnt.kcscbackend.admin.config.entity.TcCodeGrp;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface TcCodeGrpRepository extends JpaRepository<TcCodeGrp, String> {
List<TcCodeGrp> findByUseYn(String useYn);
}

View File

@ -6,5 +6,5 @@ import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface TcCodeItemRepository extends JpaRepository<TcCodeItem, TcCodeItem.TcCodeItemId> {
List<TcCodeItem> findByGrpCdOrderByGrpOrder(String grpCd);
List<TcCodeItem> findByGrpCdAndUseYnOrderByGrpOrder(String grpCd, String useYn);
}

View File

@ -0,0 +1,11 @@
package com.dbnt.kcscbackend.admin.config.repository;
import com.dbnt.kcscbackend.admin.config.entity.TcCodeItem;
import com.dbnt.kcscbackend.admin.config.entity.TnCmtOrg;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface TnCmtOrgRepository extends JpaRepository<TnCmtOrg, TnCmtOrg.TnCmtOrgId> {
List<TnCmtOrg> findByUseYnAndUpCmtSeqOrderByCmtOrder(String useYn, Integer upCmtSeq);
}

View File

@ -2,12 +2,12 @@ package com.dbnt.kcscbackend.admin.config.service;
import com.dbnt.kcscbackend.admin.config.entity.TcCodeGrp;
import com.dbnt.kcscbackend.admin.config.entity.TcCodeItem;
import com.dbnt.kcscbackend.admin.config.mapper.AdminConfigMapper;
import com.dbnt.kcscbackend.admin.config.repository.TcCodeGrpRepository;
import com.dbnt.kcscbackend.admin.config.repository.TcCodeItemRepository;
import lombok.RequiredArgsConstructor;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@ -17,13 +17,82 @@ public class AdminConfigService extends EgovAbstractServiceImpl {
private final TcCodeGrpRepository codeGrpRepository;
private final TcCodeItemRepository codeItemRepository;
private final AdminConfigMapper adminConfigMapper;
public List<TcCodeGrp> selectCodeGrpList(){
return codeGrpRepository.findAll();
return codeGrpRepository.findByUseYn("Y");
}
@Transactional
public String addCodeGrp(TcCodeGrp codeGrp) {
TcCodeGrp savedGrp = codeGrpRepository.findById(codeGrp.getGrpCd()).orElse(null);
if(savedGrp!=null){
if(savedGrp.getUseYn().equals("Y")){
return "isSaved";
}else{
savedGrp.setGrpCdNm(codeGrp.getGrpCdNm());
savedGrp.setUseYn("Y");
codeGrpRepository.save(savedGrp);
return savedGrp.getGrpCd();
}
}else{
codeGrpRepository.save(codeGrp);
return codeGrp.getGrpCd();
}
}
@Transactional
public String modifyCodeGrp(TcCodeGrp codeGrp) {
TcCodeGrp savedGrp = codeGrpRepository.findById(codeGrp.getGrpCd()).orElse(null);
if (savedGrp != null) {
savedGrp.setGrpCdNm(codeGrp.getGrpCdNm());
savedGrp.setLastChgId(codeGrp.getLastChgId());
savedGrp.setLastChgDt(codeGrp.getLastChgDt());
savedGrp.setUseYn(codeGrp.getUseYn());
codeGrpRepository.save(savedGrp);
return "modified";
}else{
return "validGrpCd";
}
}
public List<TcCodeItem> selectCodeItemList(String grpCd){
return codeItemRepository.findByGrpCdOrderByGrpOrder(grpCd);
return codeItemRepository.findByGrpCdAndUseYnOrderByGrpOrder(grpCd, "Y");
}
@Transactional
public String addCodeItem(TcCodeItem codeItem) {
TcCodeItem savedItem = codeItemRepository.findById(
new TcCodeItem.TcCodeItemId(codeItem.getItemCd(), codeItem.getGrpCd())
).orElse(null);
if(savedItem!=null){
if(savedItem.getUseYn().equals("Y")){
return "isSaved";
}else{
savedItem.setItemNm(savedItem.getItemNm());
savedItem.setUseYn("Y");
codeItemRepository.save(savedItem);
return savedItem.getGrpCd();
}
}else{
codeItemRepository.save(codeItem);
return codeItem.getItemCd();
}
}
@Transactional
public String modifyCodeItem(TcCodeItem codeItem) {
TcCodeItem savedItem = codeItemRepository.findById(
new TcCodeItem.TcCodeItemId(codeItem.getItemCd(), codeItem.getGrpCd())
).orElse(null);
if (savedItem != null) {
savedItem.setItemNm(codeItem.getItemNm());
savedItem.setLastChgId(codeItem.getLastChgId());
savedItem.setLastChgDt(codeItem.getLastChgDt());
savedItem.setGrpOrder(codeItem.getGrpOrder());
savedItem.setUseYn(codeItem.getUseYn());
codeItemRepository.save(savedItem);
return "modified";
}else{
return "validGrpCd";
}
}
}

View File

@ -0,0 +1,55 @@
package com.dbnt.kcscbackend.admin.dashboard;
import com.dbnt.kcscbackend.admin.dashboard.service.AdminDashboardService;
import com.dbnt.kcscbackend.config.common.BaseController;
import com.dbnt.kcscbackend.config.common.ResultVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequiredArgsConstructor
@RequestMapping("/admin/dashboard")
@Tag(name="AdminDashboardController", description = "사이트관리 대시보드")
public class AdminDashboardController extends BaseController {
private final AdminDashboardService adminDashboardService;
@Operation(
summary = "기본코드 그룹 조회",
description = "기본코드 그룹 조회",
tags = {"AdminConfigController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.GET, value = "/daily-user-log-list", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResultVO getDailyUserLogList() throws Exception {
ResultVO resultVO = new ResultVO();
Map<String, Object> resultMap = new HashMap<>();
// 현재 날짜
// todo endDate 뒤에 .minus 지워야함
LocalDate endDate = LocalDate.now().minusMonths(6);
System.out.println("@@@ localdate : " + endDate);
// 3개월 전 날짜 계산
LocalDate startDate = endDate.minusMonths(3);
resultMap.put("dailyUserLogList", adminDashboardService.selectDailyUserLogList(startDate, endDate));
resultVO.setResult(resultMap);
return resultVO;
}
}

View File

@ -0,0 +1,36 @@
package com.dbnt.kcscbackend.admin.dashboard.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
import java.time.LocalDate;
@Getter
@Setter
@Entity
@NoArgsConstructor
@DynamicInsert
@DynamicUpdate
@Table(name = "tn_daily_user_log")
public class TnDailyUserLog {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "dul_seq")
private Long dulSeq;
@Column(name = "log_dt")
private LocalDate logDt;
@Column(name = "log_cnt")
private Integer logCnt;
@Column(name = "mobile_cnt")
private Integer mobileCnt;
@Column(name = "pc_cnt")
private Integer pcCnt;
}

View File

@ -0,0 +1,11 @@
package com.dbnt.kcscbackend.admin.dashboard.repository;
import com.dbnt.kcscbackend.admin.dashboard.entity.TnDailyUserLog;
import org.springframework.data.jpa.repository.JpaRepository;
import java.time.LocalDate;
import java.util.List;
public interface TnDailyUserLogRepository extends JpaRepository<TnDailyUserLog, Long> {
List<TnDailyUserLog> findByLogDtBetweenOrderByLogDt(LocalDate startDate, LocalDate endDate);
}

View File

@ -0,0 +1,20 @@
package com.dbnt.kcscbackend.admin.dashboard.service;
import com.dbnt.kcscbackend.admin.dashboard.entity.TnDailyUserLog;
import com.dbnt.kcscbackend.admin.dashboard.repository.TnDailyUserLogRepository;
import lombok.RequiredArgsConstructor;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.util.List;
@Service
@RequiredArgsConstructor
public class AdminDashboardService extends EgovAbstractServiceImpl {
private final TnDailyUserLogRepository tnDailyUserLogRepository;
public List<TnDailyUserLog> selectDailyUserLogList(LocalDate startDate, LocalDate endDate) {
return tnDailyUserLogRepository.findByLogDtBetweenOrderByLogDt(startDate, endDate);
}
}

View File

@ -0,0 +1,79 @@
package com.dbnt.kcscbackend.admin.logs;
import com.dbnt.kcscbackend.admin.logs.entity.ThPrivacyLog;
import com.dbnt.kcscbackend.admin.logs.service.AdminLogsService;
import com.dbnt.kcscbackend.auth.entity.LoginVO;
import com.dbnt.kcscbackend.config.common.BaseController;
import com.dbnt.kcscbackend.config.common.ResponseCode;
import com.dbnt.kcscbackend.config.common.ResultVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.egovframe.rte.fdl.property.EgovPropertyService;
import org.egovframe.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequiredArgsConstructor
@RequestMapping("/admin/logs")
@Tag(name="AdminLogsController", description = "사이트관리 로그현황 메뉴 컨트롤러")
public class AdminLogsController extends BaseController {
@Resource(name = "propertiesService")
protected EgovPropertyService propertyService;
private final AdminLogsService adminLogsService;
@Operation(
summary = "로그현황 - 개인정보 로그",
description = "개인정보 로그현황",
tags = {"AdminLogsController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.POST, value = "/privacy", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResultVO selectPrivacyLogsList(@RequestBody ThPrivacyLog thPrivacyLog, @AuthenticationPrincipal LoginVO user)
throws Exception {
ResultVO resultVO = new ResultVO();
Map<String, Object> resultMap = adminLogsService.selectPrivacyList();
PaginationInfo paginationInfo = new PaginationInfo();
paginationInfo.setCurrentPageNo(thPrivacyLog.getPageIndex());
paginationInfo.setRecordCountPerPage(propertyService.getInt("Globals.pageUnit"));
paginationInfo.setPageSize(propertyService.getInt("Globals.pageSize"));
thPrivacyLog.setFirstIndex(paginationInfo.getFirstRecordIndex());
thPrivacyLog.setLastIndex(paginationInfo.getLastRecordIndex());
thPrivacyLog.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
int totCnt = Integer.parseInt((String)resultMap.get("resultCnt"));
paginationInfo.setTotalRecordCount(totCnt);
// resultMap.put("resultList", adminLogsService.selectPrivacyList());
// resultMap.put("resultList", resultMap.get("resultList"));
// resultMap.put("resultCnt", totCnt);
resultMap.put("paginationInfo", paginationInfo);
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
resultVO.setResult(resultMap);
return resultVO;
}
}

View File

@ -0,0 +1,99 @@
package com.dbnt.kcscbackend.admin.logs.entity;
import java.io.Serializable;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Getter
@Setter
@Accessors(chain = true)
@Entity
@NoArgsConstructor
@DynamicInsert
@DynamicUpdate
@Table(name = "th_user_privacy_log")
public class ThPrivacyLog implements Serializable {
private static final long serialVersionUID = -3779821913760046011L;
@Transient
@Schema(description = "검색시작일")
private String searchBgnDe = "";
@Transient
@Schema(description = "검색조건")
private String searchCnd = "";
@Transient
@Schema(description = "검색종료일")
private String searchEndDe = "";
@Transient
@Schema(description = "검색단어")
private String searchWrd = "";
@Transient
@Schema(description = "정렬순서(DESC,ASC)")
private long sortOrdr = 0L;
@Transient
@Schema(description = "검색사용여부")
private String searchUseYn = "";
@Transient
@Schema(description = "현재페이지")
private int pageIndex = 1;
@Transient
@Schema(description = "페이지갯수")
private int pageUnit = 10;
@Transient
@Schema(description = "페이지사이즈")
private int pageSize = 10;
@Transient
@Schema(description = "첫페이지 인덱스")
private int firstIndex = 1;
@Transient
@Schema(description = "마지막페이지 인덱스")
private int lastIndex = 1;
@Transient
@Schema(description = "페이지당 레코드 개수")
private int recordCountPerPage = 10;
@Transient
@Schema(description = "레코드 번호")
private int rowNo = 0;
@Id
@Column(name = "upl_seq")
private Long uplSeq;
@Column(name = "user_id")
private String userId;
@Column(name = "target_user_id")
private String targetUserId;
@Column(name = "access_type")
private String accessType;
@Column(name = "ip_address")
private String ipAddress;
@Column(name = "access_dt")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate accessDt;
}

View File

@ -0,0 +1,7 @@
package com.dbnt.kcscbackend.admin.logs.mapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface AdminLogsMapper {
}

View File

@ -0,0 +1,12 @@
package com.dbnt.kcscbackend.admin.logs.repository;
import com.dbnt.kcscbackend.admin.logs.entity.ThPrivacyLog;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface PrivacyLogsRepository extends JpaRepository<ThPrivacyLog, String> {
long count(); // 전체 레코드 수를 반환하는 메서드
List<ThPrivacyLog> findAllByOrderByUplSeqDesc();
}

View File

@ -0,0 +1,39 @@
package com.dbnt.kcscbackend.admin.logs.service;
import com.dbnt.kcscbackend.admin.logs.entity.ThPrivacyLog;
import com.dbnt.kcscbackend.admin.logs.repository.PrivacyLogsRepository;
import lombok.RequiredArgsConstructor;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@RequiredArgsConstructor
public class AdminLogsService extends EgovAbstractServiceImpl {
private final PrivacyLogsRepository privacyLogsRepository;
// public List<ThPrivacyLog> selectPrivacyList(){
// return privacyLogsRepository.findAll();
// }
public Map<String, Object> selectPrivacyList() {
Map<String, Object> resultMap = new HashMap<>();
// 전체 레코드 수 가져오기
long totalRecordCount = privacyLogsRepository.count();
// 개수를 resultMap에 추가
resultMap.put("resultCnt", String.valueOf(totalRecordCount));
// 개인 정보 로그 리스트 가져오기
List<ThPrivacyLog> privacyLogList = privacyLogsRepository.findAllByOrderByUplSeqDesc();
// 결과를 resultMap에 추가
resultMap.put("resultList", privacyLogList);
return resultMap;
}
}

View File

@ -0,0 +1,50 @@
package com.dbnt.kcscbackend.admin.users;
import com.dbnt.kcscbackend.admin.users.service.AdminUsersService;
import com.dbnt.kcscbackend.auth.entity.UserInfo;
import com.dbnt.kcscbackend.config.common.BaseController;
import com.dbnt.kcscbackend.config.common.ResultVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequiredArgsConstructor
@RequestMapping("/admin/users")
@Tag(name="AdminConfigController", description = "사이트관리 사용자관리 메뉴 컨트롤러")
public class AdminUsersController extends BaseController {
private final AdminUsersService adminUsersService;
@Operation(
summary = "사용자 목록 조회",
description = "사용자 목록 조회",
tags = {"AdminUsersController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.GET, value = "/list")
public ResultVO getUserList(UserInfo params) throws Exception{
ResultVO resultVO = new ResultVO();
Map<String, Object> resultMap = new HashMap<>();
params.setQueryInfo();
resultMap.put("userList", adminUsersService.selectUserList(params));
params.setContentCnt(adminUsersService.selectUserListCnt(params));
params.setPaginationInfo();
resultMap.put("paginationInfo", params);
resultVO.setResult(resultMap);
return resultVO;
}
}

View File

@ -0,0 +1,32 @@
package com.dbnt.kcscbackend.admin.users.mapper;
import com.dbnt.kcscbackend.auth.entity.LoginVO;
import com.dbnt.kcscbackend.auth.entity.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
*
* @author
* @since 2009.03.06
* @version 1.0
* @see
*
* <pre>
* << (Modification Information) >>
*
*
* ------- -------- ---------------------------
* 2009.03.06
* 2011.08.31 JJY 릿
*
* </pre>
*/
@Mapper
public interface AdminUsersMapper {
List<UserInfo> selectUserList(UserInfo params);
Integer selectUserListCnt(UserInfo params);
}

View File

@ -0,0 +1,25 @@
package com.dbnt.kcscbackend.admin.users.service;
import com.dbnt.kcscbackend.admin.users.mapper.AdminUsersMapper;
import com.dbnt.kcscbackend.auth.entity.UserInfo;
import com.dbnt.kcscbackend.auth.repository.UserInfoRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class AdminUsersService {
private final UserInfoRepository userInfoRepository;
private final AdminUsersMapper usersMapper;
public List<UserInfo> selectUserList(UserInfo params) {
return usersMapper.selectUserList(params);
}
public Integer selectUserListCnt(UserInfo params) {
return usersMapper.selectUserListCnt(params);
}
}

View File

@ -88,7 +88,7 @@ public class EgovLoginApiController extends BaseController {
msg.append(error.getDefaultMessage());
msg.append("\n");
}
resultMap.put("resultCode", ResponseCode.SAVE_ERROR.getCode());
resultMap.put("resultCode", ResponseCode.INPUT_CHECK_ERROR.getCode());
resultMap.put("resultMessage", msg.toString());
}else if(!loginVO.getPassword().equals(loginVO.getPasswordChk())){
resultMap.put("resultCode", ResponseCode.SAVE_ERROR.getCode());

View File

@ -55,7 +55,7 @@ public class LoginVO implements Serializable{
@NotBlank(message = "비밀번호확인을 입력해주세요.")
private String passwordChk;
@Schema(description = "사용자 구분", allowableValues = {"ADM", "USR"}, defaultValue = "USR")
@Schema(description = "사용자 구분", allowableValues = {"ACC_TP01", "ACC_TP02"}, defaultValue = "ACC_TP02")
private String userSe;
@Schema(description = "이름")

View File

@ -1,5 +1,7 @@
package com.dbnt.kcscbackend.auth.entity;
import com.dbnt.kcscbackend.config.common.BoardParams;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@ -21,7 +23,7 @@ import java.util.Set;
@DynamicInsert
@DynamicUpdate
@Table(name = "user_info")
public class UserInfo implements UserDetails{
public class UserInfo extends BoardParams implements UserDetails{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_seq")
@ -34,8 +36,17 @@ public class UserInfo implements UserDetails{
private String email;
@Column(name = "user_se")
private String userSe;
@Column(name = "user_nm")
private String userNm;
@Column(name = "phone_num")
private String phoneNum;
@Column(name = "user_role")
private String userRole;
@Column(name = "use_yn")
private String useYn;
@Override
@JsonIgnore
public Collection<? extends GrantedAuthority> getAuthorities() {
Set<GrantedAuthority> roles = new HashSet<>();
for (String role : userSe.split(",")) {

View File

@ -0,0 +1,56 @@
package com.dbnt.kcscbackend.config.common;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.Transient;
import java.io.Serializable;
@Getter
@Setter
public class BoardParams implements Serializable {
@Transient
private String searchCondition;
@Transient
private String searchKeyword;
@Transient
private Integer pageIndex=1; //요청페이지
@Transient
private Integer firstIndex=0; // 쿼리의 시작 row
@Transient
private Integer rowCnt=10; //한 페이지에 표현되는 row 수
@Transient
private Integer startNum=1; // pagination 시작값
@Transient
private Integer endNum=5; // pagination 마지막값
@Transient
private Integer maxNum; // pagination 최대값
@Transient
private Integer contentCnt=0;
public void setQueryInfo(){
setFirstIndex((getPageIndex()-1)*getRowCnt());
}
public void setPaginationInfo(){
int contentCnt = getContentCnt();
int rowCnt = getRowCnt();
int maxNum = (int)Math.ceil(((double)contentCnt)/rowCnt);
if (maxNum==0){
maxNum = 1;
}
setMaxNum(maxNum);
int pageIndex = getPageIndex();
int startNum = pageIndex - 4;
if(startNum <= 0){
startNum = 1;
}
setStartNum(startNum);
int endNum = startNum + 9;
if(endNum>maxNum){
endNum = maxNum;
}
setEndNum(endNum);
}
}

View File

@ -23,6 +23,8 @@ package com.dbnt.kcscbackend.config.common;
public enum ResponseCode {
SUCCESS(200, "성공했습니다."),
FAILED(300, "실패하였습니다."),
TOKEN_EXPIRED(303, "만료된 토큰입니다."),
AUTH_ERROR(403, "인가된 사용자가 아닙니다."),
DELETE_ERROR(700, "삭제 중 내부 오류가 발생했습니다."),
SAVE_ERROR(800, "저장시 내부 오류가 발생했습니다."),

View File

@ -4,6 +4,8 @@ import org.egovframe.rte.fdl.cmmn.trace.LeaveaTrace;
import org.egovframe.rte.fdl.cmmn.trace.handler.TraceHandler;
import org.egovframe.rte.fdl.cmmn.trace.manager.DefaultTraceHandleManager;
import org.egovframe.rte.fdl.cmmn.trace.manager.TraceHandlerService;
import org.egovframe.rte.fdl.cryptography.EgovPasswordEncoder;
import org.egovframe.rte.fdl.cryptography.impl.EgovARIACryptoServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ -80,4 +82,28 @@ public class EgovConfigAppCommon {
return leaveaTrace;
}
/**
*
* @return [EgovPasswordEncoder ] EgovPasswordEncoder
*/
@Bean
public EgovPasswordEncoder egovPasswordEncoder() {
EgovPasswordEncoder egovPasswordEncoder = new EgovPasswordEncoder();
egovPasswordEncoder.setAlgorithm("SHA-256");
egovPasswordEncoder.setHashedPassword("gdyYs/IZqY86VcWhT8emCYfqY1ahw2vtLG+/FzNqtrQ=");
return egovPasswordEncoder;
}
/**
*
* @return [EgovARIACryptoServiceImpl ] EgovARIACryptoServiceImpl
*/
@Bean
public EgovARIACryptoServiceImpl egovARIACryptoService() {
EgovARIACryptoServiceImpl egovARIACryptoServiceImpl = new EgovARIACryptoServiceImpl();
egovARIACryptoServiceImpl.setPasswordEncoder(egovPasswordEncoder());
egovARIACryptoServiceImpl.setBlockSize(1024);
return egovARIACryptoServiceImpl;
}
}

View File

@ -126,7 +126,7 @@ public class StandardCodeController extends BaseController {
if(user == null){
resultVO.setResultCode(303);
}else{
if(!user.getUserSe().equals("ADM")){
if(!user.getUserSe().equals("ACC_TP01")){
resultVO.setResultCode(403);
}else{
standardCodeService.saveErrorCd(content);

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--Mybatis 설정 -->
<settings>
<!-- 전통적인 데이터베이스 컬럼명 형태인 A_COLUMN을 CamelCase형태의 자바 프로퍼티명 형태인 aColumn으로 자동으로 매핑하도록 함 -->
<setting name="mapUnderscoreToCamelCase" value="true"></setting>
<!-- 파라미터에 Null 값이 있을 경우 에러 처리 -->
<setting name="jdbcTypeForNull" value="VARCHAR"></setting>
</settings>
<!-- Type Aliases 설정-->
<typeAliases>
<typeAlias alias="egovMap" type="org.egovframe.rte.psl.dataaccess.util.EgovMap" />
<typeAlias alias="FileVO" type="com.dbnt.kcscbackend.admin.committee.schedules.repository.FileVO" />
<typeAlias alias="ComDefaultCodeVO" type="com.dbnt.kcscbackend.admin.committee.schedules.repository.ComDefaultCodeVO" />
<typeAlias alias="comDefaultVO" type="com.dbnt.kcscbackend.admin.committee.schedules.repository.ComDefaultVO" />
</typeAliases>
</configuration>

View File

@ -12,3 +12,7 @@ spring.redis.host=localhost
spring.redis.port=6379
# secret key
Globals.jwt.secret = qWwMroux3QtiIJcPSIZARNTZEBBnWVH0jZ2Lx7tfFChCYi0ViZllo1bekZdiU0B3FRjJI7g90n0ha120dwlz8JZU8rOkmNCe9Uq0
#?????? ???? ?
#?? : ??? ??? "egovframe"? ????? ???? ????? ????.
Globals.crypto.algoritm = egovframe

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dbnt.kcscbackend.admin.config.mapper.AdminConfigMapper">
</mapper>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dbnt.kcscbackend.admin.users.mapper.AdminUsersMapper">
<select id="selectUserList" parameterType="UserInfo" resultType="UserInfo">
select user_seq,
user_id,
email,
user_se,
user_nm,
phone_num,
user_role,
use_yn
from user_info
<include refid="selectUserListWhere"></include>
order by user_seq asc
limit #{rowCnt} offset #{firstIndex}
</select>
<select id="selectUserListCnt" parameterType="UserInfo" resultType="int">
select count(*)
from user_info
<include refid="selectUserListWhere"></include>
</select>
<sql id="selectUserListWhere">
<where>
<if test='userSe != null and userSe != ""'>
and user_se = #{userSe}
</if>
<if test='searchCondition == "id"'>
and user_id like '%'||#{searchKeyword}||'%'
</if>
<if test='searchCondition == "name"'>
and user_nm like '%'||#{searchKeyword}||'%'
</if>
<if test='searchCondition == "email"'>
and email like '%'||#{searchKeyword}||'%'
</if>
<if test='searchCondition == "phoneNum"'>
and phone_num like '%'||#{searchKeyword}||'%'
</if>
</where>
</sql>
</mapper>