noticeModal.tsx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. import { defineComponent, onMounted, reactive, ref } from 'vue';
  2. import styles from './noticeModal.module.less';
  3. // import p1 from './images/1.png'
  4. import p2 from './images/2.png';
  5. import p3 from './images/3.png';
  6. import p4 from './images/4.png';
  7. import p5 from './images/5.png';
  8. import p6 from './images/6.png';
  9. import iconClose from './images/icon-close.png';
  10. import iconDownload from './images/icon-download.png';
  11. import TheQrCode from '@/components/TheQrCode';
  12. import html2canvas from 'html2canvas';
  13. import { vaildUrl } from '@/utils/urlUtils';
  14. import dayjs from 'dayjs';
  15. export default defineComponent({
  16. name: 'notice-modal',
  17. props: {
  18. data: {
  19. type: Object,
  20. default: () => ({})
  21. }
  22. },
  23. emits: ['close'],
  24. setup(props, { emit }) {
  25. const data = reactive({
  26. uploading: false
  27. });
  28. const extraConfig = ref({} as any);
  29. const url = ref(
  30. vaildUrl() + `/classroom-app/#/student-register?sId=${props.data.id}`
  31. );
  32. if (props.data.registerType != 'BUG_GOODS') {
  33. url.value =
  34. vaildUrl() + `/classroom-app/#/register-member?sId=${props.data.id}`;
  35. }
  36. const imgs = reactive({
  37. saveLoading: false,
  38. image: null as any,
  39. shareLoading: false
  40. });
  41. const downImg = () => {
  42. if (imgs.saveLoading) {
  43. return;
  44. }
  45. imgs.saveLoading = true;
  46. // 判断是否已经生成图片
  47. if (imgs.image) {
  48. saveImg();
  49. } else {
  50. const container: any = document.getElementById(`preview-container`);
  51. html2canvas(container, {
  52. allowTaint: true,
  53. useCORS: true,
  54. backgroundColor: null
  55. })
  56. .then(async canvas => {
  57. const url = canvas.toDataURL('image/png');
  58. imgs.image = url;
  59. saveImg();
  60. })
  61. .catch(() => {
  62. imgs.saveLoading = false;
  63. });
  64. }
  65. };
  66. const saveImg = async () => {
  67. // showLoadingToast({ message: '图片生成中...', forbidClick: true });
  68. setTimeout(() => {
  69. imgs.saveLoading = false;
  70. }, 100);
  71. const link = document.createElement('a');
  72. link.setAttribute('download', '报名图片' + '.png');
  73. // 添加时间戳,防止浏览器缓存图片
  74. // console.log(imgUrl,'imgUrl')
  75. link.href = imgs.image;
  76. link.click();
  77. // const res = await promisefiyPostMessage({
  78. // api: 'savePicture',
  79. // content: {
  80. // base64: imgs.image
  81. // }
  82. // });
  83. // if (res?.content?.status === 'success') {
  84. // showSuccessToast('保存成功');
  85. // } else {
  86. // showFailToast('保存失败');
  87. // }
  88. };
  89. onMounted(() => {
  90. const extraConfigS = props.data.extraConfig
  91. ? JSON.parse(props.data.extraConfig)
  92. : {};
  93. const content = extraConfigS.content.replace(/\n/gi, '<br />');
  94. extraConfig.value = {
  95. ...extraConfigS,
  96. content
  97. };
  98. });
  99. return () => (
  100. <div class={styles.noticeBack}>
  101. <div class={styles.noticeModal} id="preview-container">
  102. <img src={p5} class={styles.bg} />
  103. <img src={p4} class={styles.header} />
  104. <img src={p2} class={styles.bottom} />
  105. <img src={p6} class={styles.bottom_d} />
  106. <div class={styles.schoolName}>
  107. <img
  108. class={styles.schoolLogo}
  109. crossorigin="anonymous"
  110. src={props.data.logo + `?some=${new Date().getTime()}`}
  111. />
  112. <span>{props.data.name}</span>
  113. </div>
  114. <div class={styles.studentCore}>
  115. <img src={p3} class={styles.book} />
  116. <div class={styles.title}>尊敬的家长:</div>
  117. <div class={styles.content1}>
  118. 为贯彻落实县“十四五”教育发展规划、教育部《基础教育课程教学改革深化行动方案》等文件精神,推进教育部“实施国家教育数字化战略行动”,促进信息技术与音乐课堂器乐教学练的深度融合,推动数字化在拓展音乐教学时空、共享优质资源、优化课程内容与教学过程、优化学生学习方式、精准开展教学评价等方面广泛应用,学校决定自本学期开展“器乐课堂数字化建设”,现将有关安排通知如下:
  119. </div>
  120. <div class={styles.content}>
  121. <p class={styles.smallTitle}>
  122. 一、音乐课已经学了唱歌,为什么还要学习器乐
  123. </p>
  124. <p class={styles.smallContnet}>
  125. 通过器乐来学习音乐,能全面培养学生的读谱、视唱、听音、节奏、和声、欣赏、创作等综合音乐素养。
  126. </p>
  127. </div>
  128. <div class={styles.content}>
  129. <p class={styles.smallTitle}>
  130. 二、器乐课堂的小乐器有哪些种类和优势
  131. </p>
  132. <p class={styles.smallContnet}>
  133. 通常有竖笛、排箫、葫芦丝、陶笛等,具有携带方便、轻巧、好存放、简单易学、应用灵活、价格低等优势。
  134. </p>
  135. </div>
  136. <div class={styles.content}>
  137. <p class={styles.smallTitle}>
  138. 三、我校器乐课堂数字化准备开设的乐器安排
  139. </p>
  140. <p
  141. class={styles.smallContnet}
  142. v-html={extraConfig.value.content}></p>
  143. </div>
  144. <div class={styles.content}>
  145. <p class={styles.smallTitle}>
  146. 四、为什么要进行器乐课堂数字化建设
  147. </p>
  148. <p class={styles.smallContnet}>
  149. 在器乐的学练中,涉及乐理、指法、节奏、音准等多项音乐专业知识,借助数字化可以让学生人人随时学练,解决学生课后面临不会练、家长无法辅助、老师无法及时给予指导的专业性问题,让外行人都看得懂。
  150. </p>
  151. </div>
  152. <div class={styles.content}>
  153. <p class={styles.smallTitle}>五、建设器乐课堂数字化的优势</p>
  154. <p class={styles.smallContnet}>
  155. 1.能帮助学生增强专注力与记忆力,提高阅读与理解能力,培养审美与情商,舒缓与释放情绪,有助于培养学生的身心健康;
  156. <br />
  157. 2.让学生能够较好地适应接下来中考或高考的政策调整。
  158. </p>
  159. </div>
  160. <div class={styles.content}>
  161. <p class={styles.smallTitle}>六、如何实施器乐课堂数字化建设</p>
  162. <p class={styles.smallContnet}>
  163. 1.器乐课堂数字化建设的标准为:家校互联互通、课上课后学练同频;
  164. <br />
  165. 2.由硬件环境、技术环境、数字化音乐资源、师生数字化素养培养等构成,需长期持续性建设;
  166. <br />
  167. 3.基于校情,学校借助北京知勉公益基金会提供的专业技术资源,依托学校现有音乐教室场地设备,进行数字化资源建设与升级,并安排音乐教师持续进行数字化素养培训;
  168. <br />
  169. 4.实施后,音乐老师在课上使用数字化工具进行器乐授课,学生借助数字化工具进行学习,课后,学生在家使用乐器数字化工具进行练习。
  170. </p>
  171. </div>
  172. <div class={styles.content}>
  173. <p class={styles.smallTitle}>
  174. 七、实施的年级、参加原则、职责分工
  175. </p>
  176. <p class={styles.smallContnet}>
  177. 1.以音乐课堂为建设主体,面向全体学生实施器乐课堂数字化教学练;
  178. <br />
  179. 2.学校负责协调解决家校互联互通的问题;
  180. <br />
  181. 3.家长负责解决乐器、数字化学练等工具,遵循家长自愿参与的原则;
  182. </p>
  183. </div>
  184. <div class={styles.content}>
  185. <p class={styles.smallTitle}>
  186. 八、什么是数字化学练工具,准备途径,参考价格
  187. </p>
  188. <p class={styles.smallContnet}>
  189. 指具有数字化乐谱与课件、测评音视频云储存、五线谱与演奏指法跟播、电子节拍/校音、选段练习、原音/伴奏切换、速度调整等数字化学练工具(软件),通过手机或平板IPAD使用。
  190. 家长可自行在手机应用市场中准备,不限品牌、型号及价格,准备前应了解软件是否支持课堂乐器学练及以上功能。也可通过基金会提供的渠道准备,参考价格为290元/年。
  191. </p>
  192. </div>
  193. <div class={styles.content}>
  194. <p class={styles.smallTitle}>九、课堂乐器准备的途径、参考要求</p>
  195. <p class={styles.smallContnet}>
  196. 家长可自行在网店、琴行准备,课堂乐器的要求为:
  197. 不限品牌、型号及价格,也可通过基金会提供的渠道准备,参考价格为
  198. {extraConfig.value.price}。
  199. </p>
  200. </div>
  201. <div class={styles.content}>
  202. <p class={styles.smallTitle}>十、工作安排</p>
  203. <p class={styles.smallContnet}>
  204. 1.我校定于
  205. {dayjs(extraConfig.value.teachTime).format('YYYY年MM月DD日')}
  206. 正式开展器乐课堂数字化教学; <br />
  207. 2.
  208. {dayjs(extraConfig.value.buildStartTime).format(
  209. 'YYYY年MM月DD日'
  210. )}
  211. —{dayjs(extraConfig.value.buildEndTime).format('MM月DD日')}
  212. 间进行家长互联互通部署(另行通知);
  213. <br />
  214. 3.请家长在开课前为学生准备好课堂乐器和数字化学练工具,通过基金会渠道准备的家长可扫码进行工具准备;
  215. <br />
  216. 4.如有疑问可向本班音乐教师咨询。
  217. </p>
  218. </div>
  219. <div class={[styles.content1, styles.lastContent]}>
  220. 器乐课堂数字建设将遵循“立足本校实际,符合学生特点,注重课效课质”,为孩子成长搭建快乐的音乐家园,让我们的孩子以音乐为友,与器乐同行,在艺术特色的引领下茁壮成长,愿我们的孩子们都能奏出美妙的音乐!再次感谢家长朋友们对学校工作的大力支持!
  221. </div>
  222. <div class={styles.schoolInfo}>
  223. <p>{props.data.name}</p>
  224. <p>{dayjs().format('YYYY年MM月DD日')}</p>
  225. </div>
  226. </div>
  227. <div class={styles.qrCodeContainer}>
  228. <div class={styles.codewrap}>
  229. <TheQrCode
  230. logoSrc={props.data.logo}
  231. margin={0}
  232. text={url.value}
  233. size={84}
  234. />
  235. {/* <img src={codewrap} class={styles.codewrapBg} alt="" /> */}
  236. </div>
  237. <div class={styles.codewrapSubmit}>请扫码报名</div>
  238. </div>
  239. </div>
  240. <div class={styles.btnGroup}>
  241. <img
  242. src={iconClose}
  243. class={styles.iconClose}
  244. onClick={() => emit('close')}
  245. />
  246. <img
  247. src={iconDownload}
  248. class={styles.iconDownload}
  249. onClick={downImg}
  250. />
  251. {/* <div class={styles.iconClose} onClick={downImg}>
  252. </div>
  253. <div class={styles.downBtn} onClick={downImg}>
  254. 下载图片
  255. </div> */}
  256. </div>
  257. </div>
  258. );
  259. }
  260. });