index.tsx 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. import { defineComponent, toRefs, reactive, onMounted, ref } from 'vue'
  2. import hold from '@/components/albumItem/images/hold.png'
  3. import start from '@/components/albumItem/images/start.png'
  4. import lineStart from '@/components/albumItem/images/lineStart.png'
  5. import smallPan from '@/components/albumItem/images/pan.png'
  6. import classes from './index.module.less'
  7. import arrow from '@/components/musicLIstItem/images/arrow.png'
  8. import hot from '@/components/hotSearch/images/hot.png'
  9. import pan from './images/pan.png'
  10. import somePan from './images/somePan.png'
  11. import tagItem from '@/components/tagItem'
  12. import pagination from '@/components/pagination'
  13. import albumItem from './modals/albumItem'
  14. import request from '@/helpers/request'
  15. import musicLIstItem from '@/components/musicLIstItem'
  16. import { getUserInfo, getUserType, getAuth } from '@/helpers/utils'
  17. import ColEmpty from '@/components/col-empty'
  18. import { useRoute, useRouter } from 'vue-router'
  19. // import start from '@/common/images/start.png'
  20. // import lineStart from '@/common/images/lineStart.png'
  21. import { watch } from 'fs'
  22. export default defineComponent({
  23. name: 'albumDetail',
  24. props: {
  25. title: {
  26. type: String,
  27. default: ''
  28. }
  29. },
  30. components: { tagItem, pagination, albumItem, musicLIstItem, ColEmpty },
  31. setup(props, conent) {
  32. const state = reactive({
  33. title: props.title,
  34. hotList: [],
  35. hotTagList: [],
  36. relatedMusicAlbum: [],
  37. id: '',
  38. musicList: [],
  39. pageInfo: {
  40. // 分页规则
  41. limit: 10, // 限制显示条数
  42. page: 1, // 当前页
  43. total: 0, // 总条数
  44. page_size: [10, 20, 40, 50] // 选择限制显示条数
  45. },
  46. details: {} as any,
  47. userType: '',
  48. isshowData: false
  49. })
  50. const route = useRoute()
  51. const router = useRouter()
  52. const getList = async () => {
  53. try {
  54. const res = await request.post('/api-website/open/music/album/detail', {
  55. data: {
  56. id: state.id,
  57. page: state.pageInfo.page,
  58. rows: state.pageInfo.limit
  59. }
  60. })
  61. state.details = res.data
  62. state.pageInfo.total = res.data.musicSheetList.total
  63. if (state.pageInfo.total == 0) {
  64. state.isshowData = true
  65. } else {
  66. state.isshowData = false
  67. }
  68. state.musicList = res.data.musicSheetList.rows
  69. state.hotList = res.data.hotMusicAlbum
  70. state.hotTagList = res.data.musicTagNames.split(',') || []
  71. state.relatedMusicAlbum = res.data.relatedMusicAlbum
  72. } catch (e) {
  73. console.log(e)
  74. }
  75. }
  76. const favoriteAlbum = async () => {
  77. try {
  78. const res = await request.post(
  79. `/api-website/music/album/favorite/${state.id}`,
  80. {}
  81. )
  82. getList()
  83. } catch (e) {
  84. console.log(e)
  85. }
  86. }
  87. onMounted(() => {
  88. if (route.query.id) {
  89. state.id = route.query.id as string
  90. }
  91. state.userType = getUserType()
  92. getList()
  93. })
  94. const getDetail = (id: number | string) => {
  95. state.id = id as string
  96. getList()
  97. }
  98. const gotoMore = () => {
  99. router.push({ path: '/searchdetail' })
  100. }
  101. return () => (
  102. <>
  103. <div class={[classes.wrap]}>
  104. <div class={classes.wall}></div>
  105. <div class={[classes.w1200]}>
  106. <div class={classes.left}>
  107. <div class={classes.albumInfo}>
  108. <div class={classes.albumTitle}>
  109. <h2>{state.details.albumName}</h2>
  110. <img src={state.details.favorite ? lineStart : start} alt="" />
  111. </div>
  112. <div class={classes.albumInfoTop}>
  113. <div class={classes.albumInfoTopImg}>
  114. <img
  115. src={
  116. state.details.albumCoverUrl
  117. ? state.details.albumCoverUrl
  118. : hold
  119. }
  120. alt=""
  121. class={classes.albumCover}
  122. />
  123. {/* <img src={pan} alt="" class={classes.pan} /> */}
  124. </div>
  125. <div class={classes.albumInfoTopConent}>
  126. <p>{state.details.albumDesc}</p>
  127. <div class={classes.tagWrap}>
  128. {state.hotTagList.map((item: any) => {
  129. return <tagItem title={item}></tagItem>
  130. })}
  131. </div>
  132. </div>
  133. </div>
  134. <div class={classes.albumInfoBottom}>
  135. <div class={classes.albumInfoLeft}>
  136. <div class={classes.itemBottomL}>
  137. <img src={smallPan} alt="" />
  138. <span>{state.details.musicSheetCount}首</span>
  139. </div>
  140. <div class={classes.itemBottomR}>
  141. <img src={start} alt="" />
  142. <span>{state.details.favorite}人收藏</span>
  143. </div>
  144. </div>
  145. {state.userType == 'STUDENT' ? (
  146. <div class={classes.albumInfoRight}>
  147. <div
  148. class={classes.itemBottomR}
  149. onClick={() => favoriteAlbum()}
  150. >
  151. <img
  152. src={state.details.favorite ? lineStart : start}
  153. alt=""
  154. />
  155. <span>
  156. {state.details.favorite ? '已收藏' : '收藏'}
  157. </span>
  158. </div>
  159. </div>
  160. ) : null}
  161. </div>
  162. </div>
  163. <div class={classes.musicWrap}>
  164. <div class={classes.title}>
  165. <div class={classes.dot}></div>
  166. <span>曲目列表</span>
  167. </div>
  168. <div>
  169. {state.musicList.map(item => {
  170. return <musicLIstItem item={item}></musicLIstItem>
  171. })}
  172. {state.isshowData && <ColEmpty></ColEmpty>}
  173. </div>
  174. </div>
  175. <pagination
  176. total={state.pageInfo.total}
  177. v-model:page={state.pageInfo.page}
  178. v-model:limit={state.pageInfo.limit}
  179. pageSizes={state.pageInfo.page_size}
  180. pagination={getList}
  181. ></pagination>
  182. </div>
  183. <div class={classes.right}>
  184. <div class={classes.some}>
  185. <div class={classes.someTitle}>
  186. <div class={classes.tilteL}>
  187. <img src={somePan} alt="" />
  188. <span>相关专辑</span>
  189. </div>
  190. <div
  191. class={classes.tilteR}
  192. onClick={() => {
  193. gotoMore()
  194. }}
  195. >
  196. <span>更多</span>
  197. <img class={classes.arrow} src={arrow} alt="" />
  198. </div>
  199. </div>
  200. <div class={classes.someWrap}>
  201. {state.relatedMusicAlbum.map(item => (
  202. <albumItem
  203. detail={item}
  204. onAlbumDetail={id => getDetail(id)}
  205. ></albumItem>
  206. ))}
  207. </div>
  208. </div>
  209. <div class={classes.some}>
  210. <div class={classes.someTitle}>
  211. <div class={classes.tilteL}>
  212. <img src={hot} alt="" />
  213. <span>热门专辑</span>
  214. </div>
  215. <div
  216. class={classes.tilteR}
  217. onClick={() => {
  218. gotoMore()
  219. }}
  220. >
  221. <span>更多</span>
  222. <img class={classes.arrow} src={arrow} alt="" />
  223. </div>
  224. </div>
  225. <div class={classes.someWrap}>
  226. {state.hotList.map(item => (
  227. <albumItem
  228. detail={item}
  229. onAlbumDetail={id => getDetail(id)}
  230. ></albumItem>
  231. ))}
  232. </div>
  233. </div>
  234. </div>
  235. </div>
  236. </div>
  237. </>
  238. )
  239. }
  240. })