이번 영상에서는 마스터 디테일 표현과 Vue 콤포넌트를 이용해서 코드를 모듈화하는 방법에 대해서 알아봅니다.
import statisYears from '@/data/statisYears'
let response = {
data: {
resultCode: 0,
errorMsg: ""
}
}
export default {
list: async function () {
return new Promise((resolve) => {
response.data.resultCode = 0;
response.data.rows = statisYears.rows.sort((a, b) => {
const tempA = a.year + a.gender;
const tempB = b.year + b.gender;
if (tempA > tempB) return 1;
if (tempA === tempB) return 0;
if (tempA < tempB) return -1;
});
setTimeout(() => resolve(response), 500);
});
},
}
export default {
rows: [
{
year: "2020",
gender: "F",
level: "비회원",
count: 300,
},
{
year: "2020",
gender: "M",
level: "비회원",
count: 300,
},
{
year: "2020",
gender: "F",
level: "회원",
count: 100,
},
{
year: "2020",
gender: "M",
level: "회원",
count: 120,
},
{
year: "2020",
gender: "F",
level: "VIP",
count: 10,
},
{
year: "2020",
gender: "M",
level: "VIP",
count: 14,
},
{
year: "2021",
gender: "F",
level: "비회원",
count: 300,
},
{
year: "2021",
gender: "M",
level: "비회원",
count: 300,
},
{
year: "2021",
gender: "F",
level: "회원",
count: 100,
},
{
year: "2021",
gender: "M",
level: "회원",
count: 120,
},
{
year: "2021",
gender: "F",
level: "VIP",
count: 10,
},
{
year: "2021",
gender: "M",
level: "VIP",
count: 14,
},
{
year: "2022",
gender: "F",
level: "비회원",
count: 300,
},
{
year: "2022",
gender: "M",
level: "비회원",
count: 300,
},
{
year: "2022",
gender: "F",
level: "회원",
count: 100,
},
{
year: "2022",
gender: "M",
level: "회원",
count: 120,
},
{
year: "2022",
gender: "F",
level: "VIP",
count: 10,
},
{
year: "2022",
gender: "M",
level: "VIP",
count: 14,
},
]
}
<template>
<div class="title-area">
...
<div class="client">
...
<el-menu-item-group title="통계">
<el-menu-item index="/report/member/year/statistics">
<i class="fas fa-list-alt"></i>
<span>연도별 회원 비율</span>
</el-menu-item>
<el-menu-item index="/report/member/gender">
<i class="fas fa-list-alt"></i>
<span>남녀 성별 회원 비율</span>
</el-menu-item>
</el-menu-item-group>
...
</div>
</div>
</template>
<script>
...
</script>
...
...
const routes = [
...
{
path: '/report/member/year/statistics',
component: () => import('@/views/report/member/StatisYear.vue')
},
{
path: '/report/member/gender',
component: () => import('@/views/report/member/StatisGender.vue')
},
]
...
<template>
<div class="main-body">
<div id="realgrid" style="width: 100%; height: 90vh"></div>
</div>
</template>
<script>
/* eslint-disable */
import apiStatisYear from "@/api/statisYear";
export default {
mounted() {
this.provider = new RealGrid.LocalDataProvider();
this.gridView = new RealGrid.GridView("realgrid");
this.gridView.setDataSource(this.provider);
this.provider.setFields([
{ fieldName: "year" },
{ fieldName: "gender" },
{ fieldName: "level" },
{ fieldName: "count" },
]);
this.gridView.setColumns([
{ name: "year", fieldName: "year" },
{ name: "gender", fieldName: "gender" },
{ name: "level", fieldName: "level" },
{ name: "count", fieldName: "count" },
]);
apiStatisYear
.list()
.then((response) => {
this.provider.fillJsonData(response.data.rows, {
fillMode: "set",
});
})
.catch((e) => {
console.log(e);
});
},
};
</script>
...
<script>
...
export default {
mounted() {
...
this.gridView.setColumns([
{
name: "year", fieldName: "year",
mergeRule: { criteria: "value" }
},
{
name: "gender", fieldName: "gender",
mergeRule: { criteria: "value" }
},
...
]);
...
},
};
</script>
<template>
<div class="main-body">
<div id="realgrid" style="width: 100%; height: 90vh"></div>
</div>
</template>
<script>
/* eslint-disable */
import apiStatisYear from "@/api/statisYear";
export default {
mounted() {
this.provider = new RealGrid.LocalDataProvider();
this.gridView = new RealGrid.GridView("realgrid");
this.gridView.setDataSource(this.provider);
this.provider.setFields([
{ fieldName: "year" },
{ fieldName: "gender" },
{ fieldName: "level" },
{ fieldName: "count", dataType: "number" },
]);
this.gridView.setColumns([
{ name: "year", fieldName: "year" },
{ name: "gender", fieldName: "gender" },
{ name: "level", fieldName: "level" },
{ name: "count", fieldName: "count" },
]);
apiStatisYear
.list()
.then((response) => {
this.provider.fillJsonData(response.data.rows, {
fillMode: "set",
});
})
.catch((e) => {
console.log(e);
});
},
};
</script>
...
<script>
...
export default {
mounted() {
...
this.gridView.setColumns([
{
name: "year", fieldName: "year",
mergeRule: { criteria: "value" }
},
{
name: "gender", fieldName: "gender",
mergeRule: { criteria: "value" }
},
...
]);
...
},
};
</script>
...
<script>
...
export default {
mounted() {
...
this.gridView.groupPanel.visible = true;
},
};
</script>
...
<script>
...
export default {
mounted() {
...
this.gridView.groupPanel.visible = true;
this.gridView.groupBy(["year", "gender"]);
},
};
</script>
...
export default {
mounted() {
...
this.gridView.setColumns([
...
{
name: "count", fieldName: "count",
groupFooter: {
valueCallback: this.callbackGroupCount,
},
},
]);
...
},
methods: {
callbackGroupCount(grid, column, groupFooterIndex, group, value) {
...
},
},
};
</script>
...
export default {
mounted() {
...
this.gridView.setColumns([
...
{
name: "count", fieldName: "count",
groupFooter: {
valueCallback: this.callbackGroupCount,
},
},
]);
...
},
methods: {
callbackGroupCount(grid, column, groupFooterIndex, group, value) {
var level = group.level == 1 ? "합계: " : "소계: ";
var groupModel = grid.getGroupModel(group.index);
return level + grid.getGroupSummary(groupModel, "count").sum;
},
},
};
getGroupSummary 참고 자료: https://docs.realgrid.com/refs/group-summary