• vue2.0 + vux (六)NewsList 资讯页 及 NewsDetail 资讯详情页


    设置代理,避免出现跨域问题

    /*设置代理,避免出现跨域问题*/
    proxyTable: {
      '/api':{
        target: 'https://www.oschina.net/action/apiv2/',
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    },

    api/index.js  接口配置

    /**
     * 引入 异步请求API
     */
    import "whatwg-fetch"
    
    const host_addr='http://192.168.1.110:8081/'
    
    /**
     * 获取资讯列表
     * 解决跨域问题: 用 '/api' 代替 host_addr
     */
    export let getList = async (page, tag) => {
      let response = await fetch('/api' + `news_list?pageIndex=${page}&pageSize=20&catalog=${tag}`, {
        method: 'GET',
        mode: 'cors'
      }).catch((error) => {
        console.log(error)
      })
      return await response.json().catch((error) => {
        console.log(error)
      })
    }
    
    /**
     * 获取资讯详情
     */
    export let getNewsDetail = async (id) => {
      let response = await fetch('/api' + `news_detail?id=${id}`, {
        method: 'GET',
        mode: 'cors'
      }).catch((error) => {
        console.log(error)
      })
      return await response.json().catch((error) => {
        console.log(error)
      })
    }
    
    /**
     * 获取博客列表
     */
    export let getBlogList = async (page, tag) => {
      let response = await fetch(host_addr + `blog_list?pageIndex=${page}&pageSize=20&catalog=${tag}`, {
        method: 'GET',
        mode: 'cors'
      }).catch((error) => {
        console.log(error)
      })
      return await response.json().catch((error) => {
        console.log(error)
      })
    }
    
    /**
     * 获取问答列表
     */
    export let getQuestionList = async (page, tag) => {
      let response = await fetch(host_addr + `question_list?pageIndex=${page}&pageSize=20&catalog=${tag}`, {
        method: 'GET',
        mode: 'cors'
      }).catch((error) => {
        console.log(error)
      })
      return await response.json().catch((error) => {
        console.log(error)
      })
    }
    
    /**
     * 获取活动列表
     */
    export let getEventList = async (page, tag) => {
      let response = await fetch(host_addr + `event_list?pageIndex=${page}&pageSize=20&catalog=${tag}`, {
        method: 'GET',
        mode: 'cors'
      }).catch((error) => {
        console.log(error)
      })
      return await response.json().catch((error) => {
        console.log(error)
      })
    }
    

    1.资讯页

    NewsList.vue

    <!-- 资讯 -->
    <template>
      <div>
        <!-- 轮播图 -->
        <swiper :list="imgs" auto style="100%;height:120px;margin:0 auto;" dots-class="custom-bottom" dots-position="center"></swiper>
        <!-- 滚动列表 -->
        <div>
          <scroller lock-x scrollbar-y :height="height" :bounce=false :scrollbarY="false" ref="scroller">
            <div class="news-wrap-list">
              <cell v-for="x in Objlist" :title="x.title" :link="{path:'/newsDetail',query:{id:x.id,tag:'资讯'}}" :inline-desc="x.body" :key="x.id">
                <img class="ic_img" slot="icon" src="../../assets/img/ic_label_today.png">
                <div>
                  <span class="pubdate">{{x.pub_date}}</span>
                </div>
              </cell>
            </div>
          </scroller>
        </div>
      </div>
    </template>
    
    <script>
      // 引入 vux 内部组件
      import { Swiper, Scroller, Cell } from 'vux'
      // 引入 api接口文档
      import { getList } from '../../api/index.js'
    
      // 轮播图列表
      const imgList = [
        'http://file06.16sucai.com/2016/0222/17714c3b51079911760e5ef7fdb553f6.jpg',
        'http://pic.58pic.com/58pic/15/67/98/93C58PICjeM_1024.jpg',
        'http://file06.16sucai.com/2016/0315/1df566087c24a94cd9534bc9bc1871ff.jpg'
      ];
    
      // 轮播图图片地址列表
      const urlList = imgList.map((one, index) => ({
        url: 'javascript:',  //这里填写图片点击的链接
        img: one
      }));
    
      export default {
        name: 'NewsList',
        components:{
          Swiper,
          Scroller,
          Cell
        },
        data(){
          return {
            imgs:urlList,
            Objlist:[],
            ishow:false,
            pageIndex:1,
            catalog:0,
            height: ''
          }
        },
        created(){
          // 获取屏幕高度
          this.height = document.documentElement.clientHeight - 46 - 44 - 120 - 53 + 'px';
          console.log(this.height);
          // 请求列表数据
          this.getList();
        },
        methods:{
          // 异步请求
          async getList(){
            // 获取列表数据
            let data = await getList(this.pageIndex, this.catalog);
            console.log(data);
            // 获取资讯列表数据
            var news_list = data.obj_list;
            // 判断是否还有数据
            if(news_list.length > 0){
              this.ishow = true;
              for(var i=0;i<news_list.length;i++){
                var time = news_list[i].pub_date;
                // 修改日期显示格式
                var bngDate = new Date(time.replace(/-/g,"/"));
                var endDate = new Date();
                var minutes = (endDate.getTime() - bngDate.getTime())/60/1000;
    
                // 时间段 判断pub_date显示内容
                if(minutes >= 60){
                  minutes = minutes/60;
                  var dateTime = parseInt(minutes);
                  if(dateTime >= 48){
                    news_list[i].pub_date = "2天前";
                  }else if(dateTime >= 24){
                    news_list[i].pub_date = "昨天";
                  }else{
                    news_list[i].pub_date = dateTime + "小时以前";
                  }
                }else{
                  var minute = parseInt(minutes);
                  news_list[i].pub_date = minute + "分钟以前";
                }
    
                news_list[i].title = "  " + news_list[i].title;
                this.Objlist.push(news_list[i]);
              }
            }
            this.locked = false;
            this.loading = false;
          },
          load(uuid){
            setTimeout(() => {
              this.$broadcast('pulldown:reset', uuid);
            }, 1000);
          }
        }
      }
    </script>
    
    <style lang="less" scoped>
      .ic_img{
        position:absolute; top:10px; left: 5px;
        15px;
        height:15px;
      }
      .weui_cell_bd>p{
        font-size:15px;
      }
      .vux-label-desc{
        padding-right:15px;
      }
      .weui_cell_bd.weui_cell_primary{
        padding-left:5px;
      }
      .news-wrap-list {
        height: 2800px;
        overflow: hidden;
      }
      .pubdate{
        font-size:5px;
      }
    </style>

    2.资讯详情页

    NewsDetail.vue

    <!-- 资讯详情页 -->
    <template>
      <div>
        <tabbar class="tabbar">
          <div class="title">{{title}}</div>
          <tabbar-item class="search"></tabbar-item>
        </tabbar>
        <h3 class="htitle">{{result.title}}</h3>
        <scroller  lock-x scrollbar-y :height="height" :bounce=false :scrollbarY="false" ref="scroller">
          <div id="content" class="contentDiv"></div>
        </scroller>
      </div>
    </template>
    
    <script>
      import { Tabbar,TabbarItem,Scroller} from 'vux'
      import { getNewsDetail } from '../../api/index.js'
      // 引入 jquery
      import "jquery"
      var $ = require('jquery');
      window.$ = $;
    
      export default{
        name:'NewsDetail',
        data () {
          return {
            title: '',
            result:'',
            body: '',
            height: ''
          }
        },
        components:{
          Tabbar,
          TabbarItem,
          Scroller
        },
        created () {
          // 获取屏幕高度
          this.height = document.documentElement.clientHeight - 50 - 100 - 53 + 'px';
          console.log(this.$route.query);
          this.title = this.$route.query.tag;
          this.getDetail();
        },
        methods:{
          // 获取消息id,根据id到服务端请求详情
          async getDetail() {
            let data = await getNewsDetail(this.$route.query.id);
            console.log(data);
            if(data.code >= 0){
              this.result = data.obj_data;
              this.body = data.obj_data.body;
              $(".contentDiv").html(this.body);
              //获取div高度,根据该高度设定滑动区域,避免footer位置变化
              var contentHeight=$(".contentDiv").height() + 50;
              document.getElementById("content").style.height = contentHeight + "px";
              this.$nextTick(() => {
                this.$refs.scroller.reset();
              });
            }
          }
        }
      }
    </script>
    
    <style lang="less" scoped>
      .tabbar{
        background-color:#00CC66;
        height:50px;
        position:relative;
      }
      .search{
        position:absolute;right:5px;top:5px;z-index:999;
      }
      .title{
        text-align:center;
        margin:auto;
        color:white;
        line-height:50px;
        font-size:18px;
      }
      .htitle{
        text-align:center;
        margin:auto;
        color:black;
        line-height:50px;
        height: 100px;
      }
    </style>
    

    3.效果图

  • 相关阅读:
    关于python3在centOS7下源码安装的配置
    nginx服务器多虚拟主机配置
    完全数
    高精度计算组合数
    算法竞赛入门经典第六章总结
    线段树
    奶牛
    算法竞赛入门经典第五章总结
    优先队列的使用方法
    放魔法石的游戏
  • 原文地址:https://www.cnblogs.com/crazycode2/p/7862453.html
Copyright © 2020-2023  润新知