
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
<template>
<div class="title-box flex justify-between mb20">
<p class="title">내 사진첩</p>
</div>
<div class="myphoto mb30">
<div>
<div class="title-box flex justify-end mb40">
<select name="" id="">
<option v-for="classItem in classList" :key="classItem.sclsId" :value="classItem.sclsId" @click="
currentPage = 1;
stdPhotoSelectList(classItem.sclsId);
">
{{ classItem.sclsNm }}
</option>
</select>
</div>
<div class="btnGroup" style="display: flex; flex-direction: column">
<button v-for="n in totalPages" :key="n" @click="changePage(n)" type="button" title="페이지 버튼" class="tab-btn">
<img v-if="currentPage !== n" src="../../../resources/img/btn49_15s_normal.png" alt="" />
<img v-else src="../../../resources/img/btn49_15s_click.png" alt="" />
<p :class="{ 'custom-style': currentPage === n }">{{ n }}</p>
</button>
</div>
<div v-if="selectedTab === 'tab1'" class="tab-box">
<div class="flex justify-between">
<div v-for="(photo, index) in (photoList?.result || []).slice(0, 3)" :key="index" class="photo"
:style="{ transform: getRotation(index) }" @click="buttonSearch(photo)">
<div class="class">
<div class="box">
<div class="photo-container">
<img :src="fetchImage(photo.fileRpath)" alt="" />
</div>
</div>
<div class="photo-text mt10 ml10">
<div class="member ml30">{{ photo.likeData }}</div>
<div class="title2">{{ photo.unitName }}</div>
</div>
</div>
</div>
</div>
<div class="flex justify-between mt20">
<div v-for="(photo, index) in (photoList?.result || []).slice(3, 6)" :key="index + 3" class="photo"
:style="{ transform: getRotation(index + 3) }" @click="buttonSearch(photo)">
<div class="class">
<div class="box">
<div class="photo-container">
<img :src="fetchImage(photo.fileRpath)" alt="" style="width: 150px" />
</div>
</div>
<div class="photo-text mt10 ml10">
<div class="member ml30">{{ photo.likeData }}</div>
<div class="title2">{{ photo.unitName }}</div>
</div>
</div>
</div>
</div>
</div>
<div class="popup-wrap" v-show="searchOpen">
<div class="popup-box">
<div class="flex mb10 justify-between">
<p class="popup-title">알림</p>
<button type="button" class="popup-close-btn" @click="closeBtn">
<svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon>
</button>
</div>
<div class="photo-modal flex justify-between mt20" v-if="photoData.length > 0">
<div class="box">
<div>
<img :src="fetchImage(photoData[0].fileRpath)" alt="" style="width: 640px; height: 480px" />
</div>
</div>
<div class="photo-title-container">
<div class="title1">
{{ photoData[0].unitName }}을 마친
<em class="yellow">{{ photoData[0].stdName }}</em>친구
</div>
<p class="title2 date">{{ photoData[0].photoDate }}</p>
</div>
</div>
<div class="text flex justify-between mt20" v-else>
<span class="title1">데이터를 불러올 수 없습니다.</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import SvgIcon from "@jamescoyle/vue-icon";
import { mdiMagnify, mdiHeart, mdiWindowClose } from "@mdi/js";
import { mdilArrowRight } from "@mdi/light-js";
import ProgressBar from "../../component/ProgressBar.vue";
import axios from "axios";
export default {
data() {
return {
classList: [],
photoList: [],
photoData: [],
currentPage: 1,
pageSize: 6,
totalPages: 1,
mdiWindowClose: mdiWindowClose,
selectedTab: "tab1",
mdiMagnify: mdiMagnify,
mdilArrowRight: mdilArrowRight,
timer: "00:00",
progress: 20,
showModal: false,
searchOpen: false,
searchOpen2: false,
};
},
methods: {
stdClassesSelectList: function () {
const vm = this;
axios({
url: "/classes/selectClass.json",
method: "post",
headers: {
"Content-Type": "application/json; charset=UTF-8",
},
data: {
userId: "1",
},
})
.then(function (response) {
console.log("classList - response : ", response.data);
vm.classList = response.data.data;
vm.currentPage = 1;
})
.catch(function (error) {
console.log("classList - error : ", error);
alert("학생 반 조회에 오류가 발생했습니다.");
});
},
stdPhotoSelectList: function (sclsId) {
const vm = this;
axios({
url: "/photo/stdPhotoList.json",
method: "post",
headers: {
"Content-Type": "application/json; charset=UTF-8",
},
data: {
stdId: "1",
sclsId: "1", // 여기에 sclsId들어가야함
page: vm.currentPage,
pageSize: vm.pageSize,
},
})
.then(function (response) {
console.log("photoList - response : ", response.data);
vm.photoList = response.data;
vm.totalPages = Math.ceil(response.data.photoCount / vm.pageSize);
})
.catch(function (error) {
console.log("photoList - error : ", error);
alert("반별 내 사진 조회에 오류가 발생했습니다.");
});
},
getRotation(index) {
const rotations = [2, -1, 1, -2, 1, -1];
return `rotate(${rotations[index]}deg)`;
},
changePage(pageNumber) {
this.currentPage = pageNumber;
this.stdPhotoSelectList(this.selectedClassId);
},
closeModal() {
this.showModal = false;
},
buttonSearch(photo) {
if (!photo) return;
const vm = this;
this.searchOpen = true;
axios({
url: "/photo/photoDetail.json",
method: "post",
headers: {
"Content-Type": "application/json; charset=UTF-8",
},
data: {
photoId: photo.photoId,
},
})
.then(function (response) {
console.log("photoData - response : ", response.data);
vm.photoData = response.data;
})
.catch(function (error) {
console.log("photoData - error : ", error);
alert("사진 조회에 오류가 발생했습니다.");
});
},
closeBtn() {
this.searchOpen = false;
},
goToPage(page) {
this.$router.push({ name: page });
},
increaseProgress() {
if (this.progress < 100) {
this.progress += 10;
}
},
showConfirm(type) {
let message = "";
if (type === "cancel") {
message = "삭제하시겠습니까?";
} else if (type === "reset") {
message = "초기화하시겠습니까?";
} else if (type === "save") {
message = "등록하시겠습니까?";
}
if (confirm(message)) {
this.goBack();
}
},
// 사진 경로 불러오기
imageSearch(photo) {
if (!photo) return;
const vm = this;
this.searchOpen = true;
axios({
url: "/photo/photoDetail.json",
method: "post",
headers: {
"Content-Type": "application/json; charset=UTF-8",
},
data: {
photoId: photo.photoId,
},
})
.then(function (response) {
console.log("photoData - response : ", response.data);
vm.photoData = response.data;
})
.catch(function (error) {
console.log("photoData - error : ", error);
alert("사진 조회에 오류가 발생했습니다.");
});
},
fetchImage(fileRpath) {
return "http://165.229.169.113:9080/" + fileRpath;
},
},
watch: {},
computed: {
currentPhotos() {
// 현재 페이지에 해당하는 사진들만 반환
const start = (this.currentPage - 1) * this.pageSize;
const end = start + this.pageSize;
return this.photoList.result.slice(start, end);
},
},
components: {
SvgIcon,
ProgressBar,
},
mounted() {
console.log("Main2 mounted");
this.stdClassesSelectList();
this.stdPhotoSelectList();
},
};
</script>
<style scoped>
.btnGroup button {
cursor: pointer;
z-index: 100000;
}
.popup-wrap {
z-index: 10000000;
}
.popup-box {
top: 500px;
width: 950px;
height: 650px;
}
.class {
width: 260px;
height: 200px;
}
.photo-container {
text-align: center;
}
.photo-container img {
width: 150px;
height: 110px;
}
.photo-text {
display: flex;
flex-direction: column;
gap: 5px;
}
.photo-modal {
flex-direction: column;
}
.photo-modal .box {
text-align: center;
}
.photo-title-container {
display: flex;
justify-content: space-between;
margin-top: 20px;
}
</style>
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335<template><div class="title-box flex justify-between mb20"><p class="title">내 사진첩</p></div><div class="myphoto mb30"><div><div class="title-box flex justify-end mb40"><select name="" id=""><option v-for="classItem in classList" :key="classItem.sclsId" :value="classItem.sclsId" @click="currentPage = 1;stdPhotoSelectList(classItem.sclsId);">{{ classItem.sclsNm }}</option></select></div><div class="btnGroup" style="display: flex; flex-direction: column"><button v-for="n in totalPages" :key="n" @click="changePage(n)" type="button" title="페이지 버튼" class="tab-btn"><img v-if="currentPage !== n" src="../../../resources/img/btn49_15s_normal.png" alt="" /><img v-else src="../../../resources/img/btn49_15s_click.png" alt="" /><p :class="{ 'custom-style': currentPage === n }">{{ n }}</p></button></div><div v-if="selectedTab === 'tab1'" class="tab-box"><div class="flex justify-between"><div v-for="(photo, index) in (photoList?.result || []).slice(0, 3)" :key="index" class="photo":style="{ transform: getRotation(index) }" @click="buttonSearch(photo)"><div class="class"><div class="box"><div class="photo-container"><img :src="fetchImage(photo.fileRpath)" alt="" /></div></div><div class="photo-text mt10 ml10"><div class="member ml30">{{ photo.likeData }}</div><div class="title2">{{ photo.unitName }}</div></div></div></div></div><div class="flex justify-between mt20"><div v-for="(photo, index) in (photoList?.result || []).slice(3, 6)" :key="index + 3" class="photo":style="{ transform: getRotation(index + 3) }" @click="buttonSearch(photo)"><div class="class"><div class="box"><div class="photo-container"><img :src="fetchImage(photo.fileRpath)" alt="" style="width: 150px" /></div></div><div class="photo-text mt10 ml10"><div class="member ml30">{{ photo.likeData }}</div><div class="title2">{{ photo.unitName }}</div></div></div></div></div></div><div class="popup-wrap" v-show="searchOpen"><div class="popup-box"><div class="flex mb10 justify-between"><p class="popup-title">알림</p><button type="button" class="popup-close-btn" @click="closeBtn"><svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon></button></div><div class="photo-modal flex justify-between mt20" v-if="photoData.length > 0"><div class="box"><div><img :src="fetchImage(photoData[0].fileRpath)" alt="" style="width: 640px; height: 480px" /></div></div><div class="photo-title-container"><div class="title1">{{ photoData[0].unitName }}을 마친<em class="yellow">{{ photoData[0].stdName }}</em>친구</div><p class="title2 date">{{ photoData[0].photoDate }}</p></div></div><div class="text flex justify-between mt20" v-else><span class="title1">데이터를 불러올 수 없습니다.</span></div></div></div></div></div></template><script>import SvgIcon from "@jamescoyle/vue-icon";import { mdiMagnify, mdiHeart, mdiWindowClose } from "@mdi/js";import { mdilArrowRight } from "@mdi/light-js";import ProgressBar from "../../component/ProgressBar.vue";import axios from "axios";export default {data() {return {classList: [],photoList: [],photoData: [],currentPage: 1,pageSize: 6,totalPages: 1,mdiWindowClose: mdiWindowClose,selectedTab: "tab1",mdiMagnify: mdiMagnify,mdilArrowRight: mdilArrowRight,timer: "00:00",progress: 20,showModal: false,searchOpen: false,searchOpen2: false,};},methods: {stdClassesSelectList: function () {const vm = this;axios({url: "/classes/selectClass.json",method: "post",headers: {"Content-Type": "application/json; charset=UTF-8",},data: {userId: "1",},}).then(function (response) {console.log("classList - response : ", response.data);vm.classList = response.data.data;vm.currentPage = 1;}).catch(function (error) {console.log("classList - error : ", error);alert("학생 반 조회에 오류가 발생했습니다.");});},stdPhotoSelectList: function (sclsId) {const vm = this;axios({url: "/photo/stdPhotoList.json",method: "post",headers: {"Content-Type": "application/json; charset=UTF-8",},data: {stdId: "1",sclsId: "1", // 여기에 sclsId들어가야함page: vm.currentPage,pageSize: vm.pageSize,},}).then(function (response) {console.log("photoList - response : ", response.data);vm.photoList = response.data;vm.totalPages = Math.ceil(response.data.photoCount / vm.pageSize);}).catch(function (error) {console.log("photoList - error : ", error);alert("반별 내 사진 조회에 오류가 발생했습니다.");});},getRotation(index) {const rotations = [2, -1, 1, -2, 1, -1];return `rotate(${rotations[index]}deg)`;},changePage(pageNumber) {this.currentPage = pageNumber;this.stdPhotoSelectList(this.selectedClassId);},closeModal() {this.showModal = false;},buttonSearch(photo) {if (!photo) return;const vm = this;this.searchOpen = true;axios({url: "/photo/photoDetail.json",method: "post",headers: {"Content-Type": "application/json; charset=UTF-8",},data: {photoId: photo.photoId,},}).then(function (response) {console.log("photoData - response : ", response.data);vm.photoData = response.data;}).catch(function (error) {console.log("photoData - error : ", error);alert("사진 조회에 오류가 발생했습니다.");});},closeBtn() {this.searchOpen = false;},goToPage(page) {this.$router.push({ name: page });},increaseProgress() {if (this.progress < 100) {this.progress += 10;}},showConfirm(type) {let message = "";if (type === "cancel") {message = "삭제하시겠습니까?";} else if (type === "reset") {message = "초기화하시겠습니까?";} else if (type === "save") {message = "등록하시겠습니까?";}if (confirm(message)) {this.goBack();}},// 사진 경로 불러오기imageSearch(photo) {if (!photo) return;const vm = this;this.searchOpen = true;axios({url: "/photo/photoDetail.json",method: "post",headers: {"Content-Type": "application/json; charset=UTF-8",},data: {photoId: photo.photoId,},}).then(function (response) {console.log("photoData - response : ", response.data);vm.photoData = response.data;}).catch(function (error) {console.log("photoData - error : ", error);alert("사진 조회에 오류가 발생했습니다.");});},fetchImage(fileRpath) {return "http://165.229.169.113:9080/" + fileRpath;},},watch: {},computed: {currentPhotos() {// 현재 페이지에 해당하는 사진들만 반환const start = (this.currentPage - 1) * this.pageSize;const end = start + this.pageSize;return this.photoList.result.slice(start, end);},},components: {SvgIcon,ProgressBar,},mounted() {console.log("Main2 mounted");this.stdClassesSelectList();this.stdPhotoSelectList();},};</script><style scoped>.btnGroup button {cursor: pointer;z-index: 100000;}.popup-wrap {z-index: 10000000;}.popup-box {top: 500px;width: 950px;height: 650px;}.class {width: 260px;height: 200px;}.photo-container {text-align: center;}.photo-container img {width: 150px;height: 110px;}.photo-text {display: flex;flex-direction: column;gap: 5px;}.photo-modal {flex-direction: column;}.photo-modal .box {text-align: center;}.photo-title-container {display: flex;justify-content: space-between;margin-top: 20px;}</style>