PicTimeline.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <template>
  2. <div class="pic-container">
  3. <div v-for="(item, index) in list" :key="item" class="pic-main">
  4. <div :class="index % 2 == 0 ? 'box' : 'box bottom-box'">
  5. <div class="card-note">
  6. {{ item.userName }} 拍摄于
  7. <br />
  8. {{ item.createTime }}
  9. </div>
  10. <div class="media-box" style="position: relative">
  11. <el-image
  12. v-if="item.mediaType == 1"
  13. style="width: 100%; height: 100%"
  14. fit="contain"
  15. :src="item.downloadUrl"
  16. :preview-src-list="previewSrcList"
  17. ></el-image>
  18. <video
  19. style="width: 100%; height: 100%"
  20. v-else
  21. :src="item.downloadUrl"
  22. ></video>
  23. <img
  24. @click="openVideoModal(item.downloadUrl)"
  25. v-if="item.mediaType == 2"
  26. src="../assets/icon-player.png"
  27. style="
  28. object-fit: contain;
  29. width: 40px;
  30. height: 40px;
  31. position: absolute;
  32. top: calc(50% - 20px);
  33. left: calc(50% - 20px);
  34. background: #fff;
  35. border-radius: 50%;
  36. "
  37. alt=""
  38. />
  39. </div>
  40. <div class="checkbox-group df aic jcsa">
  41. <el-checkbox
  42. @change="auditMedia(item.id, 1, index, item.mediaType)"
  43. :model-value="item.audit == 1"
  44. label="通过"
  45. ></el-checkbox>
  46. <el-checkbox
  47. @change="auditMedia(item.id, 2, index, item.mediaType)"
  48. :model-value="item.audit == 2"
  49. label="未通过"
  50. ></el-checkbox>
  51. </div>
  52. </div>
  53. <div :class="index % 2 == 0 ? 's-line' : 's-line top210px'"></div>
  54. <div class="point"></div>
  55. <div class="l-line" v-if="index + 1 != list.length"></div>
  56. </div>
  57. <el-dialog
  58. v-model="videoModal"
  59. title="视频审核"
  60. width="20%"
  61. :before-close="videoClose"
  62. >
  63. <video
  64. autoplay
  65. controls
  66. style="width: 100%; height: 100%"
  67. :src="currentUrl"
  68. ></video>
  69. </el-dialog>
  70. </div>
  71. </template>
  72. <script>
  73. import { onMounted, ref, watch } from "vue";
  74. import store from "../store";
  75. import { useStore } from "vuex";
  76. import api from "../apis/fetch";
  77. export default {
  78. setup(props, ctx) {
  79. let currentUrl = ref("");
  80. let videoModal = ref(false);
  81. function openVideoModal(url) {
  82. currentUrl.value = url;
  83. videoModal.value = true;
  84. }
  85. async function auditMedia(mediaId, a, index, mediaType) {
  86. // console.log(mediaId, a, index, mediaType);
  87. let res = await api.auditMedia({
  88. mediaId,
  89. audit: a,
  90. });
  91. }
  92. onMounted(() => {});
  93. return {
  94. currentUrl,
  95. videoModal,
  96. openVideoModal,
  97. auditMedia,
  98. list,
  99. };
  100. },
  101. };
  102. </script>
  103. <style scoped>
  104. * {
  105. --box-width: 200px;
  106. }
  107. .pic-container {
  108. width: 100%;
  109. height: 100%;
  110. box-sizing: border-box;
  111. display: flex;
  112. padding: 20px;
  113. overflow-x: scroll;
  114. overflow-y: hidden;
  115. white-space: nowrap;
  116. }
  117. .pic-main {
  118. position: relative;
  119. width: 120px;
  120. }
  121. .box {
  122. position: absolute;
  123. height: 240px;
  124. width: var(--box-width);
  125. border: 1px solid #dddddd;
  126. transition: all 0.5s;
  127. background: #fff;
  128. z-index: 10;
  129. }
  130. .s-line {
  131. position: absolute;
  132. left: 100px;
  133. top: 242px;
  134. height: 20px;
  135. border-left: 2px dashed;
  136. box-sizing: border-box;
  137. border-color: #97caf6;
  138. }
  139. .point {
  140. position: relative;
  141. left: 93px;
  142. top: 258px;
  143. width: 16px;
  144. height: 16px;
  145. background-image: url(../images/blue-circle.png);
  146. }
  147. .l-line {
  148. position: relative;
  149. bottom: 30px;
  150. left: 111px;
  151. top: 249px;
  152. height: 3px;
  153. width: 100px;
  154. background-color: #0094fe;
  155. }
  156. .bottom-box {
  157. top: 290px;
  158. }
  159. .top210px {
  160. top: 270px;
  161. }
  162. .box:hover {
  163. transform: scale(1.2);
  164. }
  165. .media-box {
  166. width: 80px;
  167. height: 80px;
  168. margin-top: 10px;
  169. }
  170. .card-note {
  171. height: 30px;
  172. font-size: 12px;
  173. font-family: PingFangSC-Regular, PingFang SC;
  174. font-weight: 400;
  175. color: #777777;
  176. padding: 10px 20px;
  177. }
  178. .media-box {
  179. width: 100%;
  180. height: 100px;
  181. margin-top: 20px;
  182. }
  183. .checkbox-group {
  184. width: 200px;
  185. height: 50px;
  186. margin-top: 20px;
  187. }
  188. </style>