Asp.net+Vue2构建简单记账WebApp之六(vue.js构建记账统计页面)
2017-09-13 20:36
597 查看
Asp.net+Vue2构建简单记账WebApp之一(设计)
Asp.net+Vue2构建简单记账WebApp之二(使用ABP迅速搭建.Net后台)
Asp.net+Vue2构建简单记账WebApp之三(使用Vue-cli构建vue.js应用)
Asp.net+Vue2构建简单记账WebApp之四(vue.js构建记账主页面)
Asp.net+Vue2构建简单记账WebApp之五(vue.js构建记账页面)
Asp.net+Vue2构建简单记账WebApp之六(vue.js构建记账统计页面)
源码下载
components/YearCount.vue
2、watch监测数据变化。
3、echarts 更多图表绘制参看官网
4、本想使用mint-ui的无限加载或者上拉加载,但是在这个页面里没弄成功,就自己写了个点击加载的。
5、vue.js 的是mvvm框架,页面绑定数据,我们一切操作只需要修改数据,页面自动改变。不需要直接操作页面元素。
Asp.net+Vue2构建简单记账WebApp之二(使用ABP迅速搭建.Net后台)
Asp.net+Vue2构建简单记账WebApp之三(使用Vue-cli构建vue.js应用)
Asp.net+Vue2构建简单记账WebApp之四(vue.js构建记账主页面)
Asp.net+Vue2构建简单记账WebApp之五(vue.js构建记账页面)
Asp.net+Vue2构建简单记账WebApp之六(vue.js构建记账统计页面)
源码下载
一、添加两个新页面
/components/ MonthCount.vue<template> <div id="MonthCount" > <div class="chart"> <div id="Chart"></div> </div> <ul class="list"> <li v-for="item in listData"> <mt-cell-swipe v-bind:title="item.name" v-bind:label="item.creationTime" :right="[{ content: '删除', style: { background: 'red', color: '#fff' }, handler: () => DeleteBill(item.id)}]" > <span>¥{{item.money}}</span> <i slot="icon" class="fa" v-bind:class="item.fontStyle" width="24" height="24"></i> </mt-cell-swipe> </li> <li v-if="loading" style="text-align: center"> <mt-spinner :type="3" color="#26a2ff"></mt-spinner> </li> <li v-else-if="loadMore" v-on:click="GetListData" style="text-align: center"> 点击更多 </li> </ul> </div> </template> <script> import { Toast } from 'mint-ui'; // 按需引入echart模板 let echarts = require('echarts/lib/echarts'); require('echarts/lib/chart/pie'); require('echarts/lib/component/tooltip'); require('echarts/lib/component/title'); export default{ data(){ return{ listData:[],//列表数据 chartData:[],// 图表数据 date:new Date(), // 时间 loadMore:false, loading:false } }, methods:{ DeleteBill(id){ this.$http.post('/bill/DeleteBill', { key: id }).then(response => { if(response.body.result.result) { Toast("删除成功"); this.GetChartData(); this.GetListData(); }else { Toast(response.body.result.data) } }, response => { Toast("服务器连接失败"); }); }, // 获取图表数据 GetChartData(){ this.$http.post('/bill/GetCount', { Date: this.date, Type:1, User: '1' }).then(response => { if(response.body.result.result) { this.chartData = response.body.result.data; }else { Toast(response.body.result.data) } }, response => { Toast("获取数据出错"); }); }, // 获取列表数据 GetListData(){ this.loading=true; this.$http.post('/bill/GetBills', { Date:this.date, SkipCount:this.listData.length, Type:1, User: '1', }).then(response => { if(response.body.result.result) { let newlistdata =[...this.listData,...response.body.result.data.items]; this.listData = newlistdata; this.loadMore = response.body.result.data.totalCount>this.listData.length; }else { Toast(response.body.result.data); } this.loading=false; }, response => { this.loading=false; Toast("获取数据出错"); }); }, // 绘制图表 DrawChart(){ // 基于准备好的dom,初始化echarts实例 let myChart = echarts.init(document.getElementById('Chart')); let data = this.chartData; let count =0; // 从新计算总值 for (let i of this.chartData) { count+=i.value; } // 绘制图表 myChart.setOption({ title : { text: count, subtext: '单位(元)', x:'right' }, tooltip: { trigger: 'item', formatter: "{a} <br/>{b} : {c} ({d}%)" }, series: [ { name: '消费', type: 'pie', radius: '55%', center: ['50%', '50%'], data: data } ] }); }, }, // 监测变化 watch:{ chartData:function () { this.DrawChart(); // 绘制表格 } }, // 创建后执行 created(){ this.GetChartData(); this.GetListData(); } } </script> <style scoped> #Chart{ height: 300px; width: 100%; } ul{ list-style: none; padding-left: 0; } ul li{ text-align: left; margin-bottom: 5px; } .bottom{ position: fixed; height: 1px; width: 100%; bottom: 65px; } </style>
components/YearCount.vue
<template> <div> <div id="ChartLine" class="chart"></div> <div id="ChartPie" class="chart"></div> </div> </template> <script> import { Toast } from 'mint-ui'; // 按需引入echart模板 let echarts = require('echarts/lib/echarts'); require('echarts/lib/chart/pie'); require('echarts/lib/chart/line'); require('echarts/lib/component/tooltip'); require('echarts/lib/component/title'); export default{ data(){ return{ LineData:[],//曲线图数据 PieData:[],// 饼图数据 date:new Date(), // 时间 } }, methods:{ // 获取曲线图数据 GetChartLineData(){ this.$http.post('/bill/GetCount', { Date: this.date, Type:0, GroupBy:1, User: '1' }).then(response => { if(response.body.result.result) { this.LineData = response.body.result.data; }else { Toast(response.body.result.data) } }, response => { Toast("获取数据出错"); }); }, // 获取饼图数据 GetPieData(){ this.$http.post('/bill/GetCount', { Date:this.date, Type:0, User: '1', }).then(response => { if(response.body.result.result) { this.PieData = response.body.result.data; }else { Toast(response.body.result.data) } }, response => { Toast("获取数据出错"); }); }, // 绘制图表 DrawPieChart(){ // 基于准备好的dom,初始化echarts实例 let myChart = echarts.init(document.getElementById('ChartPie')); let data = this.PieData; // 绘制图表 myChart.setOption({ tooltip: { trigger: 'item', formatter: "{a} <br/>{b} : {c} ({d}%)" }, series: [ { name: '消费', type: 'pie', radius: '55%', center: ['50%', '50%'], data: data } ] }); }, DrawLineChart(){ // 基于准备好的dom,初始化echarts实例 let myChart = echarts.init(document.getElementById('ChartLine')); let data = this.LineData; let x=[],y=[],count=0; for(let i of data) { x.push(i.name); y.push(i.value); count+=i.value; } // 绘制图表 myChart.setOption({ title : { text: count, subtext: '单位(元)', x:'right' }, tooltip: { trigger: 'axis' }, calculable: false, grid: { x: 12, y: 10, x2: 12, y2: 30, borderWidth: 0 }, xAxis: [ { splitLine: { show: false }, type: 'category', boundaryGap: false, data: x } ], yAxis: [ { show: false, type: 'value' } ], series: [ { name: '消费', type: 'line', center: ['10%', '10%'], smooth: true, itemStyle: { normal: { areaStyle: { type: 'default' } } }, data: y }, ] }); } }, // 监测变化 watch:{ PieData:function () { this.DrawPieChart(); // 绘制表格 }, LineData:function () { this.DrawLineChart(); // 绘制表格 } }, // 创建后执行 mounted(){ this.GetChartLineData(); this.GetPieData(); } } </script> <style scoped> .chart{ width: 100%; height: 300px; } </style>
二、添加新页面的路由
这里用到了路由的嵌套import Vue from 'vue' import Router from 'vue-router' import Hello from '@/components/Hello' // 记账页面 import Count from "@/components/Count" // 统计页面 import MonthCount from "@/components/MonthCount" import YearCount from "@/components/YearCount" Vue.use(Router) export default new Router({ routes: [ {path: '/', component: Hello}, {path: '/Count', component: Count,children:[ {path: '', component: MonthCount}, {path: 'year', component: YearCount} ]} ] } da5d )
三、编写统计页面
Count.vue<template> <div id="Count"> <div class="Count_Top"> <label >当前历史记账金额(元)</label><br> <label class="Money">{{TotallCount}}</label> </div> <div> <mt-navbar v-model="selected"> <router-link to="/Count" v-bind:class="ClassMenuMonth" v-on:click.native="select(0)" >当月 </router-link> <router-link to="/Count/year" v-bind:class="ClassMenuyear" v-on:click.native="select(1)"> 当年 </router-link> </mt-navbar> <router-view ></router-view> </div> </div> </template> <script> import { Toast } from 'mint-ui'; export default { methods: { select(m){ this.selected = m; }, GetTotallCount(){ this.$http.post('/bill/GetTotallCount', { User: '1' }).then(response => { if(response.body.result.result) { this.TotallCount=response.body.result.data; }else { Toast(response.body.result.data) } }, response => { Toast("获取数据出错") }); }, }, created(){ this.GetTotallCount(); }, data() { return { TotallCount: 0, selected:-1, } }, computed:{ // 使用计算属性给菜单动态添加样式 ClassMenuMonth(){ return{ 'mint-tab-item':true, 'is-selected':this.selected==0, } }, ClassMenuyear(){ return{ 'mint-tab-item':true, 'is-selected':this.selected==1, } } }, }; </script> <style scoped> #Count .Count_Top{ padding: 16px; color: #26a2ff; } #Count .Count_Top label{ font-size: 12px; } #Count .Count_Top .Money{ font-size: 30px; } #Count{ margin-top: 0; position: relative; height: auto; background-color: #eee;} .mint-tab-item{ padding: 12px; } </style>
四、发布查看
五、总结
1、没有用到vuex,菜单选择样式可以通过这个来解决现有问题,我觉得vuex主要是data数据管理,解决了组件之间数据传递的麻烦。2、watch监测数据变化。
3、echarts 更多图表绘制参看官网
4、本想使用mint-ui的无限加载或者上拉加载,但是在这个页面里没弄成功,就自己写了个点击加载的。
5、vue.js 的是mvvm框架,页面绑定数据,我们一切操作只需要修改数据,页面自动改变。不需要直接操作页面元素。
相关文章推荐
- Asp.net+Vue2构建简单记账WebApp之四(vue.js构建记账主页面)
- Asp.net+Vue2构建简单记账WebApp之五(vue.js构建记账页面)
- Asp.net+Vue2构建简单记账WebApp之三(使用Vue-cli构建vue.js应用)
- Asp.net+Vue2构建简单记账WebApp之三(使用Vue-cli构建vue.js应用)
- VUE2.0的简单入门(一)-安装node.js环境搭建与项目构建
- Asp.net+Vue2构建简单记账WebApp
- Asp.net+Vue2构建简单记账WebApp之二(使用ABP迅速搭建.Net后台)
- 利用JS跨域做一个简单的页面访问统计系统
- 使用Vue.js搭建简单的表格页面
- 利用JS跨域做一个简单的页面訪问统计系统
- vue.js单页面应用实例的简单实现
- 利用JS跨域做一个简单的页面访问统计系统
- 使用Vue.js和Element-UI做一个简单登录页面的实例
- Asp.net+Vue2构建简单记账WebApp之二(使用ABP迅速搭建.Net后台)
- webpack---webpack构建vue多页面框架(二、webpak.config.js)
- 使用Vue.js和Element-UI做一个简单的登录页面
- vue实现简单购物车页面部分功能
- Vue.js项目中管理每个页面的头部标签的两种方法
- JS组件系列——又一款MVVM组件:Vue(二:构建自己的Vue组件)
- js实现简单页面全屏