diff --git a/src/api/audio_content.js b/src/api/audio_content.js index ba651e3..aeb8bc8 100644 --- a/src/api/audio_content.js +++ b/src/api/audio_content.js @@ -19,8 +19,8 @@ async function modifyAudioContent(request) { return Vue.axios.put("/admin/audio-content", request) } -async function getBannerList() { - return Vue.axios.get("/admin/audio-content/banner") +async function getBannerList(tabId) { + return Vue.axios.get("/admin/audio-content/banner?tabId=" + tabId) } async function saveBanner(formData) { @@ -43,8 +43,8 @@ async function updateBannerOrders(ids) { return Vue.axios.put('/admin/audio-content/banner/orders', {ids: ids}) } -async function getCurations() { - return Vue.axios.get("/admin/audio-content/curation") +async function getCurations(tabId) { + return Vue.axios.get("/admin/audio-content/curation?tabId=" + tabId) } async function saveCuration(request) { @@ -63,6 +63,36 @@ async function getAudioContentThemeList() { return Vue.axios.get("/admin/audio-content/theme") } +async function getAudioContentMainTabList() { + return Vue.axios.get("/admin/audio-content/main/tab") +} + +async function getCurationItems(curationId) { + return Vue.axios.get("/admin/audio-content/curation/items?curationId=" + curationId) +} + +async function searchContentItem(curationId, searchWord) { + return Vue.axios.get("/admin/audio-content/curation/search/content?curationId=" + curationId + "&searchWord=" + searchWord) +} + +async function searchSeriesItem(curationId, searchWord) { + return Vue.axios.get("/admin/audio-content/curation/search/series?curationId=" + curationId + "&searchWord=" + searchWord) +} + +async function addItemToCuration(curationId, itemIdList){ + return Vue.axios.post( + "/admin/audio-content/curation/add/item", + {curationId: curationId, itemIdList: itemIdList} + ) +} + +async function removeItemInCuration(curationId, itemId){ + return Vue.axios.put( + "/admin/audio-content/curation/remove/item", + {curationId: curationId, itemId: itemId} + ) +} + export { getAudioContentList, searchAudioContent, @@ -75,5 +105,11 @@ export { saveCuration, modifyCuration, updateCurationOrders, - getAudioContentThemeList + getAudioContentThemeList, + getAudioContentMainTabList, + getCurationItems, + searchSeriesItem, + searchContentItem, + addItemToCuration, + removeItemInCuration } diff --git a/src/api/audio_content_series_recommend.js b/src/api/audio_content_series_recommend.js new file mode 100644 index 0000000..57a933a --- /dev/null +++ b/src/api/audio_content_series_recommend.js @@ -0,0 +1,32 @@ +import Vue from 'vue'; + +async function getRecommendSeriesList(isFree) { + return Vue.axios.get("/admin/audio-content/series/recommend?isFree=" + isFree); +} + +async function saveRecommendSeries(formData) { + return Vue.axios.post('/admin/audio-content/series/recommend', formData, { + headers: { + "Content-Type": "multipart/form-data", + }, + }); +} + +async function modifyRecommendSeries(formData) { + return Vue.axios.put('/admin/audio-content/series/recommend', formData, { + headers: { + "Content-Type": "multipart/form-data", + }, + }); +} + +async function updateRecommendSeriesOrders(ids) { + return Vue.axios.put('/admin/audio-content/series/recommend/orders', {ids: ids}) +} + +export { + getRecommendSeriesList, + saveRecommendSeries, + modifyRecommendSeries, + updateRecommendSeriesOrders +} diff --git a/src/router/index.js b/src/router/index.js index 4b84bda..197a58f 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -80,15 +80,30 @@ const routes = [ name: 'ContentCuration', component: () => import(/* webpackChunkName: "content" */ '../views/Content/ContentCuration.vue') }, + { + path: '/content/curation/detail', + name: 'ContentCurationDetail', + component: () => import(/* webpackChunkName: "content" */ '../views/Content/ContentCurationDetail.vue') + }, { path: '/content/series/list', name: 'ContentSeriesList', - component: () => import(/* webpackChunkName: "content" */ '../views/Content/ContentSeriesList.vue') + component: () => import(/* webpackChunkName: "series" */ '../views/Series/ContentSeriesList.vue') }, { path: '/content/series/genre', name: 'ContentSeriesGenre', - component: () => import(/* webpackChunkName: "content" */ '../views/Content/ContentSeriesGenre.vue') + component: () => import(/* webpackChunkName: "series" */ '../views/Series/ContentSeriesGenre.vue') + }, + { + path: '/content/series/new', + name: 'ContentSeriesNew', + component: () => import(/* webpackChunkName: "series" */ '../views/Series/ContentSeriesNew.vue') + }, + { + path: '/content/series/recommend-free', + name: 'ContentSeriesRecommendFree', + component: () => import(/* webpackChunkName: "series" */ '../views/Series/ContentSeriesRecommendFree.vue') }, { path: '/promotion/event', diff --git a/src/views/Content/ContentCuration.vue b/src/views/Content/ContentCuration.vue index ddc8558..f24f875 100644 --- a/src/views/Content/ContentCuration.vue +++ b/src/views/Content/ContentCuration.vue @@ -10,11 +10,25 @@ - + + + + + + - + {{ item.title }} - + {{ item.description }} + +

+ O +

+

+ X +

+

O @@ -103,6 +129,26 @@ 콘텐츠 큐레이션 등록 + + + + 메인 탭 + + + + + + + + @@ -131,6 +177,19 @@ + + + + 시리즈 큐레이션 + + + + + + @@ -220,8 +279,10 @@ export default { show_delete_confirm_dialog: false, show_write_dialog: false, selected_curation: {}, - curation: {is_adult: false}, + curation: {is_adult: false, is_series: false}, curations: [], + tabs: [], + selected_tab_id: 1, headers: [ { text: '제목', @@ -235,6 +296,12 @@ export default { sortable: false, value: 'description', }, + { + text: '시리즈 큐레이션', + align: 'center', + sortable: false, + value: 'isSeries', + }, { text: '19금', align: 'center', @@ -252,7 +319,7 @@ export default { }, async created() { - await this.getCurations() + await this.getAudioContentMainTabList() }, methods: { @@ -273,22 +340,48 @@ export default { this.selected_curation = item this.curation.id = item.id + this.curation.tab_id = item.tabId this.curation.title = item.title this.curation.description = item.description + this.curation.is_series = item.isSeries this.curation.is_adult = item.isAdult this.show_write_dialog = true }, cancel() { - this.curation = {is_adult: false} + this.curation = {is_adult: false, is_series: false} this.selected_curation = {} this.is_modify = false this.show_write_dialog = false }, + handleItemClick(item) { + this.$router.push( + { + name: 'ContentCurationDetail', + params: { + curation_id: item.id, + title: item.title, + description: item.description, + is_series: item.isSeries, + is_adult: item.isAdult + } + } + ) + }, + validate() { + if ( + this.curation.tab_id === null || + this.curation.tab_id === undefined || + this.curation.tab_id <= 0 + ) { + this.notifyError("메인 탭을 선택하세요") + return false + } + if ( this.curation.title === null || this.curation.title === undefined || @@ -320,6 +413,27 @@ export default { this.show_delete_confirm_dialog = false }, + async getAudioContentMainTabList() { + this.is_loading = true + + try { + const res = await api.getAudioContentMainTabList() + if (res.status === 200 && res.data.success === true) { + const data = res.data.data + + this.tabs = data.filter(item => item.title !== '홈' && item.title !== '단편') + this.selected_tab_id = this.tabs[0].tabId + await this.getCurations() + } else { + this.notifyError(res.data.message || '알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.') + } + } catch (e) { + this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.') + } finally { + this.is_loading = false + } + }, + async submit() { if (!this.validate()) return; if (this.is_loading) return; @@ -328,8 +442,10 @@ export default { try { const request = { + tabId: this.curation.tab_id, title: this.curation.title, description: this.curation.description, + isSeries: this.curation.is_series, isAdult: this.curation.is_adult } @@ -357,6 +473,10 @@ export default { try { let request = {id: this.curation.id} + if (this.selected_curation.tab_id !== this.curation.tab_id) { + request.tabId = this.curation.tab_id + } + if (this.selected_curation.title !== this.curation.title && this.curation.title.trim().length > 0) { request.title = this.curation.title } @@ -368,6 +488,10 @@ export default { request.description = this.curation.description } + if (this.selected_curation.isSeries !== this.curation.is_series) { + request.isSeries = this.curation.is_series + } + if (this.selected_curation.isAdult !== this.curation.is_adult) { request.isAdult = this.curation.is_adult } @@ -439,7 +563,7 @@ export default { this.is_loading = true try { - const res = await api.getCurations() + const res = await api.getCurations(this.selected_tab_id) if (res.status === 200 && res.data.success === true) { this.curations = res.data.data } else { diff --git a/src/views/Content/ContentCurationDetail.vue b/src/views/Content/ContentCurationDetail.vue new file mode 100644 index 0000000..1d89fcb --- /dev/null +++ b/src/views/Content/ContentCurationDetail.vue @@ -0,0 +1,604 @@ + + + + + diff --git a/src/views/Content/ContentList.vue b/src/views/Content/ContentList.vue index e8ad28e..9032984 100644 --- a/src/views/Content/ContentList.vue +++ b/src/views/Content/ContentList.vue @@ -63,9 +63,6 @@ 내용 - - 큐레이션 - 크리에이터 @@ -134,7 +131,6 @@ :lines="3" /> - {{ item.curationTitle || '없음' }} {{ item.creatorNickname }} {{ item.theme }} @@ -307,22 +303,6 @@ - - - - 큐레이션 - - - - - - @@ -415,7 +395,6 @@ export default { search_word: '', audio_content: {}, audio_contents: [], - curations: [], themeList: [], selected_audio_content: {}, utm_source: '', @@ -426,7 +405,6 @@ export default { async created() { await this.getAudioContentThemeList(); - await this.getCurations() await this.getAudioContent() }, @@ -455,7 +433,6 @@ export default { this.audio_content.id = item.audioContentId this.audio_content.title = item.title this.audio_content.detail = item.detail - this.audio_content.curation_id = item.curationId this.audio_content.theme_id = item.themeId this.audio_content.is_adult = item.isAdult this.audio_content.is_comment_available = item.isCommentAvailable @@ -513,10 +490,6 @@ export default { request.detail = this.audio_content.detail } - if (this.selected_audio_content.curationId !== this.audio_content.curation_id) { - request.curationId = this.audio_content.curation_id - } - if (this.selected_audio_content.themeId !== this.audio_content.theme_id) { request.themeId = this.audio_content.theme_id } @@ -598,26 +571,6 @@ export default { } }, - async getCurations() { - this.is_loading = true - try { - const res = await api.getCurations() - if (res.status === 200 && res.data.success === true) { - this.curations = res.data.data.map((curation) => { - return {title: curation.title, value: curation.id} - }) - - this.curations.unshift({title: '없음', value: 0}) - } else { - this.notifyError(res.data.message || '알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.') - } - } catch (e) { - this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.') - } finally { - this.is_loading = false - } - }, - async getAudioContent() { this.is_loading = true try { diff --git a/src/views/Content/ContentMainTopBanner.vue b/src/views/Content/ContentMainTopBanner.vue index db85b17..a030ee0 100644 --- a/src/views/Content/ContentMainTopBanner.vue +++ b/src/views/Content/ContentMainTopBanner.vue @@ -16,11 +16,25 @@