baseIndex.tsx 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. import { computed, defineComponent, onMounted, reactive, ref } from 'vue';
  2. import styles from './baseIndex.module.less';
  3. import icon_back from './image/icon_back.svg';
  4. import { Button, Tab, Tabs, showConfirmDialog } from 'vant';
  5. import {
  6. api_lessonCoursewareFavoriteRemove,
  7. api_lessonCoursewareFavoriteSave
  8. } from '../courseware-list/api';
  9. import { NImage } from 'naive-ui';
  10. import { state } from '@/state';
  11. import TheFavorite from '@/components/the-favorite';
  12. import { useRouter } from 'vue-router';
  13. import { postMessage } from '@/helpers/native-message';
  14. import MEmpty from '@/components/m-empty';
  15. import MSearch from '@/components/m-search';
  16. import { api_musicSheetCategoriesPage, api_musicTagTree } from './api';
  17. import queryString from 'query-string';
  18. export default defineComponent({
  19. name: 'baseIndex-list',
  20. setup() {
  21. const router = useRouter();
  22. const popoverShow = ref(false);
  23. const bookVersionList = ref([] as any);
  24. // 返回
  25. const goback = () => {
  26. postMessage({ api: 'goBack' });
  27. };
  28. const forms = reactive({
  29. // currentGradeNum: null,
  30. musicTagId: null,
  31. keyword: null,
  32. page: 1,
  33. rows: 999
  34. // type: 'COURSEWARE'
  35. });
  36. const isShowGuide = ref(false);
  37. const data = reactive({
  38. list: [] as any[],
  39. loading: false,
  40. favoriteList: [] as any[],
  41. details: [] as any[],
  42. bookData: {} as any,
  43. showBook: false,
  44. book: {} as DOMRect
  45. });
  46. const getTanentList = async () => {
  47. try {
  48. const { data } = await api_musicTagTree();
  49. bookVersionList.value = data || [];
  50. if (bookVersionList.value.length > 0) {
  51. forms.musicTagId = bookVersionList.value[0].id;
  52. }
  53. } catch {
  54. //
  55. }
  56. };
  57. const getList = async () => {
  58. data.loading = true;
  59. const { musicTagId, ...music } = forms;
  60. const res = await api_musicSheetCategoriesPage({
  61. musicTagIds: [musicTagId],
  62. subjectId: state.user.data?.subjectId || '',
  63. ...music
  64. // currentGradeNum: forms.currentGradeNum ? forms.currentGradeNum : ''
  65. });
  66. if (res?.code === 200 && Array.isArray(res?.data?.rows)) {
  67. data.list = res.data.rows.map((item: any) => {
  68. item.load = false;
  69. item.key = Date.now() + item.id;
  70. return item;
  71. });
  72. }
  73. data.loading = false;
  74. isShowGuide.value = true;
  75. };
  76. onMounted(async () => {
  77. await getTanentList();
  78. await getList();
  79. });
  80. const handleFavorite = async (item: any) => {
  81. if (item.favoriteFlag) {
  82. await api_lessonCoursewareFavoriteSave({
  83. lessonCoursewareId: item.id
  84. });
  85. } else {
  86. await api_lessonCoursewareFavoriteRemove({
  87. lessonCoursewareId: item.id
  88. });
  89. getList();
  90. }
  91. };
  92. let timer: any = null;
  93. const dubounce = (fn: any, delay: number = 300) => {
  94. if (timer) {
  95. clearTimeout(timer);
  96. }
  97. timer = setTimeout(fn, delay);
  98. };
  99. const onDetail = (item: any) => {
  100. // router.push({
  101. // path: '/co-ai-detail',
  102. // query: {
  103. // musicTagId: forms.musicTagId,
  104. // id: item.id,
  105. // name: item.name
  106. // }
  107. // });
  108. const query = queryString.stringify({
  109. musicTagId: forms.musicTagId,
  110. id: item.id,
  111. name: item.name
  112. });
  113. const url =
  114. location.origin + location.pathname + '#/co-ai-detail?' + query;
  115. console.log('🚀 ~ url:', url);
  116. postMessage({
  117. api: 'openWebView',
  118. content: {
  119. url,
  120. orientation: 0,
  121. isHideTitle: false,
  122. c_orientation: 0 // 0 横屏 1 竖屏
  123. }
  124. });
  125. };
  126. return () => (
  127. <div class={styles.container}>
  128. {/* <div class={styles.head} style={{ opacity: data.showBook ? 0 : '' }}>
  129. <div class={styles.back} onClick={goback}>
  130. <img src={icon_back} />
  131. </div>
  132. </div> */}
  133. <div class={styles.back} onClick={goback}>
  134. <img src={icon_back} />
  135. </div>
  136. <div class={styles.centerSearch}>
  137. <div id="coai-0">
  138. <MSearch
  139. class={[
  140. 'searchNotice'
  141. // data.searchNoticeShow ? styles.searchNoticeShow : ''
  142. ]}
  143. shape="round"
  144. background="transparent"
  145. clearable={false}
  146. placeholder="请输入关键字"
  147. // modelValue={forms.keyword}
  148. // onFocus={() => (data.searchNoticeShow = false)}
  149. // onBlur={val => {
  150. // musicForms.keyword = val?.trim() || '';
  151. // requestAnimationFrame(() => {
  152. // requestAnimationFrame(() => {
  153. // if (musicForms.keyword) {
  154. // data.searchNoticeShow = true;
  155. // }
  156. // });
  157. // });
  158. // }}
  159. onSearch={val => {
  160. forms.keyword = val;
  161. getList();
  162. }}
  163. />
  164. </div>
  165. </div>
  166. <div class={styles.section}>
  167. <div class={styles.directorySection}>
  168. <div class={styles.directionc}>
  169. {bookVersionList.value.map((item: any) => (
  170. <p
  171. class={[
  172. styles.dirItem,
  173. forms.musicTagId == item.id ? styles.active : ''
  174. ]}
  175. onClick={() => {
  176. forms.musicTagId = item.id;
  177. getList();
  178. }}>
  179. {item.name}
  180. </p>
  181. ))}
  182. </div>
  183. </div>
  184. <div class={styles.content}>
  185. <div
  186. class={[
  187. styles.wrap,
  188. data.list.length <= 0 && !data.loading ? styles.emtpyWrap : ''
  189. ]}>
  190. {data.list.map((item, index) => {
  191. return (
  192. <div
  193. class={[
  194. styles.wrapItem,
  195. data.bookData.id === item.id && data.showBook
  196. ? styles.wrapItemHide
  197. : ''
  198. ]}
  199. key={item.key}
  200. onClick={() => onDetail(item)}>
  201. <div class={styles.item}>
  202. <NImage
  203. data-id={item.id}
  204. {...{ id: index == 0 ? 'courseware-0' : '' }}
  205. class={[styles.cover, item.load ? styles.loaded : '']}
  206. objectFit="cover"
  207. src={item.coverImg}
  208. onLoad={() => {
  209. item.load = true;
  210. }}
  211. onError={() => {
  212. item.load = true;
  213. }}
  214. />
  215. </div>
  216. <div class={styles.name}>{item.name}</div>
  217. {/* <div
  218. id={index === 0 ? 'courseware-1' : ''}
  219. class={styles.favoriteBtn}
  220. onClick={(e: Event) => {
  221. e.stopPropagation();
  222. item.favoriteFlag = !item.favoriteFlag;
  223. dubounce(() => handleFavorite(item));
  224. }}>
  225. <TheFavorite isFavorite={item.favoriteFlag} />
  226. </div> */}
  227. </div>
  228. );
  229. })}
  230. {data.list.length <= 0 && !data.loading && (
  231. <MEmpty image="list" description="暂无数据" />
  232. )}
  233. </div>
  234. </div>
  235. </div>
  236. </div>
  237. );
  238. }
  239. });