Я использую laravel для своего бэкэнда и компоненты vue для создания своего внешнего интерфейса. Моя цель - получить все данные из таблицы итогов с типом: «советы» и сравнить мой текущий месяц записей с моим предыдущим месяцем записей и рассчитать процент, чтобы показать прибыль/убыток. У меня есть все, кроме фактического разделения данных по текущему и предыдущему месяцам.
Это код для моего виджета итогов на данный момент. Часть, на которой я застрял, - это сравнение месяцев, когда я просто консолью записываю данные res. (Текущие данные были фиктивными данными для проверки моих процентов)
name: "TotalsWidget",
props: ['type'],
data() {
return {
desc: 'Tips',
percentage: 0,
thisMonth: 100,
lastMonth: 500,
total: 5477,
state: null,
}
},
methods: {
getData(type){
axios.get('/api/totals/'+ type).then((res) => {
/* Adding totals together */
let total = [];
Object.entries(res.data).forEach(([key, val]) => {
total.push(val.value)
});
this.total = total.reduce((total, num) => {return total + num}, 0);
/* Compare Months */
let months = [];
console.info(res.data)
});
}
},
computed:{
getPercentage(thisMonth, lastMonth){
this.percentage = Math.floor((this.thisMonth - this.lastMonth) / this.lastMonth * 100);
if (Math.sign(this.percentage) == 1){
return this.state = 'mdi mdi-arrow-up-drop-circle text-success mr-1'
} else {
return this.state = 'mdi mdi-arrow-down-drop-circle mr-1 text-danger'
}
},
},
mounted(){
this.getData(this.type);
console.info('Tips Widget Loaded');
}
Вот что у меня в res.data:
[{…}, {…}]
0: {id: 1, type: "tips", desc: "Tips", value: 740, created_at: "2019-05-22 03:46:25", …}
1: {id: 2, type: "tips", desc: "Tips", value: 1105, created_at: "2019-04-22 03:46:25", …}
Там будут записи каждый понедельник, это просто фиктивные данные, чтобы попытаться заставить их работать. Я не уверен, как их сравнивать, и следует ли мне использовать функцию даты javascripts или третью сторону, например moment.js, и как это сделать.
Так что у меня это работает очень грязно, но работает.
getData(type){
axios.get('/api/totals/'+ type).then((res) => {
let data = res.data;
/* Adding totals together */
let total = [];
Object.entries(res.data).forEach(([key, val]) => {
total.push(val.value)
return val.created_at = moment(val.created_at).format("YY-MM")
});
this.total = total.reduce((total, num) => {return total + num}, 0);
/* Compare Months */
let currentMonth = moment(moment().format()).format("YY-MM")
let previousMonth = moment(this.currentMonth).subtract(1, 'months').format("YY-MM")
let calculateThisMonth = [];
let calculateLastMonth = [];
/* Calculating this Months */
let thisMonth = data.filter((total) => {
return total.created_at == currentMonth
})
Object.entries(thisMonth).forEach(([key, val]) => {
calculateThisMonth.push(val.value)
});
this.thisMonth = calculateThisMonth.reduce((total, num) => {return total + num}, 0);
/* Calculating last Months */
let lastMonth = data.filter((total) => {
return total.created_at == previousMonth
})
Object.entries(lastMonth).forEach(([key, val]) => {
calculateLastMonth.push(val.value)
});
this.lastMonth = calculateLastMonth.reduce((total, num) => {return total + num}, 0);
});
}
Я чувствую, что определенно есть лучший способ, и если у вас есть критика, я бы хотел ее услышать.