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

thkim
thkim 2024-01-11 08:36:59 +09:00
commit cdaaebd6d8
8 changed files with 216 additions and 18 deletions

View File

@ -6,6 +6,8 @@ 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 Modal from "react-bootstrap/Modal";
import UserInfoModal from "./UserInfoModal";
function List(props) {
@ -19,6 +21,12 @@ function List(props) {
const cndRef = useRef();
const wrdRef = useRef();
const [show, setShow] = useState(false);
const [modalBody, setModalBody] = useState();
const handleClose = () => setShow(false);
const handleShow = () => setShow(true);
const retrieveList = useCallback((searchCondition) => {
const params = "?";
EgovNet.requestFetch(
@ -44,11 +52,11 @@ function List(props) {
mutListTag.push(
<div className={"list_item"}>
<div>{item.userSe}</div>
<div>{item.userId}</div>
<div><a href={"#"} onClick={()=>{userInfoModal(item.userSeq)}}>{item.userId}</a></div>
<div>{item.userNm}</div>
<div>{item.email}</div>
<div>{item.phoneNum}</div>
<div>{item.useYn}</div>
<div>{item.status}</div>
<div><button className={"btn btn_red_h31 px-1"}>삭제</button></div>
</div>
);
@ -66,6 +74,11 @@ function List(props) {
retrieveList(searchCondition);
}, []);
function userInfoModal(userSeq){
handleShow()
setModalBody(<UserInfoModal userSeq={userSeq}></UserInfoModal>)
}
return (
<div className="container">
<div className="c_wrap">
@ -124,11 +137,6 @@ function List(props) {
}}>조회</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>
@ -161,6 +169,9 @@ function List(props) {
</div>
</div>
</div>
<Modal show={show} onHide={handleClose} keyboard={false}>
{modalBody}
</Modal>
</div>
);
}

View File

@ -0,0 +1,143 @@
import React, {useEffect, useState} from "react"
import Modal from "react-bootstrap/Modal";
import * as EgovNet from "../../../api/egovFetch";
import Form from "react-bootstrap/Form";
import Row from "react-bootstrap/Row";
import Col from "react-bootstrap/Col";
import Button from "react-bootstrap/Button";
function UserInfoModal({userSeq}){
const [userInfo, setUserInfo] = useState({ userId: '', password: '', passwordChk: '', userNm: '', email: '', phoneNum: ''});
function getModalContent(){
EgovNet.requestFetch(
'/admin/users/info?userSeq='+userSeq,
{
method: "GET"
},
(resp) => {
const respInfo = {
userId: resp.result.userInfo.userId,
userNm: resp.result.userInfo.userNm,
email: resp.result.userInfo.email,
phoneNum: resp.result.userInfo.phoneNum,
password: "",
passwordChk: "",
}
setUserInfo(respInfo);
},
(resp) => {
console.log("err response : ", resp);
}
);
}
function userInfoChange(){
}
useEffect(() => {
getModalContent();
}, []);
return (
<>
<Modal.Header className="bookmarkModalHeader" closeButton>
<Modal.Title>
{userInfo.userNm} 상세정보
</Modal.Title>
</Modal.Header>
<Modal.Body>
<Form onSubmit={userInfoChange} noValidate>
<Form.Group as={Row} className="mb-3" controlId="formHorizontalEmail">
<Form.Label column sm={3}>
아이디
</Form.Label>
<Col sm={9}>
<Form.Control type="text" name="userId" placeholder="아이디" required value={userInfo?.userId}
onChange={e => setUserInfo({ ...userInfo, userId: e.target.value })}/>
</Col>
</Form.Group>
<Form.Group as={Row} className="mb-3" controlId="formHorizontalEmail">
<Form.Label column sm={3}>
이름
</Form.Label>
<Col sm={9}>
<Form.Control type="text" name="userNm" placeholder="이름" required value={userInfo?.userNm}
onChange={e => setUserInfo({ ...userInfo, userNm: e.target.value })}/>
</Col>
</Form.Group>
<Form.Group as={Row} className="mb-3" controlId="formHorizontalEmail">
<Form.Label column sm={3}>
이메일
</Form.Label>
<Col sm={9}>
<Form.Control type="email" name="email" placeholder="email" required value={userInfo?.email}
onChange={e => setUserInfo({ ...userInfo, email: e.target.value })}/>
</Col>
</Form.Group>
<Form.Group as={Row} className="mb-3" controlId="formHorizontalEmail">
<Form.Label column sm={3}>
연락처
</Form.Label>
<Col sm={9}>
<Form.Control type="text" name="phoneNum" placeholder="연락처" required value={userInfo?.phoneNum}
onChange={e => setUserInfo({ ...userInfo, phoneNum: e.target.value })}/>
</Col>
</Form.Group>
<Form.Group as={Row} className="mb-3" controlId="formHorizontalEmail">
<Form.Label column sm={3}>
비밀번호
</Form.Label>
<Col sm={9}>
<Form.Control type="password" name="password" placeholder="비밀번호 변경 시 입력"
onChange={e => setUserInfo({ ...userInfo, password: e.target.value })}/>
</Col>
</Form.Group>
<Form.Group as={Row} className="mb-3" controlId="formHorizontalEmail">
<Form.Label column sm={3}>
비밀번호 확인
</Form.Label>
<Col sm={9}>
<Form.Control type="password" name="passwordChk" placeholder="비밀번호 변경 시 입력"
onChange={e => setUserInfo({ ...userInfo, passwordChk: e.target.value })}/>
</Col>
</Form.Group>
<Form.Group as={Row} className="mb-3" controlId="formHorizontalEmail">
<Form.Label column sm={3}>
사용자 유형
</Form.Label>
<Col sm={9}>
</Col>
</Form.Group>
<Form.Group as={Row} className="mb-3" controlId="formHorizontalEmail">
<Form.Label column sm={3}>
사용자 권한
</Form.Label>
<Col sm={9}>
</Col>
</Form.Group>
<Form.Group as={Row} className="mb-3" controlId="formHorizontalEmail">
<Form.Label column sm={3}>
상태
</Form.Label>
<Col sm={9}>
</Col>
</Form.Group>
<Row className="mb-3">
<Form.Label column xs={{span:8, offset:2}} id="findResultLabel"></Form.Label>
<Col xs={2}>
<Button type="submit">저장</Button>
</Col>
</Row>
</Form>
</Modal.Body>
</>
)
}
export default UserInfoModal;

View File

@ -47,4 +47,22 @@ public class AdminUsersController extends BaseController {
return resultVO;
}
@Operation(
summary = "사용자 정보 조회",
description = "사용자 정보 조회",
tags = {"AdminUsersController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.GET, value = "/info")
public ResultVO getUserInfo(UserInfo params) throws Exception{
ResultVO resultVO = new ResultVO();
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("userInfo", adminUsersService.selectUserInfo(params.getUserSeq()));
resultVO.setResult(resultMap);
return resultVO;
}
}

View File

@ -22,4 +22,10 @@ public class AdminUsersService {
public Integer selectUserListCnt(UserInfo params) {
return usersMapper.selectUserListCnt(params);
}
public UserInfo selectUserInfo(Integer userSeq) {
UserInfo info = userInfoRepository.findById(userSeq).orElse(new UserInfo());
info.setPassword(null);
return info;
}
}

View File

@ -7,11 +7,14 @@ import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
@ -42,8 +45,16 @@ public class UserInfo extends BoardParams implements UserDetails{
private String phoneNum;
@Column(name = "user_role")
private String userRole;
@Column(name = "use_yn")
private String useYn;
@Column(name = "status")
private String status;
@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;
@Override
@JsonIgnore
@ -76,8 +87,9 @@ public class UserInfo extends BoardParams implements UserDetails{
}
@Override
@JsonIgnore
public boolean isEnabled() {
return true;
return getStatus().equals("USE_ST");
}
}

View File

@ -17,6 +17,7 @@ import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.Random;
/**
@ -63,6 +64,8 @@ public class EgovLoginServiceImpl extends EgovAbstractServiceImpl implements Ego
info.setEmail(loginVO.getEmail());
info.setPhoneNum(loginVO.getPhoneNum());
info.setUserSe("ACC_TP02");
info.setStatus("USE_ST");
info.setFrstCrtDt(LocalDateTime.now());
userInfoRepository.save(info);
return info.getUserSeq();
}

View File

@ -1,5 +1,6 @@
package com.dbnt.kcscbackend.config.common;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@ -39,9 +40,11 @@ public class BoardParams implements Serializable {
@Schema(description = "정렬순서(DESC,ASC)")
private long sortOrdr = 0L;
@JsonIgnore
public void setQueryInfo(){
setFirstIndex((getPageIndex()-1)*getRowCnt());
}
@JsonIgnore
public void setPaginationInfo(){
int contentCnt = getContentCnt();
int rowCnt = getRowCnt();

View File

@ -5,14 +5,16 @@
<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
a.user_id,
a.email,
b.item_nm as user_se,
a.user_nm,
a.phone_num,
a.user_role,
c.item_nm as status
from user_info a
inner join tc_code_item b on a.user_se = b.item_cd
inner join tc_code_item c on a.status = c.item_cd
<include refid="selectUserListWhere"></include>
order by user_seq asc
limit #{rowCnt} offset #{firstIndex}