Merge branch 'master' of http://118.219.150.34:50501/DBNT/kcscDev into thkim

thkim
thkim 2024-01-05 17:32:58 +09:00
commit 823ff346e8
8 changed files with 251 additions and 46 deletions

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

@ -1,15 +1,12 @@
import React, {useCallback, useEffect, useRef, useState} from 'react';
import {Link, useLocation} from "react-router-dom";
import URL from "../../../constants/url";
import Row from "react-bootstrap/Row";
import Col from "react-bootstrap/Col";
import URL from "constants/url";
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
import CODE from "../../../constants/code";
import EgovPaging from "../../../components/EgovPaging";
import * as EgovNet from "../../../api/egovFetch";
import {itemIdxByPage} from "../../../utils/calc";
import {NOTICE_BBS_ID} from "../../../config";
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) {
@ -24,33 +21,39 @@ function List(props) {
const wrdRef = useRef();
const retrieveList = useCallback((searchCondition) => {
/*
const params = "?";
EgovNet.requestFetch(
'/cop/bbs/selectBoardListAPI.do',
'/admin/users/list'+params,
{
method: "POST",
headers: {
'Content-type': 'application/json',
},
body: JSON.stringify(searchCondition)
method: "GET"
},
(resp) => {
setPaginationInfo(resp.result.paginationInfo);
let mutListTag = [];
const resultCnt = parseInt(resp.result.resultCnt);
const currentPageNo = resp.result.paginationInfo.currentPageNo;
const pageSize = resp.result.paginationInfo.pageSize;
const resultCnt = parseInt(resp.result.contentCnt);
const currentPageNo = resp.result.paginationInfo.pageIndex;
const pageSize = resp.result.paginationInfo.rowCnt;
setListTag([]);
//
resp.result.resultList.forEach(function (item, index) {
if (index === 0) mutListTag = []; //
resp.result.userList.forEach(function (item, index) {
const listIdx = itemIdxByPage(resultCnt , currentPageNo, pageSize, index);
mutListTag.push(
<Link to={{pathname: URL.ADMIN_NOTICE_DETAIL}}
<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
@ -68,8 +71,7 @@ function List(props) {
<div>{item.frstRegisterNm}</div>
<div>{item.frstRegisterPnttm}</div>
<div>{item.inqireCo}</div>
</Link>
);
</Link>*/
});
if(!mutListTag.length) mutListTag.push(<p className="no_data" key="0">검색된 결과가 없습니다.</p>); //
setListTag(mutListTag);
@ -78,7 +80,6 @@ function List(props) {
console.log("err response : ", resp);
}
);
*/
},[]);
useEffect(() => {
@ -123,10 +124,10 @@ function List(props) {
<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>
<option value="3">전화번호</option>
<option value="id">아이디</option>
<option value="name">이름</option>
<option value="email">이메일</option>
<option value="phoneNum">전화번호</option>
</select>
</label>
</li>
@ -167,9 +168,15 @@ function List(props) {
</div>
<div className="board_bot">
<EgovPaging pagination={paginationInfo} moveToPage={passedPage => {
retrieveList({ ...searchCondition, pageIndex: passedPage, searchCnd: cndRef.current.value, searchWrd: wrdRef.current.value })
}} />
<EgovPaging pagination={paginationInfo}
moveToPage={passedPage => {
retrieveList({
...searchCondition,
pageIndex: passedPage,
searchCnd: cndRef.current.value,
searchWrd: wrdRef.current.value
})
}} />
</div>
</div>
</div>

View File

@ -2,12 +2,21 @@ 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")
@ -16,4 +25,26 @@ 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

@ -1,8 +1,11 @@
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
@ -23,4 +26,7 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface AdminUsersMapper {
List<UserInfo> selectUserList(UserInfo params);
Integer selectUserListCnt(UserInfo params);
}

View File

@ -1,9 +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

@ -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

@ -3,4 +3,44 @@
"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>