download.tsx 3.2 KB

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