광고 통계 페이지 #59

Merged
klaus merged 1 commits from test into main 2025-03-05 13:53:32 +00:00
3 changed files with 224 additions and 3 deletions
Showing only changes of commit 42492a7d55 - Show all commits

View File

@ -12,8 +12,13 @@ async function getMediaPartnerList(page) {
return Vue.axios.get("/admin/marketing/media-partner?page=" + (page - 1) + "&size=20")
}
async function getStatistics(page) {
return Vue.axios.get("/admin/marketing/statistics?page=" + (page - 1) + "&size=20")
}
export {
createMediaPartner,
updateMediaPartner,
getMediaPartnerList
getMediaPartnerList,
getStatistics
}

View File

@ -242,7 +242,7 @@ const routes = [
},
{
path: '/marketing/ad-statistics',
name: 'MarketingAdStatistics',
name: 'MarketingAdStatisticsView',
component: () => import(/* webpackChunkName: "marketing" */ '../views/Marketing/MarketingAdStatisticsView.vue')
},
]

View File

@ -7,13 +7,229 @@
</v-toolbar>
<br>
<v-container>
<v-row>
<v-col>
<v-data-table
:headers="headers"
:items="items"
:loading="is_loading"
:items-per-page="-1"
class="elevation-1"
hide-default-footer
>
<template slot="body.prepend">
<tr class="summary">
<td colspan="4">
총합계
</td>
<td>{{ sumField('signUpCount').toLocaleString() }}</td>
<td>{{ sumField('firstPaymentCount').toLocaleString() }}</td>
<td>{{ sumField('firstPaymentTotalAmount').toLocaleString() }}</td>
<td>{{ sumField('repeatPaymentCount').toLocaleString() }}</td>
<td>{{ sumField('repeatPaymentTotalAmount').toLocaleString() }}</td>
<td>{{ sumField('allPaymentCount').toLocaleString() }}</td>
<td>{{ sumField('allPaymentTotalAmount').toLocaleString() }}</td>
</tr>
</template>
<template v-slot:item.date="{ item }">
{{ item.date }}
</template>
<template v-slot:item.mediaGroup="{ item }">
{{ item.mediaGroup }}
</template>
<template v-slot:item.pid="{ item }">
{{ item.pid }}
</template>
<template v-slot:item.pidName="{ item }">
{{ item.pidName }}
</template>
<template v-slot:item.signUpCount="{ item }">
{{ item.signUpCount.toLocaleString() }}
</template>
<template v-slot:item.firstPaymentCount="{ item }">
{{ item.firstPaymentCount.toLocaleString() }}
</template>
<template v-slot:item.firstPaymentTotalAmount="{ item }">
{{ item.firstPaymentTotalAmount.toLocaleString() }}
</template>
<template v-slot:item.repeatPaymentCount="{ item }">
{{ item.repeatPaymentCount.toLocaleString() }}
</template>
<template v-slot:item.repeatPaymentTotalAmount="{ item }">
{{ item.repeatPaymentTotalAmount.toLocaleString() }}
</template>
<template v-slot:item.allPaymentCount="{ item }">
{{ item.allPaymentCount.toLocaleString() }}
</template>
<template v-slot:item.allPaymentTotalAmount="{ item }">
{{ item.allPaymentTotalAmount.toLocaleString() }}
</template>
</v-data-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-container>
</div>
</template>
<script>
import * as api from "@/api/marketing";
export default {
name: 'MarketingAdStatisticsView',
data() {
return {
is_loading: false,
page: 1,
total_page: 0,
headers: [
{
text: '일자',
align: 'center',
sortable: false,
value: 'date',
},
{
text: '매체',
align: 'center',
sortable: false,
value: 'mediaGroup',
},
{
text: 'pid',
align: 'center',
sortable: false,
value: 'pid',
},
{
text: 'pid명',
align: 'center',
sortable: false,
value: 'pidName',
},
{
text: '가입수',
align: 'center',
sortable: false,
value: 'signUpCount',
},
{
text: '첫결제건수',
align: 'center',
sortable: false,
value: 'firstPaymentCount',
},
{
text: '첫결제금액',
align: 'center',
sortable: false,
value: 'firstPaymentTotalAmount',
},
{
text: '재결제건수',
align: 'center',
sortable: false,
value: 'repeatPaymentCount',
},
{
text: '재결제금액',
align: 'center',
sortable: false,
value: 'repeatPaymentTotalAmount',
},
{
text: '총 결제건수',
align: 'center',
sortable: false,
value: 'allPaymentCount',
},
{
text: '총 결제금액',
align: 'center',
sortable: false,
value: 'allPaymentTotalAmount',
}
],
items: [],
}
},
async created() {
await this.getStatistics()
},
methods: {
notifyError(message) {
this.$dialog.notify.error(message)
},
notifySuccess(message) {
this.$dialog.notify.success(message)
},
sumField(key) {
return this.items.reduce((a, b) => a + (b[key] || 0), 0)
},
async next() {
await this.getStatistics()
},
async getStatistics() {
this.is_loading = true
try {
const res = await api.getStatistics(this.page);
if (res.status === 200 && res.data.success === true) {
let data = res.data.data
this.items = data.items
const totalPage = Math.ceil(data.totalCount / 20)
if (totalPage <= 0)
this.total_page = 1
else
this.total_page = totalPage
} else {
this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.')
}
this.is_loading = false
} catch (e) {
this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.')
this.is_loading = false
}
},
},
}
</script>
<style scoped>
.summary {
background-color: #c4dbf1;
}
</style>