PictureLibrary.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. <script setup>
  2. import { ref, reactive } from 'vue'
  3. import {InfoFilled,Search} from '@element-plus/icons-vue'
  4. import {apiImgSource,apiMediaCommon} from '@/api/media'
  5. import {cloneDeep} from 'lodash'
  6. const tableQuery = reactive({
  7. keyWord:'',
  8. labels:'',
  9. currentPage:1,
  10. pageSize:10,
  11. totals:0,
  12. sortType:''
  13. })
  14. const tableColumns = [
  15. {label:'图片预览',key:'SrcUrl',},
  16. {label:'图片名称',key:'ImgName',},
  17. {label:'添加时间',key:'CreatedTime',width:250,sortable:true},
  18. {label:'关联标签',key:'PermissionName',},
  19. ]
  20. let picUploadShow = ref(false)
  21. let curPicData = ref({})
  22. function handlePicUploadShow(data={}){
  23. curPicData.value = cloneDeep(data)
  24. formRef.value?.clearValidate()
  25. picUploadShow.value = true
  26. }
  27. function handleEdit(data){
  28. handlePicUploadShow(data)
  29. }
  30. function handleDelete(data){
  31. ElMessageBox.confirm(
  32. '删除后不可恢复,是否确认删除该图片?',
  33. '提示',
  34. {
  35. confirmButtonText: '确认',
  36. cancelButtonText: '取消',
  37. type: 'warning',
  38. }
  39. )
  40. .then(() => {
  41. apiImgSource.deleteImgSource({
  42. ImageId:data.Id
  43. }).then(res=>{
  44. if(res.Ret!==200) return
  45. ElMessage.success('删除成功')
  46. getTableData()
  47. })
  48. }).catch(() => {})
  49. }
  50. const labelOptions = ref([])
  51. function getLabelOptions(){
  52. apiMediaCommon.getPermissionList().then(res=>{
  53. if(res.Ret!==200) return
  54. labelOptions.value = res.Data.List||[]
  55. })
  56. }
  57. getLabelOptions()
  58. const tableLoading = ref(false)
  59. const tableData = ref([])
  60. function getTableData(){
  61. tableLoading.value = true
  62. apiImgSource.getImgSourceList({
  63. KeyWord:tableQuery.keyWord,
  64. PermissionIds:Array.isArray(tableQuery.labels)?tableQuery.labels.join(','):'',
  65. SortType:tableQuery.sortType,
  66. CurrentIndex:tableQuery.currentPage,
  67. PageSize:tableQuery.pageSize
  68. }).then(res=>{
  69. tableLoading.value = false
  70. if(res.Ret!==200) return
  71. tableData.value = res.Data.List||[]
  72. tableQuery.totals = res.Data.Paging.Totals||0
  73. })
  74. }
  75. getTableData()
  76. function handlePageChange(page){
  77. tableQuery.currentPage = page
  78. getTableData()
  79. }
  80. function handleUploadImg(file){
  81. //图片大小和格式限制
  82. const {size,type} = file.file
  83. const sizeLimit = 500*1024
  84. if(!['image/png','image/jpeg'].includes(type)){
  85. ElMessage.warning('仅支持png、jpg格式的图片')
  86. return
  87. }
  88. if(size>sizeLimit){
  89. ElMessage.warning('资源库图片不能超过500kb')
  90. return
  91. }
  92. let form = new FormData();
  93. form.append('File',file.file);
  94. apiImgSource.uploadImgFile(form).then(res=>{
  95. if(res.Ret!==200) return
  96. curPicData.value.SrcUrl = res.Data?.Url||''
  97. })
  98. }
  99. const rules = {
  100. SrcUrl:[{required:true,message:'请上传图片'}],
  101. ImgName:[{required:true,message:'请输入图片名称'}],
  102. PermissionId:[{required:true,message:'请选择关联标签'}],
  103. }
  104. const formRef = ref(null)
  105. async function handleSavePic(){
  106. try{
  107. await formRef.value?.validate()
  108. }catch(e){ return }
  109. const params = {
  110. ImageName:curPicData.value.ImgName,
  111. SrcUrl:curPicData.value.SrcUrl,
  112. PermissionId:curPicData.value.PermissionId
  113. }
  114. const res = curPicData.value.Id
  115. ? await apiImgSource.editImgSource({...params,ImageId:curPicData.value.Id})
  116. :await apiImgSource.addImgSource(params)
  117. if(res.Ret!==200) return
  118. ElMessage.success(`${curPicData.value.Id?'编辑':'添加'}成功`)
  119. getTableData()
  120. picUploadShow.value = false
  121. }
  122. function handleSortChange({order,prop}){
  123. tableQuery.sortType = order==='ascending'?'asc':'desc'
  124. getTableData()
  125. }
  126. </script>
  127. <template>
  128. <div class="picture-libraray-wrap">
  129. <div class="top-box">
  130. <el-button type="primary" @click="handlePicUploadShow({})" v-permission="'source:uploadImage'">上传图片</el-button>
  131. <el-tooltip
  132. class="box-item"
  133. effect="dark"
  134. content="应用于小程序报告列表页,取产品关联的第一个标签展示"
  135. placement="top-start"
  136. >
  137. <el-icon style="margin-left: 5px;"><InfoFilled /></el-icon>
  138. </el-tooltip>
  139. <el-cascader v-model="tableQuery.labels" @change="handlePageChange(1)" placeholder="标签"
  140. :options="labelOptions"
  141. collapse-tags
  142. collapse-tags-tooltip
  143. clearable
  144. :props="{
  145. value:'id',
  146. label:'name',
  147. emitPath:false,
  148. multiple:true
  149. }"
  150. ></el-cascader>
  151. <el-input style="width:426px;" :prefix-icon="Search" clearable
  152. placeholder="请输入图片名称"
  153. v-model="tableQuery.keyWord"
  154. @input="handlePageChange(1)"
  155. />
  156. </div>
  157. <div class="table-box">
  158. <el-table stripe border :data="tableData" element-loading-text="数据加载中..." v-loading="tableLoading" @sort-change="handleSortChange">
  159. <el-table-column
  160. align="center"
  161. v-for="column in tableColumns" :key="column.key"
  162. :prop="column.key" :label="column.label" :sortable="column.sortable" :width="column.width">
  163. <template #default="{row}">
  164. <div v-if="column.key==='SrcUrl'" style="color:#086CE0;cursor: pointer;">
  165. <el-image
  166. v-if="row[column.key]"
  167. fit="cover"
  168. :src="row[column.key]||''"
  169. :preview-src-list="[row[column.key]||'']"
  170. style="display: inline-block;width:60px;height: 60px;" preview-teleported/>
  171. <span v-else style="display: inline-block;width:60px;height: 60px;line-height: 60px;">-</span>
  172. </div>
  173. <span v-else>{{ row[column.key]||'-' }}</span>
  174. </template>
  175. </el-table-column>
  176. <el-table-column label="操作">
  177. <template #default="{row}">
  178. <el-link type="primary" :underline="false" @click="handleEdit(row)" style="margin-right: 20px;" v-permission="'source:edit'">编辑</el-link>
  179. <el-link type="danger" :underline="false" @click="handleDelete(row)" v-permission="'source:delete'">删除</el-link>
  180. </template>
  181. </el-table-column>
  182. </el-table>
  183. <el-pagination
  184. background
  185. layout="total,prev,pager,next,jumper"
  186. :current-page="tableQuery.currentPage"
  187. :page-size="tableQuery.pageSize"
  188. :total="tableQuery.totals"
  189. @current-change="handlePageChange"
  190. style=" justify-content: flex-end;border:1px solid #ebeef5;border-top: none;"
  191. />
  192. </div>
  193. </div>
  194. <el-dialog v-model="picUploadShow" :title="curPicData.Id?'编辑图片':'上传图片'" width="646px" draggable>
  195. <div class="content-wrap">
  196. <el-form label-width="95px" label-position="left" :model="curPicData" :rules="rules" ref="formRef">
  197. <el-form-item label="照片" prop="SrcUrl">
  198. <ImageUpload
  199. :imgUrl="curPicData.SrcUrl"
  200. uploadHint="支持jpg、jpeg、png等格式,建议上传宽高比例为3:4的图片"
  201. width="90px"
  202. height="120px"
  203. @upload="handleUploadImg"
  204. @remove="curPicData.SrcUrl=''"
  205. ></ImageUpload>
  206. </el-form-item>
  207. <el-form-item label="图片名称" prop="ImgName">
  208. <el-input v-model="curPicData.ImgName" placeholder="请输入图片名称"></el-input>
  209. </el-form-item>
  210. <el-form-item label="关联标签" prop="PermissionId">
  211. <el-cascader v-model="curPicData.PermissionId" placeholder="请选择关联品种" style="width: 100%;"
  212. :options="labelOptions"
  213. :props="{
  214. value:'id',
  215. label:'name',
  216. emitPath:false,
  217. multiple:false
  218. }"
  219. ></el-cascader>
  220. </el-form-item>
  221. </el-form>
  222. </div>
  223. <template #footer>
  224. <div class="footer-wrap">
  225. <el-button type="primary" plain size="large" @click="picUploadShow = false">取消</el-button>
  226. <el-button type="primary" size="large" @click="handleSavePic">保存</el-button>
  227. </div>
  228. </template>
  229. </el-dialog>
  230. </template>
  231. <style scoped lang="scss">
  232. .picture-libraray-wrap{
  233. .top-box{
  234. display: flex;
  235. justify-content: space-between;
  236. align-items: center;
  237. :deep(.el-cascader){
  238. margin-left: auto;
  239. margin-right: 20px;
  240. }
  241. }
  242. .table-box{
  243. margin-top: 25px;
  244. }
  245. }
  246. </style>