download.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import { defineComponent, reactive, ref, watch } from 'vue'
  2. import styles from './download.module.less'
  3. import { postMessage, promisefiyPostMessage } from '@/helpers/native-message'
  4. import {
  5. addMusicTitle,
  6. addWatermark,
  7. convasToImg,
  8. imgToCanvas
  9. } from './imageFunction'
  10. import { Button, Swipe, SwipeItem, Toast, Image } from 'vant'
  11. export default defineComponent({
  12. name: 'download',
  13. props: {
  14. imgList: {
  15. type: Array,
  16. default: () => []
  17. },
  18. musicSheetName: {
  19. type: String,
  20. default: ''
  21. }
  22. },
  23. setup(props) {
  24. const list = ref(props.imgList)
  25. watch(
  26. () => props.imgList,
  27. (val: any) => {
  28. list.value = val
  29. }
  30. )
  31. const acitveIndex = ref(0)
  32. const saveLoading = ref<boolean>(false)
  33. const image = ref('')
  34. const onSaveImg = async () => {
  35. // 判断是否在保存中...
  36. if (saveLoading.value) {
  37. return
  38. }
  39. saveLoading.value = true
  40. // 判断是否已经生成图片
  41. if (image.value) {
  42. saveImg()
  43. } else {
  44. const tempCanvas = await imgToCanvas(
  45. list.value[acitveIndex.value] as any
  46. )
  47. const titleCanvas = addMusicTitle(tempCanvas, {
  48. title: props.musicSheetName,
  49. size: 18
  50. })
  51. const canvas = await addWatermark(titleCanvas, '酷乐秀')
  52. image.value = convasToImg(canvas)
  53. await saveImg()
  54. }
  55. }
  56. const saveImg = async () => {
  57. Toast.loading({
  58. message: '图片生成中...',
  59. forbidClick: true
  60. })
  61. setTimeout(() => {
  62. saveLoading.value = false
  63. }, 100)
  64. const res = await promisefiyPostMessage({
  65. api: 'savePicture',
  66. content: {
  67. base64: image.value
  68. }
  69. })
  70. if (res?.content?.status === 'success') {
  71. Toast.success('保存成功')
  72. } else {
  73. Toast.fail('保存失败')
  74. }
  75. }
  76. return () => {
  77. return (
  78. <div class={styles.downloadContainer}>
  79. <div class={styles.musicContainer}>
  80. <h2>{props.musicSheetName}</h2>
  81. <div class={styles.musicImg}>
  82. <Swipe
  83. showIndicators={false}
  84. loop={false}
  85. onChange={(index: number) => {
  86. acitveIndex.value = index
  87. image.value = ''
  88. }}
  89. >
  90. {list.value.length > 0 &&
  91. list.value.map((img: any) => (
  92. <SwipeItem>
  93. <Image src={img} />
  94. </SwipeItem>
  95. ))}
  96. </Swipe>
  97. </div>
  98. </div>
  99. <div class={styles.buttonGroup}>
  100. <div class={styles.num}>
  101. <span class={styles.page}>
  102. {acitveIndex.value + 1}/{list.value.length}
  103. </span>
  104. <span class={styles.countPage}>(共{list.value.length}页)</span>
  105. </div>
  106. <Button
  107. type="primary"
  108. color="linear-gradient(180deg, #59E5D5 0%, #2DC7AA 100%)"
  109. class={styles.downloadBtn}
  110. block
  111. round
  112. onClick={() => onSaveImg()}
  113. loading={saveLoading.value}
  114. loadingText={'加载中...'}
  115. >
  116. 下载当前页面
  117. </Button>
  118. </div>
  119. </div>
  120. )
  121. }
  122. }
  123. })