reghao 6 месяцев назад
Родитель
Сommit
836878ef0a

+ 9 - 9
src/api/disk.js

@@ -9,7 +9,7 @@ const diskApi = {
   diskFileApi: '/api/content/disk/file/list',
   filePreviewApi: '/api/content/disk/file/preview',
   createAlbumApi: '/api/content/disk/album/create',
-  addToAlbumApi: '/api/content/disk/album/add',
+  editAlbumApi: '/api/content/disk/album/edit',
   getAlbumKeyValueApi: '/api/content/disk/album/kv',
   getAlbumListApi: '/api/content/disk/album/list',
   getAlbumImageApi: '/api/content/disk/album/image',
@@ -54,28 +54,28 @@ export function getDiskChannelInfo() {
   return post(diskApi.getDiskChannelInfoApi)
 }
 
-export function createAlbum(data) {
-  return post(diskApi.createAlbumApi, data)
+export function createAlbum(payload) {
+  return post(diskApi.createAlbumApi, payload)
 }
 
-export function addToAlbum(data) {
-  return post(diskApi.addToAlbumApi, data)
+export function editAlbum(payload) {
+  return post(diskApi.editAlbumApi, payload)
 }
 
 export function getAlbumKeyValues() {
   return get(diskApi.getAlbumKeyValueApi)
 }
 
-export function getAlbumList() {
-  return get(diskApi.getAlbumListApi)
+export function getAlbumList(pn) {
+  return get(diskApi.getAlbumListApi + '?pn=' + pn)
 }
 
 export function getAlbumImage(pn) {
   return get(diskApi.getAlbumImageApi + '?pn=' + pn)
 }
 
-export function getAlbumDetail(albumId) {
-  return get(diskApi.getAlbumDetailApi + '/' + albumId)
+export function getAlbumDetail(albumId, pn) {
+  return get(diskApi.getAlbumDetailApi + '/' + albumId + '?pn=' + pn)
 }
 
 export function getCamKeyValue() {

+ 10 - 3
src/router/disk.js

@@ -1,6 +1,7 @@
 const Disk = () => import('views/disk/Disk')
 const DiskAlbumIndex = () => import('views/disk/DiskAlbumIndex')
-const DiskAlbum = () => import('views/disk/DiskAlbum')
+const DiskAlbumView = () => import('views/disk/DiskAlbumView')
+const DiskAlbumEdit = () => import('views/disk/DiskAlbumEdit')
 const DiskFile = () => import('views/disk/DiskFile')
 const DiskShare = () => import('views/disk/DiskShare')
 const DiskRecycle = () => import('views/disk/DiskRecycle')
@@ -24,10 +25,16 @@ export default {
       component: DiskAlbumIndex,
       meta: { needAuth: true }
     },
+    {
+      path: '/disk/album/edit/:albumId',
+      name: 'DiskAlbumEdit',
+      component: DiskAlbumEdit,
+      meta: { needAuth: true }
+    },
     {
       path: '/disk/album/:albumId',
-      name: 'DiskAlbum',
-      component: DiskAlbum,
+      name: 'DiskAlbumView',
+      component: DiskAlbumView,
       meta: { needAuth: true }
     },
     {

+ 344 - 0
src/views/disk/DiskAlbumEdit.vue

@@ -0,0 +1,344 @@
+<template>
+  <div>
+    <el-row style="padding: 5px">
+      <span style="color: red">
+        点击图片可选中要删除的图片
+      </span>
+      <span style="color: #0a84ff">
+        拖拽图片可改变图片显示的顺序
+      </span>
+    </el-row>
+    <el-row style="padding: 5px">
+      <el-button
+        style="float: left; padding: 5px"
+        icon="el-icon-plus"
+        type="text"
+        @click="onAddImage"
+      >添加照片</el-button>
+      <el-button
+        v-if="dragged"
+        style="float: left; padding: 5px"
+        icon="el-icon-edit"
+        type="text"
+        @click="onSaveDragResult"
+      >保存拖拽</el-button>
+      <el-button
+        v-if="deleteList.length !== 0"
+        style="float: left; padding: 5px"
+        icon="el-icon-delete"
+        type="text"
+        @click="onDeleteImage"
+      >删除图片</el-button>
+    </el-row>
+    <el-row v-if="dataList.length !== 0">
+      <draggable
+        v-model="dataList"
+        :scroll="true"
+        animation="500"
+        @start="onDragStart"
+        @end="onDragEnd"
+      >
+        <el-col
+          v-for="(album, index) in dataList"
+          :key="index"
+          :md="6"
+          :sm="12"
+          :xs="12"
+          style="padding: 5px"
+        >
+          <div :class="{ selected: checkDeleteElement(album.fileId) }" @click="changeDeleteList(album.fileId)">
+            <el-image
+              lazy
+              fit="cover"
+              class="coverImg"
+              :src="album.url"
+            />
+          </div>
+        </el-col>
+      </draggable>
+    </el-row>
+
+    <el-dialog
+      title="添加图片"
+      :visible.sync="showAddImageDialog"
+      width="100%"
+      center
+    >
+      <div>
+        <el-row v-if="imageList.length !== 0">
+          <el-col
+            v-for="(album, index) in imageList"
+            :key="index"
+            :md="6"
+            :sm="12"
+            :xs="12"
+            style="padding: 5px"
+          >
+            <div :class="{ selected: checkAddElement(album.fileId) }" @click="changeAddList(album.fileId)">
+              <el-image
+                lazy
+                fit="cover"
+                class="coverImg180"
+                :src="album.url"
+              />
+            </div>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-pagination
+            :small="screenWidth <= 768"
+            hide-on-single-page
+            layout="prev, pager, next"
+            :page-size="pageSize"
+            :current-page="currentPage"
+            :total="totalSize"
+            @current-change="handleCurrentChange"
+            @prev-click="handleCurrentChange"
+            @next-click="handleCurrentChange"
+          />
+          <el-button
+            type="primary"
+            plain
+            size="small"
+            icon="el-icon-plus"
+            style="margin-left: 10px"
+            @click="onAddSelectedImage"
+          >
+            添加选择的图片
+          </el-button>
+        </el-row>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import draggable from 'vuedraggable'
+import { editAlbum, createAlbum, getAlbumDetail, getAlbumImage } from '@/api/disk'
+
+export default {
+  name: 'DiskAlbumEdit',
+  components: { draggable },
+  data() {
+    return {
+      albumId: null,
+      // 屏幕宽度, 为了控制分页条的大小
+      screenWidth: document.body.clientWidth,
+      currentPage: 1,
+      pageSize: 12,
+      totalSize: 0,
+      dataList: [],
+      // ****************************************************************************************************************
+      deleteList: [],
+      // ****************************************************************************************************************
+      dragged: false,
+      // ****************************************************************************************************************
+      showAddImageDialog: false,
+      imageList: [],
+      addList: [],
+      // ****************************************************************************************************************
+      showEditAlbumDialog: false,
+      albumImageList: [],
+      // ****************************************************************************************************************
+      showCreateAlbumDialog: false,
+      createAlbumForm: {
+        albumName: null
+      }
+    }
+  },
+  mounted() {
+    // 当窗口宽度改变时获取屏幕宽度
+    window.onresize = () => {
+      return () => {
+        window.screenWidth = document.body.clientWidth
+        this.screenWidth = window.screenWidth
+      }
+    }
+  },
+  created() {
+    const albumId = this.$route.params.albumId
+    if (!albumId) {
+      return
+    }
+
+    this.albumId = albumId
+    document.title = '管理相册'
+    this.getData()
+  },
+  methods: {
+    handleCurrentChange(pageNumber) {
+      this.currentPage = pageNumber
+      this.dataList = []
+      this.getData()
+      // 回到顶部
+      scrollTo(0, 0)
+    },
+    getData() {
+      getAlbumDetail(this.albumId, this.currentPage).then(resp => {
+        if (resp.code === 0) {
+          const respData = resp.data
+          document.title = '管理相册 ' + respData.albumName
+
+          this.dataList = respData.diskFileList
+        } else {
+          this.$message.error(resp.msg)
+        }
+      }).catch(error => {
+        this.$message.error(error.message)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    onCreateAlbum() {
+      this.showCreateAlbumDialog = true
+    },
+    createAlbum() {
+      this.showCreateAlbumDialog = false
+      createAlbum(this.createAlbumForm).then(resp => {
+        this.$message.info(resp.msg)
+      })
+    },
+    getAlbum(albumId) {
+      const path = '/disk/album/' + albumId
+      console.log(path)
+      this.$router.push({
+        path: path
+      })
+      this.$router.go(0)
+    },
+    onEditAlbum() {
+      this.showEditAlbumDialog = true
+      getAlbumImage(1).then(resp => {
+        if (resp.code === 0) {
+          this.albumImageList = resp.data.list
+        }
+      })
+    },
+    onEditSubmit() {
+      this.showEditAlbumDialog = false
+    },
+    onAddImage() {
+      this.showAddImageDialog = true
+      getAlbumImage(this.currentPage).then(resp => {
+        if (resp.code === 0) {
+          const respData = resp.data
+          this.imageList = respData.list
+          this.totalSize = respData.totalSize
+        }
+      })
+    },
+    onAddSelectedImage() {
+      this.showAddImageDialog = false
+      if (this.albumId === 0) {
+        this.$message.error('albumId error')
+        return
+      }
+
+      const jsonData = {}
+      jsonData.albumId = this.albumId
+      jsonData.operation = 1
+      jsonData.fileIds = this.addList
+      this.editAlbumWrapper(jsonData)
+    },
+    editAlbumWrapper(payload) {
+      editAlbum(payload).then(resp => {
+        if (resp.code === 0) {
+          this.$router.go(0)
+        } else {
+          this.$message.info(resp.msg)
+        }
+      }).catch(error => {
+        this.$message.error(error.message)
+      })
+    },
+    onDragStart() {
+      this.$message.info('drag start')
+    },
+    onDragEnd() {
+      this.$message.info('drag end')
+      this.dragged = true
+    },
+    onSaveDragResult() {
+      const jsonData = {}
+      jsonData.albumId = this.albumId
+      jsonData.operation = 2
+      jsonData.fileIds = this.dataList
+      this.editAlbumWrapper(jsonData)
+    },
+    onDeleteImage() {
+      this.$confirm('确定要删除选中的 ' + this.deleteList.length + ' 张图片?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.$message.info('handleDelete')
+        const jsonData = {}
+        jsonData.albumId = this.albumId
+        jsonData.operation = 3
+        jsonData.fileIds = this.deleteList
+        this.editAlbumWrapper(jsonData)
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '已取消'
+        })
+      })
+    },
+    changeDeleteList(val) {
+      var result = this.deleteList.some(ele => ele === val)
+      if (!result) {
+        this.deleteList.push(val)
+      } else {
+        this.deleteList = this.deleteList.filter(function(ele) {
+          return ele !== val
+        })
+      }
+    },
+    checkDeleteElement(val) {
+      return this.deleteList.some(ele => ele === val)
+    },
+    changeAddList(val) {
+      var result = this.addList.some(ele => ele === val)
+      if (!result) {
+        this.addList.push(val)
+      } else {
+        this.addList = this.addList.filter(function(ele) {
+          return ele !== val
+        })
+      }
+      console.log(this.addList)
+    },
+    checkAddElement(val) {
+      return this.addList.some(ele => ele === val)
+    }
+  }
+}
+</script>
+
+<style scoped>
+/*处于手机屏幕时*/
+@media screen and (max-width: 768px){
+  .coverImg {
+    height: 120px !important;
+  }
+}
+
+.coverImg {
+  width: 100%;
+  height: 320px;
+  display: block;
+}
+
+.coverImg180 {
+  width: 100%;
+  height: 180px;
+  display: block;
+}
+
+.selected {
+  color: #4abe84;
+  box-shadow: 0 2px 7px 0 rgba(85, 110, 97, 0.35);
+  border-radius: 1px;
+  border: 3px solid rgba(74, 190, 132, 1);
+}
+</style>

+ 30 - 199
src/views/disk/DiskAlbumIndex.vue

@@ -1,26 +1,14 @@
 <template>
   <div>
-    <el-row>
-      <el-col
-        :md="6"
-        :sm="12"
-        :xs="12"
-        style="padding: 5px;"
-      >
-        <el-card :body-style="{ padding: '1px' }">
-          <div>
-            <el-image
-              lazy
-              fit="cover"
-              class="coverImg"
-              @click.native="onCreateAlbum"
-            />
-          </div>
-          <div style="padding: 14px">
-            <span style="color: black">创建相册</span>
-          </div>
-        </el-card>
-      </el-col>
+    <el-row style="padding: 5px">
+      <el-button
+        style="float: left; padding: 5px"
+        icon="el-icon-plus"
+        type="text"
+        @click="onCreateAlbum"
+      >创建相册</el-button>
+    </el-row>
+    <el-row style="padding: 5px">
       <el-col
         v-for="(album, index) in dataList"
         :key="index"
@@ -41,15 +29,23 @@
             </div>
           </router-link>
           <div style="padding: 14px">
-            <span style="color: black">{{ album.albumName }}</span>
-            <span style="color: black">
-              <i class="el-icon-picture-outline">{{ album.num }}</i>
-            </span>
-            <router-link style="text-decoration-line: none" target="_blank" :to="`/disk/album/${album.albumId}`">
-              <el-button style="float: right; padding: 5px" icon="el-icon-view" type="text" @click="true">查看</el-button>
-            </router-link>
-            <el-button style="float: right; padding: 5px" icon="el-icon-edit" type="text" @click="onEditAlbum">管理</el-button>
-            <el-button style="float: right; padding: 5px" icon="el-icon-plus" type="text" @click="onAddImages(album.albumId)">添加</el-button>
+            <el-row style="padding: 1px">
+              <span style="color: black">
+                {{ album.albumName }}
+              </span>
+              <span style="color: black">
+                <i class="el-icon-picture-outline">{{ album.num }}</i>
+              </span>
+            </el-row>
+            <el-row style="padding: 1px">
+              <el-button style="float: right; padding: 5px;" icon="el-icon-share" type="text" @click="onShareAlbum">分享</el-button>
+              <router-link style="text-decoration-line: none" target="_blank" :to="`/disk/album/${album.albumId}`">
+                <el-button style="float: right; padding: 5px" icon="el-icon-view" type="text" @click="true">查看</el-button>
+              </router-link>
+              <router-link style="text-decoration-line: none" target="_blank" :to="`/disk/album/edit/${album.albumId}`">
+                <el-button style="float: right; padding: 5px" icon="el-icon-edit" type="text" @click="true">管理</el-button>
+              </router-link>
+            </el-row>
           </div>
         </el-card>
       </el-col>
@@ -94,99 +90,14 @@
         </el-form>
       </div>
     </el-dialog>
-    <el-dialog
-      title="管理相册"
-      :visible.sync="showEditAlbumDialog"
-      width="100%"
-      center
-    >
-      <div>
-        <el-row v-if="albumImageList.length !== 0">
-          <draggable
-            v-model="dataList"
-            :scroll="true"
-            animation="500"
-            @start="onDragStart"
-            @end="onDragEnd"
-          >
-            <el-col
-              v-for="(album, index) in albumImageList"
-              :key="index"
-              :md="6"
-              :sm="12"
-              :xs="12"
-              style="padding: 5px"
-            >
-              <el-image
-                lazy
-                fit="cover"
-                class="coverImg"
-                :src="album.url"
-                @click="showImages(index)"
-              />
-            </el-col>
-          </draggable>
-          <el-button
-            type="primary"
-            plain
-            size="small"
-            icon="el-icon-plus"
-            style="margin-left: 10px"
-            @click="onEditSubmit"
-          >
-            确定调整
-          </el-button>
-        </el-row>
-      </div>
-    </el-dialog>
-    <el-dialog
-      title="添加图片"
-      :visible.sync="showAddImagesDialog"
-      width="100%"
-      center
-    >
-      <div>
-        <el-row v-if="imageList.length !== 0">
-          <el-col
-            v-for="(album, index) in imageList"
-            :key="index"
-            :md="6"
-            :sm="12"
-            :xs="12"
-            style="padding: 5px"
-          >
-            <div :class="{ selected: checkElement(album.fileId) }" @click="changeList(album.fileId)">
-              <el-image
-                lazy
-                fit="cover"
-                class="coverImg"
-                :src="album.url"
-              />
-            </div>
-          </el-col>
-          <el-button
-            type="primary"
-            plain
-            size="small"
-            icon="el-icon-plus"
-            style="margin-left: 10px"
-            @click="onAddSelectedImages"
-          >
-            添加选择的图片到相册
-          </el-button>
-        </el-row>
-      </div>
-    </el-dialog>
   </div>
 </template>
 
 <script>
-import draggable from 'vuedraggable'
-import { addToAlbum, createAlbum, getAlbumImage, getAlbumList } from '@/api/disk'
+import { createAlbum, getAlbumList } from '@/api/disk'
 
 export default {
   name: 'DiskAlbumIndex',
-  components: { draggable },
   data() {
     return {
       // 屏幕宽度, 为了控制分页条的大小
@@ -195,16 +106,6 @@ export default {
       pageSize: 12,
       totalSize: 0,
       dataList: [],
-      albumId: null,
-      // ****************************************************************************************************************
-      showAddImagesDialog: false,
-      currentAlbumId: 0,
-      imageList: [],
-      selectedImages: [],
-      // ****************************************************************************************************************
-      showEditAlbumDialog: false,
-      albumImageList: [],
-      // selectedImages: [],
       // ****************************************************************************************************************
       showCreateAlbumDialog: false,
       createAlbumForm: {
@@ -234,7 +135,7 @@ export default {
       scrollTo(0, 0)
     },
     getData() {
-      getAlbumList().then(resp => {
+      getAlbumList(this.currentPage).then(resp => {
         if (resp.code === 0) {
           this.dataList = resp.data
         }
@@ -249,71 +150,8 @@ export default {
         this.$message.info(resp.msg)
       })
     },
-    getAlbum(albumId) {
-      const path = '/disk/album/' + albumId
-      console.log(path)
-      this.$router.push({
-        path: path
-      })
-      this.$router.go(0)
-    },
-    onEditAlbum() {
-      this.showEditAlbumDialog = true
-      getAlbumImage(1).then(resp => {
-        if (resp.code === 0) {
-          this.albumImageList = resp.data.list
-        }
-      })
-    },
-    onEditSubmit() {
-      this.showEditAlbumDialog = false
-      console.log(this.albumImageList)
-    },
-    onAddImages(albumId) {
-      this.currentAlbumId = albumId
-      this.showAddImagesDialog = true
-      getAlbumImage(1).then(resp => {
-        if (resp.code === 0) {
-          this.imageList = resp.data.list
-        }
-      })
-    },
-    onAddSelectedImages() {
-      this.showAddImagesDialog = false
-      if (this.currentAlbumId === 0) {
-        this.$message.error('albumId error')
-        return
-      }
-
-      const jsonData = {}
-      jsonData.albumId = this.currentAlbumId
-      jsonData.fileIds = this.selectedImages
-      addToAlbum(jsonData).then(resp => {
-        this.$message.info(resp.msg)
-      }).catch(error => {
-        this.$message.error(error.message)
-      })
-    },
-    onDragStart() {
-      this.$message.info('drag start')
-    },
-    onDragEnd() {
-      this.$message.info('drag end')
-      console.log(this.dataList)
-    },
-    changeList(val) {
-      var result = this.selectedImages.some(ele => ele === val)
-      if (!result) {
-        this.selectedImages.push(val)
-      } else {
-        this.selectedImages = this.selectedImages.filter(function(ele) {
-          return ele !== val
-        })
-      }
-      console.log(this.selectedImages)
-    },
-    checkElement(val) {
-      return this.selectedImages.some(ele => ele === val)
+    onShareAlbum() {
+      this.$message.info('share album')
     }
   }
 }
@@ -332,11 +170,4 @@ export default {
   height: 180px;
   display: block;
 }
-
-.selected {
-  color: #4abe84;
-  box-shadow: 0 2px 7px 0 rgba(85, 110, 97, 0.35);
-  border-radius: 1px;
-  border: 3px solid rgba(74, 190, 132, 1);
-}
 </style>

+ 27 - 18
src/views/disk/DiskAlbum.vue → src/views/disk/DiskAlbumView.vue

@@ -18,9 +18,16 @@
         />
       </el-col>
     </el-row>
-<!--    <el-row v-else>
+    <el-row v-if="!loading && dataList.length === 0">
       <span style="color: #007bff">这是一个空相册, 快去添加点照片到相册中吧!</span>
-    </el-row>-->
+    </el-row>
+    <el-row>
+      <div v-if="hasMore" style="display: flex; justify-content: center;">
+        <el-button link type="plain" icon="el-icon-bottom" @click="loadMore">
+          加载更多
+        </el-button>
+      </div>
+    </el-row>
   </div>
 </template>
 
@@ -29,37 +36,35 @@
 import { getAlbumDetail } from '@/api/disk'
 
 export default {
-  name: 'DiskAlbum',
+  name: 'DiskAlbumView',
   data() {
     return {
+      albumId: null,
+      currentPage: 1,
       dataList: [],
-      loading: false
-    }
-  },
-  mounted() {
-    // 当窗口宽度改变时获取屏幕宽度
-    window.onresize = () => {
-      return () => {
-        window.screenWidth = document.body.clientWidth
-        this.screenWidth = window.screenWidth
-      }
+      loading: false,
+      hasMore: false
     }
   },
   created() {
+    document.title = '查看相册'
     const albumId = this.$route.params.albumId
     if (albumId === undefined) {
       return
     }
-    this.getData(albumId)
+    this.albumId = albumId
+    this.getData()
   },
   methods: {
-    getData(albumId) {
+    getData() {
       this.loading = true
-      getAlbumDetail(albumId).then(resp => {
+      getAlbumDetail(this.albumId, this.currentPage).then(resp => {
         if (resp.code === 0) {
           const respData = resp.data
-          document.title = respData.albumName
-          this.dataList = respData.diskFileList
+          document.title = '查看相册 ' + respData.albumName
+
+          this.dataList = this.dataList.concat(respData.pageList.list)
+          this.hasMore = respData.pageList.hasNext
         } else {
           this.$message.error(resp.msg)
         }
@@ -69,6 +74,10 @@ export default {
         this.loading = false
       })
     },
+    loadMore() {
+      this.currentPage += 1
+      this.getData()
+    },
     showImages(index) {
       const imageUrls = []
       for (const item of this.dataList) {

+ 3 - 4
src/views/disk/DiskFile.vue

@@ -265,8 +265,7 @@
 <script>
 import {
   addFile,
-  addToAlbum,
-  createFolder,
+  createFolder, editAlbum,
   getAlbumKeyValues,
   getDiskChannelInfo,
   getDiskFile,
@@ -554,7 +553,6 @@ export default {
       this.selectedTable = val
     },
     addToAlbum() {
-      this.$message.info('addToAlbum')
       getAlbumKeyValues().then(resp => {
         if (resp.code === 0) {
           this.albumKeyValues = resp.data
@@ -570,8 +568,9 @@ export default {
       }
       const jsonData = {}
       jsonData.albumId = albumId
+      jsonData.operation = 1
       jsonData.fileIds = fileIds
-      addToAlbum(jsonData).then(resp => {
+      editAlbum(jsonData).then(resp => {
         this.$message.info(resp.msg)
       }).catch(error => {
         this.$message.error(error.message)