Zalozky, statistika

This commit is contained in:
2021-01-15 10:49:20 +01:00
parent 076d502b8a
commit 3137697a5f
11 changed files with 402 additions and 99420 deletions

View File

@@ -0,0 +1,123 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Carbon\Carbon;
class StatisticsController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function get(Request $request)
{
$types = ['temperature','humidity','pressure'];
$type = $request->input('type', $types[0]);
$startdate = $request->input('startdate',NULL);
$enddate = $request->input('enddate',NULL);
$range = $request->input('range',NULL);
if (!in_array($type,$types)) $type = $types[0];
if ($startdate == NULL || $startdate == '') $startdate = "now()-1d";
else $startdate = sprintf("'%s'",Carbon::parse($startdate)->toDateTimeString());
if ($enddate == NULL || $enddate == '') $enddate = "now()";
else $enddate = sprintf("'%s'",Carbon::parse($enddate)->toDateTimeString());
if ($range == NULL || $range == '') $range = '356d';
else {
if (!preg_match('/^(\d+)[dhm]$/',$range)) {
$range='356d';
}
}
$q = sprintf("select time,min(value),max(value),mean(value),last(value) from bme280_value where host='balkon' and type='%s' and time >= %s and time <= %s group by time(%s);",$type,$startdate,$enddate,$range);
\Debugbar::info($q);
$result = \InfluxDB::query($q);
$points = $result->getPoints();
$a = [];
foreach ($points as $p) {
$a[] = [ 'time' => $p["time"], 'min'=> $p["min"], 'max' => $p['max'], 'mean' => $p['mean'], 'last' => $p['last']];
}
return response()->json($a);
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}

View File

@@ -24,12 +24,15 @@
"vue-template-compiler": "^2.6.10"
},
"dependencies": {
"@crow1796/vue-bulma-tabs": "^1.0.8",
"@fortawesome/fontawesome-free": "^5.15.1",
"bootstrap-vue": "^2.21.2",
"font-awesome": "^4.7.0",
"luxon": "^1.25.0",
"moment": "^2.29.1",
"vue-datetime": "^1.0.0-beta.14",
"vue-dygraphs": "^0.1.2",
"vue-slim-tabs": "^0.4.0",
"vue-table-dynamic": "^0.4.1",
"vuejs-thermometer": "^0.1.3",
"weekstart": "^1.0.1"

14448
public/css/app.css vendored

File diff suppressed because one or more lines are too long

84941
public/js/app.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,98 @@
/*!
* Bootstrap v4.5.3 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
/*!
* Sizzle CSS Selector Engine v2.3.5
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
* Date: 2020-03-14
*/
/*!
* Vue.js v2.6.12
* (c) 2014-2020 Evan You
* Released under the MIT License.
*/
/*!
* jQuery JavaScript Library v3.5.1
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2020-05-04T22:49Z
*/
/*!
* vue-datetime v1.0.0-beta.14
* (c) 2020 Mario Juárez
* Released under the MIT License.
*/
/**
* @license
* Copyright 2011 Dan Vanderkam (danvdk@gmail.com)
* MIT-licensed (http://opensource.org/licenses/MIT)
*/
/**
* @license
* Copyright 2012 Dan Vanderkam (danvdk@gmail.com)
* MIT-licensed (http://opensource.org/licenses/MIT)
*/
/**
* @license
* Copyright 2013 David Eberlein (david.eberlein@ch.sauter-bc.com)
* MIT-licensed (http://opensource.org/licenses/MIT)
*/
/**
* @license
* Lodash <https://lodash.com/>
* Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
* Released under MIT license <https://lodash.com/license>
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
*/
/**!
* @fileOverview Kickass library to create and place poppers near their reference elements.
* @version 1.16.1
* @license
* Copyright (c) 2016 Federico Zivolo and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
//! moment.js
//! moment.js locale configuration

17
resources/js/app.js vendored
View File

@@ -42,6 +42,12 @@ Vue.use(Datetime);
Vue.component('stats-table', require('./components/StatisticsComponent.vue').default);
import { TabsPlugin } from 'bootstrap-vue'
Vue.use(TabsPlugin);
import { CardPlugin } from 'bootstrap-vue'
Vue.use(CardPlugin);
//(function () {
var app = new Vue({
el: '#app',
@@ -53,6 +59,8 @@ Vue.component('stats-table', require('./components/StatisticsComponent.vue').def
startdate: null,
enddate: null,
componentKey: 0,
ti: 0, //Tab Index
graphShow: [],
params: {
data: [],
border: true,
@@ -103,6 +111,15 @@ Vue.component('stats-table', require('./components/StatisticsComponent.vue').def
displayResults: function () {
this.getData();
},
resizeGraph: function (i) {
console.log("RESIZE");
let index = "dg[" + i + "]";
console.log('Change tab:',i);
this.$nextTick(() => {
app.$refs[index]._data._graph.resize();
});
},
getData: function () {
axios.get('/data', {

View File

@@ -1,48 +1,69 @@
<template>
<div>
<vue-table-dynamic :params="params"></vue-table-dynamic>
<vue-table-dynamic :params="params" :key="redraw"></vue-table-dynamic>
</div>
</template>
<script>
export default {
props: ['data'],
props: ['fromdate','todate','type','range'],
name: 'Stats',
data() {
return {
params: {
data: [
['', 'Min', 'Max', 'Avg', 'Current'],
['', 'Min', 'Max', 'Avg', 'Posledná'],
],
header: 'row',
border: true,
stripe: true
}
stripe: true,
height: 0,
},
redraw: 0,
}
},
mounted: function () {
console.log("Mounted");
console.log(this.data);
let min = null;
let max = null;
let avg = 0;
let current = null;
for (var index = 0; index < this.data.length; ++index) {
let row = this.data[index];
let val = row[1];
if (min == null) min = val;
else if (min > val) min = val;
console.log("type=",this.type);
var that = this;
moment.locale('sk_SK');
if (max == null) max = val;
else if (max < val) max = val;
axios.get('/stats/get', {
params: {
type: this.type,
startdate: this.fromdate,
enddate: this.todate,
range: this.range
}
})
.then(function (response) {
console.log("STATS DATA");
console.log(that.type);
that.params.data[0][0] = 'Čas';
if (that.range) {
for (var i = 0; i < response.data.length; i++) {
var row = response.data[i];
let time = moment(row.time).format('LLL');
let mean = null;
if (row.mean != null) {
mean = row.mean.toFixed(2);
that.params.data.push([time,row.min,row.max,mean,row.last]);
}
that.params.height = 400;
}
} else {
that.params.data.push(['Hodnota',response.data[0].min,response.data[0].max,response.data[0].mean.toFixed(2),response.data[0].last]);
};
console.log(that.params.data);
that.redraw += 1;
avg = avg + val;
current = val;
}
avg = avg / this.data.length;
})
.catch(function (error) {
console.log(error);
});
this.params.data.push(['Hodnota',min,max,avg.toFixed(2),current]);
}
}
</script>

View File

@@ -14,3 +14,4 @@
@import '~font-awesome/scss/font-awesome';

View File

@@ -120,14 +120,53 @@
</div>
</div>
</div>
<dygraphs ref="dgt" :graph-data="series['temperature']" :graph-options="options['temperature']"></dygraphs>
<stats-table :data="series['temperature']" :key="componentKey"></stats-table>
<dygraphs ref="dgh" :graph-data="series['humidity']" :graph-options="options['humidity']"></dygraphs>
<stats-table :data="series['humidity']" :key="componentKey"></stats-table>
<dygraphs ref="dgp" :graph-data="series['pressure']" :graph-options="options['pressure']"></dygraphs>
<stats-table :data="series['pressure']" :key="componentKey"></stats-table>
<b-card no-body>
<b-tabs v-model="ti" small card lazy>
<b-tab title="Teplota" @click="resizeGraph(0)">
<dygraphs ref="dg[0]" :graph-data="series['temperature']" :graph-options="options['temperature']"></dygraphs>
<!-- Tabs with card integration -->
<b-card no-body>
<b-tabs small card>
<b-tab title="Celá doba">
<div>Štatistika za celú dobu v grafe</div>
<stats-table :fromdate="startdate" :todate="enddate" :type="'temperature'" :key="componentKey"></stats-table>
</b-tab>
<b-tab title="Hodina">
<stats-table :fromdate="startdate" :todate="enddate" :type="'temperature'" :range="'1h'" :key="componentKey"></stats-table>
</b-tab>
</b-tabs>
</b-card>
</b-tab>
<b-tab title="Vlhkosť" @click="resizeGraph(1)">
<dygraphs ref="dg[1]" :graph-data="series['humidity']" :graph-options="options['humidity']"></dygraphs>
<b-card no-body>
<b-tabs small card>
<b-tab title="Celá doba">
<div>Štatistika za celú dobu v grafe</div>
<stats-table :fromdate="startdate" :todate="enddate" :type="'humidity'" :key="componentKey"></stats-table>
</b-tab>
<b-tab title="Hodina">
<stats-table :fromdate="startdate" :todate="enddate" :type="'humidity'" :range="'1h'" :key="componentKey"></stats-table>
</b-tab>
</b-tabs>
</b-card>
</b-tab>
<b-tab title="Tlak" @click="resizeGraph(2)">
<dygraphs ref="dg[2]" :graph-data="series['pressure']" :graph-options="options['pressure']"></dygraphs>
<b-card no-body>
<b-tabs small card>
<b-tab title="Celá doba">
<div>Štatistika za celú dobu v grafe</div>
<stats-table :fromdate="startdate" :todate="enddate" :type="'pressure'" :key="componentKey"></stats-table>
</b-tab>
<b-tab title="Hodina">
<stats-table :fromdate="startdate" :todate="enddate" :type="'pressure'" :range="'1h'" :key="componentKey"></stats-table>
</b-tab>
</b-tabs>
</b-card>
</b-tab>
</b-tabs>
</b-card>
</div>
</div>

View File

@@ -17,4 +17,5 @@ Route::get('/', function () {
Route::get('/data',"MeasurementController@index");
Route::get('/data/get',"MeasurementController@get");
Route::get('/stats/get',"StatisticsController@get");

View File

@@ -823,6 +823,13 @@
lodash "^4.17.19"
to-fast-properties "^2.0.0"
"@crow1796/vue-bulma-tabs@^1.0.8":
version "1.0.8"
resolved "https://registry.yarnpkg.com/@crow1796/vue-bulma-tabs/-/vue-bulma-tabs-1.0.8.tgz#ffce376bed1421242806c645f5faa81f24bd0009"
integrity sha512-ANjwR/Jns3Sosuq9xqOf5jornEKZ6v6QQCNGxp0sVl8vmuMlqkJHWlz/F46lzgfuNiETXVjFYuNccweU6u3Ypg==
dependencies:
vue "^2.6.6"
"@fortawesome/fontawesome-free@^5.15.1":
version "5.15.1"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.1.tgz#ccfef6ddbe59f8fe8f694783e1d3eb88902dc5eb"
@@ -841,6 +848,15 @@
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
"@nuxt/opencollective@^0.3.2":
version "0.3.2"
resolved "https://registry.yarnpkg.com/@nuxt/opencollective/-/opencollective-0.3.2.tgz#83cb70cdb2bac5fad6f8c93529e7b11187d49c02"
integrity sha512-XG7rUdXG9fcafu9KTDIYjJSkRO38EwjlKYIb5TQ/0WDbiTUTtUtgncMscKOYzfsY86kGs05pAuMOR+3Fi0aN3A==
dependencies:
chalk "^4.1.0"
consola "^2.15.0"
node-fetch "^2.6.1"
"@types/glob@^7.1.1":
version "7.1.3"
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183"
@@ -1141,7 +1157,7 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
dependencies:
color-convert "^1.9.0"
ansi-styles@^4.0.0:
ansi-styles@^4.0.0, ansi-styles@^4.1.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
@@ -1426,7 +1442,18 @@ boolbase@^1.0.0, boolbase@~1.0.0:
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
bootstrap@^4.0.0:
bootstrap-vue@^2.21.2:
version "2.21.2"
resolved "https://registry.yarnpkg.com/bootstrap-vue/-/bootstrap-vue-2.21.2.tgz#ec38f66c3a2205becccddb6158a991d96509ed0b"
integrity sha512-0Exe+4MZysqhZNXIKf4TzkvXaupxh9EHsoCRez0o5Dc0J7rlafayOEwql63qXv74CgZO8E4U8ugRNJko1vMvNw==
dependencies:
"@nuxt/opencollective" "^0.3.2"
bootstrap ">=4.5.3 <5.0.0"
popper.js "^1.16.1"
portal-vue "^2.1.7"
vue-functional-data-merge "^3.1.0"
"bootstrap@>=4.5.3 <5.0.0", bootstrap@^4.0.0:
version "4.5.3"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.3.tgz#c6a72b355aaf323920be800246a6e4ef30997fe6"
integrity sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ==
@@ -1728,6 +1755,14 @@ chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
chalk@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
charenc@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
@@ -1975,6 +2010,11 @@ connect-history-api-fallback@^1.6.0:
resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
consola@^2.15.0:
version "2.15.0"
resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.0.tgz#40fc4eefa4d2f8ef2e2806147f056ea207fcc0e9"
integrity sha512-vlcSGgdYS26mPf7qNi+dCisbhiyDnrN1zaRbw3CSuc2wGOMEGGPsp46PdRG5gqXwgtJfjxDkxRNAgRPr1B77vQ==
console-browserify@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
@@ -4611,6 +4651,11 @@ no-case@^2.2.0:
dependencies:
lower-case "^1.1.1"
node-fetch@^2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
node-forge@^0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3"
@@ -5060,11 +5105,16 @@ pkg-dir@^4.1.0:
dependencies:
find-up "^4.0.0"
popper.js@^1.12:
popper.js@^1.12, popper.js@^1.16.1:
version "1.16.1"
resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b"
integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==
portal-vue@^2.1.7:
version "2.1.7"
resolved "https://registry.yarnpkg.com/portal-vue/-/portal-vue-2.1.7.tgz#ea08069b25b640ca08a5b86f67c612f15f4e4ad4"
integrity sha512-+yCno2oB3xA7irTt0EU5Ezw22L2J51uKAacE/6hMPMoO/mx3h4rXFkkBkT4GFsMDv/vEe8TNKC3ujJJ0PTwb6g==
portfinder@^1.0.26:
version "1.0.28"
resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778"
@@ -6389,7 +6439,7 @@ supports-color@^6.1.0:
dependencies:
has-flag "^3.0.0"
supports-color@^7.0.0:
supports-color@^7.0.0, supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
@@ -6775,6 +6825,11 @@ vue-dygraphs@^0.1.2:
dependencies:
dygraphs "^2.1.0"
vue-functional-data-merge@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/vue-functional-data-merge/-/vue-functional-data-merge-3.1.0.tgz#08a7797583b7f35680587f8a1d51d729aa1dc657"
integrity sha512-leT4kdJVQyeZNY1kmnS1xiUlQ9z1B/kdBFCILIjYYQDqZgLqCLa0UhjSSeRX6c3mUe6U5qYeM8LrEqkHJ1B4LA==
vue-hot-reload-api@^2.3.0:
version "2.3.4"
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2"
@@ -6798,6 +6853,11 @@ vue-scrollbar-simple@0.0.9:
dependencies:
lodash.throttle "^4.1.1"
vue-slim-tabs@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/vue-slim-tabs/-/vue-slim-tabs-0.4.0.tgz#b07face4ad54aaa227f5706b60c17767783d66be"
integrity sha512-19bwuKs2HICja0E039QmE7N7PMQcjdZXcpigmXlJTtTYGZy40C112tZF6q7bS18XNZGFcd/sP3jOJRGC80gVVw==
vue-style-loader@^4.1.0:
version "4.1.2"
resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.2.tgz#dedf349806f25ceb4e64f3ad7c0a44fba735fcf8"
@@ -6828,7 +6888,7 @@ vue-template-es2015-compiler@^1.9.0:
resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825"
integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==
vue@^2.5.17:
vue@^2.5.17, vue@^2.6.6:
version "2.6.12"
resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.12.tgz#f5ebd4fa6bd2869403e29a896aed4904456c9123"
integrity sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==