簡単なWebアプリ作成 ~無駄な会議を撲滅しよう!! ~ part5~
先日ご報告しました通り、日付毎の会議にて発生するお金をグラフ化するページを作成しましたので報告します!!
最終的に出来た成果物はこんな感じになりました!!

まずComboBoxには1週間ごとにデータのある週間だけ選択できるようにすること、そして1年分のデータを選択できるようにしたかったので、
Webアプリ表示時に1週間毎に1年分のデータを収集するための処理を実行しました。
まずはフロントエンドです。
サーバサイドへのpostリクエストにはajaxを用いました。
前回ご連絡しました通り、ループはフロントサイドで実行します。
ループ処理を行うにあたり、何も対策を打たないと非同期処理になってしまうため、async、awaitを用いて同期処理になるようにしました。
。。。勝手に非同期になるの結構めんどくさい!!
async function do_Init(days){
var select = document.getElementById("Init");
for(var i=0;i<50;i++){
await Time_ajax(i,select);
}
}
function Time_ajax(i,select){
var flg = true;
$.ajax({
url:"http://192.168.56.2:3000/result_times",
type:"POST",
async:true,
data:{"num":i*7},
dataType:"json",
success:function(result){
for(var i=0;i<begin_buf.length;i++){
if(begin_buf[i] == result["begin_day"]){
flg = false;
i = begin_buf.length;
}
}
if(flg == true){
var option = document.createElement("option");
option.text = result["begin_day"] + "~" + result["end_day"];
option.value = result["begin_day"] + "~" + result["end_day"];
select.appendChild(option);
begin_buf.push(result["begin_day"]);
}else{
flg = true;
}
}
});
}ここで、こちらのソースで週選択用のComboBoxを作成しています。
作成するサンプルはこちらになります。
var select = document.getElementById("Init");
var option = document.createElement("option");
option.text = result["begin_day"] + "~" + result["end_day"];
option.value = result["begin_day"] + "~" + result["end_day"]; そして、サーバサイド側のソースは下記になります!!
やっていることはpart2で実施した内容と同じになります。
postリクエストを受け取ったら、DB内のテーブルから必要なデータを読み取り、フロントサイドに返しています。
ここで、DBの読み出し処理は遅くなるのでこちらはPromise、.thenを用いて同期処理となるようにしました。
app.post('/result_times',(req,res)=>{
var buf = req.body.num;
p = Get_MeetingList_SplitWeek(buf);
p.then(function(day_array){
day_list ={day:day_array,begin_day:begin_arry,end_day:end_arry,num:buf};
res.send(day_list);
});
});
function Get_MeetingList_SplitWeek_sub(GetMemSalary){
return new Promise(resolve =>{
var buf = null;
var array_buf = [];
db.all(GetMemSalary, function (err, rows) {
rows.forEach(function(row){
if(buf== null || row.date !=buf){
buf = row.date;
array_buf.push(row.date);
}
});
resolve(array_buf);
});
});
}これで1年分のデータを週ごとに選択できるComboBoxが出来ました。
次にcomboBoxで選択した週データから会議時間でのお金をグラフ化するためにサーバサイド側から日付毎に発生したお金を読み出します。
、、、といってもやっていることは先ほどのComboBoxと同じで、
フロントサイドで1日毎に日付データをサーバサイドにpost。
サーバサイドでは受け取った日付データを元にお金をresponse。
これを1週間分(7日分)実施しています。
同じようなコードを載せても面白くないかと思いますので、割愛!!
最後にグラフの表示です。
グラフ作成はこちらを参考にさせていただきました!!
qiita.com
実際に作成したコードはこちらになります。
今回は棒グラフで表示させたかったため、type: 'bar'としました。
また最大値は500にセット(特に理由はないですw)。
var ctx = document.getElementById("myLineChart");
var myLineChart = new Chart(ctx, {
type: 'bar',
data: {
labels:weeks,
datasets: [
{
label: '会議発生金額',
data:m_meetingMoney,
borderColor: "rgba(0,0,255,1)",
backgroundColor: "rgba(219,39,91,0.5)"
}
],
},
options: {
title: {
display: true,
text: '会議により発生する費用'
},
scales: {
yAxes: [{
ticks: {
suggestedMax: 500,
suggestedMin: 0,
stepSize: 50,
}
}]
},
}
});下記でx軸とY軸をセットしております。
weekには1週間分の配列。
m_meetingMoneyには各日毎のお金格納されています。
data: {
labels:weeks, ←X軸
datasets: [
{
label: '会議発生金額', ←グラフラベル名
data:m_meetingMoney, ←Y軸
borderColor: "rgba(0,0,255,1)", ←グラフの色
backgroundColor: "rgba(219,39,91,0.5)" ←背景色
}ということで、、、part1~part5でで
会議時間により発生しているお金をサーバ側で保存しておき、結果をグラフ表示させるまで出来ました!!
結構時間かけてしまった。。。
特に番外編に記載した非同期処理にはかなり苦戦しました。。。(泣)
次回は、デバイス制御とかやっていこうかな?
Webアプリも作成していて面白いので、いいアイデア思いついたらまた作成したいと考えております!!
、、、色々作ってみたい物多くて大変だww。