17.vue移动端项目二

FilmList.vue 电影列表
<template>
  <div class="mz-film-list">
    <!-- 正在热映 https://m.maizuo.com/v4/api/film/now-playing?__t=1533018029103&page=1&count=7 -->
    <!-- 即将上映 https://m.maizuo.com/v4/api/film/coming-soon?__t=1533018029121&page=1&count=7 -->
    <ul class="film-list-nav">
        <li @click="show(index)" v-for="(item,index) in types" :class="{[item.type]:true,active:iNow==index}" :key="item.id">{{item.title}}</li>
    </ul>
    <ul class="film-list-wrap">
      <router-link tag="li" :to="{name:‘filmdetail‘,params:{id:item.id}}" v-for="item in arr" :key="item.id">
        <img class="fl film-item-img" :src="item.poster.thumbnail" />
        <div class="film-desc">
          <div class="film-grade" v-if="item.isNowPlaying==true">{{item.grade}}</div>

          <div class="film-name">{{item.name}}</div>
          <div class="film-intro">{{item.intro}}</div>

          <template  v-if="item.isNowPlaying==true">
            <div class="film-counts">
                  <span class="film-count-color">{{item.cinemaCount}}</span><span>家影院上映</span>
                  <span class="film-count-color" >{{item.watchCount}}</span><span>人购票</span>
            </div>
          </template>
          <template v-else>
            <div class="film-premiere-date">
              <span>12月31日上映</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>星期一</span>
            </div>
          </template>

        </div>
        <!-- <img class="fl film-item-img" src="https://pic.maizuo.com/usr/movie/aa7872b51e94b5f85a73a34bb93bd21b.jpg?x-oss-process=image/resize,m_fixed,h_0,w_300" />
        <div class="film-desc">
          <div class="film-grade">8.5</div>
          <div class="film-name">我不是药神</div>
          <div class="film-intro">一场关于“救赎”的拉锯战</div>
          <div class="film-counts">
                <span class="film-count-color1">199</span><span>家影院上映</span>
                <span class="film-count-color1" >0</span><span>人购票</span>
          </div>
          <div class="film-premiere-date">
            <span>12月31日上映</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>星期一</span>
          </div>
        </div> -->
      </router-link>
    </ul>
  </div>
</template>

<script>
export default {
  name:"mz-film",
  data(){
    return {
      iNow:0,
      types:[
        {id:Math.random(),type:"now-playing",title:"正在热映"},
        {id:Math.random(),type:"coming-soon",title:"即将上映"}
      ],
      page:1,
      count:7,
      isLoaded:true,
      arr:[]

    }

  },
  methods:{
    show(index){
      //数据初始化
      this.iNow = index;
      this.isLoaded = true;
      this.page = 1;
      this.arr = [];
      this.getFilms();
    },
    getFilms(){
      if(!this.isLoaded){return;}
      let params = {__t:Date.now(),page:this.page,count:this.count};
      let url = `http://localhost:9000/mz/v4/api/film/${this.types[this.iNow].type}`;
      this.$http.get(url,{params}).then(res=>{
        this.arr=this.arr.concat(res.data.data.films);
        console.log(this.arr);
        if(res.data.data.films.length == 0){
          this.isLoaded = false;
        }
      });

    }
  },
  created(){
    this.getFilms();
  },
  mounted(){
    window.onscroll = () =>{
      let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
      let scrollHeight = document.body.scrollHeight;
      let clientHeight = document.documentElement.clientHeight;
      if(scrollTop + clientHeight == scrollHeight){
        if(this.isLoaded){
          this.page++;
          console.log("到底了",this.page);
          this.getFilms();
        }
      }
    };
  }
}
</script>
<style>
.mz-film-list{padding-left: 15px;padding-right: 15px;}
.film-list-nav {
    height: 46px;margin: 0 auto;border-bottom: solid #fe6e00 1px;
}

.film-list-nav li{
    float: left;
    width: 50%;height: 100%;text-align: center;
    font-size: 16px;line-height: 46px;color: #6a6a6a;cursor: pointer;
}
.film-list-nav li.active {
    color: #fe6e00; border-bottom: solid;
}

.film-list-wrap li{width:345px; height: 125px;
    padding: 20px 0;
    border-bottom: dashed 1px #c9c9c9;
    cursor: pointer;}

.film-list-wrap .film-item-img {
    width: 60px;float: left;overflow: hidden;
}

.film-list-wrap .film-desc {
    width: 75%;padding-left: 15px;display: inline-block;
}
.film-list-wrap .film-desc .film-grade {
    float: right;font-size: 16px;line-height: 32px;color: #fc7103;
}
.film-list-wrap .film-desc .film-intro{
  color: #8e8e8e;font-size: 12px;line-height: 32px;
}
.film-list-wrap .film-desc .film-name {
    font-size: 16px; line-height: 32px;color: #000;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;
}
.film-list-wrap .film-desc .film-counts {line-height: 32px;

    line-height: 24px;color: #8e8e8e;font-size: 12px;
}
.film-list-wrap .film-desc .film-count-color {color: #8aa2bf;}
.film-list-wrap .film-desc .film-premiere-date {
  line-height: 32px;
    line-height: 24px;color: #ffb375;font-size: 12px;
}
</style>
FilmDetail.vue

详情页,没写样式

<template>
  <div class="mz-film-detail">
      mz-film-detail xxx {{film}}
  </div>
</template>

<script>
export default {
  name: "mz-detail",
  props:["id"],
  data () {
    return {
       film:{},
    }
  },
  methods:{
    getFilmDeatil(){//now-playing | coming-soon
      //https://m.maizuo.com/v4/api/film/4266?__t=1533093597327

      let params = {__t:Date.now()};
      let url = `http://localhost:9000/mz/v4/api/film/${this.id}`;
      this.$http.get(url,{params}).then(res=>{
          this.film = res.data.data.film;
      });
    }

  },
  created(){
    this.getFilmDeatil();
  }
}
</script>
<style>
.mz-film-list{padding-left: 15px;padding-right: 15px;}

</style>
Cinema.vue

影院详情

<template>
  <div class="mz-cinema">
    <dl class="district" v-for="(item,key,index) in oCinema" :key="item.id">

      <template v-if="index==0">
        <dt @click="show(item)" class="title">{{item.name}}</dt>
        <!-- //{{item.data}} -->
        <dd v-show="!item.isShow" class="wraper" v-for="obj in item.data" :key="obj.id">
          <p>{{obj.name}}}</p>
          <p>{{obj.address}}}</p>
          <p>距离未知</p>
        </dd>
      </template>
      <template v-else-if="index!=0">
        <dt @click="show(item)" class="title">{{item.name}}</dt>
        <!-- //{{item.data}} -->
        <dd v-show="item.isShow" class="wraper" v-for="obj in item.data" :key="obj.id">
          <p>{{obj.name}}}</p>
          <p>{{obj.address}}}</p>
          <p>距离未知</p>
        </dd>
      </template>
      <!-- <dt class="title">市南区</dt>
      <dd class="wraper">
        <p>横店电影城青岛中山路店</p>
        <p>青岛市市南区中山路67号乐喜客来广场2-4层</p>
        <p>距离未知</p>
      </dd>  -->
    </dl>
  </div>
</template>

<script>
import {mapActions,mapMutations,mapState,mapGetters} from "vuex";
export default {
  name: "mz-cinema",
  data() {
    return {
       oCinema:{},
    }
  },
  methods:{
    ...mapActions({yingyuan:"yingyuanAction"}),
    show(item){
      item.isShow = !item.isShow;
      console.log(item.isShow);
    },
    getCinemas(){
      //https://m.maizuo.com/v4/api/cinema?__t=1533103317490
      let url = "http://localhost:9000/mz/v4/api/cinema";
      let params = {params:{__t:Date.now()}};
      this.$http.get(url,params).then(res=>{
        this.arr = res.data.data.cinemas;

        let cinemas = res.data.data.cinemas;
        let oCinema = {};
        //数据初始化
        cinemas.forEach(item => {
          //console.log("item:",item.id,item.name,JSON.stringify(item.district));
          //shi-nan-qu
          if(oCinema[item.district.pinyin]){
            //在每个区里面添加数据
            oCinema[item.district.pinyin].data.push({
                id:item.id,
                name:item.name,
                pinyin:item.pinyin,
                address:item.address
            });
          } else {
              oCinema[item.district.pinyin] = {
                id:Math.random(),
                name:item.district.name,
                isShow:false,
                data:[{
                    id:item.id,
                    name:item.name,
                    pinyin:item.pinyin,
                    address:item.address
                }]
              };
          }
        });
        this.oCinema = oCinema;
      });
    }
  },
  created(){
    this.getCinemas();
    this.yingyuan()
  },
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
  .district .title {
    height: 40px;
    line-height: 40px;
    font-size: 14px;
    padding-left: 16px;
    background: #e1e1e1;
    margin-bottom: 1px;
    color: #636363;
    cursor: pointer;
}

.district .wraper{
    margin: 0 auto;
    border-bottom: 1px solid #e1e1e1;
    cursor: pointer;
    min-width: 320px;
}
</style>

原文地址:https://www.cnblogs.com/zhongchao666/p/9463028.html

时间: 2024-10-08 12:30:17

17.vue移动端项目二的相关文章

Vue移动端项目总结

使用Vue项目写了一个移动端项目,然后又把项目硬生生的抽离了组件,一直忙着写RN项目没有时间总结心得,今天上午终于下定决心,写点总结. 1.position:absolute: 定位的时候不同手机的浏览器版本不一样,存在兼容性问题,所以要修改为fixed,然后使用left: calc(50% - 1rem )进行定位: 2.event.touches[0].pageY:移动端事件touchstart,touchmove,touchend,在vue中的手指滑动的对象是要传入$event才可以使用e

vue移动端弹框组件的实例

最近做一个移动端项目,弹框写的比较麻烦,查找资料,找到了这个组件,但是说明文档比较少,自己研究了下,把我碰到的错,和详细用法分享给大家!有疑问可以打开组件看一看,这个组件是仿layer-mobile的,很多用法都一样,可以看看哦! 一.npm 安装 ? 1 2 3 4 // 当前最新版本 1.2.0 npm install vue-layer-mobile // 如新版遇到问题可回退旧版本 npm install [email protected] 二.调整配置:因为这个组件中有woff,ttf

VUE学习笔记之vue cli 构建项目

一.环境搭建: 1.安装node.js 从node.js官网下载并安装node,安装过程很简单,一路"下一步"就可以了.安装完成之后,打开命令行工具(win+r,然后输入cmd),输入 node -v,如下图,如果出现相应的版本号,则说明安装成功 因为在官网下载安装node.js后,就已经自带npm(包管理工具)了,要意的是npm的版本最好是3.x.x以上,以免对后续产生影响. 2.安装淘宝镜像 npm install -g cnpm --registry= https://regis

vue移动端弹框组件

最近做一个移动端项目,弹框写的比较麻烦,查找资料,找到了这个组件,但是说明文档比较少,自己研究了下,把我碰到的错,和详细用法分享给大家!有疑问可以打开组件看一看,这个组件是仿layer-mobile的,很多用法都一样,可以看看哦! 一.npm 安装 // 当前最新版本 1.2.0  npm install vue-layer-mobile // 如新版遇到问题可回退旧版本  npm install [email protected] 二.调整配置:因为这个组件中有woff,ttf,eto,svg

项目二. 网络安全传输系统

项目二. 网络安全传输系统 sprint0-产品规划与设计 第1课-产品功能展示与模型设计 1. 功能 在底层开发上,先进行驱动开发,再往后发展就是对应的系统开发.要成为系统开发的工程师不了解应用编程的话也是行不通的. 本项目的服务器运行在pc的虚拟机上,客户端则安排在开发板上.我们在虚拟机上可以运行客户端,接下来我们在开发板上进行登录.可以选择的选项有: update Files Download Files Exit 也就是客户端可以将文件进行上传和下载服务器上的内容. 2. 模型 服务器:

vue移动端弹框组件,vue-layer-mobile

最近做一个移动端项目,弹框写的比较麻烦,查找资料,找到了这个组件,但是说明文档比较少,自己研究了下,把我碰到的错,和详细用法分享给大家!有疑问可以打开组件看一看,这个组件是仿layer-mobile的,很多用法都一样,可以看看哦! 一.npm 安装 // 当前最新版本 1.2.0  npm install vue-layer-mobile // 如新版遇到问题可回退旧版本  npm install [email protected] 二.调整配置:因为这个组件中有woff,ttf,eto,svg

总结一下做移动端项目遇到的坑

新上线了一个vue的移动端项目,其中用到了时间控件,但是input[type='date']没有placeholder属性,网上查到的方法是<input type='text' onfocus='this.type="date"'>,这种方法在ios上是没问题的,但是在安卓上则需要点击两次才可以调起系统的时间控件.因此决定自己写个组件,解决安卓上的兼容性问题.代码如下: <template> <div class="date_container&

使用vue cli开发项目中遇到的坑

一.部署文件 使用vue cli 开发项目,执行npm run build命令生成dist静态文件,将dist文件包放到服务器中即可. 刚接触webpack,不知道怎么部署前端文件,原以为需要将app文件上传,在 inux上安装node,以及npm install 一系列的包,捣鼓了很久,发现只需要执行 npm run build 将源码打包成一个静态文        文件即可,上传静态文件dist,将 controller指向index.html. 二.跨域问题 实行前后端分离,使用vue i

Haoop MapReduce 的Partition和reduce端的二次排序

先贴一张原理图(摘自hadoop权威指南第三版) 实际中看了半天还是不太理解其中的Partition,和reduce端的二次排序,最终根据实验来结果来验证自己的理解 1eg 数据如下 2014010114 标识20140101日的温度为14度,需求为统计每年温度的最最高值 2014010114 2014010216 2014010317 2014010410... Partition 实际是根据map 任务的key,以及reduce任务的数量来决定最终来由那个reduce来处理,默认指定redu