123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572 |
- import {
- computed,
- defineComponent,
- nextTick,
- onMounted,
- reactive,
- ref,
- watch
- } from 'vue'
- import { Sticky, List, Popup, Icon, Switch, Tabs, Tab } from 'vant'
- import Search from '@/components/col-search'
- import request from '@/helpers/request'
- // import Item from './item'
- import SelectTag from '../search/select-tag'
- import { useRoute, useRouter } from 'vue-router'
- import ColResult from '@/components/col-result'
- import styles from './index.module.less'
- import { getRandomKey } from '../music'
- import { openDefaultWebView, state as baseState } from '@/state'
- import SelectSubject from '../search/select-subject'
- import { SubjectEnum, useSubjectId } from '@/helpers/hooks'
- import Song from '../component/song'
- import ColHeader from '@/components/col-header'
- import { useRect } from '@vant/use'
- import { useAsyncState } from '@vueuse/core'
- import bgImg from './icons/bgImg.png'
- import iconSearch from './icons/icon_search.png'
- import { browser } from '@/helpers/utils'
- import TheSticky from '@/components/the-sticky'
- const noop = () => {
- //
- }
- export default defineComponent({
- name: 'MusicList',
- props: {
- hideSearch: {
- type: Boolean,
- default: false
- },
- onlySearch: {
- type: Boolean,
- default: false
- },
- height: {
- type: Number,
- default: 0
- },
- defauleParams: {
- type: Object,
- default: () => ({})
- },
- onItemClick: {
- type: Function,
- default: noop
- },
- teacherId: {
- type: String || Number,
- default: ''
- },
- myself: {
- type: Boolean,
- default: false
- }
- },
- setup(
- {
- hideSearch,
- onlySearch,
- height,
- defauleParams,
- onItemClick,
- teacherId,
- myself
- },
- { expose }
- ) {
- const { isLoading, state } = useAsyncState(
- request(baseState.platformApi + '/MusicTag/tree', {
- params: {
- type: 'MUSIC'
- }
- }),
- null
- )
- const stickyHeight = ref(height || 0)
- const updateStickyHeight = (height: number) => {
- stickyHeight.value = height
- }
- const teacherDetaultSubject = ref({
- id: '',
- name: ''
- })
- if (baseState.platformType === 'TEACHER') {
- // defaultSubject
- const users = baseState.user.data
- teacherDetaultSubject.value = {
- name: users.defaultSubjectName || '全部声部',
- id: users.defaultSubject || ''
- }
- } else {
- // const subjects: any = useSubjectId(SubjectEnum.SEARCH)
- // 判断是否已有数据
- // if (!subjects.id) {
- const users = baseState.user.data
- // const subjectId = users.subjectId
- // ? Number(users.subjectId.split(',')[0])
- // : ''
- // const subjectName = users.subjectName
- // ? users.subjectName.split(',')[0]
- // : ''
- // 存储instrumentId
- const userInstrumentId = users.instrumentId
- localStorage.setItem('userInstrumentId', userInstrumentId)
- // if (subjectId) {
- // useSubjectId(
- // SubjectEnum.SEARCH,
- // JSON.stringify({
- // id: subjectId,
- // name: subjectName
- // }),
- // 'set'
- // )
- // }
- // }
- }
- localStorage.setItem('behaviorId', getRandomKey())
- const route = useRoute()
- const router = useRouter()
- const tempParams: any = {}
- if (baseState.version) {
- tempParams.version = baseState.version || '' // 处理ios审核版本
- tempParams.platform =
- baseState.platformType === 'STUDENT' ? 'ios-student' : 'ios-teacher'
- }
- const exquisiteFlag = ref(false)
- // 判断是否在搜索页面用过
- if (!hideSearch) {
- if (baseState.platformType === 'TEACHER') {
- tempParams.subjectIds = teacherDetaultSubject.value.id
- } else {
- // const getSubject: any = useSubjectId(SubjectEnum.SEARCH)
- const users = baseState.user.data
- const subjectId = users.subjectId
- ? Number(users.subjectId.split(',')[0])
- : ''
- tempParams.subjectIds = subjectId
- }
- const getMusic: any = useSubjectId(SubjectEnum.MUSIC_FREE)
- exquisiteFlag.value = getMusic.chargeType
- }
- // if(onlySearch) {
- // const getSubject: any = useSubjectId(SubjectEnum.SEARCH)
- // tempParams.subjectIds = getSubject.id
- // }
- //
- const params = reactive({
- search: (route.query.search as string) || '',
- musicSortType: (route.query.type as string) || "",
- // exquisiteFlag: 1,
- musicTagIds: route.query.tagids || '',
- page: 1,
- ...defauleParams,
- ...tempParams
- })
- const data = ref<any>(null)
- const loading = ref(false)
- const finished = ref(false)
- const isError = ref(false)
- const tagVisibility = ref(false)
- const isAudit = ref(true)
- const apiSuffix = ref(
- baseState.platformType === 'STUDENT' ? '/api-student' : '/api-teacher'
- )
- const onSearch = (value: string) => {
- params.page = 1
- params.search = value
- data.value = null
- FetchList()
- }
- const FetchList = async () => {
- if (loading.value) {
- return
- }
- loading.value = true
- isError.value = false
- const tempParams = {
- ...params,
- auditStatus: 'PASS',
- idAndName: params.search,
- createBy: teacherId
- }
- if (exquisiteFlag.value) {
- tempParams.chargeType = 'FREE'
- }
- if (myself) {
- tempParams.myself = true
- } else {
- tempParams.myself = false
- }
- try {
- const res = await request.post(`${apiSuffix.value}/music/sheet/list`, {
- data: tempParams
- })
- if (data.value) {
- const result = (data.value?.rows || []).concat(res.data.rows || [])
- data.value.rows = result
- }
- data.value = data.value || res.data
- params.page = res.data.pageNo + 1
- finished.value = res.data.pageNo >= res.data.totalPage
- } catch (error) {
- isError.value = true
- }
- loading.value = false
- }
- // 设置默认声部
- const setDefaultSubject = async (subjectId: any) => {
- try {
- await request.post('/api-teacher/teacher/defaultSubject', {
- params: {
- subjectId
- }
- })
- } catch {
- //
- }
- }
- const onComfirm = tags => {
- const tempTags: any = {}
- // 单独处理乐谱类型
- for (const tag in tags) {
- if (Number(tag) === -1) {
- exquisiteFlag.value = tags[tag][0] ? true : false
- } else {
- tempTags[tag] = tags[tag]
- }
- }
- const d = Object.values(tempTags).flat().filter(Boolean).join(',')
- params.musicTagIds = d
- params.page = 1
- data.value = null
- FetchList()
- tagVisibility.value = false
- }
- const onComfirmSubject = item => {
- // params.page = 1
- // params.subjectIds = item.id
- // data.value = null
- // subject.instrumentId = item.instrumentId
- // localStorage.setItem('userInstrumentId', item.instrumentId || "")
- // if (baseState.platformType === 'TEACHER') {
- // teacherDetaultSubject.value = {
- // name: item.name,
- // id: item.id
- // }
- // setDefaultSubject(item.id)
- // } else {
- // subject.id = item.id
- // subject.name = item.name
- // useSubjectId(
- // SubjectEnum.SEARCH,
- // JSON.stringify({
- // id: item.id,
- // name: item.name
- // }),
- // 'set'
- // )
- // }
- // FetchList()
- // subject.show = false
- }
- // const getSubject: any = useSubjectId(SubjectEnum.SEARCH)
- // // 处理存值的问题 - 重置数量
- // let tempInstrumentId = localStorage.getItem('userInstrumentId') || ''
- // if(tempInstrumentId === 'undefined') {
- // useSubjectId(SubjectEnum.SEARCH, "", "remove")
- // tempInstrumentId = ""
- // }
- // const subject = reactive({
- // show: false,
- // name: getSubject.id ? getSubject.name : '全部声部',
- // id: getSubject.id || '',
- // instrumentId: tempInstrumentId,
- // })
- onMounted(async () => {
- try {
- if (!browser().iPhone) {
- isAudit.value = false
- return
- }
- const { data } = await request.get(
- '/api-admin/appVersionInfo/queryByPlatform',
- {
- params: {
- platform:
- baseState.platformType === 'TEACHER'
- ? 'ios-teacher'
- : 'ios-student'
- }
- }
- )
- if (baseState.version > data.version) {
- isAudit.value = true
- } else {
- isAudit.value = false
- }
- } catch {
- //
- }
- })
- expose({
- onSearch,
- onComfirm,
- updateStickyHeight,
- onComfirmSubject
- })
- return () => {
- // const tagList = ((state.value && state.value.data) as any) || []
- return (
- <>
- {!hideSearch && (
- <>
- <TheSticky class={styles.sticky}>
- <ColHeader
- background="transparent"
- isFixed={false}
- v-slots={{
- content: () => (
- <div class={styles.woringHeader}>
- <i
- onClick={() => {
- if (browser().isApp) {
- postMessage({
- api: 'back'
- })
- } else {
- router.back()
- }
- }}
- class={[
- 'van-badge__wrapper van-icon van-icon-arrow-left van-nav-bar__arrow',
- styles.leftArrow
- ]}
- ></i>
- <Tabs
- class={styles.tabSection}
- v-model:active={params.musicSortType}
- shrink
- onClick-tab={(val) => {
- params.musicSortType = val.name
- onSearch(params.search)
- }}
- >
- <Tab name="" title="全部"></Tab>
- <Tab name="TOP" title="推荐"></Tab>
- <Tab name="HOT" title="热门"></Tab>
- <Tab name="NEW" title="最新"></Tab>
- </Tabs>
- </div>
- )
- // right: () =>
- // !isAudit.value && (
- // <span
- // class={styles.fleg}
- // onClick={() => {
- // // 不要看这个字段的意思
- // exquisiteFlag.value != exquisiteFlag.value
- // useSubjectId(
- // SubjectEnum.MUSIC_FREE,
- // JSON.stringify({
- // chargeType: exquisiteFlag.value
- // }),
- // 'set'
- // )
- // data.value = null
- // params.page = 1
- // FetchList()
- // }}
- // >
- // <Switch v-model={exquisiteFlag.value} size="20px" />
- // <span>免费</span>
- // </span>
- // )
- }}
- />
- <Search
- onSearch={onSearch}
- background="transparent"
- inputBackground="transparent"
- leftIcon={iconSearch}
- // v-slots={{
- // left: () => (
- // <div
- // class={styles.label}
- // onClick={() => (subject.show = true)}
- // >
- // {baseState.platformType === 'TEACHER'
- // ? teacherDetaultSubject.value.name
- // : subject.name}
- // <Icon
- // classPrefix="iconfont"
- // name="down"
- // size={12}
- // color="#fff"
- // />
- // </div>
- // )
- // }}
- />
- {/* <Tabs
- shrink
- class={styles.tagTabs}
- lineHeight={0}
- onClick-tab={(obj: any) => {
- params.musicTagIds = obj.name
- data.value = null
- params.page = 1
- FetchList()
- }}
- >
- <Tab title="全部" name=""></Tab>
- {tagList.map((tag: any) => (
- <Tab title={tag.name} name={tag.id}></Tab>
- ))}
- </Tabs> */}
- </TheSticky>
- <img class={styles.bgImg} src={bgImg} />
- </>
- )}
- {onlySearch ? (
- <Sticky position="top" offsetTop={stickyHeight.value as any}>
- <Search
- onSearch={onSearch}
- background="transparent"
- inputBackground="white"
- // leftIcon={iconSearch}
- class={styles.searchGroup}
- // v-slots={{
- // left: () => (
- // <div
- // class={[styles.label, styles.searchs]}
- // onClick={() => (subject.show = true)}
- // >
- // {baseState.platformType === 'TEACHER'
- // ? teacherDetaultSubject.value.name
- // : subject.name}
- // <Icon
- // classPrefix="iconfont"
- // name="down"
- // size={12}
- // color="#949597"
- // />
- // </div>
- // )
- // }}
- />
- </Sticky>
- ) : (
- ''
- )}
- <div class={[styles.alumnList, onlySearch && styles.alumnListOnly]}>
- <List
- loading={loading.value}
- finished={finished.value}
- finished-text={data.value && data.value.rows.length ? '' : ''}
- onLoad={FetchList}
- error={isError.value}
- >
- {data.value && data.value.rows.length ? (
- <Song
- list={data.value.rows}
- onDetail={(item: any) => {
- if (onItemClick === noop) {
- const url =
- location.origin +
- location.pathname +
- '#/music-detail?id=' +
- item.id
- // + '&instrumentId=' + subject.instrumentId
- openDefaultWebView(url, () => {
- router.push({
- path: '/music-detail',
- query: {
- id: item.id
- // instrumentId: subject.instrumentId
- }
- })
- })
- } else {
- onItemClick?.(item)
- }
- }}
- />
- ) : (
- !loading.value && (
- <ColResult
- tips="暂无曲目"
- classImgSize="SMALL"
- btnStatus={false}
- />
- )
- )}
- </List>
- </div>
- <Popup
- show={tagVisibility.value}
- round
- closeable
- position="bottom"
- style={{ height: '60%' }}
- teleport="body"
- onUpdate:show={val => (tagVisibility.value = val)}
- >
- <SelectTag
- exquisiteFlag
- onConfirm={onComfirm}
- onCancel={() => {
- //
- }}
- defaultValue={route.query.tagids as string}
- />
- </Popup>
- {/* 声部弹框 */}
- {/* <Popup
- show={subject.show}
- position="bottom"
- round
- closeable
- safe-area-inset-bottom
- onClose={() => (subject.show = false)}
- onClosed={() => (subject.show = false)}
- >
- <SelectSubject
- type="MUSIC"
- searchParams={
- baseState.platformType === 'TEACHER'
- ? teacherDetaultSubject.value
- : subject
- }
- onComfirm={onComfirmSubject}
- />
- </Popup> */}
- </>
- )
- }
- }
- })
|