sodalive-vuejs-admin/src/views/Audition/AuditionRoleDetailView.vue

235 lines
6.6 KiB
Vue

<template>
<div>
<v-toolbar dark>
<v-spacer />
<v-toolbar-title>{{ audition_title }} - {{ audition_role_name }}</v-toolbar-title>
<v-spacer />
</v-toolbar>
<br>
<v-container>
<v-row>
<v-col cols="4">
<v-card>
<v-img
:src="audition_role_detail.imageUrl"
class="audition-image"
/>
<v-card-text
v-if="
audition_role_detail.auditionScriptUrl !== undefined &&
audition_role_detail.auditionScriptUrl.length > 0
"
>
<a
:href="audition_role_detail.auditionScriptUrl"
class="audition-script-link"
>
오디션 대본 링크
</a>
</v-card-text>
<v-card-text>
<b>오디션 배역 정보</b>
<vue-show-more-text
:text="audition_role_detail.information"
:lines="3"
/>
</v-card-text>
</v-card>
</v-col>
<v-col cols="8">
<v-row>
<v-col>
<v-simple-table class="elevation-10">
<template>
<thead>
<tr>
<th class="text-center">
지원 번호
</th>
<th class="text-center">
프로필
</th>
<th class="text-center">
닉네임
</th>
<th class="text-center">
듣기
</th>
<th class="text-center">
추천수
</th>
</tr>
</thead>
<tbody>
<tr
v-for="item in audition_role_applicant_list"
:key="item.applicantId"
>
<td>{{ item.applicantId }}</td>
<td align="center">
<v-img
max-width="70"
max-height="70"
:src="item.profileImageUrl"
class="rounded-circle"
/>
<br>
<a
:href="item.profileImageUrl"
class="v-btn v-btn--outlined"
>
다운로드
</a>
</td>
<td>{{ item.nickname }}</td>
<td>
<vuetify-audio
:file="item.voiceUrl"
:downloadable="true"
:auto-play="false"
/>
</td>
<td>{{ item.voteCount }}</td>
</tr>
</tbody>
</template>
</v-simple-table>
</v-col>
</v-row>
<v-row class="text-center">
<v-col>
<v-pagination
v-model="page"
:length="total_page"
circle
@input="next"
/>
</v-col>
</v-row>
</v-col>
</v-row>
</v-container>
</div>
</template>
<script>
import * as api from '@/api/audition'
import VueShowMoreText from 'vue-show-more-text'
import VuetifyAudio from "vuetify-audio";
export default {
name: "AuditionDetailView",
components: {VuetifyAudio, VueShowMoreText},
data() {
return {
is_loading: false,
audition_role_id: 0,
audition_title: '',
audition_role_name: '',
audition_role_detail: {},
audition_role_applicant_list: [],
page: 1,
total_page: 0,
}
},
async created() {
this.audition_role_id = this.$route.params.audition_role_id
this.audition_title = this.$route.params.audition_title
if (this.audition_role_id !== undefined && this.audition_role_id > 0) {
await this.getAuditionRoleDetail()
await this.getAuditionRoleApplicant()
} else {
this.$router.go(-1)
}
},
methods: {
notifyError(message) {
this.$dialog.notify.error(message)
},
notifySuccess(message) {
this.$dialog.notify.success(message)
},
isValidUrl(string) {
try {
new URL(string); // URL 생성 시 예외가 발생하면 유효하지 않은 URL
return true;
} catch (_) {
return false;
}
},
async getAuditionRoleDetail() {
try {
const res = await api.getAuditionRoleDetail(this.audition_role_id)
if (res.status === 200 && res.data.success === true) {
const data = res.data.data
this.audition_role_name = data.name
this.audition_role_detail.imageUrl = data.imageUrl
this.audition_role_detail.information = data.information
if (this.isValidUrl(data.auditionScriptUrl)) {
this.audition_role_detail.auditionScriptUrl = data.auditionScriptUrl
}
} else {
this.is_loading = false
this.notifyError(res.data.message || '알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.')
}
} catch (e) {
this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.')
} finally {
this.is_loading = false
}
},
async getAuditionRoleApplicant() {
this.is_loading = true
try {
const res = await api.getAuditionApplicantList(this.audition_role_id, this.page)
if (res.status === 200 && res.data.success === true) {
const data = res.data.data
const total_page = Math.ceil(data.totalCount / 20)
this.audition_role_applicant_list = data.items
if (total_page <= 0) {
this.total_page = 1
} else {
this.total_page = total_page
}
} else {
this.is_loading = false
this.notifyError(res.data.message || '알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.')
}
} catch (e) {
this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.')
} finally {
this.is_loading = false
}
},
async next() {
await this.getAuditionRoleApplicant()
},
}
}
</script>
<style scoped>
</style>