6709 외 jquery-ui cdn링크 로컬변경, 및 zipfile 로직 변경

This commit is contained in:
iyak 2025-04-03 04:57:19 +00:00
parent 4266e8c1e7
commit c7c2c1ade2
53 changed files with 2058 additions and 611 deletions

View File

@ -318,6 +318,7 @@
<Content Include="css\img\intranet_logo_b.png" />
<Content Include="css\img\loading-sm.gif" />
<Content Include="css\img\loading.gif" />
<Content Include="favicon.ico" />
<Content Include="Img\common\gnb_close.png" />
<Content Include="Img\common\logo2.png" />
<Content Include="Img\gnb_logo.png" />

View File

@ -68,7 +68,7 @@
</style>
}
@section scriptsHeader{
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script src="~/js/jquery.min.js"></script>
@Html.Partial("./Partial/Summernote")
}
@section scripts{

View File

@ -60,7 +60,7 @@
margin-left: 1px;
}
</style>
@*<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>*@
@*<script src="~/js/jquery.min.js"></script>*@
<script>
function exceldown2(fid, url, checktbody, exname, limitstringval, jsonDataStr) {
var limit = 24;

View File

@ -11,7 +11,6 @@
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="No-Cache" />
<title>@ViewData["Title"] - 영남건설기술교육원 Back-Office</title>
@*<link rel="shortcut icon" href="/images/nptech.ico" />*@
<meta name="description" content="y&partners" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
@Styles.Render("~/Content/css")
@ -19,7 +18,7 @@
@RenderSection("stylecdn", required: false)
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/scripts")
<script src="/js/site.js?v=240102"></script>
<script src="/js/site.js?v=250402"></script>
<!--[if lt IE 9]>
<script src="/js/ie/html5shiv.js"></script>
<script src="/js/ie/respond.min.js"></script>
@ -67,7 +66,7 @@
<body class="mainbody sitebody">
<section class="vbox">
<header class="bg-dark dk header navbar navbar-fixed-top-xs">
<div class="navbar-header aside-md" @*style="width: 420px;"*@>
<div class="navbar-header aside-md">
<a class="btn btn-link visible-xs" data-toggle="class:nav-off-screen,open" data-target="#nav,html">
<i class="fa fa-bars"></i>
</a>
@ -86,7 +85,7 @@
</li>
}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">@ViewBag.SSUserName 님<b class="caret"></b></a>
<a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown">@ViewBag.SSUserName 님<b class="caret"></b></a>
<ul class="dropdown-menu animated fadeInRight">
<span class="arrow top"></span>
@if (ViewBag.IsStaging)
@ -101,7 +100,7 @@
{
<li><a href="~/Content/file/YNICTEManual@(ViewBag.SSUserType == 11 ? "axds" : (ViewBag.SSUserType == 81) ? "axds" : "axds").pdf" target="_blank">매뉴얼 다운로드</a></li>
}
<li><a href="#" onclick="showramemainlayer('/user/editinfo');" title="개인정보수정">개인정보수정</a></li>
<li><a href="javascript:;" onclick="showramemainlayer('/user/editinfo');" title="개인정보수정">개인정보수정</a></li>
<li><a href="/Account/Logout" title="로그아웃">로그아웃</a></li>
</ul>
</li>
@ -127,10 +126,8 @@
liindex++;
var ms = ((List<NP.Model.Menu>)ViewBag.Menus).Where(w => w.pmenuno == m.menuno && w.ishid < 1).ToList();
<li class="depth@(m.menulevel) @(pmenus.Contains("/" + m.menuno + "/") ? "active" : "")">
@*<a href="@((ms.FirstOrDefault()??new NP.Model.Menu() { }).menuurl)" class="@(pmenus.Contains("/" + m.menuno + "/") ? "active" : "")">*@
<a href="#" class="@(pmenus.Contains("/" + m.menuno + "/") ? "active" : "")">
<a href="javascript:;" class="@(pmenus.Contains("/" + m.menuno + "/") ? "active" : "")">
<i class="fa fa-@(liindex == 1 ? "bell" : liindex == 2 ? "user" : liindex == 3 ? "users" : liindex == 4 ? "file-text" : liindex == 5 ? "calendar" : liindex == 6 ? "bullhorn" : liindex == 7 ? "wrench" : liindex == 8 ? "krw" : "circle") icon"><b class="bg-dark"></b></i>
@*<span class="pull-right"><i class="fa fa-angle-down text"></i><i class="fa fa-angle-up text-active"></i></span>*@
<span>@m.menuname</span>
</a>
<ul class="nav lt">
@ -156,8 +153,8 @@
</section>
<footer class="footer lt hidden-xs b-t b-dark">
<a href="#" data-toggle="class:nav-xs" class="pull-up btn btn-sm btn-dark btn-icon" style="padding: 0;" onclick="$('section.scrollable').animate({ scrollTop: 0 }, 400);">▲</a>
<a href="#" data-toggle="class:nav-xs" class="pull-up btn btn-sm btn-dark btn-icon" style="padding: 0;" onclick="$('section.scrollable').animate({ scrollTop: 10000 }, 400);">▼</a>
<a href="javascript:;" data-toggle="class:nav-xs" class="pull-up btn btn-sm btn-dark btn-icon" style="padding: 0;" onclick="$('section.scrollable').animate({ scrollTop: 0 }, 400);">▲</a>
<a href="javascript:;" data-toggle="class:nav-xs" class="pull-up btn btn-sm btn-dark btn-icon" style="padding: 0;" onclick="$('section.scrollable').animate({ scrollTop: 10000 }, 400);">▼</a>
<a href="#nav" data-toggle="class:nav-xs" class="pull-right btn btn-sm btn-dark btn-icon leftmenutoggle @(ViewBag.ckmainlmenu)">
<i class="fa fa-angle-left text"></i>
<i class="fa fa-angle-right text-active"></i>
@ -169,9 +166,6 @@
<section id="content">
<section class="vbox">
<section class="scrollable padder">
@*<div class="form-group" style="margin-top: 10px;">
<input type="text" class="form-control" name="MainTotalSearch" id="maintotalsearch" placeholder="통합검색 (입력후 엔터)" value="@(ViewBag.MainSearch??"")" />
</div>*@
<div class="m-b-md"><h3 class="m-b-none" style="border-bottom: 1px solid #ddd; padding-bottom: 10px;"><i class="fa fa-tags text"></i> <span id="mainmenutitle">@(((NP.Model.Menu)ViewBag.CMenu) == null ? "Home" : ((NP.Model.Menu)ViewBag.CMenu).menuname)</span></h3></div>
<div class="con-body">@RenderBody()</div>
<br class="mainbr" /><br class="mainbr" /><br class="mainbr" />
@ -193,26 +187,26 @@
<div class="progress-bar progress-bar-danger" data-toggle="tooltip" data-original-title="30%" style="width: 100%">processing...</div>
</div>
</div>
<div id="layermessage"><br /><div class="msg"></div><br /><a href="#" class="btn btn-danger mainokbutton" onclick="javascript:hidelayermsg();">확인</a></div>
<div id="layermessage"><br /><div class="msg"></div><br /><a href="javascript:;" class="btn btn-danger mainokbutton" onclick="javascript:hidelayermsg();">확인</a></div>
<div id="bglayer2">
<div class="progress progress-xs progress-striped active" style="position: absolute; top: 40%; left: 30%; right: 30%; height: 20px; display: none;">
<div class="progress-bar progress-bar-danger" data-toggle="tooltip" data-original-title="30%" style="width: 100%">processing...</div>
</div>
</div>
<div id="layermessage2"><br /><div class="msg"></div><br /><a href="#" class="btn btn-danger mainokbutton2" onclick="javascript:hidelayermsg2();">확인</a></div>
<div id="layermessage2"><br /><div class="msg"></div><br /><a href="javascript:;" class="btn btn-danger mainokbutton2" onclick="javascript:hidelayermsg2();">확인</a></div>
<div id="uploadbox">
<div class="alert alert-danger">
<h4><i class="fa fa-bell-alt"></i> 파일선택</h4>
<input type="file" id="mainuploadfile" style="display: none;" onchange="javascript: mainchangefile(this);" />
<input type="text" id="mainuploadlabel" readonly="readonly" style="width: 70%;" placeholder="파일을 등록하려면 클릭하세요." onclick="javascript: maingetfile();" />
<a href="#" class="btn btn-xs btn-danger" onclick="javascript: mainSendFile(this);">등록하기</a>
<a href="#" class="btn btn-xs btn-default" onclick="javascript: mainFileClose(this);">닫기</a>
<a href="javascript:;" class="btn btn-xs btn-danger" onclick="javascript: mainSendFile(this);">등록하기</a>
<a href="javascript:;" class="btn btn-xs btn-default" onclick="javascript: mainFileClose(this);">닫기</a>
</div>
</div>
<div id="bgprogress" class="progress"><div class="progress-bar progress-bar-primary progress-bar-striped active" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width:130px;">처리중입니다.</div></div>
<div id="mainuploadbox">
<div class="alert alert-danger">
<h4><i class="fa fa-bell-alt"></i>엑셀일괄등록<a href="#" class="btn btn-xs btn-danger btn-rounded f-r" onclick="showmainupload(false)">X</a></h4>
<h4><i class="fa fa-bell-alt"></i>엑셀일괄등록<a href="javascript:;" class="btn btn-xs btn-danger btn-rounded f-r" onclick="showmainupload(false)">X</a></h4>
<br />
<div class="boxborder">
<ul>
@ -228,8 +222,8 @@
</div>
<br />
<div>
<a href="#" class="btn btn-s-md btn-danger" onclick="javascript: mainupload(this);">등록하기</a>
<a href="#" class="btn btn-s-md btn-default" onclick="showmainupload(false)">닫기</a>
<a href="javascript:;" class="btn btn-s-md btn-danger" onclick="javascript: mainupload(this);">등록하기</a>
<a href="javascript:;" class="btn btn-s-md btn-default" onclick="showmainupload(false)">닫기</a>
</div>
</div>
</div>
@ -261,8 +255,6 @@
}
}
});
//window.history.pushState('forward', null, '#SomeIDYouAreNotUsing');
}
});

View File

@ -81,13 +81,13 @@
</div>
<label class="regbox" style="font-size:12px;">
* 등록 안내<br />
- 상위분류선택 : 상위분류 있음 선택 시 반드시 상위분류를 지정,<br/> 그 밑에 분류를 생성합니다.<br />
- 상위분류선택 : 상위분류 있음 선택 시 반드시 상위분류를 지정,<br /> 그 밑에 분류를 생성합니다.<br />
- 과정분류명 : 20자 이내로 입력합니다.<br />
- 과정분류코드 : 영문,숫자,한글 혼용 가능하며 20자 이내로 입력합니다.<br /> 중복 지정은 불가하며 중복 체크 시에는 대소문자를 구별하지 않습니다.
</label>
</div>
@section scriptsHeader{
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script src="~/js/jquery.min.js"></script>
}
@section scripts{
<script>
@ -95,11 +95,9 @@
$("input[name='isparent']").on("change", function () {
$("#pcgno").val("");
$("#trpcgno").show();
//$("#triscover").show();
$("#iscover").val("0");
if ($(this).val() == 0) {
$("#trpcgno").hide();
//$("#triscover").hide();
}
});
});

View File

@ -272,7 +272,7 @@
</div>
</div>
@section scriptsHeader{
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script src="~/js/jquery.min.js"></script>
@Html.Partial("./Partial/ScriptDate")
}
@section scripts{

View File

@ -216,7 +216,7 @@
}
@section scriptsHeader{
@Html.Partial("./Partial/FileScript")
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script src="~/js/jquery.min.js"></script>
}
@section scripts{
<script>

View File

@ -36,7 +36,8 @@
<add key="reporturl" value="http://ynicter.nptc.kr" />
<add key="isstaging" value="1" />
<!--<add key="masteremail" value="edu@ynicte.or.kr;mail.ynicte.or.kr;25;ynicte@ynicte.or.kr;k7758870!%" />-->
<add key="masteremail" value="yicte@cte.or.kr;smtp.daum.net;465;yicte2020;yicte04003" />
<!--<add key="masteremail" value="yicte@cte.or.kr;smtp.daum.net;465;yicte2020;yicte04003" />-->
<add key="masteremail" value="yicte@cte.or.kr;smtp.daum.net;465;yicte2020;txwhczubbkcbotfd" />
<add key="popbillManager" value="070-5088-4781;박희란" />
<add key="usessl" value="Y" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

File diff suppressed because one or more lines are too long

BIN
BO/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

44
BO/js/jquery-ui.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -346,6 +346,94 @@ function rcchange(s) {
eval($(s).attr("data-scmethod"));
}
}
/** 로딩이미지 보여주기 */
function showLoadingImage() {
// 이미 존재하는 경우 중복 생성 방지
if (document.getElementById('custom-loading-overlay')) {
return;
}
// 로딩 이미지 요소 생성
const loadingDiv = document.createElement('div');
loadingDiv.id = 'custom-loading-overlay';
// 인라인 스타일 대신 클래스 사용을 위한 스타일 추가
const style = document.createElement('style');
style.textContent = `
#custom-loading-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 9999;
}
#custom-loading-spinner {
width: 40px;
height: 40px;
background-color: #fff;
border-radius: 100%;
-webkit-animation: sk-scaleout 1.0s infinite ease-in-out;
animation: sk-scaleout 1.0s infinite ease-in-out;
}
@-webkit-keyframes sk-scaleout {
0% { -webkit-transform: scale(0) }
100% { -webkit-transform: scale(1.0); opacity: 0; }
}
@keyframes sk-scaleout {
0% { transform: scale(0); -webkit-transform: scale(0); }
100% { transform: scale(1.0); -webkit-transform: scale(1.0); opacity: 0; }
}
/* 애니메이션 미지원 브라우저용 대체 스타일 */
.no-animation #custom-loading-spinner {
background-color: #3498db;
border: 5px solid #f3f3f3;
}
`;
document.head.appendChild(style);
// 브라우저 애니메이션 지원 확인
const supportsAnimation = 'AnimationEvent' in window ||
'WebKitAnimationEvent' in window ||
'MozAnimationEvent' in window ||
'msAnimationEvent' in window ||
'OAnimationEvent' in window;
// 기본 로딩 스피너
const spinnerDiv = document.createElement('div');
spinnerDiv.id = 'custom-loading-spinner';
// 애니메이션을 지원하지 않는 브라우저에는 정적 스타일 적용
if (!supportsAnimation) {
loadingDiv.className = 'no-animation';
}
loadingDiv.appendChild(spinnerDiv);
document.body.appendChild(loadingDiv);
}
/** 로딩이미지 제거 */
function hideLoadingImage() {
const loadingDiv = document.getElementById('custom-loading-overlay');
if (loadingDiv) {
// 스타일 요소도 정리
const style = document.querySelector('style[id^="custom-loading-style"]');
if (style) {
document.head.removeChild(style);
}
document.body.removeChild(loadingDiv);
}
}
function ajaxing(tf) {
if (!_jsislayer2) {
bglayer(false);
@ -782,105 +870,208 @@ function prg(id) {
function prgstop() {
$("#bglayer .progress, #bglayer2 .progress").hide();
}
function capfile(url, data, callback, noeval, setBG, jsislayer2, abscaller) {
function capfile(url, data, callback, noeval, setBG, jsislayer2) {
// 로딩바 표시 추가
showLoadingImage();
noeval = noeval || false;
_abscaller = abscaller || false;
_jsislayer2 = jsislayer2 || false;
_setBG = setBG || false;
capfilecallback = callback;
// 백그라운드 레이어 표시
if (_setBG) {
prg('');
bglayer();
}
if (_jsislayer2) {
prg('2');
bglayer2();
}
// iOS 호환성을 위한 처리
// FormData 객체 확인 및 필요시 수정
if (data instanceof FormData) {
// iOS에서 FormData 디버깅을 위한 로그 (개발 중에만 사용)
console.log("FormData 항목 수:", [...data.entries()].length);
}
// 콜백 함수 실행 헬퍼
function executeCallback(result) {
// 로딩바 숨김 추가
hideLoadingImage();
if (_setBG) {
$("#bglayer").hide();
}
if (noeval) {
// 함수 객체로 직접 호출
if (typeof callback === 'function') {
callback(result);
}
}
else {
// 기존 방식 유지 (eval 사용)
// 보안상 권장되지 않지만 기존 코드 호환성 유지
try {
window.capResult = result; // 전역 변수로 결과 저장
if (typeof callback === 'string') {
if (callback.substr(callback.length - 1, 1) == ")") {
eval(callback);
} else {
eval(callback + "()");
}
}
} catch (e) {
console.error("콜백 실행 오류:", e);
}
}
}
var ajaxRequest = $.ajax({
type: "POST",
url: url,
contentType: false,
processData: false,
data: data
data: data,
timeout: 60000,
xhr: function () {
var xhr = $.ajaxSettings.xhr();
// 업로드 진행 상황 모니터링 (iOS에서 파일 업로드 진행 확인)
if (xhr.upload) {
xhr.upload.addEventListener('progress', function (e) {
if (e.lengthComputable) {
var percent = Math.round((e.loaded / e.total) * 100);
console.log("업로드 진행률: " + percent + "%");
}
}, false);
}
return xhr;
}
});
ajaxRequest.error(function (e) {
prgstop();
isCaping = false;
console.log(e.responseText);
if (_jsislayer2) {
msg2("개발담당자에게 문의해주세요...");
// 에러 처리
ajaxRequest.fail(function (jqXHR, textStatus, errorThrown) {
console.error("Ajax 요청 실패:", textStatus, errorThrown);
// 타임아웃인 경우 별도 처리
if (textStatus === "timeout") {
alert("요청 시간이 초과되었습니다. 다시 시도해 주세요.");
// 로딩바 숨김 추가 (타임아웃 시)
hideLoadingImage();
}
else {
msg("개발담당자에게 문의해주세요...");
// 기존 에러 처리 로직 유지 (하지만 에러 시 다른 처리를 권장)
executeCallback({
code: -1,
message: "요청 처리 중 오류가 발생했습니다",
error: textStatus
});
}
});
ajaxRequest.done(function (data) {
prgstop();
if (_setBG) {
$("#bglayer").hide();
}
capResult = data;
if (capResult.code == 1000 || _abscaller) {
eval(capfilecallback.substr(capfilecallback.length - 1, 1) == ")" ? capfilecallback : (capfilecallback + "()"));
if (data && data.code == 1000) {
executeCallback(data);
}
else {
console.log(capResult.code);
console.log(capResult.msg);
console.log(capResult.obj);
}
if (_jsislayer2) {
bglayer2(false);
}
else {
bglayer(false);
console.warn("서버 응답 코드가 1000이 아닙니다:", data);
executeCallback(data);
}
});
}
function capfileform(url, fid, callback, iseval, getpost, autoMsg, noBG, jsislayer2) {
_jsislayer2 = jsislayer2 || false;
if (!isCaping) {
// 로딩바 표시 추가
showLoadingImage();
isAutoMsg = autoMsg || false;
_bging = noBG || false;
if (!_bging) {
prg('');
ajaxing();
}
if (_jsislayer2) {
prg('2');
bglayer2();
}
if (!_bging) { ajaxing(); }
if (_jsislayer2) { bglayer2(); }
_callback = callback;
capResult = null;
capOK = false;
isCaping = true;
clearComma();
// 폼 요소 직접 참조
const form = document.getElementById(fid);
// iOS 호환성을 위한 FormData 생성 방식 개선
let formData;
try {
// 기본 FormData 생성 시도
formData = new FormData(form);
// iOS 호환성 검사 - 파일 입력 필드 확인
const fileInputs = form.querySelectorAll('input[type="file"]');
let hasFiles = false;
fileInputs.forEach(input => {
if (input.files && input.files.length > 0) {
hasFiles = true;
// 파일 입력 필드 값이 제대로 FormData에 들어갔는지 확인
const fieldName = input.name || 'file';
if (!formData.has(fieldName)) {
console.log(`iOS 호환성: 수동으로 ${fieldName} 추가`);
// 수동으로 파일 추가
for (let i = 0; i < input.files.length; i++) {
formData.append(fieldName, input.files[i]);
}
}
}
});
// 디버깅용 로그
console.log('FormData 생성 완료:', hasFiles ? '파일 포함' : '파일 없음');
} catch (error) {
console.error('FormData 생성 오류:', error);
// 대체 방식으로 FormData 생성
formData = new FormData();
// 폼 필드 수동 추가
const formElements = form.elements;
for (let i = 0; i < formElements.length; i++) {
const field = formElements[i];
const name = field.name;
if (!name) continue;
if (field.type === 'file') {
for (let j = 0; j < field.files.length; j++) {
formData.append(name, field.files[j]);
}
}
else if (field.type !== 'submit' && field.type !== 'button') {
formData.append(name, field.value);
}
}
}
// 네트워크 요청 타임아웃 설정
const ajaxTimeout = 60000; // 60초
$.ajax({
type: getpost || "post",
url: url,
data: new FormData($('#' + fid)[0]),
data: formData,
contentType: false,
processData: false,
timeout: ajaxTimeout,
success: function (r) {
isCaping = false;
capResult = r;
setcap();
}, error: function (e) {
// 로딩바 숨김 추가
hideLoadingImage();
},
error: function (e) {
isCaping = false;
console.log('Ajax 오류:', e.status, e.statusText);
console.log(e.responseText);
if (_jsislayer2) {
msg2("개발담당자에게 문의해주세요....");
if (e.status === 0 && e.statusText === 'timeout') {
alert("요청 시간이 초과되었습니다. 다시 시도해주세요.");
}
else if (_jsislayer2) {
alert("개발담당자에게 문의해주세요");
}
else {
msg("개발담당자에게 문의해주세요....");
alert("개발담당자에게 문의해주세요.");
}
}, complete: function () {
prgstop();
// 로딩바 숨김 추가
hideLoadingImage();
},
complete: function () {
ajaxing(false);
// complete에도 로딩바 숨김 추가 (중복 호출 방지를 위해 다른 방법 고려 가능)
hideLoadingImage();
}
});
}
else {
alert("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요.");
console.log("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요.");
}
}
//function (xhr, textStatus) {
@ -934,52 +1125,107 @@ function cap(url, formid, callback, getpost, autoMsg, noBG, jsislayer2) {
}
}
var _jsislayer2 = false;
function capp(url, p, callback, getpost, autoMsg, noBG, jsislayer2, noclearcomma) {
noclearcomma = noclearcomma || false;
function capp(url, p, callback, getpost, autoMsg, noBG, jsislayer2, hideBG, noerror, sync) {
_jsislayer2 = jsislayer2 || false;
_noerror = noerror || false;
_hideBG = hideBG || false;
// 동기식 요청은 권장되지 않지만, 기존 코드 호환성을 위해 유지
// 단, 경고 메시지 출력
_async = !(sync || false);
if (sync) {
console.warn("동기식 Ajax 요청은 권장되지 않으며 iOS에서 문제를 일으킬 수 있습니다.");
}
if (!isCaping) {
isAutoMsg = autoMsg || false;
_bging = noBG || false;
if (!_bging) {
prg('');
ajaxing();
}
if (_jsislayer2) {
prg('2');
bglayer2();
}
_callback = callback;
capResult = null;
capOK = false;
isCaping = true;
if (!noclearcomma) {
// 기존 함수 호출 유지, 존재 확인 후 실행
if (typeof clearComma === 'function') {
try {
clearComma();
} catch (e) {
console.error("clearComma 함수 실행 오류:", e);
}
$.ajax({
}
// Ajax 요청 설정
const ajaxSettings = {
type: getpost || "post",
url: url,
data: p,
async: _async,
timeout: _async ? 30000 : undefined, // 비동기 요청만 타임아웃 설정
success: function (r) {
isCaping = false;
capResult = r;
// iOS 호환성을 위한 추가 처리
setTimeout(function () {
setcap();
}, error: function (e) {
}, 0);
},
error: function (xhr, status, error) {
isCaping = false;
console.log(e.responseText);
console.log("Ajax 오류:", status, error);
if (xhr.responseText) {
console.log("응답 내용:", xhr.responseText);
}
// 타임아웃 오류 별도 처리
if (status === "timeout") {
if (_jsislayer2) {
msg2("개발담당자에게 문의해주세요.");
alert("요청 시간이 초과되었습니다. 다시 시도해 주세요.");
} else {
alert("요청 시간이 초과되었습니다. 다시 시도해 주세요.");
}
}
else if (!_noerror) {
if (_jsislayer2) {
alert("잠시 후 다시 요청해주세요.");
}
else {
msg("개발담당자에게 문의해주세요.");
alert("잠시 후 다시 요청해주세요.");
}
}, complete: function () {
prgstop();
}
},
complete: function () {
// iOS에서의 지연 문제 방지를 위한 setTimeout 사용
setTimeout(function () {
ajaxing(false);
}, 0);
}
});
};
// iOS 특정 버전에서의 캐시 문제 방지
if (navigator.userAgent.match(/(iPad|iPhone|iPod)/g)) {
ajaxSettings.cache = false;
// URL에 타임스탬프 추가하여 캐시 방지
const timestamp = new Date().getTime();
ajaxSettings.url = ajaxSettings.url +
(ajaxSettings.url.indexOf('?') >= 0 ? '&' : '?') +
'_t=' + timestamp;
}
else {
alert("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요.");
$.ajax(ajaxSettings);
}
else if (!_noerror) {
console.log("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요.");
}
}

View File

@ -853,6 +853,7 @@ namespace NP.Base.Controllers
{
System.IO.Directory.CreateDirectory(Server.MapPath(vm.Contents+"/" + vm.CT.ccode));
}
if (Request.Files.GetMultiple("file").First().FileName.Split('.').Last().ToUpper() == "ZIP")
{
//압축해제
@ -962,6 +963,7 @@ namespace NP.Base.Controllers
}
}
}
/// <summary>
/// 컨텐츠 삭제
/// </summary>

View File

@ -976,25 +976,30 @@ namespace NP.Base.Controllers
{
return JsonOK(0);
}
//directory 없을시 생성
if (!System.IO.Directory.Exists(Server.MapPath(vm.Files + "/SubjectZip")))
{
System.IO.Directory.CreateDirectory(Server.MapPath(vm.Files + "/SubjectZip"));
}
//zip으로 묶어서 다운로드
var zipName = "SubjectFile_" + cmno + "_" + classno + "_" + sdno + ".zip";
var zipUrl = vm.Files + "/SubjectZip/" + zipName;
//이미 생성된 zip파일 존재하면 삭제
if (System.IO.File.Exists(Server.MapPath(zipUrl)))
{
System.IO.File.Delete(Server.MapPath(zipUrl));
}
//zip 생성
List<File> newfile = new List<File>();
foreach (var f in sds)
{
newfile.Add(new File() { orgname = string.Format("{0}_{1}.{2}", f.userid, f.username, f.fileurl.Split('.').Last()), fileurl = Server.MapPath(vm.Subjects + f.fileurl) });
}
if (!newfile.Count.Equals(0))
{
if (base.ZipFiles(newfile, zipUrl, ""))
@ -1013,6 +1018,7 @@ namespace NP.Base.Controllers
}
return null;
}
/// <summary>
/// 토론
/// </summary>

View File

@ -1548,7 +1548,7 @@ namespace NP.Base
public JsonResult SaveSmsMulti(IList<NP.Model.MemoUser> Users)
{
Memo m = new Memo() {Users = Users };
//m.mcontents = m.mcontents.Length > 1000 ? m.mcontents.Substring(0, 1000) : m.mcontents;
var us = m.Users.Where(w => w.isok == 1).ToList();
if (us.Count() > 0)
{
@ -1568,8 +1568,6 @@ namespace NP.Base
talkUserTmp.Add(talkUser);
talkUserTmp[0].mno = m.mno;
//System.Text.StringBuilder sbm = new System.Text.StringBuilder("");
//System.Text.StringBuilder sbs = new System.Text.StringBuilder("");
var cbnum = GetConfig("mtssendnum");
talkUserTmp[0].ismms = System.Text.Encoding.Default.GetBytes(talkUserTmp[0].mcontents).Length > 90;
@ -1657,6 +1655,7 @@ namespace NP.Base
return JsonOK(0);
}
/// <summary>
///
/// </summary>
@ -1667,36 +1666,57 @@ namespace NP.Base
public bool ZipFiles(IList<NP.Model.File> targetFile, string zipFilePath, string password)
{
bool retVal = false;
ICSharpCode.SharpZipLib.Zip.ZipFile zfile = ICSharpCode.SharpZipLib.Zip.ZipFile.Create(System.IO.Path.Combine(System.Web.HttpContext.Current.Server.MapPath(zipFilePath)));
// Zip 파일 경로 생성
string fullZipPath = System.IO.Path.Combine(System.Web.HttpContext.Current.Server.MapPath(zipFilePath));
try
{
// 패스워드가 있는 경우 패스워드 지정.
if (password != null && password != String.Empty)
using (var zfile = ICSharpCode.SharpZipLib.Zip.ZipFile.Create(fullZipPath))
{
// 패스워드가 있는 경우 패스워드 지정
if (!string.IsNullOrEmpty(password))
{
zfile.Password = password;
}
zfile.BeginUpdate();
foreach (var item in targetFile)
{
// 파일 경로를 검증
if (!string.IsNullOrEmpty(item.fileurl) && System.IO.File.Exists(item.fileurl))
{
zfile.Add(item.fileurl, System.IO.Path.GetFileName(item.orgname));
}
}
zfile.CommitUpdate();
retVal = true;
}
retVal = true; // 작업 성공
}
catch (Exception ex)
{
retVal = false;
// 오류가 난 경우 생성 했던 파일을 삭제.
if (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath(zipFilePath)))
System.IO.File.Delete(System.Web.HttpContext.Current.Server.MapPath(zipFilePath));
}
finally
// 오류가 난 경우 생성했던 파일을 삭제.
if (System.IO.File.Exists(fullZipPath))
{
zfile.Close();
try
{
System.IO.File.Delete(fullZipPath);
}
catch
{
// 파일 삭제 시 실패는 무시
}
}
}
return retVal;
}
// SHA256 256bit 암호화
protected string ComputeHash(string input)
{

View File

@ -1,26 +1,20 @@
using System;
using NP.Model;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using NP.Model;
using System.Collections;
using NP.Base.Auth;
using NP.Base.ENUM;
using QRCoder;
namespace NP.Base.Controllers
{
public partial class FCommonController : NP.Base.BaseController
{
[HttpPost]
public JsonResult GetAttend(Int64 lectno)
{
var rtn = new Hashtable() { };
var d = Dao.Get<LectInningPage>("lect.lectinningpages", new System.Collections.Hashtable() { { "lectno", lectno }, { "userno", SUserInfo.UserNo } });
var d = Dao.Get<LectInningPage>("lect.lectinningpages", new Hashtable() { { "lectno", lectno }, { "userno", SUserInfo.UserNo } });
rtn.Add("d", d);
var ds = new List<LectInningPage>() { };
foreach(var iseq in d.Select(s => s.iseq).Distinct())
@ -31,21 +25,24 @@ namespace NP.Base.Controllers
rtn.Add("h", ds);
return JsonBack(rtn);
}
[HttpPost]
public JsonResult PageLogs(String d1, String d2)
public JsonResult PageLogs(string d1, string d2)
{
return JsonBack(Dao.Get<PageLog>("lect.pagelogs", new System.Collections.Hashtable() { { "from"+(string.IsNullOrEmpty(d1)?"x":""), d1 }, { "to" + (string.IsNullOrEmpty(d2) ? "x" : ""), d2 + " 23:59:59" }, { "userno", SUserInfo.UserNo }, { "logsite", 1 } }));
return JsonBack(Dao.Get<PageLog>("lect.pagelogs", new Hashtable() { { "from"+(string.IsNullOrEmpty(d1)?"x":""), d1 }, { "to" + (string.IsNullOrEmpty(d2) ? "x" : ""), d2 + " 23:59:59" }, { "userno", SUserInfo.UserNo }, { "logsite", 1 } }));
}
[HttpPost]
public JsonResult CMRSGo(Int64 lectno, int rsno)
public JsonResult CMRSGo(long lectno, int rsno)
{
var rtn = new Hashtable() { };
rtn.Add("q", Dao.Get<RSCQ>("cr.mycmrsq", new System.Collections.Hashtable() { { "lectno", lectno }, { "userno", SUserInfo.UserNo }, { "rsno", rsno } }));
rtn.Add("qi", Dao.Get<RSCQ>("cr.mycmrsqi", new System.Collections.Hashtable() { { "lectno", lectno }, { "userno", SUserInfo.UserNo }, { "rsno", rsno } }));
rtn.Add("q", Dao.Get<RSCQ>("cr.mycmrsq", new Hashtable() { { "lectno", lectno }, { "userno", SUserInfo.UserNo }, { "rsno", rsno } }));
rtn.Add("qi", Dao.Get<RSCQ>("cr.mycmrsqi", new Hashtable() { { "lectno", lectno }, { "userno", SUserInfo.UserNo }, { "rsno", rsno } }));
return JsonBack(rtn);
}
[HttpPost]
public JsonResult LectRSSave(Int64 lectno, int rsno, String sd)
public JsonResult LectRSSave(long lectno, int rsno, String sd)
{
var d = new LectRS() { lectno = lectno, userno = SUserInfo.UserNo, rsno = rsno, uno = SUserInfo.UserNo, uip = GetUserIP(), Ds = new List<LectRS>() { } };
foreach(var s in sd.Split(';'))
@ -54,11 +51,13 @@ namespace NP.Base.Controllers
}
return JsonOK(Dao.Save("cr.lectrs.in", d));
}
[HttpPost]
public JsonResult SaveExam(Int64 lectno, int estno, String savedata, int issubmit, String qnos, bool isbackup = false, int cblock = 0)
public JsonResult SaveExam(long lectno, int estno, string savedata, int issubmit, string qnos, bool isbackup = false, int cblock = 0)
{
var Exam = Dao.Get<CMEX>("cr.userexam.detailforexamforsubmit", new System.Collections.Hashtable() { {"lectno",lectno }, { "exno", estno}, { "userno", SUserInfo.UserNo } }).FirstOrDefault();
String OverTime = null;
var Exam = Dao.Get<CMEX>("cr.userexam.detailforexamforsubmit", new Hashtable() { {"lectno",lectno }, { "exno", estno}, { "userno", SUserInfo.UserNo } }).FirstOrDefault();
string OverTime = null;
if (Exam == null)
{
issubmit = 0;
@ -68,14 +67,17 @@ namespace NP.Base.Controllers
{
return JsonOK(-44,true);
}
var qis = Dao.Get<QuestionItem>("cr.questionitem.listforcheck", qnos);
var ue = new LectEX() {lectno=lectno, userno = SUserInfo.UserNo, uno = SUserInfo.UserNo, uip = GetUserIP(), exno = Exam.exno, cblock = cblock };
ue.extype = Exam.extype;
//ue.sip = SIP;
ue.UED = new List<LectEXQ>() { };
foreach (String sss in savedata.Split(';'))
foreach (string sss in savedata.Split(';'))
{
String[] ss = sss.Split(':');
string[] ss = sss.Split(':');
if (ss[4] == "0")
{
ue.UED.Add(new LectEXQ()
@ -107,24 +109,47 @@ namespace NP.Base.Controllers
});
}
}
ue.issubmit = issubmit;
ue.zstring20 = OverTime;
var rtn = Dao.Save("cr.examsubmit" + (isbackup ? "backup" : ""), ue);
return JsonOK("1".Equals(OverTime) ? 0 : rtn, true);
}
/// <summary>
/// 과제제출
/// </summary>
/// <param name="d"></param>
/// <returns></returns>
[ValidateInput(false)]
[HttpPost]
public JsonResult SubjectSave(LectSD d)
{
d.uno = SUserInfo.UserNo; d.uip = GetUserIP();
d.userno = SUserInfo.UserNo;
if (Request.Files.GetMultiple("file1").Where(w => !string.IsNullOrEmpty(w.FileName)).Count() > 0)
{
d.fgno = SetFile(Request.Files.GetMultiple("file1").Where(w => !string.IsNullOrEmpty(w.FileName)).ToList(), d.fgno ?? 0, "lectsd", "fgno", 1, "XX", false, true, d.cmno);
d.fgno = d.fgno == 0 ? (Int64?)null : d.fgno;
d.fgno = SetFile(Request.Files.GetMultiple("file1")
.Where(w => !string.IsNullOrEmpty(w.FileName))
.ToList(),
d.fgno ?? 0,
"lectsd",
"fgno",
1,
"XX",
false,
true,
d.cmno);
d.fgno = d.fgno == 0 ? (long?)null : d.fgno;
}
return JsonOK(Dao.Save("cr.lectsd.save", d));
}
[HttpPost]
public JsonResult LectSDBoardSave(LectSDBoard d)
{
@ -142,11 +167,13 @@ namespace NP.Base.Controllers
Dao.Insert("cr.lectsdboard.in", d);
return JsonOK(d.bno);
}
[HttpPost]
public JsonResult LectSDBoardDel(Int64 bno)
{
return JsonOK(Dao.Save("cr.lectsdboard.del", new Hashtable() { {"userno", SUserInfo.UserNo },{"bno", bno },{"uno", SUserInfo.UserNo },{ "uip", GetUserIP()} }));
}
[HttpPost]
public JsonResult LectSDBoardCMTSave(BoardCMT c)
{
@ -158,11 +185,13 @@ namespace NP.Base.Controllers
}
return JsonOK(Dao.Save("cr.lectsdboardcmt.up", c));
}
[HttpPost]
public JsonResult LectSDBoardCMTDel(Int64 bcno)
{
return JsonOK(Dao.Save("cr.lectsdboardcmt.del", new Hashtable() { { "bcno", bcno }, { "cno", SUserInfo.UserNo }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } }));
}
[HttpPost]
public JsonResult AttCertCheck(long lectno)
{
@ -177,6 +206,7 @@ namespace NP.Base.Controllers
{
return JsonBack(new JsonRtn() { code = 1000, obj = 2 });
}
if (!string.IsNullOrEmpty(data.strval))
{
return JsonBack(new JsonRtn() { code = 1000, obj = 3, msg = data.strval });
@ -187,6 +217,7 @@ namespace NP.Base.Controllers
}
}
}
[HttpPost]
public JsonResult AttCertCheckForLectinning(long lectno, long cmino)
{
@ -215,8 +246,9 @@ namespace NP.Base.Controllers
}
}
}
[HttpPost]
public JsonResult LectComplete(Int64 lectno)
public JsonResult LectComplete(long lectno)
{
var ispass = Dao.Get<Lect>("grade.ispass", new Hashtable() { { "lectno", lectno } } ).FirstOrDefault().ispass;
if (ispass == 1)
@ -230,19 +262,18 @@ namespace NP.Base.Controllers
}
[HttpPost]
public JsonResult ReExamForUser(int exno, Int64 lectno, int extype)
public JsonResult ReExamForUser(int exno, long lectno, int extype)
{
// #xodus extype 추가
//재응시로그추가로인해 업데이트건 3개일때부터 정상처리
return JsonOK(Dao.Save("lect.reexam", new System.Collections.Hashtable() { { "exno", exno }, { "lectno", lectno }, { "extype", extype }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } }) > 2 ? 1 : 0);
return JsonOK(Dao.Save("lect.reexam", new Hashtable() { { "exno", exno }, { "lectno", lectno }, { "extype", extype }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } }) > 2 ? 1 : 0);
}
[HttpPost]
public JsonResult delfileOk(int sdno, Int64 lectno)
public JsonResult delfileOk(int sdno, long lectno)
{
//재응시로그추가로인해 업데이트건 3개일때부터 정상처리
int result = Dao.Save("lect.lectsd.del", new System.Collections.Hashtable() { { "sdno", sdno }, { "lectno", lectno }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } });
int result = Dao.Save("lect.lectsd.del", new Hashtable() { { "sdno", sdno }, { "lectno", lectno }, { "uno", SUserInfo.UserNo }, { "uip", GetUserIP() } });
return JsonOK(result);
}
}

View File

@ -1,11 +1,9 @@
using System;
using NP.Base.ENUM;
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using NP.Base.ENUM;
public static class Helpers
{
@ -153,6 +151,7 @@ public static class Helpers
}
return System.Web.Mvc.MvcHtmlString.Create(sb.ToString());
}
public static String GetYearOption(int minYear, String selected)
{
String op = "";
@ -162,6 +161,7 @@ public static class Helpers
}
return op;
}
public static String GetMonthOption(String selected)
{
String op = "";
@ -171,6 +171,7 @@ public static class Helpers
}
return op;
}
public static System.Web.Mvc.MvcHtmlString Radio(this System.Web.Mvc.HtmlHelper helper, NP.Model.InputRadio ir)
{
StringBuilder sb = new StringBuilder();
@ -275,6 +276,7 @@ public static class Helpers
}
return System.Web.Mvc.MvcHtmlString.Create(sb.ToString());
}
public static System.Web.Mvc.MvcHtmlString Pager(this System.Web.Mvc.HtmlHelper helper, int currentPage, int pagesToShowSize, int pageSize, int totalRecords, String methodname = "gopage")
{
StringBuilder html = new StringBuilder(@"<footer class='panel-footer'><input type='hidden' id='pagenum' name='pagenum' value='" + currentPage.ToString() + "' /><div class='row'><div class='col-sm-6 text-left'><small class='text-muted inline m-t-sm m-b-sm'>" + totalRecords.ToString("#,0") + " 개의 데이터 </small></div>");
@ -314,6 +316,7 @@ public static class Helpers
html.Append(@"</ul></div></div></footer>");
return System.Web.Mvc.MvcHtmlString.Create(html.ToString());
}
public static System.Web.Mvc.MvcHtmlString Pager2(this System.Web.Mvc.HtmlHelper helper, int currentPage, int pagesToShowSize, int pageSize, int totalRecords, String methodname = "gopage", String fid = "mform", String pid = "pagenum")
{
StringBuilder html = new StringBuilder(@"<div class='paging'><input type='hidden' id='pagenum' name='pagenum' value='" + currentPage.ToString() + "' />");
@ -352,6 +355,7 @@ public static class Helpers
html.Append(@"</div>");
return System.Web.Mvc.MvcHtmlString.Create(html.ToString());
}
public static String GetFromToOption(int start, int end, String textAppend, String selected)
{
StringBuilder sb = new StringBuilder();
@ -361,10 +365,12 @@ public static class Helpers
}
return sb.ToString();
}
public static string RenderView(this System.Web.Mvc.Controller controller, string viewName, object model)
{
return RenderView(controller, viewName, new System.Web.Mvc.ViewDataDictionary(model));
}
public static string RenderView(this System.Web.Mvc.Controller controller, string viewName, System.Web.Mvc.ViewDataDictionary viewData)
{
var controllerContext = controller.ControllerContext;
@ -398,6 +404,76 @@ public static class Helpers
/// <param name="isDeleteZipFile">zip파일 삭제 여부</param>
/// <returns>압축 풀기 성공 여부 </returns>
public static bool UnZipFiles(string zipFilePath, string unZipTargetFolderPath, string password = null, bool isDeleteZipFile = false)
{
// 반환 값
bool retVal = false;
// ZIP 파일 존재 여부 확인
if (File.Exists(zipFilePath))
{
try
{
using (var zipInputStream = new ICSharpCode.SharpZipLib.Zip.ZipInputStream(File.OpenRead(zipFilePath)))
{
if (!string.IsNullOrEmpty(password))
{
zipInputStream.Password = password; // 패스워드 설정
}
ICSharpCode.SharpZipLib.Zip.ZipEntry theEntry;
// 압축 파일 내의 엔트리를 읽으면서 처리
while ((theEntry = zipInputStream.GetNextEntry()) != null)
{
// 압축 엔트리 이름 처리
string directoryName = Path.GetDirectoryName(theEntry.Name);
string fileName = Path.GetFileName(theEntry.Name);
// 디렉터리 생성
if (!string.IsNullOrEmpty(directoryName))
{
Directory.CreateDirectory(Path.Combine(unZipTargetFolderPath, directoryName));
}
// 파일이 있는 경우
if (!string.IsNullOrEmpty(fileName))
{
string fullPath = Path.Combine(unZipTargetFolderPath, theEntry.Name);
// 파일스트림 생성 및 파일 복사
using (FileStream streamWriter = File.Create(fullPath))
{
byte[] data = new byte[2048];
int size;
while ((size = zipInputStream.Read(data, 0, data.Length)) > 0)
{
streamWriter.Write(data, 0, size);
}
}
}
}
}
// 압축 해제가 성공적으로 완료되었음을 표시
retVal = true;
// ZIP 파일 삭제를 원하는 경우 처리
if (isDeleteZipFile)
{
File.Delete(zipFilePath);
}
}
catch
{
retVal = false; // 예외 발생 시 실행 실패로 표시
}
}
return retVal;
}
/*
public static bool UnZipFiles(string zipFilePath, string unZipTargetFolderPath, string password = null, bool isDeleteZipFile = false)
{
bool retVal = false;
@ -469,6 +545,8 @@ public static class Helpers
}
return retVal;
}
*/
public static string MD5Hash(string data)
{
@ -522,4 +600,5 @@ public static class Helpers
}
return false;
}
}

View File

@ -4,6 +4,8 @@
<typeAlias alias="document" type="NP.Model.document, NP.Model" />
<typeAlias alias="textvalue" type="NP.Model.textvalue, NP.Model" />
<typeAlias alias="completion" type="NP.Model.Completion, NP.Model" />
<typeAlias alias="croomlectsdinfo" type="NP.Model.CRoomLectSdInfo, NP.Model" />
</alias>
<cacheModels>
<cacheModel id="croomCache" implementation="LRU" >
@ -1911,5 +1913,39 @@
]]>
</select>-->
<!-- 사용자의 과제정보 (userno: 유저키, lectno: 수강키, iscurlect: 수강기간일자내 포함 여부) -->
<select id="cr.lectsdinfo" parameterClass="hashtable" resultClass="croomlectsdinfo">
SELECT b.sdname
, a.lectno
, a2.cmno
, a.userno
, b.sdno
, a.sdate
, a.edate
, a.attrate
, b.sdcondition
, (CASE
WHEN c.submittime IS NOT NULL
THEN TRUE
ELSE FALSE
END) AS isSubmit
, c.submittime
, (CASE WHEN c.checktime IS NOT NULL
THEN TRUE
ELSE FALSE
END) AS isCheck
, c.checktime
, a.edate
, a.sdate
, NOW() BETWEEN sdate AND edate AS iscurrentlecture
FROM lect a
INNER JOIN cm a2 ON a2.cmno = a.cmno
INNER JOIN cmsd b ON b.cmno = a.cmno AND b.sdtype = 0 AND b.isdel = 0
LEFT OUTER JOIN lectsd c ON c.lectno = a.lectno AND c.sdno = b.sdno
WHERE a.userno = #userno#
<isNotNull property="lectno" prepend="and">a.lectno = #lectno#</isNotNull>
<isNotNull property="iscurlect" prepend="and">NOW() BETWEEN a.sdate AND a.edate</isNotNull>
</select>
</statements>
</sqlMap>

View File

@ -1,109 +1,319 @@
using System;
using NP.Model;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using NP.Model;
using NP.Base;
using System.Web.Routing;
namespace NP.FO.Controllers
{
/// <summary>
/// 강의실 컨트롤러
/// </summary>
public class CRoomController : CRoomBaseController
{
/// <summary>
/// 강의실 컨트롤러 메서드가 실행전 호출됨
/// </summary>
/// <param name="filterContext"></param>
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
ViewBag.Files = (new NP.Model.VMBase()).Files;
ViewBag.Files = new VMBase().Files;
}
/// <summary>
/// 강의실 > 홈
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
vm.Lect = Dao.Get<Lect>("cr.main.mygrade", new System.Collections.Hashtable() { { "lectno", vm.croomlectno }, { "cmno", vm.croomcmno},{ "userno", SUserInfo.UserNo} }).FirstOrDefault();
ViewBag.fronturl = $"https://{Request.Url.Host}";
string bmnos = null;
#region + vm.Lect = cr.main.mygrade
var p5 = new Hashtable()
{
{ "lectno", vm.croomlectno },
{ "cmno", vm.croomcmno },
{ "userno", SUserInfo.UserNo }
};
vm.Lect = Dao.Get<Lect>("cr.main.mygrade", p5).FirstOrDefault();
#endregion
ViewBag.fronturl = "https://" + Request.Url.Host;
//ViewBag.fronturl = GetConfig("fronturl");
ViewBag.Mobile = Dao.Get<Users>("users.users", new System.Collections.Hashtable() { { "userno", SUserInfo.UserNo } }).FirstOrDefault().mobile;
if (vm.Lect == null)
{
return Redirect("/My/Lecture");
}
String bmnos = null;
#region + ViewBag.Mobile = users.users
var p6 = new Hashtable()
{
{ "userno", SUserInfo.UserNo }
};
ViewBag.Mobile = Dao.Get<Users>("users.users", p6).FirstOrDefault().mobile;
#endregion
if (!string.IsNullOrEmpty(ViewBag.mainboardmaster))
{
foreach(var s in ViewBag.mainboardmaster.Split(';'))
foreach (var s in ViewBag.mainboardmaster.Split(';'))
{
bmnos += "," + s.Split(':')[0];
}
}
var pplogGet = Dao.Get<Lect>("lect.pplog.get", new System.Collections.Hashtable() { { "userno", SUserInfo.UserNo }, { "lectno", vm.Lect.lectno } }).FirstOrDefault();
#region + var pplogGet = lect.pplog.get
var p2 = new Hashtable()
{
{ "userno", SUserInfo.UserNo },
{ "lectno", vm.Lect.lectno }
};
var pplogGet = Dao.Get<Lect>("lect.pplog.get", p2).FirstOrDefault();
vm.Lect.zstring1 = pplogGet.zstring1;
vm.Lect.zstring2 = pplogGet.zstring2;
vm.Lect.zstring3 = pplogGet.zstring3;
vm.Lect.zstring4 = pplogGet.zstring4;
vm.Lect.zstring5 = pplogGet.zstring5;
#endregion
#region + vm.Datas = cr.main.boardalarm
var p3 = new Hashtable()
{
{ "bmnos", !string.IsNullOrEmpty(bmnos) ? bmnos.Substring(1) : bmnos },
{ "lect", vm.croomlectno },
{ "cmno", vm.croomcmno },
{ "lectno", vm.croomlectno },
{ "userno", SUserInfo.UserNo }
};
vm.Datas = Dao.Get<Data>("cr.main.boardalarm", p3);
#endregion
#region + vm.LectInnings = cr.cminnings
var p1 = new Hashtable();
p1.Add("lectno", vm.croomlectno);
p1.Add("userno", SUserInfo.UserNo);
// 진도율 100% 이하일떄 6개 제한을 둠
if (vm.Lect.attrate < 100)
{
p1.Add("limit", 6);
}
// 진도율이 100% 이하 또는 디버깅용 로컬일때가 아니면
// "오늘 시청 가능한 limit 개 차시 중" 이 위에 limit 만큼 보여짐
if (vm.Lect.attrate < 100)
{
p1.Add("notstudy", 1);
}
vm.LectInnings = Dao.Get<LectInning>("cr.cminnings", p1);
#endregion
vm.intval2 = Convert.ToInt32(GetConfig("inninglimit") ?? "10");
vm.Datas = Dao.Get<Data>("cr.main.boardalarm", new System.Collections.Hashtable() { { "bmnos", bmnos != null ? bmnos.Substring(1) : bmnos},{ "lect", vm.croomlectno },{ "cmno", vm.croomcmno }, { "lectno", vm.croomlectno }, { "userno", SUserInfo.UserNo } });
vm.LectInnings = Dao.Get<LectInning>("cr.cminnings", new System.Collections.Hashtable() { { "lectno", vm.croomlectno },{ "userno",SUserInfo.UserNo}, { "notstudy" + (Request.IsLocal ? "x" : ""), 1 },{ "limit", 6} });
vm.intval2 = Convert.ToInt32((GetConfig("inninglimit") ?? "10"));
foreach (var lectInning in vm.LectInnings)
{
//lectInning.daylectinninglimit = lectInning.daylectinninglimit == 0 ? 9999 : lectInning.daylectinninglimit;
lectInning.daylectinninglimit = vm.intval2;
}
if (vm.LectInnings.Count() > 0 /*&& !string.IsNullOrEmpty(vm.LectInnings.FirstOrDefault().existslectinning)*/ )
if (vm.LectInnings.Count() > 0)
{
vm.intval = Dao.Get<LectInning>("cr.lectinnings", new System.Collections.Hashtable() { /*{ "lectno", vm.croomlectno }*/ {"userno",SUserInfo.UserNo }, { "isfinishtoday", 1 } }).Count();
#region + vm.intval = cr.lectinnings
var p7 = new Hashtable()
{
{ "userno", SUserInfo.UserNo },
{ "isfinishtoday", 1 }
};
vm.intval = Dao.Get<LectInning>("cr.lectinnings", p7).Count();
#endregion
}
return CView();
}
/// <summary>
/// 강의실 > 강좌소개
/// </summary>
/// <returns></returns>
public ActionResult Plan()
{
vm.CM = Dao.Get<CM>("cm.cm", new System.Collections.Hashtable() { { "cmno", vm.croomcmno },{ "htmlcolumns", ",a.introhtml,a.targethtml,a.goalhtml,a.contenthtml,a.studyplace,cc.cname studyplacename" } }).First();
vm.CMPRs = Dao.Get<CMPR>("cm.cmprs", new System.Collections.Hashtable() { { "cmno", vm.CM.cmno }, { "usertype", 11 } });
vm.CMEV = Dao.Get<CMEV>("cm.cmev", new System.Collections.Hashtable() { { "cmno", vm.CM.cmno } }).First();
vm.intval = Dao.Get<Lect>("lect.lects.my", new System.Collections.Hashtable() { { "lecnto", vm.croomlectno } }).First().isrebate;
var p = new Hashtable();
#region + vm.CM = cm.cm
p = new Hashtable()
{
{ "cmno", vm.croomcmno },
{ "htmlcolumns", ",a.introhtml,a.targethtml,a.goalhtml,a.contenthtml,a.studyplace,cc.cname studyplacename" }
};
vm.CM = Dao.Get<CM>("cm.cm", p).First();
#endregion
#region + vm.CMPRs = cm.cmprs
p.Clear();
p = new Hashtable()
{
{ "cmno", vm.CM.cmno },
{ "usertype", 11 }
};
vm.CMPRs = Dao.Get<CMPR>("cm.cmprs", p);
#endregion
#region + vm.CMEV = cm.cmev
p.Clear();
p = new Hashtable()
{
{ "cmno", vm.CM.cmno }
};
vm.CMEV = Dao.Get<CMEV>("cm.cmev", p).First();
#endregion
#region + vm.intval = lect.lects.my
p.Clear();
p = new Hashtable()
{
{ "lectno", vm.croomlectno }
};
vm.intval = Dao.Get<Lect>("lect.lects.my", p).First().isrebate;
#endregion
return CView();
}
/// <summary>
/// 강의실 > 동영상시청
/// </summary>
/// <returns></returns>
public ActionResult Innings()
{
vm.LectInnings = Dao.Get<LectInning>("cr.cminnings", new System.Collections.Hashtable() { { "lectno", vm.croomlectno }, { "userno", SUserInfo.UserNo } });
vm.intval2 = Convert.ToInt32((GetConfig("inninglimit") ?? "10"));
#region + vm.LectInnings = cr.cminnings
var p = new Hashtable()
{
{ "lectno", vm.croomlectno },
{ "userno", SUserInfo.UserNo }
};
vm.LectInnings = Dao.Get<LectInning>("cr.cminnings", p);
#endregion
vm.intval2 = Convert.ToInt32(GetConfig("inninglimit") ?? "10");
foreach (var lectInning in vm.LectInnings)
{
//lectInning.daylectinninglimit = lectInning.daylectinninglimit == 0 ? 9999 : lectInning.daylectinninglimit;
lectInning.daylectinninglimit = vm.intval2;
}
ViewBag.Mobile = Dao.Get<Users>("users.users", new System.Collections.Hashtable() { { "userno", SUserInfo.UserNo } }).FirstOrDefault().mobile;
#region + ViewBag.Mobile = users.users
var p2 = new Hashtable()
{
{ "userno", SUserInfo.UserNo }
};
ViewBag.Mobile = Dao.Get<Users>("users.users", p2).FirstOrDefault().mobile;
#endregion
if (!string.IsNullOrEmpty(vm.LectInnings.FirstOrDefault().existslectinning) && vm.LectInnings.Count() > 0)
{
vm.intval = Dao.Get<LectInning>("cr.lectinnings", new System.Collections.Hashtable() { /*{ "lectno", vm.croomlectno }*/ {"userno",SUserInfo.UserNo }, { "isfinishtoday", 1 } }).Count();
#region + vm.intval = cr.lectinnings
var p3 = new Hashtable()
{
{ "userno", SUserInfo.UserNo },
{ "isfinishtoday", 1 }
};
vm.intval = Dao.Get<LectInning>("cr.lectinnings", p3).Count();
#endregion
}
vm.CMRSes = Dao.Get<CMRS>("cr.mycmrs", new System.Collections.Hashtable() { { "lectno", vm.croomlectno }, { "userno", SUserInfo.UserNo } });
#region + vm.CMRSes = cr.mycmrs
var p4 = new Hashtable()
{
{ "lectno", vm.croomlectno },
{ "userno", SUserInfo.UserNo }
};
vm.CMRSes = Dao.Get<CMRS>("cr.mycmrs", p4);
#endregion
return CView();
}
/// <summary>
/// 강의실 > 설문참여
/// </summary>
/// <returns></returns>
public ActionResult Research()
{
vm.CMRSes = Dao.Get<CMRS>("cr.mycmrs", new System.Collections.Hashtable() { { "lectno", vm.croomlectno },{ "userno",SUserInfo.UserNo} });
Lect lect = Dao.Get<Lect>("cr.checklectdate", new System.Collections.Hashtable() { { "lectno", vm.croomlectno } }).First();
ViewBag.isres = DateTime.Now <= lect.edate? 1 : -1;
#region + vm.CMRSes = cr.mycmrs
var p = new Hashtable()
{
{ "lectno", vm.croomlectno },
{ "userno", SUserInfo.UserNo }
};
vm.CMRSes = Dao.Get<CMRS>("cr.mycmrs", p);
#endregion
#region + lect = cr.checklectdate
var p2 = new Hashtable()
{
{ "lectno", vm.croomlectno }
};
Lect lect = Dao.Get<Lect>("cr.checklectdate", p2).First();
#endregion
ViewBag.isres = DateTime.Now <= lect.edate ? 1 : -1;
return CView();
}
/// <summary>
/// 강의실 > 성적확인
/// </summary>
/// <returns></returns>
public ActionResult Grade()
{
vm.Lect = Dao.Get<Lect>("cr.main.mygrade", new System.Collections.Hashtable() { { "lectno", vm.croomlectno }, { "cmno", vm.croomcmno },{ "userno", SUserInfo.UserNo} }).FirstOrDefault();
#region + vm.Lect = cr.main.mygrade
var p = new Hashtable()
{
{ "lectno", vm.croomlectno },
{ "cmno", vm.croomcmno },
{ "userno", SUserInfo.UserNo }
};
vm.Lect = Dao.Get<Lect>("cr.main.mygrade", p).FirstOrDefault();
#endregion
return CView();
}
/// <summary>
/// 강의실 > 게시판 (croombmno 1:수료절차안내, 2:Q&A ...)
/// </summary>
/// <param name="cvm"></param>
/// <returns></returns>
public ActionResult Boards(VMCRoom cvm)
{
ViewBag.croombmno = cvm.croombmno.ToString();
cvm.BM = Dao.Get<BoardMaster>("board.bms", new System.Collections.Hashtable() { { "bmno", cvm.croombmno } }).First();
#region + cvm.BM = board.bms
var p = new Hashtable()
{
{ "bmno", cvm.croombmno }
};
cvm.BM = Dao.Get<BoardMaster>("board.bms", p).First();
#endregion
if (cvm.BM.isuseopening == 1)
{
#region + cvm.BMOs = board.bmos
cvm.BMOs = Dao.Get<BoardMasterOpening>("board.bmos", cvm.BM.bmno);
#endregion
}
cvm.pagerowcount = cvm.pagerowcount < 1 ? 10 : cvm.pagerowcount;
#region + cvm.Boards = board.bs
var ht = SetHash(cvm);
ht.Add("bmno", cvm.BM.bmno);
ht.Add("isopen", 1);
@ -112,137 +322,302 @@ namespace NP.FO.Controllers
ht.Add("scc", cvm.scc);
ht.Add("cmno", cvm.croomcmno < 1 ? base.vm.croomcmno : cvm.croomcmno);
cvm.Boards = Dao.Get<Board>("board.bs", ht);
#endregion
cvm.pagetotalcount = GetCount(cvm.Boards.FirstOrDefault());
cvm.pageviewcount = cvm.Boards.Count();
return CView(cvm);
}
public ActionResult BoardView(VMCRoom cvm)
{
ViewBag.croombmno = cvm.croombmno.ToString();
if (SUserInfo.UserNo < 1) { return Redirect("/Account/Index"); }
cvm.Board = Dao.Get<Board>("board.bs", new System.Collections.Hashtable() { { "bno", cvm.BNo }, { "getcontents", 1 } }).First();
if (cvm.Board.issecr == 1 && !(cvm.Board.cno == SUserInfo.UserNo || cvm.Board.pcno == SUserInfo.UserNo)) { return Redirect("/"); }
if (SUserInfo.UserNo < 1)
{
return Redirect("/Account/Index");
}
#region + cvm.Board = board.bs
var p = new Hashtable()
{
{ "bno", cvm.BNo },
{ "getcontents", 1 }
};
cvm.Board = Dao.Get<Board>("board.bs", p).First();
#endregion
if (cvm.Board.issecr == 1 && !(cvm.Board.cno == SUserInfo.UserNo || cvm.Board.pcno == SUserInfo.UserNo))
{
return Redirect("/");
}
if (cvm.Board.cno != SUserInfo.UserNo)
{
#region + board.bd.read
Dao.Save("board.bd.read", cvm.BNo);
#endregion
}
cvm.FileList = new List<File>() { };
if (cvm.Board.fgno != null)
{
cvm.FileList = GetFiles(cvm.Board.fgno.Value);
}
if (cvm.Board.isreply == 1)
{
#region + cvm.BoardCMTs = board.boardcmts
cvm.BoardCMTs = Dao.Get<BoardCMT>("board.boardcmts", cvm.Board.bno);
#endregion
}
return CView(cvm);
}
public ActionResult BoardReg(VMCRoom vm)
{
ViewBag.croombmno = vm.croombmno.ToString();
if (SUserInfo.UserNo < 1) { return Redirect("/Account/Index?ru=" + Request.Url.PathAndQuery); }
if (SUserInfo.UserNo < 1)
{
return Redirect($"/Account/Index?ru={Request.Url.PathAndQuery}");
}
vm.BMOs = new List<BoardMasterOpening>() { };
vm.Board = new Board() { pbno = vm.PBNo };
vm.Board = new Board()
{
pbno = vm.PBNo
};
if (vm.BNo > 0)
{
vm.Board = Dao.Get<Board>("board.bs", new System.Collections.Hashtable() { { "bno", vm.BNo }, { "getcontents", 1 } }).First();
#region + vm.Board = board.bs
var p = new Hashtable()
{
{ "bno", vm.BNo },
{ "getcontents", 1 }
};
vm.Board = Dao.Get<Board>("board.bs", p).First();
#endregion
if (vm.Board.isuseopening == 1)
{
#region + vm.BMOs = board.bmos
vm.BMOs = Dao.Get<BoardMasterOpening>("board.bmos", vm.Board.bmno);
#endregion
}
}
else
{
if ((vm.PBNo ?? 0) > 0)
{
vm.Board.psubject = Dao.Get<Board>("board.bs", new System.Collections.Hashtable() { { "bno", vm.PBNo } }).First().subject;
#region + vm.Board.psubject = "board.bs"
var p = new Hashtable()
{
{ "bno", vm.PBNo }
};
vm.Board.psubject = Dao.Get<Board>("board.bs", p).First().subject;
#endregion
}
vm.BM = Dao.Get<BoardMaster>("board.bms", new System.Collections.Hashtable() { { "bmno", vm.croombmno } }).First();
#region + vm.BM = board.bms
var p2 = new Hashtable()
{
{ "bmno", vm.croombmno }
};
vm.BM = Dao.Get<BoardMaster>("board.bms", p2).First();
#endregion
vm.Board.isreply = vm.BM.isreply;
vm.Board.isuseopening = vm.BM.isuseopening;
vm.Board.bmno = vm.BM.bmno;
if (vm.BM.isuseopening == 1)
{
#region + vm.BMOs = board.bmos
vm.BMOs = Dao.Get<BoardMasterOpening>("board.bmos", vm.BM.bmno);
#endregion
}
}
if (vm.Board.issecr == 1 && vm.Board.cno != SUserInfo.UserNo) { return Redirect("/"); }
if (vm.Board.issecr == 1 && vm.Board.cno != SUserInfo.UserNo)
{
return Redirect("/");
}
vm.FileList = new List<File>() { };
if (vm.Board.fgno != null)
{
vm.FileList = GetFiles(vm.Board.fgno.Value);
}
if (vm.Board.isreply == 1 && vm.Board.bno > 0)
{
#region + vm.BoardCMTs = board.boardcmts
vm.BoardCMTs = Dao.Get<BoardCMT>("board.boardcmts", vm.Board.bno);
#endregion
}
return CView(vm);
}
/// <summary>
/// 강의실 > 시험응시/과제제출
/// </summary>
/// <param name="vm"></param>
/// <returns></returns>
public ActionResult Estimation(VMCRoom vm)
{
vm.Datas = Dao.Get<Data>("cr.myestimation", new System.Collections.Hashtable() { { "lectno", vm.croomlectno },{ "userno", SUserInfo.UserNo },
{"exam"+(vm.tabidx == 0 || vm.tabidx == 1?"":"x"),1 },
{"subject"+(vm.tabidx == 0 || vm.tabidx == 2?"":"x"),1 },
{"discuss"+(vm.tabidx == 0 || vm.tabidx == 3?"":"x"),1 }
});
ViewBag.exCheck = true; // true일때 lms에서 시험내용으로 진입 가능
var lectCheck = Dao.Get<Data>("cr.myExCheck", new System.Collections.Hashtable() { { "lectno", vm.croomlectno }, { "userno", SUserInfo.UserNo } });
if (lectCheck.Count > 0)
#region + vm.Datas = cr.myestimation
var p1 = new Hashtable()
{
{ "lectno", vm.croomlectno },
{ "userno", SUserInfo.UserNo },
{ "exam"+(vm.tabidx == 0 || vm.tabidx == 1 ? "" : "x"), 1 },
{ "subject"+(vm.tabidx == 0 || vm.tabidx == 2 ? "" : "x"), 1 },
{ "discuss"+(vm.tabidx == 0 || vm.tabidx == 3 ? "" : "x"), 1 }
};
vm.Datas = Dao.Get<Data>("cr.myestimation", p1);
#endregion
// true일때 lms에서 시험내용으로 진입 가능
#region + var lectCheck = cr.myExCheck
ViewBag.exCheck = true;
}
else
var p2 = new Hashtable()
{
ViewBag.exCheck = false;
}
{ "lectno", vm.croomlectno },
{ "userno", SUserInfo.UserNo }
};
var lectCheck = Dao.Get<Data>("cr.myExCheck", p2);
#endregion
ViewBag.exCheck = lectCheck.Count > 0 ? true : false;
return CView(vm);
}
public ActionResult EstimationExam(VMCRoom vm)
{
vm.LectEX = Dao.Get<LectEX>("cr.lectex", new System.Collections.Hashtable() { { "lectno", vm.croomlectno },{ "userno", SUserInfo.UserNo },{ "exno", vm.estno} }).First();
String ua = "";
try
string ua = (Request?.UserAgent ?? "").ToLower();
ViewBag.IsPortalAppBrowser = ua.Contains("daumapp") || ua.Contains("naver");
#region + vm.LectEX = cr.lectex
var p = new Hashtable()
{
ua = (Request.UserAgent ?? "").ToLower();
}
catch (Exception ex)
{
ua = "";
}
ViewBag.IsPortalAppBrowser = ua.ToLower().Contains("daumapp") || ua.ToLower().Contains("naver");
{ "lectno", vm.croomlectno },
{ "userno", SUserInfo.UserNo },
{ "exno", vm.estno }
};
vm.LectEX = Dao.Get<LectEX>("cr.lectex", p).First();
#endregion
return CView(vm);
}
public ActionResult Exam(VMCRoom vm)
{
vm.UserExamDatas = Dao.Get<LectEXQ>("cr.userexamdata.start", new System.Collections.Hashtable() { { "lectno", vm.croomlectno}, { "exno", vm.estno },
{ "userno", SUserInfo.UserNo }, { "uip", GetUserIP() },{"uno", SUserInfo.UserNo } });
#region + vm.UserExamDatas = cr.userexamdata.start
var p = new Hashtable()
{
{ "lectno", vm.croomlectno},
{ "exno", vm.estno },
{ "userno", SUserInfo.UserNo },
{ "uip", GetUserIP() },
{"uno", SUserInfo.UserNo }
};
vm.UserExamDatas = Dao.Get<LectEXQ>("cr.userexamdata.start", p);
#endregion
vm.QuestionItems = new List<QuestionItem>();
if (vm.UserExamDatas.Count() > 0 && vm.UserExamDatas.Where(w => w.atype == 0).Count() > 0)
{
vm.QuestionItems = Dao.Get<QuestionItem>("cr.userexamquestionitem.get", new System.Collections.Hashtable() { { "orderby", vm.UserExamDatas.First().israndqi == 1 ? "a.qno, rand()" : "a.qno, a.qino" }, { "qnos", string.Join(",", vm.UserExamDatas.Where(w => w.atype == 0).ToList().Select(s => s.qno)) } });
#region + vm.QuestionItems = cr.userexamquestionitem.get
var p2 = new Hashtable()
{
{ "orderby", vm.UserExamDatas.First().israndqi == 1 ? "a.qno, rand()" : "a.qno, a.qino" },
{ "qnos", string.Join(",", vm.UserExamDatas.Where(w => w.atype == 0).ToList().Select(s => s.qno)) }
};
vm.QuestionItems = Dao.Get<QuestionItem>("cr.userexamquestionitem.get", p2);
#endregion
}
return CView(vm);
}
public ActionResult ExamRecord(VMCRoom vm)
{
vm.LectEX = Dao.Get<LectEX>("lect.lectex.result", new System.Collections.Hashtable() { { "lectno", vm.croomlectno }, { "exno", vm.estno }, { "userno", SUserInfo.UserNo } }).First();
vm.UserExamDatas = Dao.Get<LectEXQ>("lect.lectexq.result", new System.Collections.Hashtable() { { "lectno", vm.croomlectno }, { "exno", vm.estno }, { "userno", SUserInfo.UserNo } });
#region + vm.LectEX = lect.lectex.result
var p = new Hashtable()
{
{ "lectno", vm.croomlectno },
{ "exno", vm.estno },
{ "userno", SUserInfo.UserNo }
};
vm.LectEX = Dao.Get<LectEX>("lect.lectex.result", p).First();
#endregion
#region + vm.UserExamDatas = lect.lectexq.result
p.Clear();
p = new Hashtable()
{
{ "lectno", vm.croomlectno },
{ "exno", vm.estno },
{ "userno", SUserInfo.UserNo }
};
vm.UserExamDatas = Dao.Get<LectEXQ>("lect.lectexq.result", p);
#endregion
#region + vm.QuestionItems = lect.lectexqqi.list
vm.QuestionItems = Dao.Get<QuestionItem>("lect.lectexqqi.list", string.Join(",", vm.UserExamDatas.Select(s => s.qno)));
//정답비률
#endregion
#region + vm.EQs = lect.lectexresult.rightrate ()
vm.EQs = Dao.Get<CMEXQ>("lect.lectexresult.rightrate", string.Join(",", vm.UserExamDatas.Select(s => s.eqno)));
//선택비율
vm.EQs2 = Dao.Get<CMEXQ>("lect.lectexresult.selectrate", new System.Collections.Hashtable() { {"lectno",vm.croomlectno }, { "exno", vm.estno }, { "userno", SUserInfo.UserNo } });
#endregion
#region + vm.EQs2 = lect.lectexresult.selectrate ()
p.Clear();
p = new Hashtable()
{
{ "lectno", vm.croomlectno },
{ "exno", vm.estno },
{ "userno", SUserInfo.UserNo }
};
vm.EQs2 = Dao.Get<CMEXQ>("lect.lectexresult.selectrate", p);
#endregion
return CView(vm);
}
/// <summary>
/// 강의실 > 시험응시/과제제출 > 과제제출 안내 (제출폼)
/// </summary>
/// <param name="vm"></param>
/// <returns></returns>
public ActionResult EstimationSubject(VMCRoom vm)
{
vm.FileList = new List<File>() { };
vm.LectSD = Dao.Get<LectSD>("cr.lectsd", new System.Collections.Hashtable() { { "lectno", vm.croomlectno }, { "userno", SUserInfo.UserNo }, { "sdno", vm.estno } }).First();
var fgnos = "";
#region + vm.LectSD = cr.lectsd
var p = new Hashtable()
{
{ "lectno", vm.croomlectno },
{ "userno", SUserInfo.UserNo },
{ "sdno", vm.estno }
};
vm.LectSD = Dao.Get<LectSD>("cr.lectsd", p).First();
#endregion
string fgnos = "";
if (vm.LectSD.sdfgno != null)
{
fgnos = "," + vm.LectSD.sdfgno.Value.ToString();
@ -251,64 +626,107 @@ namespace NP.FO.Controllers
{
fgnos += "," + vm.LectSD.fgno.Value.ToString();
}
if (fgnos != "")
{
vm.FileList = GetFiles(fgnos.Substring(1));
}
return CView(vm);
}
public ActionResult EstimationDiscuss(VMCRoom vm)
{
vm.FileList = new List<File>() { };
vm.LectSD = Dao.Get<LectSD>("cr.lectsd2", new System.Collections.Hashtable() { { "lectno", vm.croomlectno }, { "userno", SUserInfo.UserNo }, { "sdno", vm.estno } }).First();
#region + vm.LectSD = cr.lectsd2
var p = new Hashtable()
{
{ "lectno", vm.croomlectno },
{ "userno", SUserInfo.UserNo },
{ "sdno", vm.estno }
};
vm.LectSD = Dao.Get<LectSD>("cr.lectsd2", p).First();
#endregion
if (vm.LectSD.sdfgno != null)
{
vm.FileList = GetFiles(vm.LectSD.sdfgno.Value);
}
#region + vm.LectSDBoards = cr.lectsdboards
vm.LectSDBoards = Dao.Get<LectSDBoard>("cr.lectsdboards", vm.LectSD.sdno);
#endregion
return CView(vm);
}
public ActionResult DiscussReg(VMCRoom vm)
{
vm.FileList = new List<File>() { };
//if (vm.BNo < 1)
//{
// vm.LectSD = Dao.Get<LectSD>("cr.lectsd2", new System.Collections.Hashtable() { { "lectno", vm.croomlectno }, { "userno", SUserInfo.UserNo }, { "sdno", vm.estno } }).First();
// if (vm.LectSD.bno > 0)
// {
// vm.BNo = vm.LectSD.bno;
// }
//}
vm.LectSD = Dao.Get<LectSD>("cr.lectsd2", new System.Collections.Hashtable() { { "lectno", vm.croomlectno }, { "userno", SUserInfo.UserNo }, { "sdno", vm.estno } }).First();
#region + vm.LectSD = cr.lectsd2
var p = new Hashtable()
{
{ "lectno", vm.croomlectno },
{ "userno", SUserInfo.UserNo },
{ "sdno", vm.estno }
};
vm.LectSD = Dao.Get<LectSD>("cr.lectsd2", p).First();
#endregion
vm.LectSDBoard = new LectSDBoard() { };
if (vm.BNo > 0)
{
//vm.LectSD = Dao.Get<LectSD>("cr.lectsd2", new System.Collections.Hashtable() { { "lectno", vm.croomlectno }, { "userno", SUserInfo.UserNo }, { "sdno", vm.estno } }).First();
if (vm.LectSD.bno > 0)
vm.BNo = vm.LectSD.bno > 0 ? vm.LectSD.bno : vm.BNo;
#region + vm.LectSDBoard = cr.lectsdboard
p.Clear();
p = new Hashtable()
{
vm.BNo = vm.LectSD.bno;
}
vm.LectSDBoard = Dao.Get<LectSDBoard>("cr.lectsdboard", new System.Collections.Hashtable() { { "bno", vm.BNo }, { "userno", SUserInfo.UserNo } }).First();
{ "bno", vm.BNo },
{ "userno", SUserInfo.UserNo }
};
vm.LectSDBoard = Dao.Get<LectSDBoard>("cr.lectsdboard", p).First();
#endregion
if (vm.LectSDBoard.cno != SUserInfo.UserNo)
{
return RedirectToAction("/CRoom/Esitimation?" + base.vm.croomparam);
}
if (vm.LectSDBoard.fgno != null)
{
vm.FileList = GetFiles(vm.LectSDBoard.fgno.Value);
}
}
return CView(vm);
}
public ActionResult DiscussView(VMCRoom vm)
{
vm.FileList = new List<File>() { };
vm.LectSDBoard = Dao.Get<LectSDBoard>("cr.lectsdboard", new System.Collections.Hashtable() { { "bno", vm.BNo },{"userno", SUserInfo.UserNo } }).First();
#region + vm.LectSDBoard = cr.lectsdboard
var p = new Hashtable()
{
{ "bno", vm.BNo },
{ "userno", SUserInfo.UserNo }
};
vm.LectSDBoard = Dao.Get<LectSDBoard>("cr.lectsdboard", p).First();
#endregion
if (vm.LectSDBoard.fgno != null)
{
vm.FileList = GetFiles(vm.LectSDBoard.fgno.Value);
}
#region + vm.BoardCMTs = cr.lectsdboardcmt
vm.BoardCMTs = Dao.Get<BoardCMT>("cr.lectsdboardcmt", vm.LectSDBoard.bno);
#endregion
return CView(vm);
}

View File

@ -1627,13 +1627,13 @@ namespace NP.FO.Controllers
case CourseType.:
{
courseInfo.CourseInfos.Add(new CourseInfo() { cname = "품질관리 전문교육(특급)", cmno = 1054 });
courseInfo.CourseInfos.Add(new CourseInfo() { cname = "건설기술인 기본교육", cmno = 872 });
courseInfo.CourseInfos.Add(new CourseInfo() { cname = "건설사업관리기술인교육", cmno = 1052 });
//courseInfo.CourseInfos.Add(new CourseInfo() { cname = "건설기술인 기본교육", cmno = 872 });
//courseInfo.CourseInfos.Add(new CourseInfo() { cname = "건설사업관리기술인교육", cmno = 1052 });
courseInfo.CourseInfos.Add(new CourseInfo() { cname = "품질관리기술인교육", cmno = 1050 });
courseInfo.CourseInfos.Add(new CourseInfo() { cname = "설계시공기술인교육", cmno = 1048 });
courseInfo.CourseInfos.Add(new CourseInfo() { cname = "건설정책역량강화교육", cmno = 1046 });
courseInfo.CourseInfos.Add(new CourseInfo() { cname = "전문분야교육", cmno = 870 });
courseInfo.CourseInfos.Add(new CourseInfo() { cname = "특성화전문교육", cmno = 869 });
//courseInfo.CourseInfos.Add(new CourseInfo() { cname = "설계시공기술인교육", cmno = 1048 });
//courseInfo.CourseInfos.Add(new CourseInfo() { cname = "건설정책역량강화교육", cmno = 1046 });
//courseInfo.CourseInfos.Add(new CourseInfo() { cname = "전문분야교육", cmno = 870 });
//courseInfo.CourseInfos.Add(new CourseInfo() { cname = "특성화전문교육", cmno = 869 });
courseInfo.CourseInfos.Add(new CourseInfo() { cname = "품질관리 초급 전문교육(직무분야 교육)", cmno = 868 });
courseInfo.CourseInfos.Add(new CourseInfo() { cname = "품질관리 최초 전문교육(직무분야 교육)", cmno = 867 });
courseInfo.CourseInfos.Add(new CourseInfo() { cname = "품질관리 특급 전문교육(직무분야 교육)", cmno = 937 });

View File

@ -1,14 +1,9 @@
using System;
using NP.Model;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Collections;
using NP.Model;
using NP.Base;
using System.Web.Routing;
using System.Security.Cryptography;
using System.Text;
namespace NP.FO.Controllers
{
@ -31,29 +26,77 @@ namespace NP.FO.Controllers
ViewBag.ismain = true;
}
}
/// <summary>
/// 마이페이지 > 나의강의실 > 홈
/// </summary>
/// <param name="vm"></param>
/// <returns></returns>
public ActionResult Index(VMMy vm)
{
ViewBag.mpgContclass = "";
vm.Assign = Dao.Get<Assign>("users.users.assign", new System.Collections.Hashtable() { { "userno", SUserInfo.UserNo } }).FirstOrDefault();
//신청중,수강중,나의할일,나의알림
vm.Datas = Dao.Get<Data>("lect.mydata", SUserInfo.UserNo).Where(x => x.time2 >= DateTime.Now).ToList(); //수강종료일이 지난건 노출하지않도록
#region + vm.Assign = users.users.assign
var p = new Hashtable() {
{ "userno", SUserInfo.UserNo }
};
vm.Assign = Dao.Get<Assign>("users.users.assign", p).FirstOrDefault();
#endregion
#region + vm.Datas = lect.mydata
// 신청중,수강중,나의할일,나의알림
vm.Datas = Dao.Get<Data>("lect.mydata", SUserInfo.UserNo)
.Where(x => x.time2 >= DateTime.Now)
.ToList(); //수강종료일이 지난건 노출하지않도록
#endregion
var sd = Request.Url.Host.Split('.')[0];
if (GetConfig("isdevtest") != "" && !Request.Url.Host.Contains("118.219.255.") && Request.Url.Host != "cte.nptc.kr" && Request.Url.Host != "ynicte.nptc.kr" && Request.Url.Host != "222.122.63.91" && MainSubDomain.ToUpper() != sd.ToUpper())
{
vm.Boards = Dao.Get<Board>("board.bs.forassign", new System.Collections.Hashtable() { { "subdomain", sd }, { "limit", 2 },{ "isdefault",3} });
#region + vm.Boards = board.bs.forassign
var p2 = new Hashtable()
{
{ "subdomain", sd },
{ "limit", 2 },
{ "isdefault", 3 }
};
vm.Boards = Dao.Get<Board>("board.bs.forassign", p2);
#endregion
}
vm.CMs = new List<CM>() { };
if (vm.Datas.Where(w=>w.dtype == 1).Count() < 1 && !Request.Url.Host.Contains("118.219.255.") && Request.Url.Host != "222.122.63.91" && Request.Url.Host.Split('.')[0].ToUpper() == MainSubDomain.ToUpper())
{
//신청중인강좌 없고 고객사사이트가 아니면 수강완료한 강좌 중 후행과정 -> 선행과정 -> 직급추천과정 2개 출력
#region + vm.CMs = lect.myrecomm
// 신청중인강좌 없고 고객사사이트가 아니면 수강완료한 강좌 중 후행과정 -> 선행과정 -> 직급추천과정 2개 출력
vm.CMs = Dao.Get<CM>("lect.myrecomm", SUserInfo.UserNo);
#endregion
}
//20220803
vm.Lects = Dao.Get<Lect>("lect.mylectures", new System.Collections.Hashtable() { { "userno", SUserInfo.UserNo }, { "cgcode", vm.intval > 0 ? TestCode3 : null }, { "cshape", vm.stringval } });
#region + vm.Lects = lect.mylectures
var p3 = new Hashtable()
{
{ "userno", SUserInfo.UserNo },
{ "cgcode", vm.intval > 0 ? TestCode3 : null },
{ "cshape", vm.stringval }
};
vm.Lects = Dao.Get<Lect>("lect.mylectures", p3);
#endregion
#region + vm.CRoomLectSdInfo = cr.lectsdinfo
// 사용자의 과제정보
var p4 = new Hashtable()
{
{ "userno", SUserInfo.UserNo },
{ "iscurlect", true },
};
vm.CRoomLectSdInfo = Dao.Get<CRoomLectSdInfo>("cr.lectsdinfo", p4);
#endregion
foreach (var item in vm.Datas)
{
//time5 = lect.sdate / time6 = lect.edate / pstatus=intval4
// time5 = lect.sdate / time6 = lect.edate / pstatus=intval4
if (item.intval4 == 22)
{
item.lectStatus = "미입금";
@ -61,29 +104,20 @@ namespace NP.FO.Controllers
else
{
// 입금상태
if(item.time5 > DateTime.Now)
if (item.time5 > DateTime.Now)
{
item.lectStatus = "입교확정";
}
else if(item.time5 <= DateTime.Now && item.time2 >= DateTime.Now )
else if (item.time5 <= DateTime.Now && item.time2 >= DateTime.Now)
{
item.lectStatus = "교육진행중";
}
/*else if (item.time6 < DateTime.Now)
{
if (item.iscomplete == null || item.iscomplete == 0)
{
item.lectStatus = "미수료";
}
else
{
item.lectStatus = "수료";
}
}*/
}
}
return View(vm);
}
public ActionResult BoardList(VMCC vm)
{
vm.BM = Dao.Get<BoardMaster>("board.bms.forassign", new System.Collections.Hashtable() { { "subdomain", Request.Url.Host.Split('.')[0] }, {"isdefault", 3 } }).First();

View File

@ -222,6 +222,13 @@
<Content Include="css\examcommon.css" />
<Content Include="css\exam\base.css" />
<Content Include="css\exam\button.css" />
<Content Include="css\jquery-ui-1.12.1\images\ui-icons_444444_256x240.png" />
<Content Include="css\jquery-ui-1.12.1\images\ui-icons_555555_256x240.png" />
<Content Include="css\jquery-ui-1.12.1\images\ui-icons_777620_256x240.png" />
<Content Include="css\jquery-ui-1.12.1\images\ui-icons_777777_256x240.png" />
<Content Include="css\jquery-ui-1.12.1\images\ui-icons_cc0000_256x240.png" />
<Content Include="css\jquery-ui-1.12.1\images\ui-icons_ffffff_256x240.png" />
<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\mainpopup.css" />
@ -529,10 +536,12 @@
<Content Include="js\bootstrap.js" />
<Content Include="js\examcommon.js" />
<Content Include="js\exam.js" />
<Content Include="js\jquery-ui.min.js" />
<Content Include="js\jquery.mmenu.js" />
<Content Include="js\kakao.js" />
<Content Include="js\moment.js" />
<Content Include="js\naveridlogin_js_sdk_2.0.0.js" />
<Content Include="js\polyfill.min.js" />
<Content Include="js\study.js" />
<Content Include="js\jquery-1.8.3.min.js" />
<Content Include="js\croom.js" />
@ -544,6 +553,8 @@
<Content Include="js\slick.min.js" />
<Content Include="js\sly.min.js" />
<Content Include="js\summernote.js" />
<Content Include="js\video.js" />
<Content Include="js\videojs-ie8.min.js" />
<Content Include="Spring\ControllersStaging.xml">
<SubType>Designer</SubType>
</Content>

View File

@ -42,8 +42,6 @@
<tbody>
@foreach (var d in Model.Datas.Where(w => w.dtype > -1))
{
<tr>
<th>
@*
@ -123,9 +121,57 @@
else
{
// 과제 등...
// 조건 분리 @(d.intval4 == 1 ? 4 : d.intval3 == 1 ? 3 : d.intval3 == 0 && d.intval >= d.intval2 ? 2 : 1)
int evaStatus;
if (d.intval4 == 1)
{
evaStatus = 4;
}
else if (d.intval3 == 1)
{
evaStatus = 3;
}
else
{
evaStatus = (d.intval3 == 0 && d.intval >= d.intval2) ? 2 : 1;
}
// 조건 분리 evaType@(d.intval4 == 1 ? "04" : d.intval3 == 1 ? "03" : d.intval3 == 0 && d.intval >= d.intval2 ? "02" : "01")
string evaTypeCss;
if (d.intval4 == 1)
{
evaTypeCss = "evaType04";
}
else if (d.intval3 == 1)
{
evaTypeCss = "evaType03";
}
else
{
evaTypeCss = (d.intval3 == 0 && d.intval >= d.intval2) ? "evaType02" : "evaType01";
}
// 조건 분리 @(d.intval4 == 1 ? "[평가완료]" : d.intval3 == 1 ? "[참여완료]" : d.intval3 == 0 && d.intval >= d.intval2 ? "[참여가능]" : "[참여불가]")
string statusText;
if (d.intval4 == 1)
{
statusText = "[평가완료]";
}
else if (d.intval3 == 1)
{
statusText = "[참여완료]";
}
else
{
statusText = (d.intval3 == 0 && d.intval >= d.intval2) ? "[참여가능]" : "[참여불가]";
}
<td>
<a href="javascript:;" onclick="eva(@d.dtype, @d.intval10, @(d.intval4 == 1 ? 4 : d.intval3 == 1 ? 3 : d.intval3 == 0 && d.intval >= d.intval2 ? 2 : 1))"
class="evaType@(d.intval4 == 1 ? "04" : d.intval3 == 1 ? "03" : d.intval3 == 0 && d.intval >= d.intval2 ? "02" : "01")">@(d.intval4 == 1 ? "[평가완료]" : d.intval3 == 1 ? "[참여완료]" : d.intval3 == 0 && d.intval >= d.intval2 ? "[참여가능]" : "[참여불가]")</a>
<a href="javascript:;" onclick="eva(@d.dtype, @d.intval10, @evaStatus)" class="@evaTypeCss">
<text>@statusText</text>
</a>
</td>
}
</tr>
@ -188,19 +234,40 @@
* @@param a {event} - e
*/
function gotab(idx, a) {
if (!$(a).parent().hasClass("current")){
if (!$(a).parent().hasClass("current")) {
setv("tabidx", idx);
submit();
}
}
@*
/**
* 평가, 과제 참여
* @param type {number} - 유형 (과제,시험)
* @param no
* @param status {number} - 상태
*/ *@
function eva(type, no, status) {
if (status == 1) {
msg("진도율 조건에 맞지않거나 수강일이 종료되어 참여하실 수 없습니다.");
}
else {
let typeString;
if (type < 2) {
typeString = "Exam";
}
else if (type == 2) {
typeString = "Subject";
}
else {
typeString = "Discuss";
}
let submitUrl = `/CRoom/Estimation${typeString}`;
setv("estno", no);
$("#mform").attr("action", "/CRoom/Estimation" + (type < 2 ?"Exam":type==2?"Subject":"Discuss")).submit();
$("#mform").attr("action", submitUrl).submit();
}
}
</script>

View File

@ -8,10 +8,6 @@
<dd>
<table class="evaDetail">
<tbody>
@*<tr>
<th>과제회차</th>
<td>1회</td>
</tr>*@
<tr>
<th>과제제목</th>
<td>@Model.LectSD.sdname</td>
@ -48,11 +44,6 @@
<dd>
<table>
<tbody>
@*<tr>
<td colspan="2" class="teskTxt">
<textarea name="atext" id="atext" cols="30" rows="10" class="teskTxt">@(Model.LectSD.atext??"")</textarea>
</td>
</tr>*@
<tr>
<td colspan="2">
<div class="teskFilex">
@ -87,28 +78,39 @@
@Html.HiddenFor(m => m.tabidx)
@Html.HiddenFor(m => m.estno)
</form>
@section scriptsHeader{
@Html.Partial("./Partial/filescript")
}
@section scripts{
<script>
$(document).ready(function () {
});
function save() {
if (getBytes(val("atext")) < 1 && $("input[name=file1]").val() == "") {
msg("첨부된 파일이 없습니다.과제를 업로드 후 제출 버튼을 눌러주세요.");
} else {
}
else {
confirmtoggle(true, "제출하시겠습니까?", "savego()");
}
}
function savego() {
capfileform("/fcommon/subjectsave", "sform", "cbsave");
capfileform(
"/fcommon/subjectsave",
"sform",
"cbsave");
}
function cbsave() {
if (capResult.code == 1000) {
msg("저장되었습니다.", null, null, null, "submit()");
} else {
}
else {
msg("운영자에게 문의해주세요.");
}
}
@ -117,27 +119,39 @@
if (capResult.code == 1000) {
var ul = $(_filedela).closest("ul");
$(_filedela).closest("li").remove();
if ($(ul).find("li input.file").length + $(ul).find("li a.file").length < getint($(ul).attr("data-filecount"))) {
$(ul).append("<li><input type=\"file\" class=\"file\" name=\"" + $(ul).attr("data-fname") + "\" accept=\"media_type\" onchange=\"filechange(this)\" /><a href=\"#\" class=\"filedel\" onclick=\"filedel(0, this)\">삭제</a></li>");
}
var empli = false;
$.each($(ul).find("li"), function (i, li) {
if ($(li).find("input.file").val() == "") {
if (empli) {
$(li).addClass("delme");
} else {
}
else {
empli = true;
}
}
});
$(ul).find("li.delme").remove();
let sdno = @(Model.LectSD.sdno);
let lectno = @(Model.LectSD.lectno);
capp("/fcommon/delfileOk", { lectno: lectno, sdno: sdno });
}
}
capp(
"/fcommon/delfileOk",
{
lectno: lectno,
sdno: sdno
}
);
}
}
</script>
}

View File

@ -18,11 +18,9 @@
<tr>
<th>구분</th>
<th>진도율</th>
@*<th>진행평가</th>*@
<th>최종평가</th>
<th>과제평가</th>
<th style="display:@(Model.Lect.isoffabs == 1 ? "" : "none")">집체교육(7h)</th>
@*<th>토론평가</th>*@
<th>총점</th>
</tr>
</thead>
@ -30,28 +28,17 @@
<tr>
<td>나의성적</td>
<td>@(Model.Lect.attrate)%</td>
@*<td>@(Model.Lect.ex0lectpoint)점</td>*@
<td>@(Model.Lect.ex1lectpoint)점</td>
<td>@(Model.Lect.sd0lectpoint)점</td>
<td style="display:@(Model.Lect.isoffabs == 1 ? "" : "none")">@(Model.Lect.istatus == 2 ? "출석완료" : "-")</td>
@*<td>@(Model.Lect.sd1lectpoint)점</td>*@
<td style="color:#ff0000;">@(Model.Lect.apoint + Model.Lect.mpoint + Model.Lect.fpoint + Model.Lect.spoint + Model.Lect.dpoint)점</td>
@*<td>@(Model.Lect.attrate)%(@(Model.Lect.apoint)점)</td>
<td>@(Model.Lect.mpoint)점</td>
<td>@(Model.Lect.fpoint)점</td>
<td>@(Model.Lect.spoint)점</td>
<td>@(Model.Lect.dpoint)점</td>
<td style="color:#ff0000;">@(Model.Lect.apoint + Model.Lect.mpoint + Model.Lect.fpoint + Model.Lect.spoint + Model.Lect.dpoint)점</td>*@
</tr>
<tr>
<td>수료기준</td>
<td>@(Model.Lect.acut)%이상</td>
@*<td>@(Model.Lect.mcut)점이상</td>*@
<td>@(Model.Lect.fcut)점이상</td>
<td>@(Model.Lect.scut)점이상</td>
<td style="display:@(Model.Lect.isoffabs == 1 ? "" : "none")">집체교육 참석(7h)</td>
@*<td>@(Model.Lect.dcut)점이상</td>*@
<td style="color:#ff0000;">@(Model.Lect.cut)점이상</td>
</tr>
<tr style="display:none;">
@ -167,7 +154,7 @@
<div class="lctcHalf">
<div>
<div class="lctcList" style="height:200px;">
<h5>최근게시글 @*<a href="#">더보기</a>*@</h5>
<h5>최근게시글</h5>
<ul>
@foreach (var d in Model.Datas.Where(w => w.dtype == 100))
{
@ -188,11 +175,11 @@
{
if (d.intval == 2)
{
<li><a href="#" style="cursor: default"><p>[출석] @(d.intval2)차시<span>(@(d.strval3)까지)</span></p></a></li>
<li><a href="javascript:;" style="cursor: default"><p>[출석] @(d.intval2)차시<span>(@(d.strval3)까지)</span></p></a></li>
}
else
{
<li><a href="#" style="cursor: default"><p>[@(d.intval == 3 ? (d.intval4 == 0 ? "진행평가" : "최종평가") : d.intval == 4 ? "과제" : "토론")] @(d.intval == 3 ? "응시" : d.intval == 4 ? "제출" : "참여")<span>(@d.time2.ToString("MM/dd")까지)</span></p></a></li>
<li><a href="javascript:;" style="cursor: default"><p>[@(d.intval == 3 ? (d.intval4 == 0 ? "진행평가" : "최종평가") : d.intval == 4 ? "과제" : "토론")] @(d.intval == 3 ? "응시" : d.intval == 4 ? "제출" : "참여")<span>(@d.time2.ToString("MM/dd")까지)</span></p></a></li>
}
}
@if (Model.Datas.Where(w => w.dtype < 100).Count() < 1)
@ -204,7 +191,19 @@
</div>
</div>
<div class="lctcWeek">
<h5>오늘 시청 가능한 10개 차시 중 (@Model.intval/@Model.intval2)를 수강하셨습니다. <a href="/CRoom/Innings?@Model.croomparam">수강 중인 강의 모두 보기</a></h5>
@{
string lectInningsTitle = string.Empty;
if (Model.Lect.attrate < 100)
{
lectInningsTitle = string.Format("오늘 시청 가능한 10개 차시 중 ({0}/{1})를 수강하셨습니다.", Model.intval, Model.intval2);
}
else
{
lectInningsTitle = "&nbsp;&nbsp;&nbsp;&nbsp;";
}
}
<h5>@Html.Raw(lectInningsTitle) <a href="/CRoom/Innings?@Model.croomparam">수강 중인 강의 모두 보기</a></h5>
<table>
<tbody>
@foreach (var d in Model.LectInnings)
@ -221,7 +220,6 @@
{
<dl>
<dt>@(d.edate < DateTime.Now ? "학습기간종료" : d.isonline == 0 && d.istatus == 2 ? "출석완료" : d.isonline == 0 && d.idate < DateTime.Now ? "결석" : d.isonline == 0 ? "출석전" : d.stime == null ? "학습전(0%)" : d.istatus == 2 ? "학습완료" : string.Format("학습중({0}%)", d.sttime > 0 ? (d.totstudy * 100 / (d.sttime * 60)) : 0))</dt>
@*<dt style="color:#888888"><span style="color:red;">@(d.isonline == 0 ? (d.cshape != 2 ? "강의시작일" : "집체교육") : "교육기간")</span> : @(d.isonline == 0 ? (d.cshape != 2 ? string.Format("{0} {1}:{2}", d.idate.ToString("MM/dd"), d.ist.Substring(0, 2), d.ist.Substring(2, 2)) : d.eend.ToString("MM/dd")) :d.cshape != 1 ? d.cdt.ToString("MM/dd")+" ~ "+d.estart.ToString("MM/dd") : (d.sdate.ToString("MM/dd") + " ~ " + d.edate.ToString("MM/dd")))</dt>*@
<dt style="color:#888888"><span style="color:red;">@(d.isonline == 0 ? (d.cshape != 2 ? "강의시작일" : "집체교육") : "교육기간")</span> : @(d.isonline == 0 ? (d.cshape != 2 ? string.Format("{0} {1}:{2}", d.idate.ToString("MM/dd"), d.ist.Substring(0, 2), d.ist.Substring(2, 2)) : d.eend.ToString("MM/dd")) :(d.sdate.ToString("MM/dd") + " ~ " + d.edate.ToString("MM/dd")))</dt>
@if (d.cshape != 1 && d.isonline == 1)
{
@ -256,7 +254,7 @@
<li class="lctc2">
@if (d.isonline == 1)
{
if(!isplay)
if (!isplay)
{
if (d.isseq == 1 && d.iseq != 1 && d.preistatus < 2)
@ -273,7 +271,7 @@
preflag = 1;
}
//학습기간 종료후에도 시청은 가능하고, 출석인정은 되지않도록 변경 2021-01-25
<a href="#" onclick="playerOpen(@d.cmino, @(d.sdate < DateTime.Now && d.edate.AddYears(1) > DateTime.Now ? 1 : 0), @(preflag), @(d.istatus != 2 && Model.intval >= d.daylectinninglimit ? 0 : 1), @(d.daylectinninglimit));" class="lctcStdy">학습하기</a>
<a href="javascript:;" onclick="playerOpen(@d.cmino, @(d.sdate < DateTime.Now && d.edate.AddYears(1) > DateTime.Now ? 1 : 0), @(preflag), @(d.istatus != 2 && Model.intval >= d.daylectinninglimit ? 0 : 1), @(d.daylectinninglimit));" class="lctcStdy">학습하기</a>
}
</li>
</ul>
@ -307,7 +305,6 @@
} else {
_cmino = cmino;
chkcontent();
@*viewcontents(cmino, false, @Model.croomlectno);*@
}
}
function chkcontent() {
@ -331,7 +328,6 @@
confirmtoggle(true, "학습을 처음 시작할 때 본인인증이 필요합니다. 본인인증은 회차 당 1회에 한 해 진행됩니다.<br/> 본인인증을 하시겠습니까?", "chkmobile()");
}
// ### 모바일 인증 중단 처리
// viewcontents(_cmino, false,@Model.croomlectno);
}
} else {
msg("휴대폰 번호가 공란입니다.<br/>정보수정을 통해 번호를 입력해주세요.");
@ -353,7 +349,6 @@
}
function cbchkmobile() {
if (capResult.code == 1000) {
//msg("인증이 성공하였습니다.\n 확인 버튼을 클릭하시면 학습이 가능합니다.");
$("#mobile").css("background", "#ddd");
mobilechkclose();
viewcontents(_cmino, false,@Model.croomlectno);

View File

@ -26,21 +26,22 @@
</script>
}
@*<div class="lrnSch">
<a href="#" onclick="showatt()">출결이력조회</a>
</div>*@
<!-- info -->
<div class="lctcScore" style="text-align:center; background:#ffdfdf;">
<span>현재 오늘 학습 가능한 10회차 중 <span style="color:red;">@(Model.intval2 - Model.intval)</span>회차 학습가능 합니다.</span><br />
<span>※ 관련 법령에 의해 일일 최대 학습시간은 학습중인 모든 과정에 대하여 10시간(10회차)입니다.</span>
</div>
@*<h3>오늘의 학습회차(@Model.intval/@Model.intval2)</h3>*@
<br />
<!-- // info -->
<div class="lctcWeek lrnList">
<input type="hidden" id="mobile" name="mobile" value="@(ViewBag.Mobile)" />
<table>
<tbody>
@foreach (var d in Model.LectInnings)
{
// d.istatus == 2 가 학습완료다
<tr>
<th style="display:none;"><em style="background:url(@(d.isonline == 0 ? "/img/lecture/week_thumb02.jpg" : (string.IsNullOrEmpty(d.tasteurl)?"/img/lecture/week_thumb01.jpg":(Model.Files + d.tasteurl))))no-repeat center center"></em></th>
<td>
@ -103,8 +104,9 @@
{
preflag = 1;
}
//학습기간 종료후에도 시청은 가능하고, 출석인정은 되지않도록 변경 2021-01-25
<a href="#" onclick="playerOpen(@d.cmino, @(d.sdate < DateTime.Now && d.edate.AddYears(1) > DateTime.Now ? 1 : 0), @(preflag), @(d.istatus != 2 && Model.intval >= d.daylectinninglimit ? 0 : 1), @(d.daylectinninglimit));" class="lctcStdy">학습하기</a>
<a href="javascript:;" onclick="playerOpen(@d.cmino, @(d.sdate < DateTime.Now && d.edate.AddYears(1) > DateTime.Now ? 1 : 0), @(preflag), @(d.istatus != 2 && Model.intval >= d.daylectinninglimit ? 0 : 1), @(d.daylectinninglimit));" class="lctcStdy">학습하기</a>
}
</li>
</ul>
@ -187,75 +189,101 @@
</div><!-- clsPopWrap -->
</div>
</div>
</div>
@Html.Partial("./Partial/MobileChk", null, new ViewDataDictionary { { "bindmethod", "cbchkmobile" } })
@Html.Partial("./Partial/OkCert3", null, new ViewDataDictionary { })
@section scriptsHeader{
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="~/js/jquery-ui.min.js"></script>
<link href="~/css/jquery-ui-1.12.1/jquery-ui.min.css" rel="stylesheet" />
}
@section scripts{
<script>
var _cmino = 0;
var _authplatform = 0;
$(document).ready(function () {
$("body").on("click", ".atdOpen", function () {
var atdNum = $(this).attr('atdOpen');
if ($(this).is('.on')) {
$('.atdOpen').removeClass('on');
$('.atdDown').css('display', 'none');
} else {
}
else {
$('.atdOpen').removeClass('on');
$('.atdDown').css('display', 'none');
$(this).addClass('on');
$('.atdDown' + atdNum).css('display', 'table-row');
}
});
$('.datepicker').datepicker({ dateFormat: 'yy-mm-dd' });
});
function playerOpen(cmino, timeflag, preflag, notoverflag, daylectinninglimit) {
if (timeflag < 1) {
msg("학습기간이 아닙니다.");
} else if (preflag < 1) {
}
else if (preflag < 1) {
msg("이전 회차 학습을 완료한 이후 학습이 가능합니다.");
} else if (notoverflag < 1) {
}
else if (notoverflag < 1) {
msg("관련 법령에 의해 일일 최대 학습가능한 시간은 10시간(10차시)입니다.");
} else {
}
else {
_cmino = cmino;
chkcontent();
//viewcontents(cmino, false, @Model.croomlectno);
}
}
function chkcontent() {
capp("/fcommon/attcertcheckforlectinning", {lectno : @Model.croomlectno, cmino : _cmino}, "cbchkcontent");
capp(
"/fcommon/attcertcheckforlectinning",
{
lectno: @Model.croomlectno
, cmino: _cmino
},
"cbchkcontent"
);
}
function cbchkcontent() {
if (capResult.code == 1000) {
if (capResult.obj == 1) {
msg("학습을 시작합니다.", null, null, null, "viewcontents("+_cmino+",false,@(Model.croomlectno))");
return false;
//viewcontents(_cmino, false,@Model.croomlectno);
} else if (capResult.obj == 2) {
}
else if (capResult.obj == 2) {
msg("학습을 시작합니다.", null, null, null, "viewcontents("+_cmino+",false,@(Model.croomlectno))");
return false;
//viewcontents(_cmino, false,@Model.croomlectno);
} else {
}
else {
_authplatform = capResult.msg;
// ### 모바일 인증 처리
if(_authplatform == "0"){
if (_authplatform == "0"){
msg("학습인증수단이 없는 회원입니다. 정보수정을 통해 학습인증수단을 입력해주세요.");
} else if (_authplatform == "1") {
}
else if (_authplatform == "1") {
confirmtoggle(true, "학습을 처음 시작할 때 본인인증이 필요합니다. 본인인증은 회차 당 1회에 한 해 진행됩니다.<br/> 본인인증을 하시겠습니까?", "chkipin()");
} else if (_authplatform == "2") {
}
else if (_authplatform == "2") {
confirmtoggle(true, "학습을 처음 시작할 때 본인인증이 필요합니다. 본인인증은 회차 당 1회에 한 해 진행됩니다.<br/> 본인인증을 하시겠습니까?", "chkmobile()");
}
// ### 모바일 인증 중단 처리
//msg("학습을 시작합니다.", null, null, null, "viewcontents("+_cmino+",false,@(Model.croomlectno))");
}
} else {
}
else {
msg("휴대폰 번호가 공란입니다.<br/>정보수정을 통해 번호를 입력해주세요.");
}
}
function chkipin() {
certok3reqview('IPIN', 'LectinningAuth', @Model.croomlectno, _cmino);
bglayer(false);
@ -272,12 +300,10 @@
}
function cbchkmobile() {
if (capResult.code == 1000) {
//msg("인증이 성공하였습니다.\n 확인 버튼을 클릭하시면 학습이 가능합니다.");
$("#mobile").css("background", "#ddd");
mobilechkclose();
msg("학습을 시작합니다.", null, null, null, "viewcontents("+_cmino+",false,@(Model.croomlectno))");
return false;
//viewcontents(_cmino, false,@Model.croomlectno);
} else if (capResult.code == 1) {
msg("유효시간이 만료되었습니다.\n 창을 닫고 인증을 다시 진행해주세요.");
} else {

View File

@ -298,7 +298,7 @@
</div>
@section scriptsHeader{
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script src="~/js/jquery-ui.min.js"></script>
<style>
.mainTab li:after {
content: none;

View File

@ -13,7 +13,7 @@
{
<div class="mpgPtnr">
<div class="lctcList">
<h5>공지사항 <a href="/My/BoardList?master=my">더보기</a></h5>
<h5>공지사항<a href="/My/BoardList?master=my">더보기</a></h5>
<ul>
@if (Model.Boards.Count() < 1)
{
@ -34,7 +34,6 @@
<div class="mpgDsc">
<ul>
<li><b>회사명 : </b>@Model.Assign.asname</li>
@*<li><b>연락처(이메일) : </b>@(Model.Assign.mphone) @(Model.Assign.taxemail == null ? "" : "(" + Model.Assign.taxemail + ")")</li>*@
</ul>
@if (Model.Assign.status == 1)
{
@ -72,11 +71,7 @@
<b>@d.strval</b>
</h5>
<dl>
@*<dt class="mpglSta3">@(d.time2 > DateTime.Now ? "진행중" : "종료")</dt>*@
@*<dt class="mpglSta@(d.intval5 == 0 && d.intval4 == 1 ? 3 : 1)">@(d.intval5 == 1 ? "환불요청" : d.intval4 == 1 ? "결제완료" : d.intval4 == 21 ? "결제대기" : d.intval4 == 22 ? "미입금" : d.intval4 == 51 ? "심사중" : d.intval4 == 55 ? "승인대기" : "")</dt>*@
@* <dt class="@(d.pstatus == 1 && d.rfdstatus < 1 ? "ltaDlbk":"ltaDlred")">@(d.pstatus == 55 ? "승인대기" : d.pstatus == 51 ? "심사중" : d.pstatus == 21 ? "결제대기" : d.pstatus == 22 ? "미입금" : d.pstatus == 1 && d.rfdstatus > 0 ? "환불요청" : d.pstatus == 1 ? "결제완료" : d.rstatus == 1 ? "부분환불" : d.rstatus == 2 ? "전액환불" : "-")</dt>*@
<dt class="mpglSta3">@d.lectStatus</dt>
@*<dt style="color:#888888">교육기간 : @(d.intval3 == 1 ? d.time.ToString("yy-MM-dd") : d.time5.ToString("yy-MM-dd")) ~ @(d.intval3 == 1 ? d.time2.ToString("yy-MM-dd") : d.time3.ToString("yy-MM-dd"))</dt>*@
<dt style="color:#888888">교육기간 : @(d.time.ToString("yyyy년 MM월 dd일")) ~ @(d.time2.ToString("yyyy년 MM월 dd일"))</dt>
@if (d.intval3 != 1)
{
@ -84,12 +79,6 @@
}
<dt style="color:black;">@d.studytime<span>시간과정</span></dt>
@Html.Raw(d.intval6 == 1 ? "<span class=\"grn\" style='color: red;'>환급과정</span>" : "<span class=\"grn\" style='color: red;'>비환급과정</span>")
@* <dd>복습기간 : @(d.time2.AddYears(1).ToString("yy-MM-dd"))</dd>*@
@* @if (false && d.intval3 == 2 && d.time3 > Convert.ToDateTime("1900-01-01"))
{
<dd>집체교육 : @d.time3.ToString("yy/MM/dd")</dd>
}*@
</dl>
</a>
@ -163,8 +152,6 @@
strUrl = "/My/PayInfo?payno=" + d.longval2;
}
}
@*<a href="@(d.intval5 != 1 && d.intval4 == 1 && d.intval8 == 1 ? "/CRoom/Index?croomlectno=" + d.longval : d.intval5 != 1 && d.intval4 == 1 && d.intval8 == 0
? "/My/Ready" : d.intval5 != 1 && d.intval4 == 51 ? "/Course/ApplyPay" : d.intval5 != 1 && d.intval4 == 21 ? "/Course/ApplyPay?payno=" + d.longval2 : "/My/PayInfo?payno=" + d.longval2)" class="gocroom">*@
<a href="#" onclick="gopaies1()" data-cshape=@d.intval3 class="gocroom">
<h5>
<span class="@(d.intval3 == 0 ? "org" : d.intval3 == 1 ? "nav_grn" : "nav_blu")">@(d.intval3 == 0 ? "온라인교육" : d.intval3 == 1 ? "교육장교육" : "온라인교육")</span>
@ -176,14 +163,10 @@
{
<span style=" font-weight: 400; font-size: 11pt; line-height: 20px; vertical-align: middle; color: #0000ff; background-color: #fff; padding:0;">@d.studyplacename 교육장</span>
}
@* @Html.Raw(d.intval6 == 1 ? "<span class=\"grn\">환급</span>" : "")*@
<b>@d.strval</b>
</h5>
<dl>
@*<dt class="mpglSta3">@(d.time2 > DateTime.Now ? "진행중" : "종료")</dt>*@
@*<dt>@(d.intval4 == 55 ? "승인대기" : d.intval14 == 51 ? "심사중" : d.intval14 == 21 ? "결제대기" : d.intval14 == 22 ? "미입금" : d.intval14 == 1)</dt>*@
<dt>@d.lectStatus</dt>
@*<dt style="color:#888888">교육기간 : @(d.intval3 == 1 ? d.time.ToString("yy-MM-dd") : d.time5.ToString("yy-MM-dd")) ~ @(d.intval3 == 1 ? d.time2.ToString("yy-MM-dd") : d.time3.ToString("yy-MM-dd"))</dt>*@
@if (d.intval3 == 2)
{
<dt style="color:#888888">교육기간 : @(d.time3.ToString("yyyy년 MM월 dd일")) ~ @(d.time4.ToString("yyyy년 MM월 dd일"))</dt>
@ -198,12 +181,6 @@
}
<dt style="color:black;">@d.studytime<span>시간과정</span></dt>
@Html.Raw(d.intval6 == 1 ? "<span class=\"grn\" style='color: red;'>환급과정</span>" : "<span class=\"grn\" style='color: red;'>비환급과정</span>")
@* <dd>복습기간 : @(d.time2.AddYears(1).ToString("yy-MM-dd"))</dd>*@
@* @if (false && d.intval3 == 2 && d.time3 > Convert.ToDateTime("1900-01-01"))
{
<dd>집체교육 : @d.time3.ToString("yy/MM/dd")</dd>
}*@
</dl>
</a>
@ -211,26 +188,6 @@
status1CNT++;
}
}
@*@if (Model.Datas.Where(w=>w.dtype == 1).Count() < 1 && Model.CMs.Count() > 0)
{
foreach (var d in Model.CMs)
{
<li>
<a href="/Course/@d.cgcode.Replace("Test", "Cert")Detail?cmno=@d.cmno">
<h5>
<em>@(d.tyear)-@(d.tseq)기</em>
<span class="nav">@(d.cshape == 0 ? "ON" : d.cshape == 1 ? "OFF" : "혼합")</span>
@Html.Raw(d.isrefund == 1 ? "<span class=\"grn\">환급</span>" : "")
<b>@d.cname</b>
</h5>
<dl>
<dt class="mpglSta3">추천강좌</dt>
<dd>신청기간 : @d.rstime.Value.ToString("yy/MM/dd") ~ @d.retime.Value.ToString("yy/MM/dd")</dd>
</dl>
</a>
</li>
}
}*@
</ul>
@if (Model.Datas.Where(w => w.dtype == 1).Count() < 1)
{
@ -248,11 +205,44 @@
<ul class="mpgnList" id="mpgl01">
@foreach (var d in Model.Datas.Where(w => w.dtype == 3).OrderBy(o => o.intval))
{
if(d.cshape != 1) {
if (d.cshape != 1)
{
string croomLink = string.Format("/CRoom/Index?croomlectno={0}", d.longval);
// 6709. 과제(intval 4)일 경우 링크가 달라야 한다
switch (d.intval)
{
case 4:
// 기존 쿼리에서는 sdno를 가져올 수 없어서 vm.CRoomLectSdInfo 를 추가함
// => 쿼리조건 기준은 사용자번호를 기준으로 현재 수강중인 강좌기간내의 과제들을 모두 가져와서 들고 있음
var lectsdInfo = new NP.Model.CRoomLectSdInfo();
if (Model.CRoomLectSdInfo != null)
{
lectsdInfo = Model.CRoomLectSdInfo
.Where(x => x.lectno == d.longval)
.SingleOrDefault();
}
if (lectsdInfo != null && lectsdInfo.lectno > 0)
{
croomLink = string.Format("/CRoom/EstimationSubject?croomlectno={0}&croomcmno={1}&estno={2}&tabidx=0", d.longval, d.intval7, lectsdInfo.sdno);
}
else
{
croomLink = string.Format("/CRoom/Index?croomlectno={0}", d.longval);
}
break;
default:
croomLink = string.Format("/CRoom/Index?croomlectno={0}", d.longval);
break;
}
<li>
<div>
@*<a href="/CRoom/Index?croomlectno=@d.longval" data-cshape=@d.intval3 class="gocroom">*@
<a href="/CRoom/Index?croomlectno=@d.longval" data-cshape=@d.cshape class="gocroom">
<a href="@croomLink" data-cshape=@d.cshape class="gocroom">
@if (d.intval == 1)
{
<h5><span>[학습]</span>@d.strval (@(d.intval3)반)</h5>

View File

@ -1,8 +1,8 @@
<script type="text/javascript" src="/js/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="/js/placeholders.min.js"></script>
<script type="text/javascript" src="/js/slick.min.js"></script>
<script type="text/javascript" src="/js/site.js?v=230214"></script>
<script type="text/javascript" src="/js/site.js?v=250321"></script>
<script type="text/javascript" src="/js/master.js"></script>
<script src="https://vjs.zencdn.net/ie8/1.1.2/videojs-ie8.min.js"></script>
<script src="https://vjs.zencdn.net/7.7.6/video.js"></script>
<script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script>
<script type="text/javascript" src="/js/videojs-ie8.min.js"></script>
<script type="text/javascript" src="/js/video.js"></script>
<script type="text/javascript" src="/js/polyfill.min.js"></script>

View File

@ -1,6 +1,5 @@

<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<link href="~/css/jquery-ui-1.12.1/jquery-ui.min.css" rel="stylesheet" />
<script src="~/js/jquery-ui.min.js"></script>
<script>
$(document).ready(function () {
$('.datepicker-input').datepicker({

View File

@ -8,7 +8,7 @@
@Html.Partial("./Partial/JS")
@RenderSection("scriptsHeader", required: false)
<script type="text/javascript" src="/js/study.js?v=190919"></script>
<script src="https://polyfill.io/v3/polyfill.js?features=fetch"></script>
<script type="text/javascript" src="~/js/polyfill.min.js"></script>
</head>
<body>
@RenderBody()

View File

@ -34,15 +34,14 @@
<add key="fronturl" value="https://www.ynicte.com" />
<add key="adminurl" value="http://admin.ynicte.com" />
<add key="reporturl" value="http://ynicter.nptc.kr" />
<!--<add key="masteremail" value="edu@ynicte.or.kr;mail.ynicte.or.kr;25;ynicte@ynicte.or.kr;k7758870!%" />-->
<add key="masteremail" value="yicte@cte.or.kr;smtp.daum.net;465;yicte2020;yicte04003" />
<add key="masteremail" value="yicte2020@daum.net;smtp.daum.net;465;yicte2020;txwhczubbkcbotfd" />
<add key="usessl" value="Y" />
<add key="ssonoauth" value="Y" />
<add key="daokey" value="ynictelms2020" />
<!--<add key="configpath" value="Product" />-->
<add key="configpath" value="Product" />
<!--<add key="configpath" value="ProductDev" />-->
<add key="configpath" value="Staging" />
<!--<add key="configpath" value="Staging" />-->
<add key="isstaging" value="1" />
<add key="thumbnailexe" value="D:\\dev_tool\\ffmpeg.exe" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

File diff suppressed because one or more lines are too long

44
FO/js/jquery-ui.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1
FO/js/polyfill.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -20,11 +20,9 @@
}
});
$(document).ready(function () {
//$("body").on("blur", "input[type='text'],input[type='password']", function () {
// //$("body").focus();
//});
$("body").on("keydown", ".int, .intdot", function (e) {
//109,189
}).on("keyup", ".int, .intdot, input.mobile,input[type='text'],input[type='password']", function (e) {
if (($(this).hasClass("int") || $(this).hasClass("intdot") || $(this).hasClass("mobile")) && $(this).val() !== null && $(this).val() !== '' && e.keyCode != 8 && e.keyCode != 109 && e.keyCode != 189 && e.keyCode != 46 && e.keyCode != 190 && e.keyCode != 110 && e.keyCode != 109 && e.keycode != 189 && e.keyCode != 13
&& !(e.keyCode > 47 && e.keyCode < 58) && !(e.keyCode > 95 && e.keyCode < 106)) {
@ -92,11 +90,7 @@ $(document).ready(function () {
}
}
}).on("click", ".int, .intdot", function () {
//if ($(this).hasClass("phplaceholder")) {
// $("#" + $(this).attr("id").substr(3)).focus();
//} else {
$(this)[0].select();
//}
}).on("focus", ".int, .intdot, input[type='text'], input[type='password']", function () {
if ($(this).hasClass("int") || $(this).hasClass("intdot")) {
$(this).val($(this).val().replace(/,/gi, ''));
@ -121,13 +115,6 @@ $(document).ready(function () {
$(this).val(v.substr(0, 4) + "-" + v.substr(4, 2) + "-" + v.substr(6));
}
}).on("focusout", ".int, .intdot, input[type='text'], input[type='password']", function () {
//focusoutobj = $(this);
//if (!$(this).hasClass("nocomma")) {
// setTimeout(function () {
// var fv = $.trim($(focusoutobj).val());
// bindComma2(fv);
// }, 10);
//}
$("label.phplaceholder").remove();
});
$('#breadcrumb dd > span').click(function () {
@ -218,7 +205,6 @@ function uploadeditorimage(files, el, fdata, _callback, _url) {
contentType: false,
processData: false,
success: function (result) {
//_uploadeditorimagertn = JSON.parse(result);
_uploadeditorimagertn = result;
eval(_uploadeditorimagecallback.substr(_uploadeditorimagecallback.length - 1, 1) == ")" ? _uploadeditorimagecallback : (_uploadeditorimagecallback + "()"));
}
@ -266,39 +252,66 @@ function viewcontentsok() {
cbviewcontents();
}
}
var _cdmsisopenning = 0;
// 팝업 창 참조를 전역으로 유지
let globalPopup = null;
function cbviewcontents() {
if (_vcistaste || (capResult.code == 1000)) {
if (_vcistaste || capResult.code == 1000) {
// 백그라운드 레이어 숨기기
$("#bglayer").hide();
_cdmsisopenning = 1;
if (ismobile()) {
var win = window.open("/CDMS/Play" + (_vc_istaste ? "Taste" : "") + "?cmino=" + _vc_cmino + "&ismobile=1&lectno=" + _vc_lectno + "&pseq=" + _vc_pseq, 'contentsview');
if (win == null) {
msg("팝업이 차단되어 있습니다. 차단을 해제해 주세요(0)");
const url = `/CDMS/Play${_vc_istaste ? "Taste" : ""}?cmino=${_vc_cmino}&ismobile=${ismobile() ? '1' : '0'}&lectno=${_vc_lectno}&pseq=${_vc_pseq}`;
// 팝업 옵션
const nWidth = 1080;
const nHeight = screen.availHeight - 100;
const nLeft = Math.round((screen.availWidth - nWidth) / 2);
const nTop = Math.round((screen.availHeight - nHeight) / 2);
const popOption = `
width=${nWidth},
height=${nHeight},
top=${nTop},
left=${nLeft},
toolbar=no,
menubar=no,
location=no,
resizable=yes,
status=yes,
scrollbars=yes`.replace(/\s+/g, '');
// 이미 팝업이 열려 있는지 확인
if (globalPopup && !globalPopup.closed) {
try {
// 1초 딜레이 적용
setTimeout(() => {
globalPopup.location.href = url; // URL 업데이트 (필요에 따라)
globalPopup.focus(); // 이미 열린 팝업 창 활성화
}, 1000);
} catch (e) {
console.error("기존 팝업 접근 실패: ", e);
globalPopup = null; // 접근 실패 시 참조 정리
}
} else {
var cpop = open("/Open/Popup", "checkpop", 'width=100,height=100');
if (cpop == null) {
msg("팝업이 차단되어 있습니다. 차단을 해제해 주세요(1)");
globalPopup = window.open(url, 'contentsview', popOption);
if (!globalPopup) {
msg("팝업이 차단되어 있습니다. 차단을 해제해 주세요.");
} else {
cpop.close();
var nWidth = "1080";
var nHeight = screen.availHeight - 100;
var popOption = "";
popOption += "width=" + nWidth + ",";
popOption += "height=" + nHeight + ",";
popOption += "toolbar=no,menubar=no,location=no,";
popOption += "resizable=yes,status=yes,scrollbars=yes";
if (window.open("/CDMS/Play" + (_vc_istaste ? "Taste" : "") + "?cmino=" + _vc_cmino + "&ismobile=0&lectno=" + _vc_lectno + "&pseq=" + _vc_pseq, 'contentsview', popOption) != null) {
//window.open("/CDMS/Play" + (_vc_istaste ? "Taste" : "") + "?cmino=" + _vc_cmino + "&ismobile=0&lectno=" + _vc_lectno + "&pseq=" + _vc_pseq, 'contentsview', popOption).focus();
console.log('iscdms');
}
else { msg("팝업이 차단되어 있습니다. 차단을 해제해 주세요"); }
try {
globalPopup.focus(); // 포커스 이동
} catch (e) {
console.error("팝업 포커스 실패: ", e);
}
}
}
else {
location.href = "/Account/Index?ru="+location.href.replace(/#/gi,'');
} else {
location.href = "/Account/Index?ru=" + location.href.replace(/#/gi, '');
}
}
@ -603,132 +616,309 @@ function cap(url, formid, callback, getpost, autoMsg, noBG, jsislayer2) {
console.log("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요.");
}
}
function capp(url, p, callback, getpost, autoMsg, noBG, jsislayer2, hideBG, noerror, sync) {
_jsislayer2 = jsislayer2 || false;
_noerror = noerror || false;
_hideBG = hideBG || false;
// 동기식 요청은 권장되지 않지만, 기존 코드 호환성을 위해 유지
// 단, 경고 메시지 출력
_async = !(sync || false);
if (sync) {
console.warn("동기식 Ajax 요청은 권장되지 않으며 iOS에서 문제를 일으킬 수 있습니다.");
}
if (!isCaping) {
isAutoMsg = autoMsg || false;
_bging = noBG || false;
if (!_bging) {
ajaxing();
}
if (_jsislayer2) {
bglayer2();
}
_callback = callback;
capResult = null;
capOK = false;
isCaping = true;
// 기존 함수 호출 유지, 존재 확인 후 실행
if (typeof clearComma === 'function') {
try {
clearComma();
$.ajax({
} catch (e) {
console.error("clearComma 함수 실행 오류:", e);
}
}
// Ajax 요청 설정
const ajaxSettings = {
type: getpost || "post",
url: url,
data: p,
async: _async,
timeout: _async ? 30000 : undefined, // 비동기 요청만 타임아웃 설정
success: function (r) {
isCaping = false;
capResult = r;
// iOS 호환성을 위한 추가 처리
setTimeout(function () {
setcap();
}, error: function (e) {
}, 0);
},
error: function (xhr, status, error) {
isCaping = false;
console.log(e.responseText);
console.log("Ajax 오류:", status, error);
if (xhr.responseText) {
console.log("응답 내용:", xhr.responseText);
}
// 타임아웃 오류 별도 처리
if (status === "timeout") {
if (_jsislayer2) {
//msg2("잠시 후 다시 요청해주세요.");
alert("요청 시간이 초과되었습니다. 다시 시도해 주세요.");
} else {
alert("요청 시간이 초과되었습니다. 다시 시도해 주세요.");
}
}
else if (!_noerror) {
if (_jsislayer2) {
alert("잠시 후 다시 요청해주세요.");
}
else {
//msg("잠시 후 다시 요청해주세요.");
alert("잠시 후 다시 요청해주세요.");
}
}, complete: function () {
}
},
complete: function () {
// iOS에서의 지연 문제 방지를 위한 setTimeout 사용
setTimeout(function () {
ajaxing(false);
}, 0);
}
});
};
// iOS 특정 버전에서의 캐시 문제 방지
if (navigator.userAgent.match(/(iPad|iPhone|iPod)/g)) {
ajaxSettings.cache = false;
// URL에 타임스탬프 추가하여 캐시 방지
const timestamp = new Date().getTime();
ajaxSettings.url = ajaxSettings.url +
(ajaxSettings.url.indexOf('?') >= 0 ? '&' : '?') +
'_t=' + timestamp;
}
else if (!_noerror){
$.ajax(ajaxSettings);
}
else if (!_noerror) {
console.log("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요.");
}
}
function capfile(url, data, callback, noeval, setBG, jsislayer2) {
// 로딩바 표시 추가
showLoadingImage();
noeval = noeval || false;
_jsislayer2 = jsislayer2 || false;
_setBG = setBG || false;
capfilecallback = callback;
// 백그라운드 레이어 표시
if (_setBG) {
bglayer();
}
if (_jsislayer2) {
bglayer2();
}
// iOS 호환성을 위한 처리
// FormData 객체 확인 및 필요시 수정
if (data instanceof FormData) {
// iOS에서 FormData 디버깅을 위한 로그 (개발 중에만 사용)
console.log("FormData 항목 수:", [...data.entries()].length);
}
// 콜백 함수 실행 헬퍼
function executeCallback(result) {
// 로딩바 숨김 추가
hideLoadingImage();
if (_setBG) {
$("#bglayer").hide();
}
if (noeval) {
// 함수 객체로 직접 호출
if (typeof callback === 'function') {
callback(result);
}
}
else {
// 기존 방식 유지 (eval 사용)
// 보안상 권장되지 않지만 기존 코드 호환성 유지
try {
window.capResult = result; // 전역 변수로 결과 저장
if (typeof callback === 'string') {
if (callback.substr(callback.length - 1, 1) == ")") {
eval(callback);
} else {
eval(callback + "()");
}
}
} catch (e) {
console.error("콜백 실행 오류:", e);
}
}
}
var ajaxRequest = $.ajax({
type: "POST",
url: url,
contentType: false,
processData: false,
data: data
data: data,
timeout: 60000,
xhr: function () {
var xhr = $.ajaxSettings.xhr();
// 업로드 진행 상황 모니터링 (iOS에서 파일 업로드 진행 확인)
if (xhr.upload) {
xhr.upload.addEventListener('progress', function (e) {
if (e.lengthComputable) {
var percent = Math.round((e.loaded / e.total) * 100);
console.log("업로드 진행률: " + percent + "%");
}
}, false);
}
return xhr;
}
});
ajaxRequest.error(function (e) {
console.log(e);
capResult = data;
if (!noeval) {
eval(capfilecallback.substr(capfilecallback.length - 1, 1) == ")" ? capfilecallback : (capfilecallback + "()"));
// 에러 처리
ajaxRequest.fail(function (jqXHR, textStatus, errorThrown) {
console.error("Ajax 요청 실패:", textStatus, errorThrown);
// 타임아웃인 경우 별도 처리
if (textStatus === "timeout") {
alert("요청 시간이 초과되었습니다. 다시 시도해 주세요.");
// 로딩바 숨김 추가 (타임아웃 시)
hideLoadingImage();
}
else {
ajaxRequest.done(capfilecallback);
// 기존 에러 처리 로직 유지 (하지만 에러 시 다른 처리를 권장)
executeCallback({
code: -1,
message: "요청 처리 중 오류가 발생했습니다",
error: textStatus
});
}
});
ajaxRequest.done(function (data) {
if (_setBG) {
$("#bglayer").hide();
}
capResult = data;
if (capResult.code == 1000) {
if (!noeval) {
eval(capfilecallback.substr(capfilecallback.length - 1, 1) == ")" ? capfilecallback : (capfilecallback + "()"));
if (data && data.code == 1000) {
executeCallback(data);
}
else {
ajaxRequest.done(capfilecallback);
}
console.warn("서버 응답 코드가 1000이 아닙니다:", data);
executeCallback(data);
}
});
}
function capfileform(url, fid, callback, iseval, getpost, autoMsg, noBG, jsislayer2) {
_jsislayer2 = jsislayer2 || false;
if (!isCaping) {
// 로딩바 표시 추가
showLoadingImage();
isAutoMsg = autoMsg || false;
_bging = noBG || false;
if (!_bging) {
ajaxing();
}
if (_jsislayer2) {
bglayer2();
}
if (!_bging) { ajaxing(); }
if (_jsislayer2) { bglayer2(); }
_callback = callback;
capResult = null;
capOK = false;
isCaping = true;
//clearComma();
// 폼 요소 직접 참조
const form = document.getElementById(fid);
// iOS 호환성을 위한 FormData 생성 방식 개선
let formData;
try {
// 기본 FormData 생성 시도
formData = new FormData(form);
// iOS 호환성 검사 - 파일 입력 필드 확인
const fileInputs = form.querySelectorAll('input[type="file"]');
let hasFiles = false;
fileInputs.forEach(input => {
if (input.files && input.files.length > 0) {
hasFiles = true;
// 파일 입력 필드 값이 제대로 FormData에 들어갔는지 확인
const fieldName = input.name || 'file';
if (!formData.has(fieldName)) {
console.log(`iOS 호환성: 수동으로 ${fieldName} 추가`);
// 수동으로 파일 추가
for (let i = 0; i < input.files.length; i++) {
formData.append(fieldName, input.files[i]);
}
}
}
});
// 디버깅용 로그
console.log('FormData 생성 완료:', hasFiles ? '파일 포함' : '파일 없음');
} catch (error) {
console.error('FormData 생성 오류:', error);
// 대체 방식으로 FormData 생성
formData = new FormData();
// 폼 필드 수동 추가
const formElements = form.elements;
for (let i = 0; i < formElements.length; i++) {
const field = formElements[i];
const name = field.name;
if (!name) continue;
if (field.type === 'file') {
for (let j = 0; j < field.files.length; j++) {
formData.append(name, field.files[j]);
}
}
else if (field.type !== 'submit' && field.type !== 'button') {
formData.append(name, field.value);
}
}
}
// 네트워크 요청 타임아웃 설정
const ajaxTimeout = 60000; // 60초
$.ajax({
type: getpost || "post",
url: url,
data: new FormData($('#' + fid)[0]),
data: formData,
contentType: false,
processData: false,
timeout: ajaxTimeout,
success: function (r) {
isCaping = false;
capResult = r;
setcap();
}, error: function (e) {
// 로딩바 숨김 추가
hideLoadingImage();
},
error: function (e) {
isCaping = false;
console.log('Ajax 오류:', e.status, e.statusText);
console.log(e.responseText);
if (_jsislayer2) {
msg2("개발담당자에게 문의해주세요.");
if (e.status === 0 && e.statusText === 'timeout') {
alert("요청 시간이 초과되었습니다. 다시 시도해주세요.");
}
else if (_jsislayer2) {
alert("개발담당자에게 문의해주세요");
}
else {
msg("개발담당자에게 문의해주세요.");
alert("개발담당자에게 문의해주세요.");
}
}, complete: function () {
// 로딩바 숨김 추가
hideLoadingImage();
},
complete: function () {
ajaxing(false);
// complete에도 로딩바 숨김 추가 (중복 호출 방지를 위해 다른 방법 고려 가능)
hideLoadingImage();
}
});
}
@ -736,6 +926,181 @@ function capfileform(url, fid, callback, iseval, getpost, autoMsg, noBG, jsislay
console.log("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요.");
}
}
function setcap() {
// 결과가 없는 경우 예외 처리
if (!capResult) {
console.error("capResult가 정의되지 않았습니다");
return;
}
if (capResult.code === 1000) {
capOK = true;
capResultObj = capResult.obj;
capResultMsg = capResult.msg;
}
// 인증 관련 오류 처리
if (capResult.code == 9991) {
alert("인증시간이 초과되어 로그아웃되었습니다.");
setTimeout(function () {
location.href = '/Account/Error?code=9991';
}, 100); // iOS에서 alert 후 즉시 리디렉션 문제 방지
}
else if (capResult.code == 9992) {
alert("로그인 정보가 일치하지 않아 다시 로그인을 진행하셔야 합니다.\n(다른 디바이스에 로그인 또는 Cookie정보를 확인할 수 없습니다.)");
setTimeout(function () {
location.href = '/Account/Error?code=9992';
}, 100); // iOS에서 alert 후 즉시 리디렉션 문제 방지
}
else {
// 자동 메시지 처리
if (isAutoMsg) {
switch (capResult.code) {
case 1000: showOK(); break;
case 9999: alert("서버접속이 원활하지 않습니다"); break;
case 9998: alert("권한이 없는 요청입니다"); break;
case 9997: alert("권한(로그인)이 없는 요청입니다"); break;
case 9996: alert("검색된 데이터가 없습니다"); break;
case 9995: alert("적용된 데이터가 없습니다"); break;
default:
// 개발 모드에서만 상세 로그 출력
console.log("응답 코드:", capResult.code);
console.log("응답 메시지:", capResult.msg);
if (capResult.obj) console.log("응답 데이터:", capResult.obj);
break;
}
}
else {
capResultMsg = capResult.code + ": " + capResult.msg;
}
// 콜백 함수 실행
if (_callback) {
try {
if (typeof _callback === "function") {
_callback(capResult);
}
else if (typeof _callback === "string") {
// 문자열 콜백 처리 - eval 사용을 최소화
if (_callback.indexOf(")") > -1) {
// 이미 괄호가 포함된 경우
window.setTimeout(function () {
try {
eval(_callback);
} catch (e) {
console.error("콜백 실행 오류:", e);
}
}, 0);
}
else {
// 괄호 추가 필요
window.setTimeout(function () {
try {
eval(_callback + "()");
} catch (e) {
console.error("콜백 실행 오류:", e);
}
}, 0);
}
}
} catch (e) {
console.error("콜백 실행 중 오류 발생:", e);
}
}
}
}
/** 로딩이미지 보여주기 */
function showLoadingImage() {
// 이미 존재하는 경우 중복 생성 방지
if (document.getElementById('custom-loading-overlay')) {
return;
}
// 로딩 이미지 요소 생성
const loadingDiv = document.createElement('div');
loadingDiv.id = 'custom-loading-overlay';
// 인라인 스타일 대신 클래스 사용을 위한 스타일 추가
const style = document.createElement('style');
style.textContent = `
#custom-loading-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 9999;
}
#custom-loading-spinner {
width: 40px;
height: 40px;
background-color: #fff;
border-radius: 100%;
-webkit-animation: sk-scaleout 1.0s infinite ease-in-out;
animation: sk-scaleout 1.0s infinite ease-in-out;
}
@-webkit-keyframes sk-scaleout {
0% { -webkit-transform: scale(0) }
100% { -webkit-transform: scale(1.0); opacity: 0; }
}
@keyframes sk-scaleout {
0% { transform: scale(0); -webkit-transform: scale(0); }
100% { transform: scale(1.0); -webkit-transform: scale(1.0); opacity: 0; }
}
/* 애니메이션 미지원 브라우저용 대체 스타일 */
.no-animation #custom-loading-spinner {
background-color: #3498db;
border: 5px solid #f3f3f3;
}
`;
document.head.appendChild(style);
// 브라우저 애니메이션 지원 확인
const supportsAnimation = 'AnimationEvent' in window ||
'WebKitAnimationEvent' in window ||
'MozAnimationEvent' in window ||
'msAnimationEvent' in window ||
'OAnimationEvent' in window;
// 기본 로딩 스피너
const spinnerDiv = document.createElement('div');
spinnerDiv.id = 'custom-loading-spinner';
// 애니메이션을 지원하지 않는 브라우저에는 정적 스타일 적용
if (!supportsAnimation) {
loadingDiv.className = 'no-animation';
}
loadingDiv.appendChild(spinnerDiv);
document.body.appendChild(loadingDiv);
}
/** 로딩이미지 제거 */
function hideLoadingImage() {
const loadingDiv = document.getElementById('custom-loading-overlay');
if (loadingDiv) {
// 스타일 요소도 정리
const style = document.querySelector('style[id^="custom-loading-style"]');
if (style) {
document.head.removeChild(style);
}
document.body.removeChild(loadingDiv);
}
}
function ajaxing(tf) {
if (!_jsislayer2) {
bglayer(false);
@ -773,64 +1138,7 @@ function clearComma() {
$(c).val($(c).val().replace(/,/gi, ''));
});
}
function setcap() {
if (capResult.code === 1000) {
capOK = true;
capResultObj = capResult.obj;
capResultMsg = capResult.msg;
}
if (capResult.code == 9991) {
if (ispop()) {
parent.location.href = capResult.obj + '?istimeout=true';
}
else if ((parent.ismainlayout || 0) == 1) {
parent.location.href = capResult.obj + '?istimeout=true';
}
else if (opener != null) {
parent.location.href = capResult.obj + '?istimeout=true';
self.close();
}
else {
//msg("인증시간이 초과되어 로그아웃되었습니다.");
location.href = capResult.obj;
}
}
else {
if (isAutoMsg) {
switch (capResult.code) {
case 1000:
showOK();
break;
case 9999:
msg("서버접속이 원활하지 않습니다 <" + capResult.code + ": " + capResult.msg + ">");
break;
case 9998:
msg("권한이 없는 요청입니다. <" + capResult.code + ": " + capResult.msg + ">");
break;
case 9997:
msg("권한(로그인)이 없는 요청입니다. <" + capResult.code + ": " + capResult.msg + ">");
break;
case 9996:
msg("검색된 데이터가 없습니다. <" + capResult.code + ": " + capResult.msg + ">");
break;
case 9995:
msg("적용된 데이터가 없습니다. <" + capResult.code + ": " + capResult.msg + ">");
break;
default:
console.log(capResult.code);
console.log(capResult.msg);
console.log(capResult.obj);
break;
}
}
else {
capResultMsg = capResult.code + ": " + capResult.msg;
}
if ((_callback || "") != "") {
eval(_callback.indexOf(")") > -1 ? _callback : (_callback + "()"));
}
}
}
var _focusitem;
var _focusitem2;
var _okm;

30
FO/js/video.js Normal file

File diff suppressed because one or more lines are too long

1
FO/js/videojs-ie8.min.js vendored Normal file

File diff suppressed because one or more lines are too long

37
Model/CRoom.cs Normal file
View File

@ -0,0 +1,37 @@
using System;
namespace NP.Model
{
/// <summary>
/// 강의실 과제제출 정보
/// </summary>
public class CRoomLectSdInfo
{
/// <summary>수강번호(수강키)</summary>
public int lectno { get; set; }
/// <summary>회원번호</summary>
public int userno { get; set; }
/// <summary>과제토론명</summary>
public string sdname { get; set; }
/// <summary>과제토론키</summary>
public int sdno { get; set; }
/// <summary>온라인강좌 수강시작일</summary>
public DateTime sdate { get; set; }
/// <summary>온라인강좌 수강종료일</summary>
public DateTime edate { get; set; }
/// <summary>출석율(%)</summary>
public int attrate { get; set; }
/// <summary>과제토론 참여조건</summary>
public byte sdcondition { get; set; }
/// <summary>과제토론 제출여부</summary>
public bool issubmit { get; set; }
/// <summary>과제토론 제출일시</summary>
public DateTime submittime { get; set; }
/// <summary>과제토론 평가여부</summary>
public bool ischeck { get; set; }
/// <summary>과제토론 평가일시</summary>
public DateTime checktime { get; set; }
/// <summary>현재 기간내 수강여부</summary>
public bool iscurrentlecture { get; set; }
}
}

View File

@ -45,6 +45,7 @@
<ItemGroup>
<Compile Include="BaseModel.cs" />
<Compile Include="Board.cs" />
<Compile Include="CRoom.cs" />
<Compile Include="Documents.cs" />
<Compile Include="Pay.cs" />
<Compile Include="Common.cs" />

View File

@ -25,5 +25,7 @@ namespace NP.Model
public Users User { get; set; }
public IList<CM> CMs { get; set; }
public CM cmm { get; set; }
public IList<CRoomLectSdInfo> CRoomLectSdInfo { get; set; }
}
}