초기소스

This commit is contained in:
jazz
2025-10-29 17:08:05 +09:00
parent e531aa9540
commit 439a379a02
7551 changed files with 1234427 additions and 3 deletions

View File

@@ -0,0 +1,10 @@
$(document).ready(function () {
var $headerNav = $('.header-nav__inner');
var $fullMenu = $('.full-menu');
if ($fullMenu.outerWidth() > $headerNav.outerWidth()) {
$fullMenu.addClass('wide-menu');
} else {
$fullMenu.removeClass('wide-menu');
}
});

View File

@@ -0,0 +1,275 @@
$(document).ready(function () {
//$("#fileUpload").on("change", addFiles);
});
var filesTempArr = [];
//파일추가
function addFiles(event, mode){
addFilesObj(event, mode,"fileList");
}
function addFilesObj(event, mode, objId, represntAt){
if(!($(event.target).is('[multiple]'))) filesTempArr.splice(0, filesTempArr.length);
var files = event.target.files; //선택한 파일들
var filesArr = Array.prototype.slice.call(files); //file객체 array추가
var filesArrLen = filesArr.length;
var filesTempArrSize = filesTempArr.length*1;
let obj = $('#'+objId);
if((mode === 1 && filesArrLen>1) || (mode === 1 && obj.find('li').length>0)){
alert("파일은 한개만 첨부할 수 있습니다.");
return;
}
var templist = '';
for(var i=0; i<filesArrLen; i++){
if(i === filesArrLen-1){ //게시판 대표이미지 배열 첫번째로 이동
if(represntAt === 'Y'){
filesTempArr.unshift(filesArr[i]); //임시배열에 저장
}else{
filesTempArr.push(filesArr[i]); //임시배열에 저장
}
}else{
filesTempArr.push(filesArr[i]); //임시배열에 저장
}
if($(event.target).is('[multiple]')){
//templist = "<div id='temp"+(i+filesTempArrSize)+"'><a href='#' onclick='downloadFile(this, "+(i+filesTempArrSize)+");'>"+ filesArr[i].name + "</a><span style='color:red;' onclick='deleteFile(this, event, "+(i+filesTempArrSize)+");'>&nbsp;&nbsp;&nbsp;[X]</span></div>";
let fileSize = (filesArr[i].size / 1024).toFixed(2);
if(objId=='fileList'){
templist ="<li id='temp"+(i+filesTempArrSize)+"'>"
+"<a href='#' onclick='downloadFile(this, "+(i+filesTempArrSize)+");'>"
+ "<i class='icon icon_file-list mr-2'></i>"
+ "<span class='file-list__item-title'>"+ filesArr[i].name + "</span>"
+"</a>"
+"<button type='button' class='file-list__delete' onclick='deleteFile(this,0,0, "+(i+filesTempArrSize)+");'/>"
+"</li>";
}else {
templist = "<li class = 'uploadList__item' id='temp" + (i + filesTempArrSize) + "'>"
+ "<p class = 'uploadList__itemText'>"
+ "<span class = 'uploadList__itemName'/> "+ filesArr[i].name + "</span>"
+ "<span class ='uploadList__itemSize'>("+ fileSize + " KB)</span>"
+ "</p>"
+ "<input type = 'hidden' value = '"+ fileSize + "' class = 'filsSize'/>"
+ "<button class='uploadList__removeBtn' type='button' onclick='deleteFile(this,0,0," + (i+filesTempArrSize) + ",\"" + objId + "\"); fn_sum_file_size();'/>"
+ "<span class ='visually-hidden'>삭제</span>"
+ "</button>"
+ "</li>"
}
obj.append(templist);
}
}
}
//파일삭제
//callbackNm ajax 파일 처리 성공시 실행 할 콜백함수
function deleteFile(obj, shopCd, menuGb, orderParam,callbackNm,callbackParam) {
deleteFiles(obj, shopCd, menuGb, orderParam, 'fileUpload',callbackNm,callbackParam);
}
//파일삭제
function deleteFiles(obj, shopCd, menuGb, orderParam, objId, callbackNm,callbackParam) {
filesTempArr.splice(orderParam, 1);
var $div = $(obj).closest('li');
var $id = $div.attr('id');
var obj = "#" + objId;
if ($id.indexOf('temp') == 0) { //임시등록파일은 화면에서 삭제
$div.remove();
$(obj).val('');
} else { //업로드된 파일은 서버삭제
if (confirm("파일을 삭제하시겠습니까?")) {
ajaxFileDelete($div, $id, shopCd, menuGb, orderParam,callbackNm,callbackParam);
}
}
}
//파일삭제(html 요소 조작 없이 단순 파일 삭제)
function dropzoneDeleteFiles(fileId, shopCd, menuGb, orderParam,callbackNm,callbackParam) {
if (fileId.indexOf('temp') != 0) { //임시등록파일은 화면에서 삭제
if (confirm("파일을 삭제하시겠습니까?")) {
ajaxFileDelete('', fileId, shopCd, menuGb, orderParam, callbackNm,callbackParam);
return "Y";
}else{
return "N";
}
}
}
var ajaxFileDelete = function (obj, fileId, shopCd, menuGb, orderParam, callbackNm,callbackParam) {
$.ajax({
//url: '/file/deleteUploadedFile/'+shopCd+'/'+menuGb+'/'+fileId+'/ajax',
url: '/file/deleteUploadedFile?sopCd=' + shopCd + '&menuGb=' + menuGb + '&fileKey=' + fileId,
data: fileId,
type: 'get',
success: function (data) {
if (obj !== '') {
obj.remove();
}
if (callbackNm != null) {
callbackNm(callbackParam);
}
},
error: function () {
alert("삭제에 실패하였습니다.");
}
});
}
//다운로드
var downloadFile = function(obj,shopCd, menuGb,orderParam){
filesTempArr.splice(orderParam, 1);
var $div = $(obj).closest('li');
var fileId = $div.attr('id'); // <li>태그id - 파일글번호
var orgFileId = obj.id; //선택된 파일명. 즉 <a>태그id - 원본파일명
if(fileId.indexOf('temp') == 0){
alert("등록된 파일만 다운로드 가능합니다.");
return false;
}
//$(location).attr('href','/file/download/'+shopCd+'/'+menuGb+'/'+fileId+'/'+orgFileId+'/ajax');
//$(location).attr('href','/file/download/'+shopCd+'/'+menuGb+'/'+fileId+'/ajax');
$(location).attr('href','/file/fileDownload?sopCd='+shopCd+'&menuGb='+menuGb+'&fileKey='+fileId);
}
//다운로드
var linkDownloadFile = function(key,shopCd, menuGb,orderParam){ //파일글번호, 원본파일명
filesTempArr.splice(orderParam, 1);
if(key.indexOf('temp') == 0){
alert("등록된 파일만 다운로드 가능합니다.");
return false;
}
$(location).attr('href','/file/fileDownload?sopCd='+shopCd+'&menuGb='+menuGb+'&fileKey='+key);
}
//-----------------------------------------------------------
// 이미지 업로드 시 이미지 미리보기 , 삭제버튼(배열에서 제거함) 기능
//-----------------------------------------------------------
// let selectedFiles = []; // 선택된 파일을 저장하는 배열
function addImgFilesView(event,objId){
const previewContainer = document.getElementById(objId);
const files = event.target.files; // 선택된 파일들 가져오기
// previewContainer.innerHTML = ''; // 기존 미리보기 초기화
// filesTempArr = []; // 기존 배열 초기화
// 파일 개수 제한 확인
// const maxFiles = 3; // 최대 파일 개수 제한
/*if (filesTempArr.length + files.length > maxFiles) {
alert(`최대 ${maxFiles}개의 파일만 업로드할 수 있습니다.`);
return;
}
Array.from(files).forEach((file) => {
if (filesTempArr.length < maxFiles) {
filesTempArr.push(file); // 파일 추가
displayPreview(file, previewContainer);
}
});*/
Array.from(files).forEach((file) => {
filesTempArr.push(file); // 파일 추가
displayPreview(file, previewContainer);
});
// input 초기화 (같은 파일 재선택 가능)
event.target.value = '';
}
function displayPreview(file,obj) {
const reader = new FileReader();
reader.onload = function (e) {
// 미리보기 항목 생성
const previewItem = document.createElement('div');
previewItem.classList.add('preview-item');
// 이미지 태그 생성
const img = document.createElement('img');
img.src = e.target.result;
// 삭제 버튼 생성
const deleteBtn = document.createElement('button');
deleteBtn.classList.add('delete-btn');
deleteBtn.textContent = '×';
deleteBtn.onclick = function () {
removeImgFile(file, previewItem);
};
// 미리보기 항목에 이미지와 버튼 추가
previewItem.appendChild(img);
previewItem.appendChild(deleteBtn);
obj.appendChild(previewItem);
};
reader.readAsDataURL(file);
}
function removeImgFile(file, previewItem) {
// 선택된 파일 배열에서 제거
filesTempArr = filesTempArr.filter((f) => f !== file);
// 미리보기 항목 제거
previewItem.remove();
}
//-------------------------------------------------------------------------------------------
var initFileList = function($files){
if(Array.isArray($files)){
$.each($files, function(index, item){
filesTempArr.push(item);
filesTempArr[index].upload = 'disable';
});
}else{
filesTempArr.push(new File([$files], $files+".txt", {
type: "text/plain",
}));
filesTempArr[0].upload = 'disable';
}
}
//파일삭제(단건)
function deleteSingleFile (obj, eventParam, orderParam){
if(confirm('삭제하시겠습니까?')){
filesTempArr.splice(orderParam, 1);
var $div = $(obj).closest('div')
var $id = $div.attr('id');
if($id.indexOf('temp') == 0) {
$div.remove();
}else{
$div.remove();
$('#updateFileDiv').show();
filesTempArr = [];
$('#imgSavedYn').val("N");
//ajaxSingleFileDelete($id);
}
}
}
//파일삭제(단건) 후처리
var ajaxSingleFileDelete = function(fileId){
$.ajax({
url: '/bo/comm/file/deleteUploadedFile/'+fileId+"/ajax",
data: fileId,
type: 'post',
success : function(data){
//찾아보기 div구역 id = updateFileDiv
$('#updateFileDiv').show();
filesTempArr = [];
},
error: function(xhr, status, error){
alert("삭제에 실패하였습니다.");
}
});
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,167 @@
$(document).ready(function() {
setTimeout(function() {
let $canvas = $('#scratchCanvas');
if ($canvas.length === 0) {
return;
}
const ctx = $canvas[0].getContext('2d');
const canvas = $canvas[0];
canvas.width = canvas.offsetWidth;
canvas.height = canvas.offsetHeight;
const gridSize = 30;
const cols = Math.ceil(canvas.width / gridSize);
const rows = Math.ceil(canvas.height / gridSize);
const scratchedGrid = Array.from({ length: rows }, () => Array(cols).fill(false));
const coverImg = new Image();
const imgTag = document.getElementById('coverImg');
coverImg.src = imgTag.src;
coverImg.onload = function () {
ctx.drawImage(coverImg, 0, 0, canvas.width, canvas.height);
};
let isDrawing = false;
let isSwitched = false;
$canvas.on('mousedown touchstart', function () {
loginCheck();
canvas.style.cursor = 'url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJz48Y2lyY2xlIGN4PScxNicgY3k9JzE2JyByPScxNicgZmlsbD0nI2VkYjE2MycvPjwvc3ZnPg=="), auto';
isDrawing = true;
});
$canvas.on('mouseup mouseleave touchend', function () {
canvas.style.cursor = 'url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPSczMicgaGVpZ2h0PSczMicgdmlld0JveD0nMCAwIDMyIDMyJz48Y2lyY2xlIGN4PScxNicgY3k9JzE2JyByPScxNicgZmlsbD0nI2VkYjE2MycvPjwvc3ZnPg=="), auto';
isDrawing = false;
});
$canvas.on('mousemove touchmove', function (e) {
if (!isDrawing || isSwitched) return;
e.preventDefault();
let x, y;
const rect = $canvas[0].getBoundingClientRect();
if (e.originalEvent.touches) {
x = e.originalEvent.touches[0].clientX - rect.left;
y = e.originalEvent.touches[0].clientY - rect.top;
} else {
x = e.clientX - rect.left;
y = e.clientY - rect.top;
}
const col = Math.floor(x / gridSize);
const row = Math.floor(y / gridSize);
scratchedGrid[row][col] = true;
ctx.globalCompositeOperation = 'destination-out';
ctx.beginPath();
ctx.arc(x, y, 30, 0, Math.PI * 2);
ctx.fill();
const scratchedPercent = calculateScratchedPercent();
if (scratchedPercent >= 30) {
isSwitched = true;
scratchLottery();
}
});
// 긁힌 퍼센테이지 구하기
function calculateScratchedPercent() {
let scratchedCount = 0;
let totalCount = rows * cols;
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) {
if (scratchedGrid[r][c]) scratchedCount++;
}
}
return ((scratchedCount / totalCount) * 100).toFixed(2);
}
// 로그인체크
function loginCheck () {
var device = $('#adScriptDeviceTy').val();
if ($('#mbrInnb').val() == 0) {
if (device == 'sopmal_m') {
openModal('modal-error-confirm-move-login');
return;
} else {
fn_wish_modal();
return;
}
}
}
// 복권긁기 결과
function scratchLottery() {
const promInnb = $('#promInnb').val();
const promRule = $('#promRule').val();
$.ajax({
url:"/sopmal/prom/promJoin",
type: 'post',
dataType: 'json',
contentType: "application/json",
data: JSON.stringify({ promInnb: promInnb, promRule: promRule }),
success : function(res) {
console.log('서버 응답:', res);
const resBody = res?.resBody;
let resultObj = resBody?.result;
if (typeof resultObj === "string") {
try {
resultObj = JSON.parse(resultObj);
} catch (e) {
console.warn('JSON 파싱 실패', e);
resultObj = {};
}
}
// 오류 방지: 응답이 비정상일 경우 종료
if (!resultObj || typeof resultObj.selected === "undefined") {
alert("응답이 잘못되었습니다. 다시 시도해주세요.");
spinning = false;
return;
}
const selected = Number(resultObj.selected) || 0;
const message = resultObj.message || "";
if (resultObj.alreadySpun === true) {
if (message) alert(message);
$canvas.hide();
return;
} else {
$(`.common-winning${selected}`).show();
if (getDeviceType() === 'sopmal_m') {
$(`.mobile-winning${selected}`).show();
} else {
$(`.winning${selected}`).show();
}
showWinningModal(selected);
$canvas.hide();
}
}
});
}
function getDeviceType() {
return $('#adScriptDeviceTy').val();
}
function showWinningModal(index) {
if (getDeviceType() === 'sopmal_m') {
console.log(typeof MicroModal);
console.log('모바일 - Micromodal 실행');
MicroModal.show('event_winning2');
} else {
$('#event_winning').modal();
}
}
}, 300);
});