index.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <template>
  2. <el-form
  3. ref="form"
  4. :model="form"
  5. label-width="80px"
  6. @submit.stop.native="submit"
  7. >
  8. <el-form-item
  9. v-if="name"
  10. label="相册"
  11. >
  12. {{name}}
  13. </el-form-item>
  14. <el-form-item
  15. v-else
  16. label="相册"
  17. prop="photoAlbumId"
  18. :rules="[{required: true, message: '请选择相册'}]"
  19. >
  20. <el-select v-model="form.photoAlbumId" placeholder="请选择相册">
  21. <el-option v-for="item in photos" :key="item.id" :label="item.name" :value="item.id"></el-option>
  22. </el-select>
  23. </el-form-item>
  24. <el-form-item
  25. label="上传相册"
  26. >
  27. <el-upload
  28. action="/api-web/uploadFile"
  29. :on-preview="handlePictureCardPreview"
  30. :show-file-list="false"
  31. multiple
  32. accept=".png, .jpg, .jpeg, .gif"
  33. :on-success="successed"
  34. :on-remove="handleRemove">
  35. <el-button type="primary">上传图片</el-button>
  36. </el-upload>
  37. <div class="img-container">
  38. <div class="list" v-if="uploaded.length > 0">
  39. <div
  40. v-for="(item, index) in uploaded"
  41. :key="item.url"
  42. class="item"
  43. >
  44. <div class="ctrl-bar">
  45. <i class="el-icon-circle-close" @click="remove(index)"></i>
  46. </div>
  47. <el-image
  48. :src="item.url"
  49. :preview-src-list="uploaded.map(item => item.url)"
  50. class="img">
  51. </el-image>
  52. <el-input v-model="item.name" placeholder="请输入图片名称" clearable size="mini"/>
  53. </div>
  54. </div>
  55. <empty v-else/>
  56. </div>
  57. </el-form-item>
  58. <div class="dialog-footer">
  59. <el-button @click="$emit('close')">取 消</el-button>
  60. <el-button
  61. type="primary"
  62. native-type="submit"
  63. >确 定</el-button>
  64. </div>
  65. <el-dialog :visible.sync="dialogVisible">
  66. <img width="100%" :src="dialogImageUrl" alt="">
  67. </el-dialog>
  68. </el-form>
  69. </template>
  70. <script>
  71. import { photoAdd, photoAlbumQueryPage } from '../api'
  72. export default {
  73. props: {
  74. name: String
  75. },
  76. data() {
  77. return {
  78. fileList: [],
  79. dialogImageUrl: '',
  80. dialogVisible: false,
  81. form: {
  82. photoAlbumId: ''
  83. },
  84. uploaded: [],
  85. photos: []
  86. }
  87. },
  88. mounted() {
  89. this.FetchList()
  90. },
  91. methods: {
  92. handleChange(file, fileList) {
  93. this.fileList = fileList.slice(-3);
  94. },
  95. successed(response, file, fileList) {
  96. if (response.code === 200) {
  97. this.uploaded.push({
  98. url: response.data.url,
  99. name: file.name.split('.').shift(),
  100. clientShow: 'YES',
  101. })
  102. } else {
  103. this.$message.error(res.data?.message || res.msg || '上传失败')
  104. }
  105. console.log(response, file, fileList)
  106. },
  107. handleRemove(file, fileList) {
  108. console.log(file, fileList);
  109. },
  110. handlePictureCardPreview(file) {
  111. this.dialogImageUrl = file.url;
  112. this.dialogVisible = true;
  113. },
  114. async FetchList() {
  115. try {
  116. const res = await photoAlbumQueryPage({
  117. musicGroupId: this.$route.query.id,
  118. rows: 9999
  119. })
  120. this.photos = res.data.rows
  121. } catch (error) {}
  122. },
  123. async submit(evt) {
  124. evt.stopPropagation()
  125. evt.stopImmediatePropagation()
  126. evt.preventDefault()
  127. try {
  128. this.$refs.form.validate(async (valid) => {
  129. if (valid) {
  130. const phoths = this.uploaded.map(item => ({
  131. ...item,
  132. photoAlbumId: this.form.photoAlbumId || this.$route.params.id,
  133. }))
  134. await photoAdd(phoths)
  135. this.$message.success('添加成功')
  136. this.$emit('close')
  137. this.$emit('submited')
  138. }
  139. })
  140. } catch (error) {}
  141. },
  142. remove(index) {
  143. this.uploaded.splice(index, 1)
  144. }
  145. }
  146. }
  147. </script>
  148. <style lang="less" scoped>
  149. .dialog-footer{
  150. text-align: right;
  151. }
  152. .img-container{
  153. margin: 10px auto;
  154. }
  155. .item{
  156. width: 150px;
  157. margin-top: 10px;
  158. margin-right: 10px;
  159. display: inline-block;
  160. position: relative;
  161. }
  162. .img{
  163. width: 150px;
  164. height: 150px;
  165. }
  166. .ctrl-bar{
  167. background-color: rgba(0, 0, 0, .45);
  168. height: 30px;
  169. position: absolute;
  170. top: 0;
  171. width: 100%;
  172. z-index: 1;
  173. display: flex;
  174. justify-content: flex-end;
  175. align-items: center;
  176. padding: 0 15px;
  177. i{
  178. color: #fff;
  179. cursor: pointer;
  180. }
  181. }
  182. </style>