검색/페이징/필터링 후 수정시 검색어/페이징 풀림

This commit is contained in:
nevermoregb 2025-03-28 01:08:01 +09:00
parent 92b7d5d4ac
commit de04cf679b
2 changed files with 118 additions and 35 deletions

View File

@ -166,8 +166,18 @@
// //
const goList = () => { const goList = () => {
accessStore.$reset(); accessStore.$reset();
//router.push('/board');
router.back(); const getFilter = localStorage.getItem(`boardList_${currentBoardId.value}`);
if (getFilter) {
router.push({
path: '/board',
query: JSON.parse(getFilter),
});
} else {
router.push('/board');
}
//router.back();
}; };
// //

View File

@ -8,7 +8,7 @@
</div> </div>
<div class="d-flex align-items-center" style="gap: 15px"> <div class="d-flex align-items-center" style="gap: 15px">
<!-- 리스트 갯수 선택 --> <!-- 리스트 갯수 선택 -->
<select class="form-select w-auto" v-model="selectedSize" @change="handleSizeChange" style="margin-left: 0"> <select class="form-select w-auto" v-model="selectedSize" @change="handleSizeChange($event)" style="margin-left: 0">
<option value="10">10개씩</option> <option value="10">10개씩</option>
<option value="20">20개씩</option> <option value="20">20개씩</option>
<option value="30">30개씩</option> <option value="30">30개씩</option>
@ -17,14 +17,20 @@
</select> </select>
<!-- 셀렉트 박스 --> <!-- 셀렉트 박스 -->
<select class="form-select w-auto" v-model="selectedOrder" @change="handleSortChange"> <select class="form-select w-auto" v-model="selectedOrder" @change="handleSortChange($event)">
<option value="date">날짜</option> <option value="date">날짜</option>
<option value="views">조회수</option> <option value="views">조회수</option>
</select> </select>
<!-- 공지 접기 기능 --> <!-- 공지 접기 기능 -->
<div class="form-check mb-0"> <div class="form-check mb-0">
<input class="form-check-input" type="checkbox" v-model="showNotices" id="hideNotices" /> <input
class="form-check-input"
type="checkbox"
v-model="showNotices"
id="hideNotices"
@change="handlePageFilter()"
/>
<label class="form-check-label" for="hideNotices">공지 숨기기</label> <label class="form-check-label" for="hideNotices">공지 숨기기</label>
</div> </div>
@ -71,9 +77,7 @@
class="bi bi-paperclip" class="bi bi-paperclip"
></i> ></i>
<span v-if="isNewPost(notice.rawDate)" class="box-new badge text-white ms-2 fs-tiny"> <span v-if="isNewPost(notice.rawDate)" class="box-new badge text-white ms-2 fs-tiny"> N </span>
N
</span>
</div> </div>
</td> </td>
<td class="text-center">{{ notice.author }}</td> <td class="text-center">{{ notice.author }}</td>
@ -89,7 +93,7 @@
@click="goDetail(post.realId)" @click="goDetail(post.realId)"
> >
<td class="text-center">{{ post.id }}</td> <td class="text-center">{{ post.id }}</td>
<td class="cursor-pointer "> <td class="cursor-pointer">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
{{ post.title }} {{ post.title }}
<span v-if="post.commentCount" class="comment-count">[ {{ post.commentCount }} ]</span> <span v-if="post.commentCount" class="comment-count">[ {{ post.commentCount }} ]</span>
@ -126,10 +130,11 @@
</template> </template>
<script setup> <script setup>
import { ref, onMounted } from 'vue'; import { ref, onMounted, watch } from 'vue';
import Pagination from '@c/pagination/Pagination.vue'; import Pagination from '@c/pagination/Pagination.vue';
import SearchBar from '@c/search/SearchBar.vue'; import SearchBar from '@c/search/SearchBar.vue';
import router from '@/router'; //import { route, router } from '@/router';
import { useRoute, useRouter } from 'vue-router';
import WriteButton from '@c/button/WriteBtn.vue'; import WriteButton from '@c/button/WriteBtn.vue';
import axios from '@api'; import axios from '@api';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
@ -148,6 +153,9 @@
const selectedSize = ref(10); const selectedSize = ref(10);
const showNotices = ref(false); const showNotices = ref(false);
const router = useRouter();
const route = useRoute();
const pagination = ref({ const pagination = ref({
currentPage: 1, currentPage: 1,
pages: 1, pages: 1,
@ -165,9 +173,32 @@
// //
const goDetail = id => { const goDetail = id => {
saveFilterToStorage(id);
router.push({ name: 'BoardDetail', params: { id: id } }); router.push({ name: 'BoardDetail', params: { id: id } });
}; };
//
const saveFilterToStorage = seq => {
const query = {
page: 1,
size: selectedSize.value,
orderBy: selectedOrder.value,
searchText: searchText.value,
showNotice: showNotices.value,
};
localStorage.setItem(`boardList_${seq}`, JSON.stringify(query));
};
//
const clearFliterStorage = () => {
Object.keys(localStorage).forEach(key => {
if (key.startsWith('boardList_')) {
localStorage.removeItem(key);
}
});
};
// ( HH:mm, YYYY-MM-DD) // ( HH:mm, YYYY-MM-DD)
const formatDate = dateString => { const formatDate = dateString => {
const date = dayjs(dateString); const date = dayjs(dateString);
@ -183,28 +214,30 @@
// //
const search = e => { const search = e => {
searchText.value = e.trim(); searchText.value = e.trim();
fetchGeneralPosts(1); handlePageFilter();
}; };
// //
const handleSortChange = () => { const handleSortChange = e => {
fetchGeneralPosts(1); selectedOrder.value = e.target.value;
handlePageFilter();
}; };
// //
const handleSizeChange = () => { const handleSizeChange = e => {
fetchGeneralPosts(1); selectedSize.value = e.target.value;
handlePageFilter();
}; };
// //
const fetchGeneralPosts = async (page = 1) => { const fetchGeneralPosts = async (page = 1, keyword = '', orderBy = 'date', size = 10) => {
try { try {
const { data } = await axios.get('board/general', { const { data } = await axios.get('board/general', {
params: { params: {
page, page,
size: selectedSize.value, size: size,
orderBy: selectedOrder.value, orderBy: orderBy,
searchKeyword: searchText.value, searchKeyword: keyword,
}, },
}); });
@ -243,11 +276,11 @@
} catch (error) {} } catch (error) {}
}; };
// //
const fetchNoticePosts = async () => { const fetchNoticePosts = async () => {
try { try {
const { data } = await axios.get("board/notices", { const { data } = await axios.get('board/notices', {
params: { searchKeyword: searchText.value } params: { searchKeyword: searchText.value },
}); });
if (data?.data) { if (data?.data) {
@ -275,20 +308,60 @@ const fetchNoticePosts = async () => {
} }
searchText.value = searchTextValue; searchText.value = searchTextValue;
fetchGeneralPosts(1); handlePageFilter();
}; };
// //
const handlePageChange = page => { const handlePageChange = page => {
if (page !== pagination.value.currentPage) { if (page !== pagination.value.currentPage) {
fetchGeneralPosts(page); handlePageFilter(page);
} }
}; };
// ( )
const handlePageFilter = (page = 1) => {
router.push({
path: '/board',
query: {
page: page,
size: selectedSize.value,
orderBy: selectedOrder.value,
searchText: searchText.value,
showNotice: showNotices.value,
},
});
};
// ,
watch(
() => route.query,
newQuery => {
pagination.currentPage = newQuery.page || 1;
const keyword = newQuery?.searchText;
const orderBy = newQuery?.orderBy;
const size = newQuery?.size;
fetchGeneralPosts(pagination.currentPage, keyword, orderBy, size);
},
);
// //
onMounted(() => { onMounted(() => {
//
const page = route.query?.page;
const keyword = route.query?.searchText;
const orderBy = route.query?.orderBy;
const size = route.query?.size;
const showNotice = route.query?.showNotice;
//
if (keyword) searchText.value = keyword;
if (orderBy) selectedOrder.value = orderBy;
if (size) selectedSize.value = size;
if (showNotice) showNotices.value = showNotice == 'false' ? false : true;
clearFliterStorage();
fetchNoticePosts(); fetchNoticePosts();
fetchGeneralPosts(); fetchGeneralPosts(page, keyword, orderBy, size);
}); });
</script> </script>