ImagePreview实现图片预览

  • 需求:现在很多手机app都不用原生态开发,我们可以使用手机前端ui框架实现。例如:本案例使用的是vue+cube-ui,那我们要实现在手机上查看大图,即点击图片,图片放大,可以对图片进行缩放,如果有多张,可以滑动切换。下面直接上代码:

      <template>
        <div class="container">
          <div class="header">
            <div class="back" @click="goBack()"><img src="../assets/back-icon.png"></div>
            <div class="title">材料管理</div>
            <div class="operate" @click="toFilterPage">
              <span class="operateText">筛选</span>
            </div>
          </div>
          <div class="tab">
            <div class="tab-item" @click="changeData(0)">进场记录
              <div class="tab-line"></div>
            </div>
            <div class="tab-item" @click="changeData(1)">领用记录
              <div class="tab-line"></div>
            </div>
          </div>
          <div class="wrapper" ref="wrapper">
            <ul class="content">
              <li v-for="(item, index) in dataList">
                <div :class="item.checkResult == 'Y' ? 'item-list-y' : 'item-list-n' ">
                  <div class="list-title">单号:{{item.mioNo}}{{item.mooNo}}
                    <span v-if="item.checkResult == 'Y' && item.mioProduct" class="check-y">合格</span>
                    <span v-if="item.checkResult == 'N' && item.mioProduct" class="check-n">不合格</span>
                  </div>
                  <div class="list-text" v-if="item.mioProduct">进场时间:{{item.createDate.split(" ")[0]}}<span style="float: right;">验收人:{{item.name}}</span></div>
                  <div class="list-text" v-if="item.mooPlace">领用时间:{{item.createDate.split(" ")[0]}}<span style="float: right;">领用人:{{item.name}}</span></div>
                  <div class="list-text" v-if="item.mioProduct">生产厂家:{{item.mioProduct}}</div>
                  <div class="list-text" v-if="item.remarks" style="line-height: 18px!important;">备注说明:{{item.remarks}}</div>
                  <div class="list-text" v-if="item.mooPlace">施工部位:{{item.mooPlace}}</div>
                  <div class="stuff-list">
                    <div class="stuff-div" v-for="(subItem, subIndex) in item.detailList">
                        <img :src="rootPath+subItem.miodPic | imgStringFilter" @click="showImagePreview(subItem.miodPic)">
                        <div class="stuff-info">
                          <div class="stuff-text">材料:<span>{{subItem.materialName}}</span></div>
                          <div class="stuff-text">数量:<span>{{subItem.materialNum}}</span></div>
                          <div class="stuff-text">型号:<span>{{subItem.materialType}}</span></div>
                        </div>
                    </div>
                  </div>
                </div>
              </li>
            </ul>
            <div class="add" @touchstart="intoAdd"><span>{{addText}}</span></div>
          </div>
          <div class="noInfo" v-show="isShow">暂无数据</div>
          <div class="loadingDiv" :style="{display:show}">
            <cube-loading :size="40"></cube-loading>
          </div>
        </div>
      </template>
      <script>
        import BScroll from 'better-scroll';
        import axios from 'axios';
        import ImagePreview from "cube-ui";
        import qs from 'qs';
        export default {
          data () {
            return {
              imgs: [{url: '../assets/bg.png'}, {url: '../assets/device1.png'}, {url: '../assets/bg.png'}],
              imgs1: ['/SmartSitesApp/assets/bg.png', './SmartSitesApp/assets/device1.png', '/SmartSitesApp/assets/bg.png'],
              addTextList:["+ 进场验收","+ 领用单"],
              tabFlag: 0,
              qryParam: {},
              loadFlag: false,
              pageNum: 1,
              pageSize: 15,
              dataList: [],
              addText:"",
              show: 'none',
              isShow: false,
              pageEnd: false,
              tabPage: 0,
      
              mioNo: '',
              startDate: '',
              endDate: '',
              mioProduct: '',
              createId: '',
      
              mioNo1: '',
              startDate1: '',
              endDate1: '',
              createId1: '',
      
              rootPath: '',
            }
          },
          //过滤器
          filters:{
            //截取分号前面的字符串
            imgStringFilter:function(value){
              return value.split(';')[0];
            }
          },
          methods: {
            showImagePreview(picStr){
                var imgs = [];
                imgs = picStr.split(';');
                var path = this.rootPath;
                for(var i=0; i<imgs.length; i++){
                    imgs[i] = path + imgs[i];
                }
                this.preview = this.$createImagePreview({
                  imgs: imgs
                });
              this.preview.show();
            },
            goBack(){
              this.$router.back(-1);
            },
            showMessage(txt, type){
              const toast = this.$createToast({
                txt: txt,
                type: type,
                time: 2000,
              });
              toast.show();
            },
            showErrMessage(txt){
              const toast = this.$createToast({
                txt: txt,
                time: 2000,
                type: 'error'
              });
              toast.show();
            },
            changeData(val){
              this.isShow = false;
              this.pageNum = 1;
              this.pageEnd = false;
              /*if (this.tabFlag == val) {
                return false;
              }*/
              this.tabFlag = val;
              $(".tab-item").removeClass("tab-sel");
              $(".tab-item:eq(" + val + ")").addClass("tab-sel");
              if (val == 0) {
                this.tabPage = 0;
                this.getIntoRecordData();
              }
              else {
                this.tabPage = 1;
                this.getNeckRecordData();
              }
              this.addText = this.addTextList[val];
            },
            getNeckRecordData(){
              let that = this;
              that.show = "flex";
              let deptId = this.$store.state.deptId;
              let projectId = this.$store.state.projectId;
              let param = {"deptId":deptId, "projectId":projectId, "startDate": that.startDate1, "endDate": that.endDate1, mioNo: that.mioNo1, createrId: that.createId1};
              let qryParam ={"pageNum": that.pageNum, "pageSize": that.pageSize, "param": JSON.stringify(param)};
              axios.post('/SmartSitesApp/stuff/neckRecord.do',qs.stringify(qryParam),{withCredentials:true })
                .then(response => {
                  that.show = "none";
                  let status = response.status;
                  if (status == 200) {
                    let data = response.data;
                    if (data.code == 200) {
                      var data = data.data;
                      if(data.path){
                        that.rootPath = data.path;
                      }
                      let dataLists = data.rows;
                      var totalCount = dataLists.length;
      
                      if (that.pageNum == 1) {
                        if (totalCount > 0) {
                          that.dataList = dataLists;
                          that.pageNum++;
                          if (totalCount < that.pageSize) {
                            that.pageEnd = true;
                          }
                        }
                        else {
                          that.dataList = [];
                          that.isShow = true;
                          $(".container").css("background-color", "#F7F7F7");
                          that.pageEnd = true;
                        }
                      }
                      else {
                        if (totalCount > 0) {
                          that.dataList = that.dataList.concat(dataLists);
                          that.pageNum++;
                          if (totalCount < that.pageSize) {
                            that.pageEnd = true;
                          }
                        }
                        else {
                          that.pageEnd = true;
                        }
                      }
                      that.$nextTick(() => {
                        that.pullingDownUp();
                      });
                    }else {
                      that.showErrMessage(data.msg);
                    }
                  }else{
                    that.showErrMessage("服务错误");
                  }
                })
                .catch(err => {
                  that.show = "none";
                });
            },
            getIntoRecordData(){
              let that = this;
              that.show = "flex";
              let deptId = this.$store.state.deptId;
              let projectId = this.$store.state.projectId;
              let param = {"deptId":deptId, "projectId":projectId, "startDate": that.startDate,"endDate": that.endDate, mioNo: that.mioNo, createrId: that.createId, mioProduct: that.mioProduct};
              let qryParam ={"pageNum": that.pageNum, "pageSize": that.pageSize, "param": JSON.stringify(param)};
              axios.post('/SmartSitesApp/stuff/intoRecord.do',qs.stringify(qryParam),{withCredentials:true })
                .then(response => {
                  that.show = "none";
                  let status = response.status;
                  if (status == 200) {
                    let data = response.data;
                    if (data.code == 200) {
                      var data = data.data;
                      if(data.path){
                        that.rootPath = data.path;
                      }
                      let dataLists = data.rows;
                      var totalCount = dataLists.length;
      
                      if (that.pageNum == 1) {
                        if (totalCount > 0) {
                          that.dataList = dataLists;
                          that.pageNum++;
                          if (totalCount < that.pageSize) {
                            that.pageEnd = true;
                          }
                        }
                        else {
                          that.dataList = [];
                          that.isShow = true;
                          $(".container").css("background-color", "#F7F7F7");
                          that.pageEnd = true;
                        }
                      }
                      else {
                        if (totalCount > 0) {
                          that.dataList = that.dataList.concat(dataLists);
                          that.pageNum++;
                          if (totalCount < that.pageSize) {
                            that.pageEnd = true;
                          }
                        }
                        else {
                          that.pageEnd = true;
                        }
                      }
                      that.$nextTick(() => {
                        that.pullingDownUp();
                      });
                    }else {
                      that.showErrMessage(data.msg);
                    }
                  }else{
                    that.showErrMessage("服务错误");
                  }
                })
                .catch(err => {
                  that.show = "none";
                });
            },
            loadData(){
              if(this.tabFlag == 0){
                if (!this.pageEnd) {
                  this.getIntoRecordData();
                }
                else {
                  this.showErrMessage("已加载全部数据");
                }
              }else if(this.tabFlag == 1){
                if (!this.pageEnd) {
                  this.getNeckRecordData();
                }
                else {
                  this.showErrMessage("已加载全部数据");
                }
              }
            },
            pullingDownUp(){
              this.scroll.finishPullDown();
              this.scroll.finishPullUp();
              this.scroll.refresh() //重新计算元素高度
            },
            intoAdd(){
                if(this.addText == this.addTextList[0]){
                  this.$router.push("addInspectOrder");
                }else{
                  this.$router.push("addUseOrder");
                }
            },
            toFilterPage(){
              this.$router.push({name:"filterPage",params:{"tabPage": this.tabPage}});
            }
          },
          destroyed: function () {
            localStorage.setItem("filterMaterial", null);
          },
          mounted(){
            this.tabPage = 0;
            let that = this;
            var screenWidth = $(window).width();
            $(".add").css("margin-left",(screenWidth-120)/2);
            this.addText = this.addTextList[0];//进场验收添加按钮
            //选项卡切换到进场记录
            $(".tab-item").removeClass("tab-sel");
            $(".tab-item:eq(0)").addClass("tab-sel");
            this.$nextTick(function () {
              that.scroll = new BScroll(that.$refs.wrapper, {bounce: true, momentum: true, click: true});
              that.scroll.on('scrollEnd', () => {
                if (that.scroll.y <= (that.scroll.maxScrollY)) {
                  that.loadData();
                }
              })
            });
      
            try{
              var filterMaterial = JSON.parse(localStorage.getItem("filterMaterial"));
      
              that.tabPage = filterMaterial.tabPage!=undefined&&filterMaterial.tabPage!=null ? filterMaterial.tabPage : 0;
              if(that.tabPage == 0){
                that.mioNo = filterMaterial.orderNo;
                that.startDate = filterMaterial.startTime;
                that.endDate = filterMaterial.endTime;
                that.mioProduct = filterMaterial.productName;
                that.createId = filterMaterial.staffId;
              }else if(that.tabPage == 1){
                that.mioNo1 = filterMaterial.orderNo;
                that.startDate1 = filterMaterial.startTime;
                that.endDate1 = filterMaterial.endTime;
                that.createId1 = filterMaterial.staffId;
              }
      
            }catch(e){
      
            }
            if(that.tabPage == 0){
              that.changeData(0);
            }else if(that.tabPage == 1){
              that.changeData(1)
            }
          }
        }
      </script>
      <style scoped>
        .noInfo {
          margin-top: 10px;
          position: absolute !important;
          font-size: 16px;
          color: #808080;
          width: 100%;
          top: 100px;
          height: calc(100% - 130px);
          background: #fff;
          padding-top: 20px;
        }
        .loadingDiv{
          width: 100%;
          height: 100%;
          display: flex;
          justify-content: center;
          align-items: center;
        }
        .wrapper {
          width: 100%;
          height: calc(100% - 118px);
          overflow: auto;
          margin-top: 10px;
        }
        .item-list-y {
          background-color: #fff;
          margin: 10px 10px 0 10px;
          padding: 10px 10px;
          border-top: 3px solid #5595cf;
          box-shadow: -5px 0 5px rgba(0, 0, 0, 0.2), 5px 0 5px rgba(0, 0, 0, 0.2), 0 5px 5px rgba(0, 0, 0, 0.2);
          text-align: left;
        }
        .item-list-n {
          background-color: #fff;
          margin: 10px 10px 0 10px;
          padding: 10px 10px;
          border-top: 3px solid #c7625c;
          box-shadow: -5px 0 5px rgba(0, 0, 0, 0.2), 5px 0 5px rgba(0, 0, 0, 0.2), 0 5px 5px rgba(0, 0, 0, 0.2);
          text-align: left;
        }
        .check-y{
           color: #5595cf;
          float: right;
          font-size: 13px;
        }
        .check-n{
          color: #c7625c;
          float: right;
          font-size: 13px;
        }
        .list-text
        {
          color:#9e9e9e;
          padding-top:3px;
          font-size: 13px;
          line-height: 26px;
        }
        .stuff-list
        {
          background-color:#f9f9f9;
          margin:10px 0 0px 0;
        }
        .stuff-div
        {
          height:64px;
          position:relative;
          border-top:1px dashed #e9e9e9;
        }
        .stuff-div img
        {
           position: absolute;
           left:10px;
           width:47px;
           height:47px;
           top:10px;
        }
        .stuff-info
        {
          position: absolute;
          left:80px;
          top:0px;
          padding-top:4px;
        }
        .stuff-text
        {
           color:#9e9e9e;
           line-height:20px;
          font-size: 13px;
        }
        .stuff-text span
        {
            text-align:left;
            float:none;
        }
        .add{
          position: absolute;
          bottom: 10px;
          z-index: 9999;
          background-color: #169BD5;
          color: white;
          width: 120px;
          font-size: 14px;
          padding: 10px 0px;
          border-radius: 20px;
        }
        .tab{
          border-bottom: 1px solid #e8e8e8;
          height: 38px!important;
        }
        .tab-item{
          font-size: 13px;
          height: 33px;
          line-height: 32px;
        }
        .list-title{
          font-size: 13px;
          line-height: 26px;
        }
        .tab-sel .tab-line{
          height: 2px;
        }
      </style>
    

这是我工作中开发的页面,是一个完整的案例,上面有js、css,这里面还缺少路由的配置,之所以我这里没有提供的原因是我相信进来看案例的读者一定是有相关开发经验的。

这是重点:本案例主要是实现大图查看,所以读者只需要在其中抽取图片相关的代码,例如<img :src=“rootPath+subItem.miodPic | imgStringFilter” @click=“showImagePreview(subItem.miodPic)”>,函数的实现在下面也可以找到,在使用ImagePreview的时候一定要导入依赖import ImagePreview from “cube-ui”;当然这些都是细节。希望可以帮到大家!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值