index.vue 4.7 KB

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