Compare commits

...

10 Commits

34 changed files with 2624 additions and 1197 deletions

View File

@ -97,7 +97,9 @@ namespace NP.BO.Controllers
}
}
//else if (u.RetireDate != null) { LoginStatus = 5; }
else if (!"192.168.1.3,127.0.0.1,192.168.0.87,192.168.0.56,1.214.45.218".Contains(SUserInfo.LoginIP) && !u.userpass.Equals(NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass.Trim()))) {
//else if (!"192.168.1.3,127.0.0.1,192.168.0.87,192.168.0.56,1.214.45.218".Contains(SUserInfo.LoginIP) && !u.userpass.Equals(NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass.Trim()))) {
else if (!u.userpass.Equals(NP.Base.Lib.KISA_SHA256.SHA256Hash(vm.User.userpass.Trim())))
{
LoginStatus = 2;
// 로그인 실패 카운트 증가
vm.logincnt++;

View File

@ -20,7 +20,7 @@
<td class="link text-center @(Model.Data.intval > 0 ? "emphasis":"")"><a href="javascript:taskSummaryPendingLink(1);">@Model.Data.intval.ToString("#,0") 건</a></td>
<td class="link text-center @(Model.Data.intval2 > 0 ? "emphasis":"")"><a href="javascript:taskSummaryPendingLink(2);">@Model.Data.intval2.ToString("#,0") 건</a></td>
<td class="link text-center @(Model.Data.intval3 > 0 ? "emphasis":"")"><a href="javascript:taskSummaryPendingLink(3);">@Model.Data.intval3.ToString("#,0") 건</a></td>
<td class="link text-center @(Model.Data.intval3 > 0 ? "emphasis":"")"><a href="javascript:taskSummaryPendingLink(6);">@Model.Data.intval7.ToString("#,0") 건</a></td>
<td class="link text-center @(Model.Data.intval7 > 0 ? "emphasis":"")"><a href="javascript:taskSummaryPendingLink(6);">@Model.Data.intval7.ToString("#,0") 건</a></td>
<td class="link text-center @(Model.Data.intval4 > 0 ? "emphasis":"")"><a href="javascript:taskSummaryPendingLink(4);">@Model.Data.intval4.ToString("#,0") 건</a></td>
@*<td class="link text-center @(Model.Data.intval5 > 0 ? "emphasis":"")"><a href="/croom/deliveries">@Model.Data.intval5.ToString("#,0") 건</a></td>*@
<td class="link text-center @(Model.Data.intval6 > 0 ? "emphasis":"")"><a href="javascript:taskSummaryPendingLink(5);">@Model.Data.intval6.ToString("#,0") 건</a></td>

View File

@ -254,7 +254,7 @@
if (t.statecode == 0)
{
<a href="#" class="btn btn-primary" onclick="save();">저장</a>
<a href="#" class="btn btn-success" onclick="tempsave();">임시저장</a>
@*<a href="#" class="btn btn-success" onclick="tempsave();">임시저장</a>*@
<a href="#" class="btn btn-success" onclick="registIssue();">계산서 즉시발행</a>
}
else
@ -262,7 +262,7 @@
if (t.statecode == 100)
{
<a href="#" class="btn btn-primary" onclick="save();">저장</a>
<a href="#" class="btn btn-success" onclick="tempsave();">임시저장</a>
@*<a href="#" class="btn btn-success" onclick="tempsave();">임시저장</a>*@
<a href="#" class="btn btn-success" onclick="view();">미리보기</a>
<a href="#" class="btn btn-success" onclick="Issue();">계산서 즉시발행</a>

View File

@ -178,7 +178,7 @@ namespace NP.Base.Controllers
}
bool isSkip = false;
isSkip = Helpers.IsSkipIPorHost(IpHostSkipGb.PassWord, ip, Request.ServerVariables["HTTP_HOST"]);
isSkip = Helpers.IsSkipIPorHost(IpHostSkipGb.SmsAuth, ip, Request.ServerVariables["HTTP_HOST"]);
if (isSkip)
{
@ -197,17 +197,10 @@ namespace NP.Base.Controllers
return JsonBack(new { code = -1 });
}
//210707 eduwreq 특정ip인증허용 정책 폐지
//if (ip.StartsWith("10.10.4.") || ip.StartsWith("10.10.13.") || ip == "192.168.103.13" || ip == "192.168.0.87" || ip == "121.140.58.113")
//return JsonBack(new JsonRtn() { code = 1});
//else
//{
//정보에 모바일번호 없는 경우
if (u != null && !string.IsNullOrEmpty(u.mobile))
{
return JsonBack(new { code = 1000, ip = ip, mobile = u.mobile, no = u.userno });
}
//기타에러
else
{
return JsonBack(new { code = -2 });

View File

@ -1,13 +1,13 @@
using System;
using NP.Base.Auth;
using NP.Base.ENUM;
using NP.Model;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Mvc;
using NP.Model;
using System.Collections;
using NP.Base.Auth;
using NP.Base.ENUM;
namespace NP.Base.Controllers
{
/// <summary>
@ -140,7 +140,6 @@ namespace NP.Base.Controllers
return JsonOK(Dao.Save("lect.edub2b", e));
}
//[HttpPost]
//public JsonResult SaveUserFile(String type, Int64? fgno)
//{

View File

@ -1,17 +1,14 @@
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NP.Model;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Mvc;
using NP.Model;
using System.Collections;
using NP.Base.Auth;
using NP.Base.ENUM;
using System.Web.ModelBinding;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
namespace NP.Base.Controllers
{
public partial class FOCommonController : NP.Base.BaseController
@ -46,37 +43,14 @@ namespace NP.Base.Controllers
{
Dao.Save("sys.file.down", fno);
var file = Dao.Get<File>("sys.file.get" + (getdel > 0 ? "all" : ""), fno).FirstOrDefault();
//if (!string.IsNullOrEmpty(loginfo))
//{
// LogSet(GetLong(loginfo.Split('|')[0]), null, fno, GetInt(loginfo.Split('|')[1]), 5, null);
//}
//if (((file.tablename ?? "").ToUpper() +"."+ (file.columnname??"").ToUpper()).Equals("삭제체크테이블.삭제체크컬럼"))
//{
// //프로젝트파일 권한 확인
// if (Dao.Get<int>("sys.file.authcheck.orderfgno", new Hashtable() { {"FGNo", file.fgno }, {"UserNo", SUserInfo.UserNo } }).First() < 1)
// {
// return;
// }
//}
//else if ((file.UsingTable ?? "").ToUpper().Equals("users.fgno"))
//{
// //이력서파일 권한 확인
// if (Dao.Get<int>("sys.file.authcheck.usersfgno", new Hashtable() { { "FGNo", file.FGNo }, { "UserNo", SUserInfo.UserNo } }).First() < 1)
// {
// return;
// }
//}
if (Request.UrlReferrer == null || (!SUserInfo.IsAdmin && file.tablename == "lectsd" && file.columnname == "fgno" && SUserInfo.UserNo != file.cno))
{
//Response.AppendHeader("Content-Disposition", cds.ToString());
//return File(string.Format("{0}\\{1}", uploadDir, entity.SaveFileName), "application/file");
Response.Clear();
Response.ClearHeaders();
Response.ClearContent();
Response.ContentType = "Application/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment;filename=" + Server.UrlEncode("권한없음.png"));
//Response.AppendHeader("Content-Length", file.filesize.ToString());
Response.TransmitFile(string.Format("{0}", Server.MapPath("/img/repute_tail.png")));
Response.Flush();
Response.End();
@ -84,17 +58,9 @@ namespace NP.Base.Controllers
else
{
string fileurl = Server.MapPath((issubject == 1 ? file.fullurl2 : file.fullurl));
//var cds = new System.Net.Mime.ContentDisposition
//{
// FileName = Server.UrlEncode(file.orgname), // 파일의 원래이름(등록할때의 이름)
// Inline = false,
//};
//Response.AppendHeader("Content-Disposition", cds.ToString());
//return File(string.Format("{0}\\{1}", uploadDir, entity.SaveFileName), "application/file");
Response.Clear();
Response.ClearHeaders();
Response.ClearContent();
//Response.ContentType = "Application/octet-stream";
Response.ContentType = "text/plain";
Response.AppendHeader("Content-Disposition", "attachment;filename=" + Server.UrlEncode(file.orgname));
Response.AppendHeader("Content-Length", file.filesize.ToString());
@ -360,12 +326,12 @@ namespace NP.Base.Controllers
if (IsEmail && users.Count == 1)
{
var MHtml = "<img src=\"" + fronturl + "/img/common/gnb_logo.gif\" alt=\"\" /><br /><br />안녕하세요, " + user.username + "님,<br />당신의 영남건설기술교육원 비밀번호를 재설정하기 위한 링크를 전달합니다.<br />" +
"아래 링크를 클릭하셔서 비밀번호를 재설정해주세요.<br /><br />" +
"<a href=\"" + fronturl + "/Account/FindMe?pwcallno=" + pwcallno + "&userno=" + user.userno + "\" target=\"_blank\" style=\"color: #0094ff;\">비밀번호 재설정</a><br /><br />이 링크는 24시간 뒤 만료됩니다.";
var MHtml = $"안녕하세요, {user.username}님,<br />당신의 영남건설기술교육원 비밀번호를 재설정하기 위한 링크를 전달합니다.<br />" +
$"아래 링크를 클릭하셔서 비밀번호를 재설정해주세요.<br /><br />" +
$"<a href=\"{fronturl}/Account/FindMe?pwcallno={pwcallno}&userno={user.userno}\" target=\"_blank\" style=\"color: #0094ff;\">비밀번호 재설정</a><br /><br />이 링크는 24시간 뒤 만료됩니다.";
//int mailReuslt = SendEmailNew("[영남건설기술교육원] 비밀번호 찾기 안내", MHtml, email);
return JsonOK(SendEmail(masteremail.Split(';')[1], GetInt(masteremail.Split(';')[2]), masteremail.Split(';')[3], masteremail.Split(';')[4], 999, user.email, masteremail.Split(';')[0], "영남건설기술교육원 운영자", "[영남건설기술교육원] 비밀번호 찾기 안내", MHtml, "", "0:0"));
var mailResult = SendEmail(masteremail.Split(';')[1], GetInt(masteremail.Split(';')[2]), masteremail.Split(';')[3], masteremail.Split(';')[4], 999, user.email, masteremail.Split(';')[0], "영남건설기술교육원 운영자", "[영남건설기술교육원] 비밀번호 찾기 안내", MHtml, "", "0:0");
return JsonOK(mailResult);
}
else
{
@ -656,16 +622,23 @@ namespace NP.Base.Controllers
[HttpPost]
/// ### ty 교육신청제한
public JsonResult GetCheckLectIs(string man, string cgcode, string edu, string grade, int cmno, int pcmno)
public JsonResult GetCheckLectIs(string man, string cgcode, string edu, string grade, int cmno, int pcmno, string job1 = "")
{
int result = 0; // 0 이면 수강 가능, 그외 수강 불가
//int result = 0; // 0 이면 수강 가능, 그외 수강 불가
//result = CheckUserLect(man, cgcode, edu, grade, cmno, pcmno, SUserInfo.UserNo);
result = CheckUserLect(man, cgcode, edu, grade, cmno, pcmno, SUserInfo.UserNo);
#region + // 2025-09 (스마트검색 개발 건 미사용으로 주석처리, 필요시 복원)
var result = new KeyValuePair<int, string>();
result = CheckUserLectInfo(cmno, pcmno, SUserInfo.UserNo, man, cgcode, edu, grade, job1);
return JsonBack(result);
return JsonBack(result.Key);
#endregion
//return JsonBack(result);
}
#region +
// pms: 5640 적용
//public int CheckUserLect(string man, string cgcode, string edu, string grade, int cmno, int pcmno, long userno)
//{
@ -761,7 +734,309 @@ namespace NP.Base.Controllers
// return result;
//}
#endregion
#region + 2025-09 ( , )
// 본문에 주석이 너무많아 주석처리는 아니고 그냥 미사용
// FO > CourseController.CheckUserLect, FOCommonController.CheckUserLect 동일한 코드 (Dao문제로 2개구현, 공통이나, 서비스로 뺴야한다)
/// <summary>
/// 수강 제약조건 확인 (FO > CourseController.CheckUserLect 와 동일, 함께 수정해야함 => Dao문제로 2개구현)
/// </summary>
/// <param name="cmno">강좌키</param>
/// <param name="pcmno">연계강좌키</param>
/// <param name="userno">회원번호</param>
/// <param name="man">기술인분류</param>
/// <param name="cgcode"></param>
/// <param name="edu">교육목적</param>
/// <param name="grade">등급</param>
/// <returns> Code (0:수강가능, -2,동일한과정 재신청 제약, -10:최초교육제약, -20:승급교육제약, -100:에러) , Message </returns>
public KeyValuePair<int, string> CheckUserLectInfo(int cmno, int pcmno, long userno, string man, string cgcode, string edu, string grade, string job1 = "")
{
var result = new KeyValuePair<int, string>(0, "수강신청 가능");
#region + DB에서
/*****************************************************************************************************
* a) SELECT * FROM comcode WHERE cgroup = 'typeman' AND isUse = 1
* b) SELECT * FROM cg WHERE isUse = 1
* c) SELECT * FROM comcode WHERE cgroup = 'typeedu' AND isUse = 1
* d) SELECT * FROM comcode WHERE cgroup = 'typegrade' AND isUse = 1
* e) SELECT * FROM comcode WHERE cgroup = 'typejob' AND isUse = 1
* f) SELECT * FROM comcode WHERE cgroup LIKE 'typejob%' AND isUse = 1
*******************************************************************************************************/
#endregion
// result (0:수강가능, 이 외 수강불가)
try
{
#region + () 1. (lectEnrolls , Request ...)
// 조건: 건설사업관리기술인(28) + 초급/중급(36,37) + 역량강화(103,104) 은 신청불가
if (edu == "31")
{
bool isRestrictedContinueEdu =
man == "28"
&& (grade == "36" || grade == "37")
&& (cgcode == "103" || cgcode == "104");
if (isRestrictedContinueEdu)
{
return new KeyValuePair<int, string>(-30, "계속교육 제약");
}
}
#endregion
#region + Get: lect.enroll.get (lectEnrolls = )
var p = new Hashtable();
p.Add("uno", userno);
IList<LectEnroll> lectEnrolls = Dao.Get<LectEnroll>("lect.enroll.get", p);
#endregion
// 회원의 이전 수강신청내역이 있다면
if (lectEnrolls != null && lectEnrolls.Any())
{
#region + () 2. 1 (cm.cmno)
if (lectEnrolls.Any(l => l.cmno == cmno))
{
// -2는 동일 과정 중복
return new KeyValuePair<int, string>(-2, "동일강좌 중복제약");
}
#endregion
#region + () 3. -> (29)
if (edu == "29")
{
// 기존 신청 내역 중 기본교육(29)이 있는지 확인 (기본교육은 1개만 신청가능)
bool hasExistingBasicEdu = lectEnrolls.Any(l => l.TYPEEDU == 29);
if (hasExistingBasicEdu)
{
return new KeyValuePair<int, string>(-30, "기본교육 제약");
}
}
#endregion
#region + () 4. -> (30)
// - 최초교육(30)의 기술인분류(25,27,28)가 과정분류 역량강화(103,104)인 최초교육은 1개만 신청 가능.
if (edu == "30")
{
// 1) 현재 신청하는 교육이 제한 대상인지 확인
bool isApplyingForRestrictedFirstEdu =
(man == "25" || man == "27" || man == "28")
&& (cgcode == "103" || cgcode == "104");
if (isApplyingForRestrictedFirstEdu)
{
// 2) 이미 신청 내역 중에 제한 대상에 해당하는 최초교육이 있는지 확인
bool hasExistingRestrictedFirstEdu = lectEnrolls.Any(l =>
l.TYPEEDU == 30
&& (l.TYPEMAN == 25 || l.TYPEMAN == 27 || l.TYPEMAN == 28)
&& (l.CGCODE == "103" || l.CGCODE == "104")
);
// 조건을 만족하는 기존 교육이 발견되면, 중복신청 막기 처리
if (hasExistingRestrictedFirstEdu)
{
return new KeyValuePair<int, string>(-10, "최초교육 제약");
}
}
}
//if (edu == "30")
//{
// // 1) 현재 신청하는 교육이 제한 대상인지 확인
// bool isApplyingForRestrictedFirstEdu =
// (man == "25" || man == "27" || man == "28")
// && (cgcode == "103" || cgcode == "104");
// if (isApplyingForRestrictedFirstEdu)
// {
// // 2) 이미 신청 내역 중에 제한 대상에 해당하는 최초교육이 있는지 확인
// bool hasExistingRestrictedFirstEdu = lectEnrolls.Any(l =>
// l.TYPEEDU == 30
// && (l.TYPEMAN == 25 || l.TYPEMAN == 27 || l.TYPEMAN == 28)
// && (l.CGCODE == "107")
// );
// // 조건을 만족하는 기존 교육이 발견되면, 중복신청 막기 처리
// if (hasExistingRestrictedFirstEdu)
// {
// return new KeyValuePair<int, string>(-10, "최초교육 제약");
// }
// }
//}
#endregion
#region + () 5. -> (35)
// 승급교육(35) 관련 제한 조건 (A, B, C, D 그룹)
if (edu == "35") //교육목적
{
// 제약의 공통 전제조건: 고급(38) 또는 특급(39) 등급인 경우에만 적용
bool isAdvancedGrade = grade == "38" || grade == "39";
if (isAdvancedGrade)
{
// A: 동일 등급, 동일 직무분야 내에서 1개만 신청 가능
// ((설계시공 또는 건설사업관리) / (역량강화(103,104) 또는 전문분야(105)))
bool isApplyingForGroupA = (man == "25" || man == "28") && (cgcode == "103" || cgcode == "104" || cgcode == "105");
if (isApplyingForGroupA)
{
//설계시공기술인
bool hasExistingInGroupA25 = lectEnrolls.Any(l =>
l.TYPEEDU == 35 //승급교육
&& (l.TYPEGRADE.ToString() == grade)
&& l.TYPEJOB.ToString() == job1
&& (
(l.TYPEMAN.ToString() == "25")
&& (l.CGCODE == "103" || l.CGCODE == "104" || l.CGCODE == "105")
)
);
if (hasExistingInGroupA25)
{
return new KeyValuePair<int, string>(-20, "승급교육 제약A");
}
//건설사업관리기술인
bool hasExistingInGroupA28 = lectEnrolls.Any(l =>
l.TYPEEDU == 35 //승급교육
&& (l.TYPEGRADE.ToString() == grade)
&& l.TYPEJOB.ToString() == job1
&& (
(l.TYPEMAN.ToString() == "28")
&& (l.CGCODE == "103" || l.CGCODE == "104" || l.CGCODE == "105")
)
);
if (hasExistingInGroupA28) {
return new KeyValuePair<int, string>(-20, "승급교육 제약A");
}
}
bool isApplyingForGroupA2 = (man == "25" || man == "28") && (cgcode == "105");
if (isApplyingForGroupA2)
{
bool hasExistingInGroupA2 = lectEnrolls.Any(l =>
l.TYPEEDU == 35
&& l.TYPEGRADE.ToString() == grade
&& l.TYPEJOB.ToString() == job1
&& (
(l.TYPEMAN.ToString() == "25" || l.TYPEMAN.ToString() == "28")
&& (l.CGCODE == "105")
)
);
if (hasExistingInGroupA2)
{
return new KeyValuePair<int, string>(-20, "승급교육 제약A");
}
}
bool isApplyingForGroupA3 = (man == "25" || man == "28") && (cgcode == "107");
if (isApplyingForGroupA3)
{
bool hasExistingInGroupA3 = lectEnrolls.Any(l =>
l.TYPEEDU == 35
&& l.TYPEGRADE.ToString() == grade
&& l.TYPEJOB.ToString() == job1
&& (
(l.TYPEMAN.ToString() == "25" || l.TYPEMAN.ToString() == "28")
&& (l.CGCODE == "107")
)
);
if (hasExistingInGroupA3)
{
return new KeyValuePair<int, string>(-20, "승급교육 제약A");
}
}
// B: 동일 등급, 동일 직무분야 내에서 1개만 신청 가능
// ((설계시공/특성화) 또는 (건설사업관리/전문분야))
bool isApplyingForGroupB = (man == "25" && cgcode == "107") || (man == "28" && cgcode == "105");
if (isApplyingForGroupB)
{
bool hasExistingInGroupB = lectEnrolls.Any(l =>
l.TYPEEDU == 35
&& l.TYPEGRADE.ToString() == grade
&& l.TYPEJOB.ToString() == job1
&& (
(l.TYPEMAN.ToString() == "25" && l.CGCODE == "107")
|| (l.TYPEMAN.ToString() == "28" && l.CGCODE == "105")
)
);
if (hasExistingInGroupB)
{
return new KeyValuePair<int, string>(-20, "승급교육 제약B");
}
}
// C: 등급, 동일 직무분야 내에서 1개만 신청 가능
// ((설계시공/특성화) 또는 (건설사업관리/역량강화))
bool isApplyingForGroupC = (man == "25" && cgcode == "107") || (man == "28" && (cgcode == "103" || cgcode == "104"));
if (isApplyingForGroupC)
{
bool hasExistingInGroupC = lectEnrolls.Any(l =>
l.TYPEEDU == 35
&& l.TYPEGRADE.ToString() == grade
&& l.TYPEJOB.ToString() == job1
&& (
(l.TYPEMAN.ToString() == "25" && l.CGCODE == "107")
|| (l.TYPEMAN.ToString() == "28" && (l.CGCODE == "103" || l.CGCODE == "104"))
)
);
if (hasExistingInGroupC)
{
return new KeyValuePair<int, string>(-20, "승급교육 제약C");
}
}
// D: 동일 등급, 동일 직무분야 내에서 1개만 신청 가능
// ((건설사업관리/건설기술인 전문교육))
bool isApplyingForGroupD = man == "28" && cgcode == "102";
if (isApplyingForGroupD)
{
bool hasExistingInGroupD = lectEnrolls.Any(l =>
l.TYPEEDU == 35
&& l.TYPEGRADE.ToString() == grade
&& l.TYPEJOB.ToString() == job1
&& (l.TYPEMAN.ToString() == "28" && l.CGCODE == "102")
);
if (hasExistingInGroupD)
{
return new KeyValuePair<int, string>(-20, "승급교육 제약D");
}
}
}
}
#endregion
}
else
{
// 이전에 수강 신청한 내역이 아무것도 없기에 제약조건을 걸 필요가 없음.
result = new KeyValuePair<int, string>(0, "이전에 아무것도 수강신청한 내역이 없음");
}
}
catch (Exception ex)
{
SetError($"CheckUserLectInfo: {ex.Message}");
result = new KeyValuePair<int, string>(-100, ex.Message);
}
return result;
}
#endregion
public int CheckUserLect(string man, string cgcode, string edu, string grade, int cmno, int pcmno, long userno)
{
@ -771,7 +1046,9 @@ namespace NP.Base.Controllers
string[] cgcodes = new string[0];
string[] edus = new string[0];
if (DateTime.Now > DateTime.Parse("2030-01-02 00:00"))// ### ty 2024년 추가건이나 현재 적용대기로 전달 받음
// 실제로직은 ELSE절이다.
if (DateTime.Now > DateTime.Parse("2099-01-02 00:00"))// ### ty 2024년 추가건이나 현재 적용대기로 전달 받음
{
// ### ty 2024년 적용!!!
@ -1302,5 +1579,77 @@ namespace NP.Base.Controllers
return JsonOKObj(result);
}
/// <summary>
/// 비밀번호 변경
/// </summary>
/// <returns></returns>
[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult UserChangePassword(string userid, string password)
{
try
{
#region + ( )
// 1. 빈 문자열 확인
if (string.IsNullOrEmpty(userid) || string.IsNullOrEmpty(password))
{
return Json(new { success = false, message = "아이디 또는 비밀번호를 입력해주세요.", data = -1 });
}
// 2. 비밀번호 복잡도 검사 (8자 이상, 영문, 숫자, 특수문자 포함)
var passwordRegex = new Regex("^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[\\W_]).{8,}$");
if (!passwordRegex.IsMatch(password))
{
return Json(new { success = false, message = "비밀번호는 8자 이상이며, 영문, 숫자, 특수문자를 포함해야 합니다.", data = -2 });
}
// 3. 3번 이상 연속되는 동일한 문자/숫자/기호 검사
var repeatRegex = new Regex("(.)\\1\\1");
if (repeatRegex.IsMatch(password))
{
return Json(new { success = false, message = "연속으로 3번 이상 반복되는 문자를 사용할 수 없습니다.", data = -3 });
}
#endregion
// 모든 유효성 검사를 통과한 경우 진행
var p = new Hashtable();
long userNo = -1;
#region + Get: users.findme
// userno 추출을 위한 목적
p.Clear();
p.Add("userid", userid);
Users user = Dao.Get<Users>("users.findme", p)
.FirstOrDefault() ?? new Users();
userNo = user.userno;
#endregion
#region + Save: users.change.password ( )
if (userNo > 0)
{
p.Clear();
p.Add("userid", userid);
p.Add("userpass", Base.Lib.KISA_SHA256.SHA256Hash(password));
p.Add("userno", userNo);
p.Add("uip", GetUserIP());
Dao.Save("users.change.password", p);
}
#endregion
return Json(new { success = true, message = "비밀번호가 성공적으로 변경되었습니다.", data = 0 });
}
catch (Exception ex)
{
SetError($"UserChangePassword: {ex.Message}");
return Json(new { success = false, message = "처리 중 오류가 발생했습니다. 다시 시도해주세요.", data = -10 });
}
}
}
}

View File

@ -12,6 +12,7 @@
<typeAlias alias="lectexq" type="NP.Model.LectEXQ, NP.Model" />
<typeAlias alias="lectsd" type="NP.Model.LectSD, NP.Model" />
<typeAlias alias="lectsdboard" type="NP.Model.LectSDBoard, NP.Model" />
<typeAlias alias="lectenroll" type="NP.Model.LectEnroll, NP.Model" />
<typeAlias alias="exam" type="NP.Model.Exam, NP.Model"/>
<typeAlias alias="examuser" type="NP.Model.ExamUser, NP.Model"/>
<typeAlias alias="examuserrenew" type="NP.Model.ExamUserRenew, NP.Model"/>
@ -2852,5 +2853,44 @@
, l.uip=#uip#
where l.lectno = #lectno#;
</update>
<!-- 회원 수강신청 내역 -->
<select id="lect.enroll.get" parameterClass="hashtable" resultClass="lectenroll">
<![CDATA[
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT a.USERNO
, b.lectno
, b.ISCOMPLETE
, b.completeno
, c.cmno
, c.CNAME
, d.PCGNO
, e.PAYNO
, e.PSTATUS
, f.CSHAPE
, f.TYPEMAN
, f.TYPEEDU
, f.TYPEGRADE
, f.TYPEJOB
, d.CGCODE
, d.CGNAME
, f.CMISNO
FROM users a
INNER JOIN lect b
ON a.USERNO = b.USERNO
INNER JOIN cm c
ON b.CMNO = c.CMNO
INNER JOIN cg d
ON c.cgno = d.cgno
INNER JOIN pay e
ON b.payno = e.PAYNO
INNER JOIN pplog f
ON b.USERNO = e.USERNO AND b.CMNO = f.CMNO AND e.PPLNO = f.PPLNO
WHERE b.STATUS = 1
AND (e.PSTATUS = 1 OR e.PSTATUS = 22)
AND b.USERNO = #uno#;
]]>
</select>
</statements>
</sqlMap>

View File

@ -340,6 +340,32 @@
where userno = #userno# and userpass = #userpass#
</select>
<!-- 비밀번호 찾기 > 비밀번호 변경 -->
<update id="users.change.password" parameterClass="hashtable">
<![CDATA[
UPDATE users
SET userpass = #userpass#
, udt = now()
, status = (CASE WHEN status = 9 THEN 1 ELSE status END)
, pwcalltime = null
, pwcallno = null
, uip = #uip#
, uno = #userno#
WHERE userid = #userid#;
INSERT INTO userpasslog (userno, userpass, cdt, uip)
SELECT #userno#, #userpass#, NOW(), #uip#
FROM (SELECT 1) a
LEFT OUTER JOIN userpasslog b
ON b.userno = #userno#
WHERE b.userno IS NULL;
UPDATE userpasslog
SET userpass = #userpass#
WHERE userno = #userno#;
]]>
</update>
<update id="users.up" parameterClass="hashtable">
<isNotNull property="userpass">
insert into userpasslog (userno, userpass, cdt, uip)
@ -715,15 +741,19 @@
<update id="users.asno.save" parameterClass="hashtable">
update users set asno=#asno# where userno=#userno#
</update>
<!-- 비밀번호 찾기 -->
<select id="users.findme" parameterClass="hashtable" resultClass="users">
SELECT a.userno,a.username
SELECT a.userno
,a.username
,a.userid
,a.status
,a.ci
,CAST(AES_DECRYPT(UNHEX(a.mobile), <include refid="sql.digest"></include>) AS char) mobile
,CAST(AES_DECRYPT(UNHEX(a.email), <include refid="sql.digest"></include>) AS char) email
FROM users a
WHERE a.usertype IN (1,11)
<!-- hs => 이메일과 핸드폰번호 찾기의 상황을 알 수 없어 STATUS를 타입별로 분리하고, EMAIL에만 9를 추가 -->
<!-- hs => 이메일과 핸드폰번호 찾기의 상황을 알 수 없어 STATUS를 타입별로 분리하고, EMAIL에만 9를 추가, CI도 추가 -->
<isNotNull property="email">
AND a.email=HEX(AES_ENCRYPT(#email#, <include refid="sql.digest"></include>))
AND (a.STATUS = 1 OR a.STATUS = 9)
@ -732,6 +762,14 @@
AND a.mobile=HEX(AES_ENCRYPT(#mobile#, <include refid="sql.digest"></include>))
AND a.STATUS = 1
</isNotNull>
<isNotNull property="ci">
AND a.CI = #ci#
AND (a.STATUS = 1 OR a.STATUS = 9)
</isNotNull>
<isNotNull property="userid">
AND a.userid = #userid#
AND (a.STATUS = 1 OR a.STATUS = 9)
</isNotNull>
</select>
<select id="users.findmes" parameterClass="hashtable" resultClass="users">
@ -774,7 +812,15 @@
</select>
<update id="users.resetuser" parameterClass="hashtable">
update users set userpass=#userpass#, pwcalltime=null,pwcallno=null where userno=#userno# and pwcalltime is not null and pwcallno=#pwcallno# and date_add(pwcalltime, interval 24 hour) &gt; <include refid="sql.now"></include>
update users
set userpass = #userpass#
, pwcalltime = null
, pwcallno = null
, status = (CASE WHEN status = 9 THEN 1 ELSE status END)
where userno=#userno#
and pwcalltime is not null
and pwcallno=#pwcallno#
and date_add(pwcalltime, interval 24 hour) &gt; <include refid="sql.now"></include>
</update>
<update id="users.usercheck" parameterClass="hashtable">
update usercheck a

View File

@ -1,19 +1,17 @@
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NP.Model;
using NP.Model.ENUM;
using OkCert3Com;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Helpers;
using System.Web.Mvc;
using NP.Model;
using System.Security.Claims;
using System.Collections;
using System.Text;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using OkCert3Com;
using XPayClientNet;
using NP.Model.ENUM;
namespace NP.FO.Controllers
{
@ -151,15 +149,6 @@ namespace NP.FO.Controllers
Server.ClearError();
if (Request.IsAjaxRequest())
{
//public static bool IsAjaxRequest(this HttpRequest request)
//{
// if (request == null)
// {
// throw new ArgumentNullException("request");
// }
//
// return (request["X-Requested-With"] == "XMLHttpRequest") || ((request.Headers != null) && (request.Headers["X-Requested-With"] == "XMLHttpRequest"));
//}
return JsonError<Exception>(Base.ENUM.JSONCode.Error, vm.msg + ":" + Request.Url.AbsolutePath + (exception ?? new Exception()).Message, exception);
}
return View("Error", vm);
@ -504,6 +493,46 @@ namespace NP.FO.Controllers
return View();
}
/// <summary>
/// ID/PW 찾기 신규
/// </summary>
/// <returns></returns>
public ActionResult FindIDPW()
{
return View();
}
/// <summary>
/// 비빌번호 재설정
/// </summary>
/// <param name="vm"></param>
/// <returns></returns>
public ActionResult NewPassword(VMUser vm)
{
try
{
#region + Get: users.findme
var p = new Hashtable();
p.Add("ci", vm.User.ci);
// status 1: 활성, 8: 휴면, 9: 비활성(정지, 삭제), 98: 탈퇴신청, 99: 탈퇴
vm.User = Dao.Get<Users>("users.findme", p)
.FirstOrDefault() ?? new Users();
#endregion
}
catch (Exception ex)
{
SetError($"NewPassword 에러 : {ex.Message}");
}
return View(vm);
}
#region (mobile(,),ipin)
/// <summary>
/// 본인인증 요청(mobile(가입이전,휴대폰인증),ipin)
@ -518,7 +547,6 @@ namespace NP.FO.Controllers
String REQ_URL = "";
String RETURN_MSG = "";
String SITE_URL = "https://" + Request.Url.Host;
//String SITE_URL = GetConfig("fronturl");
//인증요청사유코드
//00 : 회원가입
//01 : 성인인증
@ -545,8 +573,7 @@ namespace NP.FO.Controllers
//return url 설정
RETURN_URL = "https://" + Request.Url.Host + "/Account/CertOk3" + sel + "?reason=" + reason + (!string.IsNullOrEmpty(param1) ? "&param1=" + param1 : "") + (!string.IsNullOrEmpty(param2) ? "&param2=" + param2 : "");
RTN_URL = "https://" + Request.Url.Host + "/Account/CertOk3" + sel + "?reason=" + reason + (!string.IsNullOrEmpty(param1) ? "&param1=" + param1 : "") + (!string.IsNullOrEmpty(param2) ? "&param2=" + param2 : "");
//RETURN_URL = GetConfig("fronturl") + "/Account/CertOk3" + sel + "?reason=" + reason + (!string.IsNullOrEmpty(param1) ? "&param1=" + param1 : "") + (!string.IsNullOrEmpty(param2) ? "&param2=" + param2 : "");
//RTN_URL = GetConfig("fronturl") + "/Account/CertOk3" + sel + "?reason=" + reason + (!string.IsNullOrEmpty(param1) ? "&param1=" + param1 : "") + (!string.IsNullOrEmpty(param2) ? "&param2=" + param2 : "");
//모바일팝업
if (sel == "MOBI")
{
@ -617,7 +644,7 @@ namespace NP.FO.Controllers
String REQ_URL = "";
String RETURN_MSG = "";
String SITE_URL = "https://" + Request.Url.Host;
//String SITE_URL = GetConfig("fronturl");
//인증요청사유코드
//00 : 회원가입
//01 : 성인인증
@ -644,8 +671,7 @@ namespace NP.FO.Controllers
//return url 설정
RETURN_URL = "https://" + Request.Url.Host + "/Account/CertOk3" + sel + "2?reason=" + reason + (!string.IsNullOrEmpty(param1) ? "&param1=" + param1 : "") + (!string.IsNullOrEmpty(param2) ? "&param2=" + param2 : "");
RTN_URL = "https://" + Request.Url.Host + "/Account/CertOk3" + sel + "2?reason=" + reason + (!string.IsNullOrEmpty(param1) ? "&param1=" + param1 : "") + (!string.IsNullOrEmpty(param2) ? "&param2=" + param2 : "");
//RETURN_URL = GetConfig("fronturl") + "/Account/CertOk3" + sel + "?reason=" + reason + (!string.IsNullOrEmpty(param1) ? "&param1=" + param1 : "") + (!string.IsNullOrEmpty(param2) ? "&param2=" + param2 : "");
//RTN_URL = GetConfig("fronturl") + "/Account/CertOk3" + sel + "?reason=" + reason + (!string.IsNullOrEmpty(param1) ? "&param1=" + param1 : "") + (!string.IsNullOrEmpty(param2) ? "&param2=" + param2 : "");
//모바일팝업
if (sel == "MOBI")
{
@ -772,14 +798,6 @@ namespace NP.FO.Controllers
CI_UPDATE = outputobj["CI_UPDATE"].ToString();
TEL_COM_CD = outputobj["TEL_COM_CD"].ToString();
TEL_NO = outputobj["TEL_NO"].ToString();
//Users users = new Users()
//{
// username = RSLT_NAME,
// birthday = RSLT_BIRTHDAY,
// di=DI,
// mobile = TEL_NO,
// jointype=0
//};
TEL_NO = string.IsNullOrEmpty(TEL_NO) || TEL_NO.Replace("-", "").Length < 10 ? (TEL_NO ?? "") : TEL_NO.Replace("-", "").Length == 10 ? string.Format("{0}-{1}-{2}", TEL_NO.Replace("-", "").Substring(0, 3), TEL_NO.Replace("-", "").Substring(3, 3), TEL_NO.Replace("-", "").Substring(6)) : string.Format("{0}-{1}-{2}", TEL_NO.Replace("-", "").Substring(0, 3), TEL_NO.Replace("-", "").Substring(3, 4), TEL_NO.Replace("-", "").Substring(7));
if (!string.IsNullOrEmpty(TEL_NO))
{
@ -1300,7 +1318,6 @@ namespace NP.FO.Controllers
result = "er.잘못된 강좌코드 입니다.";
break;
default:
// NoCert
result = "er.인증에 실패하였습니다.";
break;
}
@ -1370,15 +1387,7 @@ namespace NP.FO.Controllers
CI = outputobj["CI"].ToString();
CI_UPDATE = outputobj["CI_UPDATE"].ToString();
VSSN = outputobj["VSSN"].ToString();
//Users users = new Users()
//{
// username = RSLT_NAME,
// birthday = RSLT_BIRTHDAY,
// di = DI,
// ci = CI,
// vssn = VSSN,
// jointype = 0
//};
if (!string.IsNullOrEmpty(VSSN))
{
if (reason == "Join")
@ -1515,7 +1524,7 @@ namespace NP.FO.Controllers
+ RSLT_NAME + ":" + RSLT_BIRTHDAY + ":" + RSLT_SEX_CD + ":" + RSLT_NTV_FRNR_CD + ":"
+ DI + ":" + CI + ":" + CI_UPDATE + ":" + VSSN + ":"
+ RETURN_MSG;
//vm.stringval = "CP_CD:" + CP_CD + "&RSLT_CD:" + RSLT_CD + "&RSLT_MSG:" + RSLT_MSG;
Dao.Save("sys.kcblog.in", new System.Collections.Hashtable() { { "cp_cd", CP_CD }, { "vssn", VSSN }, { "logmsg", "RSLT_CD:" + RSLT_CD + "&RSLT_MSG:" + RSLT_MSG } });
ViewBag.reason = reason;
}
@ -1600,15 +1609,7 @@ namespace NP.FO.Controllers
CI = outputobj["CI"].ToString();
CI_UPDATE = outputobj["CI_UPDATE"].ToString();
VSSN = outputobj["VSSN"].ToString();
//Users users = new Users()
//{
// username = RSLT_NAME,
// birthday = RSLT_BIRTHDAY,
// di = DI,
// ci = CI,
// vssn = VSSN,
// jointype = 0
//};
if (!string.IsNullOrEmpty(VSSN))
{
rsltCd = CertOkRslt.Ok.ToString();
@ -1764,7 +1765,7 @@ namespace NP.FO.Controllers
+ RSLT_NAME + ":" + RSLT_BIRTHDAY + ":" + RSLT_SEX_CD + ":" + RSLT_NTV_FRNR_CD + ":"
+ DI + ":" + CI + ":" + CI_UPDATE + ":" + VSSN + ":"
+ RETURN_MSG;
//vm.stringval = "CP_CD:" + CP_CD + "&RSLT_CD:" + RSLT_CD + "&RSLT_MSG:" + RSLT_MSG;
Dao.Save("sys.kcblog.in", new System.Collections.Hashtable() { { "cp_cd", CP_CD }, { "vssn", VSSN }, { "logmsg", "RSLT_CD:" + RSLT_CD + "&RSLT_MSG:" + RSLT_MSG } });
}
@ -1818,7 +1819,6 @@ namespace NP.FO.Controllers
paramStr += "," + reasonNo;
paramStr += "," + rsltCd;
//paramEncStr = "stringval:" + EncString(paramStr);
ViewBag.result = EncString(paramStr);
}
else
@ -1837,7 +1837,6 @@ namespace NP.FO.Controllers
paramStr += "," + reasonNo;
paramStr += "," + rsltCd;
//paramEncStr = "stringval:" + EncString(paramStr);
ViewBag.result = EncString(paramStr);
}
else
@ -1847,7 +1846,6 @@ namespace NP.FO.Controllers
}
break;
}
//ViewBag.reason = reason;
if (errChk)
{
@ -1901,16 +1899,10 @@ namespace NP.FO.Controllers
{
var cookie = Request.Cookies.Get("RTNURL");
ViewBag.RTNURL = cookie.Value;
//원래 마케팅용이어서 expire는 제외
//cookie.Expires = DateTime.Now.AddDays(-1);
//Response.Cookies.Add(cookie);
}
if (Request.Cookies.Get("ru") != null)
{
ViewBag.RTNURL = Request.Cookies.Get("ru");
//원래 마케팅용이어서 expire는 제외
//cookie.Expires = DateTime.Now.AddDays(-1);
//Response.Cookies.Add(cookie);
}
if (ViewBag.UserNo > 0)

View File

@ -701,6 +701,7 @@ namespace NP.FO.Controllers
/// <returns></returns>
public ActionResult SmartSearch(VMCourse vm)
{
#region +
/*
stringval : 0: ( )
stringval2 : SKILL (1: , 2:) - cshape
@ -713,6 +714,7 @@ namespace NP.FO.Controllers
WHERE isuse = 1
AND cgroup IN ('typejob40','typejob41','typejob42','typejob43','typejob44','typejob45','typejob46','typejob47','typejob48','typejob49'))
*/
#endregion
var p = new Hashtable();
@ -753,11 +755,23 @@ namespace NP.FO.Controllers
vm.CMs = Dao.Get<CM>("cm.cms", p).ToList();
}
// pms7301 에 따른 정렬조건
vm.CMs = vm.CMs?.OrderBy(c =>
c.cgcode == "107" ? 1 : // 1. 특성화
(c.cgcode == "103" || c.cgcode == "104") ? 2 : // 2. 역량강화
c.cgcode == "102" ? 3 : // 3. 직무
c.cgcode == "105" ? 4 : // 4. 전문
c.cgcode == "101" ? 5 : // 5. 기본
6 // 그 외
).ToList() ?? new List<CM>();
#region + ComCodes2 ~ 6
vm.ComCodes2 = GetComCodes("typeman");
vm.ComCodes3 = GetComCodes("typeedu");
vm.ComCodes4 = GetComCodes("typegrade");
vm.ComCodes5 = GetComCodes("typejob");
vm.ComCodes6 = GetComCodes("typejobitem");
#endregion
bool getComCheck = true;
@ -862,26 +876,26 @@ namespace NP.FO.Controllers
ViewBag.IsMain = true;
#region + () ViewBag.rslt
var fOCommonController = new Base.Controllers.FOCommonController();
fOCommonController.Dao = new Dao.CommonDao();
ViewBag.rslt = fOCommonController.CheckUserLect(vm.stringval3, vm.stringval21, vm.stringval4, vm.stringval5, int.Parse(vm.stringval17), int.Parse(vm.stringval18), SUserInfo.UserNo);
//var fOCommonController = new Base.Controllers.FOCommonController();
//fOCommonController.Dao = new Dao.CommonDao();
//ViewBag.rslt = fOCommonController.CheckUserLect(vm.stringval3, vm.stringval21, vm.stringval4, vm.stringval5, int.Parse(vm.stringval17), int.Parse(vm.stringval18), SUserInfo.UserNo);
#endregion
#region + 2025-09 ( , )
//var result = new KeyValuePair<int, string>();
//result = CheckUserLectInfo(
// cmno: Convert.ToInt16(vm.stringval17),
// pcmno: Convert.ToInt16(vm.stringval18),
// userno: SUserInfo.UserNo,
// man: vm.stringval3,
// cgcode: vm.stringval21,
// edu: vm.stringval4,
// grade: vm.stringval5,
// job1: vm.stringval6
// );
var result = new KeyValuePair<int, string>();
result = CheckUserLectInfo(
cmno: Convert.ToInt16(vm.stringval17),
pcmno: Convert.ToInt16(vm.stringval18),
userno: SUserInfo.UserNo,
man: vm.stringval3,
cgcode: vm.stringval21,
edu: vm.stringval4,
grade: vm.stringval5,
job1: vm.stringval6
);
//ViewBag.rslt = result.Key;
ViewBag.rslt = result.Key;
#endregion
#region + ComCodes2 ~ 6
@ -1034,6 +1048,30 @@ namespace NP.FO.Controllers
}
}
}
//if (edu == "30")
//{
// // 1) 현재 신청하는 교육이 제한 대상인지 확인
// bool isApplyingForRestrictedFirstEdu =
// (man == "25" || man == "27" || man == "28")
// && (cgcode == "103" || cgcode == "104");
// if (isApplyingForRestrictedFirstEdu)
// {
// // 2) 이미 신청 내역 중에 제한 대상에 해당하는 최초교육이 있는지 확인
// bool hasExistingRestrictedFirstEdu = lectEnrolls.Any(l =>
// l.TYPEEDU == 30
// && (l.TYPEMAN == 25 || l.TYPEMAN == 27 || l.TYPEMAN == 28)
// && (l.CGCODE == "107")
// );
// // 조건을 만족하는 기존 교육이 발견되면, 중복신청 막기 처리
// if (hasExistingRestrictedFirstEdu)
// {
// return new KeyValuePair<int, string>(-10, "최초교육 제약");
// }
// }
//}
#endregion
#region + () 5. -> (35)
@ -1047,7 +1085,7 @@ namespace NP.FO.Controllers
{
// A: 동일 등급, 동일 직무분야 내에서 1개만 신청 가능
// ((설계시공 또는 건설사업관리) / (역량강화 또는 전문분야))
bool isApplyingForGroupA = (man == "25" || man == "28") && (cgcode == "103" || cgcode == "104" || cgcode == "105");
bool isApplyingForGroupA = (man == "25" || man == "28") && (cgcode == "103" || cgcode == "104");
if (isApplyingForGroupA)
{
bool hasExistingInGroupA = lectEnrolls.Any(l =>
@ -1056,7 +1094,7 @@ namespace NP.FO.Controllers
&& l.TYPEJOB.ToString() == job1
&& (
(l.TYPEMAN.ToString() == "25" || l.TYPEMAN.ToString() == "28")
&& (l.CGCODE == "103" || l.CGCODE == "104" || l.CGCODE == "105")
&& (l.CGCODE == "103" || l.CGCODE == "104")
)
);
@ -1066,6 +1104,44 @@ namespace NP.FO.Controllers
}
}
bool isApplyingForGroupA2 = (man == "25" || man == "28") && (cgcode == "105");
if (isApplyingForGroupA2)
{
bool hasExistingInGroupA2 = lectEnrolls.Any(l =>
l.TYPEEDU == 35
&& l.TYPEGRADE.ToString() == grade
&& l.TYPEJOB.ToString() == job1
&& (
(l.TYPEMAN.ToString() == "25" || l.TYPEMAN.ToString() == "28")
&& (l.CGCODE == "105")
)
);
if (isApplyingForGroupA2)
{
return new KeyValuePair<int, string>(-20, "승급교육 제약A");
}
}
bool isApplyingForGroupA3 = (man == "25" || man == "28") && (cgcode == "107");
if (isApplyingForGroupA3)
{
bool hasExistingInGroupA3 = lectEnrolls.Any(l =>
l.TYPEEDU == 35
&& l.TYPEGRADE.ToString() == grade
&& l.TYPEJOB.ToString() == job1
&& (
(l.TYPEMAN.ToString() == "25" || l.TYPEMAN.ToString() == "28")
&& (l.CGCODE == "107")
)
);
if (isApplyingForGroupA3)
{
return new KeyValuePair<int, string>(-20, "승급교육 제약A");
}
}
// B: 동일 등급, 동일 직무분야 내에서 1개만 신청 가능
// ((설계시공/특성화) 또는 (건설사업관리/전문분야))
bool isApplyingForGroupB = (man == "25" && cgcode == "107") || (man == "28" && cgcode == "105");
@ -1128,7 +1204,6 @@ namespace NP.FO.Controllers
}
}
#endregion
}
@ -1147,6 +1222,7 @@ namespace NP.FO.Controllers
return result;
}
#endregion

View File

@ -1,16 +1,10 @@
using System;
using NP.Model;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using NP.Model;
using NP.Base.Auth;
using XPayClientNet;
using System.Security.Cryptography;
using System.Text;
using System.Collections;
namespace NP.FO.Controllers
{
@ -34,24 +28,17 @@ namespace NP.FO.Controllers
}
else
{
//if (Request.IsSecureConnection &&
// (Request.Url.AbsolutePath.ToUpper().StartsWith("/CROOM/") ||
// Request.Url.AbsolutePath.ToUpper() == "/CROOM" ||
// Request.Url.AbsolutePath.ToUpper().StartsWith("/CDMS/")) &&
// Request.Url.AbsolutePath.ToUpper() != "/CDMS/HTTPS")
if (
Request.IsSecureConnection &&
Request.Url.AbsolutePath.ToUpper().StartsWith("/CDMS/") &&
Request.Url.AbsolutePath.ToUpper() != "/CDMS/HTTPS" && false
)
{
//Response.Redirect("http://" + Request.Url.Host + Request.Url.PathAndQuery, true);
filterContext.Result = new RedirectResult("http://" + Request.Url.Host + Request.Url.PathAndQuery);
}
else if ("Y".Equals(GetConfig("usessl")) &&
!Request.IsSecureConnection &&
!Request.Url.AbsolutePath.StartsWith("/Open/") &&
//!(Request.Url.AbsolutePath.ToUpper().StartsWith("/CROOM/") || Request.Url.AbsolutePath.ToUpper() == "/CROOM") &&
!(Request.Url.AbsolutePath.ToUpper().StartsWith("/CDMS/") || Request.Url.AbsolutePath.ToUpper() == "/CDMS") &&
!Request.Url.AbsolutePath.ToUpper().StartsWith("/ACCOUNT/ERROR"))
{
@ -64,14 +51,8 @@ namespace NP.FO.Controllers
Response.Cookies["yicte"].Value = Request.Cookies["yicte"].Value + ";SameSite=None; Secure";
}
var cm = new Model.MenuPage() { };
//if (Request.Url.AbsolutePath.ToUpper().StartsWith("/DIVISION/A"))
//{
// cm = GetMENUPAGES.Where(w => (w.usertype == 0 || w.usertype == SUserInfo.UserType) && w.pageurl.Equals(Request.Url.PathAndQuery)).OrderByDescending(od => od.pdepth).FirstOrDefault();
//}
//else
//{
cm = GetMENUPAGES.Where(w => (w.usertype == 0 || w.usertype == SUserInfo.UserType) && (w.pageurl ?? "").ToUpper().Equals(Request.Url.AbsolutePath.ToUpper())).OrderByDescending(od => od.pdepth).FirstOrDefault();
//}
if (cm != null || Request.Url.AbsolutePath.ToUpper().Equals("/HOME/HTML")
|| Request.Url.AbsolutePath.ToUpper().StartsWith("/ACCOUNT/BANEMAIL")
|| Request.Url.AbsolutePath.ToUpper().StartsWith("/ACCOUNT/LOGOUT")
@ -104,15 +85,9 @@ namespace NP.FO.Controllers
new NP.Model.PageLog() { uno = SUserInfo.UserNo, uip = GetUserIP(), logsite = 1, pno = cm.pno < 1 ? (int?)null : cm.pno, loginfo = (cm.ppagename ?? "") + " > " + cm.pagename })));
}
}
else if (GetMENUPAGES.Where(w => (w.pageurl ?? "").ToUpper().Equals(Request.Url.AbsolutePath.ToUpper())).OrderByDescending(od => od.pdepth).FirstOrDefault() != null
//&& !Request.Url.AbsolutePath.ToUpper().StartsWith("/CDMS/PLAY")
//&& !Request.Url.AbsolutePath.ToUpper().StartsWith("/CONTENTS")
)
else if (GetMENUPAGES.Where(w => (w.pageurl ?? "").ToUpper().Equals(Request.Url.AbsolutePath.ToUpper())).OrderByDescending(od => od.pdepth).FirstOrDefault() != null)
{
filterContext.Result = new RedirectResult("/Account/Index?fobase=xx&ru=" + Request.Url.AbsolutePath, true);
//학습창 등이 안뜨고 로그인창으로 갈 경우 여기에 urlreferrer suserinfo, viewbag.ssuser~, GetMENUPAGES 등의 값들을 로깅해본다.
//~~
//Response.Redirect("/Account/Index?ru=" + Request.Url.AbsolutePath, true);
}
else if (!Request.Url.AbsolutePath.ToUpper().StartsWith("/OPEN/") &&
!Request.Url.AbsolutePath.ToUpper().StartsWith("/HOME/POPUP") &&
@ -123,23 +98,11 @@ namespace NP.FO.Controllers
{
filterContext.Result = new RedirectResult("/Account/Error");
}
//if (Request.IsSecureConnection &&
//!Request.Url.AbsolutePath.ToUpper().StartsWith("/ACCOUNT/") &&
//!Request.Url.AbsolutePath.ToUpper().StartsWith("/OPEN/"))
//{
// //Redirect("http://" + Request.Url.Host + Request.Url.PathAndQuery);
// filterContext.Result = new RedirectResult("http://" + Request.Url.Host + Request.Url.PathAndQuery);
//}
else if (GetMENUPAGES.Where(w => (w.pageurl ?? "").ToUpper().Equals(Request.Url.AbsolutePath.ToUpper())).OrderByDescending(od => od.pdepth).FirstOrDefault() != null
//&& !Request.Url.AbsolutePath.ToUpper().StartsWith("/CDMS/PLAY")
//&& !Request.Url.AbsolutePath.ToUpper().StartsWith("/CONTENTS")
)
else if (GetMENUPAGES.Where(w => (w.pageurl ?? "").ToUpper().Equals(Request.Url.AbsolutePath.ToUpper())).OrderByDescending(od => od.pdepth).FirstOrDefault() != null)
{
filterContext.Result = new RedirectResult("/Account/Index?fobase=1&ru=" + Request.Url.AbsolutePath, true);
SetError("fobaseerror:path=" + Request.Url.AbsolutePath + "&urlrefer=" + Request.UrlReferrer + "&userinfo=" + SUserInfo.UserNo + "&ssuer=" + ViewBag.SSUserNo);
//학습창 등이 안뜨고 로그인창으로 갈 경우 여기에 urlreferrer suserinfo, viewbag.ssuser~, GetMENUPAGES 등의 값들을 로깅해본다.
//~~
//Response.Redirect("/Account/Index?ru=" + Request.Url.AbsolutePath, true);
}
else if (!Request.Url.AbsolutePath.ToUpper().StartsWith("/OPEN/") &&
!Request.Url.AbsolutePath.ToUpper().StartsWith("/HOME/POPUP") &&
@ -151,13 +114,6 @@ namespace NP.FO.Controllers
{
filterContext.Result = new RedirectResult("/Account/Error");
}
//if (Request.IsSecureConnection &&
//!Request.Url.AbsolutePath.ToUpper().StartsWith("/ACCOUNT/") &&
//!Request.Url.AbsolutePath.ToUpper().StartsWith("/OPEN/"))
//{
// //Redirect("http://" + Request.Url.Host + Request.Url.PathAndQuery);
// filterContext.Result = new RedirectResult("http://" + Request.Url.Host + Request.Url.PathAndQuery);
//}
}
}
private static IList<NP.Model.Popup> POPUPS { get; set; }
@ -224,7 +180,6 @@ namespace NP.FO.Controllers
{
if (BANNER == null)
{
//var banners = GetBANNERS;
BANNER = "";
if (GetBANNERS.Where(w => w.ismain == 0).Count() > 0)
{
@ -251,13 +206,9 @@ namespace NP.FO.Controllers
{
if (BANNERCROOM == null)
{
//var banners = GetBANNERS;
BANNERCROOM = "";
if (GetBANNERS.Where(w => w.ismain == 1).Count() > 0)
{
//BANNERCROOM = string.Join("", GetBANNERS.Where(w => w.ismain == 1).Select(s =>
// string.Format("<div class=\"mpgsdCont\" style=\"background:url({0})no-repeat left center;\"><img src=\"{1}\" alt=\"\" /></div>"
// , (new BaseModel()).rootfolder + s.fileurl, (new BaseModel()).rootfolder + s.fileurl2)));
}
}
return BANNERCROOM;
@ -340,7 +291,6 @@ namespace NP.FO.Controllers
}
else
{
//sbmauth.Append(string.Format("<li class=\"topmenu{1}\"><a href=\"#\" onclick=\"gomenu({2}, {3}, '{4}', this)\">{0}</a><span></span><ul>", m.pagename, m.pno,menu.pno,menu.pagetype,menu.pageurl));
sbmauth.Append(string.Format("<li class=\"topmenu{1}\"><a href=\"#\" style=\"cursor:default;\">{0}</a><span></span><ul>", m.pagename, m.pno,menu.pno,menu.pagetype,menu.pageurl));
}
if (m.usertype == 0)
@ -351,7 +301,6 @@ namespace NP.FO.Controllers
}
else
{
//sbm.Append(string.Format("<li class=\"topmenu{1}\"><a href=\"#\" onclick=\"gomenu({2}, {3}, '{4}', this)\">{0}</a><span></span><ul>", m.pagename, m.pno, menu.pno, menu.pagetype, menu.pageurl));
sbm.Append(string.Format("<li class=\"topmenu{1}\"><a href=\"#\" style=\"cursor:default;\">{0}</a><span></span><ul>", m.pagename, m.pno, menu.pno, menu.pagetype, menu.pageurl));
}
@ -419,23 +368,6 @@ namespace NP.FO.Controllers
}
protected void PayAll(VMPay vm)
{
//ViewBag.IsOldTLS = false;
//try
//{
// if (Request.IsSecureConnection)
// {
// System.Net.Security.SslStream sss = new System.Net.Security.SslStream(Request.UrlReferrer.);
// Console.WriteLine(sss.SslProtocol);
// //if (ssp.SslProtocol != System.Security.Authentication.SslProtocols.Tls12)
// //{
// // ViewBag.IsOldTLS = true;
// //}
// }
//}
//catch (Exception ex)
//{
// Console.WriteLine(ex.Message);
//}
vm.PayItems = new List<PayItem>() { };
if (vm.ispaycart)
{
@ -482,22 +414,11 @@ namespace NP.FO.Controllers
vm.pginfo = GetConfig("pginfo");
vm.pginfomobile = GetConfig("pginfomobile");
vm.signkey = ComputeHash(vm.pginfo.Split('|')[2]);
//vm.payitemname = Utf8ToEuckr();
vm.viewname5 = "https://" + Request.Url.Host + "/Course/PayClose";
//vm.viewname5 = GetConfig("fronturl") + "/Course/PayClose";
vm.previewname = vm.previewname ?? "/My/Cart";
vm.deliveramt = GetInt(GetConfig("deliveramt"));
}
//private String Utf8ToEuckr(String s)
//{
// byte[] pbSource = System.Text.Encoding.UTF8.GetBytes(s);
// byte[] pbDest = System.Text.Encoding.Convert(
// System.Text.Encoding.UTF8, System.Text.Encoding.GetEncoding("euc-kr"), pbSource);
// pbSource = System.Text.Encoding.Convert(System.Text.Encoding.GetEncoding("euc-kr"), System.Text.Encoding.UTF8, pbDest);
// char[] psUnicode = System.Text.UTF8Encoding.UTF8.GetChars(pbSource);
// return new string(psUnicode);
//}
protected ActionResult PayReturn(VMPay vm)
{
//20220802 추가
@ -834,7 +755,6 @@ namespace NP.FO.Controllers
item.eend2 = item.eend.ToString("yyyy년 MM월 dd일");
}
//vm.SelectCMInningscd.scdInfoSummary = string.Format("{0}", vm.SelectCMInningscd.estart.ToString("yyyy년 MM월 dd일까지"));
if (vm.SelectCMInningscd.estart < Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00")))
{
vm.SelectCMInningscd.isEnd = true;
@ -846,4 +766,3 @@ namespace NP.FO.Controllers
}
}
}

View File

@ -231,6 +231,7 @@
<Content Include="css\jquery-ui-1.12.1\jquery-ui.min.css" />
<Content Include="css\lecture.css" />
<Content Include="css\dev.css" />
<Content Include="css\login.css" />
<Content Include="css\mainpopup.css" />
<Content Include="css\mypage.css" />
<Content Include="css\slick.css" />
@ -328,6 +329,7 @@
<Content Include="img\common\intranet_logo_b.png" />
<Content Include="img\common\join_select01.png" />
<Content Include="img\common\join_select02.png" />
<Content Include="img\common\join_select03-4.png" />
<Content Include="img\common\join_select03.png" />
<Content Include="img\common\join_sns01.jpg" />
<Content Include="img\common\join_sns02.jpg" />
@ -715,7 +717,6 @@
<Content Include="Views\My\MyAssInfo.cshtml" />
<Content Include="Views\Course\ApplyEdu.cshtml" />
<Content Include="Views\Course\ApplyComplete.cshtml" />
<Content Include="Views\Course\ApplyPay_221227.cshtml" />
<Content Include="Views\Course\XpayREQ.cshtml" />
<Content Include="Views\Course\XpayReturnURL.cshtml" />
<Content Include="Views\My\Document.cshtml" />
@ -727,7 +728,6 @@
<Content Include="Views\Shared\Partial\MobileChk.cshtml" />
<Content Include="Views\Home\PrivacyPolicy.cshtml" />
<Content Include="Views\Home\UsePolicy.cshtml" />
<Content Include="Views\Course\ApplyAgree_old.cshtml" />
<Content Include="Views\Open\PlayOpen.cshtml" />
</ItemGroup>
<ItemGroup>
@ -744,7 +744,6 @@
<Content Include="Views\Home\Indexbk2.cshtml" />
<Content Include="Views\Account\PwChange.cshtml" />
<Content Include="Views\Account\DormantCancel.cshtml" />
<Content Include="Views\Course\ApplyPay_1005.cshtml" />
<Content Include="Views\Shared\Partial\policy.cshtml" />
<Content Include="Views\Shared\Partial\privacy.cshtml" />
<Content Include="Views\Shared\Partial\Select.cshtml" />
@ -758,6 +757,8 @@
<Content Include="Views\Home\Index_20250403백업_추후에배포.cshtml" />
<Content Include="Views\My\Document_250617_삭제예정.cshtml" />
<Content Include="Views\Course\SmartSearch.cshtml" />
<Content Include="Views\Account\FindIDPW.cshtml" />
<Content Include="Views\Account\NewPassword.cshtml" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Base\Base.csproj">

View File

@ -60,6 +60,26 @@
}
self.close();
</text>
} else if (ViewBag.reason == "FINDIDPW") {
<text>
if ("@(RSLT_NAME)" != "" && "@CI" != "") {
try {
$(opener.document).find("#mform").find("#User_di").val("@(DI)");
$(opener.document).find("#mform").find("#User_ci").val("@(CI)");
$(opener.document).find("#mform").find("#User_authplatform").val("@(AuthPlatform.Mobile.GetHashCode())");
$(opener.document).find("#mform").attr("action", "/Account/NewPassword");
$(opener.document).find("#mform").submit();
alert("인증완료");
self.close();
}
catch (ex) {
console.error(ex.message);
}
} else {
alert("입력하신 아이디 또는 비밀번호와 일치하는 계정이 없습니다.\n 다시 확인해주세요.");
}
self.close();
</text>
} else if (ViewBag.reason == "LectinningAuth") {
<text>
alert("인증완료");

View File

@ -22,6 +22,7 @@
</div>
<script type="text/javascript">
$(document).ready(function () {
if ('@(ViewBag.ret)' == '0') {
if ('@(RSLT_CD)' == 'B000') {
@ -52,6 +53,26 @@
}
self.close();
</text>
} else if (ViewBag.reason == "FINDIDPW") {
<text>
if ("@(RSLT_NAME)" != "" && "@CI" != "") {
try {
$(opener.document).find("#mform").find("#User_di").val("@(DI)");
$(opener.document).find("#mform").find("#User_ci").val("@(CI)");
$(opener.document).find("#mform").find("#User_authplatform").val("@(AuthPlatform.Mobile.GetHashCode())");
$(opener.document).find("#mform").attr("action", "/Account/NewPassword");
$(opener.document).find("#mform").submit();
alert("인증완료");
self.close();
}
catch (ex) {
console.error(ex.message);
}
} else {
alert("입력하신 아이디 또는 비밀번호와 일치하는 계정이 없습니다.\n 다시 확인해주세요.");
}
self.close();
</text>
} else if (ViewBag.reason == "AuthPlatformChange") {
<text>
if ("@(RSLT_NAME)" == $(opener.document).find("#mform").find("#username").val()) {

View File

@ -0,0 +1,65 @@
@model NP.Model.VMUser
<div class="container">
<form id="mform" action="" method="post">
@Html.HiddenFor(w => w.User.birthday)
@Html.HiddenFor(w => w.User.username)
@Html.HiddenFor(w => w.User.mobile)
@Html.HiddenFor(w => w.User.vssn)
@Html.HiddenFor(w => w.User.di)
@Html.HiddenFor(w => w.User.ci)
@Html.HiddenFor(w => w.intval2)
@Html.HiddenFor(w => w.User.jointype)
@Html.HiddenFor(w => w.User.authplatform)
</form>
<form id="frm" method="post" action="@ViewBag.result">
<input type="hidden" id="stringval" name="stringval" value="" />
</form>
<div class="jnSel">
<h4 style=" font-size: 20px; font-weight: 400; text-align: left; margin: 0 0 30px;">
인증 수단을 선택하여 주세요.
<span style="display: block;color: red; font-size: 16px;">
※ 로그인 5회 이상 실패로 로그인이 제한된 경우 본인인증 후 비밀번호 재설정을 통하여 해제가 가능합니다.
</span>
</h4>
<div>
<div class="jnsCont">
<img src="../img/common/join_select03-4.png" alt="이메일 인증">
<p>이메일 인증</p>
<a href="/Account/FindMe">인증하기</a>
</div>
</div>
<div>
<div class="jnsCont">
<img src="../img/common/join_select02.png" alt="휴대폰 본인인증">
<p>휴대폰 본인인증</p>
<a href="javascript:void(0);" onclick="certok3reqview('MOBI', 'FINDIDPW');">인증하기</a>
</div>
</div>
<div>
<div class="jnsCont">
<img src="../img/common/join_select01.png" alt="i-PIN 인증">
<p>i-PIN 인증</p>
<a href="javascript:void(0);" onclick="certok3reqview('IPIN', 'FINDIDPW');">인증하기</a>
</div>
</div>
</div>
@Html.Partial("./Partial/OkCert3", null, new ViewDataDictionary { })
</div>
<script>
$(function () {
});
function showAlertPopup() {
$('html, body').addClass('lock');
$("#alertPop").css({
"display": "flex",
"justify-content": "center",
"align-items": "center"
}).hide().fadeIn("fast");
}
</script>

View File

@ -7,12 +7,19 @@
{
<div class="lgnForm" style="max-width: 500px; margin: 0 auto; text-align: center;">
<p class="idpwTxt">
<span><b>@Model.User.username (@Model.User.userid)</b>님, 인증이 완료되었습니다.</span>
<span><b>@Model.User.username </b>님, 아이디는 @Model.User.userid 입니다.</span>
<span>새롭게 사용할 비밀번호를 입력해주세요.</span>
</p>
<ul class="lgnInput">
<li><input type="password" name="User.userpass" id="up1" placeholder="비밀번호(8자 이상, 영문/숫자/특수기호 포함)" /></li>
<li><input type="password" id="up2" placeholder="비밀번호 확인(동일한 비밀번호 입력)" /></li>
<li><input type="password" name="User.userpass" id="up1" placeholder="비밀번호(8자 이상, 영문/숫자/특수기호 포함)" autocomplete="new-password" /></li>
<li><input type="password" id="up2" placeholder="비밀번호 확인(동일한 비밀번호 입력)" autocomplete="new-password" /></li>
</ul>
<ul>
<li class="idpwBtn">
<p id="capslock-warning"></p>
<p id="password-match-warning"></p>
<br />
</li>
</ul>
<ul class="idpwBtn">
<li><a href="javascript:void(0);" onclick="save()">비밀번호 재설정</a></li>
@ -53,7 +60,20 @@
<script>
$(document).ready(function () {
initCapsLockWarning('', '#capslock-warning');
initializePasswordToggle('#up1, #up2');
$('#up1, #up2').on('keyup', function () {
const password = $('#up1').val();
const confirmPassword = $('#up2').val();
const messageElement = $('#password-match-warning');
if (password.length >= 8 && confirmPassword && password !== confirmPassword) {
messageElement.html('<strong style="color: red;">비밀번호가 일치하지 않습니다.</strong>');
} else {
messageElement.html('');
}
});
});
function findme() {

View File

@ -83,7 +83,7 @@
<a href="#" class="lgnBtn" onclick="login();">로그인</a>
<ul class="lgnFind">
<li><a href="/Account/FindMe">아이디/비밀번호찾기</a></li>
<li><a href="/Account/FindIDPW">아이디/비밀번호찾기</a></li>
<li><a href="/Account/JoinTSel">회원가입</a></li>
</ul>

View File

@ -5,6 +5,7 @@
var googleClientId = ViewBag.googleClientID;
}
<head>
<!-- 소셜로그인에 대해서는 추후 사용하도록 둔다 -->
@*<script type="text/javascript" src="/js/naveridlogin_js_sdk_2.0.0.js"></script>
<script type="text/javascript" src="/js/kakao.js"></script>
<script src="https://apis.google.com/js/platform.js?onload=googleInit" async defer></script>*@
@ -17,10 +18,10 @@
<div class="lgnWrap">
<ul class="lgnForm">
<li>
<input type="text" name="uid" id="uid" placeholder="아이디" value="@ViewBag.SavedId" />
<input type="text" name="uid" id="uid" placeholder="아이디" value="@ViewBag.SavedId" autocomplete="username" />
</li>
<li>
<input type="password" name="upw" id="upw" placeholder="비밀번호" />
<input type="password" name="upw" id="upw" placeholder="비밀번호" autocomplete="current-password" />
<button type="button" id="togglePassword" class="toggle-password-btn"></button>
</li>
</ul>
@ -28,14 +29,22 @@
<input type="checkbox" name="issaveid" id="issaveid" @(ViewBag.SavedId == "" ? "" : "checked")>
<label for="issaveid">아이디저장</label>
</div>
<p style="margin-bottom: 30px; border: 1px solid red; padding: 5px;">※ 2021년 7월 1일 이전에 회원가입을 하신 분 들은 본인인증을 위하여 회원가입을 다시 진행 해주시길 부탁드립니다.</p>
@*<div class="notice-box-red">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" class="bi bi-exclamation-circle-fill icon" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8 4a.905.905 0 0 0-.9.995l.35 3.507a.552.552 0 0 0 1.1 0l.35-3.507A.905.905 0 0 0 8 4zm.002 6a1 1 0 1 0 0 2 1 1 0 0 0 0-2z" />
</svg>
<p>2021년 7월 1일 이전에 가입하신 회원님은 본인인증을 위해<br/> 회원가입을 다시 진행해 주시길 바랍니다.</p>
</div>*@
<p id="capslock-warning"></p>
<br/>
<a href="javascript:void(0);" class="lgnBtn" onclick="login();">로그인</a>
<ul class="lgnFind">
<li><a href="/Account/FindMe">아이디/비밀번호찾기</a></li>
<li><a href="/Account/FindIDPW">아이디/비밀번호찾기</a></li>
<li><a href="/Account/JoinIdVeri">회원가입</a></li>
</ul>
<br />
@*<div id="naverIdLogin" style="display:none"></div>*@
@ -46,6 +55,9 @@
$(document).ready(function () {
// Caps Lock
initCapsLockWarning('#upw', '#capslock-warning');
if (opener != null && opener._ismain == 1) {
opener.location.href = "/Account/Index";
self.close();
@ -79,6 +91,8 @@
});
}
/** INPUT 패스워드 눈알처리 */
$('.lgnForm').on('click', '#togglePassword', function () {
const passwordInput = $('#upw');
@ -94,6 +108,7 @@
$(this).toggleClass('is-toggled');
});
// 우선 숨겨둔다
/* snsInit(); */
});
@ -158,16 +173,16 @@
++logincnt;
if (logincnt > 4) {
//msg("비밀번호 5회 이상 오류로 로그인이 제한되었습니다.\n교육원으로 문의해주세요.");
msg("해당 계정은 로그인이 제한된 계정 입니다.<br/>교육원으로 문의 주세요.<br/>T : 1544-7660<br/>");
msg("로그인 5회 실패로 인하여 로그인이 제한 되었습니다.<br/>제한을 해제 하시려면 아이디 / 비밀번호 찾기에서<br/>본인인증 후 비밀번호를 재설정 해주세요.");
logincnt = 0;
}
else {
msg("입력하신 아이디/비밀번호와 일치하는 계정이 없습니다. 다시 확인해주세요.<br/>5회이상 비밀번호 오류 시 로그인이 제한됩니다.");
msg("입력하신 아이디 또는 비밀번호와 일치하는 계정이 없습니다.<br/>다시 확인해주세요.<br/><br/><b style='color:blue;'>※ 5회이상 비밀번호 오류 시 로그인이 제한되므로 정확하게 입력해주세요.</b>");
}
}
else if (capResult.msg == "-5") { // 비활성상태
//msg("비밀번호 5회 이상 오류로 로그인이 제한되었습니다.\n교육원으로 문의해주세요.");
msg("해당 계정은 로그인이 제한된 계정 입니다.<br/>교육원으로 문의 주세요.<br/>T : 1544-7660<br/>");
msg("로그인 5회 실패로 인하여 로그인이 제한 되었습니다.<br/>제한을 해제 하시려면 아이디 / 비밀번호 찾기에서<br/>본인인증 후 비밀번호를 재설정 해주세요.");
}
else if (capResult.msg == "-6") { // 탈퇴신청중
msg("회원탈퇴가 접수되었습니다.<br/>탈퇴 완료까지 평일 기준 1일 정도 소요될 예정입니다.");
@ -180,7 +195,9 @@
}
submit();
}
} else { msg("입력하신 아이디/비밀번호와 일치하는 계정이 없습니다. 다시 확인해주세요.<br/>5회이상 비밀번호 오류 시 로그인이 제한됩니다."); }
} else {
msg("입력하신 아이디 또는 비밀번호와 일치하는 계정이 없습니다.<br/>다시 확인해주세요.<br/><br/><b style='color:blue;'>※ 5회이상 비밀번호 오류 시 로그인이 제한되므로 정확하게 입력해주세요.</b>");
}
}
</script>

View File

@ -21,23 +21,16 @@
<div class="jnsCont">
<img src="../img/common/join_select01.png" alt="i-PIN 인증">
<p>i-PIN 인증</p>
<a href="#" onclick="certok3request('IPIN', 'Join');">인증하기</a>
<a href="#" onclick="certok3reqview('IPIN', 'Join');">인증하기</a>
</div>
</div>
<div>
<div class="jnsCont">
<img src="../img/common/join_select02.png" alt="휴대폰 본인인증">
<p>휴대폰 본인인증</p>
<a href="#" onclick="certok3request('MOBI', 'Join');">인증하기</a>
<a href="#" onclick="certok3reqview('MOBI', 'Join');">인증하기</a>
</div>
</div>
@*<div>
<div class="jnsCont">
<img src="../img/common/join_select03.png" alt="카드인증">
<p>카드인증</p>
<a href="#">인증하기</a>
</div>
</div>*@
</div>
@Html.Partial("./Partial/OkCert3", null, new ViewDataDictionary { })
<p class="subDsc mt20">본인 인증 시 제공되는 정보는 해당 인증기관에서 직접 수집하며, 인증 이외의 용도로 이용 또는 저장하지 않습니다.</p>
@ -57,16 +50,3 @@
}
}
</script>
@*@{
string errMsg = "";
if (ViewBag.rsltCd != "")
{
errMsg = ((string)ViewBag.rsltCd).Replace("er.", "");
<script>
$(function () {
msg("@errMsg")
})
</script>
}
}*@

View File

@ -0,0 +1,194 @@
@model NP.Model.VMUser
@{
// 상태 (확장대비)
int userStatus = Model.User.status;
// 인증CI
string ci = Model.User.ci ?? "";
}
@if (!string.IsNullOrEmpty(ci) && !string.IsNullOrEmpty(Model.User.userid))
{ // 인증 결과가 있는 사용자만
<form method="post">
@Html.AntiForgeryToken()
<input type="hidden" id="userid" name="userid" value="@Model.User.userid" />
<div class="lgnForm" style="max-width: 500px; margin: 0 auto; text-align: center;">
<p class="idpwTxt">
<span><b>@Model.User.username </b>님, 아이디는 @Model.User.userid 입니다.</span>
<span>새롭게 사용할 비밀번호를 입력해주세요.</span>
</p>
<ul class="lgnInput" style="margin-top:5px;">
<li><input type="password" id="up1" placeholder="비밀번호(8자 이상, 영문/숫자/특수기호 포함)" autocomplete="new-password" /></li>
<li><input type="password" id="up2" placeholder="비밀번호 확인(동일한 비밀번호 입력)" autocomplete="new-password" /></li>
</ul>
<ul>
<li class="idpwBtn" style="margin-top:5px;">
<p id="capslock-warning"></p>
<p id="password-match-warning"></p>
<br />
</li>
</ul>
<ul class="idpwBtn">
<li><a href="javascript:void(0);" onclick="fnPasswordChange()">비밀번호 재설정</a></li>
<li><a href="/">취소</a></li>
</ul>
</div>
@section scriptsHeader{
@Html.Partial("./Partial/ScriptPost")
}
</form>
<script>
$(function () {
initCapsLockWarning('', '#capslock-warning');
initializePasswordToggle('#up1, #up2');
$('#up1, #up2').on('keyup', function () {
const password = $('#up1').val();
const confirmPassword = $('#up2').val();
const messageElement = $('#password-match-warning');
if (password.length >= 8 && confirmPassword && password !== confirmPassword) {
messageElement.html('<strong style="color: red;">비밀번호가 일치하지 않습니다.</strong>');
} else {
messageElement.html('');
}
});
});
@*/**
* 비밀번호 변경 유효성 검사 및 서버 요청 함수
* if/else if 구조를 사용하여 return 없이 각 유효성 검사를 순차적으로 진행
* 1. 입력 값 공백 여부 확인
* 2. 비밀번호 복잡도 규칙 확인
* 3. 연속된 문자/숫자 반복 확인
* 4. 비밀번호와 비밀번호 확인 값 일치 여부 확인
*/*@
function fnPasswordChange() {
try {
var up1 = $.trim($('#up1').val());
var up2 = $.trim($('#up2').val());
var passwordRegex = /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[\W_]).{8,}$/;
var repeatRegex = /(.)\1\1/;
if (up1 === "" || up2 === "") {
msg('비밀번호를 입력해주세요.');
$('#up1').focus();
} else if (!passwordRegex.test(up1)) {
msg('비밀번호는 8자 이상이며, 영문/숫자/특수기호를 모두 포함해야 합니다.');
$('#up1').focus();
} else if (repeatRegex.test(up1)) {
msg('연속으로 3번 이상 반복되는 문자/숫자를 사용할 수 없습니다.');
$('#up1').focus();
} else if (up1 !== up2) {
msg('비밀번호 확인이 일치하지 않습니다.');
$('#up2').focus();
} else {
// param
const formData = new URLSearchParams();
formData.append('userid', document.getElementById('userid').value);
formData.append('password', up2);
formData.append('__RequestVerificationToken', document.querySelector('input[name="__RequestVerificationToken"]').value);
fetch("/FOCommon/UserChangePassword", {
method: "POST",
body: formData
})
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
})
.then(data => {
console.log('서버로부터 받은 전체 응답:', data);
if (data.success) {
confirmCustom(
"비밀번호가 변경 되었습니다.",
[
{
text: '확인',
callback: function () {
window.location.href = "/";
}
}
],
{ top: '30%' }
);
} else {
msg(data.message);
console.log('실패 코드 (from server): ' + data.data);
}
})
.catch(error => {
msg("서버와 통신 중 오류가 발생했습니다. 잠시 후 다시 시도해주세요.");
console.error("통신에러 : ", error);
});
}
} catch (e) {
msg("오류가 발생했습니다");
console.error("AJAX Error: ", e.message);
}
}
</script>
}
else
{ // 인증결과가 없는 회원의 확인창을 띄울 빈 껍데기
<style>
.idpwBtn2 {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
list-style: none;
padding: 0;
margin: 0;
}
</style>
<div class="lgnForm" style="max-width: 500px; margin: 0 auto; text-align: center;">
<p class="idpwTxt">
<span>새롭게 사용할 비밀번호를 입력해주세요.</span>
</p>
<ul class="lgnInput">
<li><input type="password" placeholder="비밀번호(8자 이상, 영문/숫자/특수기호 포함)" readonly="readonly" /></li>
<li><input type="password" placeholder="비밀번호 확인(동일한 비밀번호 입력)" readonly="readonly" /></li>
</ul>
<ul class="idpwBtn2">
<li><a href="/">취소</a></li>
</ul>
</div>
<script>
$(function () {
confirmCustom(
"입력하신 정보에 맞는 회원이 없습니다.<br/>새로 회원가입을 진행해주세요.",
[
{
text: '회원가입 바로가기',
callback: function () {
window.location.href = '/Account/JoinIdVeri';
}
},
{
text: '확인',
callback: function () {
window.location.href = '/Account/FindIDPW';
}
}
],
{ top: '30%' }
);
});
</script>
}

View File

@ -190,7 +190,7 @@
<p class="subTxt">
1. <span class="subTxt">동영상강의 진도율 90% 이상</span><br />
2. <span class="subTxt">과제물 제출(표지 제외 A4용지 2장 이상 분량)</span><br />
3. <span class="subTxt">시험평가 60점 이상 득점</span><span style="color:red">(집체교육 당일 평가 응시)</span><br /><br />
3. <span class="subTxt">시험평가 60점 이상 득점</span>@*<span style="color:red">(집체교육 당일 평가 응시)</span>*@<br /><br />
<span class="subTxt red">※ 위 3가지 조건 모두 만족하셔야 수료가 가능합니다.</span><br />
</p>

View File

@ -241,7 +241,7 @@
<input type="hidden" name="LGD_BUYER" id="LGD_BUYER" value="@Model.User.username">
<input type="hidden" name="LGD_PRODUCTINFO" id="LGD_PRODUCTINFO" value="@(Model.CM.cname.Replace(",", " "))">
<input type="hidden" name="LGD_BUYEREMAIL" id="LGD_BUYEREMAIL" value="@Model.User.email">
<input type="hidden" name="LGD_BUYEREMAIL" id="LGD_BUYEREMAIL" value="">@*Model.User.email*@
<!-- Xpay 결제 end -->
</form>
@section scriptsHeader{

View File

@ -1,6 +1,16 @@
@model NP.Model.VMCourse
@{
var host = Request.Url.Host;
// 개발과 로컬일 때 스마트검색 결과의 검색영역 보임 처리
bool isDevSite = (host == "www.ynicte.com" || host == "ynicte.nptc.kr");
string firstSchBoxDisplayStyle = isDevSite ? "" : "display:none;";
}
<div class="container">
<div class="schBox" style="display:none;">
<div class="schBox" style="@firstSchBoxDisplayStyle">
<form id="smartSearchForm" method="post">
<input type="hidden" name="cmno" id="cmno" />
<input type="hidden" id="cmino" name="CM.cmino" />
@ -8,14 +18,17 @@
<input type="hidden" name="stringval" id="stringval" value="@Model.stringval" />
@if (Model.stringval == "0" || Model.stringval == null || Model.stringval == "")
{
if (isDevSite)
{
<h3>개발서버 테스트용</h3>
}
<ul class="schTab">
<li id="liTab1" class="current" style="font-size:16pt;"><a href="#">건설기술진흥법교육</a></li>
<li id="liTab2" style="font-size:16pt;display:none;"><a href="#">기타교육</a></li>
<li id="liTab1" class="current" style="font-size:16pt;"><a href="javascript:void(0);">건설기술진흥법교육</a></li>
<li id="liTab2" style="font-size:16pt;display:none;"><a href="javascript:void(0);">기타교육</a></li>
</ul>
<ul class="schCont">
<li>
<select name="stringval2" id="stringval2">
@*<option value="0" @(Model.stringval2 == "0" ? "selected" : "")>온라인교육</option>*@
<option value="1" @(Model.stringval2 == "1" ? "selected" : "")>교육장교육</option>
<option value="2" @(Model.stringval2 == "2" ? "selected" : "")>온라인교육</option>
</select>
@ -38,19 +51,18 @@
<li>
@Html.DropDownListFor(x => x.stringval7, new SelectList(Model.ComCodes6, "ccode", "cname"), "-선택-")
</li>
<li><a href="#" id="btnSearch">검색</a></li>
<li><a href="javascript:void(0);" id="btnSearch">검색</a></li>
</ul>
}
else if (Model.stringval == "1")
{
<ul class="schTab">
<li id="liTab1"><a href="#" style="font-size:16pt;">건설기술진흥법교육</a></li>
<li id="liTab2" class="current" style="font-size:16pt;"><a href="#">기타교육</a></li>
<li id="liTab1"><a href="javascript:void(0);" style="font-size:16pt;">건설기술진흥법교육</a></li>
<li id="liTab2" class="current" style="font-size:16pt;"><a href="javascript:void(0);">기타교육</a></li>
</ul>
<ul class="schCont">
<li>
<select name="stringval2" id="stringval2">
@*<option value="0" @(Model.stringval2 == "0" ? "selected" : "")>온라인교육</option>*@
<option value="1" @(Model.stringval2 == "1" ? "selected" : "")>교육장교육</option>
<option value="2" @(Model.stringval2 == "2" ? "selected" : "")>온라인교육</option>
</select>
@ -58,30 +70,15 @@
<li>
@Html.DropDownListFor(x => x.stringval3, new SelectList(Model.CMsEtc, "cgno", "cgname"), "-선택-")
</li>
<li><a href="#" id="btnSearch">검색</a></li>
<li><a href="javascript:void(0);" id="btnSearch">검색</a></li>
</ul>
}
</form>
</div>
@*<p class="subDsc mt15">본인의 기술인 정보를 모르실 경우에는 아래링크를 클릭하여 정보 확인 후 교육신청을 하여 주시기 바랍니다.</p>
<ul class="smtLnk">
<li><a href="https://homenet.kocea.or.kr:1443" target="_blank">한국건설기술인협회 이동</a></li>
<li><a href="https://www.kira.or.kr" target="_blank">건축사협회 이동</a></li>
</ul>*@
@*<div id="subTab01" class="tabCont" style="display: block;">
<h4 class="clsTitle" style="margin-top:7px">아래의 교육과정 중 원하시는 교육을 선택하여 주세요.</h4>
<h4 class="clsTitle" style="color: #0070C0; margin-top: 7px">아래의 모든 교육과정들이 이전단계에서 입력하신 교육목적으로 인정가능 합니다.</h4>
</div>*@
<br />
@if (Model.stringval2 == "2" && Model.stringval4 == "32")
{
@*<p class='subDsc' style='color:red;'>※ 온라인 교육은 입금완료시 교육이 바로 시작되며 동영상 시청이 가능합니다.</p>*@
<p class='' style="font-weight: bold; font-size: 14pt;">※ 현재 신청중인 교육은 <span style='color: red; font-weight: bold'>집체교육 참석없이</span> 교육종료일까지 수료조건을 만족하시면 됩니다.</p>
}
else if (Model.stringval2 == "2")
{
@ -98,10 +95,11 @@
<li>
<div class="smtlCont">
<h5>
<em style="font-size:15px" class="@(item.cshape == 0 ? "org" : item.cshape == 1 ? "grn" : "blu")">
@(item.cshape == 0 ? "온라인" : item.cshape == 1 ? "교육장교육" : "온라인교육")
</em>
@*<span style="font-size:22px">@($"{item.cname} | {item.studytime}시간과정 | 교육비{item.infee}")</span></h5>*@
@if (!string.IsNullOrEmpty(item.cgcode))
{ // cg코드를 <span style='color:green; font-weight:bold;'>[전문분야교육]</span> 형태로 변경해주는 Helper 메서드 사용
@Html.Raw(this.GetCgLabel(item.cgcode))
}
@{
string strTitle = string.Format("{0} | {1}시간과정 |<span class='red' style='vertical-align: initial;'> {2}과정 </span>", item.cname, item.studytime, (item.isrefund == 1 ? "환급" : "비환급"), item.infee.ToString("#,0"));
}
@ -111,27 +109,13 @@
<li>
<a onclick="javascript: openIntro(@item.cmno);" class="smtlChkBtn smtlChk01" style="right:130px;">강좌소개</a>
</li>
@*<li style="font-size:18px;"><a href="#" class="smtlBtn02" id="btnIntro" onclick="javascript: openIntro(@item.cmno)">강좌소개</a></li>*@
<li>
<a href="#" class="smtlBtn02 smtlChkBtn" id=@("btnSelect" + item.cmno) onclick="javascript: getCmInning(@item.cshape, @item.cmno)">교육신청</a>
<a href="javascript:void(0);" class="smtlBtn02 smtlChkBtn" id=@("btnSelect" + item.cmno) onclick="javascript: getCmInning(@item.cshape, @item.cmno)">교육신청</a>
<input type="hidden" id="typeedu" name="typeedu" value="@item.typeedu">
</li>
</ul>
</div>
@*20220728 교육장정보 감추기*@
@*@if (item.cshape == 1 || (item.cshape == 2 && item.scdtype == 0)) //오프라인 경우 교육장 정보를 보여준다.
{
<ul class="smtlTab" id="divPlace_@item.cmno" style="display:none">
<li class="current" onclick="javascript:setStudyplace(this,@item.cmno);"><a href="javascript:getSubCm(item.cshape, @item.cmno);">전체</a></li>
@foreach (var t in Model.ComCodes)
{
<li onclick="javascript:setStudyplace(this,@item.cmno);"><a href="javascript:getCmInning(item.cshape, @item.cmno, @t.ccode);">@t.cname 교육장</a></li>
<li onclick="javascript:setStudyplace(this,@item.cmno);"><a href="javascript:getSubCm(1, @item.cmno, @t.ccode);">@t.cname 교육장</a></li>
}
</ul>
}*@
@*20220728온라인/오프라인 안내*@
<div id="divInfo_@item.cmno" class="smtlChk">
</div>
@ -170,7 +154,7 @@
<div class="clsPopWrap">
<div class="clsPopTitle">
<h5>강좌소개</h5>
<a href="#" onclick="javascript: closeIntro();"></a>
<a href="javascript:void(0);" onclick="javascript: closeIntro();"></a>
</div>
<div class="clsPopCont">
<ul class="smtList pop">
@ -181,14 +165,14 @@
<p>교육분류 : <span id="spnCmKind"></span></p>
<p>인정시간 : <span class="sky"><span id="spnCmStudyHour"></span></span>시간</p>
<p style="display:none;" id="completeStd">수료기준 : 진도 <span id="spnCmAttend"></span>% 이상, 시험 <span id="spnCmFinal"></span>점 이상, 과제 <span id="spnCmSubject"></span>점 이상<span id="spnisoffabs"></span></p>
@*@if (Model.CM.cshape != 1)
{
<p id="completeStd">수료기준 : 진도 <span id="spnCmAttend"></span>% 이상, 시험 <span id="spnCmFinal"></span>점 이상, 과제 <span id="spnCmSubject"></span>점 이상</p>
}*@
</div>
</div>
</li>
</ul>
<dl class="fairIntro spnCmEduname" style="">
<dt>교육종류</dt>
<dd><span id="spnCmEduname"></span></dd>
</dl>
<dl class="fairIntro spnCmUsername" style="display:none;">
<dt>강사정보</dt>
<dd><span id="spnCmUsername"></span></dd>
@ -225,9 +209,13 @@
var _cmno;
$(document).ready(function () {
// 페이지 접근시 보이는 문구
var isDevSite = @isDevSite.ToString().ToLower();
msg('<b style="color:red; font-size:28px;"> ※ 안 내 ※</b><br/><br/><b style="color:blue; font-size:24px;">현재 페이지의 모든 교육과정들이 이수하고자 하는 교육목적으로 인정가능 합니다.</b>');
$("#pageTitle h3").text("교육과정선택")
$("#pageTitle h3").text("교육과정선택");
$('#liTab1').click(function () {
$.when(
$("#stringval").val("0"),
@ -240,6 +228,7 @@
});
});
$('#liTab2').click(function () {
$.when(
$("#stringval").val("1"),
@ -251,6 +240,7 @@
$("#smartSearchForm").submit();
});
});
$('#btnSearch').click(function () {
if ($("#liTab1").hasClass("current")) {
$("#stringval").val("0");
@ -266,6 +256,7 @@
$("#stringval").change(function () {
$("#smartSearchForm").submit();
});
$("#stringval2").change(function () {
$("#stringval3").val("");
$("#stringval4").val("");
@ -273,33 +264,39 @@
$("#stringval6").val("");
$("#smartSearchForm").submit();
});
$("#stringval3").change(function () {
$("#stringval4").val("");
$("#stringval5").val("");
$("#stringval6").val("");
$("#smartSearchForm").submit();
});
$("#stringval4").change(function () {
$("#stringval5").val("");
$("#stringval6").val("");
$("#smartSearchForm").submit();
});
$("#stringval5").change(function () {
$("#stringval6").val("");
$("#smartSearchForm").submit();
});
$("#stringval6").change(function () {
$("#smartSearchForm").submit();
});
});
function openIntro(cmno) {
$(".spnCmEduname").hide();
$(".spnCmUsername").hide();
$(".spnCmIntroHtml").hide();
$(".spnCmTargetHtml").hide();
$(".spnCmGoalHtml").hide();
$(".spnCmContentHtml").hide();
$("#divIntro").show();
capp("/focommon/getcmuser", { cmno: cmno }, "renderCmNo");
}
@ -309,17 +306,19 @@
var typegrade = $("#stringval5").find("option:selected").text();
var typejob = $("#stringval6").find("option:selected").text();
var cmkind;
cmkind = typeman + " | " + typeedu + " | " + typegrade + " | " + typejob;
if ($("#stringval").val() == "1") {
cmkind = $("#stringval3").find("option:selected").text();
}
$.each(capResult.obj, function (i, d) {
//20220729 온라인인경우 수료기준을 보여준다.
if (@(Model.stringval2) == 1) {
if (@(Model.stringval2 == null ? 0 : Convert.ToInt32(Model.stringval2)) == 1) {
$("#completeStd").hide();
}
else if (@(Model.stringval2) == 2) {
else if (@(Model.stringval2 == null ? 0 : Convert.ToInt32(Model.stringval2)) == 2) {
$("#completeStd").show();
}
@ -329,22 +328,57 @@
$("#spnCmAttend").text(d.attendcut);
$("#spnCmFinal").text(d.finalcut);
$("#spnCmSubject").text(d.subjectcut);
if (d.username != null && d.username != "" && d.username != undefined) {
$("#spnCmUsername").text(d.username);
$(".spnCmUsername").show();
}
if (d.cgcode != "101") {
if (d.cgcode == "102") {
$("#spnCmEduname").html("직무분야교육");
CmEdunameChk = 1;
}
else if (d.cgcode == "103" || d.cgcode == "104") {
$("#spnCmEduname").html("역량강화교육");
CmEdunameChk = 1;
}
else if (d.cgcode == "105") {
$("#spnCmEduname").html("전문분야교육");
CmEdunameChk = 1;
}
else if (d.cgcode == "107") {
$("#spnCmEduname").html("특성화교육");
CmEdunameChk = 1;
}
else {
CmEdunameChk = 0;
}
if (CmEdunameChk == 1) {
$(".spnCmEduname").show();
}
}
else {
$(".spnCmEduname").hide();
}
if (d.introhtml != null && d.introhtml != "" && d.introhtml != undefined) {
$("#spnCmIntroHtml").html(d.introhtml);
$(".spnCmIntroHtml").show();
}
if (d.targethtml != null && d.targethtml != "" && d.targethtml != undefined) {
$("#spnCmTargetHtml").html(d.targethtml);
$(".spnCmTargetHtml").show();
}
if (d.goalhtml != null && d.goalhtml != "" && d.goalhtml != undefined) {
$("#spnCmGoalHtml").html(d.goalhtml);
$(".spnCmGoalHtml").show();
}
if (d.contenthtml != null && d.contenthtml != "" && d.contenthtml != undefined) {
$("#spnCmContentHtml").html(d.contenthtml);
$(".spnCmContentHtml").show();
@ -377,9 +411,12 @@
if (btnSelect.html() == '교육신청') {
btnSelect.html('닫기');
//capp("/focommon/GetScdForMixEdu", { cmno: model.cm.cmno, month: $("#selMonth").val() }, "renderScd");
//교육일정에 등록되어 있는 일정 중 선택이 가능한 첫번째 일정 선택으로 달 파라미터 제거
capp("/focommon/GetScdForMixEdu", { cmno: cmno}, "renderScdInning(1," + cshape + "," + cmno + ")");
capp(
"/focommon/GetScdForMixEdu",
{ cmno: cmno },
"renderScdInning(1," + cshape + "," + cmno + ")"
);
}
else {
divInfo.empty();
@ -453,7 +490,6 @@
data.studyplace = d.studyplace;
data.studyplacename = d.studyplacename;
// 리스트에 생성된 객체 삽입
studyPlaceTmp.push(data);
}
});
@ -465,14 +501,15 @@
}
return acc;
}, []);
// 오름차순
studyPlace = studyPlace.sort(function (a, b) {
return a.studyplace < b.studyplace ? -1 : a.studyplace > b.studyplace ? 1 : 0;
});
if (studyPlace.length > 0) {
/*strStudyPlaceTag = "<ul class='smtlTab' id='divPlace_" + cmno + "'>";*/
strStudyPlaceTag = "<li class='current' onclick='javascript:setStudyplace(this," + cmno + ");'><a href='javascript:getCmInningPlace(" + cshape + ", " + cmno + ");' style='font-size:20px;'>전체</a></li>";
$.each(studyPlace, function (i, d) {
strStudyPlaceTag += "<li onclick='javascript:setStudyplace(this," + cmno + ");'><a href='javascript:getCmInningPlace(" + cshape + ", " + cmno + ", " + d.studyplace + ");'style='font-size:20px;'>" + d.studyplacename + " 교육장</a></li>";
});
@ -494,7 +531,7 @@
var ulScd = $("#ulScd" + cmno);
ulScd.empty();
//var seq = 0;
if (capResult.obj.length < 1) {
var li = $("<li />");
if (cshape == 1) {
@ -509,13 +546,12 @@
var li = $("<li />");
var pData = $("<p />");
var aApplyClass = $("<a />", { "onclick": "javascript:applyClassEdu(" + d.cmno + ", " + d.pcmno + ", " + d.cmino + ", " + d.cmisno + ");" });
/*var spanApplyClass = $("<span />", { "class": "smtlChkBtn smtlChk03", "style": "font-size:18px" });*/
var spanApplyClass = $("<span />", { "class": "smtlChkBtn smtlChk03" }, { "style": "font-size:18px" });
var spanApplyClassN = $("<span />", { "class": "smtlChkBtn smtlChk05" }, { "style": "font-size:18px" });
var radioEduDay = "<input type='radio' style='display:none' name='rdoScds' value='" + d.cmisno + "' ";
/*var radioEduDay = "<input type='radio' style='display:none' name='rdoScds' value='" + d.cmisno + "' onclick='javascript:applyClassEdu(" + d.cmno + ", " + d.pcmno + ", " + d.cmino + ", " + d.cmisno + ") + "' ";*/
var strStudyPlacename = "";
let comment = d.comment == null ? "" : "<span style='margin-left:12px'>(" + d.comment + ")</span>"
if (d.studyplace != null && d.studyplace != '' && d.studyplacename != null && d.studyplacename != '') {
strStudyPlacename = '[' + d.studyplacename + '교육장]';
}
@ -524,54 +560,6 @@
pData.html("<label>" + "<span style='color:blue'>" + strStudyPlacename + "</span>" + " <span style='color: red'>[종료] </label>" + radioEduDay + " disabled> <span style='color:gray'>" + d.scdInfoSummary + comment + "</span></span>");
}
else {
/* by 인덕
if (d.quota != 0) {
// 제한인원 지정됨
if (d.remainPeople <= 0) { // remainPeople(등록가능인원수) <= 0
spanApplyClassN.text("수강신청");
aApplyClass.append(spanApplyClassN);
pData.html("<label>" + "<span style='color:blue'>" + strStudyPlacename + "</span>" + " <span style='color: red'>[접수마감] </span>" + radioEduDay + " disabled> <span style='color:gray'>" + d.scdInfoSummary + "</span></span>");
pData.append(spanApplyClassN);
}
else {
if (d.isselected == 1) { // isselected = (cm.setime('%Y%m%d',학습종료) == cminningscd.estart('%Y%m%d',교육시작) ? 1 : 0)
spanApplyClass.text("수강신청");
aApplyClass.append(spanApplyClass);
pData.html("<label>" + "<span style='color:blue'>" + strStudyPlacename + "</span>" + " <span style='color: red'>[접수중] </span>" + radioEduDay + " checked> " + d.scdInfoSummary + "<span style='color: red;display:none;'> (" + d.remainPeople + "명 남음)</span></span>");
pData.append(aApplyClass);
}
else {
spanApplyClass.text("수강신청");
aApplyClass.append(spanApplyClass);
pData.html("<label>" + "<span style='color:blue'>" + strStudyPlacename + "</span>" + " <span style='color: red'>[접수중] </span>" + radioEduDay + "'> " + d.scdInfoSummary + "<span style='color: red;display:none;'> (" + d.remainPeople + "명 남음)</span> " + "</span>");
pData.append(aApplyClass);
}
}
}
else {
// 제한인원 무제한
if (d.remainPeople <= 0) { // remainPeople(등록가능인원수) <= 0
spanApplyClassN.text("수강신청");
aApplyClass.append(spanApplyClassN);
pData.html("<label>" + "<span style='color:blue'>" + strStudyPlacename + "</span>" + " <span style='color: red'>[접수마감] </span>" + radioEduDay + " disabled> <span style='color:gray'>" + d.scdInfoSummary + "</span></span>");
pData.append(spanApplyClassN);
}
else {
if (d.isselected == 1) { // isselected = (cm.setime('%Y%m%d',학습종료) == cminningscd.estart('%Y%m%d',교육시작) ? 1 : 0)
spanApplyClass.text("수강신청");
aApplyClass.append(spanApplyClass);
pData.html("<label>" + "<span style='color:blue'>" + strStudyPlacename + "</span>" + " " + radioEduDay + " checked> " + d.scdInfoSummary + "</label></label>");
pData.append(spanApplyClass);
}
else {
spanApplyClass.text("수강신청");
aApplyClass.append(spanApplyClass);
pData.html("<label>" + "<span style='color:blue'>" + strStudyPlacename + "</span>" + " " + radioEduDay + "'> " + d.scdInfoSummary + "</label></label>");
pData.append(aApplyClass);
}
}
}
*/
d.scdInfoSummary = (d.scdInfoSummary).replace("까지", "")
if (d.remainPeople <= 0) { // remainPeople(등록가능인원수) <= 0
spanApplyClassN.text("접수마감");
@ -584,7 +572,7 @@
console.log("교육신청")
aApplyClass.append(spanApplyClass);
if (d.quota != 0) {
if (d.isselected == 1) { // isselected = (cm.setime('%Y%m%d',학습종료) == cminningscd.estart('%Y%m%d',교육시작) ? 1 : 0)
if (d.isselected == 1) {
// 사용안하는것 추측됨
pData.html("<label>" + "<span style='color:blue'>" + strStudyPlacename + "</span>" + " <span style='color: red'>[접수중] </span>" + radioEduDay + " checked> " + d.scdInfoSummary + comment + "<span style='color: red;display:none;'> (" + d.remainPeople + "명 남음)</span></span>");
pData.append(aApplyClass);
@ -596,7 +584,7 @@
}
else {
// 사용안하는것 추측됨
if (d.isselected == 1) { // isselected = (cm.setime('%Y%m%d',학습종료) == cminningscd.estart('%Y%m%d',교육시작) ? 1 : 0)
if (d.isselected == 1) {
pData.html("<label>" + "<span style='color:blue'>" + strStudyPlacename + "</span>" + " " + radioEduDay + " checked> " + d.scdInfoSummary + comment + "</label></label>");
pData.append(spanApplyClass);
}
@ -624,158 +612,10 @@
}
if (issearchable) {
//if (cshape == 1) {
// $("#divPlace_" + cmno).show();
//}
//else {
// $("#divPlace_" + cmno).hide();
//}
capp("/focommon/GetScdForMixEdu", { cmno: cmno, studyPlace: studyPlace}, "renderScdInning(0, " + cshape + "," + cmno + ")");
}
}
//20220729 교육장, 교육일정 정보 생성
////function renderScdPlace(cshape, cmno, place) {
//// let strTmp = "";
//// let strStudyPlaceTag = "";
//// var divInfo = $("#divInfo_" + cmno);
//// divInfo.empty();
//// var divPlace = $("#divPlace_" + cmno);
//// divPlace.empty();
//// var divScd = $("#divScd" + cmno);
//// divScd.empty();
//// //교육장 만들기
//// if (capResult.obj.length > 0) {
//// var studyPlaceTmp = new Array();
//// $.each(capResult.obj, function (i, d) {
//// var data = new Object();
//// if (d.studyplace != null) {
//// data.studyplace = d.studyplace;
//// data.studyplacename = d.studyplacename;
//// // 리스트에 생성된 객체 삽입
//// studyPlaceTmp.push(data);
//// }
//// });
//// // 교육장소코드, 교육장소명 Distinct
//// let studyPlace = studyPlaceTmp.reduce(function (acc, current) {
//// if (acc.findIndex(({ studyplace }) => studyplace === current.studyplace) === -1) {
//// acc.push(current);
//// }
//// return acc;
//// }, []);
//// // 오름차순
//// studyPlace = studyPlace.sort(function (a, b) {
//// return a.studyplace < b.studyplace ? -1 : a.studyplace > b.studyplace ? 1 : 0;
//// });
//// if (studyPlace.length > 0) {
//// /*strStudyPlaceTag = "<ul class='smtlTab' id='divPlace_" + cmno + "'>";*/
//// strStudyPlaceTag = "<li class='current' onclick='javascript:setStudyplace(this," + cmno + ");'><a href='javascript:getCmInningPlace(" + cshape + ", " + cmno + ");'>전체</a></li>";
//// $.each(studyPlace, function (i, d) {
//// strStudyPlaceTag += "<li onclick='javascript:setStudyplace(this," + cmno + ");'><a href='javascript:getCmInningPlace(" + cshape + ", " + cmno + ", " + d.studyplace + ");'>" + d.studyplacename + " 교육장</a></li>";
//// });
//// }
//// }
//// // 교육장소 생성하기
//// if (strStudyPlaceTag != '') {
//// divPlace.append(strStudyPlaceTag);
//// divPlace.show();
//// }
//// //강좌일정 태그 생성
//// strTmp = "<ul id='ulScd" + cmno + "'></ul>";
//// divScd.append(strTmp);
//// var ulScd = $("#ulScd" + cmno);
//// ulScd.empty();
//// //var seq = 0;
//// if (capResult.obj.length < 1) {
//// var li = $("<li />");
//// li.append("<label> - 선택 가능한 교육종료일이 없습니다.</label>");
//// ulScd.append(li);
//// }
//// $.each(capResult.obj, function (i, d) {
//// var li = $("<li />");
//// var pData = $("<p />");
//// var aApplyClass = $("<a />", { "onclick": "javascript:applyClassEdu(" + d.cmno + ", " + d.pcmno + ", " + d.cmino + ", " + d.cmisno + ");" });
//// /*var spanApplyClass = $("<span />", { "class": "smtlChkBtn smtlChk03", "style": "font-size:18px" });*/
//// var spanApplyClass = $("<span />", {"style": "font-size:18px" });
//// alert(strStudyPlacename);
//// var strStudyPlacename = "";
//// if (d.studyplacename != '') {
//// strStudyPlacename = '[' + d.studyplacename + ']';
//// }
//// if (d.isEnd == true) {
//// pData.html("<label>" + strStudyPlacename + " <label style='color: red'>[종료] </label>" + radioEduDay + " disabled> <span style='color:gray'>" + d.scdInfoSummary + "</span></label>");
//// }
//// else {
//// if (d.quota != 0) {
//// if (d.remainPeople <= 0) {
//// pData.html("<label>" + strStudyPlacename + " <label style='color: red'>[접수마감] </label>" + radioEduDay + " disabled> <span style='color:gray'>" + d.scdInfoSummary + "</span></label>");
//// }
//// else {
//// if (d.isselected == 1) {
//// spanApplyClass.text("수강신청");
//// aApplyClass.append(spanApplyClass);
//// pData.html("<label>" + strStudyPlacename + " <label style='color: red'>[접수중] </label>" + radioEduDay + " checked> " + d.scdInfoSummary + "<label style='color: red;display:none;'> (" + d.remainPeople + "명 남음)</label></label>");
//// }
//// else {
//// spanApplyClass.text("수강신청");
//// aApplyClass.append(spanApplyClass);
//// pData.html("<label>" + strStudyPlacename + " <label style='color: red'>[접수중] </label>" + radioEduDay + "'> " + d.scdInfoSummary + "<label style='color: red;display:none;'> (" + d.remainPeople + "명 남음)</label> " + "</label>");
//// pData.append(aApplyClass);
//// }
//// //if (seq == 0) {
//// // li.append("<label>" + radioEduDay + " checked> " + d.scdInfoSummary + "<label style='color: red;display:none;'> (" + d.remainPeople + "명 남음)</label></label>");
//// //}
//// //else {
//// // li.append("<label>" + radioEduDay + "'> " + d.scdInfoSummary + "<label style='color: red;display:none;'> (" + d.remainPeople + "명 남음)</label></label>");
//// //}
//// }
//// }
//// else {
//// if (d.isselected == 1) {
//// pData.html("<label>" + strStudyPlacename + " " + radioEduDay + " checked> " + d.scdInfoSummary + "</label></label>");
//// }
//// else {
//// pData.html("<label>" + strStudyPlacename + " " + radioEduDay + "'> " + d.scdInfoSummary + "</label></label>");
//// }
//// //if (seq == 0) {
//// // li.append("<label>" + radioEduDay + " checked> " + d.scdInfoSummary + "</label>");
//// //}
//// //else {
//// // li.append("<label>" + radioEduDay + "'> " + d.scdInfoSummary + "</label>");
//// //}
//// }
//// }
//// //aApplyClass.append(spanApplyClass);
//// //pData.append(aApplyClass);
//// li.append(pData);
//// //li.append(aApplyClass);
//// ulScd.append(li);
//// //ulScd.append(li2);
//// });
//// //20220726
//// //alert("model.cmisno" + model.cmisno);
//// //if (model.cmisno != null) {
//// // $("input:radio[name='rdoScds'][value='" + model.cmisno + "']").click();
//// //}
////}
//20220729 개발전
function getSubCm(cshape, no, place) {
var issearchable = false;
@ -803,7 +643,6 @@
var cmno = _cmno;
var ulSubCm = $("#ulSubCm_" + cmno);
ulSubCm.empty();
//var applyClass = "<li><p class='subDsc' style='color:red;'>※ 입금완료시 교육이 바로 시작되며 동영상 시청이 가능합니다</p >※ 각 기수별 <span style='color:red;'>교육종료일을 꼭 확인하시고</span> 교육신청 부탁드립니다.</li>";
$.each(capResult.obj, function (i, d) {
var li = $("<li />");
var p = $("<p />");
@ -829,19 +668,15 @@
}
if (d.cshape == 0) {
//p.html("<label style='cursor:default; font-size:18px'>" + d.tseq + "기 | " + d.cname + " | <span style='" + ((d.retimeymd == "2099-12-31") ? 'display:none' : '') + "'><span class='gry'>" + d.ssrename + "</span></span><span class='red'> " + (d.retimeymd == "2099-12-31" ? "신청일로부터 " + d.studydays + "일 (" + d.studytime + " 시간)" : "(" + d.studytime + "시간)") + "</span> | <span class=red>" + bindComma(d.infee) + "원</span></label>");
p.html("<label style='cursor:default; font-size:18px'>" + d.tseq + "기 | " + d.cname + " | <span style='" + ((d.retimeymd == "2099-12-31") ? 'display:none' : '') + "'><span class='gry'>" + d.ssrename + "</span></span><span class='red'> " + (d.retimeymd == "2099-12-31" ? "(" + d.studytime + " 시간)" : "(" + d.studytime + "시간)") + "</span> | <span class=red>" + bindComma(d.infee) + "원</span></label>");
}
else if (d.cshape == 1) {
//p.html("<label style='cursor:default; font-size:18px'>" + d.tseq + "기 | <span class='blu'>[" + d.studyplacename + "교육장]</span> " + d.cname + " | <span style='" + ((d.retimeymd == "2099-12-31") ? 'display:none' : '') + "'><span class='gry'>" + d.ssrename + "</span></span><span class='red'> " + (d.retimeymd == "2099-12-31" ? "신청일로부터 " + d.studydays + "일 (" + d.studytime + " 시간)" : "("+d.ssretimeToDay +"일)") + "</span> | <span class=red>" +bindComma(d.infee)+"원</span></label>");
p.html("<label style='cursor:default; font-size:18px'>" + d.tseq + "기 | <span class='blu'>[" + d.studyplacename + "교육장]</span> " + d.cname + " | <span style='" + ((d.retimeymd == "2099-12-31") ? 'display:none' : '') + "'><span class='gry'>" + d.ssrename + "</span></span><span class='red'> " + (d.retimeymd == "2099-12-31" ? "(" + d.studytime + " 시간)" : "("+d.ssretimeToDay +"일)") + "</span> | <span class=red>" +bindComma(d.infee)+"원</span></label>");
}
else if (d.cshape == 2) {
//p.html("<label style='cursor:default; font-size:18px'>" + d.tseq + "기 | " + d.cname + " | <span style='" + ((d.retimeymd == "2099-12-31") ? 'display:none' : '') + "'><span class='gry'>" + d.ssrename + "</span></span><span class='red'> " + (d.retimeymd == "2099-12-31" ? "신청일로부터 " + d.studydays + "일 (" + d.studytime + " 시간)" : "(" + d.studytime + "시간)") + "</span> | <span class=red>" + bindComma(d.infee) + "원 ※ 집체교육 선택 필수</span></label>");
//p.html("<label style='cursor:default; font-size:18px'>" + d.tseq + "기 | " + d.cname + " | <span style='" + ((d.retimeymd == "2099-12-31") ? 'display:none' : '') + "'><span class='red'>교육종료일(" + d.setimeymd + "까지)</span></span><span> " + (d.retimeymd == "2099-12-31" ? "신청일로부터 " + d.studydays + "일 (" + d.studytime + " 시간)" : "(" + d.studytime + "시간)") + "</span></label>");
//p.html("<label style='cursor:default; font-size:18px'>" + d.cname + "<span style='" + ((d.retimeymd == "2099-12-31") ? 'display:none' : '') + "'></span><span> " + (d.retimeymd == "2099-12-31" ? "신청일로부터 " + d.studydays + "일 (" + d.studytime + " 시간)" : "(" + d.studytime + "시간)") + "</span></label>");
p.html("<label style='cursor:default; font-size:18px'>" + d.cname + "<span style='" + ((d.retimeymd == "2099-12-31") ? 'display:none' : '') + "'></span><span> " + (d.retimeymd == "2099-12-31" ? "(" + d.studytime + " 시간)" : "(" + d.studytime + "시간)") + "</span></label>");
}
spanIntro.text("강좌소개");
li.append(p);
a.append(spanIntro);
@ -859,23 +694,30 @@
}
}
@*/** 수강신청 버튼 클릭 */*@
function applyClassEdu(cmno, pcmno, cmino, cmisno) {
//수강신청
var uno = ('@ViewBag.SSUserNo' != '') ? parseInt(@ViewBag.SSUserNo) : 0;
if (uno > 0) {
if (@ViewBag.SSUserNo > 0) {
////var cmino = $("#cmino");
$("#cmino").val(cmino);
///*var cmisno = $("#cmisno");*/
$("#cmisno").val(cmisno);
checkLectCompleteEdu(cmno, "@Model.stringval3", "@Model.stringval4", "@Model.stringval5", $("#pcmno_" + pcmno + "_cgcode").val(), pcmno, "chkLect");
checkLectCompleteEdu(cmno, "@Model.stringval3", "@Model.stringval4", "@Model.stringval5", "@Model.stringval6", $("#pcmno_" + pcmno + "_cgcode").val(), pcmno, "chkLectNew");
}
else {
//msg("로그인 후 신청 할 수 있습니다.");
let searchRslt = $("#smartSearchForm").serialize()
searchRslt += "&stringval17=" + cmno + "&stringval18=" + pcmno + "&stringval19=" + cmino + "&stringval20=" + cmisno;
searchRslt += "&stringval21=" + $("#pcmno_" + pcmno + "_cgcode").val()
location.href = "/Account/index?" + searchRslt;
let searchRslt = $("#smartSearchForm").serialize();
let url = `/Account/index?${searchRslt}
&stringval17=${cmno}
&stringval18=${pcmno}
&stringval19=${cmino}
&stringval20=${cmisno}
&stringval21=${$("#pcmno_" + pcmno + "_cgcode").val()}`;
url = url.replace(/\s/g, '');
location.href = url;
return;
}
}
@ -884,7 +726,7 @@
function applyClass(cmno, pcmno) {
//수강신청
if (@ViewBag.SSUserNo > 0) {
checkLectComplete(cmno, "@Model.stringval3", "@Model.stringval4", "@Model.stringval5", $("#pcmno_" + pcmno + "_cgcode").val(), pcmno, "chkLect");
checkLectComplete(cmno, "@Model.stringval3", "@Model.stringval4", "@Model.stringval5", "@Model.stringval6", $("#pcmno_" + pcmno + "_cgcode").val(), pcmno, "chkLect");
}
else {
msg("로그인 후 신청 할 수 있습니다.");
@ -896,21 +738,91 @@
let _cgcode = 0;
let _grade = 0;
function checkLectCompleteEdu(cmno, man, edu, grade, cgcode, pcmno) {
function checkLectCompleteEdu(cmno, man, edu, grade, job, cgcode, pcmno) {
_cmno = cmno;
_edu = edu;
_cgcode = cgcode;
_grade = grade;
capp("/focommon/GetCheckLectIs", { cmno: cmno, man: man, edu: edu, grade: grade, cgcode: cgcode, pcmno: pcmno }, "chkLect"); // 1
//capp("/focommon/GetCheckLectIs",
// {
// cmno: cmno,
// man: man,
// edu: edu,
// grade: grade,
// job1: job,
// cgcode: cgcode,
// pcmno: pcmno
// }, "chkLect"); // 1
capp("/focommon/GetCheckLectIs",
{
cmno: cmno,
man: man,
edu: edu,
grade: grade,
job1: job,
cgcode: cgcode,
pcmno: pcmno
}, "chkLectNew"); // 1
}
//20220729 개발전
function checkLectComplete(cmno, man, edu, grade, cgcode, pcmno) {
_cmno = cmno;
capp("/focommon/GetCheckLectIs", { cmno: cmno, man: man, edu: edu, grade: grade, cgcode: cgcode, pcmno: pcmno }, "chkLect"); // 1
@*capResult.code == code;*@
capp(
"/focommon/GetCheckLectIs",
{
cmno: cmno,
man: man,
edu: edu,
grade: grade,
cgcode: cgcode,
pcmno: pcmno
},
"chkLect"
); // 1
}
//
function chkLectNew() {
if (capResult.code == 1000) {
var resultCode = capResult.obj;
if (resultCode == 0) {
checkLectIsComplete(_cmno);
}
else {
switch (resultCode) {
case -2:
msg("<span style='font-size: 15pt;'>이미 동일한 내용의 교육을 신청,수강 또는 수료한 과정입니다.</span>");
break;
case -10:
case -20:
case -30:
msg(`
<span style='text-align: center;margin: 0 auto;display: inline-block;font-size: 15pt;line-height: 22pt;'>
이 교육은 아래의 사유 중 하나에 해당되어 신청되지 않는 교육입니다.<br><br>
<p class='hello' style=' color: red; text-align:left; font-size:13pt;'>
&nbsp; &nbsp; - &nbsp; &nbsp;선택한 교육목적으로 인정되지 않는 경우<br>
&nbsp; &nbsp; - &nbsp; &nbsp;이미 신청 또는 수료한 교육과 함께 수료하면 인정이 되지 않는 경우
</p><br>
따라서 현재 화면에 나와있는 다른 교육으로 신청하여 주시기 바랍니다.<br><br>
<span style='display: block; margin - left: calc(50 % - 77px);'>
문의 : 1544 - 7660
</span>
</span>
`);
break;
case -100:
msg("<span style='font-size: 15pt;'>잠시 후 다시 시도해주세요.</span>");
break;
default:
break;
}
}
}
}
@ -918,6 +830,7 @@
function chkLect() { //2 --> 4
let chk = @(DateTime.Now > DateTime.Parse("2030-01-02 00:00") ? "true" : "false"); // ### ty 2024년 추가건 // chk == 1 ? 2024년 표시 문구 나오기
let chkMsg = "";
if (capResult.code == 1000) {
if (capResult.obj == 0) {
@ -932,10 +845,11 @@
}
if (chk && chkMsg != "") {
msg(chkMsg)
msg(chkMsg);
$(".mainokbutton").on("click", function () {
checkLectIsComplete(_cmno);
})
});
}
else {
checkLectIsComplete(_cmno);
@ -943,7 +857,6 @@
}
else if (capResult.obj == 1) {
if (chk) {
msg("<span style='text-align: center;margin: 0 auto;display: inline-block;font-size: 15pt;line-height: 22pt;'>" +
"<p class='hello' style=' color: red; text-align:left; font-size:15pt;'>" +
"&nbsp; &nbsp; 이미 같은 교육목적과 등급으로 신청 또는 이수한 내역이 있습니다." +
@ -957,15 +870,13 @@
}
}
else {
@* msg("<sapn style='font-size: 15pt;'>이미 수강/수료한 과정입니다.</span>");*@
msg("<sapn style='font-size: 15pt;'>이미 동일한 내용의 교육을 신청,수강 또는 수료한 과정입니다.</span>");
msg("<span style='font-size: 15pt;'>이미 동일한 내용의 교육을 신청,수강 또는 수료한 과정입니다.</span>");
}
}
}
function checkLectIsComplete(cmno) { //3
capp("/focommon/GetCheckLectIsComplete", { cmno: cmno }, "check");
}
@ -973,7 +884,6 @@
var cnt = capResult.obj;
if (cnt > 0) {
// 강좌를 만들 수 있지만 이미 생성된 조건?
@* msg("이미 수강/수료한 과정입니다.");*@
msg("<sapn style='font-size: 15pt;'>이미 동일한 내용의 교육을 신청,수강 또는 수료한 과정입니다.</span>");
return;
}
@ -982,4 +892,37 @@
$("#smartSearchForm").attr("action", "/Course/ApplyEdu").submit();
}
}
</script>
@functions {
/// <summary>
/// 과정 코드(cgcode)에 따라 사용자에게 보여줄 라벨(span 태그 형태)을 반환.
/// </summary>
/// <param name="code">과정 코드 (예: "107", "105" 등)</param>
/// <returns>
/// HTML span 태그 문자열.
/// 예: <span style='color:blue; font-weight:bold;'>[역량강화교육]</span>
/// </returns>
string GetCgLabel(string code)
{
switch (code)
{
case "101":
return "<span style='color:blue; font-weight:bold; font-size:22px' data-code=" + code +">[기본교육]</span>";
case "107":
return "<span style='color:blue; font-weight:bold; font-size:22px' data-code=" + code +">[특성화교육]</span>";
case "103":
case "104":
return "<span style='color:green; font-weight:bold; font-size:22px' data-code=" + code +">[역량강화교육]</span>";
case "105":
return "<span style='color:#FF6600; font-weight:bold; font-size:22px' data-code=" + code +">[전문분야교육]</span>";
case "102":
return "<span style='color:purple; font-weight:bold; font-size:22px' data-code=" + code +">[직무분야교육]</span>";
default:
return "<span style='font-weight:bold; font-size:22px' data-code=" + code +">[" + code + "]</span>";
}
}
}

View File

@ -19,7 +19,6 @@
<ul class="schCont">
<li>
<select name="stringval2" id="stringval2">
@*<option value="0" @(Model.stringval2 == "0" ? "selected" : "")>온라인교육</option>*@
<option value="1" @(Model.stringval2 == "1" ? "selected" : "")>교육장교육</option>
<option value="2" @(Model.stringval2 == "2" ? "selected" : "")>온라인교육</option>
</select>

View File

@ -1,7 +1,10 @@
@model NP.Model.VMHome
<head>
<style>
<style type="text/css">
.mainTab li:after {
content: none;
}
.mainTop * {
font-family: 'Noto Sans KR', sans-serif;
font-size: 11pt;
@ -10,6 +13,330 @@
color: #fff;
line-height: 1.6em;
}
/* --- 교육신청 주의사항 팝업 CSS 시작 --- */
.edu-popup-container, .edu-popup-container button, .edu-popup-container input {
font-family: 'Malgun Gothic', '맑은 고딕', Dotum, '돋움', sans-serif;
}
#edu-modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.6);
display: none;
z-index: 9999;
opacity: 0;
transition: opacity 0.3s ease;
}
#edu-layer-popup {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(0.95);
width: 90%;
max-width: 780px;
background-color: #fff;
border-radius: 12px;
display: none;
z-index: 10000;
box-shadow: 0 5px 20px rgba(0,0,0,0.2);
box-sizing: border-box;
overflow: hidden;
opacity: 0;
transition: opacity 0.3s ease, transform 0.3s ease;
}
#edu-modal-overlay.active, #edu-layer-popup.active {
display: block;
opacity: 1;
}
#edu-layer-popup.active {
transform: translate(-50%, -50%) scale(1);
}
.edu-popup-header {
background-color: #2c3e50;
color: #fff;
padding: 18px;
text-align: center;
}
.edu-popup-header h2 {
margin: 0;
font-size: 24px;
font-weight: 700;
color: #fff;
}
.edu-popup-content {
padding: 35px 50px;
line-height: 1.8;
}
.edu-popup-content h3 {
color: #d90429;
text-align: center;
font-size: 26px;
font-weight: 700;
margin-top: 0;
margin-bottom: 30px;
}
/* ★[수정] 중앙 정렬을 위한 컨테이너 */
.edu-popup-content .text-center {
text-align: center;
}
/* ★[수정] 리스트 기본 스타일 제거 */
.edu-popup-content .text-center ol {
padding-left: 0;
list-style-type: none;
display: inline-block; /* 컨텐츠 크기에 맞게 중앙 정렬 */
text-align: left; /* 리스트 내용은 다시 좌측 정렬 */
}
/* ★[수정] 리스트 아이템 스타일 (글자 크기 증가 및 중앙 정렬) */
.edu-popup-content .text-center li {
text-align: center; /* 텍스트 중앙 정렬 */
font-size: 20px; /* 글자 크기 증가 */
font-weight: 500;
line-height: 1.7;
margin-bottom: 20px;
}
/* ★[수정] 중요(빨간색) 텍스트 스타일 */
.edu-popup-content .text-center > .text-red {
font-size: 20px; /* 글자 크기 증가 */
font-weight: 600;
margin-top: 10px;
}
.text-red {
color: #d90429;
font-weight: 600;
}
.text-blue {
color: #1A5276;
font-weight: 600;
}
.edu-details-btn {
display: block;
width: 220px;
margin: 30px auto;
padding: 10px;
font-size: 16px;
font-weight: 600;
color: #555;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 5px;
cursor: pointer;
text-align: center;
transition: background-color 0.2s, border-color 0.2s;
}
.edu-details-btn:hover {
background-color: #f5f5f5;
border-color: #bbb;
}
.edu-popup-content .info {
font-size: 17px;
margin-top: 30px;
color: #333;
font-weight: 600;
text-align: center;
}
.edu-consent-check {
margin-top: 35px;
text-align: center;
font-size: 17px;
}
.edu-consent-check input[type="checkbox"] {
display: none;
}
.edu-consent-check label {
position: relative;
padding-left: 35px;
cursor: pointer;
line-height: 28px;
display: inline-block;
user-select: none;
}
.edu-consent-check label::before {
content: '';
position: absolute;
left: 0;
top: 1px; /* [수정] 수직 정렬 */
width: 26px;
height: 26px;
border: 2px solid #aaa;
background-color: #fff;
border-radius: 5px;
transition: all 0.2s;
}
.edu-consent-check input[type="checkbox"]:checked + label::before {
background-color: #2c3e50;
border-color: #2c3e50;
}
.edu-consent-check label::after {
content: '';
position: absolute;
left: 9px;
top: 5px; /* [수정] 수직 정렬 */
width: 8px;
height: 15px;
border: solid white;
border-width: 0 3px 3px 0;
transform: rotate(45deg);
opacity: 0;
transition: opacity 0.2s;
}
.edu-consent-check input[type="checkbox"]:checked + label::after {
opacity: 1;
}
.edu-popup-footer {
text-align: center;
padding: 25px;
background-color: #f9f9f9;
border-top: 1px solid #eee;
}
.edu-popup-footer button {
width: 130px;
padding: 12px 0;
font-size: 19px;
font-weight: 600;
cursor: pointer;
border: 1px solid #aaa;
background-color: #fff;
margin: 0 10px;
border-radius: 6px;
transition: all 0.2s;
color: #333;
}
#edu-confirm-btn {
background-color: #2c3e50;
color: #fff;
border-color: #2c3e50;
}
#edu-confirm-btn:hover {
background-color: #34495e;
}
#edu-cancel-btn:hover {
background-color: #f0f0f0;
}
@@media (max-width: 768px) {
.edu-popup-header h2 {
font-size: 22px;
}
.edu-popup-content {
padding: 30px 35px;
}
.edu-popup-content h3 {
font-size: 22px;
}
.edu-popup-content .text-center li, .edu-popup-content .text-center > .text-red {
font-size: 18px;
}
.edu-popup-content .info, .edu-consent-check {
font-size: 15px;
}
.edu-popup-footer button {
width: 120px;
font-size: 17px;
}
}
@@media (max-width: 480px) {
.edu-popup-header h2 {
font-size: 19px;
}
.edu-popup-content {
padding: 25px 20px;
}
.edu-popup-content h3 {
font-size: 19px;
margin-bottom: 25px;
}
.edu-popup-content .text-center li, .edu-popup-content .text-center > .text-red {
font-size: 16px;
line-height: 1.6;
}
.edu-details-btn {
width: 180px;
font-size: 14px;
}
.edu-popup-content .info {
font-size: 14px;
}
.edu-consent-check {
font-size: 14px;
}
.edu-consent-check label {
padding-left: 30px;
}
.edu-consent-check label::before {
width: 22px;
height: 22px;
}
.edu-consent-check label::after {
left: 8px;
top: 4px;
width: 6px;
height: 12px;
}
.edu-popup-footer {
padding: 20px;
}
.edu-popup-footer button {
width: 100%;
margin: 0;
padding: 13px 0;
}
.edu-popup-footer button:first-child {
margin-bottom: 10px;
}
}
/* --- 교육신청 주의사항 팝업 CSS 끝 --- */
</style>
</head>
@section main{
@ -71,12 +398,6 @@
<div>
<div>
<ul>
@*<li><a href="javascript:schIpt('1', '0', '온라인교육');">온라인교육</a></li>*@
@*20220726 교육장교육 선택 활성화*@
@*@if ((ViewBag.SSUserNo == 120) && (Request.Url.Authority == "www.ynicte.com" || Request.Url.Authority == "ynicte.nptc.kr"))
{
<li><a href="javascript:schIpt('1', '1', '교육장교육');">교육장교육</a></li>
}*@
<li><a href="javascript:schIpt('1', '1', '교육장교육');">교육장교육</a></li>
<li><a href="javascript:schIpt('1', '2', '온라인교육');">온라인교육</a></li>
</ul>
@ -197,7 +518,6 @@
<div>
<div>
<ul>
@*<li><a href="javascript:schIpt('1', '0', '온라인교육');">온라인교육</a></li>*@
<li><a href="javascript:schIpt('1', '1', '교육장교육');">교육장교육</a></li>
<li><a href="javascript:schIpt('1', '2', '혼합교육');">온라인교육</a></li>
</ul>
@ -243,25 +563,67 @@
</div>
</form>
}
<div class="edu-popup-container">
<div id="edu-modal-overlay"></div>
<div id="edu-layer-popup">
<header class="edu-popup-header">
<h2>교육신청 전 필수 확인</h2>
</header>
<main class="edu-popup-content">
<h3>건설사업관리(계속교육) 신청 시 주의사항</h3>
<div class="text-center">
<ol>
<li>
1. 건설사업관리의 현재 등급이 고급 또는 특급인 경우<br />
계속교육 이수 시 반드시<br />
전체 교육이수시간 중 <span class="text-red">역량강화 교육은 1개 과정만 이수하여야 합니다.</span>
</li>
<li>
2. 역량강화 교육은 교육신청 시 교육과정명 앞에 [역량강화교육]으로 표기되어 있습니다.
</li>
</ol>
<p class="text-red">※ (중요) 역량강화교육으로만 2개 과정 이수 불가</p>
</div>
<button class="edu-details-btn" onclick="goLink();">상세안내 보러가기</button>
<p class="info">※ 해당 내용에 대하여 문의하실 분은 교육원으로 연락 주시면 안내 드리겠습니다.</p>
<div class="edu-consent-check">
<input type="checkbox" id="edu-consent">
<label for="edu-consent">
<span class="text-blue">상기 내용을 이해하였으며 잘못 이수된 교육은 인정되지 않음을 확인하였습니다.</span>
</label>
</div>
</main>
<footer class="edu-popup-footer">
<button id="edu-confirm-btn" onclick="educationConfirmSubmit();">확인</button>
<button id="edu-cancel-btn" onclick="closeEducationPopup();">취소</button>
</footer>
</div>
</div>
<textarea style="display: none;" id="texthide01">@ViewBag.POPUPS</textarea>
@section scriptsHeader{
<script src="~/js/jquery-ui.min.js"></script>
<style>
.mainTab li:after {
content: none;
}
</style>
}
@section scripts{
<script>
$(window).on("load", function () {
$(".iframebox").each(function () {
document.getElementById("ifrpop" + $(this).attr("ifrnum")).contentWindow.document.body.style.overflow = "hidden";
});
});
$(document).ready(function () {
initSearch();
//showEducationPopup();
if (ismobile() || window) {
if ($("#texthide01").val() != '') {
$.each($($("#texthide01").val().split('nptechpopuplistseparator')), function (i, p) {
@ -272,10 +634,8 @@
"<a class=\"closepopa\" href=\"#\" onclick=\"hidepop();$('#popbox" + p[0] + "').remove();\">✖</a></div>" +
"<div class=\"iframebox\" ifrnum=\""+p[0]+"\"><iframe id=\"ifrpop" + p[0] + "\" style=\"border: 0 none; height: " + (getint(p[6]) - 4) + "px; width: " + (getint(p[5])) + "px;\"></iframe></div>" +
"<div class=\"iframeclosebox\"></div></div></div>");
//"<div class=\"iframeclosebox\"><a class=\"\" style=\"border: 1px solid #ddd; padding: 5px 15px;\" onclick=\"hide7('popbox" + p[0] + "', " + p[0] + ")\"> 7일간 숨기기</a></div></div></div>");
$("#ifrpop" + p[0]).attr("src", "/Home/Popup?pno=" + p[0]);
$("#popbox" + p[0]).show();
//$("html").css("overflow", "hidden");
}
});
$(".poptitlebox").on("click", function () {
@ -288,11 +648,7 @@
$(".draggablethis").draggable();
}
// 영남 요청으로 클릭 이벤트 제거 2024.03.14(pms:4484)
//$('#liTab1').click(function () {
// $("#stringval").val("0");
// $("#indexForm").submit();
//});
$('#liTab2').click(function () {
$("#stringval").val("1");
$("#indexForm").submit();
@ -304,17 +660,13 @@
})
$(".msBtn").click(function () {
@*// // 2024.08.07 로그인제한 해제
if (@ViewBag.SSUserNo <= 0) {
msg("로그인 후 진행 할 수 있습니다.", null, null, null, "location.href='" + '/Account/Index' + "'");
return;
}*@
if ($("#liTab1").hasClass("current")) {
$("#stringval").val("0");
}
else if ($("#liTab2").hasClass("current")) {
$("#stringval").val("1");
}
$("#stringval2").val($("#sch1").val());
$("#stringval3").val($("#sch2").val());
$("#stringval4").val($("#sch3").val());
@ -337,13 +689,28 @@
}
if ($("#msSel2 > span").text() != "품질관리기술인" && $("#sch6").val() == "") {
@*msg("전문분야을 입력하세요.");*@ $("#stringval2").focus(); return;
$("#stringval2").focus(); return;
}
// 2025-09 (스마트검색 개발 건 미사용으로 주석처리, 필요시 복원)
// 건설사업관리(계속교육) 신청 시 주의사항
if ($("#stringval3").val() == "28"
&& $("#stringval4").val() == "31"
&& ($("#stringval5").val() == "38" || $("#stringval5").val() == "39")
) {
showEducationPopup();
} else {
$("#indexForm").attr("action", "/Course/SmartSearch").submit();
}
//$("#indexForm").attr("action", "/Course/SmartSearch").submit();
});
$('.msSel span').click(function () {
if ($(this).parent().is('.active')) {
if ($(this).is('.on')) {
@ -364,17 +731,18 @@
msg('교육목적을 선택해주세요.');
} else if ($(this).parent().attr('id') == 'msSel5') {
msg('등급을 선택해주세요.');
} @*else if ($(this).parent().attr('id') == 'msSel6' ) {
msg('전문분야를 선택해주세요.');
}*@
}
}
});
if (@Model.isalreadyreq == 1) {
msg("이미 신청된 강좌입니다. 메인화면으로 이동되었습니다.");
}
});
function schIpt(num, code, name) {
});
function schIpt(num, code, name) {
switch (num) {
case '1':
@ -453,7 +821,7 @@
$("#liedu08").css("display", "none") // 계속교육 막기
$("#liedu09").css("display", "none") // 필수교육 막기
@if(DateTime.Now > DateTime.Parse("2030-01-02 00:00")) // ### ty 2024년 추가건
@*@if(DateTime.Now > DateTime.Parse("2030-01-02 00:00")) // ### ty 2024년 추가건
{
@:if (num => 2) {
@: if ($("#sch1").val() == "1" && $("#sch2").val() == "28") {
@ -477,8 +845,7 @@
@: $("#liedu09").css("display", "none") // 일반계속교육 막기
@: }
@:}
}
}*@
if (num == 2) {
@ -571,7 +938,6 @@
}
if ($("#msSel6").attr("class").indexOf("disable") > -1) {
//해당 div도 같이 숨김 --> javascript:schIpt('5', '57', '품질관리');">품질관리
$("#msSel6 > div").css("display", "none");
}
else {
@ -610,8 +976,6 @@
if (num == 5) {
$("#msSel6 li").css("display", "none")
//msSel5Code = code;
$("[id='lijob" + code + "']").css("display", "")
$("#msSel6 span").text("전문분야")
$("#msSel6").removeClass("active").addClass("disable")
@ -656,11 +1020,6 @@
$("#ligrade3").hide();
$("#ligrade4").hide();
//$("#liedu03").hide();
//$("#liedu04").hide();
//$("#liedu05").hide();
//$("#liedu06").hide();
//$("#liedu07").hide();
}
else {
$("#liedu2").show();
@ -737,7 +1096,7 @@
});
}
}// else if (num == 5 &&
}
}
function initSearch() {
@ -768,19 +1127,44 @@
location.href = url;
}
}
var _hide7;
function hide7(id, pno) {
_hide7 = id;
capp("/focommon/hidepop", { pno: pno }, "cbhide7");
}
function cbhide7() {
hidepop();
$("#" + _hide7).remove();
}
function hidepop() {
if ($(".popupitem").length == 1) {
$("html").css("overflow", "auto");
}
}
/** 교육신청 전 필수 확인 찹업 */
function showEducationPopup() {
$('#edu-modal-overlay, #edu-layer-popup').addClass('active');
}
function closeEducationPopup() {
$('#edu-modal-overlay, #edu-layer-popup').removeClass('active');
}
function educationConfirmSubmit() {
if ($('#edu-consent').is(':checked')) {
$("#indexForm").attr("action", "/Course/SmartSearch").submit();
}
else {
msg("내용을 확인하고 동의란에 체크해주세요.");
}
}
function goLink() {
window.open('https://www.cte.or.kr/Board/View?BNo=6781&opno=&scc=&pagenum=1&menupageno=88&pmenupageno=24');
}
</script>
}

View File

@ -15,9 +15,7 @@
<head>
<script type="text/javascript" src="/js/naveridlogin_js_sdk_2.0.0.js"></script>
<script type="text/javascript" src="/js/kakao.js"></script>
<style type="text/css">
/** 회원탈퇴 관련 css */
<style>
.mpgpop_base {
display: none;
justify-content: center;
@ -105,8 +103,39 @@
line-height: 1.6;
font-size: 0.95rem;
}
</style>
/** 알림 팝업 버튼 스타일 (mpgpop_ 접두사 적용) */
.mpgpop_btn_base {
display: block;
text-align: center;
text-decoration: none;
border: 1px solid #999;
border-radius: 4px;
background-color: #fff;
color: #333;
cursor: pointer;
transition: background-color 0.2s ease;
}
/* 마우스를 올렸을 때의 효과 */
.mpgpop_btn_base:hover {
background-color: #f5f5f5;
}
/* '회원가입 바로가기' 버튼 전용 스타일 */
.mpgpop_btn_signup {
width: 220px;
padding: 12px 0;
font-weight: bold;
}
/* '확인' 버튼 전용 스타일 */
.mpgpop_btn_confirm {
width: 120px;
padding: 10px 0;
}
</style>
</head>
<form id="mform" method="post" enctype="multipart/form-data">
<div id="naverIdLogin" style="display:none"></div>

View File

@ -43,6 +43,10 @@
<div id="bglayer" style="display:none;"></div>
<div id="layermessage"><div></div><a href="#" class="mainokbutton" onclick="javascript:hidelayermsg();">확인</a></div>
<div id="bgprogress">...</div>
<div id="customConfirmBox" style="display: none;">
<div id="customConfirmBox-msg"></div>
<div id="customConfirmBox-buttons"></div>
</div>
<div id="confirmbox"><div id="confirmboxmsg">dddd</div><div class="confirmbtnbox"><a href="#" class="btn btn1 confirmokbutton" onclick="confirmok();" style="color:white !important">예</a><a href="#" class="btn btn0 confirmokbutton" onclick="confirmtoggle();" style="color:white !important">아니오</a></div></div>
<script>
var _ismain = 1;

View File

@ -143,6 +143,62 @@
white-space: nowrap;
color: #fff;
}
/* 팝업 전체 배경 및 위치 */
#customConfirmBox {
position: fixed;
line-height: 20px;
right: 5px;
z-index: 10001;
font-weight: bold;
border-radius: 5px;
display: none;
top: 30%;
left: 20%;
width: 60%;
text-align: center;
height: auto;
bottom: auto;
padding: 30px;
opacity: 0.9;
background-color: #fefefe;
color: #333;
border: 1px solid #ddd;
word-break: break-all;
}
/* 메시지 텍스트 영역 */
#customConfirmBox-msg {
}
/* 버튼들을 감싸는 영역 */
#customConfirmBox-buttons {
}
#customConfirmBox-buttons button {
margin: 0 auto;
display: block;
min-width: 110px;
width: auto;
padding: 0 20px;
height: 30px;
line-height: 30px;
text-align: center;
background: #002C5D;
color: #fff;
font-size: 10pt;
font-weight: 300;
border-radius: 15px;
border: none;
}
#customConfirmBox-buttons button:first-child {
margin-top: 20px;
}
#customConfirmBox-buttons button:not(:first-child) {
margin-top: 5px;
}
.btn0 {background-color: #002c5d; padding: 7px 30px;}
.btn1 {background-color: #002c5d; padding: 7px 40px;}
.btn:hover{background-color: #144d89; color: yellow;background-image: url(/img/repute_tail.png); background-position: 10px center; background-repeat: no-repeat; background-size: 20px;}

View File

@ -23,12 +23,23 @@ input[type="password"]::-ms-reveal {
}
/* 기본 상태 (보이는 눈 아이콘) */
#togglePassword {
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="%23888"%3E%3Cpath d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/%3E%3C/svg%3E');
}
/*#togglePassword {
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"%3E%3Cpath d="M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.44-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L21.73 22 20.46 23.27 3.27 6 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z"/%3E%3C/svg%3E');
}*/
#togglePassword {
/* 슬래시(stroke) 색을 눈알(fill) 색과 동일하게 #888로 변경 */
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3C!-- 눈 부분 (회색) --%3E%3Cpath fill='%23888' d='M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.44-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l-2.9-2.9c-.6.3-1.28.44-2.01.44-2.76 0-5-2.24-5-5 0-.72.15-1.4.44-2.01L7.53 9.8C6.2 10.3 5.06 11.08 4.2 12z'/%3E%3C!-- 동공 부분 (회색) --%3E%3Cpath fill='%23888' d='M12 9c1.66 0 3 1.34 3 3 0 .22-.03.44-.08.65l1.55 1.55c.67-.33 1.41-.53 2.2-.53-2.76 0-5 2.24-5 5 0-.79.2-1.53.53-2.2l-1.55-1.55c.05-.21.08-.43.08-.65 0-1.66-1.34-3-3-3z'/%3E%3C!-- 슬래시 부분 (회색) --%3E%3Cpath stroke='%23888' stroke-width='1.5' d='M4.27 3.27L20.73 19.73'/%3E%3C/svg%3E");
/* 기타 스타일 */
width: 24px;
height: 24px;
cursor: pointer;
border: none;
background-color: transparent;
background-repeat: no-repeat;
}
#togglePassword.is-toggled {
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="%23888"%3E%3Cpath d="M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.44-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L21.73 22 20.46 23.27 3.27 6 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z"/%3E%3C/svg%3E');
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="%23888"%3E%3Cpath d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/%3E%3C/svg%3E');
}
.lgnForm li {
@ -119,3 +130,27 @@ input[type="password"]::-ms-reveal {
.lgnChk input[type="checkbox"]:checked + label::after {
opacity: 1; /* 보이게 처리 */
}
/* 알림 상자 기본 스타일 */
.notice-box-red {
display: flex;
align-items: center;
background-color: #f8d7da;
border-left: 5px solid #dc3545;
padding: 15px 20px;
margin-bottom: 30px;
}
/* 알림 상자 안의 아이콘 스타일 */
.notice-box-red .icon {
fill: #dc3545;
min-width: 24px;
margin-right: 15px;
}
/* 알림 상자 안의 p 태그 스타일 */
.notice-box-red p {
margin: 0;
color: #721c24;
line-height: 1.5;
}

View File

@ -6781,7 +6781,7 @@ html.lock, body.lock {
font-size: 14pt;
border: none; /* 테두리 제거 */
border-radius: 8px; /* 둥근 모서리 처리 */
border-radius: 12px; /* 둥근 모서리 처리 */
text-decoration: none; /* a 태그의 밑줄 제거 */
cursor: pointer; /* 마우스 오버 시 손가락 모양 커서 */
font-weight: bold; /* 폰트 약간 두껍게 */
@ -10981,10 +10981,20 @@ span.org {
clear: both;
}
.jnSel > div { /*float: left;*/
width: 33.3333%;
.jnSel > div {
/* float: left; */
width: calc(33.3333% - 3px);
padding: 0 30px;
display: inline-block;
box-sizing: border-box;
}
.jnSel > div:nth-of-type(1) {
padding-left: 0;
}
.jnSel > div:last-child {
padding-right: 0;
}
.jnsCont {

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -1394,6 +1394,9 @@ function isRepeatedString(str) {
}
var _confirmokcb;
var _confirmokcbcancel;
/**
* 확인(Confirm) 상자를 토글(표시/숨김)하고, 사용자의 응답에 따라 특정 콜백 함수를 실행합니다.
* 함수는 일반적으로 사용자에게 확인 메시지를 보여주고 "예" 또는 "아니오" 같은 선택을 요구할 사용됩니다.
@ -1453,8 +1456,6 @@ function confirmtoggle(b, m, cb, cbcancel, top) {
}
}
var _confirmokcb;
var _confirmokcbcancel;
function confirmok() {
$("#confirmbox").hide();
if (_confirmokcb != "" &&
@ -1466,6 +1467,70 @@ function confirmok() {
}
eval(_confirmokcb);
}
/**
* 사용자 정의 버튼을 포함하는 확인(Confirm) 상자를 표시.
* 함수는 다양한 버튼 텍스트와 각각의 콜백 함수를 동적으로 생성하여 사용자에게 선택지를 제공.
*
* @param {string} message - 확인 상자에 표시될 메시지 내용.
* @param {Array<Object>} buttons - 버튼 구성을 위한 객체 배열. 객체는 'text' 'callback' 속성을 포함해야 .
* @param {string} buttons[].text - 버튼에 표시될 텍스트.
* @param {function} buttons[].callback - 버튼 클릭 실행될 콜백 함수.
* @param {Object} [options] - 추가 옵션 객체 (선택 사항).
* @param {string} [options.top] - 확인 상자의 수직('top') 위치를 지정하는 CSS (: "100px", "20%").
*/
/**
* 사용자 정의 버튼을 포함하는 확인(Confirm) 상자를 표시.
* (id가 "customConfirmBox" DOM 요소를 사용하도록 수정됨)
*
* @param {string} message - 확인 상자에 표시될 메시지 내용.
* @param {Array<Object>} buttons - 버튼 구성을 위한 객체 배열.
* @param {Object} [options] - 추가 옵션 객체 (선택 사항).
*/
function confirmCustom(message, buttons, options) {
// 옵션 기본값 설정
options = options || {};
buttons = buttons || [];
const confirmBox = $("#customConfirmBox");
const messageBox = $("#customConfirmBox-msg");
const buttonContainer = $("#customConfirmBox-buttons");
// 1. 메시지 설정
messageBox.html(message);
// 2. 기존 버튼 모두 제거
buttonContainer.empty();
// 3. 버튼 배열을 순회하며 동적으로 버튼 생성
buttons.forEach(function (btnInfo) {
const button = $("<button type='button'></button>");
button.text(btnInfo.text);
button.on("click", function () {
confirmBox.hide();
bglayer(false);
if (typeof btnInfo.callback === 'function') {
btnInfo.callback();
}
});
buttonContainer.append(button);
});
// 4. 위치 옵션 처리
if (options.top) {
confirmBox.css("top", options.top);
} else {
confirmBox.css("top", '');
}
// 5. 확인 상자 표시
bglayer();
confirmBox.show();
}
window.ismobile = function () {
var check = false;
(function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true; })(navigator.userAgent || navigator.vendor || window.opera);
@ -1536,3 +1601,120 @@ function strEnConvert(str) {
return rslt;
}
/**
* CapsLock 활성화 상태를 감지하여 사용자에게 알려주는 기능을 초기화하는 함수.
* 특정 입력 필드 또는 페이지 전역의 CapsLock 상태를 감지해 지정된 영역에 경고 메시지를 표시함.
*
* @param {string} inputSelectors - CapsLock 상태를 감지할 입력 필드의 CSS 선택자.
* 여러 개일 경우 콤마(,) 구분 (: '#pw, #pw2').
* 문자열('') 전달하면 페이지 전역의 CapsLock 상태를 감지함.
* @param {string} displaySelector - CapsLock 경고 메시지를 표시할 HTML 요소의 CSS 선택자 (: '#caps-lock-area').
* @returns {void}
*/
function initCapsLockWarning(inputSelectors, displaySelector) {
const displayElement = document.querySelector(displaySelector);
if (!displayElement) {
console.error('표시할 영역을 찾을 수 없습니다:', displaySelector);
return;
}
/**
* 키보드 이벤트로부터 CapsLock 상태를 확인하고, 상태에 따라 경고 메시지를 표시하거나 숨기는 내부 함수.
* @param {KeyboardEvent} event - 발생한 키보드 이벤트 객체.
* @returns {void}
*/
const checkCapsLock = (event) => {
const capsLockOn = event.getModifierState && event.getModifierState('CapsLock');
if (capsLockOn) {
displayElement.innerHTML = '<strong style="color: red;">Caps Lock 이 켜져 있습니다.</strong>' + '';
displayElement.style.display = 'block';
} else {
displayElement.innerHTML = '';
displayElement.style.display = 'none';
}
};
if (inputSelectors && inputSelectors.trim() !== '') {
const elements = document.querySelectorAll(inputSelectors);
if (elements.length === 0) {
console.error('입력 필드를 찾을 수 없습니다:', inputSelectors);
return;
}
elements.forEach(element => {
element.addEventListener('keyup', checkCapsLock);
element.addEventListener('keydown', checkCapsLock);
element.addEventListener('blur', () => {
displayElement.style.display = 'none';
});
});
} else {
window.addEventListener('keyup', checkCapsLock);
window.addEventListener('keydown', checkCapsLock);
}
}
/**
* @description 비밀번호 보이기/숨기기 기능을 초기화하는 함수.
* @param {string} targetInputSelectors - 기능을 적용할 input 요소들의 CSS 선택자 (콤마로 구분 가능)
*/
function initializePasswordToggle(targetInputSelectors) {
const passwordInputs = document.querySelectorAll(targetInputSelectors);
if (passwordInputs.length === 0) {
console.error("비밀번호 입력창을 찾을 수 없습니다:", targetInputSelectors);
return;
}
passwordInputs.forEach(passwordInput => {
const originalWidth = passwordInput.getBoundingClientRect().width;
const wrapper = document.createElement('div');
passwordInput.parentNode.insertBefore(wrapper, passwordInput);
wrapper.appendChild(passwordInput);
Object.assign(wrapper.style, {
position: 'relative',
width: `${originalWidth}px`,
});
const eyeOpenSvg = `<svg class="eye-open" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></svg>`;
const eyeClosedSvg = `<svg class="eye-closed" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.44-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l-2.9-2.9c-.6.3-1.28.44-2.01.44-2.76 0-5-2.24-5-5 0-.72.15-1.4.44-2.01L7.53 9.8C6.2 10.3 5.06 11.08 4.2 12z"/>
<path d="M12 9c1.66 0 3 1.34 3 3 0 .22-.03.44-.08.65l1.55 1.55c.67-.33 1.41-.53 2.2-.53-2.76 0-5 2.24-5 5 0-.79.2-1.53.53-2.2l-1.55-1.55c.05-.21.08-.43.08-.65 0-1.66-1.34-3-3-3z"/>
<path fill="none" stroke="currentColor" stroke-width="1.5" d="M4.27 3.27L20.73 19.73"/>
</svg>`;
const toggleButton = document.createElement('button');
toggleButton.type = 'button';
toggleButton.innerHTML = eyeOpenSvg + eyeClosedSvg;
wrapper.appendChild(toggleButton);
Object.assign(passwordInput.style, {
paddingRight: '45px',
width: '100%',
boxSizing: 'border-box'
});
Object.assign(toggleButton.style, {
position: 'absolute', top: '50%', right: '15px', transform: 'translateY(-50%)',
background: 'none', border: 'none', cursor: 'pointer',
padding: '0', width: '24px', height: '24px'
});
const eyeClosedIcon = toggleButton.querySelector('.eye-open');
const eyeOpenIcon = toggleButton.querySelector('.eye-closed');
Object.assign(eyeOpenIcon.style, { width: '100%', height: '100%', fill: '#888' });
Object.assign(eyeClosedIcon.style, { width: '100%', height: '100%', fill: '#888', display: 'none' });
toggleButton.addEventListener('click', function () {
const isPassword = passwordInput.type === 'password';
passwordInput.type = isPassword ? 'text' : 'password';
eyeOpenIcon.style.display = isPassword ? 'none' : 'block';
eyeClosedIcon.style.display = isPassword ? 'block' : 'none';
});
});
}

50
Model/Lect2.cs Normal file
View File

@ -0,0 +1,50 @@
using System;
/* CM.cs 에 기존 lect들이 모여있다. */
namespace NP.Model
{
/// <summary>
/// 회원 수강신청 정보
/// </summary>
[Serializable]
public class LectEnroll
{
/* 영남 테이블명세서.xlsx 파일 내 설명*/
/// <summary>회원번호</summary>
public int USERNO { get; set; }
/// <summary>수강키 (lect.lectno) [2]</summary>
public long lectno { get; set; }
/// <summary>수료여부</summary>
public byte ISCOMPLETE { get; set; }
/// <summary>AS-IS 수료번호 (lect.completeno)</summary>
public string completeno { get; set; }
/// <summary>강좌/과정키 (cm.cmno)</summary>
public int cmno { get; set; }
/// <summary>과정명 (cm.cname)</summary>
public string CNAME { get; set; }
/// <summary>상위분류키 (cg.pcgno)</summary>
public short PCGNO { get; set; }
/// <summary>결제키 (pay.payno)</summary>
public long PAYNO { get; set; }
/// <summary>결제상태 (pay.pstatus)</summary>
public byte PSTATUS { get; set; }
/// <summary>강의유형</summary>
public byte CSHAPE { get; set; }
/// <summary>기술인분류 (cm.typeman)</summary>
public short TYPEMAN { get; set; }
/// <summary>교육목적 (cm.typeedu)</summary>
public short TYPEEDU { get; set; }
/// <summary>등급 (cm.typegrade)</summary>
public short TYPEGRADE { get; set; }
/// <summary>직무분야 (cm.typejob)</summary>
public short TYPEJOB { get; set; }
/// <summary>분류코드 (cg.cgcode)</summary>
public string CGCODE { get; set; }
/// <summary>분류명 (cg.cgname)</summary>
public string CGNAME { get; set; }
/// <summary>일정키 (cminningscd.cmisno)</summary>
public long CMISNO { get; set; }
}
}

View File

@ -47,6 +47,7 @@
<Compile Include="Board.cs" />
<Compile Include="CRoom.cs" />
<Compile Include="Documents.cs" />
<Compile Include="Lect2.cs" />
<Compile Include="Pay.cs" />
<Compile Include="Common.cs" />
<Compile Include="ENUM.cs" />