Toolbar.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <template>
  2. <div class="app-view-toolbar app-view-full-toolbar">
  3. <div class="tips">
  4. <div class="ui-remark">1、全景图:请上传比例为2:1的全景图片,jpg、jpeg格式,大小不超过120MB。</div>
  5. <div class="ui-remark">2、户型:请先制作户型,然后选择添加。</div>
  6. </div>
  7. <div class="pano-label">
  8. <ul>
  9. <li :class="{active:item.id===type}" @click="type=item.id" v-for="(item,i) in $panoType" :key="i">{{item.name}}</li>
  10. </ul>
  11. <div class="pano-con">
  12. <template v-if="list.length>0">
  13. <draggable tag="ul" v-model="list" animation="300" @sort="uploadListSort">
  14. <li v-for="(item,i) in list" :class="{'li-uploading':item.status==1,'li-fail':item.status==2}" :key="i">
  15. <div class="typeli">
  16. <i class="iconfont iconscene_map_3d" :class="{'iconjump':item.type!=='house'}"></i>
  17. </div>
  18. <div class="img">
  19. <img :src="item.icon" alt="">
  20. </div>
  21. <div class="oper" v-if="item.status!=1">
  22. <i class="iconfont iconmore"></i>
  23. <ul>
  24. <template v-if="item.status==3">
  25. <li v-if="type!='house'" @click="$emit('rename',item)">重命名</li>
  26. <li v-else @click="$emit('addVR',{type,data:item})">编辑</li>
  27. </template>
  28. <li v-if="item.status!=1" @click="del(item)">删除</li>
  29. </ul>
  30. </div>
  31. <div class="ui-title">
  32. <span>{{type=='house'?item.roomName:item.sceneTitle}}</span>
  33. </div>
  34. </li>
  35. </draggable>
  36. </template>
  37. <div class="no-record" v-else>
  38. <i class="iconfont iconscene_map_3d" :class="{'iconjump':type!=='house'}"></i>
  39. <p>{{ type!='house'?'请先上传全景图':'请先添加户型'}}</p>
  40. </div>
  41. <div class="add-btn" >
  42. <button v-if="type!='house'" class="ui-button submit" @click="$refs.uploadFile.click();"><i class="iconfont icon_plus"></i>上传全景图
  43. <upload ref="uploadFile" :failString="'请上传jpg格式的全景图'" accept-type="image/jpeg" media-type="image" :limit="120" @file-change="onFileChange"></upload>
  44. <!-- multiple="multiple" -->
  45. </button>
  46. <button v-if="type=='house'||type=='garden'" class="ui-button submit" @click="$emit('addVR',{type})" >
  47. <i class="iconfont icon_plus"></i>{{type=='garden'?'添加VR模型':'添加户型'}}
  48. </button>
  49. </div>
  50. </div>
  51. </div>
  52. </div>
  53. </template>
  54. <script>
  55. import Upload from "@/components/shared/uploads/UploadMultiple";
  56. import { uploadPano,getPanoList,delPano,setListSort } from "@/api";
  57. import { getImgWH } from '@/utils/file'
  58. import { $waiting } from '@/components/shared/loading'
  59. import draggable from 'vuedraggable'
  60. const LONGPOLLINGTIME = 30
  61. export default {
  62. data(){
  63. return {
  64. type:'building',
  65. interval:null,
  66. list:[],
  67. isLongPolling:false
  68. }
  69. },
  70. watch:{
  71. type(){
  72. this.getPanoList()
  73. },
  74. '$route.name':{
  75. immediate:true,
  76. handler:function (newVal) {
  77. if (newVal!='information') {
  78. this.clearinter()
  79. }else{
  80. this.Longpolling()
  81. }
  82. }
  83. },
  84. isLongPolling:{
  85. immediate:true,
  86. handler:function (newVal) {
  87. if (!newVal) {
  88. this.clearinter()
  89. }else{
  90. this.Longpolling()
  91. }
  92. }
  93. }
  94. },
  95. mounted(){
  96. this.$bus.on('refresh',()=>{
  97. this.getPanoList()
  98. })
  99. this.getPanoList()
  100. },
  101. methods:{
  102. clearinter(){
  103. this.interval && clearInterval(this.interval)
  104. this.interval = null
  105. },
  106. Longpolling(){
  107. this.clearinter()
  108. this.interval = setInterval(() => {
  109. this.getPanoList(true)
  110. }, LONGPOLLINGTIME*1000);
  111. },
  112. uploadListSort(){
  113. let tmp = {}
  114. this.list.forEach((item,i)=>{
  115. tmp[item['id']] = i+1
  116. })
  117. setListSort(tmp)
  118. },
  119. del(item){
  120. this.$confirm({
  121. content: "是否删除?",
  122. ok: () => {
  123. delPano(item.id,()=>{
  124. this.$tips({ content: "删除成功",icon:'ok' });
  125. this.getPanoList()
  126. this.$bus.emit('undateAllVrList')
  127. this.$bus.emit('setInitScene')
  128. });
  129. }
  130. });
  131. },
  132. getPanoList(islongpolling=null){
  133. getPanoList({
  134. pageNum: 1,
  135. pageSize: 1000,
  136. searchKey: "",
  137. type: this.type,
  138. islongpolling
  139. },data=>{
  140. this.list = data.data.list
  141. this.isLongPolling = data.isCheck
  142. this.$store.commit("SetVrList", data.data.list);
  143. this.$bus.emit('undateAllVrList',islongpolling)
  144. this.$bus.emit('setInitScene',islongpolling)
  145. })
  146. },
  147. onFileChange(file) {
  148. let canUploadList = []
  149. for (let i = 0; i < file.files.length; i++) {
  150. let item = file.files[i];
  151. if (item.type.indexOf("jpeg")<=-1) {
  152. return this.$tips({content:'请上传jpg格式的全景图'})
  153. }
  154. canUploadList.push(item)
  155. }
  156. let p = []
  157. canUploadList.forEach(i => {
  158. let data = {}
  159. data['file'] = i
  160. let promise = getImgWH(i)
  161. p.push(promise)
  162. })
  163. Promise.all(p).then(result=>{
  164. let pp = []
  165. p.length>0&&result.forEach(data => {
  166. let {width,height}=data.WH
  167. if(width != 2*height){
  168. return this.$tips({content:'全景图片必须为2:1比例'})
  169. }
  170. let params = {}
  171. params['file'] = data.file
  172. let promise = new Promise((resolve, reject) => {
  173. uploadPano(params, this.type, response => {
  174. resolve(response);
  175. },(err)=>{
  176. reject(err)
  177. })
  178. })
  179. pp.push(promise)
  180. });
  181. pp.length>0&& Promise.all(pp).then(response=>{
  182. if (response.length>0) {
  183. $waiting.hide()
  184. this.$alert({content:'上传成功',icon:'ok'})
  185. this.getPanoList()
  186. }
  187. })
  188. })
  189. }
  190. },
  191. components:{
  192. draggable,
  193. Upload
  194. }
  195. }
  196. </script>
  197. <style lang="less" scoped>
  198. .tips{
  199. width: 100%;
  200. }
  201. .no-record{
  202. position: absolute;
  203. top: 50%;
  204. left: 50%;
  205. transform: translate(-50%,-50%);
  206. text-align: center;
  207. color: rgba(255, 255, 255, 0.5);
  208. >i{
  209. font-size: 30px;
  210. }
  211. }
  212. .pano-label{
  213. .pano-con{
  214. padding: 0;
  215. height: calc(100vh - 250px);
  216. >ul{
  217. max-height: calc(100% - 10px);
  218. overflow-y: auto;
  219. >li{
  220. }
  221. }
  222. .add-btn{
  223. z-index: 20;
  224. .ui-button{
  225. margin: 0 5px;
  226. }
  227. }
  228. }
  229. }
  230. </style>