From 1082c9334f113f9d1eaa6369c1c038c1a8da83b1 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Tue, 23 Apr 2024 00:18:32 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=8B=9C=EB=A6=AC=EC=A6=88=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D/=EC=88=98=EC=A0=95/=EC=82=AD=EC=A0=9C=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 19 + package.json | 1 + src/api/audio_content_series.js | 60 +++ src/router/index.js | 5 + src/views/Content/ContentSeriesList.vue | 684 ++++++++++++++++++++++++ 5 files changed, 769 insertions(+) create mode 100644 src/api/audio_content_series.js create mode 100644 src/views/Content/ContentSeriesList.vue diff --git a/package-lock.json b/package-lock.json index 8260de0..3434c2c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "core-js": "^3.6.5", "vue": "^2.6.11", "vue-router": "^3.2.0", + "vue-show-more-text": "^2.0.2", "vue2-datepicker": "^3.11.1", "vue2-editor": "^2.10.3", "vue2-timepicker": "^1.1.6", @@ -14488,6 +14489,15 @@ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.3.tgz", "integrity": "sha512-FUlILrW3DGitS2h+Xaw8aRNvGTwtuaxrRkNSHWTizOfLUie7wuYwezeZ50iflRn8YPV5kxmU2LQuu3nM/b3Zsg==" }, + "node_modules/vue-show-more-text": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vue-show-more-text/-/vue-show-more-text-2.0.2.tgz", + "integrity": "sha512-x/WuikWAx8Hm4gpZx6KHtJYiXDordGdSoXrd34lTiJeAnlT8Y7Yc0FfGBNdUv6mXncuET3LiRwwNz+X5gI+oiw==", + "dependencies": { + "core-js": "^3.6.5", + "vue": "^2.6.11" + } + }, "node_modules/vue-style-loader": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", @@ -27252,6 +27262,15 @@ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.3.tgz", "integrity": "sha512-FUlILrW3DGitS2h+Xaw8aRNvGTwtuaxrRkNSHWTizOfLUie7wuYwezeZ50iflRn8YPV5kxmU2LQuu3nM/b3Zsg==" }, + "vue-show-more-text": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vue-show-more-text/-/vue-show-more-text-2.0.2.tgz", + "integrity": "sha512-x/WuikWAx8Hm4gpZx6KHtJYiXDordGdSoXrd34lTiJeAnlT8Y7Yc0FfGBNdUv6mXncuET3LiRwwNz+X5gI+oiw==", + "requires": { + "core-js": "^3.6.5", + "vue": "^2.6.11" + } + }, "vue-style-loader": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", diff --git a/package.json b/package.json index 3800d20..352a21e 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "core-js": "^3.6.5", "vue": "^2.6.11", "vue-router": "^3.2.0", + "vue-show-more-text": "^2.0.2", "vue2-datepicker": "^3.11.1", "vue2-editor": "^2.10.3", "vue2-timepicker": "^1.1.6", diff --git a/src/api/audio_content_series.js b/src/api/audio_content_series.js new file mode 100644 index 0000000..304c8c8 --- /dev/null +++ b/src/api/audio_content_series.js @@ -0,0 +1,60 @@ +import Vue from 'vue'; + +async function getGenreList() { + return Vue.axios.get("/creator-admin/audio-content/series/genre"); +} + +async function getSeriesList(page) { + return Vue.axios.get("/creator-admin/audio-content/series?page=" + (page - 1) + "&size=10"); +} + +async function createSeries(formData) { + return Vue.axios.post("/creator-admin/audio-content/series", formData, { + headers: { + "Content-Type": "multipart/form-data", + }, + }); +} + +async function modifySeries(formData) { + return Vue.axios.put("/creator-admin/audio-content/series", formData, { + headers: { + "Content-Type": "multipart/form-data", + }, + }); +} + +async function getSeriesDetail(seriesId) { + return Vue.axios.get("/creator-admin/audio-content/series/" + seriesId); +} + +async function getSeriesContent(seriesId, page) { + return Vue.axios.get( + "/creator-admin/audio-content/series/" + seriesId + "/content?page=" + (page - 1) + "&size=10" + ); +} + +async function addingContentToTheSeries(seriesId, contentIdList) { + return Vue.axios.post( + "/creator-admin/audio-content/series/add/content", + {seriesId: seriesId, contentIdList: contentIdList} + ) +} + +async function removeContentInTheSeries(seriesId, contentId) { + return Vue.axios.post( + "/creator-admin/audio-content/series/remove/content", + {seriesId: seriesId, contentId: contentId} + ) +} + +export { + getGenreList, + getSeriesList, + createSeries, + modifySeries, + getSeriesDetail, + getSeriesContent, + addingContentToTheSeries, + removeContentInTheSeries +} diff --git a/src/router/index.js b/src/router/index.js index 9e3d825..11ad3fc 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -25,6 +25,11 @@ const routes = [ name: 'ContentCategoryList', component: () => import(/* webpackChunkName: "content" */ '../views/Content/ContentCategoryList.vue') }, + { + path: '/content/series/list', + name: 'ContentSeriesList', + component: () => import(/* webpackChunkName: "content" */ '../views/Content/ContentSeriesList.vue') + }, { path: '/calculate/live', name: 'CalculateLive', diff --git a/src/views/Content/ContentSeriesList.vue b/src/views/Content/ContentSeriesList.vue new file mode 100644 index 0000000..30a9c6b --- /dev/null +++ b/src/views/Content/ContentSeriesList.vue @@ -0,0 +1,684 @@ + + + + + -- 2.40.1 From d9aaca3827284e1a81e7fd069fc309f38478b850 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Tue, 23 Apr 2024 18:49:40 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=EC=8B=9C=EB=A6=AC=EC=A6=88=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router/index.js | 5 + src/views/Content/ContentList.vue | 14 --- src/views/Content/ContentSeriesDetail.vue | 123 ++++++++++++++++++++++ src/views/Content/ContentSeriesList.vue | 33 +++++- 4 files changed, 156 insertions(+), 19 deletions(-) create mode 100644 src/views/Content/ContentSeriesDetail.vue diff --git a/src/router/index.js b/src/router/index.js index 11ad3fc..caa22eb 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -30,6 +30,11 @@ const routes = [ name: 'ContentSeriesList', component: () => import(/* webpackChunkName: "content" */ '../views/Content/ContentSeriesList.vue') }, + { + path: '/content/series/detail', + name: 'ContentSeriesDetail', + component: () => import(/* webpackChunkName: "content" */ '../views/Content/ContentSeriesDetail.vue') + }, { path: '/calculate/live', name: 'CalculateLive', diff --git a/src/views/Content/ContentList.vue b/src/views/Content/ContentList.vue index 13424dd..1b990f0 100644 --- a/src/views/Content/ContentList.vue +++ b/src/views/Content/ContentList.vue @@ -617,20 +617,6 @@ - - - - - - - - diff --git a/src/views/Content/ContentSeriesDetail.vue b/src/views/Content/ContentSeriesDetail.vue new file mode 100644 index 0000000..077edd2 --- /dev/null +++ b/src/views/Content/ContentSeriesDetail.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/src/views/Content/ContentSeriesList.vue b/src/views/Content/ContentSeriesList.vue index 30a9c6b..31cbeb6 100644 --- a/src/views/Content/ContentSeriesList.vue +++ b/src/views/Content/ContentSeriesList.vue @@ -31,7 +31,11 @@ - + @@ -322,6 +326,20 @@ + + + + + + + + @@ -334,7 +352,6 @@ export default { data() { return { is_loading: false, - is_modify: false, show_write_dialog: false, show_delete_confirm_dialog: false, series: {is_adult: false, published_days_of_week: []}, @@ -348,7 +365,7 @@ export default { {value: 'MON', str: '월'}, {value: 'TUE', str: '화'}, {value: 'WED', str: '수'}, - {value: 'THR', str: '목'}, + {value: 'THU', str: '목'}, {value: 'FRI', str: '금'}, {value: 'SAT', str: '토'}, ], @@ -464,6 +481,10 @@ export default { this.submit(); }, + selectSeries(series) { + this.$router.push({name: 'ContentSeriesDetail', params: {seriesId: series.seriesId}}) + }, + async getSeriesGenreList() { this.is_loading = true try { @@ -588,8 +609,6 @@ export default { request.studio = this.series.studio } - console.log(request) - const formData = new FormData() formData.append("request", JSON.stringify(request)) @@ -681,4 +700,8 @@ export default { -webkit-line-clamp: 2; max-height: 2em; } + +.cover-image { + aspect-ratio: 1/1.4; +} -- 2.40.1 From 80e2e7d8027211e0f63abb170b8a359f1dfb9955 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Wed, 24 Apr 2024 01:13:28 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=EC=8B=9C=EB=A6=AC=EC=A6=88=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20-=20=EC=BD=98?= =?UTF-8?q?=ED=85=90=EC=B8=A0=20=EB=A6=AC=EC=8A=A4=ED=8A=B8/=EC=BD=98?= =?UTF-8?q?=ED=85=90=EC=B8=A0=20=EC=82=AD=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/audio_content_series.js | 2 +- src/views/Content/ContentCategoryList.vue | 27 ---- src/views/Content/ContentSeriesDetail.vue | 143 +++++++++++++++++++++- 3 files changed, 142 insertions(+), 30 deletions(-) diff --git a/src/api/audio_content_series.js b/src/api/audio_content_series.js index 304c8c8..a2c19c5 100644 --- a/src/api/audio_content_series.js +++ b/src/api/audio_content_series.js @@ -42,7 +42,7 @@ async function addingContentToTheSeries(seriesId, contentIdList) { } async function removeContentInTheSeries(seriesId, contentId) { - return Vue.axios.post( + return Vue.axios.put( "/creator-admin/audio-content/series/remove/content", {seriesId: seriesId, contentId: contentId} ) diff --git a/src/views/Content/ContentCategoryList.vue b/src/views/Content/ContentCategoryList.vue index 12f54dc..5431067 100644 --- a/src/views/Content/ContentCategoryList.vue +++ b/src/views/Content/ContentCategoryList.vue @@ -339,33 +339,6 @@ export default { page: 1, total_page: 0, - - headers: [ - { - text: '커버이미지', - align: 'center', - sortable: false, - value: 'image', - }, - { - text: '제목', - align: 'center', - sortable: false, - value: 'title', - }, - { - text: '19금', - align: 'center', - sortable: false, - value: 'isAdult', - }, - { - text: '관리', - align: 'center', - sortable: false, - value: 'management' - }, - ] } }, diff --git a/src/views/Content/ContentSeriesDetail.vue b/src/views/Content/ContentSeriesDetail.vue index 077edd2..b0263b7 100644 --- a/src/views/Content/ContentSeriesDetail.vue +++ b/src/views/Content/ContentSeriesDetail.vue @@ -41,7 +41,92 @@ - 콘텐츠 + + + + + 콘텐츠 추가 + + + + + 콘텐츠 등록 + + + + + + + + + + + 등록된 콘텐츠가 없습니다. + + @@ -75,12 +160,19 @@ export default { data() { return { is_loading: false, + series_id: 0, series_detail: {}, + series_content_list: [], + selected_series_content: null, + page: 1, + total_page: 0, } }, async created() { + this.series_id = this.$route.params.seriesId await this.getSeriesDetail() + await this.getSeriesContentList() }, methods: { @@ -96,7 +188,7 @@ export default { this.is_loading = true try { - const res = await api.getSeriesDetail(this.$route.params.seriesId) + const res = await api.getSeriesDetail(this.series_id) if (res.status === 200 && res.data.success === true) { this.series_detail = res.data.data } else { @@ -108,6 +200,48 @@ export default { this.is_loading = false } }, + + async getSeriesContentList() { + try { + const res = await api.getSeriesContent(this.series_id, this.page) + if (res.status === 200 && res.data.success === true) { + const data = res.data.data + this.series_content_list = data.items + + const total_page = Math.ceil(data.totalCount / 20) + if (total_page <= 0) + this.total_page = 1 + else + this.total_page = total_page + } else { + this.notifyError(res.data.message || '콘텐츠를 불러오지 못했습니다. 다시 시도해 주세요.') + } + } catch (e) { + this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.') + } + }, + + async removeContentInSeries(content) { + this.is_loading = true + + try { + const res = await api.removeContentInTheSeries(this.series_id, content.contentId) + + if (res.status === 200 && res.data.success === true) { + this.page = 1 + this.total_page = 0 + this.series_content_list = [] + this.notifySuccess('삭제되었습니다.') + await this.getSeriesContentList() + } else { + this.notifyError('콘텐츠를 삭제하지 못했습니다. 다시 시도해 주세요.') + } + } catch (e) { + this.notifyError('콘텐츠를 삭제하지 못했습니다. 다시 시도해 주세요.') + } finally { + this.is_loading = false + } + }, }, } @@ -120,4 +254,9 @@ export default { .cover-image { aspect-ratio: 1/1.4; } + +.no-series-content { + height: 50vh; + margin-top: 100px; +} -- 2.40.1 From 756e0321f8e209c1efa50604d3f9804d3f60c99e Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Wed, 24 Apr 2024 14:22:41 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=EC=8B=9C=EB=A6=AC=EC=A6=88=EC=97=90=20?= =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EC=B6=94=EA=B0=80=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/audio_content_series.js | 10 +- src/views/Content/ContentSeriesDetail.vue | 295 ++++++++++++++++++++-- 2 files changed, 284 insertions(+), 21 deletions(-) diff --git a/src/api/audio_content_series.js b/src/api/audio_content_series.js index a2c19c5..b7bfbe6 100644 --- a/src/api/audio_content_series.js +++ b/src/api/audio_content_series.js @@ -34,6 +34,13 @@ async function getSeriesContent(seriesId, page) { ); } +async function searchContentNotInSeries(seriesId, searchWord) { + return Vue.axios.get( + "/creator-admin/audio-content/series/content/search?series_id=" + seriesId + + "&search_word=" + searchWord + ) +} + async function addingContentToTheSeries(seriesId, contentIdList) { return Vue.axios.post( "/creator-admin/audio-content/series/add/content", @@ -56,5 +63,6 @@ export { getSeriesDetail, getSeriesContent, addingContentToTheSeries, - removeContentInTheSeries + removeContentInTheSeries, + searchContentNotInSeries } diff --git a/src/views/Content/ContentSeriesDetail.vue b/src/views/Content/ContentSeriesDetail.vue index b0263b7..2810713 100644 --- a/src/views/Content/ContentSeriesDetail.vue +++ b/src/views/Content/ContentSeriesDetail.vue @@ -12,7 +12,8 @@ 제목 : {{ series_detail.title }} - 소개 : @@ -42,27 +43,18 @@ - - + + 콘텐츠 추가 - - - 콘텐츠 등록 - - @@ -91,9 +83,9 @@ > @@ -110,7 +102,7 @@ 삭제 @@ -119,6 +111,20 @@ +

+ + + + +
+ + + + 콘텐츠 추가 + + + + + 검색 + + + + + + + 검색결과 + + + + + + 추가할 콘텐츠 + + + + + + + + + + 취소 + + + 추가 + + + + + + + + + + {{ selected_series_content.title }} 삭제하시겠습니까? + + + 삭제하시겠습니까? + + + + + 취소 + + + 확인 + + + + + 0) { + await this.getSeriesDetail() + await this.getSeriesContentList() + } else { + this.$router.go(-1); + } }, methods: { @@ -184,6 +345,91 @@ export default { this.$dialog.notify.success(message) }, + cancel() { + this.search_word = '' + this.add_content_list = [] + this.search_content_list = [] + this.selected_series_content = null + this.show_add_series_content = false + this.show_delete_confirm_dialog = false + }, + + deleteConfirm(series_content) { + this.selected_series_content = series_content + this.show_delete_confirm_dialog = true + }, + + deleteCancel() { + this.cancel(); + }, + + showAddContent() { + this.show_add_series_content = true + }, + + addContent(content) { + this.search_content_list = this.search_content_list.filter((item) => { + return item.contentId !== content.contentId + }); + this.add_content_list.push(content) + }, + + removeContent(content) { + this.add_content_list = this.add_content_list.filter((item) => { + return item.contentId !== content.contentId + }); + this.search_content_list.push(content) + }, + + async searchContentNotInSeries() { + if (this.search_word.length < 2) { + this.notifyError('검색어를 2글자 이상 입력하세요.') + return + } + + this.is_loading = true + + try { + const res = await api.searchContentNotInSeries(this.series_id, this.search_word) + + if (res.data.success === true) { + this.search_content_list = res.data.data + if (res.data.data.length <= 0) { + this.notifyError('검색결과가 없습니다.') + } + } else { + this.notifyError(res.data.message || '알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.') + } + } catch (e) { + this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.') + } finally { + this.is_loading = false + } + }, + + async addContentInSeries() { + this.is_loading = true + const contentIdList = this.add_content_list.map((item) => { + return item.contentId + }) + + try { + const res = await api.addingContentToTheSeries(this.series_id, contentIdList) + if (res.status === 200 && res.data.success === true) { + this.cancel() + this.page = 1 + this.total_page = 0 + await this.getSeriesContentList() + } else { + this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.') + } + } catch (e) { + this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.') + } finally { + this.is_loading = false + } + }, + async getSeriesDetail() { this.is_loading = true @@ -201,6 +447,10 @@ export default { } }, + async next() { + await this.getSeriesContentList() + }, + async getSeriesContentList() { try { const res = await api.getSeriesContent(this.series_id, this.page) @@ -221,16 +471,17 @@ export default { } }, - async removeContentInSeries(content) { + async removeContentInSeries() { this.is_loading = true try { - const res = await api.removeContentInTheSeries(this.series_id, content.contentId) + const res = await api.removeContentInTheSeries(this.series_id, this.selected_series_content.contentId) if (res.status === 200 && res.data.success === true) { this.page = 1 this.total_page = 0 this.series_content_list = [] + this.cancel() this.notifySuccess('삭제되었습니다.') await this.getSeriesContentList() } else { @@ -255,6 +506,10 @@ export default { aspect-ratio: 1/1.4; } +.content-cover-image { + aspect-ratio: 1; +} + .no-series-content { height: 50vh; margin-top: 100px; -- 2.40.1