美文网首页vue2.js 学习实践
Asp.net+Vue2构建简单记账WebApp之六(vue.j

Asp.net+Vue2构建简单记账WebApp之六(vue.j

作者: 易兒善 | 来源:发表于2017-09-16 22:17 被阅读149次

    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/ 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}
        ]}
      ]
    })
    
    

    三、编写统计页面

    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.j

        本文链接:https://www.haomeiwen.com/subject/poiusxtx.html