index.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <template>
  2. <el-drawer
  3. v-model="drawer"
  4. title="媒体库"
  5. size="650px"
  6. >
  7. <warning-bar
  8. title="点击“文件名/备注”可以编辑文件名或者备注内容。"
  9. />
  10. <div class="gva-btn-list">
  11. <upload-common
  12. v-model:imageCommon="imageCommon"
  13. class="upload-btn-media-library"
  14. @on-success="open"
  15. />
  16. <upload-image
  17. v-model:imageUrl="imageUrl"
  18. :file-size="512"
  19. :max-w-h="1080"
  20. class="upload-btn-media-library"
  21. @on-success="open"
  22. />
  23. <el-form
  24. ref="searchForm"
  25. :inline="true"
  26. :model="search"
  27. >
  28. <el-form-item label="">
  29. <el-input
  30. v-model="search.keyword"
  31. class="keyword"
  32. placeholder="请输入文件名或备注"
  33. />
  34. </el-form-item>
  35. <el-form-item>
  36. <el-button
  37. type="primary"
  38. icon="search"
  39. @click="open"
  40. >查询</el-button>
  41. </el-form-item>
  42. </el-form>
  43. </div>
  44. <div class="media">
  45. <div
  46. v-for="(item,key) in picList"
  47. :key="key"
  48. class="media-box"
  49. >
  50. <div class="header-img-box-list">
  51. <el-image
  52. :key="key"
  53. :src="getUrl(item.url)"
  54. @click="chooseImg(item.url,target,targetKey)"
  55. >
  56. <template #error>
  57. <div class="header-img-box-list">
  58. <el-icon>
  59. <picture />
  60. </el-icon>
  61. </div>
  62. </template>
  63. </el-image>
  64. </div>
  65. <div
  66. class="img-title"
  67. @click="editFileNameFunc(item)"
  68. >{{ item.name }}</div>
  69. </div>
  70. </div>
  71. <el-pagination
  72. :current-page="page"
  73. :page-size="pageSize"
  74. :total="total"
  75. :style="{'justify-content':'center'}"
  76. layout="total, prev, pager, next, jumper"
  77. @current-change="handleCurrentChange"
  78. @size-change="handleSizeChange"
  79. />
  80. </el-drawer>
  81. </template>
  82. <script setup>
  83. import { getUrl } from '@/utils/image'
  84. import { ref } from 'vue'
  85. import { getFileList, editFileName } from '@/api/fileUploadAndDownload'
  86. import UploadImage from '@/components/upload/image.vue'
  87. import UploadCommon from '@/components/upload/common.vue'
  88. import { ElMessage, ElMessageBox } from 'element-plus'
  89. import WarningBar from '@/components/warningBar/warningBar.vue'
  90. const imageUrl = ref('')
  91. const imageCommon = ref('')
  92. const search = ref({})
  93. const page = ref(1)
  94. const total = ref(0)
  95. const pageSize = ref(20)
  96. // 分页
  97. const handleSizeChange = (val) => {
  98. pageSize.value = val
  99. open()
  100. }
  101. const handleCurrentChange = (val) => {
  102. page.value = val
  103. open()
  104. }
  105. const emit = defineEmits(['enterImg'])
  106. defineProps({
  107. target: {
  108. type: Object,
  109. default: null,
  110. },
  111. targetKey: {
  112. type: String,
  113. default: '',
  114. },
  115. })
  116. const drawer = ref(false)
  117. const picList = ref([])
  118. const chooseImg = (url, target, targetKey) => {
  119. if (target && targetKey) {
  120. target[targetKey] = url
  121. }
  122. emit('enterImg', url)
  123. drawer.value = false
  124. }
  125. const open = async() => {
  126. const res = await getFileList({ page: page.value, pageSize: pageSize.value, ...search.value })
  127. if (res.code === 0) {
  128. picList.value = res.data.list
  129. total.value = res.data.total
  130. page.value = res.data.page
  131. pageSize.value = res.data.pageSize
  132. drawer.value = true
  133. }
  134. }
  135. /**
  136. * 编辑文件名或者备注
  137. * @param row
  138. * @returns {Promise<void>}
  139. */
  140. const editFileNameFunc = async(row) => {
  141. ElMessageBox.prompt('请输入文件名或者备注', '编辑', {
  142. confirmButtonText: '确定',
  143. cancelButtonText: '取消',
  144. inputPattern: /\S/,
  145. inputErrorMessage: '不能为空',
  146. inputValue: row.name
  147. }).then(async({ value }) => {
  148. row.name = value
  149. // console.log(row)
  150. const res = await editFileName(row)
  151. if (res.code === 0) {
  152. ElMessage({
  153. type: 'success',
  154. message: '编辑成功!',
  155. })
  156. open()
  157. }
  158. }).catch(() => {
  159. ElMessage({
  160. type: 'info',
  161. message: '取消修改'
  162. })
  163. })
  164. }
  165. defineExpose({ open })
  166. </script>
  167. <style lang="scss">
  168. .upload-btn-media-library {
  169. margin-left: 20px;
  170. }
  171. .media {
  172. display: flex;
  173. flex-wrap: wrap;
  174. .media-box {
  175. width: 120px;
  176. margin-left: 20px;
  177. .img-title {
  178. white-space: nowrap;
  179. overflow: hidden;
  180. text-overflow: ellipsis;
  181. line-height: 36px;
  182. text-align: center;
  183. cursor: pointer;
  184. }
  185. .header-img-box-list {
  186. width: 120px;
  187. height: 120px;
  188. border: 1px dashed #ccc;
  189. border-radius: 8px;
  190. text-align: center;
  191. line-height: 120px;
  192. cursor: pointer;
  193. overflow: hidden;
  194. .el-image__inner {
  195. max-width: 120px;
  196. max-height: 120px;
  197. vertical-align: middle;
  198. width: unset;
  199. height: unset;
  200. }
  201. }
  202. }
  203. }
  204. </style>