Compare commits

..

No commits in common. "b296fe29c1024f7c62cf86b55c669a83c0159831" and "a8ba46b5eafeec8620f54214011b967b6c30770b" have entirely different histories.

34 changed files with 1176 additions and 2603 deletions

View File

@ -97,9 +97,7 @@ 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 (!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()))) {
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.intval7 > 0 ? "emphasis":"")"><a href="javascript:taskSummaryPendingLink(6);">@Model.Data.intval7.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.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.SmsAuth, ip, Request.ServerVariables["HTTP_HOST"]);
isSkip = Helpers.IsSkipIPorHost(IpHostSkipGb.PassWord, ip, Request.ServerVariables["HTTP_HOST"]);
if (isSkip)
{
@ -197,10 +197,17 @@ 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 NP.Base.Auth;
using NP.Base.ENUM;
using NP.Model;
using System;
using System.Collections;
using System;
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,6 +140,7 @@ namespace NP.Base.Controllers
return JsonOK(Dao.Save("lect.edub2b", e));
}
//[HttpPost]
//public JsonResult SaveUserFile(String type, Int64? fgno)
//{

View File

@ -1,14 +1,17 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NP.Model;
using System;
using System.Collections;
using System;
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
@ -43,24 +46,55 @@ 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-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();
}
else
{
string fileurl = Server.MapPath((issubject == 1 ? file.fullurl2 : file.fullurl));
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.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());
@ -326,12 +360,12 @@ namespace NP.Base.Controllers
if (IsEmail && users.Count == 1)
{
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시간 뒤 만료됩니다.";
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 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);
//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"));
}
else
{
@ -622,23 +656,16 @@ namespace NP.Base.Controllers
[HttpPost]
/// ### ty 교육신청제한
public JsonResult GetCheckLectIs(string man, string cgcode, string edu, string grade, int cmno, int pcmno, string job1 = "")
public JsonResult GetCheckLectIs(string man, string cgcode, string edu, string grade, int cmno, int pcmno)
{
//int result = 0; // 0 이면 수강 가능, 그외 수강 불가
//result = CheckUserLect(man, cgcode, edu, grade, cmno, pcmno, SUserInfo.UserNo);
int result = 0; // 0 이면 수강 가능, 그외 수강 불가
#region + // 2025-09 (스마트검색 개발 건 미사용으로 주석처리, 필요시 복원)
var result = new KeyValuePair<int, string>();
result = CheckUserLectInfo(cmno, pcmno, SUserInfo.UserNo, man, cgcode, edu, grade, job1);
return JsonBack(result.Key);
#endregion
//return JsonBack(result);
result = CheckUserLect(man, cgcode, edu, grade, cmno, pcmno, SUserInfo.UserNo);
return JsonBack(result);
}
#region +
// pms: 5640 적용
//public int CheckUserLect(string man, string cgcode, string edu, string grade, int cmno, int pcmno, long userno)
//{
@ -733,310 +760,8 @@ 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)
{
@ -1046,9 +771,7 @@ namespace NP.Base.Controllers
string[] cgcodes = new string[0];
string[] edus = new string[0];
// 실제로직은 ELSE절이다.
if (DateTime.Now > DateTime.Parse("2099-01-02 00:00"))// ### ty 2024년 추가건이나 현재 적용대기로 전달 받음
if (DateTime.Now > DateTime.Parse("2030-01-02 00:00"))// ### ty 2024년 추가건이나 현재 적용대기로 전달 받음
{
// ### ty 2024년 적용!!!
@ -1579,77 +1302,5 @@ 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,7 +12,6 @@
<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"/>
@ -2853,44 +2852,5 @@
, 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

@ -339,33 +339,7 @@
from userpasslog
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)
@ -741,19 +715,15 @@
<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
,a.userid
,a.status
,a.ci
SELECT a.userno,a.username
,a.userid
,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를 추가, CI도 추가 -->
<!-- hs => 이메일과 핸드폰번호 찾기의 상황을 알 수 없어 STATUS를 타입별로 분리하고, EMAIL에만 9를 추가 -->
<isNotNull property="email">
AND a.email=HEX(AES_ENCRYPT(#email#, <include refid="sql.digest"></include>))
AND (a.STATUS = 1 OR a.STATUS = 9)
@ -762,15 +732,7 @@
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>
<select id="users.findmes" parameterClass="hashtable" resultClass="users">
select a.userno,a.username
@ -812,15 +774,7 @@
</select>
<update id="users.resetuser" parameterClass="hashtable">
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 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>
<update id="users.usercheck" parameterClass="hashtable">
update usercheck a

View File

@ -1,17 +1,19 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NP.Model;
using NP.Model.ENUM;
using OkCert3Com;
using System;
using System.Collections;
using System;
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
{
@ -149,6 +151,15 @@ 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);
@ -493,46 +504,6 @@ 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)
@ -546,7 +517,8 @@ namespace NP.FO.Controllers
String REQ_SITE_NM = "YNICTE";
String REQ_URL = "";
String RETURN_MSG = "";
String SITE_URL = "https://" + Request.Url.Host;
String SITE_URL = "https://" + Request.Url.Host;
//String SITE_URL = GetConfig("fronturl");
//인증요청사유코드
//00 : 회원가입
//01 : 성인인증
@ -573,7 +545,8 @@ 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")
{
@ -644,7 +617,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 : 성인인증
@ -671,7 +644,8 @@ 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")
{
@ -798,6 +772,14 @@ 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))
{
@ -1317,7 +1299,8 @@ namespace NP.FO.Controllers
case "LectNo":
result = "er.잘못된 강좌코드 입니다.";
break;
default:
default:
// NoCert
result = "er.인증에 실패하였습니다.";
break;
}
@ -1387,7 +1370,15 @@ 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")
@ -1524,7 +1515,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;
}
@ -1609,7 +1600,15 @@ 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();
@ -1765,7 +1764,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 } });
}
@ -1819,6 +1818,7 @@ namespace NP.FO.Controllers
paramStr += "," + reasonNo;
paramStr += "," + rsltCd;
//paramEncStr = "stringval:" + EncString(paramStr);
ViewBag.result = EncString(paramStr);
}
else
@ -1837,6 +1837,7 @@ namespace NP.FO.Controllers
paramStr += "," + reasonNo;
paramStr += "," + rsltCd;
//paramEncStr = "stringval:" + EncString(paramStr);
ViewBag.result = EncString(paramStr);
}
else
@ -1846,6 +1847,7 @@ namespace NP.FO.Controllers
}
break;
}
//ViewBag.reason = reason;
if (errChk)
{
@ -1898,11 +1900,17 @@ namespace NP.FO.Controllers
if (Request.Cookies.Get("RTNURL") != null)
{
var cookie = Request.Cookies.Get("RTNURL");
ViewBag.RTNURL = cookie.Value;
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");
ViewBag.RTNURL = Request.Cookies.Get("ru");
//원래 마케팅용이어서 expire는 제외
//cookie.Expires = DateTime.Now.AddDays(-1);
//Response.Cookies.Add(cookie);
}
if (ViewBag.UserNo > 0)

View File

@ -701,7 +701,6 @@ namespace NP.FO.Controllers
/// <returns></returns>
public ActionResult SmartSearch(VMCourse vm)
{
#region +
/*
stringval : 0: ( )
stringval2 : SKILL (1: , 2:) - cshape
@ -713,8 +712,7 @@ namespace NP.FO.Controllers
FROM comcode
WHERE isuse = 1
AND cgroup IN ('typejob40','typejob41','typejob42','typejob43','typejob44','typejob45','typejob46','typejob47','typejob48','typejob49'))
*/
#endregion
*/
var p = new Hashtable();
@ -755,23 +753,11 @@ 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
vm.ComCodes6 = GetComCodes("typejobitem");
bool getComCheck = true;
@ -876,26 +862,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
@ -1048,30 +1034,6 @@ 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)
@ -1085,7 +1047,7 @@ namespace NP.FO.Controllers
{
// A: 동일 등급, 동일 직무분야 내에서 1개만 신청 가능
// ((설계시공 또는 건설사업관리) / (역량강화 또는 전문분야))
bool isApplyingForGroupA = (man == "25" || man == "28") && (cgcode == "103" || cgcode == "104");
bool isApplyingForGroupA = (man == "25" || man == "28") && (cgcode == "103" || cgcode == "104" || cgcode == "105");
if (isApplyingForGroupA)
{
bool hasExistingInGroupA = lectEnrolls.Any(l =>
@ -1094,7 +1056,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 == "103" || l.CGCODE == "104" || l.CGCODE == "105")
)
);
@ -1104,62 +1066,24 @@ 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");
if (isApplyingForGroupB)
{
bool hasExistingInGroupB = lectEnrolls.Any(l =>
l.TYPEEDU == 35
&& l.TYPEGRADE.ToString() == grade
&& l.TYPEJOB.ToString() == job1
l.TYPEEDU == 35
&& l.TYPEGRADE.ToString() == grade
&& l.TYPEJOB.ToString() == job1
&& (
(l.TYPEMAN.ToString() == "25" && l.CGCODE == "107")
(l.TYPEMAN.ToString() == "25" && l.CGCODE == "107")
|| (l.TYPEMAN.ToString() == "28" && l.CGCODE == "105")
)
);
if (hasExistingInGroupB)
{
return new KeyValuePair<int, string>(-20, "승급교육 제약B");
{
return new KeyValuePair<int, string>(-20, "승급교육 제약B");
}
}
@ -1169,11 +1093,11 @@ namespace NP.FO.Controllers
if (isApplyingForGroupC)
{
bool hasExistingInGroupC = lectEnrolls.Any(l =>
l.TYPEEDU == 35
&& l.TYPEGRADE.ToString() == grade
&& l.TYPEJOB.ToString() == job1
l.TYPEEDU == 35
&& l.TYPEGRADE.ToString() == grade
&& l.TYPEJOB.ToString() == job1
&& (
(l.TYPEMAN.ToString() == "25" && l.CGCODE == "107")
(l.TYPEMAN.ToString() == "25" && l.CGCODE == "107")
|| (l.TYPEMAN.ToString() == "28" && (l.CGCODE == "103" || l.CGCODE == "104"))
)
);
@ -1183,7 +1107,7 @@ namespace NP.FO.Controllers
return new KeyValuePair<int, string>(-20, "승급교육 제약C");
}
}
// D: 동일 등급, 동일 직무분야 내에서 1개만 신청 가능
// ((건설사업관리/건설기술인 전문교육))
bool isApplyingForGroupD = man == "28" && cgcode == "102";
@ -1204,6 +1128,7 @@ namespace NP.FO.Controllers
}
}
#endregion
}
@ -1221,8 +1146,7 @@ namespace NP.FO.Controllers
}
return result;
}
}
#endregion

View File

@ -1,10 +1,16 @@
using NP.Model;
using System;
using System.Collections;
using System;
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
{
@ -28,17 +34,24 @@ 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.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"))
{
@ -50,9 +63,15 @@ namespace NP.FO.Controllers
{
Response.Cookies["yicte"].Value = Request.Cookies["yicte"].Value + ";SameSite=None; Secure";
}
var cm = new Model.MenuPage() { };
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")
@ -85,9 +104,15 @@ 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)
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")
)
{
filterContext.Result = new RedirectResult("/Account/Index?fobase=xx&ru=" + Request.Url.AbsolutePath, true);
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") &&
@ -98,11 +123,23 @@ namespace NP.FO.Controllers
{
filterContext.Result = new RedirectResult("/Account/Error");
}
else if (GetMENUPAGES.Where(w => (w.pageurl ?? "").ToUpper().Equals(Request.Url.AbsolutePath.ToUpper())).OrderByDescending(od => od.pdepth).FirstOrDefault() != null)
//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")
)
{
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);
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") &&
@ -114,6 +151,13 @@ 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; }
@ -179,7 +223,8 @@ namespace NP.FO.Controllers
get
{
if (BANNER == null)
{
{
//var banners = GetBANNERS;
BANNER = "";
if (GetBANNERS.Where(w => w.ismain == 0).Count() > 0)
{
@ -205,10 +250,14 @@ namespace NP.FO.Controllers
get
{
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;
@ -290,7 +339,8 @@ namespace NP.FO.Controllers
sbmauth.Append(string.Format("<li class=\"topmenu{1}\"><a href=\"#\" onclick=\"gomenu({2}, {3}, '{4}', this)\">{0}</a><ul>", m.pagename, m.pno,menu.pno,menu.pagetype,menu.pageurl));
}
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)
@ -300,7 +350,8 @@ namespace NP.FO.Controllers
sbm.Append(string.Format("<li class=\"topmenu{1}\"><a href=\"#\" onclick=\"msg('로그인 후 진행 할 수 있습니다.', null, null, null, 'location.href=\\'/Account/Index?ru={4}\\'')\">{0}</a><ul>", m.pagename, m.pno, menu.pno, menu.pagetype, menu.pageurl));
}
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));
}
@ -368,6 +419,23 @@ 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)
{
@ -414,11 +482,22 @@ namespace NP.FO.Controllers
vm.pginfo = GetConfig("pginfo");
vm.pginfomobile = GetConfig("pginfomobile");
vm.signkey = ComputeHash(vm.pginfo.Split('|')[2]);
vm.viewname5 = "https://" + Request.Url.Host + "/Course/PayClose";
//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 추가
@ -754,7 +833,8 @@ 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;
@ -765,4 +845,5 @@ namespace NP.FO.Controllers
return View("ApplyComplete", vm);
}
}
}
}

View File

@ -231,7 +231,6 @@
<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" />
@ -329,7 +328,6 @@
<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" />
@ -717,6 +715,7 @@
<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" />
@ -728,6 +727,7 @@
<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,6 +744,7 @@
<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" />
@ -757,8 +758,6 @@
<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

@ -39,51 +39,31 @@
self.close();
</text>
} else if (ViewBag.reason == "AuthPlatformChange") {
<text>
if ("@(RSLT_NAME)" == $(opener.document).find("#mform").find("#username").val()) {
<text>
if ("@(RSLT_NAME)" == $(opener.document).find("#mform").find("#username").val()) {
$(opener.document).find("#mform").find("#authplatform").val("@(AuthPlatform.IPIN.GetHashCode())");
$(opener.document).find("#mform").find("#birthday").val("@(RSLT_BIRTHDAY)");
$(opener.document).find("#mform").find("#birthday").val("@(RSLT_BIRTHDAY)");
$(opener.document).find("#mform").find("#di").val("@(DI)");
$(opener.document).find("#mform").find("#ci").val("@(CI)");
$(opener.document).find("#mform").find("#vssn").val("@(VSSN)");
$(opener.document).find("#mform").find("#authPlatform_IPIN").show();
$(opener.document).find("#mform").find("#authPlatform_IPIN").css("padding-bottom","0px");
$(opener.document).find("#mform").find("#authPlatform_IPIN_Name").text("I-PIN 인증");
$(opener.document).find("#mform").find("#authPlatform_Mobile").hide();
try {
$(opener.document).find("#mform").find("#txtbirthday").text(moment("@(RSLT_BIRTHDAY)").format('YYYY.MM.DD'));
} catch (error) {
$(opener.document).find("#mform").find("#authPlatform_Mobile").hide();
try {
$(opener.document).find("#mform").find("#txtbirthday").text(moment("@(RSLT_BIRTHDAY)").format('YYYY.MM.DD'));
} catch (error) {
}
alert("인증완료");
} else {
alert("입력한 정보와 일치하지 않습니다.\n 재인증해주세요.");
}
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 다시 확인해주세요.");
} else {
alert("입력한 정보와 일치하지 않습니다.\n 재인증해주세요.");
}
self.close();
</text>
} else if (ViewBag.reason == "LectinningAuth") {
<text>
alert("인증완료");
location.href = "http://" + location.hostname + "/Open/PlayOpen?lectno=@(ViewBag.lectno)&cmino=@(ViewBag.cmino)";
location.href = "http://" + location.hostname + "/Open/PlayOpen?lectno=@(ViewBag.lectno)&cmino=@(ViewBag.cmino)";
</text>
}
} else {

View File

@ -21,8 +21,7 @@
<div>
</div>
<script type="text/javascript">
<script type="text/javascript">
$(document).ready(function () {
if ('@(ViewBag.ret)' == '0') {
if ('@(RSLT_CD)' == 'B000') {
@ -41,8 +40,8 @@
self.close();
</text>
} else if (ViewBag.reason == "MobileNumberChange") {
<text>
if ("@(RSLT_NAME)" == $(opener.document).find("#mform").find("#username").val()) {
<text>
if ("@(RSLT_NAME)" == $(opener.document).find("#mform").find("#username").val()) {
$(opener.document).find("#mform").find("#mobile").val("@(TEL_NO)".replaceAll("-", ""));
$(opener.document).find("#mform").find("#mobilestr").text("@(TEL_NO)".replaceAll("-", ""));
alert("인증완료");
@ -53,45 +52,25 @@
}
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()) {
<text>
if ("@(RSLT_NAME)" == $(opener.document).find("#mform").find("#username").val()) {
$(opener.document).find("#mform").find("#authplatform").val("@(AuthPlatform.Mobile.GetHashCode())");
$(opener.document).find("#mform").find("#authPlatform_IPIN").hide();
$(opener.document).find("#mform").find("#authPlatform_Mobile").show();
$(opener.document).find("#mform").find("#authPlatform_Mobile_Name").text("휴대폰 인증");
$(opener.document).find("#mform").find("#birthday").val("@(RSLT_BIRTHDAY)");
$(opener.document).find("#mform").find("#birthday").val("@(RSLT_BIRTHDAY)");
$(opener.document).find("#mform").find("#di").val("@(DI)");
$(opener.document).find("#mform").find("#ci").val("@(CI)");
$(opener.document).find("#mform").find("#mobile").val("@(TEL_NO)".replaceAll("-", ""));
$(opener.document).find("#mform").find("#mobile").prop("readonly", true);
$(opener.document).find("#mform").find("#mobilestr").text("@(TEL_NO)".replaceAll("-", ""));
try {
try {
$(opener.document).find("#mform").find("#txtbirthday").text(moment("@(RSLT_BIRTHDAY)").format('YYYY.MM.DD'));
} catch (error) {
} catch (error) {
}
alert("인증완료");
} else {
} else {
alert("입력한 정보와 일치하지 않습니다.\n 재인증해주세요.");
}
self.close();

View File

@ -1,65 +0,0 @@
@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,19 +7,12 @@
{
<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><b>@Model.User.username (@Model.User.userid)</b>님, 인증이 완료되었습니다.</span>
<span>새롭게 사용할 비밀번호를 입력해주세요.</span>
</p>
<ul class="lgnInput">
<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>
<li><input type="password" name="User.userpass" id="up1" placeholder="비밀번호(8자 이상, 영문/숫자/특수기호 포함)" /></li>
<li><input type="password" id="up2" placeholder="비밀번호 확인(동일한 비밀번호 입력)" /></li>
</ul>
<ul class="idpwBtn">
<li><a href="javascript:void(0);" onclick="save()">비밀번호 재설정</a></li>
@ -60,20 +53,7 @@
<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/FindIDPW">아이디/비밀번호찾기</a></li>
<li><a href="/Account/FindMe">아이디/비밀번호찾기</a></li>
<li><a href="/Account/JoinTSel">회원가입</a></li>
</ul>

View File

@ -5,7 +5,6 @@
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>*@
@ -18,10 +17,10 @@
<div class="lgnWrap">
<ul class="lgnForm">
<li>
<input type="text" name="uid" id="uid" placeholder="아이디" value="@ViewBag.SavedId" autocomplete="username" />
<input type="text" name="uid" id="uid" placeholder="아이디" value="@ViewBag.SavedId" />
</li>
<li>
<input type="password" name="upw" id="upw" placeholder="비밀번호" autocomplete="current-password" />
<input type="password" name="upw" id="upw" placeholder="비밀번호" />
<button type="button" id="togglePassword" class="toggle-password-btn"></button>
</li>
</ul>
@ -29,22 +28,14 @@
<input type="checkbox" name="issaveid" id="issaveid" @(ViewBag.SavedId == "" ? "" : "checked")>
<label for="issaveid">아이디저장</label>
</div>
@*<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/>
<p style="margin-bottom: 30px; border: 1px solid red; padding: 5px;">※ 2021년 7월 1일 이전에 회원가입을 하신 분 들은 본인인증을 위하여 회원가입을 다시 진행 해주시길 부탁드립니다.</p>
<a href="javascript:void(0);" class="lgnBtn" onclick="login();">로그인</a>
<ul class="lgnFind">
<li><a href="/Account/FindIDPW">아이디/비밀번호찾기</a></li>
<li><a href="/Account/FindMe">아이디/비밀번호찾기</a></li>
<li><a href="/Account/JoinIdVeri">회원가입</a></li>
</ul>
<br />
@*<div id="naverIdLogin" style="display:none"></div>*@
@ -53,15 +44,12 @@
<script>
$(document).ready(function () {
// Caps Lock
initCapsLockWarning('#upw', '#capslock-warning');
$(document).ready(function () {
if (opener != null && opener._ismain == 1) {
opener.location.href = "/Account/Index";
self.close();
}
}
else {
if (!ismobile()) {
if (val("uid").length > 0) { focus("upw"); } else { focus("uid"); }
@ -91,24 +79,21 @@
});
}
/** INPUT 패스워드 눈알처리 */
$('.lgnForm').on('click', '#togglePassword', function () {
const passwordInput = $('#upw');
if (passwordInput.length > 0) {
if (passwordInput[0].type === 'password') {
passwordInput[0].type = 'text';
} else {
passwordInput[0].type = 'password';
}
}
$(this).toggleClass('is-toggled');
$('.lgnForm').on('click', '#togglePassword', function () {
const passwordInput = $('#upw');
if (passwordInput.length > 0) {
if (passwordInput[0].type === 'password') {
passwordInput[0].type = 'text';
} else {
passwordInput[0].type = 'password';
}
}
$(this).toggleClass('is-toggled');
});
// 우선 숨겨둔다
/* snsInit(); */
});
@ -173,16 +158,16 @@
++logincnt;
if (logincnt > 4) {
//msg("비밀번호 5회 이상 오류로 로그인이 제한되었습니다.\n교육원으로 문의해주세요.");
msg("로그인 5회 실패로 인하여 로그인이 제한 되었습니다.<br/>제한을 해제 하시려면 아이디 / 비밀번호 찾기에서<br/>본인인증 후 비밀번호를 재설정 해주세요.");
msg("해당 계정은 로그인이 제한된 계정 입니다.<br/>교육원으로 문의 주세요.<br/>T : 1544-7660<br/>");
logincnt = 0;
}
else {
msg("입력하신 아이디 또는 비밀번호와 일치하는 계정이 없습니다.<br/>다시 확인해주세요.<br/><br/><b style='color:blue;'>※ 5회이상 비밀번호 오류 시 로그인이 제한되므로 정확하게 입력해주세요.</b>");
msg("입력하신 아이디/비밀번호와 일치하는 계정이 없습니다. 다시 확인해주세요.<br/>5회이상 비밀번호 오류 시 로그인이 제한됩니다.");
}
}
else if (capResult.msg == "-5") { // 비활성상태
//msg("비밀번호 5회 이상 오류로 로그인이 제한되었습니다.\n교육원으로 문의해주세요.");
msg("로그인 5회 실패로 인하여 로그인이 제한 되었습니다.<br/>제한을 해제 하시려면 아이디 / 비밀번호 찾기에서<br/>본인인증 후 비밀번호를 재설정 해주세요.");
msg("해당 계정은 로그인이 제한된 계정 입니다.<br/>교육원으로 문의 주세요.<br/>T : 1544-7660<br/>");
}
else if (capResult.msg == "-6") { // 탈퇴신청중
msg("회원탈퇴가 접수되었습니다.<br/>탈퇴 완료까지 평일 기준 1일 정도 소요될 예정입니다.");
@ -195,9 +180,7 @@
}
submit();
}
} else {
msg("입력하신 아이디 또는 비밀번호와 일치하는 계정이 없습니다.<br/>다시 확인해주세요.<br/><br/><b style='color:blue;'>※ 5회이상 비밀번호 오류 시 로그인이 제한되므로 정확하게 입력해주세요.</b>");
}
} else { msg("입력하신 아이디/비밀번호와 일치하는 계정이 없습니다. 다시 확인해주세요.<br/>5회이상 비밀번호 오류 시 로그인이 제한됩니다."); }
}
</script>

View File

@ -21,16 +21,23 @@
<div class="jnsCont">
<img src="../img/common/join_select01.png" alt="i-PIN 인증">
<p>i-PIN 인증</p>
<a href="#" onclick="certok3reqview('IPIN', 'Join');">인증하기</a>
<a href="#" onclick="certok3request('IPIN', 'Join');">인증하기</a>
</div>
</div>
<div>
<div class="jnsCont">
<img src="../img/common/join_select02.png" alt="휴대폰 본인인증">
<p>휴대폰 본인인증</p>
<a href="#" onclick="certok3reqview('MOBI', 'Join');">인증하기</a>
<a href="#" onclick="certok3request('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>
@ -46,7 +53,20 @@
$("#frm").submit();
}
else {
msg(val.replace("er.", ""))
msg(val.replace("er.",""))
}
}
</script>
</script>
@*@{
string errMsg = "";
if (ViewBag.rsltCd != "")
{
errMsg = ((string)ViewBag.rsltCd).Replace("er.", "");
<script>
$(function () {
msg("@errMsg")
})
</script>
}
}*@

View File

@ -1,194 +0,0 @@
@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,16 +1,6 @@
@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="@firstSchBoxDisplayStyle">
<div class="schBox" style="display:none;">
<form id="smartSearchForm" method="post">
<input type="hidden" name="cmno" id="cmno" />
<input type="hidden" id="cmino" name="CM.cmino" />
@ -18,17 +8,14 @@
<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="javascript:void(0);">건설기술진흥법교육</a></li>
<li id="liTab2" style="font-size:16pt;display:none;"><a href="javascript:void(0);">기타교육</a></li>
<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>
</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>
@ -51,18 +38,19 @@
<li>
@Html.DropDownListFor(x => x.stringval7, new SelectList(Model.ComCodes6, "ccode", "cname"), "-선택-")
</li>
<li><a href="javascript:void(0);" id="btnSearch">검색</a></li>
<li><a href="#" id="btnSearch">검색</a></li>
</ul>
}
else if (Model.stringval == "1")
{
<ul class="schTab">
<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>
<li id="liTab1"><a href="#" style="font-size:16pt;">건설기술진흥법교육</a></li>
<li id="liTab2" class="current" style="font-size:16pt;"><a href="#">기타교육</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>
@ -70,15 +58,30 @@
<li>
@Html.DropDownListFor(x => x.stringval3, new SelectList(Model.CMsEtc, "cgno", "cgname"), "-선택-")
</li>
<li><a href="javascript:void(0);" id="btnSearch">검색</a></li>
<li><a href="#" 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")
{
@ -95,11 +98,10 @@
<li>
<div class="smtlCont">
<h5>
@if (!string.IsNullOrEmpty(item.cgcode))
{ // cg코드를 <span style='color:green; font-weight:bold;'>[전문분야교육]</span> 형태로 변경해주는 Helper 메서드 사용
@Html.Raw(this.GetCgLabel(item.cgcode))
}
<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>*@
@{
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"));
}
@ -109,13 +111,27 @@
<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="javascript:void(0);" class="smtlBtn02 smtlChkBtn" id=@("btnSelect" + item.cmno) onclick="javascript: getCmInning(@item.cshape, @item.cmno)">교육신청</a>
<a href="#" 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>
@ -154,7 +170,7 @@
<div class="clsPopWrap">
<div class="clsPopTitle">
<h5>강좌소개</h5>
<a href="javascript:void(0);" onclick="javascript: closeIntro();"></a>
<a href="#" onclick="javascript: closeIntro();"></a>
</div>
<div class="clsPopCont">
<ul class="smtList pop">
@ -165,14 +181,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>
@ -209,13 +225,9 @@
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"),
@ -225,10 +237,9 @@
$("#stringval6").val("")
).done(function () {
$("#smartSearchForm").submit();
});
});
});
$('#liTab2').click(function () {
$.when(
$("#stringval").val("1"),
@ -238,65 +249,57 @@
$("#stringval6").val("")
).done(function () {
$("#smartSearchForm").submit();
});
});
});
$('#btnSearch').click(function () {
if ($("#liTab1").hasClass("current")) {
if ($("#liTab1").hasClass("current")) {
$("#stringval").val("0");
}
}
else if ($("#liTab2").hasClass("current")) {
$("#stringval").val("1");
}
setTimeout(function () {
}
setTimeout(function () {
$("#smartSearchForm").submit();
}, 1000);
});
}, 1000);
});
$("#stringval").change(function () {
$("#smartSearchForm").submit();
});
});
$("#stringval2").change(function () {
$("#stringval3").val("");
$("#stringval4").val("");
$("#stringval5").val("");
$("#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");
}
@ -306,19 +309,17 @@
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 == null ? 0 : Convert.ToInt32(Model.stringval2)) == 1) {
if (@(Model.stringval2) == 1) {
$("#completeStd").hide();
}
else if (@(Model.stringval2 == null ? 0 : Convert.ToInt32(Model.stringval2)) == 2) {
else if (@(Model.stringval2) == 2) {
$("#completeStd").show();
}
@ -328,57 +329,22 @@
$("#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();
@ -411,12 +377,9 @@
if (btnSelect.html() == '교육신청') {
btnSelect.html('닫기');
capp(
"/focommon/GetScdForMixEdu",
{ cmno: cmno },
"renderScdInning(1," + cshape + "," + cmno + ")"
);
//capp("/focommon/GetScdForMixEdu", { cmno: model.cm.cmno, month: $("#selMonth").val() }, "renderScd");
//교육일정에 등록되어 있는 일정 중 선택이 가능한 첫번째 일정 선택으로 달 파라미터 제거
capp("/focommon/GetScdForMixEdu", { cmno: cmno}, "renderScdInning(1," + cshape + "," + cmno + ")");
}
else {
divInfo.empty();
@ -459,7 +422,7 @@
var month = ('0' + (today.getMonth() + 1)).slice(-2);
var day = ('0' + today.getDate()).slice(-2);
var dateNumber = parseFloat(year + month + day);
if (dateNumber > @(System.Web.Configuration.WebConfigurationManager.AppSettings["2024ExDate2"])) {
strTmp = "<div style='margin-bottom: 30px;font-weight: bold; font-size: 14pt;border:solid 1px red;width:810px;padding:10px 10px;line-height:27px;'><span style='color:red'>※ 집체교육 참석조건을 만족하신 후 교육종료일(집체교육 참석일)" +
"에 집체교육 7시간을 참석하시면 됩니다.</span > <br>" +
@ -490,6 +453,7 @@
data.studyplace = d.studyplace;
data.studyplacename = d.studyplacename;
// 리스트에 생성된 객체 삽입
studyPlaceTmp.push(data);
}
});
@ -501,15 +465,14 @@
}
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>";
});
@ -531,7 +494,7 @@
var ulScd = $("#ulScd" + cmno);
ulScd.empty();
//var seq = 0;
if (capResult.obj.length < 1) {
var li = $("<li />");
if (cshape == 1) {
@ -541,17 +504,18 @@
}
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 />", { "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 + '교육장]';
}
@ -560,6 +524,54 @@
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("접수마감");
@ -572,7 +584,7 @@
console.log("교육신청")
aApplyClass.append(spanApplyClass);
if (d.quota != 0) {
if (d.isselected == 1) {
if (d.isselected == 1) { // isselected = (cm.setime('%Y%m%d',학습종료) == cminningscd.estart('%Y%m%d',교육시작) ? 1 : 0)
// 사용안하는것 추측됨
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);
@ -584,7 +596,7 @@
}
else {
// 사용안하는것 추측됨
if (d.isselected == 1) {
if (d.isselected == 1) { // isselected = (cm.setime('%Y%m%d',학습종료) == cminningscd.estart('%Y%m%d',교육시작) ? 1 : 0)
pData.html("<label>" + "<span style='color:blue'>" + strStudyPlacename + "</span>" + " " + radioEduDay + " checked> " + d.scdInfoSummary + comment + "</label></label>");
pData.append(spanApplyClass);
}
@ -612,10 +624,158 @@
}
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;
@ -643,6 +803,7 @@
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 />");
@ -668,15 +829,19 @@
}
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);
@ -694,30 +859,23 @@
}
}
@*/** 수강신청 버튼 클릭 */*@
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", "@Model.stringval6", $("#pcmno_" + pcmno + "_cgcode").val(), pcmno, "chkLectNew");
checkLectCompleteEdu(cmno, "@Model.stringval3", "@Model.stringval4", "@Model.stringval5", $("#pcmno_" + pcmno + "_cgcode").val(), pcmno, "chkLect");
}
else {
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;
//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;
return;
}
}
@ -726,7 +884,7 @@
function applyClass(cmno, pcmno) {
//수강신청
if (@ViewBag.SSUserNo > 0) {
checkLectComplete(cmno, "@Model.stringval3", "@Model.stringval4", "@Model.stringval5", "@Model.stringval6", $("#pcmno_" + pcmno + "_cgcode").val(), pcmno, "chkLect");
checkLectComplete(cmno, "@Model.stringval3", "@Model.stringval4", "@Model.stringval5", $("#pcmno_" + pcmno + "_cgcode").val(), pcmno, "chkLect");
}
else {
msg("로그인 후 신청 할 수 있습니다.");
@ -738,99 +896,28 @@
let _cgcode = 0;
let _grade = 0;
function checkLectCompleteEdu(cmno, man, edu, grade, job, cgcode, pcmno) {
function checkLectCompleteEdu(cmno, man, edu, grade, cgcode, pcmno) {
_cmno = cmno;
_edu = edu;
_cgcode = cgcode;
_grade = grade;
//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
capp("/focommon/GetCheckLectIs", { cmno: cmno, man: man, edu: edu, grade: grade, cgcode: cgcode, pcmno: pcmno }, "chkLect"); // 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
}
//
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;
}
}
}
capp("/focommon/GetCheckLectIs", { cmno: cmno, man: man, edu: edu, grade: grade, cgcode: cgcode, pcmno: pcmno }, "chkLect"); // 1
@*capResult.code == code;*@
}
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) {
@ -845,11 +932,10 @@
}
if (chk && chkMsg != "") {
msg(chkMsg);
msg(chkMsg)
$(".mainokbutton").on("click", function () {
checkLectIsComplete(_cmno);
});
})
}
else {
checkLectIsComplete(_cmno);
@ -857,6 +943,7 @@
}
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; 이미 같은 교육목적과 등급으로 신청 또는 이수한 내역이 있습니다." +
@ -870,13 +957,15 @@
}
}
else {
msg("<span style='font-size: 15pt;'>이미 동일한 내용의 교육을 신청,수강 또는 수료한 과정입니다.</span>");
@* msg("<sapn style='font-size: 15pt;'>이미 수강/수료한 과정입니다.</span>");*@
msg("<sapn style='font-size: 15pt;'>이미 동일한 내용의 교육을 신청,수강 또는 수료한 과정입니다.</span>");
}
}
}
function checkLectIsComplete(cmno) { //3
capp("/focommon/GetCheckLectIsComplete", { cmno: cmno }, "check");
}
@ -884,6 +973,7 @@
var cnt = capResult.obj;
if (cnt > 0) {
// 강좌를 만들 수 있지만 이미 생성된 조건?
@* msg("이미 수강/수료한 과정입니다.");*@
msg("<sapn style='font-size: 15pt;'>이미 동일한 내용의 교육을 신청,수강 또는 수료한 과정입니다.</span>");
return;
}
@ -891,38 +981,5 @@
$("#cmno").val(_cmno);
$("#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>";
}
}
}
</script>

View File

@ -18,7 +18,8 @@
</ul>
<ul class="schCont">
<li>
<select name="stringval2" id="stringval2">
<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>

File diff suppressed because it is too large Load Diff

View File

@ -15,7 +15,9 @@
<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>
<style type="text/css">
/** 회원탈퇴 관련 css */
.mpgpop_base {
display: none;
justify-content: center;
@ -81,7 +83,7 @@
text-decoration: none;
font-weight: bold;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
background-color: #2563eb;
background-color: #2563eb;
color: #ffffff !important;
}
@ -103,39 +105,8 @@
line-height: 1.6;
font-size: 0.95rem;
}
/** 알림 팝업 버튼 스타일 (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,10 +43,6 @@
<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,62 +143,6 @@
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,23 +23,12 @@ 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"%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;
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.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 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');
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');
}
.lgnForm li {
@ -129,28 +118,4 @@ 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: 12px; /* 둥근 모서리 처리 */
border-radius: 8px; /* 둥근 모서리 처리 */
text-decoration: none; /* a 태그의 밑줄 제거 */
cursor: pointer; /* 마우스 오버 시 손가락 모양 커서 */
font-weight: bold; /* 폰트 약간 두껍게 */
@ -10981,22 +10981,12 @@ span.org {
clear: both;
}
.jnSel > div {
/* float: left; */
width: calc(33.3333% - 3px);
.jnSel > div { /*float: left;*/
width: 33.3333%;
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 {
background: #f8f8f8;
border: solid 1px #e1e1e1;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -1394,9 +1394,6 @@ function isRepeatedString(str) {
}
var _confirmokcb;
var _confirmokcbcancel;
/**
* 확인(Confirm) 상자를 토글(표시/숨김)하고, 사용자의 응답에 따라 특정 콜백 함수를 실행합니다.
* 함수는 일반적으로 사용자에게 확인 메시지를 보여주고 "예" 또는 "아니오" 같은 선택을 요구할 사용됩니다.
@ -1456,6 +1453,8 @@ function confirmtoggle(b, m, cb, cbcancel, top) {
}
}
var _confirmokcb;
var _confirmokcbcancel;
function confirmok() {
$("#confirmbox").hide();
if (_confirmokcb != "" &&
@ -1467,70 +1466,6 @@ 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);
@ -1600,121 +1535,4 @@ function strEnConvert(str) {
let rslt = str.replace(/&#/gi, "%26%23");
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';
});
});
}

View File

@ -1,50 +0,0 @@
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,7 +47,6 @@
<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" />