1. 수강생 리스트 (p4)

- 탈퇴처리시 생년월일/ip정보도 같이삭제 휴면테이블에 있는 데이터컬럼 삭제처리  ‘탈퇴회원’ → ‘삭제됨’ 으로 변경

 - Like검색 삭제

 - 휴면처리시 탈퇴처리와 동일한 방식으로 데이터관리(이름은 ‘삭제됨’ 으로 변경하며 나머지 데이터는 삭제)
  비밀번호데이터 유지 단, 변경/삭제되는 데이터는 별도테이블에 분리보관


2. 수강생 상세페이지 휴면, 정상 상태 변경 (p6)
 - 휴면 테이블 userdormant 개발 및 운영에 추가

# 커밋 파일
Base\Controller\ACommonUser.cs
BO\Views\user\ur.cshtml
BO\Views\user\us.cshtml
Dao\MyBatis\Maps\User.xml

# 테스트 결과
- 이상없음

# 특이사항 및 이슈사항
- 이상없음
This commit is contained in:
swpark 2021-12-06 04:30:49 +00:00
parent fe6c2cbdd1
commit 9efebaffdb
4 changed files with 161 additions and 20 deletions

View File

@ -211,7 +211,14 @@
</section> </section>
<div class="botfixempty">&nbsp;</div> <div class="botfixempty">&nbsp;</div>
<div class="form-group botfix"> <div class="form-group botfix">
@if (Model.User.userno > 0 && Model.viewname == "user" && Model.User.status == 8)
{
<a href="#" class="btn btn-info" onclick="cancel();">휴면해제</a>
}
else
{
<a href="#" class="btn btn-primary" onclick="save();">저장</a> <a href="#" class="btn btn-primary" onclick="save();">저장</a>
}
@if (Model.User.userno > 0 && Model.viewname == "user") @if (Model.User.userno > 0 && Model.viewname == "user")
{ {
<a href="#" class="btn btn-danger" onclick="del();">탈퇴</a> <a href="#" class="btn btn-danger" onclick="del();">탈퇴</a>
@ -502,6 +509,12 @@
} }
function save() { function save() {
var txt = "저장하시겠습니까?";
if (getrv("User.status") == 8) {
txt = "휴면상태로 전환할 경우\n개인정보가 조회되지 않습니다.\n그래도 진행하시겠습니까?";
}
setv("User_userpno", val("userpno1")+val("userpno2")); setv("User_userpno", val("userpno1")+val("userpno2"));
setv("User_mobile", formatmobile(val("User_mobile"))); setv("User_mobile", formatmobile(val("User_mobile")));
setv("User_telno", formatphone(val("User_telno"))); setv("User_telno", formatphone(val("User_telno")));
@ -520,7 +533,7 @@
else if (!isnulloremt(val("User_email")) && !isemail(val("User_email"))) { focus("User_email"); msg("이메일주소를 올바르게 입력해주세요."); } else if (!isnulloremt(val("User_email")) && !isemail(val("User_email"))) { focus("User_email"); msg("이메일주소를 올바르게 입력해주세요."); }
//else if (!isnulloremt(val("User_mobile")) && (!ismobile(val("User_mobile")) )) { focus("User_mobile"); msg("핸드폰번호를 올바르게 입력해주세요."); } //else if (!isnulloremt(val("User_mobile")) && (!ismobile(val("User_mobile")) )) { focus("User_mobile"); msg("핸드폰번호를 올바르게 입력해주세요."); }
//else if ((val("User_usertype") == "1" || val("User_usertype") == "81") && val("User_asno") == "") { msg("소속을 등록해주세요.");} //else if ((val("User_usertype") == "1" || val("User_usertype") == "81") && val("User_asno") == "") { msg("소속을 등록해주세요.");}
else if (confirm("저장하시겠습니까?")) { else if (confirm(txt)) {
if (val("User_usertype") >= "92") { if (val("User_usertype") >= "92") {
setv("User_asno", ""); setv("User_asno", "");
} }
@ -529,6 +542,7 @@
cdata = cdata == "<p><br></p>" ? "" : cdata; cdata = cdata == "<p><br></p>" ? "" : cdata;
setv("User_introhtml", cdata); setv("User_introhtml", cdata);
} }
capfileform("/acommon/usersave", "mform", "cbsave"); capfileform("/acommon/usersave", "mform", "cbsave");
} }
} }
@ -548,6 +562,7 @@
} }
else { msgdev(); } else { msgdev(); }
} }
function del() { function del() {
if (confirm(('@Model.viewname' == "user"?"탈퇴":"삭제")+"처리하시겠습니까?")) { if (confirm(('@Model.viewname' == "user"?"탈퇴":"삭제")+"처리하시겠습니까?")) {
capp("/acommon/userexitjoin", { userno: @Model.User.userno}, "cbdel"); capp("/acommon/userexitjoin", { userno: @Model.User.userno}, "cbdel");
@ -647,5 +662,22 @@
msgdev(); msgdev();
} }
} }
// 휴면 해제
function cancel() {
if (confirm("휴면을 해제하시겠습니까?")) {
capp("/acommon/dormantcancel", { userno: @Model.User.userno}, "cbcancel");
}
}
function cbcancel() {
if (capResult.code == 1000) {
msg("휴면이 해제되었습니다.", 0, null, null, true);
golist(500, true);
} else if (capResult.code == 1) {
msg("휴면데이터가 없어 휴면해제가 불가합니다.");
} else {
msgdev();
}
}
</script> </script>
} }

View File

@ -40,6 +40,7 @@ namespace NP.Base.Controllers
public JsonResult UserSave(VMUser vm) public JsonResult UserSave(VMUser vm)
{ {
vm.User.uno = SUserInfo.UserNo; vm.User.uip = GetUserIP(); vm.User.uno = SUserInfo.UserNo; vm.User.uip = GetUserIP();
if (!string.IsNullOrEmpty(vm.User.userpass)) { vm.User.userpass = NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass.Trim()); } if (!string.IsNullOrEmpty(vm.User.userpass)) { vm.User.userpass = NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass.Trim()); }
vm.User.userid = vm.User.userid.Replace(" ",""); vm.User.userid = vm.User.userid.Replace(" ","");
if (!string.IsNullOrEmpty(vm.User.email)) { vm.User.email = vm.User.email.Trim(); } if (!string.IsNullOrEmpty(vm.User.email)) { vm.User.email = vm.User.email.Trim(); }
@ -60,6 +61,13 @@ namespace NP.Base.Controllers
if (vm.User.userno < 1) if (vm.User.userno < 1)
{ {
Dao.Insert("users.in", vm.User); Dao.Insert("users.in", vm.User);
// 상태값 휴면 선택시
if (vm.User.usertype == 1 && vm.User.status == 8)
{
Dao.Save("users.dormant", new Hashtable() { { "usernos", vm.User.userno }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } });
}
if (vm.User.usertype > 1) if (vm.User.usertype > 1)
{ {
AuthSet(new AuthLog() { uno = SUserInfo.UserNo, uip = GetUserIP(),userno = vm.User.userno, logtype = 2, usertypeorg = vm.User.usertype, usertypenew = vm.User.usertype }); AuthSet(new AuthLog() { uno = SUserInfo.UserNo, uip = GetUserIP(),userno = vm.User.userno, logtype = 2, usertypeorg = vm.User.usertype, usertypenew = vm.User.usertype });
@ -73,8 +81,17 @@ namespace NP.Base.Controllers
{ {
AuthSet(new AuthLog() { uno = SUserInfo.UserNo, uip = GetUserIP(), logtype = 1, usertypenew = vm.User.usertype, userno = vm.User.userno }); AuthSet(new AuthLog() { uno = SUserInfo.UserNo, uip = GetUserIP(), logtype = 1, usertypenew = vm.User.usertype, userno = vm.User.userno });
} }
var result = Dao.Save("users.up", vm.User);
// 상태값 휴면 선택시
if (vm.User.usertype == 1 && vm.User.status == 8)
{
Dao.Save("users.dormant", new Hashtable() { { "usernos", vm.User.userno }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } });
} }
return JsonOK(Dao.Save("users.up", vm.User));
return JsonOK(result);
}
} }
[HttpPost] [HttpPost]
public JsonResult UserExitJoin(int userno) public JsonResult UserExitJoin(int userno)
@ -83,6 +100,8 @@ namespace NP.Base.Controllers
} }
public JsonResult UsersDel(String usernos) public JsonResult UsersDel(String usernos)
{ {
Dao.Save("users.dormant.delete", new Hashtable() { { "usernos", usernos }});
return JsonOK(Dao.Save("users.exitjoin", new Hashtable() { { "usernos", usernos }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } })); return JsonOK(Dao.Save("users.exitjoin", new Hashtable() { { "usernos", usernos }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } }));
} }
public JsonResult UsersDormant(String usernos) public JsonResult UsersDormant(String usernos)
@ -90,6 +109,15 @@ namespace NP.Base.Controllers
return JsonOK(Dao.Save("users.dormant", new Hashtable() { { "usernos", usernos }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } })); return JsonOK(Dao.Save("users.dormant", new Hashtable() { { "usernos", usernos }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } }));
} }
[HttpPost] [HttpPost]
public JsonResult DormantCancel(int userno)
{
if (Dao.Get<Users>("users.dormants", new Hashtable() { { "userno", userno } }).Count() < 1)
{
return JsonBack(new JsonRtn() { code = 1 });
}
return JsonOK(Dao.Save("users.dormant.cancel", new Hashtable() { { "usernos", userno }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } }));
}
[HttpPost]
public JsonResult UserEE(int userno) public JsonResult UserEE(int userno)
{ {
var user = Dao.Get<Users>("users.ee", userno).FirstOrDefault(); var user = Dao.Get<Users>("users.ee", userno).FirstOrDefault();

View File

@ -262,22 +262,26 @@
</isNotNull> </isNotNull>
<isNotEmpty property="usertypes">and a.usertype in ($usertypes$)</isNotEmpty> <isNotEmpty property="usertypes">and a.usertype in ($usertypes$)</isNotEmpty>
<isNotNull property="usertype">and a.usertype =#usertype#</isNotNull> <isNotNull property="usertype">and a.usertype =#usertype#</isNotNull>
<isNotNull property="userid">and a.userid like concat('%',#userid#,'%')</isNotNull> <isNotNull property="userid">and a.userid=#userid#</isNotNull>
<isNotEmpty property="username" prepend="and">a.username like concat('%',#username#,'%')</isNotEmpty> <isNotEmpty property="username" prepend="and">(a.username = #username#)</isNotEmpty>
<isNotEmpty property="usernameid" prepend="and">(a.username like concat('%',#usernameid#,'%') or a.userid like concat('%',#usernameid#,'%'))</isNotEmpty> <isNotEmpty property="usernameid" prepend="and">(a.username like concat('%',#usernameid#,'%') or a.userid like concat('%',#usernameid#,'%'))</isNotEmpty>
<isNotNull property="status" prepend="and">a.status=#status#</isNotNull> <isNotNull property="status" prepend="and">a.status=#status#</isNotNull>
<isNotNull property="asno" prepend="and">a.asno=#asno#</isNotNull> <isNotNull property="asno" prepend="and">a.asno=#asno#</isNotNull>
<isNotNull property="profandmainadmin" prepend="and">(a.usertype=11 or (a.usertype &gt; 80 and b.ismain=1))</isNotNull> <isNotNull property="profandmainadmin" prepend="and">(a.usertype=11 or (a.usertype &gt; 80 and b.ismain=1))</isNotNull>
<isNotNull property="asname" prepend="and">b.asname like concat('%',#asname#,'%')</isNotNull> <isNotNull property="asname" prepend="and">b.asname like concat('%',#asname#,'%')</isNotNull>
<!--<isNotNull property="asname" prepend="and">b.asname = #asname#</isNotNull>-->
<isNotEmpty property="brno" prepend="and">b.brno=#brno#</isNotEmpty> <isNotEmpty property="brno" prepend="and">b.brno=#brno#</isNotEmpty>
<isNotNull property="email" prepend="and"> <isNotNull property="email" prepend="and">
CAST(AES_DECRYPT(UNHEX(a.email), <include refid="sql.digest"></include>) AS char) like concat('%',#email#,'%') <!--CAST(AES_DECRYPT(UNHEX(a.email), <include refid="sql.digest"></include>) AS char) like concat('%',#email#,'%')-->
a.email=HEX(AES_ENCRYPT(#email#, <include refid="sql.digest"></include>))
</isNotNull> </isNotNull>
<isNotEmpty property="mobile" prepend="and"> <isNotEmpty property="mobile" prepend="and">
CAST(AES_DECRYPT(UNHEX(a.mobile), <include refid="sql.digest"></include>) AS char) like concat('%',#mobile#,'%') <!--CAST(AES_DECRYPT(UNHEX(a.mobile), <include refid="sql.digest"></include>) AS char) like concat('%',#mobile#,'%')-->
a.mobile=HEX(AES_ENCRYPT(#mobile#, <include refid="sql.digest"></include>))
</isNotEmpty> </isNotEmpty>
<isNotEmpty property="userpno" prepend="and"> <isNotEmpty property="userpno" prepend="and">
CAST(AES_DECRYPT(UNHEX(a.userpno), <include refid="sql.digest"></include>) AS char) like concat('%',#userpno#,'%') <!--CAST(AES_DECRYPT(UNHEX(a.userpno), <include refid="sql.digest"></include>) AS char) like concat('%',#userpno#,'%')-->
a.userpno=HEX(AES_ENCRYPT(#userpno#, <include refid="sql.digest"></include>))
</isNotEmpty> </isNotEmpty>
<isNotNull property="usertypeover" prepend="and">a.usertype &gt; #usertypeover#</isNotNull> <isNotNull property="usertypeover" prepend="and">a.usertype &gt; #usertypeover#</isNotNull>
<isNotNull property="vssn" prepend="and">a.vssn = #vssn#</isNotNull> <isNotNull property="vssn" prepend="and">a.vssn = #vssn#</isNotNull>
@ -379,15 +383,31 @@
</update> </update>
<update id="users.exitjoin" parameterClass="hashtable"> <update id="users.exitjoin" parameterClass="hashtable">
update users set <include refid="sql.up"></include> update users set <include refid="sql.up"></include>
,username='탈퇴회원',usernameeng=null,email=null,mobile=null,telno=null,userpno=null,bankno=null,post=null,address1=null,address2=null,birthday=null,di=null,ci=null,vssn=null,authplatform=0,status=99 ,username='삭제됨',usernameeng=null,email=null,mobile=null,telno=null,userpno=null,bankno=null,post=null,address1=null,address2=null,birthday=null,di=null,ci=null,vssn=null,authplatform=0,status=99
where where
<isNotNull property="userno">userno=#userno#</isNotNull> <isNotNull property="userno">userno=#userno#</isNotNull>
<isNotNull property="usernos">userno in ($usernos$)</isNotNull> <isNotNull property="usernos">userno in ($usernos$)</isNotNull>
</update> </update>
<update id="users.dormant" parameterClass="hashtable"> <!--<update id="users.dormant" parameterClass="hashtable">
update users set <include refid="sql.up"></include>,status=8 update users set <include refid="sql.up"></include>,status=8
where userno in ($usernos$) where userno in ($usernos$)
</update>-->
<update id="users.dormant" parameterClass="hashtable">
insert into userdormant(userno,username,usernameeng,email,isacceptemail,mobile
,telno,userpno,bankno,post,address1,address2,birthday,cdt)
select a.userno,a.username,a.usernameeng,a.email,a.isacceptemail,a.mobile
,a.telno,a.userpno,a.bankno,a.post,a.address1,a.address2, a.birthday,<include refid="sql.now"></include> cdt
from users a
left outer join userdormant b on b.userno = a.userno
where a.userno in ($usernos$)
and b.userno is null;
update users set <include refid="sql.up"></include>
,username='삭제됨',usernameeng=null,email=null,mobile=null,telno=null,userpno=null,bankno=null,post=null,address1=null,address2=null,birthday=null,status=8
where userno in ($usernos$);
</update> </update>
<select id="users.ee" parameterClass="int" resultClass="users"> <select id="users.ee" parameterClass="int" resultClass="users">
update users set eastereggkey=FLOOR(10000000 + (RAND() * 99999999)),eetime=<include refid="sql.now"></include> where userno=#userno#; update users set eastereggkey=FLOOR(10000000 + (RAND() * 99999999)),eetime=<include refid="sql.now"></include> where userno=#userno#;
select a.userno,a.eastereggkey,a.usertype,a.username select a.userno,a.eastereggkey,a.usertype,a.username
@ -773,6 +793,67 @@
update users set <isNotEmpty property="userpass">userpass=#userpass#,</isNotEmpty>udt=<include refid="sql.now"></include> where userno=#userno# update users set <isNotEmpty property="userpass">userpass=#userpass#,</isNotEmpty>udt=<include refid="sql.now"></include> where userno=#userno#
</update> </update>
<select id="users.dormants" parameterClass="hashtable" resultClass="users">
select a.userno,username,usernameeng,a.email,a.isacceptemail
,a.mobile,a.telno,a.userpno,a.bankno,a.post,a.address1,a.address2
,a.birthday
from userdormant a where a.userno = #userno#
</select>
<update id="users.dormant.cancel" parameterClass="hashtable">
update users a
left outer join userdormant b on b.userno = a.userno
set a.username = b.username
,a.usernameeng = b.usernameeng
,a.email = b.email
,a.isacceptemail = b.isacceptemail
,a.mobile = b.mobile
,a.telno = b.telno
,a.userpno = b.userpno
,a.bankno = b.bankno
,a.post = b.post
,a.address1 = b.address1
,a.address2 = b.address2
,a.birthday = b.birthday
,a.status =1
where a.userno in ($usernos$);
delete from userdormant where userno in ($usernos$);
</update>
<update id="users.dormant.delete" parameterClass="hashtable">
delete from userdormant where userno in ($usernos$);
</update>
<update id="users.dormant.del" parameterClass="hashtable">
update users a
left outer join userdormant b on b.userno = a.userno
set status = 99
where date_add(b.cdt,interval 1 year) &lt; now();
delete from userdormant where date_add(cdt,interval 1 year) &lt; now();
</update>
<select id="users.dormants.del" parameterClass="hashtable" resultClass="data">
select regexp_replace(b.userid , '(?&lt;=.{3}).','*') strval
,CAST(AES_DECRYPT(UNHEX(a.mobile),<include refid="sql.digest"></include>) AS char) strval2
,date_add(a.cdt, interval 335 day) time
,b.isacceptmobile intval
from userdormant a
inner join users b on b.userno = a.userno
where date_format(date_add(a.cdt, interval 335 day),'%Y-%m-%d') = date_format(now(),'%Y-%m-%d')
</select>
<select id="users.dormants.save" parameterClass="hashtable" resultClass="data">
select regexp_replace(a.userid , '(?&lt;=.{3}).' , '*') strval
,CAST(AES_DECRYPT(UNHEX(a.mobile),<include refid="sql.digest"></include>) AS char) strval2
,date_add(a.logintime, interval 366 day) time
,a.isacceptmobile intval
from users a
where a.usertype =1 and a.status=1
and date_format(date_add(a.logintime, interval 366 day),'%Y-%m-%d') = date_format(now(),'%Y-%m-%d')
</select>
</statements> </statements>
</sqlMap> </sqlMap>