diff --git a/src/api/audio_content_series.js b/src/api/audio_content_series.js index 8d940d6..5e11544 100644 --- a/src/api/audio_content_series.js +++ b/src/api/audio_content_series.js @@ -1,40 +1,89 @@ -import Vue from 'vue'; +import Vue from "vue"; async function getAudioContentSeriesList(page) { - return Vue.axios.get("/admin/audio-content/series?page=" + (page - 1) + "&size=10"); + return Vue.axios.get("/admin/audio-content/series?page=" + (page - 1) + "&size=10"); } async function getAudioContentSeriesGenreList() { - return Vue.axios.get('/admin/audio-content/series/genre'); + return Vue.axios.get("/admin/audio-content/series/genre"); } async function createAudioContentSeriesGenre(genre, is_adult) { - return Vue.axios.post('/admin/audio-content/series/genre', {genre: genre, isAdult: is_adult}) + return Vue.axios.post("/admin/audio-content/series/genre", { genre: genre, isAdult: is_adult }); } async function updateAudioContentSeriesGenre(request) { - return Vue.axios.put('/admin/audio-content/series/genre', request) + return Vue.axios.put("/admin/audio-content/series/genre", request); } async function updateAudioContentSeriesGenreOrders(ids) { - return Vue.axios.put('/admin/audio-content/series/genre/orders', {ids: ids}) + return Vue.axios.put("/admin/audio-content/series/genre/orders", { ids: ids }); } async function searchSeriesList(searchWord) { - return Vue.axios.get("/admin/audio-content/series/search?search_word=" + searchWord) + return Vue.axios.get("/admin/audio-content/series/search?search_word=" + searchWord); } // 시리즈 수정 async function updateAudioContentSeries(request) { - return Vue.axios.put('/admin/audio-content/series', request); + return Vue.axios.put("/admin/audio-content/series", request); +} + +// ======================== +// 시리즈 배너 API +// ======================== +// 배너 리스트 조회 +async function getSeriesBannerList(page = 1, size = 20) { + return Vue.axios.get("/admin/audio-content/series/banner/list", { + params: { page: page - 1, size } + }); +} + +// 배너 등록 +async function createSeriesBanner(bannerData) { + const formData = new FormData(); + if (bannerData.image) formData.append("image", bannerData.image); + const requestData = { seriesId: bannerData.seriesId }; + formData.append("request", JSON.stringify(requestData)); + return Vue.axios.post("/admin/audio-content/series/banner/register", formData, { + headers: { "Content-Type": "multipart/form-data" } + }); +} + +// 배너 수정 +async function updateSeriesBanner(bannerData) { + const formData = new FormData(); + if (bannerData.image) formData.append("image", bannerData.image); + const requestData = { seriesId: bannerData.seriesId, bannerId: bannerData.bannerId }; + formData.append("request", JSON.stringify(requestData)); + return Vue.axios.put("/admin/audio-content/series/banner/update", formData, { + headers: { "Content-Type": "multipart/form-data" } + }); +} + +// 배너 삭제 +async function deleteSeriesBanner(bannerId) { + // 백엔드 사양이 불명확하여 쿼리 파라미터로 전송 + return Vue.axios.delete("/admin/audio-content/series/banner/" + bannerId); +} + +// 배너 순서 변경 +async function updateSeriesBannerOrder(ids) { + return Vue.axios.put("/admin/audio-content/series/banner/orders", { ids }); } export { - getAudioContentSeriesList, - getAudioContentSeriesGenreList, - createAudioContentSeriesGenre, - updateAudioContentSeriesGenre, - updateAudioContentSeriesGenreOrders, - searchSeriesList, - updateAudioContentSeries -} + getAudioContentSeriesList, + getAudioContentSeriesGenreList, + createAudioContentSeriesGenre, + updateAudioContentSeriesGenre, + updateAudioContentSeriesGenreOrders, + searchSeriesList, + updateAudioContentSeries, + // series banner + getSeriesBannerList, + createSeriesBanner, + updateSeriesBanner, + deleteSeriesBanner, + updateSeriesBannerOrder +}; diff --git a/src/components/SideMenu.vue b/src/components/SideMenu.vue index 722e4e7..de31dbf 100644 --- a/src/components/SideMenu.vue +++ b/src/components/SideMenu.vue @@ -97,6 +97,26 @@ export default { if (res.status === 200 && res.data.success === true && res.data.data.length > 0) { this.items = res.data.data + // '시리즈 관리' 메뉴에 '배너 등록' 하위 메뉴 추가 + try { + const seriesMenu = this.items.find(m => m && m.title === '시리즈 관리') + if (seriesMenu) { + if (!Array.isArray(seriesMenu.items)) { + seriesMenu.items = seriesMenu.items ? [].concat(seriesMenu.items) : [] + } + const exists = seriesMenu.items.some(ci => ci && ci.route === '/content/series/banner') + if (!exists) { + seriesMenu.items.push({ + title: '배너 등록', + route: '/content/series/banner', + items: null + }) + } + } + } catch (e) { + // ignore + } + // 캐릭터 챗봇 메뉴 추가 this.items.push({ title: '캐릭터 챗봇', diff --git a/src/router/index.js b/src/router/index.js index 7a01988..0b7b254 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -120,6 +120,11 @@ const routes = [ name: 'ContentSeriesRecommendFree', component: () => import(/* webpackChunkName: "series" */ '../views/Series/ContentSeriesRecommendFree.vue') }, + { + path: '/content/series/banner', + name: 'ContentSeriesBanner', + component: () => import(/* webpackChunkName: "series" */ '../views/Series/ContentSeriesBanner.vue') + }, { path: '/promotion/event', name: 'EventView', diff --git a/src/views/Series/ContentSeriesBanner.vue b/src/views/Series/ContentSeriesBanner.vue new file mode 100644 index 0000000..f52d3a3 --- /dev/null +++ b/src/views/Series/ContentSeriesBanner.vue @@ -0,0 +1,529 @@ + + + + + mdi-arrow-left + + + 시리즈 배너 관리 + + + + + + + + 배너 추가 + + + + + + + + + + + + + + + + + + + + {{ resolveSeriesTitle(banner) }} + + + + + 수정 + + + 삭제 + + + + + + + + + + + + 등록된 배너가 없습니다. + + + + + + + + + + + + + + + + {{ isEdit ? '배너 수정' : '배너 추가' }} + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ series.title || series.name }} + + + + + + + + + 검색결과가 없습니다. + + + + + + + + + + + + + + + 선택된 시리즈: {{ selectedSeries.title || selectedSeries.name }} + + + + + + + + + + + + 취소 + + + {{ isSubmitting ? '저장중...' : (isEdit ? '수정' : '추가') }} + + + + + + + + + + 삭제 확인 + + + 이 배너를 삭제하시겠습니까? + + + + + 취소 + + + 삭제 + + + + + + + + + +
등록된 배너가 없습니다.