index.vue 4.6 KB

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