sign.vue 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <template>
  2. <ui-group-option class="sign-guide">
  3. <div class="info">
  4. <div class="guide-cover">
  5. <img :src="getFileUrl(guide.cover)" />
  6. <ui-icon type="preview" class="icon" ctrl @click="emit('play')" />
  7. </div>
  8. <div>
  9. <p>{{ guide.title }}</p>
  10. </div>
  11. </div>
  12. <div class="actions">
  13. <ui-more
  14. :options="menus"
  15. style="margin-left: 20px"
  16. @click="(action: keyof typeof actions) => actions[action]()"
  17. />
  18. </div>
  19. </ui-group-option>
  20. </template>
  21. <script setup lang="ts">
  22. import { Guide } from '@/store'
  23. import { getFileUrl } from '@/utils'
  24. defineProps<{ guide: Guide }>()
  25. const emit = defineEmits<{
  26. (e: 'delete'): void
  27. (e: 'play'): void
  28. (e: 'edit'): void
  29. }>()
  30. const menus = [
  31. { label: '编辑', value: 'edit' },
  32. { label: '删除', value: 'delete' },
  33. ]
  34. const actions = {
  35. edit: () => emit('edit'),
  36. delete: () => emit('delete')
  37. }
  38. </script>
  39. <style lang="scss" scoped>
  40. .sign-guide {
  41. display: flex;
  42. justify-content: space-between;
  43. align-items: center;
  44. padding: 20px 0;
  45. border-bottom: 1px solid var(--colors-border-color);
  46. &:first-child {
  47. border-top: 1px solid var(--colors-border-color);
  48. }
  49. .info {
  50. flex: 1;
  51. display: flex;
  52. align-items: center;
  53. .guide-cover {
  54. position: relative;
  55. &::after {
  56. content: '';
  57. position: absolute;
  58. inset: 0;
  59. background: rgba(0,0,0,.6)
  60. }
  61. .icon {
  62. position: absolute;
  63. z-index: 1;
  64. left: 50%;
  65. top: 50%;
  66. transform: translate(-50%, -50%);
  67. font-size: 16px;
  68. }
  69. img {
  70. width: 48px;
  71. height: 48px;
  72. object-fit: cover;
  73. border-radius: 4px;
  74. overflow: hidden;
  75. background-color: rgba(255,255,255,.6);
  76. display: block;
  77. }
  78. }
  79. div {
  80. margin-left: 10px;
  81. p {
  82. color: #fff;
  83. font-size: 14px;
  84. margin-bottom: 6px;
  85. }
  86. }
  87. }
  88. .actions {
  89. flex: none;
  90. }
  91. }
  92. </style>