광고 통계 페이지 #59
@@ -12,8 +12,13 @@ async function getMediaPartnerList(page) {
 | 
				
			|||||||
    return Vue.axios.get("/admin/marketing/media-partner?page=" + (page - 1) + "&size=20")
 | 
					    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 {
 | 
					export {
 | 
				
			||||||
    createMediaPartner,
 | 
					    createMediaPartner,
 | 
				
			||||||
    updateMediaPartner,
 | 
					    updateMediaPartner,
 | 
				
			||||||
    getMediaPartnerList
 | 
					    getMediaPartnerList,
 | 
				
			||||||
 | 
					    getStatistics
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -242,7 +242,7 @@ const routes = [
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                path: '/marketing/ad-statistics',
 | 
					                path: '/marketing/ad-statistics',
 | 
				
			||||||
                name: 'MarketingAdStatistics',
 | 
					                name: 'MarketingAdStatisticsView',
 | 
				
			||||||
                component: () => import(/* webpackChunkName: "marketing" */ '../views/Marketing/MarketingAdStatisticsView.vue')
 | 
					                component: () => import(/* webpackChunkName: "marketing" */ '../views/Marketing/MarketingAdStatisticsView.vue')
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,13 +7,229 @@
 | 
				
			|||||||
    </v-toolbar>
 | 
					    </v-toolbar>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <br>
 | 
					    <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>
 | 
					  </div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<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>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style scoped>
 | 
					<style scoped>
 | 
				
			||||||
 | 
					.summary {
 | 
				
			||||||
 | 
					  background-color: #c4dbf1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user