index.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  1. <template>
  2. <div class="big-screen-list-wrap">
  3. <div class="top-search-wrap">
  4. <el-input
  5. v-model="searchKey"
  6. class="bs-el-input"
  7. placeholder="请输入图片名称"
  8. prefix-icon="el-icon-search"
  9. clearable
  10. @clear="reSearch"
  11. @keyup.enter.native="reSearch"
  12. />
  13. <el-select
  14. v-model="extend"
  15. class="bs-el-select"
  16. popper-class="bs-el-select"
  17. placeholder="请选择图片格式"
  18. clearable
  19. @change="reSearch"
  20. >
  21. <el-option
  22. v-for="item in options"
  23. :key="item.value"
  24. :label="item.label"
  25. :value="item.value"
  26. />
  27. </el-select>
  28. <el-button
  29. size="small"
  30. style="margin-right: 20px"
  31. type="primary"
  32. @click="reSearch"
  33. >
  34. 搜索
  35. </el-button>
  36. <el-upload
  37. class="upload-demo"
  38. :action="upLoadUrl"
  39. :headers="headers"
  40. :data="{ module: code }"
  41. :on-success="uploadSuccess"
  42. :on-error="uploadError"
  43. multiple
  44. :file-list="fileList"
  45. :show-file-list="false"
  46. >
  47. <el-button
  48. size="small"
  49. type="primary"
  50. >
  51. 上传资源
  52. </el-button>
  53. </el-upload>
  54. </div>
  55. <div
  56. v-if="list.length !== 0"
  57. v-loading="loading"
  58. class="list-wrap bs-scrollbar"
  59. element-loading-text="加载中"
  60. :style="{
  61. display: gridComputed ? 'grid' : 'flex',
  62. justifyContent: gridComputed ? 'space-around' : 'flex-start'
  63. }"
  64. >
  65. <!-- <div v-if="list.length !== 0"> -->
  66. <div
  67. v-for="screen in list"
  68. :key="screen.id"
  69. class="big-screen-card-wrap"
  70. :style="{
  71. width: gridComputed ? 'auto' : '290px'
  72. }"
  73. >
  74. <div class="big-screen-card-inner">
  75. <div class="screen-card__hover">
  76. <div class="screen-card__hover-box">
  77. <div class="preview">
  78. <div
  79. class="screen-card__oper-label circle"
  80. @click="preview(screen)"
  81. >
  82. <span>预览</span>
  83. </div>
  84. <div
  85. class="circle"
  86. @click="downLoad(screen)"
  87. >
  88. <span>下载</span>
  89. </div>
  90. <div
  91. class="circle"
  92. @click="del(screen)"
  93. >
  94. <span>删除</span>
  95. </div>
  96. <div
  97. class="circle"
  98. @click="copy(screen)"
  99. >
  100. <span>链接</span>
  101. </div>
  102. </div>
  103. </div>
  104. </div>
  105. <div class="big-screen-card-img">
  106. <el-image
  107. :src="screen.url"
  108. fit="contain"
  109. style="width: 100%; height: 100%"
  110. >
  111. <div
  112. slot="placeholder"
  113. class="image-slot"
  114. >
  115. 加载中···
  116. </div>
  117. </el-image>
  118. </div>
  119. <div class="big-screen-bottom">
  120. <div
  121. class="left-bigscreen-title"
  122. :title="screen.originalName"
  123. >
  124. {{ screen.originalName }}
  125. </div>
  126. </div>
  127. </div>
  128. </div>
  129. </div>
  130. <div
  131. v-else
  132. class="empty"
  133. >
  134. 暂无数据
  135. </div>
  136. <div class="footer-pagination-wrap">
  137. <!-- <div class="footer-pagination-wrap-text">
  138. 总共 {{ totalCount }} 个项目
  139. </div> -->
  140. <div class="bs-pagination">
  141. <el-pagination
  142. class="bs-el-pagination"
  143. popper-class="bs-el-pagination"
  144. background
  145. layout="total, prev, pager, next, sizes"
  146. :page-size="size"
  147. prev-text="上一页"
  148. next-text="下一页"
  149. :total="totalCount"
  150. :page-sizes="[10, 20, 50, 100]"
  151. :current-page="current"
  152. @current-change="currentChangeHandle"
  153. @size-change="sizeChangeHandle"
  154. />
  155. </div>
  156. </div>
  157. <!-- 新增或编辑弹窗 -->
  158. <EditForm
  159. ref="EditForm"
  160. @refreshData="reSearch"
  161. />
  162. </div>
  163. </template>
  164. <script>
  165. import { get, post, download } from 'packages/js/utils/http'
  166. import { pageMixins } from 'packages/js/mixins/page'
  167. import EditForm from './EditForm.vue'
  168. export default {
  169. name: 'BigScreenList',
  170. mixins: [pageMixins],
  171. props: {
  172. type: {
  173. type: String,
  174. default: 'bigScreen' // bigScreen | template
  175. },
  176. catalogInfo: {
  177. type: Object,
  178. default: () => {}
  179. }
  180. },
  181. components: { EditForm },
  182. data () {
  183. return {
  184. upLoadUrl:
  185. window.BS_CONFIG?.httpConfigs?.baseURL + '/bigScreen/file/upload',
  186. searchKey: '',
  187. extend: '',
  188. options: [],
  189. list: [],
  190. fileUploadParam: {},
  191. headers: {
  192. ...window.BS_CONFIG?.httpConfigs?.headers
  193. },
  194. fileList: [],
  195. defaultImg: require('./images/defaultImg.png'),
  196. loading: false
  197. }
  198. },
  199. computed: {
  200. code () {
  201. return this.catalogInfo?.page?.code
  202. },
  203. gridComputed () {
  204. return this.list.length > 3
  205. }
  206. },
  207. watch: {
  208. code (value) {
  209. this.current = 1
  210. this.getDataList()
  211. }
  212. },
  213. mounted () {
  214. this.getOptions()
  215. this.getDataList()
  216. },
  217. methods: {
  218. uploadSuccess (response, file, fileList) {
  219. if (response.code === 200) {
  220. this.$message({
  221. type: 'success',
  222. message: '上传成功'
  223. })
  224. this.getDataList()
  225. } else {
  226. this.$message({
  227. type: 'error',
  228. message: response.msg
  229. })
  230. }
  231. },
  232. getOptions () {
  233. get('/bigScreen/file/getAllFileSuffix').then((data) => {
  234. this.options = []
  235. this.options.push({ label: '全部', value: '' })
  236. data.forEach((item) => this.options.push({ label: item, value: item }))
  237. })
  238. },
  239. getDataList () {
  240. this.loading = true
  241. get('/bigScreen/file', {
  242. module: this.catalogInfo.page.code,
  243. current: this.current,
  244. size: this.size,
  245. extension: this.extend,
  246. searchKey: this.searchKey
  247. })
  248. .then((data) => {
  249. this.list = data.list
  250. this.totalCount = data.totalCount
  251. })
  252. .finally(() => {
  253. this.loading = false
  254. })
  255. },
  256. preview (screen) {
  257. window.open(screen.url, '_blank')
  258. },
  259. downLoad (screen) {
  260. download(`/bigScreen/file/download/${screen.id}`)
  261. },
  262. del (screen) {
  263. this.$confirm('确定删除该资源?', '提示', {
  264. confirmButtonText: '确定',
  265. cancelButtonText: '取消',
  266. type: 'warning',
  267. customClass: 'bs-el-message-box'
  268. })
  269. .then(async () => {
  270. post(`/bigScreen/file/delete/${screen.id}`)
  271. .then(() => {
  272. this.$message({
  273. type: 'success',
  274. message: '删除成功'
  275. })
  276. this.getDataList()
  277. })
  278. .catch(() => {
  279. this.$message({
  280. type: 'error',
  281. message: '删除失败!'
  282. })
  283. })
  284. })
  285. .catch()
  286. },
  287. copy (screen) {
  288. this.$message.success('复制成功')
  289. const transfer = document.createElement('input')
  290. document.body.appendChild(transfer)
  291. transfer.value = screen.url // 这里表示想要复制的内容
  292. transfer.focus()
  293. transfer.select()
  294. if (document.execCommand('copy')) {
  295. document.execCommand('copy')
  296. }
  297. transfer.blur()
  298. transfer.style.display = 'none'
  299. }
  300. }
  301. }
  302. </script>
  303. <style lang="scss" scoped>
  304. @import '../assets/style/bsTheme.scss';
  305. .big-screen-list-wrap {
  306. position: relative;
  307. height: 100%;
  308. padding: 16px;
  309. color: #9ea9b2;
  310. margin:0 16px;
  311. background-color: var(--bs-background-2) !important;
  312. .top-search-wrap {
  313. display: flex;
  314. align-items: center;
  315. justify-content: flex-end;
  316. margin-bottom: 12px;
  317. .el-input {
  318. width: 200px;
  319. margin-right: 20px;
  320. /deep/.el-input__inner {
  321. background-color: var(--bs-background-1) !important;
  322. }
  323. }
  324. .el-select {
  325. margin-right: 20px;
  326. /deep/.el-input__inner {
  327. background-color: var(--bs-background-1) !important;
  328. }
  329. }
  330. }
  331. .list-wrap {
  332. /* display: grid; */
  333. overflow: auto;
  334. // 间隙自适应
  335. justify-content: space-around;
  336. max-height: calc(100vh - 304px);
  337. display: grid;
  338. grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  339. grid-gap: 15px;
  340. // /deep/ .el-loading-mask {
  341. // display: flex;
  342. // align-items: center;
  343. // justify-content: center;
  344. // height: calc(100vh - 260px) !important;
  345. // z-index: 999;
  346. // top: 50px;
  347. // }
  348. .big-screen-card-wrap {
  349. position: relative;
  350. height: 230px;
  351. cursor: pointer;
  352. &:hover {
  353. .screen-card__hover {
  354. height: 230px;
  355. }
  356. }
  357. .screen-card__hover {
  358. position: absolute;
  359. z-index: 999;
  360. top: 0;
  361. right: 0;
  362. left: 0;
  363. display: flex;
  364. overflow: hidden;
  365. align-items: center;
  366. justify-content: center;
  367. height: 0;
  368. transition: height 0.4s;
  369. background: #00000099;
  370. .screen-card__hover-box {
  371. position: absolute;
  372. width: 100%;
  373. height: 100%;
  374. background: #00000080;
  375. display: flex;
  376. overflow: hidden;
  377. align-items: center;
  378. justify-content: center;
  379. }
  380. .preview {
  381. display: flex;
  382. flex-direction: row;
  383. justify-content: space-evenly;
  384. width: 100%;
  385. cursor: pointer;
  386. color: var(--bs-el-color-primary);
  387. .circle {
  388. position: relative;
  389. display: flex;
  390. align-items: center;
  391. justify-content: center;
  392. width: 40px;
  393. height: 40px;
  394. border: 1px solid var(--bs-el-color-primary);
  395. border-radius: 50%;
  396. &:hover {
  397. color: #fff;
  398. background: var(--bs-el-color-primary);
  399. }
  400. span {
  401. font-size: 12px;
  402. }
  403. }
  404. }
  405. }
  406. .big-screen-card-inner {
  407. overflow: hidden;
  408. width: 100%;
  409. height: 100%;
  410. cursor: pointer;
  411. background-color: var(--bs-background-2);
  412. box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
  413. color: var(--bs-el-title);
  414. border: 1px solid var(--bs-background-1);
  415. &:hover {
  416. color: var(--bs-el-text);
  417. border: 1px solid var(--bs-el-color-primary);
  418. }
  419. .add-big-screen-card-text {
  420. color: var(--bs-el-color-primary);
  421. font-size: 24px;
  422. }
  423. .big-screen-card-img {
  424. width: 100%;
  425. height: 180px;
  426. img {
  427. width: 100%;
  428. height: 100%;
  429. object-fit: cover;
  430. }
  431. /deep/.image-slot {
  432. height: 100%;
  433. background-color: var(--bs-background-2);
  434. display: flex;
  435. align-items: center;
  436. justify-content: center;
  437. }
  438. /deep/.el-image__error {
  439. background-color: #1d1d1d;
  440. }
  441. }
  442. .big-screen-bottom {
  443. display: flex;
  444. align-items: center;
  445. flex-direction: row;
  446. justify-content: space-between;
  447. box-sizing: border-box;
  448. width: 100%;
  449. /*height: 26px;*/
  450. padding: 0 10px;
  451. height: calc(100% - 180px);
  452. color: var(--bs-el-title);
  453. background-color: var(--bs-background-2);
  454. .left-bigscreen-title {
  455. font-size: 14px;
  456. overflow: hidden;
  457. width: 100%;
  458. white-space: nowrap;
  459. text-overflow: ellipsis;
  460. }
  461. .right-bigscreen-time-title {
  462. font-size: 14px;
  463. overflow: hidden;
  464. width: 140px;
  465. white-space: nowrap;
  466. text-overflow: ellipsis;
  467. }
  468. }
  469. .big-screen-card-text {
  470. font-size: 14px;
  471. padding: 10px;
  472. text-align: center;
  473. color: #333;
  474. }
  475. }
  476. .big-screen-card-inner-add {
  477. display: flex;
  478. align-items: center;
  479. justify-content: center;
  480. }
  481. }
  482. }
  483. .el-loading-parent--relative {
  484. position: unset !important;
  485. }
  486. .footer-pagination-wrap {
  487. // position: absolute;
  488. // bottom: 10px;
  489. // display: flex;
  490. // align-items: center;
  491. // justify-content: flex-end;
  492. // width: 100%;
  493. position: absolute;
  494. bottom: 16px;
  495. right: 12px;
  496. // padding: 0 16px;
  497. }
  498. }
  499. .bs-pagination {
  500. ::v-deep .el-input__inner {
  501. width: 110px !important;
  502. border: none;
  503. background: var(--bs-el-background-1);
  504. }
  505. }
  506. .empty {
  507. width: 100%;
  508. height: 70%;
  509. display: flex;
  510. justify-content: center;
  511. align-items: center;
  512. }
  513. </style>