123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- <template>
- <div class="app-view-toolbar app-view-full-toolbar">
- <div class="tips">
- <div class="ui-remark">1、全景图:请上传比例为2:1的全景图片,jpg、jpeg格式,大小不超过120MB。</div>
- <div class="ui-remark">2、户型:请先制作户型,然后选择添加。</div>
- </div>
- <div class="pano-label">
- <ul>
- <li :class="{active:item.id===type}" @click="type=item.id" v-for="(item,i) in $panoType" :key="i">{{item.name}}</li>
- </ul>
- <div class="pano-con">
- <template v-if="list.length>0">
- <draggable tag="ul" v-model="list" animation="300" @sort="uploadListSort">
- <li v-for="(item,i) in list" :class="{'li-uploading':item.status==1,'li-fail':item.status==2}" :key="i">
- <div class="typeli">
- <i class="iconfont iconscene_map_3d" :class="{'iconjump':item.type!=='house'}"></i>
- </div>
- <div class="img">
- <img :src="item.icon" alt="">
- </div>
- <div class="oper" v-if="item.status!=1">
- <i class="iconfont iconmore"></i>
- <ul>
- <template v-if="item.status==3">
- <li v-if="type!='house'" @click="$emit('rename',item)">重命名</li>
- <li v-else @click="$emit('addVR',{type,data:item})">编辑</li>
- </template>
- <li v-if="item.status!=1" @click="del(item)">删除</li>
- </ul>
- </div>
- <div class="ui-title">
- <span>{{type=='house'?item.roomName:item.sceneTitle}}</span>
- </div>
- </li>
- </draggable>
- </template>
- <div class="no-record" v-else>
- <i class="iconfont iconscene_map_3d" :class="{'iconjump':type!=='house'}"></i>
- <p>{{ type!='house'?'请先上传全景图':'请先添加户型'}}</p>
- </div>
- <div class="add-btn" >
- <button v-if="type!='house'" class="ui-button submit" @click="$refs.uploadFile.click();"><i class="iconfont icon_plus"></i>上传全景图
- <upload ref="uploadFile" :failString="'请上传jpg格式的全景图'" accept-type="image/jpeg" media-type="image" :limit="120" @file-change="onFileChange"></upload>
- <!-- multiple="multiple" -->
- </button>
- <button v-if="type=='house'||type=='garden'" class="ui-button submit" @click="$emit('addVR',{type})" >
- <i class="iconfont icon_plus"></i>{{type=='garden'?'添加VR模型':'添加户型'}}
- </button>
- </div>
- </div>
- </div>
- </div>
- </template>
- <script>
- import Upload from "@/components/shared/uploads/UploadMultiple";
- import { uploadPano,getPanoList,delPano,setListSort } from "@/api";
- import { getImgWH } from '@/utils/file'
- import { $waiting } from '@/components/shared/loading'
- import draggable from 'vuedraggable'
- const LONGPOLLINGTIME = 30
- export default {
- data(){
- return {
- type:'building',
- interval:null,
- list:[],
- isLongPolling:false
- }
- },
- watch:{
- type(){
- this.getPanoList()
- },
- '$route.name':{
- immediate:true,
- handler:function (newVal) {
- if (newVal!='information') {
- this.clearinter()
- }else{
- this.Longpolling()
- }
- }
- },
- isLongPolling:{
- immediate:true,
- handler:function (newVal) {
- if (!newVal) {
- this.clearinter()
- }else{
- this.Longpolling()
- }
- }
- }
- },
- mounted(){
- this.$bus.on('refresh',()=>{
- this.getPanoList()
- })
- this.getPanoList()
- },
- methods:{
- clearinter(){
- this.interval && clearInterval(this.interval)
- this.interval = null
- },
- Longpolling(){
- this.clearinter()
- this.interval = setInterval(() => {
- this.getPanoList(true)
- }, LONGPOLLINGTIME*1000);
- },
- uploadListSort(){
- let tmp = {}
- this.list.forEach((item,i)=>{
- tmp[item['id']] = i+1
- })
- setListSort(tmp)
- },
- del(item){
- this.$confirm({
- content: "是否删除?",
- ok: () => {
- delPano(item.id,()=>{
- this.$tips({ content: "删除成功",icon:'ok' });
- this.getPanoList()
- this.$bus.emit('undateAllVrList')
- this.$bus.emit('setInitScene')
- });
- }
- });
- },
- getPanoList(islongpolling=null){
- getPanoList({
- pageNum: 1,
- pageSize: 1000,
- searchKey: "",
- type: this.type,
- islongpolling
- },data=>{
- this.list = data.data.list
- this.isLongPolling = data.isCheck
- this.$store.commit("SetVrList", data.data.list);
- this.$bus.emit('undateAllVrList',islongpolling)
- this.$bus.emit('setInitScene',islongpolling)
- })
- },
- onFileChange(file) {
- let canUploadList = []
- for (let i = 0; i < file.files.length; i++) {
- let item = file.files[i];
- if (item.type.indexOf("jpeg")<=-1) {
- return this.$tips({content:'请上传jpg格式的全景图'})
- }
- canUploadList.push(item)
- }
- let p = []
- canUploadList.forEach(i => {
- let data = {}
- data['file'] = i
- let promise = getImgWH(i)
- p.push(promise)
- })
- Promise.all(p).then(result=>{
- let pp = []
- p.length>0&&result.forEach(data => {
- let {width,height}=data.WH
- if(width != 2*height){
- return this.$tips({content:'全景图片必须为2:1比例'})
- }
- let params = {}
- params['file'] = data.file
- let promise = new Promise((resolve, reject) => {
- uploadPano(params, this.type, response => {
- resolve(response);
- },(err)=>{
- reject(err)
- })
- })
- pp.push(promise)
- });
- pp.length>0&& Promise.all(pp).then(response=>{
- if (response.length>0) {
- $waiting.hide()
- this.$alert({content:'上传成功',icon:'ok'})
- this.getPanoList()
- }
- })
- })
- }
- },
- components:{
- draggable,
- Upload
- }
- }
- </script>
- <style lang="less" scoped>
- .tips{
- width: 100%;
- }
- .no-record{
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%,-50%);
- text-align: center;
- color: rgba(255, 255, 255, 0.5);
- >i{
- font-size: 30px;
- }
- }
- .pano-label{
- .pano-con{
- padding: 0;
- height: calc(100vh - 250px);
- >ul{
- max-height: calc(100% - 10px);
- overflow-y: auto;
- >li{
- }
- }
- .add-btn{
- z-index: 20;
- .ui-button{
- margin: 0 5px;
- }
- }
- }
- }
- </style>
|